aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2021-06-21 15:03:03 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2021-06-21 15:03:03 +0000
commitc1c3a46d2059c96ea62c58c4641120d2e885c38b (patch)
tree2f0deeb6f002cb9428ba045ec685c932b0b3414c
parent0eb317978b71cb38f970e4fda0c40276daf01c35 (diff)
parent5f5d7ab8f93b1727abab36006c8494124e773882 (diff)
downloadcurl-android12-mainline-ipsec-release.tar.gz
Change-Id: Icc929af75062d5cf5c80cbb78e1ddd5eba913362
-rw-r--r--Android.bp39
-rw-r--r--CHANGES9855
-rw-r--r--CMake/CMakeConfigurableFile.in21
-rw-r--r--CMake/CurlSymbolHiding.cmake29
-rw-r--r--CMake/FindBearSSL.cmake30
-rw-r--r--CMake/FindBrotli.cmake41
-rw-r--r--CMake/FindCARES.cmake47
-rw-r--r--CMake/FindGSS.cmake21
-rw-r--r--CMake/FindLibSSH2.cmake50
-rw-r--r--CMake/FindMbedTLS.cmake21
-rw-r--r--CMake/FindNGHTTP2.cmake25
-rw-r--r--CMake/FindNGHTTP3.cmake76
-rw-r--r--CMake/FindNGTCP2.cmake113
-rw-r--r--CMake/FindNSS.cmake38
-rw-r--r--CMake/FindQUICHE.cmake68
-rw-r--r--CMake/FindWolfSSL.cmake34
-rw-r--r--CMake/FindZstd.cmake69
-rw-r--r--CMake/Macros.cmake21
-rw-r--r--CMake/OtherTests.cmake31
-rw-r--r--CMake/Platforms/WindowsCache.cmake21
-rw-r--r--CMake/Utilities.cmake26
-rw-r--r--CMake/cmake_uninstall.cmake.in21
-rw-r--r--CMake/curl-config.cmake.in21
-rw-r--r--CMakeLists.txt343
-rw-r--r--COPYING2
-rw-r--r--METADATA11
-rwxr-xr-xMacOSX-Framework25
-rw-r--r--Makefile.am131
-rw-r--r--README10
-rw-r--r--RELEASE-NOTES563
-rw-r--r--acinclude.m418
-rw-r--r--aclocal.m450
-rwxr-xr-xandroidconfigure4
-rwxr-xr-xbuildconf448
-rwxr-xr-xcompile6
-rwxr-xr-xconfigure2680
-rwxr-xr-xconfigure.ac684
-rw-r--r--curl-config.in4
-rwxr-xr-xdepcomp2
-rw-r--r--docs/ALTSVC.md2
-rw-r--r--docs/BUGS302
-rw-r--r--docs/BUGS.md266
-rw-r--r--docs/CHECKSRC.md10
-rw-r--r--docs/CMakeLists.txt21
-rw-r--r--docs/CODE_REVIEW.md168
-rw-r--r--docs/CODE_STYLE.md19
-rw-r--r--docs/CONTRIBUTE.md42
-rw-r--r--docs/CURL-DISABLE.md124
-rw-r--r--docs/DEPRECATE.md32
-rw-r--r--docs/DYNBUF.md86
-rw-r--r--docs/ECH.md (renamed from docs/ESNI.md)76
-rw-r--r--docs/EXPERIMENTAL.md1
-rw-r--r--docs/FAQ72
-rw-r--r--docs/FEATURES5
-rw-r--r--docs/GOVERNANCE.md31
-rw-r--r--docs/HELP-US.md17
-rw-r--r--docs/HISTORY.md62
-rw-r--r--docs/HTTP-COOKIES.md25
-rw-r--r--docs/HTTP2.md2
-rw-r--r--docs/HTTP3.md69
-rw-r--r--docs/INSTALL.cmake5
-rw-r--r--docs/INSTALL.md67
-rw-r--r--docs/INTERNALS.md16
-rw-r--r--docs/KNOWN_BUGS231
-rw-r--r--docs/LICENSE-MIXING.md123
-rw-r--r--docs/MAIL-ETIQUETTE2
-rw-r--r--docs/MQTT.md29
-rw-r--r--docs/Makefile.am20
-rw-r--r--docs/PARALLEL-TRANSFERS.md2
-rw-r--r--docs/README.cmake16
-rw-r--r--docs/README.md2
-rw-r--r--docs/README.netware24
-rw-r--r--docs/README.win3223
-rw-r--r--docs/RELEASE-PROCEDURE.md36
-rw-r--r--docs/RESOURCES85
-rw-r--r--docs/ROADMAP.md43
-rw-r--r--docs/SECURITY-PROCESS.md4
-rw-r--r--docs/SSL-PROBLEMS.md2
-rw-r--r--docs/SSLCERTS.md10
-rw-r--r--docs/THANKS428
-rw-r--r--docs/TODO301
-rw-r--r--docs/TheArtOfHttpScripting758
-rw-r--r--docs/TheArtOfHttpScripting.md692
-rw-r--r--docs/VERSIONS.md (renamed from docs/VERSIONS)0
-rw-r--r--docs/cmdline-opts/CMakeLists.txt21
-rw-r--r--docs/cmdline-opts/Makefile.am5
-rw-r--r--docs/cmdline-opts/Makefile.inc33
-rw-r--r--docs/cmdline-opts/abstract-unix-socket.d1
-rw-r--r--docs/cmdline-opts/alt-svc.d5
-rw-r--r--docs/cmdline-opts/anyauth.d1
-rw-r--r--docs/cmdline-opts/append.d1
-rw-r--r--docs/cmdline-opts/basic.d1
-rw-r--r--docs/cmdline-opts/cacert.d1
-rw-r--r--docs/cmdline-opts/capath.d1
-rw-r--r--docs/cmdline-opts/cert-status.d1
-rw-r--r--docs/cmdline-opts/cert-type.d3
-rw-r--r--docs/cmdline-opts/cert.d1
-rw-r--r--docs/cmdline-opts/ciphers.d1
-rw-r--r--docs/cmdline-opts/compressed-ssh.d1
-rw-r--r--docs/cmdline-opts/compressed.d7
-rw-r--r--docs/cmdline-opts/config.d19
-rw-r--r--docs/cmdline-opts/connect-timeout.d1
-rw-r--r--docs/cmdline-opts/connect-to.d1
-rw-r--r--docs/cmdline-opts/continue-at.d1
-rw-r--r--docs/cmdline-opts/cookie-jar.d1
-rw-r--r--docs/cmdline-opts/cookie.d3
-rw-r--r--docs/cmdline-opts/create-dirs.d3
-rw-r--r--docs/cmdline-opts/crlf.d1
-rw-r--r--docs/cmdline-opts/crlfile.d1
-rw-r--r--docs/cmdline-opts/curves.d18
-rw-r--r--docs/cmdline-opts/data-ascii.d1
-rw-r--r--docs/cmdline-opts/data-binary.d1
-rw-r--r--docs/cmdline-opts/data-raw.d1
-rw-r--r--docs/cmdline-opts/data-urlencode.d1
-rw-r--r--docs/cmdline-opts/data.d14
-rw-r--r--docs/cmdline-opts/delegation.d1
-rw-r--r--docs/cmdline-opts/digest.d1
-rw-r--r--docs/cmdline-opts/disable-eprt.d1
-rw-r--r--docs/cmdline-opts/disable-epsv.d1
-rw-r--r--docs/cmdline-opts/disable.d1
-rw-r--r--docs/cmdline-opts/disallow-username-in-url.d1
-rw-r--r--docs/cmdline-opts/dns-interface.d1
-rw-r--r--docs/cmdline-opts/dns-ipv4-addr.d1
-rw-r--r--docs/cmdline-opts/dns-ipv6-addr.d1
-rw-r--r--docs/cmdline-opts/dns-servers.d1
-rw-r--r--docs/cmdline-opts/doh-url.d1
-rw-r--r--docs/cmdline-opts/dump-header.d1
-rw-r--r--docs/cmdline-opts/egd-file.d1
-rw-r--r--docs/cmdline-opts/engine.d1
-rw-r--r--docs/cmdline-opts/etag-compare.d19
-rw-r--r--docs/cmdline-opts/etag-save.d17
-rw-r--r--docs/cmdline-opts/expect100-timeout.d1
-rw-r--r--docs/cmdline-opts/fail-early.d1
-rw-r--r--docs/cmdline-opts/fail.d1
-rw-r--r--docs/cmdline-opts/false-start.d1
-rw-r--r--docs/cmdline-opts/form-string.d1
-rw-r--r--docs/cmdline-opts/form.d5
-rw-r--r--docs/cmdline-opts/ftp-account.d1
-rw-r--r--docs/cmdline-opts/ftp-alternative-to-user.d1
-rw-r--r--docs/cmdline-opts/ftp-create-dirs.d1
-rw-r--r--docs/cmdline-opts/ftp-method.d1
-rw-r--r--docs/cmdline-opts/ftp-pasv.d1
-rw-r--r--docs/cmdline-opts/ftp-port.d1
-rw-r--r--docs/cmdline-opts/ftp-pret.d1
-rw-r--r--docs/cmdline-opts/ftp-skip-pasv-ip.d1
-rw-r--r--docs/cmdline-opts/ftp-ssl-ccc-mode.d1
-rw-r--r--docs/cmdline-opts/ftp-ssl-ccc.d1
-rw-r--r--docs/cmdline-opts/ftp-ssl-control.d1
-rwxr-xr-xdocs/cmdline-opts/gen.pl157
-rw-r--r--docs/cmdline-opts/get.d1
-rw-r--r--docs/cmdline-opts/globoff.d1
-rw-r--r--docs/cmdline-opts/happy-eyeballs-timeout-ms.d3
-rw-r--r--docs/cmdline-opts/haproxy-protocol.d1
-rw-r--r--docs/cmdline-opts/head.d1
-rw-r--r--docs/cmdline-opts/header.d1
-rw-r--r--docs/cmdline-opts/help.d12
-rw-r--r--docs/cmdline-opts/hostpubmd5.d1
-rw-r--r--docs/cmdline-opts/http0.9.d1
-rw-r--r--docs/cmdline-opts/http1.0.d1
-rw-r--r--docs/cmdline-opts/http1.1.d1
-rw-r--r--docs/cmdline-opts/http2-prior-knowledge.d1
-rw-r--r--docs/cmdline-opts/http2.d1
-rw-r--r--docs/cmdline-opts/http3.d3
-rw-r--r--docs/cmdline-opts/ignore-content-length.d1
-rw-r--r--docs/cmdline-opts/include.d1
-rw-r--r--docs/cmdline-opts/insecure.d1
-rw-r--r--docs/cmdline-opts/interface.d1
-rw-r--r--docs/cmdline-opts/ipv4.d1
-rw-r--r--docs/cmdline-opts/ipv6.d1
-rw-r--r--docs/cmdline-opts/junk-session-cookies.d1
-rw-r--r--docs/cmdline-opts/keepalive-time.d1
-rw-r--r--docs/cmdline-opts/key-type.d1
-rw-r--r--docs/cmdline-opts/key.d1
-rw-r--r--docs/cmdline-opts/krb.d1
-rw-r--r--docs/cmdline-opts/libcurl.d1
-rw-r--r--docs/cmdline-opts/limit-rate.d1
-rw-r--r--docs/cmdline-opts/list-only.d3
-rw-r--r--docs/cmdline-opts/local-port.d1
-rw-r--r--docs/cmdline-opts/location-trusted.d1
-rw-r--r--docs/cmdline-opts/location.d17
-rw-r--r--docs/cmdline-opts/login-options.d1
-rw-r--r--docs/cmdline-opts/mail-auth.d1
-rw-r--r--docs/cmdline-opts/mail-from.d1
-rw-r--r--docs/cmdline-opts/mail-rcpt-allowfails.d16
-rw-r--r--docs/cmdline-opts/mail-rcpt.d1
-rw-r--r--docs/cmdline-opts/manual.d1
-rw-r--r--docs/cmdline-opts/max-filesize.d1
-rw-r--r--docs/cmdline-opts/max-redirs.d1
-rw-r--r--docs/cmdline-opts/max-time.d1
-rw-r--r--docs/cmdline-opts/metalink.d1
-rw-r--r--docs/cmdline-opts/negotiate.d1
-rw-r--r--docs/cmdline-opts/netrc-file.d1
-rw-r--r--docs/cmdline-opts/netrc-optional.d1
-rw-r--r--docs/cmdline-opts/netrc.d1
-rw-r--r--docs/cmdline-opts/next.d1
-rw-r--r--docs/cmdline-opts/no-alpn.d1
-rw-r--r--docs/cmdline-opts/no-buffer.d1
-rw-r--r--docs/cmdline-opts/no-keepalive.d1
-rw-r--r--docs/cmdline-opts/no-npn.d1
-rw-r--r--docs/cmdline-opts/no-progress-meter.d1
-rw-r--r--docs/cmdline-opts/no-sessionid.d1
-rw-r--r--docs/cmdline-opts/noproxy.d1
-rw-r--r--docs/cmdline-opts/ntlm-wb.d1
-rw-r--r--docs/cmdline-opts/ntlm.d1
-rw-r--r--docs/cmdline-opts/oauth2-bearer.d3
-rw-r--r--docs/cmdline-opts/output-dir.d19
-rw-r--r--docs/cmdline-opts/output.d11
-rw-r--r--docs/cmdline-opts/page-footer30
-rw-r--r--docs/cmdline-opts/page-header74
-rw-r--r--docs/cmdline-opts/parallel-immediate.d10
-rw-r--r--docs/cmdline-opts/parallel-max.d1
-rw-r--r--docs/cmdline-opts/parallel.d1
-rw-r--r--docs/cmdline-opts/pass.d1
-rw-r--r--docs/cmdline-opts/path-as-is.d1
-rw-r--r--docs/cmdline-opts/pinnedpubkey.d1
-rw-r--r--docs/cmdline-opts/post301.d1
-rw-r--r--docs/cmdline-opts/post302.d1
-rw-r--r--docs/cmdline-opts/post303.d1
-rw-r--r--docs/cmdline-opts/preproxy.d1
-rw-r--r--docs/cmdline-opts/progress-bar.d1
-rw-r--r--docs/cmdline-opts/proto-default.d1
-rw-r--r--docs/cmdline-opts/proto-redir.d1
-rw-r--r--docs/cmdline-opts/proto.d1
-rw-r--r--docs/cmdline-opts/proxy-anyauth.d1
-rw-r--r--docs/cmdline-opts/proxy-basic.d1
-rw-r--r--docs/cmdline-opts/proxy-cacert.d1
-rw-r--r--docs/cmdline-opts/proxy-capath.d1
-rw-r--r--docs/cmdline-opts/proxy-cert-type.d1
-rw-r--r--docs/cmdline-opts/proxy-cert.d1
-rw-r--r--docs/cmdline-opts/proxy-ciphers.d1
-rw-r--r--docs/cmdline-opts/proxy-crlfile.d1
-rw-r--r--docs/cmdline-opts/proxy-digest.d1
-rw-r--r--docs/cmdline-opts/proxy-header.d1
-rw-r--r--docs/cmdline-opts/proxy-insecure.d1
-rw-r--r--docs/cmdline-opts/proxy-key-type.d1
-rw-r--r--docs/cmdline-opts/proxy-key.d1
-rw-r--r--docs/cmdline-opts/proxy-negotiate.d1
-rw-r--r--docs/cmdline-opts/proxy-ntlm.d1
-rw-r--r--docs/cmdline-opts/proxy-pass.d1
-rw-r--r--docs/cmdline-opts/proxy-pinnedpubkey.d1
-rw-r--r--docs/cmdline-opts/proxy-service-name.d1
-rw-r--r--docs/cmdline-opts/proxy-ssl-allow-beast.d1
-rw-r--r--docs/cmdline-opts/proxy-tls13-ciphers.d1
-rw-r--r--docs/cmdline-opts/proxy-tlsauthtype.d1
-rw-r--r--docs/cmdline-opts/proxy-tlspassword.d1
-rw-r--r--docs/cmdline-opts/proxy-tlsuser.d1
-rw-r--r--docs/cmdline-opts/proxy-tlsv1.d1
-rw-r--r--docs/cmdline-opts/proxy-user.d1
-rw-r--r--docs/cmdline-opts/proxy.d1
-rw-r--r--docs/cmdline-opts/proxy1.0.d1
-rw-r--r--docs/cmdline-opts/proxytunnel.d1
-rw-r--r--docs/cmdline-opts/pubkey.d1
-rw-r--r--docs/cmdline-opts/quote.d9
-rw-r--r--docs/cmdline-opts/random-file.d1
-rw-r--r--docs/cmdline-opts/range.d1
-rw-r--r--docs/cmdline-opts/raw.d1
-rw-r--r--docs/cmdline-opts/referer.d1
-rw-r--r--docs/cmdline-opts/remote-header-name.d1
-rw-r--r--docs/cmdline-opts/remote-name-all.d1
-rw-r--r--docs/cmdline-opts/remote-name.d1
-rw-r--r--docs/cmdline-opts/remote-time.d1
-rw-r--r--docs/cmdline-opts/request-target.d1
-rw-r--r--docs/cmdline-opts/request.d1
-rw-r--r--docs/cmdline-opts/resolve.d3
-rw-r--r--docs/cmdline-opts/retry-all-errors.d20
-rw-r--r--docs/cmdline-opts/retry-connrefused.d1
-rw-r--r--docs/cmdline-opts/retry-delay.d1
-rw-r--r--docs/cmdline-opts/retry-max-time.d1
-rw-r--r--docs/cmdline-opts/retry.d1
-rw-r--r--docs/cmdline-opts/sasl-authzid.d4
-rw-r--r--docs/cmdline-opts/sasl-ir.d1
-rw-r--r--docs/cmdline-opts/service-name.d1
-rw-r--r--docs/cmdline-opts/show-error.d2
-rw-r--r--docs/cmdline-opts/silent.d3
-rw-r--r--docs/cmdline-opts/socks4.d1
-rw-r--r--docs/cmdline-opts/socks4a.d1
-rw-r--r--docs/cmdline-opts/socks5-basic.d1
-rw-r--r--docs/cmdline-opts/socks5-gssapi-nec.d1
-rw-r--r--docs/cmdline-opts/socks5-gssapi-service.d1
-rw-r--r--docs/cmdline-opts/socks5-gssapi.d1
-rw-r--r--docs/cmdline-opts/socks5-hostname.d1
-rw-r--r--docs/cmdline-opts/socks5.d1
-rw-r--r--docs/cmdline-opts/speed-limit.d1
-rw-r--r--docs/cmdline-opts/speed-time.d1
-rw-r--r--docs/cmdline-opts/ssl-allow-beast.d1
-rw-r--r--docs/cmdline-opts/ssl-no-revoke.d1
-rw-r--r--docs/cmdline-opts/ssl-reqd.d1
-rw-r--r--docs/cmdline-opts/ssl-revoke-best-effort.d8
-rw-r--r--docs/cmdline-opts/ssl.d1
-rw-r--r--docs/cmdline-opts/sslv2.d1
-rw-r--r--docs/cmdline-opts/sslv3.d1
-rw-r--r--docs/cmdline-opts/stderr.d1
-rw-r--r--docs/cmdline-opts/styled-output.d1
-rw-r--r--docs/cmdline-opts/suppress-connect-headers.d1
-rw-r--r--docs/cmdline-opts/tcp-fastopen.d1
-rw-r--r--docs/cmdline-opts/tcp-nodelay.d1
-rw-r--r--docs/cmdline-opts/telnet-option.d1
-rw-r--r--docs/cmdline-opts/tftp-blksize.d1
-rw-r--r--docs/cmdline-opts/tftp-no-options.d1
-rw-r--r--docs/cmdline-opts/time-cond.d1
-rw-r--r--docs/cmdline-opts/tls-max.d4
-rw-r--r--docs/cmdline-opts/tls13-ciphers.d3
-rw-r--r--docs/cmdline-opts/tlsauthtype.d1
-rw-r--r--docs/cmdline-opts/tlspassword.d3
-rw-r--r--docs/cmdline-opts/tlsuser.d3
-rw-r--r--docs/cmdline-opts/tlsv1.0.d1
-rw-r--r--docs/cmdline-opts/tlsv1.1.d1
-rw-r--r--docs/cmdline-opts/tlsv1.2.d1
-rw-r--r--docs/cmdline-opts/tlsv1.3.d11
-rw-r--r--docs/cmdline-opts/tlsv1.d1
-rw-r--r--docs/cmdline-opts/tr-encoding.d1
-rw-r--r--docs/cmdline-opts/trace-ascii.d1
-rw-r--r--docs/cmdline-opts/trace-time.d1
-rw-r--r--docs/cmdline-opts/trace.d1
-rw-r--r--docs/cmdline-opts/unix-socket.d1
-rw-r--r--docs/cmdline-opts/upload-file.d1
-rw-r--r--docs/cmdline-opts/url.d4
-rw-r--r--docs/cmdline-opts/use-ascii.d1
-rw-r--r--docs/cmdline-opts/user-agent.d5
-rw-r--r--docs/cmdline-opts/user.d1
-rw-r--r--docs/cmdline-opts/verbose.d1
-rw-r--r--docs/cmdline-opts/version.d65
-rw-r--r--docs/cmdline-opts/write-out.d15
-rw-r--r--docs/cmdline-opts/xattr.d1
-rw-r--r--docs/curl-config.18
-rw-r--r--docs/curl.1453
-rw-r--r--docs/examples/Makefile.am6
-rw-r--r--docs/examples/Makefile.example2
-rw-r--r--docs/examples/Makefile.inc6
-rw-r--r--docs/examples/Makefile.m3223
-rw-r--r--docs/examples/Makefile.netware21
-rw-r--r--docs/examples/README.md (renamed from docs/examples/README)24
-rw-r--r--docs/examples/anyauthput.c6
-rw-r--r--docs/examples/asiohiper.cpp496
-rw-r--r--docs/examples/chkspeed.c2
-rw-r--r--docs/examples/crawler.c5
-rw-r--r--docs/examples/curlgtk.c2
-rw-r--r--docs/examples/curlx.c6
-rw-r--r--docs/examples/ephiperfifo.c8
-rw-r--r--docs/examples/fileupload.c2
-rw-r--r--docs/examples/fopen.c2
-rw-r--r--docs/examples/ftpupload.c2
-rw-r--r--docs/examples/href_extractor.c2
-rw-r--r--docs/examples/http-post.c2
-rw-r--r--docs/examples/http2-download.c11
-rw-r--r--docs/examples/http2-upload.c29
-rw-r--r--docs/examples/https.c2
-rw-r--r--docs/examples/imap-list.c2
-rw-r--r--docs/examples/imap-lsub.c2
-rw-r--r--docs/examples/imap-noop.c2
-rw-r--r--docs/examples/imap-store.c2
-rw-r--r--docs/examples/makefile.dj2
-rw-r--r--docs/examples/multi-event.c4
-rw-r--r--docs/examples/multi-poll.c76
-rw-r--r--docs/examples/multi-uv.c4
-rw-r--r--docs/examples/multithread.c4
-rw-r--r--docs/examples/pop3-dele.c2
-rw-r--r--docs/examples/pop3-list.c2
-rw-r--r--docs/examples/pop3-noop.c2
-rw-r--r--docs/examples/pop3-retr.c2
-rw-r--r--docs/examples/pop3-ssl.c2
-rw-r--r--docs/examples/pop3-stat.c2
-rw-r--r--docs/examples/pop3-uidl.c2
-rw-r--r--docs/examples/postinmemory.c5
-rw-r--r--docs/examples/rtsp.c4
-rw-r--r--docs/examples/sessioninfo.c3
-rw-r--r--docs/examples/smtp-expn.c2
-rw-r--r--docs/examples/smtp-ssl.c2
-rw-r--r--docs/examples/smtp-tls.c2
-rw-r--r--docs/examples/smtp-vrfy.c2
-rw-r--r--docs/examples/sslbackend.c6
-rw-r--r--docs/examples/url2file.c4
-rw-r--r--docs/examples/usercertinmem.c2
-rwxr-xr-xdocs/examples/version-check.pl2
-rw-r--r--docs/libcurl/ABI.md (renamed from docs/libcurl/ABI)29
-rw-r--r--docs/libcurl/CMakeLists.txt21
-rw-r--r--docs/libcurl/Makefile.am4
-rw-r--r--docs/libcurl/Makefile.inc26
-rw-r--r--docs/libcurl/curl_easy_cleanup.36
-rw-r--r--docs/libcurl/curl_easy_duphandle.32
-rw-r--r--docs/libcurl/curl_easy_escape.36
-rw-r--r--docs/libcurl/curl_easy_getinfo.312
-rw-r--r--docs/libcurl/curl_easy_init.36
-rw-r--r--docs/libcurl/curl_easy_option_by_id.347
-rw-r--r--docs/libcurl/curl_easy_option_by_name.345
-rw-r--r--docs/libcurl/curl_easy_option_next.375
-rw-r--r--docs/libcurl/curl_easy_pause.32
-rw-r--r--docs/libcurl/curl_easy_perform.36
-rw-r--r--docs/libcurl/curl_easy_recv.32
-rw-r--r--docs/libcurl/curl_easy_reset.37
-rw-r--r--docs/libcurl/curl_easy_send.32
-rw-r--r--docs/libcurl/curl_easy_setopt.331
-rw-r--r--docs/libcurl/curl_easy_strerror.36
-rw-r--r--docs/libcurl/curl_easy_unescape.36
-rw-r--r--docs/libcurl/curl_escape.38
-rw-r--r--docs/libcurl/curl_formadd.34
-rw-r--r--docs/libcurl/curl_formfree.32
-rw-r--r--docs/libcurl/curl_formget.32
-rw-r--r--docs/libcurl/curl_free.32
-rw-r--r--docs/libcurl/curl_getdate.32
-rw-r--r--docs/libcurl/curl_getenv.312
-rw-r--r--docs/libcurl/curl_global_cleanup.32
-rw-r--r--docs/libcurl/curl_global_init.312
-rw-r--r--docs/libcurl/curl_global_init_mem.32
-rw-r--r--docs/libcurl/curl_global_sslset.311
-rw-r--r--docs/libcurl/curl_mime_addpart.32
-rw-r--r--docs/libcurl/curl_mime_data.36
-rw-r--r--docs/libcurl/curl_mime_data_cb.32
-rw-r--r--docs/libcurl/curl_mime_encoder.36
-rw-r--r--docs/libcurl/curl_mime_filedata.310
-rw-r--r--docs/libcurl/curl_mime_filename.38
-rw-r--r--docs/libcurl/curl_mime_free.32
-rw-r--r--docs/libcurl/curl_mime_headers.36
-rw-r--r--docs/libcurl/curl_mime_init.36
-rw-r--r--docs/libcurl/curl_mime_name.36
-rw-r--r--docs/libcurl/curl_mime_subparts.32
-rw-r--r--docs/libcurl/curl_mime_type.36
-rw-r--r--docs/libcurl/curl_mprintf.32
-rw-r--r--docs/libcurl/curl_multi_add_handle.32
-rw-r--r--docs/libcurl/curl_multi_assign.34
-rw-r--r--docs/libcurl/curl_multi_cleanup.32
-rw-r--r--docs/libcurl/curl_multi_fdset.32
-rw-r--r--docs/libcurl/curl_multi_info_read.34
-rw-r--r--docs/libcurl/curl_multi_init.34
-rw-r--r--docs/libcurl/curl_multi_perform.36
-rw-r--r--docs/libcurl/curl_multi_poll.313
-rw-r--r--docs/libcurl/curl_multi_remove_handle.32
-rw-r--r--docs/libcurl/curl_multi_setopt.32
-rw-r--r--docs/libcurl/curl_multi_socket.32
-rw-r--r--docs/libcurl/curl_multi_socket_action.32
-rw-r--r--docs/libcurl/curl_multi_strerror.36
-rw-r--r--docs/libcurl/curl_multi_timeout.34
-rw-r--r--docs/libcurl/curl_multi_wait.37
-rw-r--r--docs/libcurl/curl_multi_wakeup.387
-rw-r--r--docs/libcurl/curl_share_cleanup.32
-rw-r--r--docs/libcurl/curl_share_init.34
-rw-r--r--docs/libcurl/curl_share_setopt.314
-rw-r--r--docs/libcurl/curl_share_strerror.36
-rw-r--r--docs/libcurl/curl_slist_append.32
-rw-r--r--docs/libcurl/curl_slist_free_all.32
-rw-r--r--docs/libcurl/curl_strequal.32
-rw-r--r--docs/libcurl/curl_unescape.36
-rw-r--r--docs/libcurl/curl_url.32
-rw-r--r--docs/libcurl/curl_url_cleanup.32
-rw-r--r--docs/libcurl/curl_url_dup.32
-rw-r--r--docs/libcurl/curl_url_get.32
-rw-r--r--docs/libcurl/curl_url_set.312
-rw-r--r--docs/libcurl/curl_version.36
-rw-r--r--docs/libcurl/curl_version_info.342
-rw-r--r--docs/libcurl/libcurl-easy.34
-rw-r--r--docs/libcurl/libcurl-env.36
-rw-r--r--docs/libcurl/libcurl-errors.331
-rw-r--r--docs/libcurl/libcurl-multi.38
-rw-r--r--docs/libcurl/libcurl-security.332
-rw-r--r--docs/libcurl/libcurl-share.32
-rw-r--r--docs/libcurl/libcurl-symbols.3181
-rw-r--r--docs/libcurl/libcurl-thread.36
-rw-r--r--docs/libcurl/libcurl-tutorial.32
-rw-r--r--docs/libcurl/libcurl-url.32
-rw-r--r--docs/libcurl/libcurl.34
-rw-r--r--docs/libcurl/libcurl.m42
-rwxr-xr-xdocs/libcurl/mksymbolsmanpage.pl2
-rw-r--r--docs/libcurl/opts/CMakeLists.txt21
-rw-r--r--docs/libcurl/opts/CURLINFO_ACTIVESOCKET.324
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CERTINFO.38
-rw-r--r--docs/libcurl/opts/CURLINFO_CONDITION_UNMET.312
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_CONTENT_TYPE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_COOKIELIST.312
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.369
-rw-r--r--docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FILETIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HEADER_SIZE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.32
-rw-r--r--docs/libcurl/opts/CURLINFO_HTTP_VERSION.34
-rw-r--r--docs/libcurl/opts/CURLINFO_LASTSOCKET.34
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_IP.36
-rw-r--r--docs/libcurl/opts/CURLINFO_LOCAL_PORT.34
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_NUM_CONNECTS.34
-rw-r--r--docs/libcurl/opts/CURLINFO_OS_ERRNO.36
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_IP.36
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIMARY_PORT.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PRIVATE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PROTOCOL.36
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_ERROR.3105
-rw-r--r--docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.34
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME.34
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_REDIRECT_URL.34
-rw-r--r--docs/libcurl/opts/CURLINFO_REQUEST_SIZE.34
-rw-r--r--docs/libcurl/opts/CURLINFO_RESPONSE_CODE.36
-rw-r--r--docs/libcurl/opts/CURLINFO_RETRY_AFTER.310
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SCHEME.38
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.36
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_ENGINES.32
-rw-r--r--docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.36
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SESSION.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.316
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME.32
-rw-r--r--docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAXCONNECTS.34
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.322
-rw-r--r--docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.316
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.37
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERDATA.32
-rw-r--r--docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.34
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.314
-rw-r--r--docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ALTSVC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.39
-rw-r--r--docs/libcurl/opts/CURLOPT_APPEND.32
-rw-r--r--docs/libcurl/opts/CURLOPT_AUTOREFERER.34
-rw-r--r--docs/libcurl/opts/CURLOPT_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CAINFO.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CAPATH.311
-rw-r--r--docs/libcurl/opts/CURLOPT_CERTINFO.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_DATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.36
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_ONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONNECT_TO.36
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIE.38
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEFILE.312
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIEJAR.36
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIELIST.38
-rw-r--r--docs/libcurl/opts/CURLOPT_COOKIESESSION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.38
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLF.32
-rw-r--r--docs/libcurl/opts/CURLOPT_CRLFILE.317
-rw-r--r--docs/libcurl/opts/CURLOPT_CURLU.34
-rw-r--r--docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.38
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.38
-rw-r--r--docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DIRLISTONLY.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_INTERFACE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SERVERS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_DOH_URL.36
-rw-r--r--docs/libcurl/opts/CURLOPT_EGDSOCKET.34
-rw-r--r--docs/libcurl/opts/CURLOPT_ERRORBUFFER.36
-rw-r--r--docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.36
-rw-r--r--docs/libcurl/opts/CURLOPT_FAILONERROR.34
-rw-r--r--docs/libcurl/opts/CURLOPT_FILETIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.38
-rw-r--r--docs/libcurl/opts/CURLOPT_FORBID_REUSE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FRESH_CONNECT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPPORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_FTPSSLAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.32
-rw-r--r--docs/libcurl/opts/CURLOPT_FTP_USE_PRET.32
-rw-r--r--docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADER.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADERFUNCTION.310
-rw-r--r--docs/libcurl/opts/CURLOPT_HEADEROPT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP200ALIASES.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPGET.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPHEADER.36
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.32
-rw-r--r--docs/libcurl/opts/CURLOPT_HTTP_VERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.36
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERFACE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_IPRESOLVE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_ISSUERCERT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_ISSUERCERT_BLOB.379
-rw-r--r--docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_KEYPASSWD.36
-rw-r--r--docs/libcurl/opts/CURLOPT_KRBLEVEL.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_AUTH.34
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_FROM.34
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.372
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXAGE_CONN.34
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXCONNECTS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_MAXREDIRS.36
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.314
-rw-r--r--docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.311
-rw-r--r--docs/libcurl/opts/CURLOPT_MIMEPOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC.34
-rw-r--r--docs/libcurl/opts/CURLOPT_NETRC_FILE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_NOBODY.324
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROGRESS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_NOPROXY.310
-rw-r--r--docs/libcurl/opts/CURLOPT_NOSIGNAL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.315
-rw-r--r--docs/libcurl/opts/CURLOPT_PASSWORD.38
-rw-r--r--docs/libcurl/opts/CURLOPT_PATH_AS_IS.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PIPEWAIT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POST.34
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDS.310
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTQUOTE.312
-rw-r--r--docs/libcurl/opts/CURLOPT_POSTREDIR.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PREQUOTE.310
-rw-r--r--docs/libcurl/opts/CURLOPT_PRE_PROXY.38
-rw-r--r--docs/libcurl/opts/CURLOPT_PRIVATE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.311
-rw-r--r--docs/libcurl/opts/CURLOPT_PROTOCOLS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYAUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYHEADER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPASSWORD.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYPORT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYTYPE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERNAME.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXYUSERPWD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAINFO.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CAPATH.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.374
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT_BLOB.385
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.38
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLCERT_BLOB.372
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLKEY_BLOB.373
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.36
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.347
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_PUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_QUOTE.320
-rw-r--r--docs/libcurl/opts/CURLOPT_RANDOM_FILE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RANGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_READDATA.36
-rw-r--r--docs/libcurl/opts/CURLOPT_READFUNCTION.313
-rw-r--r--docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.39
-rw-r--r--docs/libcurl/opts/CURLOPT_REFERER.310
-rw-r--r--docs/libcurl/opts/CURLOPT_REQUEST_TARGET.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.34
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_REQUEST.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.32
-rw-r--r--docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_AUTHZID.35
-rw-r--r--docs/libcurl/opts/CURLOPT_SASL_IR.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SEEKFUNCTION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SERVICE_NAME.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SHARE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.315
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERT.314
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERTTYPE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLCERT_BLOB.369
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEY.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEYTYPE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLKEY_BLOB.375
-rw-r--r--docs/libcurl/opts/CURLOPT_SSLVERSION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.36
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.355
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_FALSESTART.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_OPTIONS.353
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.38
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.32
-rw-r--r--docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STDERR.36
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.34
-rw-r--r--docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TCP_NODELAY.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TELNETOPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMECONDITION.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEOUT_MS.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.34
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.38
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.310
-rw-r--r--docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.38
-rw-r--r--docs/libcurl/opts/CURLOPT_TRAILERDATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.36
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFERTEXT.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.34
-rw-r--r--docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.34
-rw-r--r--docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.34
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD.34
-rw-r--r--docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.32
-rw-r--r--docs/libcurl/opts/CURLOPT_URL.314
-rw-r--r--docs/libcurl/opts/CURLOPT_USERAGENT.38
-rw-r--r--docs/libcurl/opts/CURLOPT_USERNAME.36
-rw-r--r--docs/libcurl/opts/CURLOPT_USERPWD.36
-rw-r--r--docs/libcurl/opts/CURLOPT_USE_SSL.34
-rw-r--r--docs/libcurl/opts/CURLOPT_VERBOSE.37
-rw-r--r--docs/libcurl/opts/CURLOPT_WILDCARDMATCH.32
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEDATA.34
-rw-r--r--docs/libcurl/opts/CURLOPT_WRITEFUNCTION.341
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFODATA.32
-rw-r--r--docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.311
-rw-r--r--docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.36
-rw-r--r--docs/libcurl/opts/Makefile.inc34
-rw-r--r--docs/libcurl/symbols-in-versions99
-rwxr-xr-xdocs/libcurl/symbols.pl2
-rw-r--r--docs/mk-ca-bundle.12
-rw-r--r--docs/options-in-versions246
-rw-r--r--include/Makefile.am23
-rw-r--r--include/README18
-rw-r--r--include/README.md14
-rw-r--r--include/curl/Makefile.am4
-rw-r--r--include/curl/curl.h832
-rw-r--r--include/curl/curlver.h14
-rw-r--r--include/curl/easy.h13
-rw-r--r--include/curl/multi.h79
-rw-r--r--include/curl/options.h68
-rw-r--r--include/curl/system.h27
-rw-r--r--include/curl/typecheck-gcc.h12
-rwxr-xr-xinstall-sh13
-rw-r--r--lib/CMakeLists.txt44
-rw-r--r--lib/Makefile.Watcom274
-rw-r--r--lib/Makefile.am12
-rw-r--r--lib/Makefile.inc112
-rw-r--r--lib/Makefile.m3227
-rw-r--r--lib/Makefile.netware5
-rw-r--r--lib/Makefile.vxworks21
-rw-r--r--lib/altsvc.c289
-rw-r--r--lib/altsvc.h17
-rw-r--r--lib/asyn-ares.c88
-rw-r--r--[-rwxr-xr-x]lib/asyn-thread.c75
-rw-r--r--lib/asyn.h11
-rw-r--r--lib/base64.c5
-rwxr-xr-xlib/checksrc.pl108
-rw-r--r--lib/config-dos.h5
-rw-r--r--lib/config-mac.h2
-rw-r--r--lib/config-os400.h5
-rw-r--r--lib/config-plan9.h4
-rw-r--r--lib/config-riscos.h5
-rw-r--r--lib/config-symbian.h802
-rw-r--r--lib/config-tpf.h14
-rw-r--r--lib/config-vxworks.h11
-rw-r--r--lib/config-win32.h28
-rw-r--r--lib/config-win32ce.h2
-rw-r--r--lib/conncache.c177
-rw-r--r--lib/conncache.h32
-rw-r--r--lib/connect.c438
-rw-r--r--lib/connect.h4
-rw-r--r--lib/content_encoding.c230
-rw-r--r--lib/content_encoding.h26
-rw-r--r--lib/cookie.c87
-rw-r--r--lib/curl_addrinfo.c103
-rw-r--r--lib/curl_addrinfo.h19
-rw-r--r--lib/curl_base64.h2
-rw-r--r--lib/curl_config.h63
-rw-r--r--lib/curl_config.h.cmake72
-rw-r--r--lib/curl_config.h.in63
-rw-r--r--lib/curl_des.c2
-rw-r--r--lib/curl_des.h2
-rw-r--r--lib/curl_endian.c2
-rw-r--r--lib/curl_fnmatch.h2
-rw-r--r--lib/curl_get_line.c6
-rw-r--r--lib/curl_gethostname.c4
-rw-r--r--lib/curl_gethostname.h4
-rw-r--r--lib/curl_hmac.h35
-rw-r--r--lib/curl_krb5.h (renamed from lib/curl_sec.h)12
-rw-r--r--lib/curl_ldap.h2
-rw-r--r--lib/curl_md4.h5
-rw-r--r--lib/curl_md5.h26
-rw-r--r--lib/curl_memrchr.h2
-rw-r--r--lib/curl_multibyte.c99
-rw-r--r--lib/curl_multibyte.h56
-rw-r--r--lib/curl_ntlm_core.c64
-rw-r--r--lib/curl_ntlm_core.h22
-rw-r--r--lib/curl_ntlm_wb.c165
-rw-r--r--lib/curl_path.c8
-rw-r--r--lib/curl_printf.h2
-rw-r--r--lib/curl_rtmp.c8
-rw-r--r--lib/curl_rtmp.h2
-rw-r--r--lib/curl_sasl.c34
-rw-r--r--lib/curl_setup.h130
-rw-r--r--lib/curl_setup_once.h30
-rw-r--r--lib/curl_sha256.h9
-rw-r--r--lib/curl_sspi.c19
-rw-r--r--lib/curl_sspi.h2
-rw-r--r--lib/curl_threads.c8
-rw-r--r--lib/curl_threads.h2
-rw-r--r--lib/curlx.h15
-rw-r--r--lib/dict.c103
-rw-r--r--lib/dict.h2
-rw-r--r--lib/doh.c356
-rw-r--r--lib/doh.h31
-rw-r--r--lib/dotdot.c10
-rw-r--r--lib/dotdot.h2
-rw-r--r--lib/dynbuf.c255
-rw-r--r--lib/dynbuf.h88
-rw-r--r--lib/easy.c245
-rw-r--r--lib/easygetopt.c96
-rw-r--r--lib/easyif.h2
-rw-r--r--lib/easyoptions.c347
-rw-r--r--lib/easyoptions.h35
-rw-r--r--lib/escape.c78
-rw-r--r--lib/escape.h11
-rw-r--r--lib/file.c8
-rw-r--r--lib/file.h2
-rw-r--r--lib/fileinfo.h4
-rw-r--r--lib/firefox-db2pem.sh2
-rw-r--r--lib/formdata.c34
-rw-r--r--lib/formdata.h6
-rw-r--r--lib/ftp.c534
-rw-r--r--lib/ftp.h6
-rw-r--r--lib/ftplistparser.c8
-rw-r--r--lib/ftplistparser.h2
-rw-r--r--lib/getenv.c47
-rw-r--r--lib/getinfo.c120
-rw-r--r--lib/getinfo.h2
-rw-r--r--lib/gopher.c30
-rw-r--r--lib/gopher.h2
-rw-r--r--lib/hash.c82
-rw-r--r--lib/hash.h48
-rw-r--r--lib/hmac.c52
-rw-r--r--lib/hostasyn.c10
-rw-r--r--lib/hostcheck.h2
-rw-r--r--lib/hostip.c184
-rw-r--r--lib/hostip.h63
-rw-r--r--lib/hostip4.c300
-rw-r--r--lib/hostip6.c48
-rw-r--r--lib/hostsyn.c2
-rw-r--r--lib/http.c876
-rw-r--r--lib/http.h52
-rw-r--r--lib/http2.c482
-rw-r--r--lib/http2.h8
-rw-r--r--lib/http_chunks.c49
-rw-r--r--lib/http_digest.c10
-rw-r--r--lib/http_digest.h2
-rw-r--r--lib/http_negotiate.c19
-rw-r--r--lib/http_negotiate.h6
-rw-r--r--lib/http_ntlm.c23
-rw-r--r--lib/http_ntlm.h6
-rw-r--r--lib/http_proxy.c177
-rw-r--r--lib/http_proxy.h3
-rw-r--r--lib/idn_win32.c10
-rw-r--r--lib/if2ip.c25
-rw-r--r--lib/imap.c53
-rw-r--r--lib/imap.h5
-rw-r--r--lib/inet_ntop.c2
-rw-r--r--lib/inet_ntop.h2
-rw-r--r--lib/inet_pton.c4
-rw-r--r--lib/inet_pton.h2
-rw-r--r--lib/krb5.c596
-rw-r--r--lib/ldap.c111
-rw-r--r--lib/libcurl.plist6
-rw-r--r--lib/llist.c65
-rw-r--r--lib/llist.h33
-rw-r--r--lib/makefile.amiga21
-rw-r--r--lib/makefile.dj2
-rw-r--r--lib/md4.c81
-rw-r--r--lib/md5.c99
-rw-r--r--lib/memdebug.c65
-rw-r--r--lib/memdebug.h7
-rw-r--r--lib/mime.c282
-rw-r--r--lib/mime.h50
-rwxr-xr-xlib/mk-ca-bundle.pl69
-rwxr-xr-xlib/mk-ca-bundle.vbs2
-rw-r--r--lib/mprintf.c148
-rw-r--r--lib/mqtt.c629
-rw-r--r--lib/mqtt.h59
-rw-r--r--[-rwxr-xr-x]lib/multi.c616
-rw-r--r--lib/multihandle.h43
-rw-r--r--lib/multiif.h10
-rw-r--r--lib/nonblock.c2
-rw-r--r--lib/nonblock.h2
-rw-r--r--lib/nwlib.c39
-rw-r--r--lib/openldap.c18
-rw-r--r--lib/parsedate.c84
-rw-r--r--lib/parsedate.h8
-rw-r--r--lib/pingpong.c77
-rw-r--r--lib/pingpong.h13
-rw-r--r--lib/pop3.c15
-rw-r--r--lib/pop3.h2
-rw-r--r--lib/progress.c33
-rw-r--r--lib/progress.h4
-rw-r--r--lib/quic.h8
-rw-r--r--lib/rename.c71
-rw-r--r--lib/rename.h27
-rw-r--r--lib/rtsp.c136
-rw-r--r--lib/rtsp.h2
-rw-r--r--lib/security.c579
-rw-r--r--lib/select.c508
-rw-r--r--lib/select.h45
-rw-r--r--lib/sendf.c113
-rw-r--r--lib/sendf.h4
-rw-r--r--lib/setopt.c411
-rw-r--r--lib/setopt.h4
-rw-r--r--lib/setup-os400.h8
-rw-r--r--lib/setup-vms.h8
-rw-r--r--lib/setup-win32.h122
-rw-r--r--lib/sha256.c273
-rw-r--r--lib/share.c10
-rw-r--r--lib/share.h6
-rw-r--r--lib/slist.c2
-rw-r--r--lib/slist.h2
-rw-r--r--lib/smb.c15
-rw-r--r--lib/smb.h12
-rw-r--r--lib/smtp.c335
-rw-r--r--lib/smtp.h7
-rw-r--r--lib/sockaddr.h2
-rw-r--r--lib/socketpair.c7
-rw-r--r--lib/socks.c1240
-rw-r--r--lib/socks.h33
-rw-r--r--lib/socks_gssapi.c13
-rw-r--r--lib/socks_sspi.c11
-rw-r--r--lib/strcase.c8
-rw-r--r--lib/strcase.h3
-rw-r--r--lib/strdup.c13
-rw-r--r--lib/strerror.c586
-rw-r--r--lib/strerror.h7
-rw-r--r--lib/strtok.c4
-rw-r--r--lib/strtok.h2
-rw-r--r--lib/strtoofft.c2
-rw-r--r--lib/system_win32.c212
-rw-r--r--lib/system_win32.h24
-rw-r--r--lib/telnet.c140
-rw-r--r--lib/telnet.h2
-rw-r--r--lib/tftp.c75
-rw-r--r--lib/tftp.h2
-rw-r--r--lib/timeval.c3
-rw-r--r--lib/transfer.c172
-rw-r--r--lib/url.c801
-rw-r--r--lib/url.h14
-rw-r--r--lib/urlapi.c89
-rw-r--r--lib/urldata.h350
-rw-r--r--lib/vauth/cleartext.c5
-rw-r--r--lib/vauth/cram.c4
-rw-r--r--lib/vauth/digest.c76
-rw-r--r--lib/vauth/digest.h2
-rw-r--r--lib/vauth/digest_sspi.c21
-rw-r--r--lib/vauth/krb5_sspi.c11
-rw-r--r--lib/vauth/ntlm.c19
-rw-r--r--lib/vauth/ntlm_sspi.c8
-rw-r--r--lib/vauth/spnego_sspi.c8
-rw-r--r--lib/vauth/vauth.c6
-rw-r--r--lib/version.c286
-rw-r--r--lib/version_win32.c226
-rw-r--r--lib/version_win32.h53
-rw-r--r--lib/vquic/ngtcp2.c734
-rw-r--r--lib/vquic/ngtcp2.h16
-rw-r--r--lib/vquic/quiche.c111
-rw-r--r--lib/vquic/vquic.c85
-rw-r--r--lib/vquic/vquic.h34
-rw-r--r--lib/vssh/libssh.c236
-rw-r--r--lib/vssh/libssh2.c706
-rw-r--r--lib/vssh/ssh.h (renamed from lib/ssh.h)28
-rw-r--r--lib/vssh/wolfssh.c1156
-rw-r--r--lib/vtls/bearssl.c877
-rw-r--r--lib/vtls/bearssl.h (renamed from lib/vtls/polarssl.h)16
-rw-r--r--lib/vtls/gskit.c19
-rw-r--r--lib/vtls/gskit.h2
-rw-r--r--lib/vtls/gtls.c592
-rw-r--r--lib/vtls/keylog.c156
-rw-r--r--lib/vtls/keylog.h56
-rw-r--r--lib/vtls/mbedtls.c191
-rw-r--r--lib/vtls/mbedtls.h2
-rw-r--r--lib/vtls/mbedtls_threadlock.c (renamed from lib/vtls/polarssl_threadlock.c)38
-rw-r--r--lib/vtls/mbedtls_threadlock.h (renamed from lib/vtls/polarssl_threadlock.h)28
-rw-r--r--lib/vtls/mesalink.c29
-rw-r--r--lib/vtls/nss.c194
-rw-r--r--lib/vtls/openssl.c1110
-rw-r--r--lib/vtls/polarssl.c931
-rw-r--r--lib/vtls/schannel.c596
-rw-r--r--lib/vtls/schannel.h10
-rw-r--r--lib/vtls/schannel_verify.c208
-rw-r--r--lib/vtls/sectransp.c283
-rw-r--r--lib/vtls/vtls.c164
-rw-r--r--lib/vtls/vtls.h56
-rw-r--r--lib/vtls/wolfssl.c328
-rw-r--r--lib/warnless.h15
-rw-r--r--lib/wildcard.h12
-rw-r--r--lib/x509asn1.c75
-rw-r--r--lib/x509asn1.h71
-rw-r--r--libcurl.pc.in4
-rw-r--r--local-configure.patch14
-rw-r--r--ltmain.sh10
-rw-r--r--m4/curl-compilers.m4159
-rw-r--r--m4/curl-confopts.m448
-rw-r--r--m4/curl-functions.m46
-rw-r--r--m4/curl-openssl.m42
-rw-r--r--m4/curl-override.m421
-rw-r--r--m4/curl-reentrant.m42
-rw-r--r--m4/libtool.m430
-rw-r--r--m4/xc-am-iface.m42
-rw-r--r--m4/xc-cc-check.m42
-rw-r--r--m4/xc-lt-iface.m42
-rw-r--r--m4/xc-translit.m42
-rw-r--r--m4/xc-val-flgs.m42
-rw-r--r--m4/zz50-xc-ovr.m42
-rw-r--r--m4/zz60-xc-ovr.m42
-rwxr-xr-xmissing2
-rw-r--r--packages/DOS/common.dj21
-rw-r--r--packages/Makefile.am32
-rw-r--r--packages/OS400/ccsidcurl.c21
-rw-r--r--packages/OS400/chkstrings.c62
-rw-r--r--packages/OS400/curl.inc.in24
-rw-r--r--packages/OS400/initscript.sh21
-rw-r--r--packages/OS400/make-include.sh21
-rw-r--r--packages/OS400/make-lib.sh41
-rw-r--r--packages/OS400/make-src.sh21
-rw-r--r--packages/OS400/make-tests.sh21
-rw-r--r--packages/OS400/makefile.sh23
-rw-r--r--packages/OS400/os400sys.h2
-rw-r--r--packages/Symbian/bwins/libcurlu.def60
-rw-r--r--packages/Symbian/eabi/libcurlu.def60
-rw-r--r--packages/Symbian/group/bld.inf10
-rw-r--r--packages/Symbian/group/curl.iby15
-rw-r--r--packages/Symbian/group/curl.mmp63
-rw-r--r--packages/Symbian/group/curl.pkg26
-rw-r--r--packages/Symbian/group/libcurl.iby14
-rw-r--r--packages/Symbian/group/libcurl.mmp67
-rw-r--r--packages/Symbian/group/libcurl.pkg22
-rw-r--r--packages/Symbian/readme.txt93
-rw-r--r--packages/TPF/curl.mak21
-rw-r--r--packages/TPF/maketpf.env_curl21
-rw-r--r--packages/TPF/maketpf.env_curllib21
-rw-r--r--packages/vms/Makefile.am21
-rw-r--r--packages/vms/backup_gnv_curl_src.com2
-rw-r--r--packages/vms/build_gnv_curl.com2
-rw-r--r--packages/vms/build_gnv_curl_pcsi_desc.com2
-rw-r--r--packages/vms/build_gnv_curl_pcsi_text.com2
-rw-r--r--packages/vms/build_gnv_curl_release_notes.com2
-rw-r--r--packages/vms/build_libcurl_pc.com2
-rw-r--r--packages/vms/build_vms.com2
-rw-r--r--packages/vms/clean_gnv_curl.com2
-rw-r--r--packages/vms/compare_curl_source.com4
-rw-r--r--packages/vms/config_h.com24
-rw-r--r--packages/vms/curl_crtl_init.c23
-rw-r--r--packages/vms/curl_gnv_build_steps.txt4
-rw-r--r--packages/vms/curl_startup.com2
-rw-r--r--packages/vms/curlmsg.h2
-rw-r--r--packages/vms/curlmsg.msg21
-rw-r--r--packages/vms/curlmsg_vms.h2
-rw-r--r--packages/vms/generate_config_vms_h_curl.com9
-rw-r--r--packages/vms/generate_vax_transfer.com2
-rw-r--r--packages/vms/gnv_conftest.c_first2
-rw-r--r--packages/vms/gnv_curl_configure.sh2
-rw-r--r--packages/vms/gnv_libcurl_symbols.opt2
-rw-r--r--packages/vms/gnv_link_curl.com2
-rw-r--r--packages/vms/make_gnv_curl_install.sh2
-rw-r--r--packages/vms/make_pcsi_curl_kit_name.com2
-rw-r--r--packages/vms/pcsi_gnv_curl_file_list.txt2
-rw-r--r--packages/vms/pcsi_product_gnv_curl.com2
-rw-r--r--packages/vms/readme4
-rw-r--r--packages/vms/setup_gnv_curl_build.com2
-rw-r--r--packages/vms/stage_curl_install.com2
-rw-r--r--packages/vms/vms_eco_level.h2
-rw-r--r--plan9/README (renamed from plan9/BUILD.PLAN9.txt)0
-rw-r--r--projects/Windows/VC10/curl-all.sln596
-rw-r--r--projects/Windows/VC10/lib/libcurl.sln362
-rw-r--r--projects/Windows/VC10/lib/libcurl.vcxproj67
-rw-r--r--projects/Windows/VC10/src/curl.sln362
-rw-r--r--projects/Windows/VC10/src/curl.vcxproj24
-rw-r--r--projects/Windows/VC11/curl-all.sln596
-rw-r--r--projects/Windows/VC11/lib/libcurl.sln362
-rw-r--r--projects/Windows/VC11/lib/libcurl.vcxproj67
-rw-r--r--projects/Windows/VC11/src/curl.sln362
-rw-r--r--projects/Windows/VC11/src/curl.vcxproj24
-rw-r--r--projects/Windows/VC12/curl-all.sln596
-rw-r--r--projects/Windows/VC12/lib/libcurl.sln362
-rw-r--r--projects/Windows/VC12/lib/libcurl.vcxproj67
-rw-r--r--projects/Windows/VC12/src/curl.sln362
-rw-r--r--projects/Windows/VC12/src/curl.vcxproj24
-rw-r--r--projects/Windows/VC14/curl-all.sln596
-rw-r--r--projects/Windows/VC14/lib/libcurl.sln362
-rw-r--r--projects/Windows/VC14/lib/libcurl.vcxproj67
-rw-r--r--projects/Windows/VC14/src/curl.sln362
-rw-r--r--projects/Windows/VC14/src/curl.vcxproj24
-rw-r--r--projects/Windows/VC15/lib/libcurl.vcxproj67
-rw-r--r--projects/Windows/VC15/src/curl.vcxproj24
-rw-r--r--projects/Windows/VC6/lib/libcurl.dsp144
-rw-r--r--projects/Windows/VC6/src/curl.dsp48
-rw-r--r--projects/Windows/VC7.1/curl-all.sln280
-rw-r--r--projects/Windows/VC7.1/lib/libcurl.sln174
-rw-r--r--projects/Windows/VC7.1/lib/libcurl.vcproj135
-rw-r--r--projects/Windows/VC7.1/src/curl.sln174
-rw-r--r--projects/Windows/VC7.1/src/curl.vcproj32
-rw-r--r--projects/Windows/VC7/curl-all.sln276
-rw-r--r--projects/Windows/VC7/lib/libcurl.sln174
-rw-r--r--projects/Windows/VC7/lib/libcurl.vcproj135
-rw-r--r--projects/Windows/VC7/src/curl.sln174
-rw-r--r--projects/Windows/VC7/src/curl.vcproj32
-rw-r--r--projects/Windows/VC8/curl-all.sln516
-rw-r--r--projects/Windows/VC8/lib/libcurl.sln314
-rw-r--r--projects/Windows/VC8/lib/libcurl.vcproj168
-rw-r--r--projects/Windows/VC8/src/curl.sln314
-rw-r--r--projects/Windows/VC8/src/curl.vcproj48
-rw-r--r--projects/Windows/VC9/curl-all.sln516
-rw-r--r--projects/Windows/VC9/lib/libcurl.sln314
-rw-r--r--projects/Windows/VC9/lib/libcurl.vcproj168
-rw-r--r--projects/Windows/VC9/src/curl.sln314
-rw-r--r--projects/Windows/VC9/src/curl.vcproj48
-rw-r--r--projects/build-wolfssl.bat20
-rw-r--r--projects/checksrc.bat34
-rw-r--r--projects/generate.bat22
-rw-r--r--projects/wolfssl_options.h21
-rw-r--r--scripts/Makefile.am2
-rwxr-xr-xscripts/completion.pl21
-rwxr-xr-xscripts/coverage.sh21
-rwxr-xr-xscripts/updatemanpages.pl2
-rw-r--r--src/CMakeLists.txt40
-rw-r--r--src/Makefile.Watcom234
-rw-r--r--src/Makefile.am4
-rw-r--r--src/Makefile.inc33
-rw-r--r--src/Makefile.m3225
-rw-r--r--src/macos/src/macos_main.cpp2
-rw-r--r--src/makefile.amiga23
-rw-r--r--src/makefile.dj2
-rw-r--r--src/slist_wc.c2
-rw-r--r--src/slist_wc.h2
-rw-r--r--src/tool_binmode.c2
-rw-r--r--src/tool_binmode.h2
-rw-r--r--src/tool_bname.c2
-rw-r--r--src/tool_bname.h2
-rw-r--r--src/tool_cb_dbg.c3
-rw-r--r--src/tool_cb_dbg.h2
-rw-r--r--src/tool_cb_hdr.c74
-rw-r--r--src/tool_cb_hdr.h3
-rw-r--r--src/tool_cb_prg.c62
-rw-r--r--src/tool_cb_rea.c27
-rw-r--r--src/tool_cb_rea.h10
-rw-r--r--src/tool_cb_see.c6
-rw-r--r--src/tool_cb_see.h11
-rw-r--r--src/tool_cb_wrt.c61
-rw-r--r--src/tool_cb_wrt.h5
-rw-r--r--src/tool_cfgable.c8
-rw-r--r--src/tool_cfgable.h27
-rw-r--r--src/tool_convert.h2
-rw-r--r--src/tool_dirhie.c21
-rw-r--r--src/tool_dirhie.h2
-rw-r--r--src/tool_doswin.c63
-rw-r--r--src/tool_doswin.h5
-rw-r--r--src/tool_easysrc.c6
-rw-r--r--src/tool_filetime.c13
-rw-r--r--src/tool_formparse.c43
-rw-r--r--src/tool_formparse.h17
-rw-r--r--src/tool_getparam.c101
-rw-r--r--src/tool_getpass.c14
-rw-r--r--src/tool_help.c858
-rw-r--r--src/tool_help.h4
-rw-r--r--src/tool_helpers.h2
-rw-r--r--src/tool_homedir.c102
-rw-r--r--src/tool_homedir.h4
-rw-r--r--src/tool_hugehelp.c10834
-rw-r--r--src/tool_hugehelp.h2
-rw-r--r--src/tool_libinfo.c2
-rw-r--r--src/tool_libinfo.h2
-rw-r--r--src/tool_main.c52
-rw-r--r--src/tool_metalink.c196
-rw-r--r--src/tool_metalink.h86
-rw-r--r--src/tool_msgs.c21
-rw-r--r--src/tool_msgs.h4
-rw-r--r--src/tool_operate.c402
-rw-r--r--src/tool_operate.h13
-rw-r--r--src/tool_operhlp.c15
-rw-r--r--src/tool_panykey.c10
-rw-r--r--src/tool_panykey.h8
-rw-r--r--src/tool_paramhlp.c124
-rw-r--r--src/tool_paramhlp.h2
-rw-r--r--src/tool_parsecfg.c86
-rw-r--r--src/tool_parsecfg.h2
-rw-r--r--src/tool_progress.c9
-rw-r--r--src/tool_sdecls.h3
-rw-r--r--src/tool_setopt.c130
-rw-r--r--src/tool_setopt.h53
-rw-r--r--src/tool_setup.h2
-rw-r--r--src/tool_sleep.c4
-rw-r--r--src/tool_sleep.h2
-rw-r--r--src/tool_strdup.c13
-rw-r--r--src/tool_strdup.h2
-rw-r--r--src/tool_urlglob.c131
-rw-r--r--src/tool_urlglob.h20
-rw-r--r--src/tool_util.c46
-rw-r--r--src/tool_util.h2
-rw-r--r--src/tool_version.h4
-rw-r--r--src/tool_vms.c8
-rw-r--r--src/tool_vms.h2
-rw-r--r--src/tool_writeout.c203
-rw-r--r--src/tool_writeout.h63
-rw-r--r--src/tool_writeout_json.c203
-rw-r--r--src/tool_writeout_json.h30
-rw-r--r--src/tool_xattr.h2
-rwxr-xr-xtest-driver10
-rw-r--r--tests/CMakeLists.txt47
-rw-r--r--tests/FILEFORMAT478
-rw-r--r--tests/FILEFORMAT.md554
-rw-r--r--tests/Makefile.am17
-rw-r--r--tests/README.md (renamed from tests/README)249
-rw-r--r--tests/appveyor.pm115
-rw-r--r--tests/azure.pm149
-rwxr-xr-xtests/badsymbols.pl132
-rw-r--r--tests/certs/Makefile.am2
-rw-r--r--tests/certs/scripts/Makefile.am2
-rwxr-xr-xtests/certs/scripts/genroot.sh2
-rwxr-xr-xtests/certs/scripts/genserv.sh2
-rwxr-xr-xtests/curl_test_data.py4
-rw-r--r--tests/data/CMakeLists.txt21
-rw-r--r--tests/data/DISABLED31
-rw-r--r--tests/data/Makefile.am21
-rw-r--r--tests/data/Makefile.inc127
-rw-r--r--tests/data/test14
-rw-r--r--tests/data/test104
-rw-r--r--tests/data/test10016
-rw-r--r--tests/data/test100210
-rw-r--r--tests/data/test10044
-rw-r--r--tests/data/test10088
-rw-r--r--tests/data/test10116
-rw-r--r--tests/data/test10126
-rw-r--r--tests/data/test10155
-rw-r--r--tests/data/test10219
-rw-r--r--tests/data/test10246
-rw-r--r--tests/data/test10256
-rw-r--r--tests/data/test102810
-rw-r--r--tests/data/test10294
-rw-r--r--tests/data/test10306
-rw-r--r--tests/data/test10315
-rw-r--r--tests/data/test10324
-rw-r--r--tests/data/test10334
-rw-r--r--tests/data/test10342
-rw-r--r--tests/data/test10355
-rw-r--r--tests/data/test10404
-rw-r--r--tests/data/test10414
-rw-r--r--tests/data/test10424
-rw-r--r--tests/data/test10434
-rw-r--r--tests/data/test10454
-rw-r--r--tests/data/test10464
-rw-r--r--tests/data/test10515
-rw-r--r--tests/data/test10525
-rw-r--r--tests/data/test10536
-rw-r--r--tests/data/test10545
-rw-r--r--tests/data/test105510
-rw-r--r--tests/data/test105613
-rw-r--r--tests/data/test10584
-rw-r--r--tests/data/test10594
-rw-r--r--tests/data/test106010
-rw-r--r--tests/data/test106110
-rw-r--r--tests/data/test10645
-rw-r--r--tests/data/test10655
-rw-r--r--tests/data/test10665
-rw-r--r--tests/data/test10675
-rw-r--r--tests/data/test10684
-rw-r--r--tests/data/test10708
-rw-r--r--tests/data/test10715
-rw-r--r--tests/data/test10724
-rw-r--r--tests/data/test10734
-rw-r--r--tests/data/test10745
-rw-r--r--tests/data/test10755
-rw-r--r--tests/data/test10766
-rw-r--r--tests/data/test10775
-rw-r--r--tests/data/test10786
-rw-r--r--tests/data/test10795
-rw-r--r--tests/data/test10805
-rw-r--r--tests/data/test10815
-rw-r--r--tests/data/test10824
-rw-r--r--tests/data/test10834
-rw-r--r--tests/data/test10842
-rw-r--r--tests/data/test10852
-rw-r--r--tests/data/test10876
-rw-r--r--tests/data/test10886
-rw-r--r--tests/data/test10895
-rw-r--r--tests/data/test10905
-rw-r--r--tests/data/test10924
-rw-r--r--tests/data/test10956
-rw-r--r--tests/data/test10961
-rw-r--r--tests/data/test10979
-rw-r--r--tests/data/test10985
-rw-r--r--tests/data/test115
-rw-r--r--tests/data/test110011
-rw-r--r--tests/data/test11014
-rw-r--r--tests/data/test11045
-rw-r--r--tests/data/test11054
-rw-r--r--tests/data/test11064
-rw-r--r--tests/data/test11094
-rw-r--r--tests/data/test11104
-rw-r--r--tests/data/test11114
-rw-r--r--tests/data/test11154
-rw-r--r--tests/data/test11164
-rw-r--r--tests/data/test11175
-rw-r--r--tests/data/test11184
-rw-r--r--tests/data/test11195
-rw-r--r--tests/data/test11214
-rw-r--r--tests/data/test11224
-rw-r--r--tests/data/test11234
-rw-r--r--tests/data/test11244
-rw-r--r--tests/data/test11254
-rw-r--r--tests/data/test11264
-rw-r--r--tests/data/test11274
-rw-r--r--tests/data/test11285
-rw-r--r--tests/data/test112915
-rw-r--r--tests/data/test11305
-rw-r--r--tests/data/test11315
-rw-r--r--tests/data/test11335
-rw-r--r--tests/data/test11345
-rw-r--r--tests/data/test11351
-rw-r--r--tests/data/test11386
-rw-r--r--tests/data/test113910
-rw-r--r--tests/data/test11406
-rw-r--r--tests/data/test11415
-rw-r--r--tests/data/test11424
-rw-r--r--tests/data/test11434
-rw-r--r--tests/data/test11444
-rw-r--r--tests/data/test114818
-rw-r--r--tests/data/test11505
-rw-r--r--tests/data/test11514
-rw-r--r--tests/data/test11548
-rw-r--r--tests/data/test11554
-rw-r--r--tests/data/test11574
-rw-r--r--tests/data/test11584
-rw-r--r--tests/data/test11594
-rw-r--r--tests/data/test11604
-rw-r--r--tests/data/test11614
-rw-r--r--tests/data/test11644
-rw-r--r--tests/data/test11665
-rw-r--r--tests/data/test116724
-rw-r--r--tests/data/test116877
-rw-r--r--tests/data/test11704
-rw-r--r--tests/data/test11714
-rw-r--r--tests/data/test11724
-rw-r--r--tests/data/test11744
-rw-r--r--tests/data/test117525
-rw-r--r--tests/data/test117666
-rw-r--r--tests/data/test117725
-rw-r--r--tests/data/test117853
-rw-r--r--tests/data/test117943
-rw-r--r--tests/data/test1181
-rw-r--r--tests/data/test1191
-rw-r--r--tests/data/test119056
-rw-r--r--tests/data/test119150
-rw-r--r--tests/data/test119256
-rw-r--r--tests/data/test119372
-rw-r--r--tests/data/test119459
-rw-r--r--tests/data/test119563
-rw-r--r--tests/data/test119662
-rw-r--r--tests/data/test119787
-rw-r--r--tests/data/test124
-rw-r--r--tests/data/test12045
-rw-r--r--tests/data/test12054
-rw-r--r--tests/data/test12104
-rw-r--r--tests/data/test12124
-rw-r--r--tests/data/test12134
-rw-r--r--tests/data/test12144
-rw-r--r--tests/data/test12158
-rw-r--r--tests/data/test12165
-rw-r--r--tests/data/test12186
-rw-r--r--tests/data/test12234
-rw-r--r--tests/data/test12285
-rw-r--r--tests/data/test12295
-rw-r--r--tests/data/test12305
-rw-r--r--tests/data/test12315
-rw-r--r--tests/data/test12325
-rw-r--r--tests/data/test12342
-rw-r--r--tests/data/test123511
-rw-r--r--tests/data/test12362
-rw-r--r--tests/data/test12374
-rw-r--r--tests/data/test12388
-rw-r--r--tests/data/test12394
-rw-r--r--tests/data/test12405
-rw-r--r--tests/data/test12415
-rw-r--r--tests/data/test124413
-rw-r--r--tests/data/test124510
-rw-r--r--tests/data/test12465
-rw-r--r--tests/data/test12472
-rw-r--r--tests/data/test12486
-rw-r--r--tests/data/test12496
-rw-r--r--tests/data/test12504
-rw-r--r--tests/data/test12514
-rw-r--r--tests/data/test12524
-rw-r--r--tests/data/test12534
-rw-r--r--tests/data/test12544
-rw-r--r--tests/data/test12554
-rw-r--r--tests/data/test12564
-rw-r--r--tests/data/test12574
-rw-r--r--tests/data/test12585
-rw-r--r--tests/data/test12594
-rw-r--r--tests/data/test12602
-rw-r--r--tests/data/test12614
-rw-r--r--tests/data/test12632
-rw-r--r--tests/data/test12654
-rw-r--r--tests/data/test12664
-rw-r--r--tests/data/test12674
-rw-r--r--tests/data/test12692
-rw-r--r--tests/data/test127067
-rw-r--r--tests/data/test127146
-rw-r--r--tests/data/test12807
-rw-r--r--tests/data/test12834
-rw-r--r--tests/data/test12845
-rw-r--r--tests/data/test12855
-rw-r--r--tests/data/test12867
-rw-r--r--tests/data/test12875
-rw-r--r--tests/data/test12885
-rw-r--r--tests/data/test12904
-rw-r--r--tests/data/test12924
-rw-r--r--tests/data/test129365
-rw-r--r--tests/data/test129463
-rw-r--r--tests/data/test129566
-rw-r--r--tests/data/test129654
-rw-r--r--tests/data/test129765
-rw-r--r--tests/data/test12984
-rw-r--r--tests/data/test12994
-rw-r--r--tests/data/test134
-rw-r--r--tests/data/test13004
-rw-r--r--tests/data/test13014
-rw-r--r--tests/data/test13024
-rw-r--r--tests/data/test13034
-rw-r--r--tests/data/test13044
-rw-r--r--tests/data/test13054
-rw-r--r--tests/data/test13074
-rw-r--r--tests/data/test13084
-rw-r--r--tests/data/test13094
-rw-r--r--tests/data/test13107
-rw-r--r--tests/data/test13114
-rw-r--r--tests/data/test13124
-rw-r--r--tests/data/test13134
-rw-r--r--tests/data/test13145
-rw-r--r--tests/data/test13154
-rw-r--r--tests/data/test13174
-rw-r--r--tests/data/test13185
-rw-r--r--tests/data/test13195
-rw-r--r--tests/data/test13205
-rw-r--r--tests/data/test13215
-rw-r--r--tests/data/test13224
-rw-r--r--tests/data/test13236
-rw-r--r--tests/data/test13244
-rw-r--r--tests/data/test13255
-rw-r--r--tests/data/test13285
-rw-r--r--tests/data/test13309
-rw-r--r--tests/data/test13315
-rw-r--r--tests/data/test13326
-rw-r--r--tests/data/test13334
-rw-r--r--tests/data/test13344
-rw-r--r--tests/data/test13354
-rw-r--r--tests/data/test13364
-rw-r--r--tests/data/test13374
-rw-r--r--tests/data/test13384
-rw-r--r--tests/data/test13394
-rw-r--r--tests/data/test13408
-rw-r--r--tests/data/test13418
-rw-r--r--tests/data/test13424
-rw-r--r--tests/data/test13434
-rw-r--r--tests/data/test13444
-rw-r--r--tests/data/test13454
-rw-r--r--tests/data/test13464
-rw-r--r--tests/data/test13474
-rw-r--r--tests/data/test13644
-rw-r--r--tests/data/test13654
-rw-r--r--tests/data/test13664
-rw-r--r--tests/data/test13674
-rw-r--r--tests/data/test13684
-rw-r--r--tests/data/test13694
-rw-r--r--tests/data/test13704
-rw-r--r--tests/data/test13714
-rw-r--r--tests/data/test13724
-rw-r--r--tests/data/test13734
-rw-r--r--tests/data/test13744
-rw-r--r--tests/data/test13754
-rw-r--r--tests/data/test13764
-rw-r--r--tests/data/test13774
-rw-r--r--tests/data/test1381
-rw-r--r--tests/data/test13944
-rw-r--r--tests/data/test13955
-rw-r--r--tests/data/test13963
-rw-r--r--tests/data/test13973
-rw-r--r--tests/data/test13983
-rw-r--r--tests/data/test13994
-rw-r--r--tests/data/test145
-rw-r--r--tests/data/test14005
-rw-r--r--tests/data/test14015
-rw-r--r--tests/data/test14025
-rw-r--r--tests/data/test14035
-rw-r--r--tests/data/test14044
-rw-r--r--tests/data/test14085
-rw-r--r--tests/data/test14092
-rw-r--r--tests/data/test14102
-rw-r--r--tests/data/test14114
-rw-r--r--tests/data/test141210
-rw-r--r--tests/data/test14135
-rw-r--r--tests/data/test14154
-rw-r--r--tests/data/test14164
-rw-r--r--tests/data/test14174
-rw-r--r--tests/data/test14187
-rw-r--r--tests/data/test14195
-rw-r--r--tests/data/test14215
-rw-r--r--tests/data/test14224
-rw-r--r--tests/data/test14234
-rw-r--r--tests/data/test14244
-rw-r--r--tests/data/test1425bin1726 -> 1721 bytes
-rw-r--r--tests/data/test1426bin1663 -> 1658 bytes
-rw-r--r--tests/data/test14272
-rw-r--r--tests/data/test14287
-rw-r--r--tests/data/test14294
-rw-r--r--tests/data/test14304
-rw-r--r--tests/data/test14314
-rw-r--r--tests/data/test14324
-rw-r--r--tests/data/test14334
-rw-r--r--tests/data/test14344
-rw-r--r--tests/data/test14354
-rw-r--r--tests/data/test14366
-rw-r--r--tests/data/test14378
-rw-r--r--tests/data/test14384
-rw-r--r--tests/data/test14396
-rw-r--r--tests/data/test14434
-rw-r--r--tests/data/test14462
-rw-r--r--tests/data/test14472
-rw-r--r--tests/data/test144811
-rw-r--r--tests/data/test145117
-rw-r--r--tests/data/test14527
-rw-r--r--tests/data/test14532
-rw-r--r--tests/data/test14557
-rw-r--r--tests/data/test145613
-rw-r--r--tests/data/test14574
-rw-r--r--tests/data/test14584
-rw-r--r--tests/data/test145946
-rw-r--r--tests/data/test146059
-rw-r--r--tests/data/test146153
-rw-r--r--tests/data/test146261
-rw-r--r--tests/data/test146344
-rw-r--r--tests/data/test146444
-rw-r--r--tests/data/test1465bin0 -> 2914 bytes
-rw-r--r--tests/data/test154
-rw-r--r--tests/data/test1508
-rw-r--r--tests/data/test15023
-rw-r--r--tests/data/test15033
-rw-r--r--tests/data/test15043
-rw-r--r--tests/data/test15053
-rw-r--r--tests/data/test15082
-rw-r--r--tests/data/test1515
-rw-r--r--tests/data/test1525
-rw-r--r--tests/data/test152475
-rw-r--r--tests/data/test15312
-rw-r--r--tests/data/test15389
-rw-r--r--tests/data/test153943
-rw-r--r--tests/data/test1546
-rw-r--r--tests/data/test1558
-rw-r--r--tests/data/test15504
-rw-r--r--tests/data/test15513
-rw-r--r--tests/data/test155426
-rw-r--r--tests/data/test15565
-rw-r--r--tests/data/test15586
-rw-r--r--tests/data/test1565
-rw-r--r--tests/data/test15601
-rw-r--r--tests/data/test15617
-rw-r--r--tests/data/test15626
-rw-r--r--tests/data/test15634
-rw-r--r--tests/data/test156431
-rw-r--r--tests/data/test1565 (renamed from tests/data/test1541)19
-rw-r--r--tests/data/test156663
-rw-r--r--tests/data/test156770
-rw-r--r--tests/data/test1574
-rw-r--r--tests/data/test1583
-rw-r--r--tests/data/test1596
-rw-r--r--tests/data/test15913
-rw-r--r--tests/data/test15933
-rw-r--r--tests/data/test15943
-rw-r--r--tests/data/test15953
-rw-r--r--tests/data/test15963
-rw-r--r--tests/data/test164
-rw-r--r--tests/data/test1605
-rw-r--r--tests/data/test16004
-rw-r--r--tests/data/test16014
-rw-r--r--tests/data/test16024
-rw-r--r--tests/data/test16034
-rw-r--r--tests/data/test16044
-rw-r--r--tests/data/test16054
-rw-r--r--tests/data/test16064
-rw-r--r--tests/data/test16074
-rw-r--r--tests/data/test16084
-rw-r--r--tests/data/test16094
-rw-r--r--tests/data/test161022
-rw-r--r--tests/data/test161122
-rw-r--r--tests/data/test161222
-rw-r--r--tests/data/test1626
-rw-r--r--tests/data/test16204
-rw-r--r--tests/data/test16214
-rw-r--r--tests/data/test1634
-rw-r--r--tests/data/test163054
-rw-r--r--tests/data/test163186
-rw-r--r--tests/data/test1632104
-rw-r--r--tests/data/test163398
-rw-r--r--tests/data/test1644
-rw-r--r--tests/data/test1657
-rw-r--r--tests/data/test16506
-rw-r--r--tests/data/test16514
-rw-r--r--tests/data/test16523
-rw-r--r--tests/data/test16533
-rw-r--r--tests/data/test16543
-rw-r--r--tests/data/test16555
-rw-r--r--tests/data/test1664
-rw-r--r--tests/data/test1677
-rw-r--r--tests/data/test1689
-rw-r--r--tests/data/test16910
-rw-r--r--tests/data/test1706
-rw-r--r--tests/data/test17003
-rw-r--r--tests/data/test17012
-rw-r--r--tests/data/test17022
-rw-r--r--tests/data/test1714
-rw-r--r--tests/data/test1724
-rw-r--r--tests/data/test1734
-rw-r--r--tests/data/test1745
-rw-r--r--tests/data/test1757
-rw-r--r--tests/data/test1768
-rw-r--r--tests/data/test1775
-rw-r--r--tests/data/test1784
-rw-r--r--tests/data/test1794
-rw-r--r--tests/data/test189
-rw-r--r--tests/data/test1804
-rw-r--r--tests/data/test18006
-rw-r--r--tests/data/test18014
-rw-r--r--tests/data/test1814
-rw-r--r--tests/data/test1837
-rw-r--r--tests/data/test1846
-rw-r--r--tests/data/test1856
-rw-r--r--tests/data/test1864
-rw-r--r--tests/data/test1875
-rw-r--r--tests/data/test1887
-rw-r--r--tests/data/test1897
-rw-r--r--tests/data/test192
-rw-r--r--tests/data/test190061
-rw-r--r--tests/data/test190163
-rw-r--r--tests/data/test190262
-rw-r--r--tests/data/test190362
-rw-r--r--tests/data/test19047
-rw-r--r--tests/data/test19053
-rw-r--r--tests/data/test19063
-rw-r--r--tests/data/test19073
-rw-r--r--tests/data/test190881
-rw-r--r--tests/data/test190964
-rw-r--r--tests/data/test191065
-rw-r--r--tests/data/test191129
-rw-r--r--tests/data/test191230
-rw-r--r--tests/data/test191341
-rw-r--r--tests/data/test191442
-rw-r--r--tests/data/test1924
-rw-r--r--tests/data/test1935
-rw-r--r--tests/data/test1944
-rw-r--r--tests/data/test1975
-rw-r--r--tests/data/test1985
-rw-r--r--tests/data/test1995
-rw-r--r--tests/data/test24
-rw-r--r--tests/data/test20014
-rw-r--r--tests/data/test20024
-rw-r--r--tests/data/test20035
-rw-r--r--tests/data/test20042
-rw-r--r--tests/data/test20054
-rw-r--r--tests/data/test200618
-rw-r--r--tests/data/test200711
-rw-r--r--tests/data/test200811
-rw-r--r--tests/data/test200911
-rw-r--r--tests/data/test201011
-rw-r--r--tests/data/test20114
-rw-r--r--tests/data/test20124
-rw-r--r--tests/data/test20233
-rw-r--r--tests/data/test20243
-rw-r--r--tests/data/test20254
-rw-r--r--tests/data/test20263
-rw-r--r--tests/data/test20273
-rw-r--r--tests/data/test20284
-rw-r--r--tests/data/test20294
-rw-r--r--tests/data/test20304
-rw-r--r--tests/data/test20314
-rw-r--r--tests/data/test20324
-rw-r--r--tests/data/test2033124
-rw-r--r--tests/data/test20344
-rw-r--r--tests/data/test20365
-rw-r--r--tests/data/test20373
-rw-r--r--tests/data/test20405
-rw-r--r--tests/data/test20414
-rw-r--r--tests/data/test20434
-rw-r--r--tests/data/test20467
-rw-r--r--tests/data/test20478
-rw-r--r--tests/data/test20497
-rw-r--r--tests/data/test20505
-rw-r--r--tests/data/test20516
-rw-r--r--tests/data/test20525
-rw-r--r--tests/data/test20535
-rw-r--r--tests/data/test20547
-rw-r--r--tests/data/test20555
-rw-r--r--tests/data/test20564
-rw-r--r--tests/data/test20575
-rw-r--r--tests/data/test20588
-rw-r--r--tests/data/test20598
-rw-r--r--tests/data/test2067
-rw-r--r--tests/data/test20608
-rw-r--r--tests/data/test20618
-rw-r--r--tests/data/test20628
-rw-r--r--tests/data/test20638
-rw-r--r--tests/data/test20648
-rw-r--r--tests/data/test20658
-rw-r--r--tests/data/test20668
-rw-r--r--tests/data/test20677
-rw-r--r--tests/data/test20687
-rw-r--r--tests/data/test20697
-rw-r--r--tests/data/test2074
-rw-r--r--tests/data/test207060
-rw-r--r--tests/data/test20734
-rw-r--r--tests/data/test20744
-rw-r--r--tests/data/test20765
-rw-r--r--tests/data/test20786
-rw-r--r--tests/data/test2084
-rw-r--r--tests/data/test2098
-rw-r--r--tests/data/test2100bin1642 -> 1642 bytes
-rw-r--r--tests/data/test2138
-rw-r--r--tests/data/test2144
-rw-r--r--tests/data/test2174
-rw-r--r--tests/data/test2184
-rw-r--r--tests/data/test2192
-rw-r--r--tests/data/test225
-rw-r--r--tests/data/test2204
-rw-r--r--tests/data/test2214
-rw-r--r--tests/data/test2224
-rw-r--r--tests/data/test2234
-rw-r--r--tests/data/test2244
-rw-r--r--tests/data/test2304
-rw-r--r--tests/data/test2324
-rw-r--r--tests/data/test2335
-rw-r--r--tests/data/test2345
-rw-r--r--tests/data/test2353
-rw-r--r--tests/data/test2361
-rw-r--r--tests/data/test2398
-rw-r--r--tests/data/test245
-rw-r--r--tests/data/test2404
-rw-r--r--tests/data/test2414
-rw-r--r--tests/data/test2424
-rw-r--r--tests/data/test24310
-rw-r--r--tests/data/test2457
-rw-r--r--tests/data/test2467
-rw-r--r--tests/data/test2494
-rw-r--r--tests/data/test2515
-rw-r--r--tests/data/test2564
-rw-r--r--tests/data/test2579
-rw-r--r--tests/data/test2586
-rw-r--r--tests/data/test2596
-rw-r--r--tests/data/test265
-rw-r--r--tests/data/test2604
-rw-r--r--tests/data/test262bin1137 -> 1132 bytes
-rw-r--r--tests/data/test2634
-rw-r--r--tests/data/test2644
-rw-r--r--tests/data/test2658
-rw-r--r--tests/data/test2664
-rw-r--r--tests/data/test2678
-rw-r--r--tests/data/test2684
-rw-r--r--tests/data/test2694
-rw-r--r--tests/data/test276
-rw-r--r--tests/data/test2736
-rw-r--r--tests/data/test2745
-rw-r--r--tests/data/test2757
-rw-r--r--tests/data/test2765
-rw-r--r--tests/data/test2775
-rw-r--r--tests/data/test2784
-rw-r--r--tests/data/test2794
-rw-r--r--tests/data/test285
-rw-r--r--tests/data/test2814
-rw-r--r--tests/data/test2824
-rw-r--r--tests/data/test2882
-rw-r--r--tests/data/test294
-rw-r--r--tests/data/test2924
-rw-r--r--tests/data/test2934
-rw-r--r--tests/data/test2994
-rw-r--r--tests/data/test34
-rw-r--r--tests/data/test304
-rw-r--r--tests/data/test3004
-rw-r--r--tests/data/test30004
-rw-r--r--tests/data/test30014
-rw-r--r--tests/data/test300255
-rw-r--r--tests/data/test300355
-rw-r--r--tests/data/test300455
-rw-r--r--tests/data/test300555
-rw-r--r--tests/data/test300651
-rw-r--r--tests/data/test300747
-rw-r--r--tests/data/test300857
-rw-r--r--tests/data/test300957
-rw-r--r--tests/data/test3014
-rw-r--r--tests/data/test301057
-rw-r--r--tests/data/test301157
-rw-r--r--tests/data/test301260
-rw-r--r--tests/data/test301368
-rw-r--r--tests/data/test301456
-rw-r--r--tests/data/test301578
-rw-r--r--tests/data/test3024
-rw-r--r--tests/data/test3034
-rw-r--r--tests/data/test3045
-rw-r--r--tests/data/test3053
-rw-r--r--tests/data/test3064
-rw-r--r--tests/data/test3074
-rw-r--r--tests/data/test30913
-rw-r--r--tests/data/test314
-rw-r--r--tests/data/test3104
-rw-r--r--tests/data/test3144
-rw-r--r--tests/data/test3154
-rw-r--r--tests/data/test3164
-rw-r--r--tests/data/test3175
-rw-r--r--tests/data/test3185
-rw-r--r--tests/data/test3194
-rw-r--r--tests/data/test325
-rw-r--r--tests/data/test3254
-rw-r--r--tests/data/test3264
-rw-r--r--tests/data/test3275
-rw-r--r--tests/data/test3282
-rw-r--r--tests/data/test3295
-rw-r--r--tests/data/test335
-rw-r--r--tests/data/test3305
-rw-r--r--tests/data/test3315
-rw-r--r--tests/data/test3332
-rw-r--r--tests/data/test3344
-rw-r--r--tests/data/test33511
-rw-r--r--tests/data/test3387
-rw-r--r--tests/data/test33961
-rw-r--r--tests/data/test344
-rw-r--r--tests/data/test34154
-rw-r--r--tests/data/test34256
-rw-r--r--tests/data/test34359
-rw-r--r--tests/data/test34456
-rw-r--r--tests/data/test34559
-rw-r--r--tests/data/test34658
-rw-r--r--tests/data/test34760
-rw-r--r--tests/data/test34861
-rw-r--r--tests/data/test35bin810 -> 805 bytes
-rw-r--r--tests/data/test3554
-rw-r--r--tests/data/test3564
-rw-r--r--tests/data/test35796
-rw-r--r--tests/data/test35894
-rw-r--r--tests/data/test35994
-rw-r--r--tests/data/test364
-rw-r--r--tests/data/test374
-rw-r--r--tests/data/test384
-rw-r--r--tests/data/test395
-rw-r--r--tests/data/test3934
-rw-r--r--tests/data/test3944
-rw-r--r--tests/data/test3954
-rw-r--r--tests/data/test396200
-rw-r--r--tests/data/test397196
-rw-r--r--tests/data/test45
-rw-r--r--tests/data/test406
-rw-r--r--tests/data/test426
-rw-r--r--tests/data/test435
-rw-r--r--tests/data/test430101
-rw-r--r--tests/data/test43195
-rw-r--r--tests/data/test432100
-rw-r--r--tests/data/test43357
-rw-r--r--tests/data/test43446
-rw-r--r--tests/data/test444
-rw-r--r--tests/data/test455
-rw-r--r--tests/data/test464
-rw-r--r--tests/data/test474
-rw-r--r--tests/data/test485
-rw-r--r--tests/data/test496
-rw-r--r--tests/data/test49067
-rw-r--r--tests/data/test49162
-rw-r--r--tests/data/test49290
-rw-r--r--tests/data/test54
-rw-r--r--tests/data/test506
-rw-r--r--tests/data/test5012
-rw-r--r--tests/data/test5042
-rw-r--r--tests/data/test5095
-rw-r--r--tests/data/test516
-rw-r--r--tests/data/test5114
-rw-r--r--tests/data/test5123
-rw-r--r--tests/data/test5143
-rw-r--r--tests/data/test5153
-rw-r--r--tests/data/test5163
-rw-r--r--tests/data/test526
-rw-r--r--tests/data/test5223
-rw-r--r--tests/data/test5233
-rw-r--r--tests/data/test534
-rw-r--r--tests/data/test53083
-rw-r--r--tests/data/test5332
-rw-r--r--tests/data/test5342
-rw-r--r--tests/data/test544
-rw-r--r--tests/data/test5403
-rw-r--r--tests/data/test5432
-rw-r--r--tests/data/test5443
-rw-r--r--tests/data/test5462
-rw-r--r--tests/data/test5477
-rw-r--r--tests/data/test5487
-rw-r--r--tests/data/test5493
-rw-r--r--tests/data/test556
-rw-r--r--tests/data/test5503
-rw-r--r--tests/data/test5513
-rw-r--r--tests/data/test552bin142985 -> 2967 bytes
-rw-r--r--tests/data/test55321
-rw-r--r--tests/data/test5557
-rw-r--r--tests/data/test5563
-rw-r--r--tests/data/test55810
-rw-r--r--tests/data/test564
-rw-r--r--tests/data/test5603
-rw-r--r--tests/data/test5613
-rw-r--r--tests/data/test574
-rw-r--r--tests/data/test5733
-rw-r--r--tests/data/test584
-rw-r--r--tests/data/test5803
-rw-r--r--tests/data/test5813
-rw-r--r--tests/data/test5822
-rw-r--r--tests/data/test5832
-rw-r--r--tests/data/test584102
-rw-r--r--tests/data/test5853
-rw-r--r--tests/data/test5893
-rw-r--r--tests/data/test594
-rw-r--r--tests/data/test5908
-rw-r--r--tests/data/test64
-rw-r--r--tests/data/test604
-rw-r--r--tests/data/test6002
-rw-r--r--tests/data/test6012
-rw-r--r--tests/data/test6022
-rw-r--r--tests/data/test6032
-rw-r--r--tests/data/test6042
-rw-r--r--tests/data/test6052
-rw-r--r--tests/data/test6062
-rw-r--r--tests/data/test6072
-rw-r--r--tests/data/test6082
-rw-r--r--tests/data/test6092
-rw-r--r--tests/data/test614
-rw-r--r--tests/data/test6102
-rw-r--r--tests/data/test6112
-rw-r--r--tests/data/test6122
-rw-r--r--tests/data/test6134
-rw-r--r--tests/data/test6144
-rw-r--r--tests/data/test6152
-rw-r--r--tests/data/test6162
-rw-r--r--tests/data/test6172
-rw-r--r--tests/data/test6182
-rw-r--r--tests/data/test6192
-rw-r--r--tests/data/test625
-rw-r--r--tests/data/test6202
-rw-r--r--tests/data/test6212
-rw-r--r--tests/data/test6222
-rw-r--r--tests/data/test6232
-rw-r--r--tests/data/test6242
-rw-r--r--tests/data/test6252
-rw-r--r--tests/data/test6262
-rw-r--r--tests/data/test6282
-rw-r--r--tests/data/test6292
-rw-r--r--tests/data/test634
-rw-r--r--tests/data/test6302
-rw-r--r--tests/data/test6312
-rw-r--r--tests/data/test6322
-rw-r--r--tests/data/test6332
-rw-r--r--tests/data/test6342
-rw-r--r--tests/data/test6352
-rw-r--r--tests/data/test6362
-rw-r--r--tests/data/test6372
-rw-r--r--tests/data/test6382
-rw-r--r--tests/data/test6392
-rw-r--r--tests/data/test646
-rw-r--r--tests/data/test6402
-rw-r--r--tests/data/test6412
-rw-r--r--tests/data/test6422
-rw-r--r--tests/data/test64312
-rw-r--r--tests/data/test6443
-rw-r--r--tests/data/test64564
-rw-r--r--tests/data/test656
-rw-r--r--tests/data/test65012
-rw-r--r--tests/data/test6511
-rw-r--r--tests/data/test65418
-rw-r--r--tests/data/test6562
-rw-r--r--tests/data/test6583
-rw-r--r--tests/data/test6593
-rw-r--r--tests/data/test664
-rw-r--r--tests/data/test6625
-rw-r--r--tests/data/test6637
-rw-r--r--tests/data/test66444
-rw-r--r--tests/data/test66544
-rw-r--r--tests/data/test666293
-rw-r--r--tests/data/test66785
-rw-r--r--tests/data/test66899
-rw-r--r--tests/data/test66960
-rw-r--r--tests/data/test678
-rw-r--r--tests/data/test67072
-rw-r--r--tests/data/test67172
-rw-r--r--tests/data/test67272
-rw-r--r--tests/data/test67372
-rw-r--r--tests/data/test67454
-rw-r--r--tests/data/test688
-rw-r--r--tests/data/test6910
-rw-r--r--tests/data/test74
-rw-r--r--tests/data/test707
-rw-r--r--tests/data/test7004
-rw-r--r--tests/data/test7014
-rw-r--r--tests/data/test7024
-rw-r--r--tests/data/test7034
-rw-r--r--tests/data/test7042
-rw-r--r--tests/data/test7052
-rw-r--r--tests/data/test7084
-rw-r--r--tests/data/test7094
-rw-r--r--tests/data/test7104
-rw-r--r--tests/data/test7162
-rw-r--r--tests/data/test7174
-rw-r--r--tests/data/test727
-rw-r--r--tests/data/test734
-rw-r--r--tests/data/test745
-rw-r--r--tests/data/test758
-rw-r--r--tests/data/test765
-rw-r--r--tests/data/test774
-rw-r--r--tests/data/test784
-rw-r--r--tests/data/test794
-rw-r--r--tests/data/test84
-rw-r--r--tests/data/test807
-rw-r--r--tests/data/test818
-rw-r--r--tests/data/test825
-rw-r--r--tests/data/test8221
-rw-r--r--tests/data/test8271
-rw-r--r--tests/data/test837
-rw-r--r--tests/data/test8311
-rw-r--r--tests/data/test8341
-rw-r--r--tests/data/test845
-rw-r--r--tests/data/test8427
-rw-r--r--tests/data/test8437
-rw-r--r--tests/data/test84412
-rw-r--r--tests/data/test8459
-rw-r--r--tests/data/test855
-rw-r--r--tests/data/test869
-rw-r--r--tests/data/test8681
-rw-r--r--tests/data/test8731
-rw-r--r--tests/data/test8771
-rw-r--r--tests/data/test886
-rw-r--r--tests/data/test8801
-rw-r--r--tests/data/test8879
-rw-r--r--tests/data/test8887
-rw-r--r--tests/data/test8899
-rw-r--r--tests/data/test8912
-rw-r--r--tests/data/test8907
-rw-r--r--tests/data/test89437
-rw-r--r--tests/data/test89550
-rw-r--r--tests/data/test89638
-rw-r--r--tests/data/test94
-rw-r--r--tests/data/test9014
-rw-r--r--tests/data/test9061
-rw-r--r--tests/data/test9110
-rw-r--r--tests/data/test9143
-rw-r--r--tests/data/test924
-rw-r--r--tests/data/test9211
-rw-r--r--tests/data/test9233
-rw-r--r--tests/data/test934
-rw-r--r--tests/data/test9331
-rw-r--r--tests/data/test9361
-rw-r--r--tests/data/test945
-rw-r--r--tests/data/test9469
-rw-r--r--tests/data/test9477
-rw-r--r--tests/data/test9489
-rw-r--r--tests/data/test9497
-rw-r--r--tests/data/test957
-rw-r--r--tests/data/test95559
-rw-r--r--tests/data/test95657
-rw-r--r--tests/data/test95751
-rw-r--r--tests/data/test95851
-rw-r--r--tests/data/test95960
-rw-r--r--tests/data/test96058
-rw-r--r--tests/data/test96152
-rw-r--r--tests/data/test96263
-rw-r--r--tests/data/test96363
-rw-r--r--tests/data/test96449
-rw-r--r--tests/data/test96566
-rw-r--r--tests/data/test96666
-rw-r--r--tests/data/test96755
-rw-r--r--tests/data/test96852
-rw-r--r--tests/data/test96951
-rw-r--r--tests/data/test974
-rw-r--r--tests/data/test97065
-rw-r--r--tests/data/test97130
-rw-r--r--tests/data/test984
-rw-r--r--tests/data/test994
-rwxr-xr-xtests/dictserver.py32
-rw-r--r--tests/directories.pm2
-rwxr-xr-xtests/disable-scan.pl37
-rw-r--r--tests/error-codes.pl80
-rwxr-xr-xtests/extern-scan.pl2
-rw-r--r--tests/ftp.pm144
-rwxr-xr-xtests/ftpserver.pl156
-rw-r--r--tests/getpart.pm64
-rwxr-xr-xtests/http2-server.pl2
-rwxr-xr-xtests/httpserver.pl28
-rw-r--r--tests/libtest/CMakeLists.txt107
-rw-r--r--tests/libtest/Makefile.am11
-rw-r--r--tests/libtest/Makefile.inc163
-rw-r--r--tests/libtest/lib1156.c10
-rw-r--r--tests/libtest/lib1507.c2
-rw-r--r--tests/libtest/lib1508.c2
-rw-r--r--tests/libtest/lib1509.c2
-rw-r--r--tests/libtest/lib1514.c6
-rw-r--r--tests/libtest/lib1515.c4
-rw-r--r--tests/libtest/lib1520.c2
-rw-r--r--tests/libtest/lib1525.c2
-rw-r--r--tests/libtest/lib1526.c2
-rw-r--r--tests/libtest/lib1527.c2
-rw-r--r--tests/libtest/lib1531.c4
-rw-r--r--tests/libtest/lib1533.c2
-rw-r--r--tests/libtest/lib1535.c2
-rw-r--r--tests/libtest/lib1536.c2
-rw-r--r--tests/libtest/lib1538.c14
-rw-r--r--tests/libtest/lib1540.c2
-rw-r--r--tests/libtest/lib1541.c151
-rw-r--r--tests/libtest/lib1554.c2
-rw-r--r--tests/libtest/lib1557.c6
-rw-r--r--tests/libtest/lib1559.c12
-rw-r--r--tests/libtest/lib1560.c54
-rw-r--r--tests/libtest/lib1564.c142
-rw-r--r--tests/libtest/lib1565.c204
-rw-r--r--tests/libtest/lib1567.c52
-rw-r--r--tests/libtest/lib1591.c21
-rw-r--r--tests/libtest/lib1592.c10
-rw-r--r--tests/libtest/lib1900.c248
-rw-r--r--tests/libtest/lib1908.c62
-rw-r--r--tests/libtest/lib1910.c47
-rw-r--r--tests/libtest/lib1911.c87
-rw-r--r--tests/libtest/lib1912.c80
-rw-r--r--tests/libtest/lib1913.c48
-rw-r--r--tests/libtest/lib3010.c66
-rw-r--r--tests/libtest/lib500.c2
-rw-r--r--tests/libtest/lib501.c2
-rw-r--r--tests/libtest/lib502.c2
-rw-r--r--tests/libtest/lib503.c2
-rw-r--r--tests/libtest/lib504.c2
-rw-r--r--tests/libtest/lib505.c4
-rw-r--r--tests/libtest/lib509.c63
-rw-r--r--tests/libtest/lib512.c2
-rw-r--r--tests/libtest/lib519.c2
-rw-r--r--tests/libtest/lib521.c2
-rw-r--r--tests/libtest/lib523.c2
-rw-r--r--tests/libtest/lib524.c2
-rw-r--r--tests/libtest/lib530.c122
-rw-r--r--tests/libtest/lib541.c4
-rw-r--r--tests/libtest/lib543.c16
-rw-r--r--tests/libtest/lib547.c4
-rw-r--r--tests/libtest/lib549.c2
-rw-r--r--tests/libtest/lib553.c4
-rw-r--r--tests/libtest/lib556.c4
-rw-r--r--tests/libtest/lib557.c13
-rw-r--r--tests/libtest/lib558.c2
-rw-r--r--tests/libtest/lib559.c2
-rw-r--r--tests/libtest/lib560.c2
-rw-r--r--tests/libtest/lib566.c2
-rw-r--r--tests/libtest/lib567.c2
-rw-r--r--tests/libtest/lib568.c2
-rw-r--r--tests/libtest/lib570.c2
-rw-r--r--tests/libtest/lib572.c2
-rw-r--r--tests/libtest/lib573.c2
-rw-r--r--tests/libtest/lib576.c12
-rw-r--r--tests/libtest/lib579.c2
-rw-r--r--tests/libtest/lib582.c14
-rw-r--r--tests/libtest/lib583.c13
-rw-r--r--tests/libtest/lib586.c2
-rw-r--r--tests/libtest/lib590.c2
-rw-r--r--tests/libtest/lib591.c2
-rw-r--r--tests/libtest/lib598.c2
-rw-r--r--tests/libtest/lib643.c19
-rw-r--r--tests/libtest/lib651.c4
-rw-r--r--tests/libtest/lib652.c5
-rw-r--r--tests/libtest/lib654.c8
-rw-r--r--tests/libtest/lib661.c2
-rw-r--r--tests/libtest/lib666.c120
-rw-r--r--tests/libtest/lib667.c117
-rw-r--r--tests/libtest/lib668.c122
-rw-r--r--tests/libtest/lib670.c259
-rw-r--r--tests/libtest/lib674.c81
-rwxr-xr-xtests/libtest/mk-lib1521.pl58
-rwxr-xr-xtests/libtest/notexists.pl21
-rw-r--r--tests/libtest/sethostname.c2
-rw-r--r--tests/libtest/sethostname.h4
-rw-r--r--tests/libtest/stub_gssapi.h2
-rw-r--r--tests/libtest/test.h162
-rwxr-xr-xtests/libtest/test1013.pl21
-rwxr-xr-xtests/libtest/test1022.pl21
-rwxr-xr-xtests/libtest/test307.pl21
-rwxr-xr-xtests/libtest/test610.pl21
-rwxr-xr-xtests/libtest/test613.pl41
-rwxr-xr-xtests/libtest/test75.pl13
-rw-r--r--tests/libtest/testtrace.h2
-rw-r--r--tests/libtest/testutil.c4
-rw-r--r--tests/libtest/testutil.h2
-rwxr-xr-xtests/manpage-scan.pl6
-rwxr-xr-xtests/mem-include-scan.pl2
-rwxr-xr-xtests/negtelnetserver.py40
-rwxr-xr-xtests/nroff-scan.pl14
-rw-r--r--tests/objnames.inc2
-rw-r--r--tests/options-scan.pl122
-rw-r--r--tests/pathhelp.pm2
-rw-r--r--tests/python_dependencies/impacket/__init__.py25
-rw-r--r--tests/python_dependencies/impacket/nmb.py982
-rw-r--r--tests/python_dependencies/impacket/nt_errors.py3586
-rw-r--r--tests/python_dependencies/impacket/ntlm.py973
-rw-r--r--tests/python_dependencies/impacket/smb.py4099
-rw-r--r--tests/python_dependencies/impacket/smb3.py1630
-rw-r--r--tests/python_dependencies/impacket/smb3structs.py1363
-rw-r--r--tests/python_dependencies/impacket/smbserver.py4174
-rw-r--r--tests/python_dependencies/impacket/spnego.py372
-rw-r--r--tests/python_dependencies/impacket/structure.py744
-rw-r--r--tests/python_dependencies/impacket/uuid.py73
-rw-r--r--tests/python_dependencies/impacket/version.py12
-rwxr-xr-xtests/rtspserver.pl19
-rw-r--r--tests/runtests.165
-rwxr-xr-xtests/runtests.pl1748
-rwxr-xr-xtests/secureserver.pl7
-rw-r--r--tests/server/CMakeLists.txt26
-rw-r--r--tests/server/Makefile.am2
-rw-r--r--tests/server/Makefile.inc41
-rwxr-xr-xtests/server/base64.pl21
-rw-r--r--tests/server/fake_ntlm.c17
-rw-r--r--tests/server/getpart.c2
-rw-r--r--tests/server/getpart.h2
-rw-r--r--tests/server/mqttd.c1018
-rw-r--r--tests/server/resolve.c10
-rw-r--r--tests/server/rtspd.c215
-rw-r--r--tests/server/server_setup.h2
-rw-r--r--tests/server/server_sockaddr.h2
-rw-r--r--tests/server/sockfilt.c614
-rw-r--r--tests/server/socksd.c143
-rw-r--r--tests/server/sws.c364
-rw-r--r--tests/server/testpart.c2
-rw-r--r--tests/server/tftp.h2
-rw-r--r--tests/server/tftpd.c264
-rw-r--r--tests/server/util.c363
-rw-r--r--tests/server/util.h34
-rw-r--r--tests/serverhelp.pm14
-rwxr-xr-xtests/smbserver.py33
-rw-r--r--tests/sshhelp.pm26
-rw-r--r--tests/sshserver.pl76
-rwxr-xr-xtests/symbol-scan.pl7
-rw-r--r--tests/testcurl.12
-rwxr-xr-xtests/testcurl.pl14
-rwxr-xr-xtests/tftpserver.pl23
-rw-r--r--tests/unit/CMakeLists.txt39
-rw-r--r--tests/unit/Makefile.am6
-rw-r--r--tests/unit/Makefile.inc34
-rw-r--r--tests/unit/README.md (renamed from tests/unit/README)42
-rw-r--r--tests/unit/curlcheck.h6
-rw-r--r--tests/unit/unit1300.c82
-rw-r--r--tests/unit/unit1302.c2
-rw-r--r--tests/unit/unit1305.c29
-rw-r--r--tests/unit/unit1309.c4
-rw-r--r--tests/unit/unit1330.c2
-rw-r--r--tests/unit/unit1394.c8
-rw-r--r--tests/unit/unit1395.c2
-rw-r--r--tests/unit/unit1600.c2
-rw-r--r--tests/unit/unit1601.c20
-rw-r--r--tests/unit/unit1602.c4
-rw-r--r--tests/unit/unit1603.c4
-rw-r--r--tests/unit/unit1604.c7
-rw-r--r--tests/unit/unit1605.c2
-rw-r--r--tests/unit/unit1607.c30
-rw-r--r--tests/unit/unit1608.c6
-rw-r--r--tests/unit/unit1609.c29
-rw-r--r--tests/unit/unit1610.c60
-rw-r--r--tests/unit/unit1611.c58
-rw-r--r--tests/unit/unit1612.c66
-rw-r--r--tests/unit/unit1620.c8
-rw-r--r--tests/unit/unit1650.c19
-rw-r--r--tests/unit/unit1651.c4
-rw-r--r--tests/unit/unit1654.c45
-rw-r--r--tests/unit/unit1655.c133
-rw-r--r--tests/valgrind.pm2
-rwxr-xr-xtests/version-scan.pl66
-rw-r--r--winbuild/BUILD.WINDOWS.txt124
-rw-r--r--winbuild/Makefile.vc24
-rw-r--r--winbuild/MakefileBuild.vc40
-rw-r--r--winbuild/README.md127
2379 files changed, 65428 insertions, 58655 deletions
diff --git a/Android.bp b/Android.bp
index ab892e5ca..6553a6844 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,3 +1,40 @@
+package {
+ default_applicable_licenses: ["external_curl_license"],
+}
+
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+//
+// large-scale-change filtered out the below license kinds as false-positives:
+// SPDX-license-identifier-GPL
+// See: http://go/android-license-faq
+license {
+ name: "external_curl_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-BSD",
+ "SPDX-license-identifier-ISC",
+ "SPDX-license-identifier-MIT",
+ "SPDX-license-identifier-OpenSSL",
+ "legacy_notice",
+ "legacy_unencumbered",
+ ],
+ license_text: [
+ "COPYING",
+ ],
+}
+
cc_defaults {
name: "curl_common_defaults",
cflags: [
@@ -50,6 +87,7 @@ cc_defaults {
cc_library {
name: "libcurl",
vendor_available: true,
+ product_available: true,
vndk: {
enabled: true,
},
@@ -83,6 +121,7 @@ cc_binary {
defaults: ["curl_common_defaults"],
srcs: [
"src/*.c",
+ "lib/dynbuf.c",
],
shared_libs: [
"libcrypto",
diff --git a/CHANGES b/CHANGES
index d35f54199..b5bc30595 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,7094 +6,7447 @@
Changelog
-Version 7.67.0 (5 Nov 2019)
+Version 7.73.0 (14 Oct 2020)
-Daniel Stenberg (5 Nov 2019)
+Daniel Stenberg (14 Oct 2020)
- RELEASE-NOTES: synced
- The 7.67.0 release
+ for 7.73.0
-- THANKS: add new names from 7.67.0
+- THANKS: from 7.73.0 and .mailmap fixes
-- configure: only say ipv6 enabled when the variable is set
-
- Previously it could say "IPv6: enabled" at the end of the configure run
- but the define wasn't set because of a missing getaddrinfo().
-
- Reported-by: Marcel Raad
- Fixes #4555
- Closes #4560
+- mailmap: fixups of some contributors
-Marcel Raad (2 Nov 2019)
-- certs/Server-localhost-lastSAN-sv: regenerate with sha256
+- projects/build-wolfssl.bat: fix the copyright year range
+
+Marc Hoersken (14 Oct 2020)
+- [Sergei Nikulov brought this change]
+
+ CI/tests: fix invocation of tests for CMake builds
- All other certificates were regenerated in commit ba782baac30, but
- this one was missed.
- Fixes test3001 on modern systems.
+ Update appveyor.yml to set env variable TFLAGS and run tests
+ Remove curly braces due to CMake error (${TFLAGS} -> $TFLAGS)
+ Move testdeps build to build step (per review comments)
- Closes https://github.com/curl/curl/pull/4551
-
-Daniel Stenberg (2 Nov 2019)
-- [Vilhelm Prytz brought this change]
+ Reviewed-by: Marc Hörsken
+
+ Closes #6066
+ Fixes #6052
- copyrights: update all copyright notices to 2019 on files changed this year
+- tests/server/util.c: fix support for Windows Unicode builds
- Closes #4547
+ Detected via #6066
+ Closes #6070
-- [Bastien Bouclet brought this change]
+Daniel Stenberg (13 Oct 2020)
+- [Jay Satiro brought this change]
- mbedtls: add error message for cert validity starting in the future
+ strerror: Revert to local codepage for Windows error string
- Closes #4552
-
-Jay Satiro (1 Nov 2019)
-- schannel_verify: Fix concurrent openings of CA file
+ - Change get_winapi_error() to return the error string in the local
+ codepage instead of UTF-8 encoding.
+
+ Two weeks ago bed5f84 fixed get_winapi_error() to work on xbox, but it
+ also changed the error string's encoding from local codepage to UTF-8.
+
+ We return the local codepage version of the error string because if it
+ is output to the user's terminal it will likely be with functions which
+ expect the local codepage (eg fprintf, failf, infof).
- - Open the CA file using FILE_SHARE_READ mode so that others can read
- from it as well.
+ This is essentially a partial revert of bed5f84. The support for xbox
+ remains but the error string is reverted back to local codepage.
- Prior to this change our schannel code opened the CA file without
- sharing which meant concurrent openings (eg an attempt from another
- thread or process) would fail during the time it was open without
- sharing, which in curl's case would cause error:
- "schannel: failed to open CA file".
+ Ref: https://github.com/curl/curl/pull/6005
- Bug: https://curl.haxx.se/mail/lib-2019-10/0104.html
- Reported-by: Richard Alcock
+ Reviewed-by: Marcel Raad
+ Closes #6065
-Daniel Stenberg (31 Oct 2019)
-- gtls: make gnutls_bye() not wait for response on shutdown
+Marc Hoersken (13 Oct 2020)
+- CI/tests: use verification curl for test reporting APIs
- ... as it can make it wait there for a long time for no good purpose.
+ Avoid using our own, potentially installed, curl for
+ the test reporting APIs in case it is broken.
- Patched-by: Jay Satiro
- Reported-by: Bylon2 on github
- Adviced-by: Nikos Mavrogiannopoulos
+ Reviewed-by: Daniel Stenberg
- Fixes #4487
- Closes #4541
-
-- [Michał Janiszewski brought this change]
+ Preparation for #6049
+ Closes #6063
- appveyor: publish artifacts on appveyor
+Viktor Szakats (12 Oct 2020)
+- windows: fix comparison of mismatched types warning
- This allows obtaining upstream builds of curl directly from appveyor for
- all the available configurations
+ clang 10, mingw-w64:
+ ```
+ vtls/openssl.c:2917:33: warning: comparison of integers of different signs: 'DWORD' (aka 'unsigned long') and 'HRESULT' (aka 'long')
+ [-Wsign-compare]
+ if(GetLastError() != CRYPT_E_NOT_FOUND)
+ ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~
+ ```
- Closes #4509
+ Approved-by: Daniel Stenberg
+ Closes #6062
+
+Daniel Stenberg (11 Oct 2020)
+- [Viktor Szakats brought this change]
-- url: make Curl_close() NULLify the pointer too
+ src/Makefile.m32: fix undefined curlx_dyn_* errors
- This is the common pattern used in the code and by a unified approach we
- avoid mistakes.
+ by linking `lib/dynbuf.c` when building a static curl binary.
+ Previously this source file was only included when building
+ a dynamic curl binary. This was likely possibly because no
+ functions from the `src/Makefile.inc` / `CURLX_CFILES` sources
+ were actually required for a curl tool build. This has
+ recently changed with the introduction of `curlx_dyn_*()`
+ memory functions and their use by the tool sources.
- Closes #4534
+ Closes #6060
-- [Trivikram Kamat brought this change]
+- HISTORY: curl verifies SSL certs by default since version 7.10
- INSTALL: add missing space for configure commands
+Marc Hoersken (8 Oct 2020)
+- runtests.pl: use $LIBDIR variable instead of hardcoded path
- Closes #4539
+ Reviewed-by: Daniel Stenberg
+ Closes #6051
-- url: Curl_free_request_state() should also free doh handles
+Daniel Stenberg (7 Oct 2020)
+- checksrc: detect // comments on column 0
- ... or risk DoH memory leaks.
-
- Reported-by: Paul Dreik
- Fixes #4463
- Closes #4527
-
-- examples: remove the "this exact code has not been verified"
+ Spotted while working on #6045
- ... as really confuses the reader to not know what to believe!
+ Closes #6048
-- [Trivikram Kamat brought this change]
+- [Frederik Wedel-Heinen brought this change]
- HTTP3: fix typo somehere1 > somewhere1
+ mbedtls: add missing header when defining MBEDTLS_DEBUG
- Closes #4535
+ Closes #6045
-Jay Satiro (28 Oct 2019)
-- [Javier Blazquez brought this change]
-
- HTTP3: fix invalid use of sendto for connected UDP socket
+- curl: make sure setopt CURLOPT_IPRESOLVE passes on a long
- On macOS/BSD, trying to call sendto on a connected UDP socket fails
- with a EISCONN error. Because the singleipconnect has already called
- connect on the socket when we're trying to use it for QUIC transfers
- we need to use plain send instead.
+ Previously, it would pass on a define (int) which could make libcurl
+ read junk as a value - which prevented the CURLOPT_IPRESOLVE option to
+ "take". This could then make test 2100 do two DoH requests instead of
+ one!
- Fixes #4529
- Closes https://github.com/curl/curl/pull/4533
+ Fixes #6042
+ Closes #6043
-Daniel Stenberg (28 Oct 2019)
- RELEASE-NOTES: synced
-- [Javier Blazquez brought this change]
-
- HTTP3: fix Windows build
-
- The ngtcp2 QUIC backend was using the MSG_DONTWAIT flag for send/recv
- in order to perform nonblocking operations. On Windows this flag does
- not exist. Instead, the socket must be set to nonblocking mode via
- ioctlsocket.
-
- This change sets the nonblocking flag on UDP sockets used for QUIC on
- all platforms so the use of MSG_DONTWAIT is not needed.
+- scripts/release-notes.pl: don't "embed" $ in format string for printf()
- Fixes #4531
- Closes #4532
+ ... since they might contain %-codes that mess up the output!
-Marcel Raad (27 Oct 2019)
-- appveyor: add --disable-proxy autotools build
+Jay Satiro (5 Oct 2020)
+- [M.R.T brought this change]
+
+ build-wolfssl: fix build with Visual Studio 2019
- This would have caught issue #3926.
+ Closes https://github.com/curl/curl/pull/6033
+
+Daniel Stenberg (4 Oct 2020)
+- runtests: add %repeat[]% for test files
- Also make formatting more consistent.
+ ... and use this new keywords in all the test files larger than 50K to reduce
+ their sizes and make them a lot easier to read and understand.
- Closes https://github.com/curl/curl/pull/4526
+ Closes #6040
-Daniel Stenberg (25 Oct 2019)
-- appveyor: make winbuilds with DEBUG=no/yes and VS 2015/2017
-
- ... and invoke "curl -V" once done
+- [Emil Engler brought this change]
+
+ --help: move two options from the misc category
- Co-Authored-By: Jay Satiro
+ The cmdline opts delegation and suppress-connect-headers
+ fit better into auth and proxy rather than misc.
- Closes #4523
+ Follow-up to aa8777f63febc
+ Closes #6038
-- [Francois Rivard brought this change]
+- [Samanta Navarro brought this change]
- schannel: reverse the order of certinfo insertions
+ docs/opts: fix typos in two manual pages
- Fixes #4518
- Closes #4519
+ Closes #6039
-Marcel Raad (24 Oct 2019)
-- test1591: fix spelling of http feature
+- ldap: reduce the amount of #ifdefs needed
- The test never got run because the feature name is `http` in lowercase.
-
- Closes https://github.com/curl/curl/pull/4520
-
-Daniel Stenberg (23 Oct 2019)
-- [Michał Janiszewski brought this change]
+ Closes #6035
- appveyor: Use two parallel compilation on appveyor with CMake
-
- Appveyor provides 2 CPUs for each builder[1], make sure to use parallel
- compilation, when running with CMake. CMake learned this new option in
- version 3.12[2] and the version provided by appveyor is fresh enough.
+- runtests: provide curl's version string as %VERSION for tests
- Curl doesn't really take that long to build and it is using the slowest
- builder available, msbuild, so expect only a moderate improvement in
- build times.
+ ... so that we can check HTTP requests for User-Agent: curl/%VERSION
- [1] https://www.appveyor.com/docs/build-environment/
- [2] https://cmake.org/cmake/help/v3.12/release/3.12.html
+ Update 600+ test cases accordingly.
- Closes #4508
+ Closes #6037
-- conn-reuse: requests wanting NTLM can reuse non-NTLM connections
+- checksrc: warn on space after exclamation mark
- Added test case 338 to verify.
-
- Reported-by: Daniel Silverstone
- Fixes #4499
- Closes #4514
+ Closes #6034
-Marcel Raad (23 Oct 2019)
-- tests: add missing proxy features
+- test1465: verify --libcurl with binary POST data
-Daniel Stenberg (22 Oct 2019)
-- RELEASE-NOTES: synced
+- runtests: allow generating a binary sequence from hex
-Marcel Raad (21 Oct 2019)
-- tests: use %FILE_PWD for file:// URLs
-
- This way, we always have exactly one slash after the host name, making
- the tests pass when curl is compiled with the MSYS GCC.
+- tool_setopt: escape binary data to hex, not octal
+
+- curl: make --libcurl show binary posts correctly
- Closes https://github.com/curl/curl/pull/4512
+ Reported-by: Stephan Mühlstrasser
+ Fixes #6031
+ Closes #6032
-- tests: add `connect to non-listen` keywords
+Jay Satiro (1 Oct 2020)
+- strerror: fix null deref on winapi out-of-memory
- These tests try to connect to ports nothing is listening on.
+ Follow-up to bed5f84 from several days ago.
- Closes https://github.com/curl/curl/pull/4511
+ Ref: https://github.com/curl/curl/pull/6005
+
+Daniel Stenberg (1 Oct 2020)
+- [Kamil Dudka brought this change]
-- runtests: get textaware info from curl instead of perl
+ vtls: deduplicate some DISABLE_PROXY ifdefs
- The MSYS system on Windows can run the test suite for curl built with
- any toolset. When built with the MSYS GCC, curl uses Unix line endings,
- while it uses Windows line endings when built with the MinGW GCC, and
- `^O` reports 'msys' in both cases. Use the curl executable itself to
- determine the line endings instead, which reports 'x86_64-pc-msys' when
- built with the MSYS GCC.
+ ... in the code of gtls, nss, and openssl
- Closes https://github.com/curl/curl/pull/4506
+ Closes #5735
-Daniel Stenberg (20 Oct 2019)
-- [Michał Janiszewski brought this change]
+- RELEASE-NOTES: synced
- appveyor: Add MSVC ARM64 build
-
- Closes #4507
+- [Emil Engler brought this change]
-- http2_recv: a closed stream trumps pause state
-
- ... and thus should return 0, not EAGAIN.
+ TODO: Add OpenBSD libtool notice
- Reported-by: Tom van der Woerdt
- Fixes #4496
- Closes #4505
+ See #5862
+ Closes #6030
-- http2: expire a timeout at end of stream
+- tests/unit/README: convert to markdown
- To make sure that transfer is being dealt with. Streams without
- Content-Length need a final read to notice the end-of-stream state.
+ ... and add to dist!
- Reported-by: Tom van der Woerdt
- Fixes #4496
+ Closes #6028
-Dan Fandrich (18 Oct 2019)
-- travis: Add an ARM64 build
+- tests/README: convert to markdown
- Test 323 is failing for some reason, so disable it there for now.
+ Closes #6028
-Marcel Raad (18 Oct 2019)
-- examples/sslbackend: fix -Wchar-subscripts warning
+- include/README: convert to markdown
- With the `isdigit` implementation that comes with MSYS2, the argument
- is used as an array subscript, resulting in a -Wchar-subscripts
- warning. `isdigit`'s behavior is undefined if the argument is negative
- and not EOF [0]. As done in lib/curl_ctype.h, cast the `char` variable
- to `unsigned char` to avoid that.
+ Closes #6028
+
+- examples/README: convert to markdown
- [0] https://en.cppreference.com/w/c/string/byte/isdigit
+ Closes #6028
+
+- configure: don't say HTTPS-proxy is enabled when disabled!
- Closes https://github.com/curl/curl/pull/4503
+ Reported-by: Kamil Dudka
+ Reviewed-by: Kamil Dudka
+ Bug: https://github.com/curl/curl/pull/5735#issuecomment-701376388
+ Closes #6029
-Daniel Stenberg (18 Oct 2019)
-- configure: remove all cyassl references
+Daniel Gustafsson (30 Sep 2020)
+- src: Consistently spell whitespace without whitespace
- In particular, this removes the case where configure would find an old
- cyall installation rather than a wolfssl one if present. The library is
- named wolfssl in modern days so there's no real need to keep support for
- the former.
+ Whitespace is spelled without a space between white and space, so
+ make sure to consistently spell it that way across the codebase.
- Reported-by: Jacob Barthelmeh
- Closes #4502
+ Closes #6023
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Emil Engler <me@emilengler.com>
-Marcel Raad (17 Oct 2019)
-- test1162: disable MSYS2's POSIX path conversion
+- MANUAL: update examples to resolve without redirects
+
+ www.netscape.com is redirecting to a cookie consent form on Aol, and
+ cool.haxx.se isn't responding to FTP anymore. Replace with examples
+ that resolves in case users try out the commands when reading the
+ manual.
- This avoids MSYS2 converting the backslasb in the URL to a slash,
- causing the test to fail.
+ Closes #6024
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Emil Engler <me@emilengler.com>
-Daniel Stenberg (17 Oct 2019)
-- RELEASE-NOTES: synced
+Daniel Stenberg (30 Sep 2020)
+- HISTORY: add some 2020 events
-Jay Satiro (16 Oct 2019)
-- CURLOPT_TIMEOUT.3: Clarify transfer timeout time includes queue time
+- sectransp: make it build with --disable-proxy
- Prior to this change some users did not understand that the "request"
- starts when the handle is added to the multi handle, or probably they
- did not understand that some of those transfers may be queued and that
- time is included in timeout.
-
- Reported-by: Jeroen Ooms
-
- Fixes https://github.com/curl/curl/issues/4486
- Closes https://github.com/curl/curl/pull/4489
+ Follow-up from #5466 and f3d501dc678d80
+ Reported-by: Javier Navarro
+ Fixes #6025
+ Closes #6026
-- [Stian Soiland-Reyes brought this change]
-
- tool_operate: Fix retry sleep time shown to user when Retry-After
+- ECH: renamed from ESNI in docs and configure
- - If server header Retry-After is being used for retry sleep time then
- show that value to the user instead of the normal retry sleep time.
+ Encrypted Client Hello (ECH) is the current name.
- This is a follow-up to 640b973 (7.66.0) which changed curl tool so that
- the value from Retry-After header overrides other retry timing options.
+ Closes #6022
+
+- configure: use "no" instead of "disabled" for the end summary
- Closes https://github.com/curl/curl/pull/4498
+ ... for consistency but also to make them more distinctly stand out next
+ to the "enabled" lines.
-Daniel Stenberg (16 Oct 2019)
-- url: normalize CURLINFO_EFFECTIVE_URL
+- TODO: SSH over HTTPS proxy with more backends
- The URL extracted with CURLINFO_EFFECTIVE_URL was returned as given as
- input in most cases, which made it not get a scheme prefixed like before
- if the URL was given without one, and it didn't remove dotdot sequences
- etc.
+ ... as right now only the libssh2 backend supports it.
+
+- libssh2: handle the SSH protocols done over HTTPS proxy
- Added test case 1907 to verify that this now works as intended and as
- before 7.62.0.
+ Reported-by: Robin Douine
+ Fixes #4295
+ Closes #6021
+
+- [Emil Engler brought this change]
+
+ memdebug: remove 9 year old unused debug function
- Regression introduced in 7.62.0
+ There used to be a way to have memdebug fill allocated memory. 9 years
+ later this has no value there (valgrind and ASAN etc are way better). If
+ people need to know about it they can have a look at VCS logs.
- Reported-by: Christophe Dervieux
- Fixes #4491
- Closes #4493
+ Closes #5973
-Marcel Raad (16 Oct 2019)
-- tests: line ending fixes for Windows
+- sendf: move Curl_sendf to dict.c and make it static
- Mark some files as text.
+ ... as the only remaining user of that function. Also fix gopher.c to
+ instead use Curl_write()
- Closes https://github.com/curl/curl/pull/4490
+ Closes #6020
-- tests: use proxy feature
+- ROADMAP: updates and cleanups
- This makes the tests succeed when using --disable-proxy.
+ Fix the HSTS PR
- Closes https://github.com/curl/curl/pull/4488
+ Remove DoT, thread-safe init and hard-coded localhost. I feel very
+ little interest for these with users so I downgrade them to plain "TODO"
+ entries again.
-- smbserver: fix Python 3 compatibility
+- schannel: return CURLE_PEER_FAILED_VERIFICATION for untrusted root
- Python 2's `ConfigParser` module is spelled `configparser` in Python 3.
+ This matches what is returned in other TLS backends in the same
+ situation.
- Closes https://github.com/curl/curl/pull/4484
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Emil Engler
+ Follow-up to 5a3efb1
+ Reported-by: iammrtau on github
+ Fixes #6003
+ Closes #6018
-- security: silence conversion warning
+- RELEASE-NOTES: synced
+
+- ftp: make a 552 response return CURLE_REMOTE_DISK_FULL
- With MinGW-w64, `curl_socket_t` is is a 32 or 64 bit unsigned integer,
- while `read` expects a 32 bit signed integer.
- Use `sread` instead of `read` to use the correct parameter type.
+ Added test 348 to verify. Added a 'STOR' command to the test FTP
+ server to enable test 348. Documented the command in FILEFORMAT.md
- Closes https://github.com/curl/curl/pull/4483
+ Reported-by: Duncan Wilcox
+ Fixes #6016
+ Closes #6017
-- connect: silence sign-compare warning
+- pause: only trigger a reread if the unpause sticks
- With MinGW-w64 using WinSock, `curl_socklen_t` is signed, while the
- result of `sizeof` is unsigned.
+ As an unpause might itself get paused again and then triggering another
+ reread doesn't help.
- Closes https://github.com/curl/curl/pull/4483
-
-Daniel Stenberg (13 Oct 2019)
-- TODO: Handle growing SFTP files
+ Follow-up from e040146f22608fd9 (shipped since 7.69.1)
- Closes #4344
+ Bug: https://curl.haxx.se/mail/lib-2020-09/0081.html
+ Patch-by: Kunal Chandarana
+ Fixes #5988
+ Closes #6013
-- KNOWN_BUGS: remove "CURLFORM_CONTENTLEN in an array"
+- test163[12]: require http to be built-in to run
- The curl_formadd() function is deprecated and shouldn't be used so the
- real fix for applications is to switch to the curl_mime_* API.
-
-- KNOWN_BUGS: "LDAP on Windows does authentication wrong"
+ ... as speaking over an HTTPS proxy implies http!
- Closes #3116
+ Closes #6014
-- appveyor: add a winbuild that uses VS2017
+- ngtcp2: adapt to new NGTCP2_PROTO_VER_MAX define
- Closes #4482
+ Closes #6012
-- [Harry Sintonen brought this change]
+- [Javier Blazquez brought this change]
- socketpair: fix include and define for older TCP header systems
+ strerror: honor Unicode API choice on Windows
- fixed build for systems that need netinet/in.h for IPPROTO_TCP and are
- missing INADDR_LOOPBACK
-
- Closes #4480
+ Closes #6005
-- socketpair: fix double-close in error case
+- imap: make imap_send use dynbuf for the send buffer management
- Follow-up to bc2dbef0afc08
-
-- gskit: use the generic Curl_socketpair
+ Reuses the buffer and thereby reduces number of mallocs over a transfer.
+
+ Closes #6010
-- asyn-thread: make use of Curl_socketpair() where available
+- Curl_send: return error when pre_receive_plain can't malloc
+
+ ... will probably trigger some false DEAD CODE positives on non-windows
+ code analyzers for the conditional code.
+
+ Closes #6011
-- socketpair: an implemention for Windows and more
+- ftp: separate FTPS from FTP over "HTTPS proxy"
- Curl_socketpair() is designed to be used and work everywhere if there's
- no native version or the native version isn't good enough.
+ When using HTTPS proxy, SSL is used but not in the view of the FTP
+ protocol handler itself so separate the connection's use of SSL from the
+ FTP control connection's sue.
- Closes #4466
+ Reported-by: Mingtao Yang
+ Fixes #5523
+ Closes #6006
-- RELEASE-NOTES: synced
+Dan Fandrich (23 Sep 2020)
+- tests/data: Fix some mismatched XML tags in test cases
+
+ This allows these test files to pass xmllint.
-- connect: return CURLE_OPERATION_TIMEDOUT for errno == ETIMEDOUT
+Daniel Stenberg (23 Sep 2020)
+- pingpong: use a dynbuf for the *_pp_sendf() function
- Previosly all connect() failures would return CURLE_COULDNT_CONNECT, no
- matter what errno said.
+ ... reuses the same dynamic buffer instead of doing repeated malloc/free
+ cycles.
- This makes for example --retry work on these transfer failures.
+ Test case 100 (FTP dir list PASV) does 7 fewer memory allocation calls
+ after this change in my test setup (132 => 125), curl 7.72.0 needed 140
+ calls for this.
- Reported-by: Nathaniel J. Smith
- Fixes #4461
- Clsoes #4462
-
-- cirrus: switch off blackhole status on the freebsd CI machines
-
-- tests: use port 2 instead of 60000 for a safer non-listening port
+ Test case 103 makes 9 less allocations now (130). Down from 149 in
+ 7.72.0.
- ... when the tests want "connection refused".
+ Closes #6004
-- KNOWN_BUGS: IDN tests failing on Windows
+- dynbuf: add Curl_dyn_vaddf
- Closes #3747
+ Closes #6004
-Dan Fandrich (9 Oct 2019)
-- cirrus: Increase the git clone depth.
+- dynbuf: make *addf() not require extra mallocs
- If more commits are submitted to master between the time of triggering
- the first Cirrus build and the time the final build gets started, the
- desired commit is no longer at HEAD and the build will error out.
- [skip ci]
-
-Daniel Stenberg (9 Oct 2019)
-- docs: make sure the --no-progress-meter docs file is in dist too
-
-- docs: document it as --no-progress-meter instead of the reverse
+ ... by introducing a printf() function that appends directly into a
+ dynbuf: Curl_dyn_vprintf(). This avoids the mandatory extra malloc so if
+ the buffer is already big enough it can just printf directly into it.
- Follow-up to 93373a960c3bb4
+ Since this less-malloc version requires tthe use of a library internal
+ printf function, we only provide this version when building libcurl and
+ not for the dynbuf code that is used when building the curl tool.
- Reported-by: infinnovation-dev on github
- Fixes #4474
- Closes #4475
+ Closes #5998
-Dan Fandrich (9 Oct 2019)
-- cirrus: Switch the FreeBSD 11.x build to 11.3 and add a 13.0 build.
+- KNOWN_BUGS: Unable to use PKCS12 certificate with Secure Transport
- Also, select the images using image_family to get the latest snapshots
- automatically.
- [skip ci]
+ Closes #5403
-Daniel Stenberg (8 Oct 2019)
-- curl: --no-progress-meter
+- pingpong: remove a malloc per Curl_pp_vsendf call
- New option that allows a user to ONLY switch off curl's progress meter
- and leave everything else in "talkative" mode.
+ This typically makes 7-9 fewer mallocs per FTP transfer.
- Reported-by: Piotr Komborski
- Fixes #4422
- Closes #4470
+ Closes #5997
-- TODO: Consult %APPDATA% also for .netrc
+- symbian: drop support
- Closes #4016
-
-- CURLOPT_TIMEOUT.3: remove the mention of "minutes"
+ The OS is deprecated. I see no traces of anyone having actually built
+ curl for Symbian after 2012.
- ... just say that limiting operations risk aborting otherwise fine
- working transfers. If that means seconds, minutes or hours, we leave to
- the user.
+ The public headers are unmodified.
- Reported-by: Martin Gartner
- Closes #4469
+ Closes #5989
-- [Andrei Valeriu BICA brought this change]
+- RELEASE-NOTES: synced
- docs: added multi-event.c example
+- curl_krb5.h: rename from krb5.h
- Similar to multi-uv.c but using libevent 2. This is a simpler libevent
- integration example then hiperfifo.c.
+ Follow-up from f4873ebd0be32cf
- Closes #4471
+ Turns out some older openssl installations go bananas otherwise.
+ Reported-by: Tom van der Woerdt
+ Fixes #5995
+ Closes #5996
-Jay Satiro (5 Oct 2019)
-- [Nicolas brought this change]
+- test1297: verify GOT_NOTHING with http proxy tunnel
- ldap: fix OOM error on missing query string
+- http_proxy: do not count proxy headers in the header bytecount
- - Allow missing queries, don't return NO_MEMORY error in such a case.
+ ... as that counter is subsequently used to detect if nothing was
+ returned from the peer. This made curl return CURLE_OK when it should
+ have returned CURLE_GOT_NOTHING.
- It is acceptable for there to be no specified query string, for example:
+ Fixes #5992
+ Reported-by: Tom van der Woerdt
+ Closes #5994
+
+- setopt: return CURLE_BAD_FUNCTION_ARGUMENT on bad argument
- curl ldap://ldap.forumsys.com
+ Fixed two return code mixups. CURLE_UNKNOWN_OPTION is saved for when the
+ option is, yeah, not known. Clarified this in the setopt man page too.
- A regression bug in 1b443a7 caused this issue.
+ Closes #5993
+
+- krb5: merged security.c and krb specific FTP functions in here
- This is a partial fix for #4261.
+ These two files were always tightly connected and it was hard to
+ understand what went into which. This also allows us to make the
+ ftpsend() function static (moved from ftp.c).
- Bug: https://github.com/curl/curl/issues/4261#issuecomment-525543077
- Reported-by: Jojojov@users.noreply.github.com
- Analyzed-by: Samuel Surtees
+ Removed security.c
+ Renamed curl_sec.h to krb5.h
- Closes https://github.com/curl/curl/pull/4467
+ Closes #5987
-- [Paul B. Omta brought this change]
-
- build: Remove unused HAVE_LIBSSL and HAVE_LIBCRYPTO defines
+- Curl_handler: add 'family' to each protocol
- Closes https://github.com/curl/curl/pull/4460
-
-Daniel Stenberg (5 Oct 2019)
-- RELEASE-NOTES: synced
+ Makes get_protocol_family() faster and it moves the knowledge about the
+ "families" to each protocol handler, where it belongs.
+
+ Closes #5986
-- [Stian Soiland-Reyes brought this change]
+- parsedate: tune the date to epoch conversion
+
+ By avoiding an unnecessary error check and the temp use of the tm
+ struct, the time2epoch conversion function gets a little bit faster.
+ When repeating test 517, the updated version is perhaps 1% faster (on
+ one particular build on one particular architecture).
+
+ Closes #5985
- curl: ensure HTTP 429 triggers --retry
+- cmake: remove scary warning
- This completes #3794.
+ Remove the text saying
- Also make sure the new tests from #4195 are enabled
+ "the curl cmake build system is poorly maintained. Be aware"
- Closes #4465
+ ... not because anything changed just now, but to encourage users to use
+ it and subsequently improve it.
+
+ Closes #5984
-Marcel Raad (4 Oct 2019)
-- [apique brought this change]
+- docs/MQTT: remove outdated paaragraphs
- winbuild: add ENABLE_UNICODE option
+- docs/MQTT: not experimental anymore
- Fixes https://github.com/curl/curl/issues/4308
- Closes https://github.com/curl/curl/pull/4309
+ Follow-up to e37e4468688d8f
-Daniel Stenberg (4 Oct 2019)
-- ngtcp2: adapt to API change
+- docs/RESOURCES: remove
+
+ This document is not maintained and rather than trying to refresh it,
+ let's kill it. A more up-to-date document with relevant RFCs is this
+ page on the curl website: https://curl.haxx.se/rfc/
- Closes #4457
+ Closes #5980
-- cookies: change argument type for Curl_flush_cookies
+- docs/TheArtOfHttpScripting: convert to markdown
- The second argument is really a 'bool' so use that and pass in TRUE/FALSE
- to make it clear.
+ Makes it easier to browse on github etc. Offers (better) links.
- Closes #4455
-
-- http2: move state-init from creation to pre-transfer
+ It should be noted that this document is already mostly outdated and
+ "Everything curl" at https://ec.haxx.se/ is a better resource and
+ tutorial.
- To make sure that the HTTP/2 state is initialized correctly for
- duplicated handles. It would otherwise easily generate "spurious"
- PRIORITY frames to get sent over HTTP/2 connections when duplicated easy
- handles were used.
+ Closes #5981
+
+- BUGS: convert document to markdown
- Reported-by: Daniel Silverstone
- Fixes #4303
- Closes #4442
+ Closes #5979
-- urlapi: fix use-after-free bug
+- --help: strdup the category
- Follow-up from 2c20109a9b5d04
+ ... since it is converted and the original pointer is freed on Windows
+ unicode handling.
- Added test 663 to verify.
+ Follow-up to aa8777f63febc
+ Fixes #5977
+ Closes #5978
+ Reported-by: xwxbug on github
+
+- CHECKSRC: document two missing warnings
+
+- RELEASE-NOTES: synced
+
+- ftp: avoid risk of reading uninitialized integers
- Reported by OSS-Fuzz
- Bug: https://crbug.com/oss-fuzz/17954
+ If the received PASV response doesn't match the expected pattern, we
+ could end up reading uninitialized integers for IP address and port
+ number.
- Closes #4453
+ Issue pointed out by muse.dev
+ Closes #5972
-- [Paul Dreik brought this change]
+- [Quentin Balland brought this change]
- cookie: avoid harmless use after free
+ easy_reset: clear retry counter
- This fix removes a use after free which can be triggered by
- the internal cookie fuzzer, but otherwise is probably
- impossible to trigger from an ordinary application.
+ Closes #5975
+ Fixes #5974
+
+- ftp: get rid of the PPSENDF macro
- The following program reproduces it:
+ The use of such a macro hides some of what's actually going on to the
+ reader and is generally disapproved of in the project.
- curl_global_init(CURL_GLOBAL_DEFAULT);
- CURL* handle=curl_easy_init();
- CookieInfo* info=Curl_cookie_init(handle,NULL,NULL,false);
- curl_easy_setopt(handle, CURLOPT_COOKIEJAR, "/dev/null");
- Curl_flush_cookies(handle, true);
- Curl_cookie_cleanup(info);
- curl_easy_cleanup(handle);
- curl_global_cleanup();
+ Closes #5971
+
+- man pages: switch to https://example.com URLs
- This was found through fuzzing.
+ Since HTTPS is "the new normal", this update changes a lot of man page
+ examples to use https://example.com instead of the previous "http://..."
- Closes #4454
+ Closes #5969
-- [Denis Chaplygin brought this change]
-
- docs: add note on failed handles not being counted by curl_multi_perform
+- github: remove the duplicate "Security vulnerability" entry
- Closes #4446
-
-- CURLMOPT_MAX_CONCURRENT_STREAMS.3: fix SEE ALSO typo
-
-- [Niall brought this change]
-
- ESNI: initial build/setup
+ ... since github adds an entry automatically by itself.
- Closes #4011
+ Closes #5970
-- RELEASE-NOTES: synced
+- [Emil Engler brought this change]
-- redirect: when following redirects to an absolute URL, URL encode it
+ github: use new issue template feature
- ... to make it handle for example (RFC violating) embeded spaces.
+ This helps us to avoid getting feature requests as well as security
+ bugs reported into the issue tracker.
- Reported-by: momala454 on github
- Fixes #4445
- Closes #4447
+ Closes #5936
-- urlapi: fix URL encoding when setting a full URL
+- [Emil Engler brought this change]
-- tool_operate: rename functions to make more sense
+ urlapi: use more Curl_safefree
+
+ Closes #5968
-- curl: create easy handles on-demand and not ahead of time
+Marc Hoersken (17 Sep 2020)
+- multi: align WinSock mask variables in Curl_multi_wait
- This should again enable crazy-large download ranges of the style
- [1-10000000] that otherwise easily ran out of memory starting in 7.66.0
- when this new handle allocating scheme was introduced.
+ Also skip pre-checking sockets to set timeout_ms to 0
+ after the first socket has been detected to be ready.
- Reported-by: Peter Sumatra
- Fixes #4393
- Closes #4438
-
-- [Kunal Ekawde brought this change]
-
- CURLMOPT_MAX_CONCURRENT_STREAMS: new setopt
+ Reviewed-by: rcombs on github
+ Reviewed-by: Daniel Stenberg
- Closes #4410
+ Follow up to #5886
-- chunked-encoding: stop hiding the CURLE_BAD_CONTENT_ENCODING error
+- multi: reuse WinSock events variable in Curl_multi_wait
- Unknown content-encoding would get returned as CURLE_WRITE_ERROR if the
- response is chunked-encoded.
+ Since the struct is quite large (1 long and 10 ints) we
+ declare it once at the beginning of the function instead
+ of multiple times inside loops to avoid stack movements.
+
+ Reviewed-by: Viktor Szakats
+ Reviewed-by: Daniel Stenberg
- Reported-by: Ilya Kosarev
- Fixes #4310
- Closes #4449
+ Closes #5886
-Marcel Raad (1 Oct 2019)
-- checksrc: fix uninitialized variable warning
+Daniel Stenberg (16 Sep 2020)
+- TODO: dynamically decide to use socketpair
- The loop doesn't need to be executed without a file argument.
+ Suggested-by: Anders Bakken
- Closes https://github.com/curl/curl/pull/4444
+ Closes #4829
-- urlapi: fix unused variable warning
+- TODO: add PR reference for native IDN support on macOS
- `dest` is only used with `ENABLE_IPV6`.
+ As there was work started on this that never got completed.
- Closes https://github.com/curl/curl/pull/4444
+ Closes #5371
-- lib: silence conversion warnings
+- tool_help.h: update copyright year range
- Closes https://github.com/curl/curl/pull/4444
+ Follow-up from aa8777f63febca
-- AppVeyor: add 32-bit MinGW-w64 build
+- CI/azure: disable test 571 in the msys2 builds
- With WinSSL and testing enabled so that it would have detected most of
- the warnings fixed in [0] and [1].
+ It's just too flaky there
- [0] https://github.com/curl/curl/pull/4398
- [1] https://github.com/curl/curl/pull/4415
-
- Closes https://github.com/curl/curl/pull/4433
+ Reviewed-by: Marc Hoersken
+ Closes #5954
-- AppVeyor: remove MSYS2_ARG_CONV_EXCL for winbuild
+- tool_writeout: protect fputs() from NULL
- It's only used for MSYS2 with MinGW.
+ When the code was changed to do fputs() instead of fprintf() it got
+ sensitive for NULL pointers; add checks for that.
- Closes
-
-Daniel Stenberg (30 Sep 2019)
-- [Emil Engler brought this change]
-
- git: add tests/server/disabled to .gitignore
+ Follow-up from 0c1e767e83ec66
- Closes #4441
+ Closes #5963
-- altsvc: accept quoted ma and persist values
+- test3015: verify stdout "as text"
- As mandated by the spec. Test 1654 is extended to verify.
+ Follow-up from 0c1e767e83e to please win32 tests
- Closes #4443
+ Closes #5962
-- mailmap: a Lucas fix
+- travis: use libressl v3.1.4 instead of master
+
+ ... as their git master seems too fragile to use (and 3.2.1 which is the
+ latest has a build failure).
+
+ Closes #5964
-Alessandro Ghedini (29 Sep 2019)
-- [Lucas Pardue brought this change]
+- tests/FILEFORMAT: document type=shell for <command>
- quiche: update HTTP/3 config creation to new API
+- tests/FILEFORMAT: document nonewline support for <file>
+
+ The one in <client>, that creates files.
+
+ Follow-up from b83947c8df7
-Daniel Stenberg (29 Sep 2019)
-- BINDINGS: PureBasic, Net::Curl for perl and Nim
+- [anio brought this change]
-- BINDINGS: Kapito is an Erlang library, basically a binding
+ tool_writeout: add new writeout variable, %{num_headers}
+
+ This variable gives the number of headers.
+
+ Closes #5947
-- BINDINGS: added clj-curl
+- tool_urlglob: fix compiler warning "unreachable code"
- Reported-by: Lucas Severo
+ (On Windows builds.)
+
+ Follow-up to 70a3b003d9
-- [Jay Satiro brought this change]
+- [Gergely Nagy brought this change]
- docs: disambiguate CURLUPART_HOST is for host name (ie no port)
+ vtls: deduplicate client certificates in ssl_config_data
- Closes #4424
+ Closes #5629
-- cookies: using a share with cookies shouldn't enable the cookie engine
+- ftp: a 550 response to SIZE returns CURLE_REMOTE_FILE_NOT_FOUND
- The 'share object' only sets the storage area for cookies. The "cookie
- engine" still needs to be enabled or activated using the normal cookie
- options.
+ This is primarily interesting for cases where CURLOPT_NOBODY is set as
+ previously curl would not return an error for this case.
- This caused the curl command line tool to accidentally use cookies
- without having been told to, since curl switched to using shared cookies
- in 7.66.0.
+ MDTM getting 550 now also returns this error (it returned
+ CURLE_FTP_COULDNT_RETR_FILE before) in order to unify return codes for
+ missing files across protocols and specific FTP commands.
- Test 1166 verifies
+ libcurl already returns error on a 550 as a MDTM response (when
+ CURLOPT_FILETIME is set). If CURLOPT_NOBODY is not set, an error would
+ happen subsequently anyway since the RETR command would fail.
- Updated test 506
+ Add test 1913 and 1914 to verify. Updated several tests accordingly due
+ to the updated SIZE behavior.
- Fixes #4429
- Closes #4434
-
-- setopt: handle ALTSVC set to NULL
-
-- RELEASE-NOTES: synced
+ Reported-by: Tomas Berger
+ Fixes #5953
+ Closes #5957
-- [grdowns brought this change]
-
- INSTALL: add vcpkg installation instructions
+- curl: make checkpasswd use dynbuf
- Closes #4435
+ Closes #5952
-- [Zenju brought this change]
+- curl: make glob_match_url use dynbuf
+
+ Closes #5952
- FTP: add test for FTPFILE_NOCWD: Avoid redundant CWDs
+- curl: make file2memory use dynbuf
- Add libtest 661
+ Closes #5952
+
+- curl: make file2string use dynbuf
- Closes #4417
+ Closes #5952
-- [Zenju brought this change]
+- [Antarpreet Singh brought this change]
- FTP: url-decode path before evaluation
+ imap: set cselect_bits to CURL_CSELECT_IN initially
- Closes #4428
-
-Marcel Raad (27 Sep 2019)
-- tests: fix narrowing conversion warnings
+ ... when continuing a transfer from a FETCH response.
- `timediff_t` is 64 bits wide also on 32-bit systems since
- commit b1616dad8f0.
+ When the size of the file was small enough that the entirety of the
+ transfer happens in a single go and schannel buffers holds the entire
+ data. However, it wasn't completely read in Curl_pp_readresp since a
+ line break was found before that could happen. So, by the time we are in
+ imap_state_fetch_resp - there's data in buffers that needs to be read
+ via Curl_read but nothing to read from the socket. After we setup a
+ transfer (Curl_setup_transfer), curl just waits on the socket state to
+ change - which doesn't happen since no new data ever comes.
- Closes https://github.com/curl/curl/pull/4415
+ Closes #5961
-Jay Satiro (27 Sep 2019)
-- [julian brought this change]
+- RELEASE-NOTES: synced
- vtls: Fix comment typo about macosx-version-min compiler flag
+- test434: test -K use in a single line without newline
- Closes https://github.com/curl/curl/pull/4425
+ Closes #5946
-Daniel Stenberg (26 Sep 2019)
-- [Yechiel Kalmenson brought this change]
-
- README: minor grammar fix
+- runtests: allow creating files without newlines
- Closes #4431
-
-- [Spezifant brought this change]
+ Closes #5946
- HTTP3: fix prefix parameter for ngtcp2 build
+- curl: use curlx_dynbuf for realloc when loading config files
- Closes #4430
-
-- quiche: don't close connection at end of stream!
-
-- quiche: set 'drain' when returning without having drained the queues
-
-- Revert "FTP: url-decode path before evaluation"
+ ... fixes an integer overflow at the same time.
- This reverts commit 2f036a72d543e96128bd75cb0fedd88815fd42e2.
-
-- HTTP3: merged and simplified the two 'running' sections
+ Reported-by: ihsinme on github
+ Assisted-by: Jay Satiro
+
+ Closes #5946
-- HTTP3: show an --alt-svc using example too
+- dynbuf: provide curlx_ names for reuse by the curl tool
+
+ Closes #5946
-- [Zenju brought this change]
+- dynbuf: make sure Curl_dyn_tail() zero terminates
+
+ Closes #5959
- FTP: url-decode path before evaluation
+- tests: add test1912 to the dist
- Closes #4423
+ Follow-up to 70984ce1be4cab6c
-- openssl: use strerror on SSL_ERROR_SYSCALL
+- docs/LICENSE-MIXING: remove
- Instead of showing the somewhat nonsensical errno number, use strerror()
- to provide a more relatable error message.
+ This document is not maintained and I feel that it doesn't provide much
+ value to users anymore (if it ever did).
- Closes #4411
+ Closes #5955
-- HTTP3: update quic.aiortc.org + add link to server list
-
- Reported-by: Jeremy Lainé
+- [Laramie Leavitt brought this change]
-Jay Satiro (26 Sep 2019)
-- url: don't set appconnect time for non-ssl/non-ssh connections
+ http: consolidate nghttp2_session_mem_recv() call paths
- Prior to this change non-ssl/non-ssh connections that were reused set
- TIMER_APPCONNECT [1]. Arguably that was incorrect since no SSL/SSH
- handshake took place.
+ Previously there were several locations that called
+ nghttp2_session_mem_recv and handled responses slightly differently.
+ Those have been converted to call the existing
+ h2_process_pending_input() function.
- [1]: TIMER_APPCONNECT is publicly known as CURLINFO_APPCONNECT_TIME in
- libcurl and %{time_appconnect} in the curl tool. It is documented as
- "the time until the SSL/SSH handshake is completed".
+ Moved the end-of-session check to h2_process_pending_input() since the
+ only place the end-of-session state can change is after nghttp2
+ processes additional input frames.
- Reported-by: Marcel Hernandez
+ This will likely fix the fuzzing error. While I don't have a root cause
+ the out-of-bounds read seems like a use after free, so moving the
+ nghttp2_session_check_request_allowed() call to a location with a
+ guaranteed nghttp2 session seems reasonable.
- Ref: https://github.com/curl/curl/issues/3760
+ Also updated a few nghttp2 callsites to include error messages and added
+ a few additional error checks.
- Closes https://github.com/curl/curl/pull/3773
+ Closes #5648
-Daniel Stenberg (25 Sep 2019)
-- ngtcp2: remove fprintf() calls
-
- - convert some of them to H3BUF() calls to infof()
- - remove some of them completely
- - made DEBUG_HTTP3 defined only if CURLDEBUG is set for now
+- HISTORY: mention alt-svc added in 2019
- Closes #4421
+ ... and make 1996 the first year subtitle
-- [Jay Satiro brought this change]
-
- url: fix the NULL hostname compiler warning case
+- base64: also build for pop3 and imap
+
+ Follow-up to the fix in 20417a13fb8f83
- Closes #4403
+ Reported-by: Michael Olbrich
+ Fixes #5937
+ Closes #5948
-- [Jay Satiro brought this change]
+- base64: enable in build with SMTP
+
+ The oauth2 support is used with SMTP and it uses base64 functions.
+
+ Reported-by: Michael Olbrich
+ Fixes #5937
+ Closes #5938
- travis: move the go install to linux-only
+- curl_mime_headers.3: fix the example's use of curl_slist_append
- ... to repair the build again
- Closes #4403
+ Reported-by: sofaboss on github
+ Fixes #5942
+ Closes #5943
-- altsvc: correct the #ifdef for the ngtcp2 backend
+- lib583: fix enum mixup
+
+ grrr the previous follow-up to 17fcdf6a31 was wrong
-- altsvc: save h3 as h3-23
+- libtest: fix build errors
- Follow-up to d176a2c7e5
+ Follow-up from 17fcdf6a310d4c8076
-- urlapi: question mark within fragment is still fragment
+- lib: fix -Wassign-enum warnings
- The parser would check for a query part before fragment, which caused it
- to do wrong when the fragment contains a question mark.
+ configure --enable-debug now enables -Wassign-enum with clang,
+ identifying several enum "abuses" also fixed.
- Extended test 1560 to verify.
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/879007f8118771f4896334731aaca5850a154675#commitcomment-42087553
- Reported-by: Alex Konev
- Fixes #4412
- Closes #4413
+ Closes #5929
-- [Alex Samorukov brought this change]
+- RELEASE-NOTES: synced
- HTTP3.md: move -p for mkdir, remove -j for make
-
- - mkdir on OSX/Darwin requires `-p` argument before dir
+- [Diven Qi brought this change]
+
+ url: use blank credentials when using proxy w/o username and password
- - portabbly figuring out number of cores is an exercise for somewhere
- else
+ Fixes proxy regression brought in commit ad829b21ae (7.71.0)
- Closes #4407
+ Fixed #5911
+ Closes #5914
-Patrick Monnerat (24 Sep 2019)
-- os400: getpeername() and getsockname() return ebcdic AF_UNIX sockaddr,
+- travis: add a build using libressl (from git master)
- As libcurl now uses these 2 system functions, wrappers are needed on os400
- to convert returned AF_UNIX sockaddrs to ascii.
+ The v3.2.1 tag (latest release atm) results in a broken build.
- This is a follow-up to commit 7fb54ef.
- See also #4037.
- Closes #4214
+ Closes #5932
-Jay Satiro (24 Sep 2019)
-- [Lucas Pardue brought this change]
-
- strcase: fix raw lowercasing the letter X
+- configure: let --enable-debug set -Wenum-conversion with gcc >= 10
- Casing mistake in Curl_raw_tolower 'X' wasn't lowercased as 'x' prior to
- this change.
+ Unfortunately, this option is not detecting the same issues as clang's
+ -Wassign-enum flag, but should still be useful to detect future
+ mistakes.
- Follow-up to 0023fce which added the function several days ago.
+ Closes #5930
+
+- openssl: consider ALERT_CERTIFICATE_EXPIRED a failed verification
- Ref: https://github.com/curl/curl/pull/4401#discussion_r327396546
+ If the error reason from the lib is
+ SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED, libcurl will return
+ CURLE_PEER_FAILED_VERIFICATION and not CURLE_SSL_CONNECT_ERROR.
- Closes https://github.com/curl/curl/pull/4408
-
-Daniel Stenberg (23 Sep 2019)
-- http2: Expression 'stream->stream_id != - 1' is always true
+ This unifies the libcurl return code and makes libressl run test 313
+ (CRL testing) fine.
- PVS-Studio warning
- Fixes #4402
+ Closes #5934
-- http2: A value is being subtracted from the unsigned variable
-
- PVS-Studio warning
- Fixes #4402
+- FAQ: refreshed some very old language
-- libssh: part of conditional expression is always true: !result
+- cmake: make HTTP_ONLY also disable MQTT
- PVS-Studio warning
- Fixed #4402
-
-- libssh: part of conditional expression is always true
+ ... and alphasort the order of disabling protocols to make it easier to
+ browse.
- PVS-Studio warning
- Fixes #4402
+ Closes #5931
-- libssh: The expression is excessive or contains a misprint
+- libtest: remove lib1541 leftovers
- PVS-Studio warning
- Fixes #4402
-
-- quiche: The expression must be surrounded by parentheses
+ Caused automake errors.
- PVS-Studio warning
- Fixes #4402
+ Follow-up to 8ca54a03ea08a
-- vauth: The parameter 'status' must be surrounded by parentheses
+- tests/libtests: remove test 1900 and 2033
- PVS-Studio warning
- Fixes #4402
-
-- [Paul Dreik brought this change]
+ We already remove the test files, now remove the libtest codes as well.
+
+ Follow-up to e50a877df74
- doh: allow only http and https in debug mode
+Marc Hoersken (7 Sep 2020)
+- CI/azure: add test number to title for display in analytics
- Otherwise curl may be told to use for instance pop3 to
- communicate with the doh server, which most likely
- is not what you want.
+ To ease identification of tests the test number is added to
+ the test case title in order to have it on the Azure DevOps
+ Analytics pages and reports which currently do not show it.
- Found through fuzzing.
+ Bump test case revision to make Azure DevOps update titles.
- Closes #4406
-
-- [Paul Dreik brought this change]
+ Closes #5927
- doh: return early if there is no time left
+Daniel Stenberg (6 Sep 2020)
+- altsvc: clone setting in curl_easy_duphandle
- Closes #4406
-
-- [Barry Pollard brought this change]
-
- http: lowercase headernames for HTTP/2 and HTTP/3
+ The cache content is not duplicated, like other caches, but the setting
+ and specified file name are.
+
+ Test 1908 is extended to verify this somewhat. Since the duplicated
+ handle gets the same file name, the test unfortunately overwrites the
+ same file twice (with different contents) which makes it hard to check
+ automatically.
- Closes #4401
- Fixes #4400
+ Closes #5923
-Marcel Raad (23 Sep 2019)
-- vtls: fix narrowing conversion warnings
+- test1541: remove since it is a known bug
- Curl_timeleft returns `timediff_t`, which is 64 bits wide also on
- 32-bit systems since commit b1616dad8f0.
+ A shared connection cache is not thread-safe is a known issue. Stop
+ testing this until we believe this issue is addressed. Reduces
+ occasional test failures we don't care about.
- Closes https://github.com/curl/curl/pull/4398
-
-Daniel Stenberg (23 Sep 2019)
-- [Joel Depooter brought this change]
+ The test code in lib1541.c is left in git to allow us to restore it when
+ we get to fix this.
+
+ Closes #5922
- winbuild: Add manifest to curl.exe for proper OS version detection
+- tests: remove pipelining tests
- This is a small fix to commit ebd213270a017a6830928ee2e1f4a9cabc799898
- in pull request #1221. That commit added the CURL_EMBED_MANIFEST flag to
- CURL_RC_FLAGS. However, later in the file CURL_RC_FLAGS is
- overwritten. The fix is to append values to CURL_RC_FLAGS instead of
- overwriting
+ Remove the tests 530, 584, 1900, 1901, 1902, 1903 and 2033. They were
+ previously disabled.
- Closes #4399
-
-- RELEASE-NOTES: synced
+ The Pipelining code was removed from curl in commit 2f44e94efb3df8e,
+ April 2019.
+
+ Closes #5921
-Marcel Raad (22 Sep 2019)
-- openssl: fix compiler warning with LibreSSL
+- curl: retry delays in parallel mode no longer sleeps blocking
- It was already fixed for BoringSSL in commit a0f8fccb1e0.
- LibreSSL has had the second argument to SSL_CTX_set_min_proto_version
- as uint16_t ever since the function was added in [0].
+ The previous sleep for retries would block all other concurrent
+ transfers. Starting now, the retry will instead be properly marked to
+ not get restarted until after the delay time but other transfers can
+ still continue in the mean time.
- [0] https://github.com/libressl-portable/openbsd/commit/56f107201baefb5533486d665a58d8f57fd3aeda
+ Closes #5917
+
+- curl:parallel_transfers: make sure retry readds the transfer
- Closes https://github.com/curl/curl/pull/4397
+ Reported-by: htasta on github
+ Fixes #5905
+ Closes #5917
-Daniel Stenberg (22 Sep 2019)
-- curl: exit the create_transfers loop on errors
+- build: drop support for building with Watcom
- When looping around the ranges and given URLs to create transfers, all
- errors should exit the loop and return. Previously it would keep
- looping.
+ These files are not maintained, they seem to have no users, Watcom
+ compilers look like not having users nor releases anymore.
- Reported-by: SumatraPeter on github
- Bug: #4393
- Closes #4396
+ Closes #5918
-Jay Satiro (21 Sep 2019)
-- socks: Fix destination host shown on SOCKS5 error
+- winbuild/rundebug.cmd: remove
- Prior to this change when a server returned a socks5 connect error then
- curl would parse the destination address:port from that data and show it
- to the user as the destination:
+ Seems to have been added by mistake? Not included in dists.
- curld -v --socks5 10.0.3.1:1080 http://google.com:99
- * SOCKS5 communication to google.com:99
- * SOCKS5 connect to IPv4 172.217.12.206 (locally resolved)
- * Can't complete SOCKS5 connection to 253.127.0.0:26673. (1)
- curl: (7) Can't complete SOCKS5 connection to 253.127.0.0:26673. (1)
+ Closes #5919
+
+- curl: in retry output don't call all problems "transient"
- That's incorrect because the address:port included in the connect error
- is actually a bind address:port (typically unused) and not the
- destination address:port. This fix changes curl to show the destination
- information that curl sent to the server instead:
+ ... because when --retry-all-errors is used, the error isn't necessarily
+ transient at all.
- curld -v --socks5 10.0.3.1:1080 http://google.com:99
- * SOCKS5 communication to google.com:99
- * SOCKS5 connect to IPv4 172.217.7.14:99 (locally resolved)
- * Can't complete SOCKS5 connection to 172.217.7.14:99. (1)
- curl: (7) Can't complete SOCKS5 connection to 172.217.7.14:99. (1)
+ Closes #5916
+
+- easygetopt: pass a valid enum to avoid compiler warning
- curld -v --socks5-hostname 10.0.3.1:1080 http://google.com:99
- * SOCKS5 communication to google.com:99
- * SOCKS5 connect to google.com:99 (remotely resolved)
- * Can't complete SOCKS5 connection to google.com:99. (1)
- curl: (7) Can't complete SOCKS5 connection to google.com:99. (1)
+ "integer constant not in range of enumerated type 'CURLoption'"
- Ref: https://tools.ietf.org/html/rfc1928#section-6
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/6ebe63fac23f38df911edc348e8ccc72280f9434#commitcomment-42042843
- Closes https://github.com/curl/curl/pull/4394
+ Closes #5915
-Daniel Stenberg (21 Sep 2019)
-- travis: enable ngtcp2 h3-23 builds
+- [Emil Engler brought this change]
-- altsvc: both backends run h3-23 now
+ tests: Add tests for new --help
- Closes #4395
-
-- http: fix warning on conversion from int to bit
+ This commit is a part of "--help me if you can"
- Follow-up from 03ebe66d70
+ Closes #5680
+
+- [Emil Engler brought this change]
-- urldata: use 'bool' for the bit type on MSVC compilers
+ tool: update --help with categories
- Closes #4387
- Fixes #4379
+ This commit is a part of "--help me if you can"
+
+ Closes #5680
+
+- [Emil Engler brought this change]
-- appveyor: upgrade VS2017 to VS2019
+ docs: add categories to all cmdline opts
+
+ Adapted gen.pl with 'listcats'
+
+ This commit is a part of "--help me if you can"
- Closes #4383
+ Closes #5680
-- [Zenju brought this change]
+- RELEASE-NOTES: synced
+
+- [ihsinme brought this change]
- FTP: FTPFILE_NOCWD: avoid redundant CWDs
+ connect.c: remove superfluous 'else' in Curl_getconnectinfo
- Closes #4382
+ Closes #5912
+
+- [Samuel Marks brought this change]
-- cookie: pass in the correct cookie amount to qsort()
+ CMake: remove explicit `CMAKE_ANSI_CFLAGS`
- As the loop discards cookies without domain set. This bug would lead to
- qsort() trying to sort uninitialized pointers. We have however not found
- it a security problem.
+ This variable was removed from cmake in commit
+ https://gitlab.kitware.com/cmake/cmake/commit/5a834b0bb0bc288. A later
+ CMake commit removes the variable from the tests, claiming that it was
+ removed in CMake 2.6
- Reported-by: Paul Dreik
- Closes #4386
+ Reviewed-By: Peter Wu
+ Closes #5439
-- [Paul Dreik brought this change]
+- [cbe brought this change]
- urlapi: avoid index underflow for short ipv6 hostnames
+ libssh2: pass on the error from ssh_force_knownhost_key_type
- If the input hostname is "[", hlen will underflow to max of size_t when
- it is subtracted with 2.
+ Closes #5909
+
+- scripts/delta: add diffstat summary
- hostname[hlen] will then cause a warning by ubsanitizer:
+ ... and make output more table-like
+
+- [Martin Bašti brought this change]
+
+ http_proxy: do not crash with HTTPS_PROXY and NO_PROXY set
- runtime error: addition of unsigned offset to 0x<snip> overflowed to
- 0x<snip>
+ ... in case NO_PROXY takes an effect
- I think that in practice, the generated code will work, and the output
- of hostname[hlen] will be the first character "[".
+ Without this patch, the following command crashes:
- This can be demonstrated by the following program (tested in both clang
- and gcc, with -O3)
+ $ GIT_CURL_VERBOSE=1 NO_PROXY=github.com HTTPS_PROXY=https://example.com \
+ git clone https://github.com/curl/curl.git
- int main() {
- char* hostname=strdup("[");
- size_t hlen = strlen(hostname);
+ Minimal libcurl-based reproducer:
- hlen-=2;
- hostname++;
- printf("character is %d\n",+hostname[hlen]);
- free(hostname-1);
- }
+ #include <curl/curl.h>
- I found this through fuzzing, and even if it seems harmless, the proper
- thing is to return early with an error.
+ int main() {
+ CURL *curl = curl_easy_init();
+ if(curl) {
+ CURLcode ret;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://github.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "example.com");
+ /* set the proxy type */
+ curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTPS);
+ curl_easy_setopt(curl, CURLOPT_NOPROXY, "github.com");
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+ return ret;
+ }
+ return -1;
+ }
- Closes #4389
+ Assisted-by: Kamil Dudka
+ Bug: https://bugzilla.redhat.com/1873327
+ Closes #5902
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: compile with latest ngtcp2 + nghttp3 draft-23
+- travis: add a CI job with openssl3 (from git master)
- Closes #4392
-
-- THANKS-filter: deal with my typos 'Jat' => 'Jay'
+ Closes #5908
-- travis: use go master
+- openssl: avoid error conditions when importing native CA
- ... as the boringssl builds needs a very recent version
+ The code section that is OpenSSL 3+ specific now uses the same logic as
+ is used in the version < 3 section. It caused a compiler error without
+ it.
- Co-authored-by: Jat Satiro
- Closes #4361
+ Closes #5907
-- tool_operate: removed unused variable 'done'
+- setopt: avoid curl_ on local variable
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- tool_operate: Expression 'config->resume_from' is always true
+- mqtt.c: avoid curl_ prefix on local variable
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- tool_getparam: remove duplicate switch case
+- wildcard: strip "curl_" prefix from private symbols
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- libssh2: part of conditional expression is always true: !result
+- vtls: make it 'struct Curl_ssl_session'
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- urlapi: Expression 'storep' is always true
+ Use uppercase C for internal symbols.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- urlapi: 'scheme' is always true
+- curl_threads: make it 'struct Curl_actual_call'
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- urlapi: part of conditional expression is always true: (relurl[0] == '/')
+ Internal names should not be prefixed "curl_"
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- setopt: store CURLOPT_RTSP_SERVER_CSEQ correctly
+- schannel: make it 'struct Curl_schannel*'
- Fixes bug detected by PVS-Studio
- Fixes #4374
-
-- mime: make Curl_mime_duppart() assert if called without valid dst
+ As internal global names should use captical C.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- http_proxy: part of conditional expression is always true: !error
+- hash: make it 'struct Curl_hash'
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- imap: merged two case-branches performing the same action
+ As internal global names should use captical C.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- multi: value '2L' is assigned to a boolean
+- llist: make it "struct Curl_llist"
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- easy: part of conditional expression is always true: !result
+ As internal global names should use captical C.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5906
-- netrc: part of conditional expression is always true: !done
+Marc Hoersken (2 Sep 2020)
+- telnet.c: depend on static requirement of WinSock version 2
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- version: Expression 'left > 1' is always true
+ Drop dynamic loading of ws2_32.dll and instead rely on the
+ imported version which is now required to be at least 2.2.
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- url: remove dead code
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Viktor Szakats
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Closes #5854
-- url: part of expression is always true: (bundle->multiuse == 0)
+- win32: drop support for WinSock version 1, require version 2
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- ftp: the conditional expression is always true
+ IPv6, telnet and now also the multi API require WinSock
+ version 2 which is available starting with Windows 95.
- ... both !result and (ftp->transfer != FTPTRANSFER_BODY)!
+ Therefore we think it is time to drop support for version 1.
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- ftp: Expression 'ftpc->wait_data_conn' is always false
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Viktor Szakats
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Follow up to #5634
+ Closes #5854
-- ftp: Expression 'ftpc->wait_data_conn' is always true
+- select: align poll emulation to return all relevant events
- Fixes warning detected by PVS-Studio
- Fixes #4374
-
-- ftp: part of conditional expression is always true: !result
+ The poll emulation via select already consumes POLLRDNORM,
+ POLLWRNORM and POLLRDBAND as input events. Therefore it
+ should also return them as output events if signaled.
- Fixes warning detected by PVS-Studio
- Fixes #4374
+ Also fix indentation in input event handling block.
+
+ Assisted-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+
+ Replaces #5852
+ Closes #5883
-- http: fix Expression 'http->postdata' is always false
+- CI/azure: MQTT is now enabled by default
- Fixes warning detected by PVS-Studio
- Fixes #4374
- Reported-by: Valerii Zapodovnikov
+ Reviewed-by: Daniel Stenberg
+
+ Follow up to #5858
+ Closes #5903
+
+Daniel Stenberg (2 Sep 2020)
+- copyright.pl: ignore buildconf
-- [Niall O'Reilly brought this change]
+- test971: show test mismatches "inline"
- doh: avoid truncating DNS QTYPE to lower octet
+- lib/Makefile.am: bump VERSIONINFO due to new functions
+
+ ... we're generally bad at this, but we are adding new functions for
+ this release.
- Closes #4381
+ Closes #5899
-- [Jens Finkhaeuser brought this change]
+- optiontable: use DEBUGBUILD
+
+ Follow-up to commit 6e18568ba38 (#5877)
- urlapi: CURLU_NO_AUTHORITY allows empty authority/host part
+- cmdline-opts/gen.pl: generate nicer "See Also" in curl.1
- CURLU_NO_AUTHORITY is intended for use with unknown schemes (i.e. not
- "file:///") to override cURL's default demand that an authority exists.
+ If there are more than two items in the list, use commas for all but the
+ last separator which is set to 'and'. Reads better.
- Closes #4349
+ Closes #5898
-- version: next release will be 7.67.0
+- curl.1: add see also no-progress-meter on two spots
+
+ Ref: #5894
+
+ Closes #5897
- RELEASE-NOTES: synced
-- url: only reuse TLS connections with matching pinning
-
- If the requests have different CURLOPT_PINNEDPUBLICKEY strings set, the
- connection should not be reused.
+- mqtt: enable by default
- Bug: https://curl.haxx.se/mail/lib-2019-09/0061.html
- Reported-by: Sebastian Haglund
+ No longer considered experimental.
- Closes #4347
+ Closes #5858
+
+- [Michael Baentsch brought this change]
-- README: add OSS-Fuzz badge [skip ci]
+ tls: add CURLOPT_SSL_EC_CURVES and --curves
- Closes #4380
+ Closes #5892
-Michael Kaufmann (18 Sep 2019)
-- http: merge two "case" statements
+- url: remove funny embedded comments in Curl_disonnect calls
-Daniel Stenberg (18 Sep 2019)
-- [Zenju brought this change]
+- [Chris Paulson-Ellis brought this change]
- FTP: remove trailing slash from path for LIST/MLSD
+ conn: check for connection being dead before reuse
- Closes #4348
-
-- mime: when disabled, avoid C99 macro
+ Prevents incorrect reuse of an HTTP connection that has been prematurely
+ shutdown() by the server.
+
+ Partial revert of 755083d00deb16
- Closes #4368
+ Fixes #5884
+ Closes #5893
-- url: cleanup dangling DOH request headers too
+Marc Hoersken (29 Aug 2020)
+- buildconf: exec autoreconf to avoid additional process
- Follow-up to 9bc44ff64d9081
+ Also make buildconf exit with the return code of autoreconf.
- Credit to OSS-Fuzz
- Bug: https://crbug.com/oss-fuzz/17269
+ Reviewed-by: Daniel Stenberg
- Closes #4372
-
-- [Christoph M. Becker brought this change]
+ Follow up to #5853
+ Closes #5890
- http2: relax verification of :authority in push promise requests
+- CI/azure: no longer ignore results of test 1013
- If the :authority pseudo header field doesn't contain an explicit port,
- we assume it is valid for the default port, instead of rejecting the
- request for all ports.
+ Follow up to #5771
+ Closes #5889
+
+- docs: add description about CI platforms to CONTRIBUTE.md
- Ref: https://curl.haxx.se/mail/lib-2019-09/0041.html
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Jay Satiro
- Closes #4365
+ Closes #5882
-- doh: clean up dangling DOH handles and memory on easy close
+Daniel Stenberg (29 Aug 2020)
+- tests/getpart: use MIME::Base64 instead of home-cooked
+
+ Since we already use the base64 package since a while back, we can just
+ as well switch to that here too.
- If you set the same URL for target as for DoH (and it isn't a DoH
- server), like "https://example.com" in both, the easy handles used for
- the DoH requests could be left "dangling" and end up not getting freed.
+ It also happens to use the exact same function name, which otherwise
+ causes a run-time warning.
- Reported-by: Paul Dreik
- Closes #4366
+ Reported-by: Marc Hörsken
+ Fixes #5885
+ Closes #5887
-- unit1655: make it C90 compliant
+Marcel Raad (29 Aug 2020)
+- ntlm: fix condition for curl_ntlm_core usage
+
+ `USE_WINDOWS_SSPI` without `USE_WIN32_CRYPTO` but with any other DES
+ backend is fine, but was excluded before.
- Unclear why this was not detected in the CI.
+ This also fixes test 1013 as the condition for SMB support in
+ configure.ac didn't match the condition in the source code. Now it
+ does.
- Follow-up to b7666027296a
+ Fixes https://github.com/curl/curl/issues/1262
+ Closes https://github.com/curl/curl/pull/5771
-- smb: check for full size message before reading message details
+- AppVeyor: switch 64-bit Schannel Debug CMake builds to Unicode
- To avoid reading of uninitialized data.
+ The Schannel builds are the most useful to verify as they make the most
+ use of the Windows API. Classic MinGW doesn't support Unicode at all,
+ only MinGW-w64 and MSVC do.
- Assisted-by: Max Dymond
- Bug: https://crbug.com/oss-fuzz/16907
- Closes #4363
+ Closes https://github.com/curl/curl/pull/5843
-- quiche: persist connection details
+- CMake: add option to enable Unicode on Windows
- ... like we do for other protocols at connect time. This makes "curl -I"
- and other things work.
+ As already existing for winbuild.
- Reported-by: George Liu
- Fixes #4358
- Closes #4360
+ Closes https://github.com/curl/curl/pull/5843
-- openssl: fix warning with boringssl and SSL_CTX_set_min_proto_version
+Marc Hoersken (29 Aug 2020)
+- select: simplify return code handling for poll and select
- Follow-up to ffe34b7b59
- Closes #4359
-
-- [Paul Dreik brought this change]
-
- doh: fix undefined behaviour and open up for gcc and clang optimization
+ poll and select already return -1 on error according to POSIX,
+ so there is no need to perform a <0 to -1 conversion in code.
- The undefined behaviour is annoying when running fuzzing with
- sanitizers. The codegen is the same, but the meaning is now not up for
- dispute. See https://cppinsights.io/s/516a2ff4
+ Also we can just use one check with <= 0 on the return code.
- By incrementing the pointer first, both gcc and clang recognize this as
- a bswap and optimizes it to a single instruction. See
- https://godbolt.org/z/994Zpx
+ Assisted-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
- Closes #4350
+ Replaces #5852
+ Closes #5880
+
+Daniel Stenberg (28 Aug 2020)
+- RELEASE-NOTES: synced
-- [Paul Dreik brought this change]
+- [Jeroen Ooms brought this change]
- doh: fix (harmless) buffer overrun
+ tests: add test1912 with typechecks
- Added unit test case 1655 to verify.
- Close #4352
+ Validates that gcc-typecheck macros match the new option type API.
- the code correctly finds the flaws in the old code,
- if one temporarily restores doh.c to the old version.
-
-Alessandro Ghedini (15 Sep 2019)
-- docs: remove trailing ':' from section names in CURLOPT_TRAILER* man
-
-- docs: fix typo in CURLOPT_HTTP_VERSION man
+ Closes #5873
-GitHub (14 Sep 2019)
-- [Daniel Stenberg brought this change]
-
- CI: inintial github action job
+- easyoptions: provide debug function when DEBUGBUILD
+
+ ... not CURLDEBUG as they're not always set in conjunction.
- First shot at a CI build on github actions
+ Follow-up to 6ebe63fac23f38df
+
+ Fixes #5877
+ Closes #5878
-Daniel Stenberg (13 Sep 2019)
-- appveyor: add a winbuild
+Marc Hoersken (28 Aug 2020)
+- sockfilt: handle FD_CLOSE winsock event on write socket
- Assisted-by: Marcel Raad
- Assisted-by: Jay Satiro
+ Learn from the way Cygwin handles and maps the WinSock events
+ to simulate correct and complete poll and select behaviour
+ according to Richard W. Stevens Network Programming book.
- Closes #4324
+ Follow up to #5867
+ Closes #5879
-- FTP: allow "rubbish" prepended to the SIZE response
+- multi: handle connection state winsock events
- This is a protocol violation but apparently there are legacy proprietary
- servers doing this.
+ Learn from the way Cygwin handles and maps the WinSock events
+ to simulate correct and complete poll and select behaviour
+ according to Richard W. Stevens Network Programming book.
- Added test 336 and 337 to verify.
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Marcel Raad
- Reported-by: Philippe Marguinaud
- Closes #4339
+ Follow up to #5634
+ Closes #5867
-- [Zenju brought this change]
-
- FTP: skip CWD to entry dir when target is absolute
+Daniel Stenberg (28 Aug 2020)
+- Curl_pgrsTime - return new time to avoid timeout integer overflow
- Closes #4332
-
-Kamil Dudka (13 Sep 2019)
-- curl: fix memory leaked by parse_metalink()
+ Setting a timeout to INT_MAX could cause an immediate error to get
+ returned as timeout because of an overflow when different values of
+ 'now' were used.
- This commit fixes a regression introduced by curl-7_65_3-5-gb88940850.
- Detected by tests 2005, 2008, 2009, 2010, 2011, and 2012 with valgrind
- and libmetalink enabled.
+ This is primarily fixed by having Curl_pgrsTime() return the "now" when
+ TIMER_STARTSINGLE is set so that the parent function will continue using
+ that time.
- Closes #4326
+ Reported-by: IonuÈ›-Francisc Oancea
+ Fixes #5583
+ Closes #5847
-Daniel Stenberg (13 Sep 2019)
-- parsedate: still provide the name arrays when disabled
+- TLS: fix SRP detection by using the proper #ifdefs
+
+ USE_TLS_SRP will be true if *any* selected TLS backend can use SRP
- If FILE or FTP are enabled, since they also use them!
+ HAVE_OPENSSL_SRP is defined when OpenSSL can use it
- Reported-by: Roland Hieber
- Fixes #4325
- Closes #4343
+ HAVE_GNUTLS_SRP is defined when GnuTLS can use it
+
+ Clarify in the curl_verison_info docs that CURL_VERSION_TLSAUTH_SRP is
+ set if at least one of the supported backends offers SRP.
+
+ Reported-by: Stefan Strogin
+ Fixes #5865
+ Closes #5870
-- [Gilles Vollant brought this change]
+- [Dan Kenigsberg brought this change]
- curl:file2string: load large files much faster
+ docs: SSLCERTS: fix English syntax
- ... by using a more efficient realloc scheme.
+ Signed-off-by: Dan Kenigsberg <danken@redhat.com>
- Bug: https://curl.haxx.se/mail/lib-2019-09/0045.html
- Closes #4336
+ Closes #5876
+
+- [Alessandro Ghedini brought this change]
-- openssl: close_notify on the FTP data connection doesn't mean closure
+ docs: non-existing macros in man pages
- For FTPS transfers, curl gets close_notify on the data connection
- without that being a signal to close the control connection!
+ As reported by man(1) when invoked as:
- Regression since 3f5da4e59a556fc (7.65.0)
+ man --warnings -E UTF-8 -l -Tutf8 -Z <file> >/dev/null
- Reported-by: Zenju on github
- Reviewed-by: Jay Satiro
- Fixes #4329
- Closes #4340
+ Closes #5846
-- [Jimmy Gaussen brought this change]
+- [Alessandro Ghedini brought this change]
- docs/HTTP3: fix `--with-ssl` ngtcp2 configure flag
+ curl.1: fix typo invokved -> invoked
- Closes #4338
+ Closes #5846
-- RELEASE-NOTES: synced
-
-- curlver: bump to 7.66.1
+- buildconf: invoke 'autoreconf -fi' instead
+
+ The custom script isn't necessary anymore - but remains for simplicity
+ and just invokes autoreconf.
+
+ Closes #5853
-- [Zenju brought this change]
+- [Emil Engler brought this change]
- setopt: make it easier to add new enum values
+ lib: make Curl_gethostname accept a const pointer
- ... by using the *_LAST define names better.
+ The address of that variable never gets changed, only the data in it so
+ why not make it a "char * const"?
- Closes #4321
+ Closes #5866
-- asyn-thread: s/AF_LOCAL/AF_UNIX for Solaris
+- docs/libcurl: update "Added in" version for curl_easy_option*
- Reported-by: Dagobert Michelsen
- Fixes #4328
- Closes #4333
-
-- [Bernhard Walle brought this change]
+ Follow-up to 6ebe63fac23f38
- winbuild/MakefileBuild.vc: Add vssh
-
- Without that modification, the Windows build using the makefiles doesn't
- work.
-
- Signed-off-by: Bernhard Walle <bernhard.walle@posteo.eu>
+- scripts: improve the "get latest curl release tag" logic
- Fixes #4322
- Closes #4323
+ ... by insiting on it matching "^curl-".
-Bernhard Walle (11 Sep 2019)
-- winbuild/MakefileBuild.vc: Fix line endings
+- configure: added --disable-get-easy-options
- The file had mixed line endings.
+ To allow disabling of the curl_easy_option APIs in a build.
- Signed-off-by: Bernhard Walle <bernhard.walle@posteo.eu>
+ Closes #5365
-Jay Satiro (11 Sep 2019)
-- ldap: Stop using wide char version of ldapp_err2string
+- options: API for meta-data about easy options
- Despite ldapp_err2string being documented by MS as returning a
- PCHAR (char *), when UNICODE it is mapped to ldap_err2stringW and
- returns PWCHAR (wchar_t *).
+ const struct curl_easyoption *curl_easy_option_by_name(const char *name);
- We have lots of code that expects ldap_err2string to return char *,
- most of it failf used like this:
+ const struct curl_easyoption *curl_easy_option_by_id (CURLoption id);
- failf(data, "LDAP local: Some error: %s", ldap_err2string(rc));
+ const struct curl_easyoption *
+ curl_easy_option_next(const struct curl_easyoption *prev);
- Closes https://github.com/curl/curl/pull/4272
+ The purpose is to provide detailed enough information to allow for
+ example libcurl bindings to get option information at run-time about
+ what easy options that exist and what arguments they expect.
+
+ Assisted-by: Jeroen Ooms
+ Closes #5365
-Version 7.66.0 (10 Sep 2019)
+- [Eric Curtin brought this change]
-Daniel Stenberg (10 Sep 2019)
-- RELEASE-NOTES: curl 7.66.0
+ HTTP/3: update to OpenSSL_1_1_1g-quic-draft-29
+
+ Closes #5871
-- THANKS: from the 7.66.0 release
+- RELEASE-NOTES: synced
-- curl: make sure the parallel transfers do them all
+Jay Satiro (26 Aug 2020)
+- openssl: Fix wincrypt symbols conflict with BoringSSL
- The logic could erroneously break the loop too early before all
- transfers had been transferred.
+ OpenSSL undefines the conflicting symbols but BoringSSL does not so we
+ must do it ourselves.
- Reported-by: Tom van der Woerdt
- Fixes #4316
- Closes #4317
-
-- urlapi: one colon is enough for the strspn() input (typo)
-
-- urlapi: verify the IPv6 numerical address
+ Reported-by: Samuel Tranchet
+ Assisted-by: Javier Blazquez
- It needs to parse correctly. Otherwise it could be tricked into letting
- through a-f using host names that libcurl would then resolve. Like
- '[ab.be]'.
+ Ref: https://bugs.chromium.org/p/boringssl/issues/detail?id=371
+ Ref: https://github.com/openssl/openssl/blob/OpenSSL_1_1_1g/include/openssl/ossl_typ.h#L66-L73
- Reported-by: Thomas Vegas
- Closes #4315
+ Fixes https://github.com/curl/curl/issues/5669
+ Closes https://github.com/curl/curl/pull/5857
-- [Clément Notin brought this change]
-
- openssl: use SSL_CTX_set_<min|max>_proto_version() when available
+Daniel Stenberg (26 Aug 2020)
+- socketpair: allow CURL_DISABLE_SOCKETPAIR
- OpenSSL 1.1.0 adds SSL_CTX_set_<min|max>_proto_version() that we now use
- when available. Existing code is preserved for older versions of
- OpenSSL.
+ ... to completely disable the use of socketpair
- Closes #4304
-
-- [Clément Notin brought this change]
-
- openssl: indent, re-organize and add comments
+ Closes #5850
-- [migueljcrum brought this change]
-
- sspi: fix memory leaks
+- curl_get_line: build only if cookies or alt-svc are enabled
- Closes #4299
+ Closes #5851
-- travis: disable ngtcp2 builds (again)
+- [fullincome brought this change]
-- Curl_fillreadbuffer: avoid double-free trailer buf on error
+ schannel: fix memory leak when using get_cert_location
- Reviewed-by: Jay Satiro
- Reported-by: Thomas Vegas
+ The get_cert_location function allocates memory only on success.
+ Previously get_cert_location was able to allocate memory and return
+ error. It wasn't obvious and in this case the memory wasn't
+ released.
- Closes #4307
+ Fixes #5855
+ Closes #5860
-- tool_setopt: handle a libcurl build without netrc support
-
- Reported-by: codesniffer13 on github
- Fixes #4302
- Closes #4305
+- [Emil Engler brought this change]
-- security:read_data fix bad realloc()
+ git: ignore libtests in 3XXX area
- ... that could end up a double-free
+ Currently the file tests/libtest/lib3010 is not getting
+ ignored by git. This fixes it by adding the 3XXX area to
+ the according .gitignore file.
- CVE-2019-5481
- Bug: https://curl.haxx.se/docs/CVE-2019-5481.html
+ Closes #5859
-- [Thomas Vegas brought this change]
+- [Emil Engler brought this change]
- tftp: Alloc maximum blksize, and use default unless OACK is received
+ doh: add error message for DOH_DNS_NAME_TOO_LONG
- Fixes potential buffer overflow from 'recvfrom()', should the server
- return an OACK without blksize.
+ When this error code was introduced in b6a53fff6c1d07e8a9, it was
+ forgotten to be added in the errors array and doh_strerror function.
- Bug: https://curl.haxx.se/docs/CVE-2019-5482.html
- CVE-2019-5482
+ Closes #5863
-- [Thomas Vegas brought this change]
+- ngtcp2: adapt to the new pkt_info arguments
+
+ Guidance-by: Tatsuhiro Tsujikawa
+
+ Closes #5864
- tftp: return error when packet is too small for options
+- winbuild/README.md: make <options> visible
+
+ Follow-up to be753add31c2d8c
-- KNOWN_BUGS/TODO: cleanup and remove outdated issues
+- winbuild: convert the instruction text to README.md
+
+ Closes #5861
-- RELEASE-NOTES: synced
+- lib1560: verify "redirect" to double-slash leading URL
+
+ Closes #5849
-- netrc: free 'home' on error
+Marc Hoersken (25 Aug 2020)
+- multi: expand pre-check for socket readiness
- Follow-up to f9c7ba9096ec2
+ Check readiness of all sockets before waiting on them
+ to avoid locking in case the one-time event FD_WRITE
+ was already consumed by a previous wait operation.
- Coverity CID 1453474
+ More information about WinSock network events:
+ https://docs.microsoft.com/en-us/windows/win32/api/
+ winsock2/nf-winsock2-wsaeventselect#return-value
- Closes #4291
+ Closes #5634
+
+- [rcombs brought this change]
-- urldata: avoid 'generic', use dedicated pointers
+ multi: implement wait using winsock events
+
+ This avoids using a pair of TCP ports to provide wakeup functionality
+ for every multi instance on Windows, where socketpair() is emulated
+ using a TCP socket on loopback which could in turn lead to socket
+ resource exhaustion.
- For the 'proto' union within the connectdata struct.
+ A previous version of this patch failed to account for how in WinSock,
+ FD_WRITE is set only once when writing becomes possible and not again
+ until after a send has failed due to the buffer filling. This contrasts
+ to how FD_READ and FD_OOB continue to be set until the conditions they
+ refer to no longer apply. This meant that if a user wrote some data to
+ a socket, but not enough data to completely fill its send buffer, then
+ waited on that socket to become writable, we'd erroneously stall until
+ their configured timeout rather than returning immediately.
- Closes #4290
+ This version of the patch addresses that issue by checking each socket
+ we're waiting on to become writable with select() before the wait, and
+ zeroing the timeout if it's already writable.
+
+ Assisted-by: Marc Hörsken
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Daniel Stenberg
+ Tested-by: Gergely Nagy
+ Tested-by: Rasmus Melchior Jacobsen
+ Tested-by: Tomas Berger
+
+ Replaces #5397
+ Reverts #5632
+ Closes #5634
-- cleanup: move functions out of url.c and make them static
+- select: reduce duplication of Curl_poll in Curl_socket_check
+
+ Change Curl_socket_check to use select-fallback in Curl_poll
+ instead of implementing it in Curl_socket_check and Curl_poll.
+
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
- Closes #4289
+ Replaces #5262 and #5492
+ Closes #5707
-- smtp: check for and bail out on too short EHLO response
+- select: fix poll-based check not detecting connect failure
- Otherwise, a three byte response would make the smtp_state_ehlo_resp()
- function misbehave.
+ This commit changes Curl_socket_check to use POLLPRI to
+ check for connect failure on the write socket, because
+ POLLPRI maps to fds_err. This is in line with select(2).
- Credit to OSS-Fuzz
- Bug: https://crbug.com/oss-fuzz/16918
+ The select-based socket check correctly checks for connect
+ failures by adding the write socket also to fds_err.
- Assisted-by: Max Dymond
+ The poll-based implementation (which internally can itself
+ fallback to select again) did not previously check for
+ connect failure by using POLLPRI with the write socket.
- Closes #4287
-
-- smb: init *msg to NULL in smb_send_and_recv()
+ See the follow up commit to this for more information.
- ... it might otherwise return OK from this function leaving that pointer
- uninitialized.
+ This commit makes sure connect failures can be detected
+ and handled if HAVE_POLL_FINE is defined, eg. on msys2-devel.
- Bug: https://crbug.com/oss-fuzz/16907
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
- Closes #4286
+ Replaces #5509
+ Prepares #5707
-- ROADMAP: updated after recent user poll
+- select.h: make socket validation macros test for INVALID_SOCKET
+
+ With Winsock the valid range is [0..INVALID_SOCKET-1] according to
+ https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2
+
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Daniel Stenberg
- In rough prio order
+ Closes #5760
-- THANKS: remove duplicate
+Daniel Stenberg (24 Aug 2020)
+- docs: --output-dir is added in 7.73.0, nothing else
+
+ Follow-up to 5620d2cc78c0
-- Curl_addr2string: take an addrlen argument too
+- curl: add --output-dir
- This allows the function to figure out if a unix domain socket has a
- file name or not associated with it! When a socket is created with
- socketpair(), as done in the fuzzer testing, the path struct member is
- uninitialized and must not be accessed.
+ Works with --create-dirs and with -J
- Bug: https://crbug.com/oss-fuzz/16699
+ Add test 3008, 3009, 3011, 3012 and 3013 to verify.
- Closes #4283
-
-- [Rolf Eike Beer brought this change]
+ Closes #5637
- CMake: remove needless newlines at end of gss variables
-
-- [Rolf Eike Beer brought this change]
+- configure: fix pkg-config detecting wolfssl
+
+ When amending the include path with "/wolfssl", this now properly strips
+ off all whitespace from the path variable! Previously this would lead to
+ pkg-config builds creating bad command lines.
+
+ Closes #5848
- CI: remove duplicate configure flag for LGTM.com
+- [Michael Musset brought this change]
-- [Rolf Eike Beer brought this change]
+ sftp: add the option CURLKHSTAT_FINE_REPLACE
+
+ Replace the old fingerprint of the host with a new.
+
+ Closes #5685
- CMake: use platform dependent name for dlopen() library
+- RELEASE-NOTES: synced
- Closes #4279
+ The next release is now to become 7.73.0
-- quiche: expire when poll returned data
+- checksrc: verify do-while and spaces between the braces
- ... to make sure we continue draining the queue until empty
+ Updated mprintf.c to comply
- Closes #4281
+ Closes #5845
-- quiche: decrease available buffer size, don't assign it!
+- curl: support XDG_CONFIG_HOME to find .curlrc
- Found-by: Jeremy Lainé
-
-- RELEASE-NOTES: synced
-
-- [Kyohei Kadota brought this change]
-
- curl: fix include conditions
-
-- [Kyohei Kadota brought this change]
+ Added test433 to verify. Updated documentation.
+
+ Reviewed-by: Jay Satiro
+ Suggested-by: Eli Schwartz
+ Fixes #5829
+ Closes #5837
- plan9: fix installation instructions
+- etag: save and use the full received contents
+
+ ... which makes it support weak tags and non-standard etags too!
+
+ Added test case 347 to verify blank incoming ETag:
- Closes #4276
+ Fixes #5610
+ Closes #5833
-- ngtcp2: on h3 stream close, call expire
+- setopt: if the buffer exists, refuse the new BUFFERSIZE
- ... to trigger a new read to detect the stream close!
+ The buffer only exists during transfer and then we shouldn't change the
+ size (the setopt is not documented to work then).
- Closes #4275
+ Reported-by: Harry Sintonen
+ Closes #5842
-- [Tatsuhiro Tsujikawa brought this change]
+- [COFFEETALES brought this change]
- ngtcp2: build latest ngtcp2 and ngtcp2_crypto_openssl
+ sftp: add new quote commands 'atime' and 'mtime'
- Closes #4278
+ Closes #5810
-- ngtcp2: set flow control window to stream buffer size
+- CURLE_PROXY: new error code
- Closes #4274
-
-- [Christopher Head brought this change]
-
- CURLOPT_HEADERFUNCTION.3: clarify
+ Failures clearly returned from a (SOCKS) proxy now causes this return
+ code. Previously the situation was not very clear as what would be
+ returned and when.
+
+ In addition: when this error code is returned, an application can use
+ CURLINFO_PROXY_ERROR to query libcurl for the detailed error, which then
+ returns a value from the new 'CURLproxycode' enum.
- Closes #4273
+ Closes #5770
-- CURLINFO docs: mention that in redirects times are added
+- runtests: make cleardir() erase dot files too
- Suggested-by: Brandon Dong
- Fixes #4250
- Closes #4269
+ Because test cases might use dot files.
+
+ Closes #5838
-- travis: enable ngtcp2 builds again
+- KNOWN_BUGS: 'no_proxy' string-matches IPv6 numerical addreses
- Switched to the openssl-quic-draft-22 openssl branch.
+ Also: the current behavior is now documented in the curl.1 and
+ CURLOPT_NOPROXY.3 man pages.
- Closes #4271
+ Reported-by: Andrew Barnes
+ Closes #5745
+ Closes #5841
-- HTTP3: switched openssl branch to use
+Viktor Szakats (22 Aug 2020)
+- Makefile.m32: add ability to override zstd libs [ci skip]
+
+ Similarly to brotli, where this was already possible.
+ E.g. it allows to link zstd statically to libcurl.dll.
+
+ Ref: https://github.com/curl/curl-for-win/issues/12
+ Ref: https://github.com/curl/curl-for-win/commit/d9b266afd2e5d3f5604483010ef62340b5918c89
+
+ Closes https://github.com/curl/curl/pull/5840
-- [Tatsuhiro Tsujikawa brought this change]
+Daniel Stenberg (21 Aug 2020)
+- runtests: avoid 'fail to start' repeated messages in attempt loops
+
+ Closes #5834
- ngtcp2: Build with latest ngtcp2 and ngtcp2_crypto_openssl
+- runtests: clear pid variables when failing to start a server
- Closes #4270
+ ... as otherwise the parent doesn't detect the failure and believe it
+ actually worked to start.
+
+ Reported-by: Christian Weisgerber
+ Bug: https://curl.haxx.se/mail/lib-2020-08/0018.html
+ Closes #5834
-- http2: when marked for closure and wanted to close == OK
+- TODO: Virtual external sockets
- It could otherwise return an error even when closed correctly if GOAWAY
- had been received previously.
+ Closes #5835
+
+- [Don J Olmstead brought this change]
+
+ dist: add missing CMake Find modules to the distribution
- Reported-by: Tom van der Woerdt
- Fixes #4267
- Closes #4268
+ Closes #5836
- RELEASE-NOTES: synced
-
-- build-openssl: fix build with Visual Studio 2019
- Reviewed-by: Marcel Raad
- Contributed-by: osabc on github
- Fixes #4188
- Closes #4266
+ ... and version bumped to 7.72.1
-Kamil Dudka (26 Aug 2019)
-- vauth: return CURLE_AUTH_ERROR on gss_init_sec_context() failure
+- tls: provide the CApath verbose log on its own line
- This is a follow-up to https://github.com/curl/curl/pull/3864 .
+ ... not newline separated from the previous line. This makes it output
+ asterisk prefixed properly like other verbose putput!
- Closes #4224
+ Reported-by: jmdavitt on github
+ Fixes #5826
+ Closes #5827
-Daniel Stenberg (26 Aug 2019)
-- KNOWN_BUGS: USE_UNIX_SOCKETS on Windows
-
- Closes #4040
+Version 7.72.0 (19 Aug 2020)
-- quiche: send the HTTP body correctly on callback uploads
+Daniel Stenberg (19 Aug 2020)
+- RELEASE-NOTES: synced
- Closes #4265
+ The curl 7.72.0 release
+
+- THANKS: add names from curl 7.72.0 release
-- travis: disable ngtcp2 builds (temporarily)
+Jay Satiro (18 Aug 2020)
+- KNOWN_BUGS: Schannel TLS 1.2 handshake bug in old Windows versions
- Just too many API changes right now
+ Reported-by: plujon@users.noreply.github.com
- Closes #4264
+ Closes https://github.com/curl/curl/issues/5488
-- ngtcp2: add support for SSLKEYLOGFILE
+Daniel Stenberg (17 Aug 2020)
+- Curl_easy: remember last connection by id, not by pointer
- Closes #4260
-
-- ngtcp2: improve h3 response receiving
+ CVE-2020-8231
- Closes #4259
+ Bug: https://curl.haxx.se/docs/CVE-2020-8231.html
+
+ Reported-by: Marc Aldorasi
+ Closes #5824
-- ngtcp2: use nghttp3_version()
+- examples/rtsp.c: correct the copyright year
-- ngtcp2: sync with upstream API changes
-
- Assisted-by: Tatsuhiro Tsujikawa
+- RELEASE-PROCEDURE.md: add more future release dates
-- [Kyle Abramowitz brought this change]
+- [H3RSKO brought this change]
- scp: fix directory name length used in memcpy
+ docs: change "web site" to "website"
+
+ According to wikipedia:
- Fix read off end of array due to bad pointer math in getworkingpath for
- SCP home directory case.
+ While "web site" was the original spelling, this variant has become
+ rarely used, and "website" has become the standard spelling
- Closes #4258
+ Closes #5822
+
+- [Bevan Weiss brought this change]
-- http: the 'closed' struct field is used by both ngh2 and ngh3
+ CMake: don't complain about missing nroff
- and remove 'header_recvbuf', not used for anything
+ The curl_nroff_check() was always being called, and complaining if
+ *NROFF wasn't found, even when not making the manual.
- Reported-by: Jeremy Lainé
+ Only check for nroff (and complain) if actually making the manual
- Closes #4257
+ Closes #5817
-- ngtcp2: accept upload via callback
-
- Closes #4256
+- [Brian Inglis brought this change]
-- defines: avoid underscore-prefixed defines
+ libtest/Makefile.am: add -no-undefined for libstubgss for Cygwin
+
+ copy the LDFLAGS approach for adding same option with `libhostname` in
+ `libtest/Makefile.am`:
- Double-underscored or underscore plus uppercase letter at least.
+ - init `libstubgss_la_LDFLAGS_EXTRA` variable,
+ - add option to variable inside conditional,
+ - use variable in `libstubgss_la_LDFLAGS`
- ... as they're claimed to be reserved.
+ Fixes #5819
+ Closes #5820
+
+- docs: clarify MAX_SEND/RECV_SPEED functionality
- Reported-by: patnyb on github
+ ... in particular what happens if the maximum speed limit is set to a
+ value that's smaller than the transfer buffer size in use.
- Fixes #4254
- Closes #4255
+ Reported-by: Tomas Berger
+ Fixes #5788
+ Closes #5813
-- travis: add a build using ngtcp2 + nghttp3 (and a patched OpenSSL)
+- test1140: compare stdout
- Runs no tests
+ To make problems more immediately obvious when tests fail.
- Closes #4253
+ Closes #5814
-- travis: bump to using nghttp2 version 1.39.2
+- asyn-ares: correct some bad comments
- Closes #4252
+ Closes #5812
-- [Gisle Vanem brought this change]
+- [Emil Engler brought this change]
- docs/examples/curlx: fix errors
+ docs: Add video link to docs/CONTRIBUTE.md
- Initialise 'mimetype' and require the -p12 arg.
-
- Closes #4248
+ Closes #5811
-- cleanup: remove DOT_CHAR completely
-
- Follow-up to f9c7ba9096ec
-
- The use of DOT_CHAR for ".ssh" was probably a mistake and is removed
- now.
+- curl-config: ignore REQUIRE_LIB_DEPS in --libs output
- Pointed-out-by: Gisle Vanem
- Bug: https://github.com/curl/curl/pull/4230#issuecomment-522960638
+ Fixes a curl-config issue on cygwin by making sure REQUIRE_LIB_DEPS is
+ not considered for the --libs output.
- Closes #4247
+ Reported-by: ramsay-jones on github
+ Assisted-by: Brian Inglis and Ken Brown
+ Fixes #5793
+ Closes #5808
-- spnego_sspi: add typecast to fix build warning
+- copyright: update/correct the year range on a few files
+
+- scripts/copyright.pl: ignore .muse files
+
+- [Emil Engler brought this change]
+
+ multi: Remove 10-year old out-commented code
- Reported in build "Win32 target on Debian Stretch (64-bit) -
- i686-w64-mingw32 - gcc-20170516"
+ The code hasn't been touched since 2010-08-18
- Closes #4245
+ Closes #5805
-- openssl: build warning free with boringssl
+- KNOWN_BUGS: A shared connection cache is not thread-safe
- Closes #4244
+ Closes #4915
+ Closes #5802
-- curl: make --libcurl use CURL_HTTP_VERSION_3
+- CONTRIBUTE: extend git commit message description
- Closes #4243
-
-- ngtcp2: make postfields-set posts work
+ In particular how the first line works.
- Closes #4242
+ Closes #5803
-- http: remove chunked-encoding and expect header use for HTTP/3
+- RELEASE-NOTES: synced
-- [Alessandro Ghedini brought this change]
+- [Stefan Yohansson brought this change]
- configure: use pkg-config to detect quiche
-
- This removes the need to hard-code the quiche target path in
- configure.ac.
+ transfer: move retrycount from connect struct to easy handle
- This depends on https://github.com/cloudflare/quiche/pull/128
+ This flag was applied to the connection struct that is released on
+ retry. These changes move the retry counter into Curl_easy struct that
+ lives across retries and retains the new connection.
- Closes #4237
+ Reported-by: Cherish98 on github
+ Fixes #5794
+ Closes #5800
-- CURLOPT_SSL_VERIFYHOST: treat the value 1 as 2
+- libssh2: s/ssherr/sftperr/
- For a long time (since 7.28.1) we've returned error when setting the
- value to 1 to make applications notice that we stopped supported the old
- behavior for 1. Starting now, we treat 1 and 2 exactly the same.
+ The debug output used ssherr instead of sftperr which not only outputs
+ the wrong error code but also casues a warning on Windows.
- Closes #4241
+ Follow-up to 7370b4e39f1
+
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/7370b4e39f1390e701f5b68d910c619151daf72b#r41334700
+ Closes #5799
-- curl: use .curlrc (with a dot) on Windows as well
+- ftp: don't do ssl_shutdown instead of ssl_close
- Fall-back to _curlrc if the dot-version is missing.
+ The shutdown function is for downgrading a connection from TLS to plain,
+ and this is not requested here.
- Co-Authored-By: Steve Holme
+ Have ssl_close reset the TLS connection state.
- Closes #4230
+ This partially reverts commit f002c850d98d
+
+ Reported-by: Rasmus Melchior Jacobsen
+ Reported-by: Denis Goleshchikhin
+ Fixes #5797
-- netrc: make the code try ".netrc" on Windows as well
+Marc Hoersken (9 Aug 2020)
+- CI/azure: fix test outcome values and use latest API version
- ... but fall back and try "_netrc" too if the dot version didn't work.
+ This makes sure that tests ignored or skipped are not shown
+ just in the category "Other", but with their correct state.
- Co-Authored-By: Steve Holme
+ Closes #5796
-- ngtcp2: use ngtcp2_version() to get the run-time version
+- CI/azure: show runtime stats to investigate slowness
- ... which of course doesn't have to be the same used at build-time.
+ Also avoid naming conflict of TFLAGS env and tflags variables.
- Function just recently merged in ngtcp2.
+ Closes #5776
-- ngtcp2: move the h3 initing to immediately after the rx key
+Daniel Stenberg (8 Aug 2020)
+- TLS naming: fix more Winssl and Darwinssl leftovers
- To fix a segfault and to better deal with 0-RTT
+ The CMake option is now called CMAKE_USE_SCHANNEL
- Assisted-by: Tatsuhiro Tsujikawa
-
-- [Alessandro Ghedini brought this change]
-
- quiche: register debug callback once and earlier
+ The winbuild flag is USE_SCHANNEL
- The quiche debug callback is global and can only be initialized once, so
- make sure we don't do it multiple times (e.g. if multiple requests are
- executed).
+ The CI jobs and build scripts only use the new names and the new name
+ options
- In addition this initializes the callback before the connection is
- created, so we get logs for the handshake as well.
+ Tests now require 'Schannel' (when necessary)
- Closes #4236
+ Closes #5795
-- ssh: add a generic Curl_ssh_version function for SSH backends
+- smtp_parse_address: handle blank input string properly
- Closes #4235
+ Closes #5792
-- base64: check for SSH, not specific SSH backends
-
-- vssh: move ssh init/cleanup functions into backend code
-
-- vssh: create directory for SSH backend code
-
-- TODO/ROADMAP: remove "refuse downgrade redirects" and HTTP/3
+- runtests: run the DICT server on a random port number
- HTTP3 is now already in full progress
+ Removed support for -b (base port number)
- Downgrade redirects can be achived almost exactly like that by setting
- CURLOPT_REDIR_PROTOCOLS.
+ Closes #5783
- RELEASE-NOTES: synced
-- travis: add a quiche build
+- runtests: move the TELNET server to a dynamic port
- Closes #4207
-
-- http: fix use of credentials from URL when using HTTP proxy
+ Rename the port variable to TELNETPORT to better match the existing
+ pattern.
- When a username and password are provided in the URL, they were wrongly
- removed from the stored URL so that subsequent uses of the same URL
- wouldn't find the crendentials. This made doing HTTP auth with multiple
- connections (like Digest) mishave.
+ Closes #5785
+
+- ngtcp2: adapt to error code rename
- Regression from 46e164069d1a5230 (7.62.0)
+ Closes #5786
+
+- runtests: move the smbserver to use a dynamic port number
- Test case 335 added to verify.
+ Closes #5782
+
+- runtests: run the http2 tests on a random port number
- Reported-by: Mike Crowe
+ Closes #5779
+
+- gtls: survive not being able to get name/issuer
- Fixes #4228
- Closes #4229
+ Closes #5778
-- [Mike Crowe brought this change]
+- runtests: move the gnutls-serv tests to a dynamic port
+
+ Affects test 320, 321, 322 and 324.
+
+ Closes #5778
- tests: Replace outdated test case numbering documentation
+- runtests: support dynamicly base64 encoded sections in tests
- Tests are no longer grouped by numeric range[1]. Let's stop saying that
- and provide some alternative advice for numbering tests.
+ This allows us to make test cases to use base64 at run-time and still
+ use and verify information determined at run-time, such as the IMAP test
+ server's port number in test 842.
- [1] https://curl.haxx.se/mail/lib-2019-08/0043.html
+ This change makes 12 tests run again that basically never ran since we
+ moved to dynamic port numbers.
- Closes #4227
-
-- travis: reduce number of torture tests in 'coverage'
+ ftpserver.pl is adjusted to load test instructions and test number from
+ the preprocessed test file.
- ... to make it complete in time. This cut seems not almost not affect
- the coverage percentage and yet completes within 35 minutes on travis
- where the previous runs recently always timed out after 50.
+ FILEFORMAT.md now documents the new base64 encoding syntax.
- Closes #4223
-
-- [Igor Makarov brought this change]
+ Reported-by: Marcel Raad
+ Fixes #5761
+ Closes #5775
- configure: use -lquiche to link to quiche
+- curl.1: add a few missing valid exit codes
- Closes #4226
-
-- ngtcp2: provide the callbacks as a static struct
+ 93 - 96 can be returned as well.
- ... instead of having them in quicsocket
+ Closes #5777
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: add missing nghttp3_conn_add_write_offset call
+- TODO: Use multiple parallel transfers for a single download
- Closes #4225
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: deal with stream close
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: Consume QUIC STREAM data properly
-
-- [Tatsuhiro Tsujikawa brought this change]
-
- ngtcp2: don't reinitialize SSL on Retry
+ Closes #5774
-- multi: getsock improvements for QUIC connecting
-
-- connect: connections are persistent by default for HTTP/3
-
-- quiche: happy eyeballs
+- TODO: Set the modification date on an uploaded file
- Closes #4220
+ Closes #5768
-- ngtcp2: do QUIC connections happy-eyeballs friendly
+- [Thomas M. DuBuisson brought this change]
-- curl_version: bump string buffer size to 250
+ CI: Add muse CI config
- With HTTP/3 libs and plenty TLS libs, I manged to hit the limit (which
- causes a truncated output).
+ Closes #5772
-- CURLOPT_ALTSVC.3: use a "" file name to not load from a file
+- [Thomas M. DuBuisson brought this change]
-Jay Satiro (14 Aug 2019)
-- vauth: Use CURLE_AUTH_ERROR for auth function errors
-
- - Add new error code CURLE_AUTH_ERROR.
+ travis/script.sh: fix use of `-n' with unquoted envvar
- Prior to this change auth function errors were signaled by
- CURLE_OUT_OF_MEMORY and CURLE_RECV_ERROR, and neither one was
- technically correct.
+ Shellcheck tells us "-n doesn't work with unquoted arguments. quote or
+ use [[ ]]."
- Ref: https://github.com/curl/curl/pull/3848
+ And testing shows:
- Co-authored-by: Dominik Hölzl
+ ```
+ docker run --rm -it ubuntu bash
+ root@fe85ce156856:/# [ -n $DOES_NOT_EXIST ] && echo "I ran"
+ I ran
+ root@fe85ce156856:/# [ -n "$DOES_NOT_EXIST" ] && echo "I ran"
+ root@fe85ce156856:/#
+ ```
- Closes https://github.com/curl/curl/pull/3864
+ Closes #5773
-Daniel Stenberg (13 Aug 2019)
-- curl_version_info: make the quic_version a const
+- h2: repair trailer handling
- Follow-up from 1a2df1518ad8653f
+ The previous h2 trailer fix in 54a2b63 was wrong and caused a
+ regression: it cannot deal with trailers immediately when read since
+ they may be read off the connection by the wrong 'data' owner.
- Closes #4222
-
-- examples: add http3.c, altsvc.c and http3-present.c
+ This change reverts the logic back to gathering all trailers into a
+ single buffer, like before 54a2b63.
- Closes #4221
+ Reported-by: Tadej Vengust
+ Fixes #5663
+ Closes #5769
-Peter Wu (13 Aug 2019)
-- nss: use TLSv1.3 as default if supported
+Viktor Szakats (3 Aug 2020)
+- windows: disable Unix Sockets for old mingw
+
+ Classic mingw and 10y+ old versions of mingw-w64 don't ship with
+ Windows headers having the typedef necessary for Unix Sockets
+ support, so try detecting these environments to disable this
+ feature.
- SSL_VersionRangeGetDefault returns (TLSv1.0, TLSv1.2) as supported
- range in NSS 3.45. It looks like the intention is to raise the minimum
- version rather than lowering the maximum, so adjust accordingly. Note
- that the caller (nss_setup_connect) initializes the version range to
- (TLSv1.0, TLSv1.3), so there is no need to check for >= TLSv1.0 again.
+ Ref: https://sourceforge.net/p/mingw-w64/mingw-w64/ci/cf6afc57179a5910621215f8f4037d406892072c/
- Closes #4187
Reviewed-by: Daniel Stenberg
- Reviewed-by: Kamil Dudka
-
-Daniel Stenberg (13 Aug 2019)
-- quic.h: remove unused proto
-
-- curl_version_info.3: mentioned ALTSVC and HTTP3
- ... and sorted the list alphabetically
+ Fixes #5674
+ Closes #5758
-- lib/quic.c: unused - removed
-
-- CURLOPT_ALTSVC_CTRL.3: remove CURLALTSVC_ALTUSED
+Marcel Raad (3 Aug 2020)
+- test1908: treat file as text
- Follow-up to 98c3f148 that removed it from the header file
-
-- [Junho Choi brought this change]
+ Fixes the line endings on Windows.
+
+ Closes https://github.com/curl/curl/pull/5767
- docs/HTTP3: simplify quiche build instruction
+- TrackMemory tests: ignore realloc and free in getenv.c
- Use --recursive to get boringssl in one line
+ These are only called for WIN32.
- Closes #4219
+ Closes https://github.com/curl/curl/pull/5767
-- altsvc: make it use h3-22 with ngtcp2 as well
+Daniel Stenberg (3 Aug 2020)
+- tests/FILEFORMAT.md: mention %HTTP2PORT
-- ngtcp2: initial h3 request work
-
- Closes #4217
+- RELEASE-NOTES: synced
-- curl_version_info: offer quic (and h3) library info
+- tlsv1.3.d. only for TLS-using connections
- Closes #4216
+ ... and rephrase that "not all" TLS backends support it.
+
+ Closes #5764
-- HTTP3: use ngtcp2's draft-22 branch
+- tls-max.d: this option is only for TLS-using connections
+
+ Ref: #5763
+ Closes #5764
-- RELEASE-NOTES: synced
+Marcel Raad (2 Aug 2020)
+- [Cameron Cawley brought this change]
-- CURLOPT_READFUNCTION.3: provide inline example
+ tool_doswin: Simplify Windows version detection
- ... instead of mentioning one in another place
+ Closes https://github.com/curl/curl/pull/5754
-- [Tatsuhiro Tsujikawa brought this change]
+- [Cameron Cawley brought this change]
- ngtcp2: send HTTP/3 request with nghttp3
+ win32: Add Curl_verify_windows_version() to curlx
- This commit makes sending HTTP/3 request with nghttp3 work. It
- minimally receives HTTP response and calls nghttp3 callbacks, but no
- processing is made at the moment.
-
- Closes #4215
-
-- nghttp3: initial h3 template code added
+ Closes https://github.com/curl/curl/pull/5754
-- nghttp3: required when ngtcp2 is used for QUIC
+- runtests.pl: treat LibreSSL and BoringSSL as OpenSSL
- - checked for by configure
- - updated docs/HTTP3.md
- - shown in the version string
+ This makes the tests that require the OpenSSL feature also run for
+ those two compatible libraries.
- Closes #4210
+ Closes https://github.com/curl/curl/pull/5762
-- [Eric Wong brought this change]
+Daniel Stenberg (1 Aug 2020)
+- multi: Condition 'extrawait' is always true
+
+ Reported by Codacy.
+
+ Reviewed-by: Marcel Raad
+ Closes #5759
- asyn-thread: issue CURL_POLL_REMOVE before closing socket
+Marcel Raad (1 Aug 2020)
+- openssl: fix build with LibreSSL < 2.9.1
- This avoids EBADF errors from EPOLL_CTL_DEL operations in the
- ephiperfifo.c example. EBADF is dangerous in multi-threaded
- applications where I rely on epoll_ctl to operate on the same
- epoll description from different threads.
+ `SSL_CTX_add0_chain_cert` and `SSL_CTX_clear_chain_certs` were
+ introduced in LibreSSL 2.9.1 [0].
- Follow-up to eb9a604f8d7db8
+ [0] https://github.com/libressl-portable/openbsd/commit/0db809ee178457c8170abfae3931d7bd13abf3ef
- Bug: https://curl.haxx.se/mail/lib-2019-08/0026.html
- Closes #4211
+ Closes https://github.com/curl/curl/pull/5757
-- [Carlo Marcelo Arenas Belón brought this change]
+Daniel Stenberg (1 Aug 2020)
+- [Marc Aldorasi brought this change]
- configure: avoid undefined check_for_ca_bundle
+ multi_remove_handle: close unused connect-only connections
- instead of using a "greater than 0" test, check for variable being
- set, as it is always set to 1, and could be left unset if non of
- OPENSSL MBEDTLS GNUTLS WOLFSSL is being configured for.
+ Previously any connect-only connections in a multi handle would be kept
+ alive until the multi handle was closed. Since these connections cannot
+ be re-used, they can be marked for closure when the associated easy
+ handle is removed from the multi handle.
- Closes #4213
-
-- [Tatsuhiro Tsujikawa brought this change]
+ Closes #5749
- ngtcp2: Send ALPN h3-22
+- checksrc: invoke script with -D to find .checksrc proper
- Closes #4212
-
-- [Tatsuhiro Tsujikawa brought this change]
+ Without the -D command line option, checksrc.pl won't know which
+ directory to load the ".checksrc" file from when building out of the
+ source tree.
+
+ Reported-by: Marcel Raad
+ Fixes #5715
+ Closes #5755
- ngtcp2: use ngtcp2_settings_default and specify initial_ts
+- [Carlo Marcelo Arenas Belón brought this change]
-- curl_global_init_mem.3: mention it was added in 7.12.0
+ buildconf: retire ares buildconf invocation
+
+ no longer needed after 4259d2df7dd95637a4b1e3fb174fe5e5aef81069
-- [Tatsuhiro Tsujikawa brought this change]
+- [Carlo Marcelo Arenas Belón brought this change]
- ngtcp2: make the QUIC handshake work
+ buildconf: excempt defunct reference to ACLOCAL_FLAGS
- Closes #4209
+ retired with 09f278121e815028adb24d228d8092fc6cb022aa but kept around as
+ the name is generic enough that it might be in use and relied upon from
+ the environment.
-- [Alex Mayorga brought this change]
+- [Carlo Marcelo Arenas Belón brought this change]
- HTTP3.md: Update quiche build instructions
+ buildconf: avoid array concatenation in die()
- Added cloning for quiche and BoringSSL and modified the build
- instructions so they work on a clean folder.
+ reported as error SC2145[1] by shellcheck, but not expected to cause
+ any behavioural differences otherwise.
- Closes #4208
-
-- CURLOPT_H3: removed
+ [1] https://github.com/koalaman/shellcheck/wiki/SC2145
- There's no use for this anymore and it was never in a release.
+ Closes #5701
+
+- travis: add ppc64le and s390x builds
- Closes #4206
+ Closes #5752
-- http3: make connection reuse work
+Marc Hoersken (31 Jul 2020)
+- connect: remove redundant message about connect failure
+
+ Reviewed-by: Daniel Stenberg
- Closes #4204
+ Closes #5708
-- quiche: add SSLKEYLOGFILE support
+- tests/sshserver.pl: fix compatibility with OpenSSH for Windows
+
+ Follow up to #5721
-- cleanup: s/curl_debug/curl_dbg_debug in comments and docs
+- CI/azure: install libssh2 for use with msys2-based builds
- Leftovers from the function rename back in 76b63489495
+ This enables building and running the SFTP tests.
+ Unfortunately OpenSSH for Windows does not support SCP (yet).
- Reported-by: Gisle Vanem
- Bug: https://github.com/curl/curl/commit/f3e0f071b14fcb46a453f69bdf4e062bcaacf362#com
- mitcomment-34601751
+ Reviewed-by: Daniel Stenberg
- Closes #4203
-
-- RELEASE-NOTES: synced
+ Closes #5721
-- alt-svc: add protocol version selection masking
+- CI/azure: increase Windows job timeout once again
- So that users can mask in/out specific HTTP versions when Alt-Svc is
- used.
+ Avoid aborted jobs due to performance issues on Azure DevOps.
- - Removed "h2c" and updated test case accordingly
- - Changed how the altsvc struct is laid out
- - Added ifdefs to make the unittest run even in a quiche-tree
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Jay Satiro
- Closes #4201
+ Closes #5738
-- http3: fix the HTTP/3 in the request, make alt-svc set right versions
+Jay Satiro (30 Jul 2020)
+- TODO: Schannel: 'Add option to allow abrupt server closure'
+
+ We should offer an option to allow abrupt server closures (server closes
+ SSL transfer without sending a known termination point such as length of
+ transfer or close_notify alert). Abrupt server closures are usually
+ because of misconfigured or very old servers.
- Closes #4200
+ Closes https://github.com/curl/curl/issues/4427
-- alt-svc: send Alt-Used: in redirected requests
+- url: fix CURLU and location following
- RFC 7838 section 5:
+ Prior to this change if the user set a URL handle (CURLOPT_CURLU) it was
+ incorrectly used for the location follow, resulting in infinite requests
+ to the original location.
- When using an alternative service, clients SHOULD include an Alt-Used
- header field in all requests.
+ Reported-by: sspiri@users.noreply.github.com
- Removed CURLALTSVC_ALTUSED again (feature is still EXPERIMENTAL thus
- this is deemed ok).
+ Fixes https://github.com/curl/curl/issues/5709
+ Closes https://github.com/curl/curl/pull/5713
+
+Daniel Stenberg (30 Jul 2020)
+- RELEASE-NOTES: synced
+
+- [divinity76 brought this change]
+
+ docs: add date of 7.20 to CURLM_CALL_MULTI_PERFORM mentions
- You can disable sending this header just like you disable any other HTTP
- header in libcurl.
+ it helps make it obvious that most developers don't have to care about
+ the CURLM_CALL_MULTI_PERFORM value (last release using it is nearly 11
+ years old, November 4 2009)
- Closes #4199
+ Closes #5744
-- CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly
+Jay Satiro (29 Jul 2020)
+- tool_cb_wrt: fix outfile mode flags for Windows
+
+ - Use S_IREAD and S_IWRITE mode permission flags to create the file
+ on Windows instead of S_IRUSR, S_IWUSR, etc.
- Even though it cannot fall-back to a lower HTTP version automatically. The
- safer way to upgrade remains via CURLOPT_ALTSVC.
+ Windows only accepts a combination of S_IREAD and S_IWRITE. It does not
+ acknowledge other combinations, for which it may generate an assertion.
- CURLOPT_H3 no longer has any bits that do anything and might be removed
- before we remove the experimental label.
+ This is a follow-up to 81b4e99 from yesterday, which improved the
+ existing file check with -J.
- Updated the curl tool accordingly to use "--http3".
+ Ref: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen#remarks
+ Ref: https://github.com/curl/curl/pull/5731
- Closes #4197
+ Closes https://github.com/curl/curl/pull/5742
-- docs/ALTSVC: remove what works and the experimental explanation
+Daniel Stenberg (28 Jul 2020)
+- checksrc: ban gmtime/localtime
+
+ They're not thread-safe so they should not be used in libcurl code.
- Also, put the TODO items at the bottom.
+ Explictly enabled when deemed necessary and in examples and tests
- Closes #4198
+ Reviewed-by: Nicolas Sterchele
+ Closes #5732
-- docs/EXPERIMENTAL: explain what it means and what's experimental now
+- transfer: fix data_pending for builds with both h2 and h3 enabled
+
+ Closes #5734
-- curl: make use of CURLINFO_RETRY_AFTER when retrying
+- curl_multi_setopt: fix compiler warning "result is always false"
- If a Retry-After: header was used in the response, that value overrides
- other retry timing options.
+ On systems with 32 bit long the expression is always false. Avoid
+ the warning.
- Fixes #3794
- Closes #4195
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/61a08508f6a458fe21bbb18cd2a9bac2f039452b#commitcomment-40941232
+ Closes #5736
-- curl: use CURLINFO_PROTOCOL to check for HTTP(s)
+- curl: improve the existing file check with -J
- ... instead of CURLINFO_EFFECTIVE_URL to avoid string operations.
+ Previously a file that isn't user-readable but is user-writable would
+ not be properly avoided and would get overwritten.
+
+ Reported-by: BrumBrum on hackerone
+ Assisted-by: Jay Satiro
+ Bug: https://hackerone.com/reports/926638
+ Closes #5731
+
+- [Jonathan Nieder brought this change]
-- CURLINFO_RETRY_AFTER: parse the Retry-After header value
+ multi: update comment to say easyp list is linear
- This is only the libcurl part that provides the information. There's no
- user of the parsed value. This change includes three new tests for the
- parser.
+ Since 09b9fc900 (multi: remove 'Curl_one_easy' struct, phase 1,
+ 2013-08-02), the easy handle list is not circular but ends with
+ ->next pointing to NULL.
- Ref: #3794
+ Reported-by: Masaya Suzuki <masayasuzuki@google.com>
+ Closes #5737
-- docs/ALTSVC.md: first basic file format description
+- CURLOPT_NOBODY.3: fix the syntax for referring to options
+
+ As test 1140 fails otherwise!
+
+ Follow-up to e1bac81cc815
-- curl: have -w's 'http_version' show '3' for HTTP/3
+- ngtcp2: store address in sockaddr_storage
- Closes #4196
+ Reported-by: Tatsuhiro Tsujikawa
+ Closes #5733
-- curl.h: add CURL_HTTP_VERSION_3 to the version enum
+- CURLOPT_NOBODY.3: clarify what setting to 0 means
- It can't be set for CURLOPT_HTTP_VERSION, but it can be extracted with
- CURLINFO_HTTP_VERSION.
+ ... and mention that HTTP with other methods than HEAD might get a body and
+ there's no option available to stop that.
+
+ Closes #5729
-- quiche: make use of the connection timeout API properly
+- setopt: unset NOBODY switches to GET if still HEAD
+
+ Unsetting CURLOPT_NOBODY with 0L when doing HTTP has no documented
+ action but before 7.71.0 that used to switch back to GET and with this
+ change (assuming the method is still set to HEAD) this behavior is
+ brought back.
+
+ Reported-by: causal-agent on github
+ Fixes #5725
+ Closes #5728
-- quiche: make POSTFIELDS posts work
+- [Ehren Bendler brought this change]
-- quiche: improved error handling and memory cleanups
+ configure: cleanup wolfssl + pkg-config conflicts when cross compiling.
+
+ Also choose a different wolfSSL function to test for NTLM support.
+
+ Fixes #5605
+ Closes #5682
-- quiche: flush egress in h3_stream_recv() too
+- configure: show zstd "no" in summary when built without it
+
+ Reported-by: Marc Hörsken
+ Fixes #5720
+ Closes #5730
-- RELEASE-NOTES: synced
+- quiche: handle calling disconnect twice
+
+ Reported-by: lilongyan-huawei on github
+ Fixes #5726
+ Closes #5727
-Jay Satiro (6 Aug 2019)
-- [Patrick Monnerat brought this change]
+- [Nicolas Sterchele brought this change]
- os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
-
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ getinfo: reset retry-after value in initinfo
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ - Avoid re-using retry_after value from preceding request
+ - Add libtest 3010 to verify
- Closes https://github.com/curl/curl/pull/4186
+ Reported-by: joey-l-us on github
+ Fixes #5661
+ Closes #5672
-- tests: Fix the line endings for the SASL alt-auth tests
+Marcel Raad (27 Jul 2020)
+- WIN32: stop forcing narrow-character API
- - Change data and protocol sections to CRLF line endings.
+ Except where the results are only used for character output.
+ getenv is not touched because it's part of the public API, and having
+ it return UTF-8 instead of ANSI would be a breaking change.
- Prior to this change the tests would fail or hang, which is because
- certain sections such as protocol require CRLF line endings.
+ Fixes https://github.com/curl/curl/issues/5658
+ Fixes https://github.com/curl/curl/issues/5712
+ Closes https://github.com/curl/curl/pull/5718
+
+Jay Satiro (27 Jul 2020)
+- [Tobias Stoeckmann brought this change]
+
+ mprintf: Fix stack overflows
- Follow-up to grandparent commit which added the tests.
+ Stack overflows can occur with precisions for integers and floats.
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ Proof of concepts:
+ - curl_mprintf("%d, %.*1$d", 500, 1);
+ - curl_mprintf("%d, %+0500.*1$f", 500, 1);
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ Ideally, compile with -fsanitize=address which makes this undefined
+ behavior a bit more defined for debug purposes.
- Closes https://github.com/curl/curl/pull/4186
-
-- [Steve Holme brought this change]
-
- examples: Added SASL PLAIN authorisation identity (authzid) examples
+ The format strings are valid. The overflows occur due to invalid
+ arguments. If these arguments are variables with contents controlled
+ by an attacker, the function's stack can be corrupted.
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ Also see CVE-2016-9586 which partially fixed the float aspect.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
- Closes https://github.com/curl/curl/pull/4186
+ Closes https://github.com/curl/curl/pull/5722
-- [Steve Holme brought this change]
+- [Tobias Stoeckmann brought this change]
- curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
+ mprintf: Fix dollar string handling
- Ref: https://github.com/curl/curl/issues/3653
- Ref: https://github.com/curl/curl/pull/3790
+ Verify that specified parameters are in range. If parameters are too
+ large, fail early on and avoid out of boundary accesses.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ Also do not read behind boundaries of illegal format strings.
- Closes https://github.com/curl/curl/pull/4186
-
-- [Steve Holme brought this change]
-
- sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
+ These are defensive measures since it is expected that format strings
+ are well-formed. Format strings should not be modifiable by user
+ input due to possible generic format string attacks.
- Added the ability for the calling program to specify the authorisation
- identity (authzid), the identity to act as, in addition to the
- authentication identity (authcid) and password when using SASL PLAIN
- authentication.
+ Closes https://github.com/curl/curl/pull/5722
+
+Daniel Stenberg (26 Jul 2020)
+- ntlm: free target_info before (re-)malloc
- Fixes #3653
- Closes #3790
+ OSS-Fuzz found a way this could get called again with the pointer still
+ pointing to a malloc'ed memory, leading to a leak.
- NOTE: This commit was cherry-picked and is part of a series of commits
- that added the authzid feature for upcoming 7.66.0. The series was
- temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
- patch release.
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24379
- Closes https://github.com/curl/curl/pull/4186
+ Closes #5724
-Daniel Stenberg (6 Aug 2019)
-- docs/HTTP3: refreshed as it is now in master and HTTP/3 can be tested
+Marcel Raad (26 Jul 2020)
+- CI/macos: set minimum macOS version
+
+ This enables some deprecation warnings.
+ Previously, autotools defaulted to 10.8.
+
+ Closes https://github.com/curl/curl/pull/5723
-- [Yiming Jing brought this change]
+Daniel Stenberg (26 Jul 2020)
+- RELEASE-NOTES: synced
- mesalink: implement client authentication
+Marcel Raad (25 Jul 2020)
+- CI/macos: enable warnings as errors for CMake builds
- Closes #4184
+ Closes https://github.com/curl/curl/pull/5716
-- curl_multi_poll: a sister to curl_multi_wait() that waits more
+- CMake: fix test for warning suppressions
- Repeatedly we see problems where using curl_multi_wait() is difficult or
- just awkward because if it has no file descriptor to wait for
- internally, it returns immediately and leaves it to the caller to wait
- for a small amount of time in order to avoid occasional busy-looping.
+ GCC doesn't warn for unknown `-Wno-` options, except if there are other
+ warnings or errors [0]. This was problematic with `CURL_WERROR` as that
+ warning-as-error cannot be suppressed. Notably, this always happened
+ with `-Wno-pedantic-ms-format` when not targeting Windows. So test for
+ the positive form of the warning instead, which should always result in
+ a diagnostic if unknown.
- This is often missed or misunderstood, leading to underperforming
- applications.
+ [0] https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
- This change introduces curl_multi_poll() as a replacement drop-in
- function that accepts the exact same set of arguments. This function
- works identically to curl_multi_wait() - EXCEPT - for the case when
- there's nothing to wait for internally, as then this function will by
- itself wait for a "suitable" short time before it returns. This
- effectiely avoids all risks of busy-looping and should also make it less
- likely that apps "over-wait".
+ Closes https://github.com/curl/curl/pull/5714
+
+Jay Satiro (23 Jul 2020)
+- curl.h: update CURLINFO_LASTONE
- This also changes the curl tool to use this funtion internally when
- doing parallel transfers and changes curl_easy_perform() to use it
- internally.
+ CURLINFO_LASTONE should have been updated when
+ CURLINFO_EFFECTIVE_METHOD was added.
- Closes #4163
-
-- quiche:h3_stream_recv return 0 at end of stream
+ Reported-by: xwxbug@users.noreply.github.com
- ... and remove some verbose messages we don't need. Made transfers from
- facebook.com work better.
+ Fixes https://github.com/curl/curl/issues/5711
-- altsvc: make quiche use h3-22 now
+Marc Hoersken (22 Jul 2020)
+- CI/azure: unconditionally enable warnings-as-errors with autotools
+
+ Reviewed-by: Marcel Raad
+
+ Follow up to #5694
+ Closes #5706
-- quiche: show the actual version number
+Marcel Raad (21 Jul 2020)
+- doh: remove redundant cast
+
+ Closes https://github.com/curl/curl/pull/5704
-- quiche: first working HTTP/3 request
+- CI/macos: unconditionally enable warnings-as-errors with autotools
- - enable debug log
- - fix use of quiche API
- - use download buffer
- - separate header/body
+ Previously, warnings were only visible in the output for most jobs.
- Closes #4193
+ Closes https://github.com/curl/curl/pull/5694
-- http09: disable HTTP/0.9 by default in both tool and library
+- util: silence conversion warnings
- As the plan has been laid out in DEPRECATED. Update docs accordingly and
- verify in test 1174. Now requires the option to be set to allow HTTP/0.9
- responses.
+ timeval::tv_usec might be a 32-bit integer and timespec::tv_nsec might
+ be a 64-bit integer. This is the case when building for recent macOS
+ versions, for example. Just treat tv_usec as an int, which should
+ hopefully always be sufficient on systems with
+ `HAVE_CLOCK_GETTIME_MONOTONIC`.
- Closes #4191
-
-- quiche: initial h3 request send/receive
-
-- lib/Makefile.am: make checksrc run in vquic too
+ Closes https://github.com/curl/curl/pull/5695
-- altsvc: fix removal of expired cache entry
+- md(4|5): don't use deprecated macOS functions
- Closes #4192
-
-- RELEASE-NOTES: synced
-
-Steve Holme (4 Aug 2019)
-- md4: Use our own MD4 implementation when no crypto libraries are available
+ They are marked as deprecated for -mmacosx-version-min >= 10.15,
+ which might result in warnings-as-errors.
- Closes #3780
+ Closes https://github.com/curl/curl/pull/5695
-- md4: No need to include Curl_md4.h for each TLS library
-
-- md4: No need for the NTLM code to call Curl_md4it() for each TLS library
+Daniel Stenberg (18 Jul 2020)
+- strdup: remove the odd strlen check
- As the NTLM code no longer calls any of TLS libraries' specific MD4
- functions, there is no need to call this function for each #ifdef.
-
-- md4: Move the mbed TLS MD4 implementation out of the NTLM code
-
-- md4: Move the WinCrypt implementation out of the NTLM code
-
-- md4: Move the SecureTransport implementation out of the NTLM code
-
-- md4: Use the Curl_md4it() function for OpenSSL based NTLM
-
-- md4: Move the GNU TLS gcrypt MD4 implementation out of the NTLM code
+ It confuses code analyzers with its use of -1 for unsigned value. Also,
+ a check that's not normally used in strdup() code - and not necessary.
+
+ Closes #5697
-- md4: Move the GNU TLS Nettle MD4 implementation out of the NTLM code
+- [Alessandro Ghedini brought this change]
-Jay Satiro (4 Aug 2019)
-- OS400: Add CURLOPT_H3 symbols
+ travis: update quiche builds for new boringssl layout
- Follow-up to 3af0e76 which added experimental H3 support.
+ This is required after https://github.com/cloudflare/quiche/pull/593
+ moved BoringSSL around slightly.
- Closes https://github.com/curl/curl/pull/4185
-
-Daniel Stenberg (3 Aug 2019)
-- url: make use of new HTTP version if alt-svc has one
-
-- url: set conn->transport to default TCP at init time
-
-- altsvc: with quiche, use the quiche h3 alpn string
+ This also means that Go is not needed to build BoringSSL anymore (the
+ one provided by quiche anyway).
- Closes #4183
+ Closes #5691
-- alt-svc: more liberal ALPN name parsing
+Marcel Raad (17 Jul 2020)
+- configure: allow disabling warnings
- Allow pretty much anything to be part of the ALPN identifier. In
- particular minus, which is used for "h3-20" (in-progress HTTP/3
- versions) etc.
+ When using `--enable-warnings`, it was not possible to disable warnings
+ via CFLAGS that got explicitly enabled. Now warnings are not enabled
+ anymore if they are explicitly disabled (or enabled) in CFLAGS. This
+ works for at least GCC, clang, and TCC as they have corresponding
+ `-Wno-` options for every warning.
- Updated test 356.
- Closes #4182
+ Closes https://github.com/curl/curl/pull/5689
-- quiche: use the proper HTTP/3 ALPN
+Daniel Stenberg (16 Jul 2020)
+- ngtcp2: adjust to recent sockaddr updates
+
+ Closes #5690
-- quiche: add failf() calls for two error cases
+- page-header: provide protocol details in the curl.1 man page
- To aid debugging
+ Add protocol and version specific information about all protocols curl
+ supports.
- Closes #4181
+ Fixes #5679
+ Reported-by: tbugfinder on github
+ Closes #5686
-- mailmap: added Kyohei Kadota
+Daniel Gustafsson (16 Jul 2020)
+- docs: Update a few leftover mentions of DarwinSSL
+
+ Commit 76a9c3c4be10b3d4d379d5b23ca76806bbae536a renamed DarwinSSL to the
+ more correct/common name Secure Transport, but a few mentions in the docs
+ remained.
+
+ Closes #5688
+ Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-Kamil Dudka (1 Aug 2019)
-- http_negotiate: improve handling of gss_init_sec_context() failures
+Daniel Stenberg (16 Jul 2020)
+- file2memory: use a define instead of -1 unsigned value
- If HTTPAUTH_GSSNEGOTIATE was used for a POST request and
- gss_init_sec_context() failed, the POST request was sent
- with empty body. This commit also restores the original
- behavior of `curl --fail --negotiate`, which was changed
- by commit 6c6035532383e300c712e4c1cd9fdd749ed5cf59.
+ ... to use the maximum value for 'size_t' when detecting integer overflow.
+ Changed the limit to max/4 as already that seems unreasonably large.
- Add regression tests 2077 and 2078 to cover this.
+ Codacy didn't like the previous approach.
- Fixes #3992
- Closes #4171
+ Closes #5683
-Daniel Stenberg (1 Aug 2019)
-- mailmap: added 4 more names
+- CURL_PUSH_ERROROUT: allow the push callback to fail the parent stream
- Evgeny Grin, Peter Pih, Anton Malov and Marquis de Muesli
+ ... by adding support for a new dedicated return code.
+
+ Suggested-by: Jonathan Cardoso
+ Assisted-by: Erik Johansson
+ URL: https://curl.haxx.se/mail/lib-2020-06/0099.html
+ Closes #5636
-- mailmap: add Giorgos Oikonomou
+- [Baruch Siach brought this change]
-- src/makefile: fix uncompressed hugehelp.c generation
+ nss: fix build with disabled proxy support
- Regression from 5cf5d57ab9 (7.64.1)
+ Avoid reference to fields that do not exist when CURL_DISABLE_PROXY is
+ defined.
- Fixed-by: Lance Ware
- Fixes #4176
- Closes #4177
+ Closes #5667
-- appveyor: pass on -k to make
+- test1139: make it display the difference on test failures
-- timediff: make it 64 bit (if possible) even with 32 bit time_t
+- test1119: verify stdout in the test
- ... to make it hold microseconds too.
+ So that failures will be displayed in the terminal, as it makes test failures
+ visually displayed easier and faster.
- Fixes #4165
- Closes #4168
-
-- ROADMAP: parallel transfers are merged now
+ Closes #5644
-- getenv: support up to 4K environment variable contents on windows
+- curl: add %{method} to the -w variables
- Reported-by: Michal ÄŒaplygin
- Fixes #4174
- Closes #4175
-
-- [Kyohei Kadota brought this change]
-
- plan9: add support for running on Plan 9
+ Gets the CURLINFO_EFFECTIVE_METHOD from libcurl.
- Closes #3701
-
-- [Kyohei Kadota brought this change]
-
- ntlm: explicit type casting
+ Added test 1197 to verify.
-- [Justin brought this change]
-
- curl.h: fix outdated comment
+- CURLINFO_EFFECTIVE_METHOD: added
+
+ Provide the HTTP method that was used on the latest request, which might
+ be relevant for users when there was one or more redirects involved.
- Closes #4167
+ Closes #5511
-- curl: remove outdated comment
+Viktor Szakats (14 Jul 2020)
+- windows: add unicode to feature list
- Turned bad with commit b8894085000
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Marc Hörsken
+
+ Closes #5491
+
+Daniel Stenberg (14 Jul 2020)
+- multi: remove two checks always true
- Reported-by: niallor on github
- Fixes #4172
- Closes #4173
+ Detected by Codacy
+ Closes #5676
-- cleanup: remove the 'numsocks' argument used in many places
+Marc Hoersken (13 Jul 2020)
+- workflows: limit what branches to run CodeQL on
- It was used (intended) to pass in the size of the 'socks' array that is
- also passed to these functions, but was rarely actually checked/used and
- the array is defined to a fixed size of MAX_SOCKSPEREASYHANDLE entries
- that should be used instead.
+ Align CodeQL action with existing CI actions:
+ - Update branch filter to avoid duplicate CI runs.
+ - Shorten workflow name due to informative job name.
+
+ Reviewed-by: Daniel Stenberg
- Closes #4169
+ Closes #5660
-- readwrite_data: repair setting the TIMER_STARTTRANSFER stamp
+- appveyor: collect libcurl.dll variants with prefix or suffix
- Regression, broken in commit 65eb65fde64bd5f (curl 7.64.1)
+ On some platforms libcurl is build with a platform-specific
+ prefix and/or a version number suffix.
- Reported-by: Jonathan Cardoso Machado
Assisted-by: Jay Satiro
- Fixes #4136
- Closes #4162
+ Closes #5659
-- mailmap: Amit Katyal
+Daniel Stenberg (12 Jul 2020)
+- [ihsinme brought this change]
-- asyn-thread: removed unused variable
+ socks: use size_t for size variable
- Follow-up to eb9a604f. Mistake caused by me when I edited the commit
- before push...
-
-- RELEASE-NOTES: synced
-
-- [Amit Katyal brought this change]
-
- asyn-thread: create a socketpair to wait on
+ Use the unsigned type (size_t) in the arithmetic of pointers. In this
+ context, the signed type (ssize_t) is used unnecessarily.
- Closes #4157
+ Authored-by: ihsinme on github
+ Closes #5654
-- curl: cap the maximum allowed values for retry time arguments
-
- ... to avoid integer overflows later when multiplying with 1000 to
- convert seconds to milliseconds.
-
- Added test 1269 to verify.
+- RELEASE-NOTES: synced
- Reported-by: Jason Lee
- Closes #4166
+ ... and bumped to 7.72.0 as the next release version number
-- progress: reset download/uploaded counter
-
- ... to make CURLOPT_MAX_RECV_SPEED_LARGE and
- CURLOPT_MAX_SEND_SPEED_LARGE work correctly on subsequent transfers that
- reuse the same handle.
-
- Fixed-by: Ironbars13 on github
- Fixes #4084
- Closes #4161
+- [Gilles Vollant brought this change]
-- http2_recv: trigger another read when the last data is returned
+ content_encoding: add zstd decoding support
- ... so that end-of-stream is detected properly.
+ include zstd curl patch for Makefile.m32 from vszakats
+ and include Add CMake support for zstd from Peter Wu
- Reported-by: Tom van der Woerdt
- Fixes #4043
- Closes #4160
+ Helped-by: Viktor Szakats
+ Helped-by: Peter Wu
+ Closes #5453
-- curl: avoid uncessary libcurl timeouts (in parallel mode)
+- asyn.h: remove the Curl_resolver_getsock define
- When curl_multi_wait() returns OK without file descriptors to wait for,
- it might already have done a long timeout.
+ - not used
+ - used the wrong number of arguments
+ - confused the Codeacy code analyzer
- Closes #4159
+ Closes #5647
-- [Balazs Kovacsics brought this change]
+- [Nicolas Sterchele brought this change]
- HTTP: use chunked Transfer-Encoding for HTTP_POST if size unknown
+ configure.ac: Sort features name in summary
- If using the read callback for HTTP_POST, and POSTFIELDSIZE is not set,
- automatically add a Transfer-Encoding: chunked header, same as it is
- already done for HTTP_PUT, HTTP_POST_FORM and HTTP_POST_MIME. Update
- test 1514 according to the new behaviour.
+ - Same as protocols
- Closes #4138
+ Closes #5656
-Jay Satiro (29 Jul 2019)
-- [Daniel Stenberg brought this change]
+- [Matthias Naegler brought this change]
- winbuild: add vquic to list of build directories
-
- This fixes the winbuild build method which broke several days ago
- when experimental quic support was added in 3af0e76.
+ cmake: fix windows xp build
- Reported-by: Michael Lee
-
- Fixes https://github.com/curl/curl/issues/4158
+ Reviewed-by: Marcel Raad
+ Closes #5662
-- easy: resize receive buffer on easy handle reset
+- ngtcp2: update to modified qlog callback prototype
- - In curl_easy_reset attempt to resize the receive buffer to its default
- size. If realloc fails then continue using the previous size.
-
- Prior to this change curl_easy_reset did not properly handle resetting
- the receive buffer (data->state.buffer). It reset the variable holding
- its size (data->set.buffer_size) to the default size (READBUFFER_SIZE)
- but then did not actually resize the buffer. If a user resized the
- buffer by using CURLOPT_BUFFERSIZE to set the size smaller than the
- default, later called curl_easy_reset and attempted to reuse the handle
- then a heap overflow would very likely occur during that handle's next
- transfer.
+ Closes #5675
+
+- transfer: fix memory-leak with CURLOPT_CURLU in a duped handle
- Reported-by: Felix Hädicke
+ Added test case 674 to reproduce and verify the bug report.
- Fixes https://github.com/curl/curl/issues/4143
- Closes https://github.com/curl/curl/pull/4145
+ Fixes #5665
+ Reported-by: NobodyXu on github
+ Closes #5673
-- [Brad Spencer brought this change]
+- [Baruch Siach brought this change]
- examples: Avoid reserved names in hiperfifo examples
-
- - Trade in __attribute__((unused)) for the classic (void)x to silence
- unused symbols.
-
- Because the classic way is not gcc specific. Also because the prior
- method mapped to symbol _Unused, which starts with _ and a capital
- letter which is reserved.
-
- Assisted-by: The Infinnovation team
+ bearssl: fix build with disabled proxy support
- Bug: https://github.com/curl/curl/issues/4120#issuecomment-512542108
+ Avoid reference to fields that do not exist when CURL_DISABLE_PROXY is
+ defined.
- Closes https://github.com/curl/curl/pull/4153
+ Reviewed-by: Nicolas Sterchele
+ Closes #5666
-Daniel Stenberg (25 Jul 2019)
- RELEASE-NOTES: synced
-- [Felix Hädicke brought this change]
+Jay Satiro (11 Jul 2020)
+- [Carlo Marcelo Arenas Belón brought this change]
- ssh-libssh: do not specify O_APPEND when not in append mode
+ cirrus-ci: upgrade 11-STABLE to 11.4
- Specifying O_APPEND in conjunction with O_TRUNC and O_CREAT does not
- make much sense. And this combination of flags is not accepted by all
- SFTP servers (at least not Apache SSHD).
+ Meant to be the last of the 11 series and so make sure that all
+ other references reflect all 11 versions so they can be retired
+ together later.
- Fixes #4147
- Closes #4148
+ Closes https://github.com/curl/curl/pull/5668
-- [Gergely Nagy brought this change]
+- [Filip Salomonsson brought this change]
- multi: call detach_connection before Curl_disconnect
+ CURLINFO_CERTINFO.3: fix typo
- Curl_disconnect bails out if conn->easyq is not empty, detach_connection
- needs to be called first to remove the current easy from the queue.
+ Closes https://github.com/curl/curl/pull/5655
+
+Daniel Stenberg (4 Jul 2020)
+- http2: only do the *done() cleanups for HTTP
- Fixes #4144
- Closes #4151
+ Follow-up to ef86daf4d3
+
+ Closes #5650
+ Fixes #5646
+
+- [Alex Kiernan brought this change]
-Jay Satiro (23 Jul 2019)
-- tool_operate: fix implicit call to easysrc_cleanup
+ gnutls: repair the build with `CURL_DISABLE_PROXY`
- easysrc_cleanup is only defined when CURL_DISABLE_LIBCURL_OPTION is not
- defined, and prior to this change would be called regardless.
+ `http_proxy`/`proxy_ssl`/`tunnel_proxy` will not be available in `conn`
+ if `CURL_DISABLE_PROXY` is enabled. Repair the build with that
+ configuration.
- Bug: https://github.com/curl/curl/pull/3804#issuecomment-513922637
- Reported-by: Marcel Raad
+ Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
+ Closes #5645
+
+Alex Kiernan (3 Jul 2020)
+- gnutls: Fetch backend when using proxy
- Closes https://github.com/curl/curl/pull/4142
+ Fixes: 89865c149 ("gnutls: remove the BACKEND define kludge")
+ Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
+
+Daniel Stenberg (3 Jul 2020)
+- [Laramie Leavitt brought this change]
-Daniel Stenberg (22 Jul 2019)
-- curl:create_transfers check return code from curl_easy_setopt
+ http2: close the http2 connection when no more requests may be sent
- From commit b8894085
+ Well-behaving HTTP2 servers send two GOAWAY messages. The first
+ message is a warning that indicates that the server is going to
+ stop accepting streams. The second one actually closes the stream.
- Pointed out by Coverity CID 1451703
+ nghttp2 reports this state (and the other state of no more stream
+ identifiers) via the call nghttp2_session_check_request_allowed().
+ In this state the client should not create more streams on the
+ session (tcp connection), and in curl this means that the server
+ has requested that the connection is closed.
- Closes #4134
-
-- HTTP3: initial (experimental) support
+ It would be also be possible to put the connclose() call into the
+ on_http2_frame_recv() function that triggers on the GOAWAY message.
- USe configure --with-ngtcp2 or --with-quiche
+ This fixes a bug seen when the client sees the following sequence of
+ frames:
- Using either option will enable a HTTP3 build.
- Co-authored-by: Alessandro Ghedini <alessandro@ghedini.me>
+ // advisory GOAWAY
+ HTTP2 GOAWAY [stream-id = 0, promised-stream-id = -1]
+ ... some additional frames
- Closes #3500
-
-- curl: remove dead code
+ // final GOAWAY
+ HTTP2 GOAWAY [stream-id = 0, promised-stream-id = N ]
- The loop never loops (since b889408500), pointed out by Coverity (CID
- 1451702)
+ Before this change, curl will attempt to reuse the connection even
+ after the last stream, will encounter this error:
- Closes #4133
-
-- docs/PARALLEL-TRANSFERS: correct the version number
-
-- docs/PARALLEL-TRANSFERS: added
+ * Found bundle for host localhost: 0x5595f0a694e0 [can multiplex]
+ * Re-using existing connection! (#0) with host localhost
+ * Connected to localhost (::1) port 10443 (#0)
+ * Using Stream ID: 9 (easy handle 0x5595f0a72e30)
+ > GET /index.html?5 HTTP/2
+ > Host: localhost:10443
+ > user-agent: curl/7.68.0
+ > accept: */*
+ >
+ * stopped the pause stream!
+ * Connection #0 to host localhost left intact
+ curl: (16) Error in the HTTP2 framing layer
+
+ This error may posion the connection cache, causing future requests
+ which resolve to the same curl connection to go through the same error
+ path.
+
+ Closes #5643
-- curl: support parallel transfers
+- ftpserver: don't verify SMTP MAIL FROM names
- This is done by making sure each individual transfer is first added to a
- linked list as then they can be performed serially, or at will, in
- parallel.
+ Rely on tests asking the names to get refused instead - test servers
+ should be as dumb as possible. Edited test 914, 955 and 959 accordingly.
- Closes #3804
+ Closes #5639
-- docs/MANUAL.md: converted to markdown from plain text
+- curl_version_info.3: CURL_VERSION_KERBEROS4 is deprecated
- ... will make it render as a nicer web page.
+ This came up in #5640. It make sense to clarify this in the docs!
- Closes #4131
+ Reminded-by: Kamil Dudka
+ Closes #5642
-- curl_version_info: provide nghttp2 details
+Kamil Dudka (3 Jul 2020)
+- tool_getparam: make --krb option work again
- Introducing CURLVERSION_SIXTH with nghttp2 info.
+ It was disabled by mistake in commit curl-7_37_1-23-ge38ba4301.
- Closes #4121
+ Bug: https://bugzilla.redhat.com/1833193
+ Closes #5640
-- bump: start working on 7.66.0
+Daniel Stenberg (2 Jul 2020)
+- [Jeremy Maitin-Shepard brought this change]
-- source: remove names from source comments
+ http2: fix nghttp2_strerror -> nghttp2_http2_strerror in debug messages
- Several reasons:
+ Confusingly, nghttp2 has two different error code enums:
- - we can't add everyone who's helping out so its unfair to just a few
- selected ones.
- - we already list all helpers in THANKS and in RELEASE-NOTES for each
- release
- - we don't want to give the impression that some parts of the code is
- "owned" or "controlled" by specific persons
+ - nghttp2_error, to be used with nghttp2_strerror
+ - nghttp2_error_code, to be used with nghttp2_http2_strerror
- Assisted-by: Daniel Gustafsson
- Closes #4129
-
-Version 7.65.3 (19 Jul 2019)
+ Closes #5641
-Daniel Stenberg (19 Jul 2019)
-- RELEASE-NOTES: 7.65.3
-
-- THANKS: 7.65.3 status
-
-- progress: make the progress meter appear again
+Marcel Raad (2 Jul 2020)
+- url: silence MSVC warning
- Fix regression caused by 21080e1
+ Since commit f3d501dc678, if proxy support is disabled, MSVC warns:
+ url.c : warning C4701: potentially uninitialized local variable
+ 'hostaddr' used
+ url.c : error C4703: potentially uninitialized local pointer variable
+ 'hostaddr' used
- Reported-by: Chih-Hsuan Yen
- Fixes #4122
- Closes #4124
-
-- version: bump to 7.65.3
+ That could actually only happen if both `conn->bits.proxy` and
+ `CURL_DISABLE_PROXY` were enabled.
+ Initialize it to NULL to silence the warning.
+
+ Closes https://github.com/curl/curl/pull/5638
-- RELEASE-NOTES: Contributors or now 1990
+Daniel Stenberg (1 Jul 2020)
+- RELEASE-NOTES: synced
-Version 7.65.2 (17 Jul 2019)
+Version 7.71.1 (30 Jun 2020)
-Daniel Stenberg (17 Jul 2019)
-- RELEASE-NOTES: 7.65.2
+Daniel Stenberg (30 Jun 2020)
+- RELEASE-NOTES: curl 7.71.1
-- THANKS: add contributors from 7.65.2
+- THANKS: add contributors to 7.71.1
-Jay Satiro (17 Jul 2019)
-- [aasivov brought this change]
+- scripts/copyright.pl: skip .dcignore
- cmake: Fix finding Brotli on case-sensitive file systems
+- Revert "multi: implement wait using winsock events"
- - Find package "Brotli" instead of "BROTLI" since the former is the
- casing used for CMake/FindBrotli.cmake, and otherwise find_package
- may fail on a case-sensitive file system.
+ This reverts commit 8bc25c590e530de87595d1bb3577f699eb1309b9.
- Fixes https://github.com/curl/curl/issues/4117
+ That commit (from #5397) introduced a regression in 7.71.0.
+
+ Reported-by: tmkk on github
+ Fixes #5631
+ Closes #5632
+
+- TODO: Add flag to specify download directory
+
+- TODO: return code to CURLMOPT_PUSHFUNCTION to fail connection
-- CURLOPT_RANGE.3: Caution against using it for HTTP PUT
+- cirrus-ci: disable FreeBSD 13 (again)
- AFAICT CURLOPT_RANGE does not support ranged HTTP PUT uploads so I've
- cautioned against using it for that purpose and included a workaround.
+ It has been failing for a good while again. This time we better leave it
+ disabled until we have more reason to believe it behaves.
+
+ Closes #5628
+
+- ngtcp2: sync with current master
- Bug: https://curl.haxx.se/mail/lib-2019-04/0075.html
- Reported-by: Christopher Head
+ ngtcp2 added two new callbacks
- Closes https://github.com/curl/curl/issues/3814
+ Reported-by: Lucien Zürcher
+ Fixes #5624
+ Closes #5627
-- [Stefano Simonelli brought this change]
+- examples/multithread.c: call curl_global_cleanup()
+
+ Reported-by: qiandu2006 on github
+ Fixes #5622
+ Closes #5623
- CURLOPT_SEEKDATA.3: fix variable name
+- vtls: compare cert blob when finding a connection to reuse
- Closes https://github.com/curl/curl/pull/4118
+ Reported-by: Gergely Nagy
+ Fixes #5617
+ Closes #5619
-- [Giorgos Oikonomou brought this change]
+- RELEASE-NOTES: synced
- CIPHERS.md: Explain Schannel error SEC_E_ALGORITHM_MISMATCH
+- terminology: call them null-terminated strings
- If the SSL backend is Schannel and the user specifies an Schannel CALG_
- that is not supported by the protocol or the server then curl returns
- CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH.
+ Updated terminology in docs, comments and phrases to refer to C strings
+ as "null-terminated". Done to unify with how most other C oriented docs
+ refer of them and what users in general seem to prefer (based on a
+ single highly unscientific poll on twitter).
- Fixes https://github.com/curl/curl/issues/3389
- Closes https://github.com/curl/curl/pull/4106
-
-- [Daniel Gustafsson brought this change]
+ Reported-by: coinhubs on github
+ Fixes #5598
+ Closes #5608
- nss: inspect returnvalue of token check
+- http: fix proxy auth with blank password
- PK11_IsPresent() checks for the token for the given slot is available,
- and sets needlogin flags for the PK11_Authenticate() call. Should it
- return false, we should however treat it as an error and bail out.
+ Regression in 7.71.0
- Closes https://github.com/curl/curl/pull/4110
-
-- docs: Explain behavior change in --tlsv1. options since 7.54
+ Added test case 346 to verify.
- Since 7.54 --tlsv1. options use the specified version or later, however
- older versions of curl documented it as using just the specified version
- which may or may not have happened depending on the TLS library.
- Document this discrepancy to allay confusion for users familiar with the
- old documentation that expect just the specified version.
+ Reported-by: Kristoffer Gleditsch
+ Fixes #5613
+ Closes #5616
+
+- .dcignore: ignore tests and docs directories
- Fixes https://github.com/curl/curl/issues/4097
- Closes https://github.com/curl/curl/pull/4119
+ This is a config file for deepcode.ai, a static code analyzer.
-- libcurl: Restrict redirect schemes (follow-up)
+Jay Satiro (26 Jun 2020)
+- tool_cb_hdr: Fix etag warning output and return code
- - Allow FTPS on redirect.
+ - Return 'failure' on failure, to follow the existing style.
- - Update default allowed redirect protocols in documentation.
+ - Put Warning: and the warning message on the same line.
- Follow-up to 6080ea0.
+ Ref: https://github.com/curl/curl/issues/5610
- Ref: https://github.com/curl/curl/pull/4094
+ Closes https://github.com/curl/curl/pull/5612
+
+Daniel Stenberg (26 Jun 2020)
+- CURLOPT_READFUNCTION.3: provide the upload data size up front
- Closes https://github.com/curl/curl/pull/4115
+ Assisted-by: Jay Satiro
+ Closes #5607
-Daniel Stenberg (16 Jul 2019)
-- test1173: make it also check all libcurl option man pages
+- test1539: do a HTTP 1.0 POST without a set size (fails)
- ... and adjust those that cause errors
+ Attempt to reproduce #5593. Test case 1514 is very similar but uses
+ HTTP/1.1 and thus switches to chunked.
- Closes #4116
+ Closes #5595
-- curl: only accept COLUMNS less than 10000
+- [Baruch Siach brought this change]
+
+ mbedtls: fix build with disabled proxy support
- ... as larger values would rather indicate something silly (and could
- potentially cause buffer problems).
+ Don't reference fields that do not exist. Fixes build failure:
- Reported-by: pendrek at hackerone
- Closes #4114
-
-- dist: add manpage-syntax.pl
+ vtls/mbedtls.c: In function 'mbed_connect_step1':
+ vtls/mbedtls.c:249:54: error: 'struct connectdata' has no member named 'http_proxy'
- follow-up to 7fb66c403
+ Closes #5615
-- test1173: detect some basic man page format mistakes
+- codeql-analysis.yml: fix the 'languages' setting
- Triggered by PR #4111
-
- Closes #4113
+ It needs a 'with:' in front of it.
-Jay Satiro (15 Jul 2019)
-- [Bjarni Ingi Gislason brought this change]
+GitHub (26 Jun 2020)
+- [Daniel Stenberg brought this change]
- docs: Fix missing lines caused by undefined macros
+ gtihub: codeql-analysis.yml
- - Escape apostrophes at line start.
+ enables code security scanning with github actions
+
+Daniel Stenberg (25 Jun 2020)
+- tests: verify newline in username and password for HTTP
- Some lines begin with a "'" (apostrophe, single quote), which is then
- interpreted as a control character in *roff.
+ test 1296 is a simply command line test
- Such lines are interpreted as being a call to a macro, and if
- undefined, the lines are removed from the output.
+ test 1910 is a libcurl test including a redirect
+
+- url: allow user + password to contain "control codes" for HTTP(S)
- Bug: https://bugs.debian.org/926352
- Signed-off-by: Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+ Reported-by: Jon Johnson Jr
+ Fixes #5582
+ Closes #5592
+
+- escape: make the URL decode able to reject only %00 bytes
- Submitted-by: Alessandro Ghedini
+ ... or all "control codes" or nothing.
- Closes https://github.com/curl/curl/pull/4111
+ Assisted-by: Nicolas Sterchele
-Daniel Stenberg (14 Jul 2019)
-- libcurl-security.3: update to new CURLOPT_REDIR_PROTOCOLS defaults
+- http2: set the correct URL in pushed transfers
- follow-up to 6080ea098
+ ...previously CURLINFO_EFFECTIVE_URL would report the URL of the
+ original "mother transfer", not the actually pushed resource.
+
+ Reported-by: Jonathan Cardoso Machado
+ Fixes #5589
+ Closes #5591
-- [Linos Giannopoulos brought this change]
+Jay Satiro (25 Jun 2020)
+- [Javier Blazquez brought this change]
- libcurl: Add testcase for gopher redirects
+ openssl: Fix compilation on Windows when ngtcp2 is enabled
- The testcase ensures that redirects to CURLPROTO_GOPHER won't be
- allowed, by default, in the future. Also, curl is being used
- for convenience while keeping the testcases DRY.
+ - Include wincrypt before OpenSSL includes so that the latter can
+ properly handle any conflicts between the two.
- The expected error code is CURLE_UNSUPPORTED_PROTOCOL when the client is
- redirected to CURLPROTO_GOPHER
-
- Signed-off-by: Linos Giannopoulos <lgian@skroutz.gr>
-
-- [Linos Giannopoulos brought this change]
+ Closes https://github.com/curl/curl/pull/5606
- libcurl: Restrict redirect schemes
+Daniel Stenberg (25 Jun 2020)
+- test543: extended to verify zero length input
- All protocols except for CURLPROTO_FILE/CURLPROTO_SMB and their TLS
- counterpart were allowed for redirect. This vastly broadens the
- exploitation surface in case of a vulnerability such as SSRF [1], where
- libcurl-based clients are forced to make requests to arbitrary hosts.
+ As was reported in #5601
+
+- escape: zero length input should return a zero length output
- For instance, CURLPROTO_GOPHER can be used to smuggle any TCP-based
- protocol by URL-encoding a payload in the URI. Gopher will open a TCP
- connection and send the payload.
+ Regression added in 7.71.0.
- Only HTTP/HTTPS and FTP are allowed. All other protocols have to be
- explicitly enabled for redirects through CURLOPT_REDIR_PROTOCOLS.
+ Fixes #5601
+ Reported-by: Kristoffer Gleditsch
+ Closes #5602
+
+- Curl_inet_ntop: always check the return code
- [1]: https://www.acunetix.com/blog/articles/server-side-request-forgery-vulnerability/
+ Reported-by: Siva Sivaraman
+ Fixes #5412
+ Closes #5597
+
+- sendf: improve the message on client write errors
- Signed-off-by: Linos Giannopoulos <lgian@skroutz.gr>
+ Replace "Failed writing body (X != Y)" with
+ "Failure writing output to destination". Possibly slightly less cryptic.
- Closes #4094
+ Reported-by: coinhubs on github
+ Fixes #5594
+ Closes #5596
-- [Zenju brought this change]
+- RELEASE-NOTES: synced
- openssl: define HAVE_SSL_GET_SHUTDOWN based on version number
-
- Closes #4100
+- curlver: start working on 7.71.1
-- [Peter Simonyi brought this change]
+- [Denis BaruÄić brought this change]
- http: allow overriding timecond with custom header
+ DYNBUF.md: fix a typo: trail => tail
- With CURLOPT_TIMECONDITION set, a header is automatically added (e.g.
- If-Modified-Since). Allow this to be replaced or suppressed with
- CURLOPT_HTTPHEADER.
-
- Fixes #4103
- Closes #4109
+ Closes #5599
-Jay Satiro (11 Jul 2019)
-- [Juergen Hoetzel brought this change]
+Version 7.71.0 (23 Jun 2020)
- smb: Use the correct error code for access denied on file open
-
- - Return CURLE_REMOTE_ACCESS_DENIED for SMB access denied on file open.
-
- Prior to this change CURLE_REMOTE_FILE_NOT_FOUND was returned instead.
-
- Closes https://github.com/curl/curl/pull/4095
+Daniel Stenberg (23 Jun 2020)
+- RELEASE-NOTES: curl 7.71.0 release
-- [Daniel Gustafsson brought this change]
+- THANKS: curl 7.71.0 additions
- DEPRECATE: fixup versions and spelling
+- url: make sure pushed streams get an allocated download buffer
- Correctly set the July 17 version to 7.65.2, and update spelling to
- be consistent. Also fix a typo.
+ Follow-up to c4e6968127e876b0
- Closes https://github.com/curl/curl/pull/4107
-
-- [Gisle Vanem brought this change]
+ When a new transfer is created, as a resuly of an acknowledged push,
+ that transfer needs a download buffer allocated.
+
+ Closes #5590
- system_win32: fix clang warning
+Jay Satiro (22 Jun 2020)
+- openssl: Don't ignore CA paths when using Windows CA store
+
+ This commit changes the behavior of CURLSSLOPT_NATIVE_CA so that it does
+ not override CURLOPT_CAINFO / CURLOPT_CAPATH, or the hardcoded default
+ locations. Instead the CA store can now be used at the same time.
- - Declare variable in header as extern.
+ The change is due to the impending release. The issue is still being
+ discussed. The behavior of CURLSSLOPT_NATIVE_CA is subject to change and
+ is now documented as experimental.
- Bug: https://github.com/curl/curl/commit/48b9ea4#commitcomment-34084597
+ Ref: bc052cc (parent commit)
+ Ref: https://github.com/curl/curl/issues/5585
-Daniel Gustafsson (10 Jul 2019)
-- headers: Remove no longer exported functions
+- tool_operate: Don't use Windows CA store as a fallback
- There were a leftover few prototypes of Curl_ functions that we used to
- export but no longer do, this removes those prototypes and cleans up any
- comments still referring to them.
+ Background:
- Curl_write32_le(), Curl_strcpy_url(), Curl_strlen_url(), Curl_up_free()
- Curl_concat_url(), Curl_detach_connnection(), Curl_http_setup_conn()
- were made static in 05b100aee247bb9bec8e9a1b0166496aa4248d1c.
- Curl_http_perhapsrewind() made static in 574aecee208f79d391f10d57520b3.
+ 148534d added CURLSSLOPT_NATIVE_CA to use the Windows OS certificate
+ store in libcurl w/ OpenSSL on Windows. CURLSSLOPT_NATIVE_CA overrides
+ CURLOPT_CAINFO if both are set. The curl tool will fall back to
+ CURLSSLOPT_NATIVE_CA if it could not find a certificate bundle to set
+ via CURLOPT_CAINFO.
- For the remainder, I didn't trawl the Git logs hard enough to capture
- their exact time of deletion, but they were all gone: Curl_splayprint(),
- Curl_http2_send_request(), Curl_global_host_cache_dtor(),
- Curl_scan_cache_used(), Curl_hostcache_destroy(), Curl_second_connect(),
- Curl_http_auth_stage() and Curl_close_connections().
+ Problem:
- Closes #4096
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-- CMake: fix typos and spelling
-
-- [Kyle Edwards brought this change]
-
- CMake: Convert errant elseif() to else()
+ libcurl may be built with hardcoded paths to a certificate bundle or
+ directory, and if CURLSSLOPT_NATIVE_CA is used then those paths are
+ ignored.
- CMake interprets an elseif() with no arguments as elseif(FALSE),
- resulting in the elseif() block not being executed. That is not what
- was intended here. Change the empty elseif() to an else() as it was
- intended.
+ Solution:
- Closes #4101
- Reported-by: Artalus <artalus-mail@yandex.ru>
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ A solution is still being discussed but since there's an impending
+ release this commit removes using CURLSSLOPT_NATIVE_CA in the curl tool.
+
+ Ref: https://github.com/curl/curl/issues/5585
-- buildconf: fix header filename
+- openssl: Fix CA fallback logic for OpenSSL 3.0 build
- The header file inclusion had a typo, it should be .h and not .hd.
- Fix by renaming.
+ Prior to this change I assume a build error would occur when
+ CURL_CA_FALLBACK was used.
- Fixes #4102
- Reported-by: AceCrow on Github
+ Closes https://github.com/curl/curl/pull/5587
-- [Jan Chren brought this change]
+Daniel Stenberg (22 Jun 2020)
+- copyright: update mismatched copyright years
- configure: fix --disable-code-coverage
-
- This fixes the case when --disable-code-coverage supplied to ./configure
- would result in coverage="yes" being set.
+- test1460: verify that -Ji is not ok
+
+- tool_getparam: -i is not OK if -J is used
- Closes #4099
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Reported-by: sn on hackerone
+ Bug: https://curl.haxx.se/docs/CVE-2020-8177.html
-- cleanup: fix typo in comment
+- [Peter Wu brought this change]
-- RELEASE-NOTES: synced
+ CMake: ignore INTERFACE_LIBRARY targets for pkg-config file
+
+ Reviewed-by: Marcel Raad
+ Fixes #5512
+ Closes #5517
-Jay Satiro (6 Jul 2019)
-- [Daniel Gustafsson brought this change]
+- [Valentyn Korniienko brought this change]
- nss: support using libnss on macOS
-
- The file suffix for dynamically loadable objects on macOS is .dylib,
- which need to be added for the module definitions in order to get the
- NSS TLS backend to work properly on macOS.
+ multibyte: Fixed access-> waccess to file for Windows Plarform
- Closes https://github.com/curl/curl/pull/4046
+ Reviewed-by: Marcel Raad
+ Closes #5580
-- [Daniel Gustafsson brought this change]
+- altsvc: bump to h3-29
+
+ Closes #5584
- nss: don't set unused parameter
+- urlglob: treat literal IPv6 addresses with zone IDs as a host name
- The value of the maxPTDs parameter to PR_Init() has since at least
- NSPR 2.1, which was released sometime in 1998, been marked ignored
- as is accordingly not used in the initialization code. Setting it
- to a value when calling PR_Init() is thus benign, but indicates an
- intent which may be misleading. Reset the value to zero to improve
- clarity.
+ ... and not as a "glob". Now done by passing the supposed host to the
+ URL parser which supposedly will do a better job at identifying "real"
+ numerical IPv6 addresses.
- Closes https://github.com/curl/curl/pull/4054
+ Reported-by: puckipedia on github
+ Fixes #5576
+ Closes #5579
-- [Daniel Gustafsson brought this change]
+- test1179: verify error message for non-existing cmdline option
- nss: only cache valid CRL entries
+- tool_getparam: repair the error message for unknown flag
- Change the logic around such that we only keep CRLs that NSS actually
- ended up caching around for later deletion. If CERT_CacheCRL() fails
- then there is little point in delaying the freeing of the CRL as it
- is not used.
+ Follow-up to 9e5669f3880674
+ Detected by Coverity CID 1464582 ("Logically dead code")
- Closes https://github.com/curl/curl/pull/4053
+ Closes #5577
-- [Gergely Nagy brought this change]
+- FILEFORMAT: describe verify/stderr
- lib: Use UTF-8 encoding in comments
+- connect: improve happy eyeballs handling
- Some editors and IDEs assume that source files use UTF-8 file encodings.
- It also fixes the build with MSVC when /utf-8 command line option is
- used (this option is mandatory for some other open-source projects, this
- is useful when using the same options is desired for building all
- libraries of a project).
+ For QUIC but also for regular TCP when the second family runs out of IPs
+ with a failure while the first family is still trying to connect.
- Closes https://github.com/curl/curl/pull/4087
+ Separated the timeout handling for IPv4 and IPv6 connections when they
+ both have a number of addresses to iterate over.
-- [Caleb Raitto brought this change]
+- ngtcp2: never call fprintf() in lib code in release version
- CURLOPT_HEADEROPT.3: Fix example
+- ngtcp2: fix happy eyeballs quic connect crash
- Fix an issue where example builds a curl_slist, but fails to actually
- use it, or free it.
+ Reported-by: Peter Wu
+ Fixes #5565
+ Closes #5568
+
+- select: remove the unused ELAPSED_MS() macro
- Closes https://github.com/curl/curl/pull/4090
+ Closes #5573
-- [Shankar Jadhavar brought this change]
+Marc Hoersken (17 Jun 2020)
+- [rcombs brought this change]
- winbuild: Change Makefile to honor ENABLE_OPENSSL_AUTO_LOAD_CONFIG
+ multi: implement wait using winsock events
- - Made changes so that ENABLE_OPENSSL_AUTO_LOAD_CONFIG will be honored.
+ This avoids using a pair of TCP ports to provide wakeup functionality
+ for every multi instance on Windows, where socketpair() is emulated
+ using a TCP socket on loopback which could in turn lead to socket
+ resource exhaustion.
- - Also removed some ^M chars from file.
+ Reviewed-by: Gergely Nagy
+ Reviewed-by: Marc Hörsken
- Prior to this change while building on Windows platform even if we pass
- the ENABLE_OPENSSL_AUTO_LOAD_CONFIG option with value as "no" it does
- not set the CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG flag.
+ Closes #5397
+
+Daniel Stenberg (17 Jun 2020)
+- manpage: add three missing environment variables
- Closes https://github.com/curl/curl/pull/4086
+ CURL_SSL_BACKEND, QLOGDIR and SSLKEYLOGFILE
+
+ Closes #5571
-Daniel Stenberg (4 Jul 2019)
-- doh-url.d: added in 7.62.0
+- RELEASE-NOTES: synced
-Jay Satiro (30 Jun 2019)
-- docs: Fix links to OpenSSL docs
-
- OpenSSL changed their manual locations and does not redirect to the new
- locations.
+- configure: for wolfSSL, check for the DES func needed for NTLM
- Bug: https://curl.haxx.se/mail/lib-2019-06/0056.html
- Reported-by: Daniel Stenberg
+ Also adds pkg-config support for the wolfSSL detection.
-Daniel Stenberg (26 Jun 2019)
-- [Gaël PORTAY brought this change]
+- [Ruurd Beerstra brought this change]
- curl_multi_wait.3: escape backslash in example
+ ntlm: enable NTLM support with wolfSSL
- The backslash in the character Line Feed must be escaped.
+ When wolfSSL is built with its OpenSSL API layer, it fetures the same DES*
+ functions that OpenSSL has. This change take advantage of that.
- The current man-page outputs the code as following:
+ Co-authored-by: Daniel Stenberg
+ Closes #5556
+ Fixes #5548
+
+- http: move header storage to Curl_easy from connectdata
- fprintf(stderr, "curl_multi failed, code %d.0, mc);
+ Since the connection can be used by many independent requests (using
+ HTTP/2 or HTTP/3), things like user-agent and other transfer-specific
+ data MUST NOT be kept connection oriented as it could lead to requests
+ getting the wrong string for their requests. This struct data was
+ lingering like this due to old HTTP1 legacy thinking where it didn't
+ mattered..
- The commit fixes it as follow:
+ Fixes #5566
+ Closes #5567
+
+- CODE_REVIEW.md: how to do code reviews in curl
- fprintf(stderr, "curl_multi failed, code %d\n", mc);
+ Assisted-by: Daniel Gustafsson
+ Assisted-by: Rich Salz
+ Assisted-by: Hugo van Kemenade
+ Assisted-by: James Fuller
+ Assisted-by: Marc Hörsken
+ Assisted-by: Jay Satiro
- Closes #4079
+ Closes #5555
-- openssl: disable engine if OPENSSL_NO_UI_CONSOLE is defined
+- altsvc: remove the num field from the altsvc struct
- ... since that needs UI_OpenSSL() which isn't provided when OpenSSL is
- built with OPENSSL_NO_UI_CONSOLE which happens when OpenSSL is built for
- UWP (with "VC-WIN32-UWP").
+ It was superfluous since we have the list.size alredy
- Reported-by: Vasily Lobaskin
- Fixes #4073
- Closes #4077
+ Reported-by: Jay Satiro
+ Fixes #5553
+ Closes #5563
-- test1521: adapt to SLISTPOINT
+- version.d: expanded and alpha-sorted
- The header now has the slist-using options marked as SLISTPOINT so this
- makes sure test 1521 understands that.
+ Added a few missing features not previously mentioned. Ordered them
+ alphabetically.
- Follow-up to ae99b4de1c443ae989
-
- Closes #4074
+ Closes #5558
-- win32: make DLL loading a no-op for UWP
+- ABI.md: rename to .md and polish the markdown
- Reported-by: Michael Brehm
- Fixes #4060
- Closes #4072
-
-- [1ocalhost brought this change]
+ Closes #5562
- configure: fix typo '--disable-http-uath'
+- HELP-US: add a section for "smaller tasks"
- Closes #4076
-
-- [Niklas Hambüchen brought this change]
-
- docs: fix string suggesting HTTP/2 is not the default
+ The point of this section is to meet the CII Best Practices gold level
+ critera:
- Commit 25fd1057c9c86e3 made HTTP2 the default, and further down in the
- man page that new default is mentioned, but the section at the top
- contradicted it until now.
+ "The project MUST clearly identify small tasks that can be performed by
+ new or casual contributors"
- Also remove claim that setting the HTTP version is not sensible.
+ Closes #5560
+
+- TODO: retry on the redirected-to URL
- Closes #4075
+ Closes #5462
-- RELEASE-NOTES: synced
+- mailmap: Nicolas Sterchele
-- [Stephan Szabo brought this change]
+- [Nicolas Sterchele brought this change]
- tests: update fixed IP for hostip/clientip split
+ TODO: remove 19.3 section title
- These tests give differences for me on linux when using a hostip
- pointing to the external ip address for the local machine.
+ Follow-up to ad6416986755e417c66e2c6, which caused wrong formatting on
+ curl documentation website
- Closes #4070
+ Closes #5561
-Daniel Gustafsson (24 Jun 2019)
-- http: clarify header buffer size calculation
+- [Martin V brought this change]
+
+ test1560: avoid possibly negative association in wording
- The header buffer size calculation can from static analysis seem to
- overlow as it performs an addition between two size_t variables and
- stores the result in a size_t variable. Overflow is however guarded
- against elsewhere since the input to the addition is regulated by
- the maximum read buffer size. Clarify this with a comment since the
- question was asked.
+ Closes #5549
+
+- share: don't set the share flag it something fails
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ When asking for a specific feature to be shared in the share object,
+ that bit was previously set unconditionally even if the shared feature
+ failed or otherwise wouldn't work.
+
+ Closes #5554
-Daniel Stenberg (24 Jun 2019)
-- KNOWN_BUGS: Don't clear digest for single realm
+- buildconf: remove -print from the find command that removes files
- Closes #3267
+ It's just too annoying and unnecessary to get a long list of files shown
-- KNOWN_BUGS: Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
+- RELEASE-NOTES: synced
+
+- wording: avoid blacklist/whitelist stereotypes
+
+ Instead of discussing if there's value or meaning (implied or not) in
+ the colors, let's use words without the same possibly negative
+ associations.
- Closes #3284
+ Closes #5546
-- http2: call done_sending on end of upload
+Jay Satiro (9 Jun 2020)
+- tool_getparam: fix memory leak in parse_args
- To make sure a HTTP/2 stream registers the end of stream.
+ Prior to this change in Windows Unicode builds most parsed options would
+ not be freed.
- Bug #4043 made me find this problem but this fix doesn't correct the
- reported issue.
+ Found using _CrtDumpMemoryLeaks().
- Closes #4068
-
-- [James Brown brought this change]
+ Ref: https://github.com/curl/curl/issues/5545
- c-ares: honor port numbers in CURLOPT_DNS_SERVERS
+Daniel Stenberg (8 Jun 2020)
+- socks: detect connection close during handshake
- By using ares_set_servers_ports_csv on new enough c-ares.
+ The SOCKS4/5 state machines weren't properly terminated when the proxy
+ connection got closed, leading to a busy-loop.
- Fixes #4066
- Closes #4067
+ Reported-By: zloi-user on github
+ Fixes #5532
+ Closes #5542
-Daniel Gustafsson (24 Jun 2019)
-- CURLMOPT_SOCKETFUNCTION.3: fix typo
+- [James Fuller brought this change]
-Daniel Stenberg (24 Jun 2019)
-- [Koen Dergent brought this change]
-
- curl: skip CURLOPT_PROXY_CAPATH for disabled-proxy builds
+ multi: add defensive check on data->multi->num_alive
- Closes #4061
+ Closes #5540
-- test153: fix content-length to avoid occasional hang
+- Curl_addrinfo: use one malloc instead of three
+
+ To reduce the amount of allocations needed for creating a Curl_addrinfo
+ struct, make a single larger malloc instead of three separate smaller
+ ones.
- Closes #4065
+ Closes #5533
-- RELEASE-NOTES: synced
+- [Alessandro Ghedini brought this change]
-- multi: enable multiplexing by default (again)
+ quiche: update SSLKEYLOGFILE support
- It was originally made default in d7c4213bd0c (7.62.0) but mistakenly
- reverted in commit 2f44e94efb3d (7.65.0). Now enabled again.
+ quiche now requires the application to explicitly set the keylog path
+ for each connection, rather than reading the environment variable
+ itself.
- Closes #4051
+ Closes #5541
-- typecheck: add 3 missing strings and a callback data pointer
+- tests: add two simple tests for --login-options
+
+ Test 895 and 896 - as a follow-up to a3e972313b
- Closes #4050
+ Closes #5539
-- tests: add disable-scan.pl to dist
+- ngtcp2: update with recent API changes
- follow-up from 29177f422a5
+ Syncs with ngtcp2 commit 7e9a917d386d98 merged June 7 2020.
- Closes #4059
+ Assisted-by: Tatsuhiro Tsujikawa
+ Closes #5538
-- http2: don't call stream-close on already closed streams
-
- Closes #4055
+- [James Fuller brought this change]
-Marcel Raad (20 Jun 2019)
-- travis: enable alt-svc for coverage build
+ socks: remove unreachable breaks in socks.c and mime.c
- Closes
+ Closes #5537
-- travis: enable libssh2 for coverage build
+- tool_cfgable: free login_options at exit
- It was enabled by default before commit c92d2e14cfb.
-
- Disable torture tests 600 and 601 because of
- https://github.com/curl/curl/issues/1678.
-
- Closes
+ Memory leak
+ Reported-by: Geeknik Labs
+ Fixes #5535
+ Closes #5536
-- travis: disable threaded resolver for coverage build
+- libssh2: keep sftp errors as 'unsigned long'
- This enables more tests.
+ Remove weird work-around for storing the SFTP errors as int instead of
+ the "unsigned long" that libssh2 actually returns for SFTP errors.
- Closes
+ Closes #5534
-- travis: enable brotli for all xenial jobs
+Marc Hoersken (6 Jun 2020)
+- timeouts: move ms timeouts to timediff_t from int and long
- There's no need for a separate job, and no need to build it from source
- with Xenial.
+ Now that all functions in select.[ch] take timediff_t instead
+ of the limited int or long, we can remove type conversions
+ and related preprocessor checks to silence compiler warnings.
- Closes
-
-- travis: enable warnings-as-errors for coverage build
+ Avoiding conversions from time_t was already done in 842f73de.
- Closes
-
-GitHub (20 Jun 2019)
-- [Gisle Vanem brought this change]
+ Based upon #5262
+ Supersedes #5214, #5220 and #5221
+ Follow up to #5343 and #5479
+ Closes #5490
- system_win32: fix typo
+Daniel Stenberg (6 Jun 2020)
+- [François Rigault brought this change]
-Daniel Stenberg (20 Jun 2019)
-- typecheck: CURLOPT_CONNECT_TO takes an slist too
+ openssl: set FLAG_TRUSTED_FIRST unconditionally
- Additionally, add an alias in curl.h for slist-using options so that
- we can grep/parse those out at will.
+ On some systems, openssl 1.0.x is still the default, but it has been
+ patched to contain all the recent security fixes. As a result of this
+ patching, it is possible for macro X509_V_FLAG_NO_ALT_CHAINS to be
+ defined, while the previous behavior of openssl to not look at trusted
+ chains first, remains.
- Closes #4042
-
-- [Stephan Szabo brought this change]
+ Fix it: ensure X509_V_FLAG_TRUSTED_FIRST is always set, do not try to
+ probe for the behavior of openssl based on the existence ofmacros.
+
+ Closes #5530
- tests: support non-localhost HOSTIP for dict/smb servers
+- server/util: fix logmsg format using curl_off_t argument
- smbserver.py/dictserver.py were explicitly using localhost/127.0.0.1 for
- binding the server which when we were running the tests with a separate
- HOSTIP and CLIENTIP had failures verifying the server from the device we
- were testing.
+ ... this caused segfaults on armv7.
- This changes them to take the address from runtests.py and default to
- localhost/127.0.0.1 if none is given.
+ Regression added in dd0365d560aea5a (7.70.0)
- Closes #4048
+ Reviewed-by: Jay Satiro
+ Closes #5529
+
+- RELEASE-NOTES: synced
-- test1523: basic test of CURLOPT_LOW_SPEED_LIMIT
+- [Cherish98 brought this change]
-- configure: --disable-progress-meter
+ socks: fix expected length of SOCKS5 reply
- Builds libcurl without support for the built-in progress meter.
+ Commit 4a4b63d forgot to set the expected SOCKS5 reply length when the
+ reply ATYP is X'01'. This resulted in erroneously expecting more bytes
+ when the request length is greater than the reply length (e.g., when
+ remotely resolving the hostname).
- Closes #4023
+ Closes #5527
-- curl: improved skip-setopt-options when built with disabled features
+Marc Hoersken (5 Jun 2020)
+- .gitignore: add directory containing the stats repo
- Reduces #ifdefs in src/tool_operate.c
-
- Follow-up from 4e86f2fc4e6
- Closes #3936
+ Since the new curl/stats repository is designed to be
+ checked out into the curl repository working tree as stats/
+ it should be on the ignore list to aid in commit staging.
+
+Daniel Stenberg (5 Jun 2020)
+- [Adnan Khan brought this change]
-Steve Holme (18 Jun 2019)
-- netrc: Return the correct error code when out of memory
+ HTTP3.md: clarify cargo build directory
- Introduced in 763c5178.
+ Cargo needs to be called from within the 'quiche' directory.
- Closes #4036
+ Closes #5522
-Daniel Stenberg (18 Jun 2019)
-- config-os400: add getpeername and getsockname defines
+- user-agent.d: spell out what happens given a blank argument
- Reported-by: jonrumsey on github
- Fixes #4037
- Closes #4039
+ Closes #5525
-- runtests: keep logfiles around by default
+- trailers: switch h1-trailer logic to use dynbuf
- Make '-k' a no-op. The singletest function now clears the log directory
- BEFORE each individual test and not after, which makes it possible to
- always keep the logfiles around after a test has been run. No need to
- specify -k anymore. Keeping the option parsing around to work with users
- of old habits.
+ In the continued effort to remove "manual" realloc schemes.
- Some tests also didn't work properly when -k was used (since the old
- logs would be kep when a new test starts) which this change also fixes.
+ Closes #5524
+
+- CURLINFO_ACTIVESOCKET.3: clarify the description
- Closes #4035
+ Reported-by: Jay Satiro
+ Fixes #5299
+ Closes #5520
-- [Gergely Nagy brought this change]
+- mailmap: Don J Olmstead
- openssl: fix pubkey/signature algorithm detection in certinfo
+- configure: only strip first -L from LDFLAGS
- Certinfo gives the same result for all OpenSSL versions.
- Also made printing RSA pubkeys consistent with older versions.
+ In the logic that works out if a given OpenSSL path works, it stripped
+ off a possibly leading -L flag using an incorrect sed pattern which
+ would remove all instances of -L in the string, including if the path
+ itself contained that two-letter sequence!
- Reported-by: Michael Wallner
- Fixes #3706
- Closes #4030
+ The same pattern was used and is now updated in multiple places. Now it
+ only removes -L if it starts the strings.
+
+ Reported-by: Mohamed Osama
+ Fixes #5519
+ Closes #5521
-- conn_maxage: move the check to prune_dead_connections()
+Peter Wu (4 Jun 2020)
+- quiche: advertise draft 28 support
- ... and avoid the locking issue.
+ Fix the verbose message while at it, quiche currently supports draft
+ 27 and draft 28 simultaneously.
- Reported-by: Kunal Ekawde
- Fixes #4029
- Closes #4032
+ Closes #5518
-- tests: have runtests figure out disabled features
+Daniel Stenberg (4 Jun 2020)
+- KNOWN_BUGS: RTSP authentication breaks without redirect support
- ... so that runtests can skip individual test cases that test features
- that are explicitly disabled in this build. This new logic is intended
- for disabled features that aren't otherwise easily visible through the
- curl_version_info() or other API calls.
+ Closes #4750
+
+Jay Satiro (4 Jun 2020)
+- projects: Add crypt32.lib to dependencies for all OpenSSL configs
- tests/server/disabled is a newly built executable that will output a
- list of disabled features. Outputs nothing for a default build.
+ Windows project configurations that use OpenSSL with USE_WIN32_CRYPTO
+ need crypt32.
- Closes #3950
-
-- test188/189: fix Content-Length
+ Follow-up to 148534d which added CURLSSLOPT_NATIVE_CA for 7.71.0.
- This cures the flaky test results
+ The changes that are in this commit were made by script.
- Closes #4034
-
-- [Thomas Gamper brought this change]
-
- winbuild: use WITH_PREFIX if given
+ Ref: https://gist.github.com/jay/a1861b50ecce2b32931237180f856e28
- Closes #4031
+ Closes https://github.com/curl/curl/pull/5516
-Daniel Gustafsson (17 Jun 2019)
-- openssl: remove outdated comment
+Marc Hoersken (3 Jun 2020)
+- CI/macos: fix 'is already installed' errors by using bundle
- OpenSSL used to call exit(1) on syntax errors in OPENSSL_config(),
- which is why we switched to CONF_modules_load_file() and introduced
- a comment stating why. This behavior was however changed in OpenSSL
- commit abdd677125f3a9e3082f8c5692203590fdb9b860, so remove the now
- outdated and incorrect comment. The mentioned commit also declares
- OPENSSL_config() deprecated so keep the current coding.
+ Avoid failing CI builds due to nghttp2 being already installed.
- Closes #4033
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #5513
+
+Daniel Stenberg (3 Jun 2020)
+- altsvc: fix 'dsthost' may be used uninitialized in this function
-Daniel Stenberg (16 Jun 2019)
- RELEASE-NOTES: synced
-Patrick Monnerat (16 Jun 2019)
-- os400: make vsetopt() non-static as Curl_vsetopt() for os400 support.
+- urldata: let the HTTP method be in the set.* struct
- Use it in curl_easy_setopt_ccsid().
+ When the method is updated inside libcurl we must still not change the
+ method as set by the user as then repeated transfers with that same
+ handle might not execute the same operation anymore!
- Reported-by: jonrumsey on github
- Fixes #3833
- Closes #4028
-
-Daniel Stenberg (15 Jun 2019)
-- runtests: report single test time + total duration
+ This fixes the libcurl part of #5462
- ... after each successful test.
+ Test 1633 added to verify.
- Closes #4027
+ Closes #5499
-- multi: fix the transfer hash function
+- hostip: fix the memory-leak introduced in 67d2802
- Follow-up from 8b987cc7eb
-
- Reported-by: Tom van der Woerdt
- Fixes #4018
- Closes #4024
+ Fixes #5503
+ Closes #5504
-- unit1654: cleanup on memory failure
+- test970: make it require proxy support
- ... to make it handle torture tests properly.
+ This test verifies the -w %json output and the test case includes a full
+ generated "blob". If there's no proxy support built into libcurl, it
+ will return an error for proxy related info variables and they will not
+ be included in the json, thus causing a mismatch and this test fails.
- Reported-by: Marcel Raad
- Fixes #4021
- Closes #4022
+ Reported-by: Marc Hörsken
+ Fixes #5501
+ Closes #5502
-Marcel Raad (13 Jun 2019)
-- krb5: fix compiler warning
+- [Radoslav Georgiev brought this change]
+
+ examples/http2-down/upload: add error checks
- Even though the variable was used in a DEBUGASSERT, GCC 8 warned in
- debug mode:
- krb5.c:324:17: error: unused variable 'maj' [-Werror=unused-variable]
+ If `index.html` does not exist in the directory from which the example
+ is invoked, the fopen(upload, "rb") invocation in `setup` would fail,
+ returning NULL. This value is subsequently passed as the FILE* argument
+ of the `fread` invocation in the `read_callback` function, which is the
+ actual cause of the crash (apparently `fread` assumes that argument to
+ be non-null).
- Just suppress the warning and declare the variable unconditionally
- instead of only for DEBUGBUILD (which also missed the check for
- HAVE_ASSERT_H).
+ In addition, mitigate some possible crashes of similar origin.
- Closes https://github.com/curl/curl/pull/4020
+ Closes #5463
+
+- [kotoriã®ã­ã“ brought this change]
-Daniel Stenberg (13 Jun 2019)
-- quote.d: asterisk prefix works for SFTP as well
+ examples/ephiperfifo: turn off interval when setting timerfd
- Reported-by: Ben Voris
- Fixes #4017
- Closes #4019
+ Reported-by: therealhirudo on github
+ Fixes #5485
+ Closes #5497
+
+- [Saleem Abdulrasool brought this change]
-- multi: fix the transfer hashes in the socket hash entries
+ vtls: repair the build with `CURL_DISABLE_PROXY`
- - The transfer hashes weren't using the correct keys so removing entries
- failed.
+ `http_proxy` will not be available in `conndata` if `CURL_DISABLE_PROXY`
+ is enabled. Repair the build with that configuration.
- - Simplified the iteration logic over transfers sharing the same socket and
- they now simply are set to expire and thus get handled in the "regular"
- timer loop instead.
+ Follow-up to f3d501dc67
- Reported-by: Tom van der Woerdt
- Fixes #4012
- Closes #4014
+ Closes #5498
-Jay Satiro (12 Jun 2019)
-- [Cliff Crosland brought this change]
+- transfer: remove k->str NULL check
+
+ "Null-checking k->str suggests that it may be null, but it has already
+ been dereferenced on all paths leading to the check" - and it can't
+ legally be NULL at this point. Remove check.
+
+ Detected by Coverity CID 1463884
+
+ Closes #5495
- url: Fix CURLOPT_MAXAGE_CONN time comparison
+Marc Hoersken (1 Jun 2020)
+- select: always use Sleep in Curl_wait_ms on Win32
+
+ Since Win32 almost always will also have USE_WINSOCK,
+ we can reduce complexity and always use Sleep there.
- Old connections are meant to expire from the connection cache after
- CURLOPT_MAXAGE_CONN seconds. However, they actually expire after 1000x
- that value. This occurs because a time value measured in milliseconds is
- accidentally divided by 1M instead of by 1,000.
+ Assisted-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
- Closes https://github.com/curl/curl/pull/4013
+ Follow up to #5343
+ Closes #5489
-Daniel Stenberg (11 Jun 2019)
-- test1165: verify that CURL_DISABLE_ symbols are in sync
+Daniel Stenberg (31 May 2020)
+- conncache: download buffer needs +1 size for trailing zero
- between configure.ac and source code. They should be possible to switch
- on/off in configure AND be used in source code.
+ Follow-up to c4e6968127e
+ Detected by OSS-Fuzz: https://oss-fuzz.com/testcase-detail/5727799779524608
-- configure: remove CURL_DISABLE_TLS_SRP
+Marc Hoersken (31 May 2020)
+- azure: use matrix strategy to avoid configuration redundancy
- It isn't used by code so stop providing the define.
+ This also includes the following changes:
- Closes #4010
-
-- Revert "cmake: add SMB to list of disabled protocols if HTTP_ONLY is specified"
+ - Use the same timeout for all jobs on Linux (60 minutes)
+ and Windows (90 minutes)
+ - Use CLI stable apt-get install -y instead of apt install
+ which warns about that and run apt-get update first
+ - Enable MQTT for Windows msys2 builds instead of
+ legacy msys1 builds
+ - Add ./configure --prefix parameter to the msys2 builds
+ - The MSYSTEM environment variable is now preset inside
+ the container images for the msys2 builds
- This reverts commit 36738caeb78603ce24e3ea089a167b8c216fb938.
+ Note: on Azure Pipelines the matrix strategy is basically
+ just a simple list of job copies and not really a matrix.
- Apparently several of the appveyor windows builds broke.
-
-- [sergey-raevskiy brought this change]
+ Closes #5468
- cmake: add SMB to list of disabled protocols if HTTP_ONLY is specified
+Daniel Stenberg (30 May 2020)
+- build: disable more code/data when built without proxy support
- Reviewed-by: Jakub Zakrzewski
- Closes #3770
-
-- RELEASE-NOTES: synced
-
-- http2: remove CURL_DISABLE_TYPECHECK define
+ Added build to travis to verify
- ... in http2-less builds as it served no use.
+ Closes #5466
-- configure: more --disable switches to toggle off individual features
+- url: alloc the download buffer at transfer start
- ... actual support in the code for disabling these has already landed.
+ ... and free it as soon as the transfer is done. It removes the extra
+ alloc when a new size is set with setopt() and reduces memory for unused
+ easy handles.
- Closes #4009
-
-- wolfssl: fix key pinning build error
+ In addition: the closure_handle now doesn't use an allocated buffer at
+ all but the smallest supported size as a stack based one.
- follow-up from deb9462ff2de8
+ Closes #5472
-- CURLMOPT_SOCKETFUNCTION.3: clarified
+- timeouts: change millisecond timeouts to timediff_t from time_t
- Moved away the callback explanation from curl_multi_socket_action.3 and
- expanded it somewhat.
+ For millisecond timers we like timediff_t better. Also, time_t can be
+ unsigned so returning a negative value doesn't work then.
- Closes #4006
+ Closes #5479
-- wolfssl: fixup for SNI use
+Marc Hoersken (30 May 2020)
+- select: add overflow checks for timeval conversions
+
+ Using time_t and suseconds_t if suseconds_t is available,
+ long on Windows (maybe others in the future) and int elsewhere.
+
+ Also handle case of ULONG_MAX being greater or equal to INFINITE.
- follow-up from deb9462ff2de8
+ Assisted-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
- Closes #4007
+ Part of #5343
-- CURLOPT_CAINFO.3: polished wording
+- select: use timediff_t instead of time_t and int for timeout_ms
- Clarify the functionality when built to use Schannel and Secure
- Transport and stop calling it the "recommended" or "preferred" way and
- instead rather call it the default.
+ Make all functions in select.[ch] take timeout_ms as timediff_t
+ which should always be large enough and signed on all platforms
+ to take all possible timeout values and avoid type conversions.
- Removed the reference to the ssl comparison table as it isn't necessary.
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
- Reported-by: Richard Alcock
- Bug: https://curl.haxx.se/mail/lib-2019-06/0019.html
- Closes #4005
-
-GitHub (10 Jun 2019)
-- [Daniel Stenberg brought this change]
+ Replaces #5107 and partially #5262
+ Related to #5240 and #5286
+ Closes #5343
- SECURITY.md: created
+- unit1604.c: fix implicit conv from 'SANITIZEcode' to 'CURLcode'
+
+ GCC 10 warns about this with warning: implicit conversion
+ from 'SANITIZEcode' to 'CURLcode' [-Wenum-conversion]
+
+ Since 'expected_result' is not really of type 'CURLcode' and
+ it is not exposed in any way, we can just use 'SANITIZEcode'.
- Brief security policy description for use/display on github.
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Marcel Raad
+
+ Closes #5476
-Daniel Gustafsson (10 Jun 2019)
-- tool_cb_prg: Fix integer overflow in progress bar
+- tests/libtest: fix undefined reference to 'curlx_win32_fopen'
- Commit 61faa0b420c236480bc9ef6fd52b4ecc1e0f8d17 fixed the progress bar
- width calculation to avoid integer overflow, but failed to account for
- the fact that initial_size is initialized to -1 when the file size is
- retrieved from the remote on an upload, causing another signed integer
- overflow. Fix by separately checking for this case before the width
- calculation.
+ Since curl_setup.h now makes use of curlx_win32_fopen for Win32
+ builds with USE_WIN32_LARGE_FILES or USE_WIN32_SMALL_FILES defined,
+ we need to include the relevant files for tests using fopen,
+ because the libtest sources are also including curl_setup.h
- Closes #3984
- Reported-by: Brian Carpenter (Geeknik Labs)
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reviewed-by: Marcel Raad
+ Reviewed-by: Daniel Stenberg
+
+ Follow up to #3784 (ffdddb45d9)
+ Closes #5475
-Daniel Stenberg (10 Jun 2019)
-- wolfssl: refer to it as wolfSSL only
+- appveyor: add non-debug plain autotools-based build
- Remove support for, references to and use of "cyaSSL" from the source
- and docs. wolfSSL is the current name and there's no point in keeping
- references to ancient history.
+ This should enable us to catch linking issues with the
+ testsuite early, like the one described/fixed in #5475.
- Assisted-by: Daniel Gustafsson
+ Reviewed-by: Daniel Stenberg
+ Reviewed-by: Marcel Raad
- Closes #3903
+ Closes #5477
+Daniel Stenberg (29 May 2020)
- RELEASE-NOTES: synced
-- bindlocal: detect and avoid IP version mismatches in bind()
+- Revert "buildconf: use find -execdir"
- Reported-by: Alex Grebenschikov
- Fixes #3993
- Closes #4002
-
-- multi: make sure 'data' can present in several sockhash entries
-
- Since more than one socket can be used by each transfer at a given time,
- each sockhash entry how has its own hash table with transfers using that
- socket.
+ This partially reverts commit c712009838f44211958854de431315586995bc61.
- In addition, the sockhash entry can now be marked 'blocked = TRUE'"
- which then makes the delete function just set 'removed = TRUE' instead
- of removing it "for real", as a way to not rip out the carpet under the
- feet of a parent function that iterates over the transfers of that same
- sockhash entry.
+ Keep the ares_ files removed but bring back the older way to run find,
+ to make it work with busybox's find, as apparently that's being used.
- Reported-by: Tom van der Woerdt
- Fixes #3961
- Fixes #3986
- Fixes #3995
- Fixes #4004
- Closes #3997
+ Reported-by: Max Peal
+ Fixes #5483
+ Closes #5484
-- [Sorcus brought this change]
+- server/sws: fix asan warning on use of uninitialized variable
- libcurl-tutorial.3: Fix small typo (mutipart -> multipart)
+- libssh2: improved error output for wrong quote syntax
- Fixed-by: MrSorcus on github
- Closes #4000
+ Reported-by: Werner Stolz
+
+ Closes #5474
-- unpause: trigger a timeout for event-based transfers
+- mk-lib1521: generate code for testing BLOB options as well
- ... so that timeouts or other state machine actions get going again
- after a changing pause state. For example, if the last delivery was
- paused there's no pending socket activity.
+ Follow-up to cac5374298b3
- Reported-by: sstruchtrup on github
- Fixes #3994
- Closes #4001
+ Closes #5478
-Marcel Raad (9 Jun 2019)
-- travis: use xenial LLVM package for scan-build
+- configure: repair the check if argv can be written to
+
+ Due to bad escaping of the test code, the test wouldn't build and thus
+ result in a negative test result, which would lead to the unconditional
+ assumption that overwriting the arguments doesn't work and thus curl
+ would never hide credentials given in the command line, even when it
+ would otherwise be possible.
+
+ Regression from commit 2d4c2152c (7.60.0)
- I missed that in commit 99a49d6.
+ Reported-by: huzunhao on github
+ Fixes #5470
+ Closes #5471
-- travis: update scan-build job to xenial
+Peter Wu (28 May 2020)
+- CMake: rebuild Makefile.inc.cmake when Makefile.inc changes
- Closes https://github.com/curl/curl/pull/3999
+ Otherwise the build might fail due to missing source files, as
+ demonstrated by the recent keylog.c addition on an existing build dir.
+
+ Closes #5469
-Daniel Stenberg (8 Jun 2019)
-- bump: start working on 7.65.2
+Daniel Stenberg (28 May 2020)
+- urldata: fix comments: Curl_done() is called multi_done() now
+
+ ... since 575e885db
-Marcel Raad (5 Jun 2019)
-- examples/htmltitle: use C++ casts between pointer types
+Peter Wu (27 May 2020)
+- ngtcp2: use common key log routine for better thread-safety
- Compilers and static analyzers warn about using C-style casts here.
+ Tested with ngtcp2 built against the OpenSSL library. Additionally
+ tested with MultiSSL (NSS for TLS and ngtcp2+OpenSSL for QUIC).
- Closes https://github.com/curl/curl/pull/3975
+ The TLS backend (independent of QUIC) may or may not already have opened
+ the keylog file before. Therefore Curl_tls_keylog_open is always called
+ to ensure the file is open.
-- examples/fopen: fix comparison
+- wolfssl: add SSLKEYLOGFILE support
+
+ Tested following the same curl and tshark commands as in commit
+ "vtls: Extract and simplify key log file handling from OpenSSL" using
+ WolfSSL v4.4.0-stable-128-g5179503e8 from git master built with
+ `./configure --enable-all --enable-debug CFLAGS=-DHAVE_SECRET_CALLBACK`.
- As want is size_t, (file->buffer_pos - want) is unsigned, so checking
- if it's less than zero makes no sense.
- Check if file->buffer_pos is less than want instead to avoid the
- unsigned integer wraparound.
+ Full support for this feature requires certain wolfSSL build options,
+ see "Availability note" in lib/vtls/wolfssl.c for details.
- Closes https://github.com/curl/curl/pull/3975
+ Closes #5327
-- build: fix Codacy warnings
+- vtls: Extract and simplify key log file handling from OpenSSL
- Reduce variable scopes and remove redundant variable stores.
+ Create a set of routines for TLS key log file handling to enable reuse
+ with other TLS backends. Simplify the OpenSSL backend as follows:
- Closes https://github.com/curl/curl/pull/3975
-
-- sws: remove unused variables
+ - Drop the ENABLE_SSLKEYLOGFILE macro as it is unconditionally enabled.
+ - Do not perform dynamic memory allocation when preparing a log entry.
+ Unless the TLS specifications change we can suffice with a reasonable
+ fixed-size buffer.
+ - Simplify state tracking when SSL_CTX_set_keylog_callback is
+ unavailable. My original sslkeylog.c code included this tracking in
+ order to handle multiple calls to SSL_connect and detect new keys
+ after renegotiation (via SSL_read/SSL_write). For curl however we can
+ be sure that a single master secret eventually becomes available
+ after SSL_connect, so a simple flag is sufficient. An alternative to
+ the flag is examining SSL_state(), but this seems more complex and is
+ not pursued. Capturing keys after server renegotiation was already
+ unsupported in curl and remains unsupported.
- Unused since commit 2f44e94.
+ Tested with curl built against OpenSSL 0.9.8zh, 1.0.2u, and 1.1.1f
+ (`SSLKEYLOGFILE=keys.txt curl -vkso /dev/null https://localhost:4433`)
+ against an OpenSSL 1.1.1f server configured with:
- Closes https://github.com/curl/curl/pull/3975
-
-Version 7.65.1 (4 Jun 2019)
-
-Daniel Stenberg (4 Jun 2019)
-- RELEASE-NOTES: 7.65.1
+ # Force non-TLSv1.3, use TLSv1.0 since 0.9.8 fails with 1.1 or 1.2
+ openssl s_server -www -tls1
+ # Likewise, but fail the server handshake.
+ openssl s_server -www -tls1 -Verify 2
+ # TLS 1.3 test. No need to test the failing server handshake.
+ openssl s_server -www -tls1_3
+
+ Verify that all secrets (1 for TLS 1.0, 4 for TLS 1.3) are correctly
+ written using Wireshark. For the first and third case, expect four
+ matches per connection (decrypted Server Finished, Client Finished, HTTP
+ Request, HTTP Response). For the second case where the handshake fails,
+ expect a decrypted Server Finished only.
+
+ tshark -i lo -pf tcp -otls.keylog_file:keys.txt -Tfields \
+ -eframe.number -eframe.time -etcp.stream -e_ws.col.Info \
+ -dtls.port==4433,http -ohttp.desegment_body:FALSE \
+ -Y 'tls.handshake.verify_data or http'
+
+ A single connection can easily be identified via the `tcp.stream` field.
-- THANKS: new contributors from 7.65.1
+Daniel Stenberg (27 May 2020)
+- FILEFORMAT: add more features that tests can depend on
-Steve Holme (4 Jun 2019)
-- [Frank Gevaerts brought this change]
+- [Michael Kaufmann brought this change]
- ssl: Update outdated "openssl-only" comments for supported backends
+ transfer: close connection after excess data has been read
- These are for features that used to be openssl-only but were expanded
- over time to support other SSL backends.
+ For HTTP 1.x, it's a protocol error when the server sends more bytes
+ than announced. If this happens, don't reuse the connection, because the
+ start position of the next response is undefined.
- Closes #3985
+ Closes #5440
-Daniel Stenberg (4 Jun 2019)
-- curl_share_setopt.3: improve wording [ci ship]
-
- Reported-by: Carlos ORyan
+- [Estanislau Augé-Pujadas brought this change]
-Steve Holme (4 Jun 2019)
-- tool_parsecfg: Use correct return type for GetModuleFileName()
+ Revert "ssh: ignore timeouts during disconnect"
- GetModuleFileName() returns a DWORD which is a typedef of an unsigned
- long and not an int.
+ This reverts commit f31760e63b4e9ef1eb25f8f211390f8239388515. Shipped in
+ curl 7.54.1.
- Closes #3980
+ Bug: https://curl.haxx.se/mail/lib-2020-05/0068.html
+ Closes #5465
-Daniel Stenberg (3 Jun 2019)
-- TODO: "at least N milliseconds between requests" [ci skip]
+- urldata: connect related booleans live in struct ConnectBits
+
+ And remove a few unused booleans!
- Suggested-by: dkwolfe4 on github
- Closes #3920
+ Closes #5461
-Steve Holme (2 Jun 2019)
-- tests/server/.gitignore: Add socksd to the ignore list
+- hostip: on macOS avoid DoH when given a numerical IP address
- Missed in 04fd6755.
+ When USE_RESOLVE_ON_IPS is set (defined on macOS), it means that
+ numerical IP addresses still need to get "resolved" - but not with DoH.
- Closes #3978
+ Reported-by: Viktor Szakats
+ Fixes #5454
+ Closes #5459
-- tool_parsecfg: Fix control flow issue (DEADCODE)
+- ngtcp2: cleanup memory when failing to connect
- Follow-up to 8144ba38.
+ Reported-by: Peter Wu
+ Fixes #5447 (the ngtcp2 side of it)
+ Closes #5451
+
+- quiche: clean up memory properly when failing to connect
- Detected by Coverity CID 1445663
- Closes #3976
+ Addresses the quiche side of #5447
+ Reported-by: Peter Wu
+ Closes #5450
-Daniel Stenberg (2 Jun 2019)
-- [Sergey Ogryzkov brought this change]
+- cleanup: use a single space after equals sign in assignments
- NTLM: reset proxy "multipass" state when CONNECT request is done
+- url: accept "any length" credentials for proxy auth
- Closes #3972
-
-- test334: verify HTTP 204 response with chunked coding header
+ They're only limited to the maximum string input restrictions, not to
+ 256 bytes.
- Verifies that a bodyless response don't parse this content-related
- header.
+ Added test 1178 to verify
+
+ Reported-by: Will Roberts
+ Fixes #5448
+ Closes #5449
-- [Michael Kaufmann brought this change]
+- [Maksim Stsepanenka brought this change]
- http: don't parse body-related headers bodyless responses
+ test1167: fixes in badsymbols.pl
- Responses with status codes 1xx, 204 or 304 don't have a response body. For
- these, don't parse these headers:
+ Closes #5442
+
+- altsvc: fix parser for lines ending with CRLF
- - Content-Encoding
- - Content-Length
- - Content-Range
- - Last-Modified
- - Transfer-Encoding
+ Fixed the alt-svc parser to treat a newline as end of line.
- This change ensures that HTTP/2 upgrades work even if a
- "Content-Length: 0" or a "Transfer-Encoding: chunked" header is present.
+ The unit tests in test 1654 were done without CRLF and thus didn't quite
+ match the real world. Now they use CRLF as well.
- Co-authored-by: Daniel Stenberg
- Closes #3702
- Fixes #3968
- Closes #3977
+ Reported-by: Peter Wu
+ Assisted-by: Peter Wu
+ Assisted-by: Jay Satiro
+ Fixes #5445
+ Closes #5446
-- tls13-docs: mention it is only for OpenSSL >= 1.1.1
+Viktor Szakats (25 May 2020)
+- all: fix codespell errors
- Reported-by: Jay Satiro
- Co-authored-by: Jay Satiro
- Fixes #3938
- Closes #3946
+ Reviewed-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
+ Closes https://github.com/curl/curl/pull/5452
-- dump-header.d: spell out that no headers == empty file [ci skip]
+Peter Wu (25 May 2020)
+- ngtcp2: fix build with current ngtcp2 master implementing draft 28
- Reported-by: wesinator at github
- Fixes #3964
- Closes #3974
-
-- singlesocket: use separate variable for inner loop
+ Based on client.cc changes from ngtcp2. Tested with current git master,
+ ngtcp2 commit c77d5731ce92, nghttp3 commit 65ff479d4380.
- An inner loop within the singlesocket() function wrongly re-used the
- variable for the outer loop which then could cause an infinite
- loop. Change to using a separate variable!
+ Fixes #5444
+ Closes #5443
+
+Daniel Stenberg (25 May 2020)
+- RELEASE-NOTES: synced
- Reported-by: Eric Wu
- Fixes #3970
- Closes #3973
+ moved the new setopts up to a "change"
- RELEASE-NOTES: synced
-- [Josie Huddleston brought this change]
+- copyright: updated year ranges out of sync
+
+ ... and whitelisted a few more files in the the copyright.pl script.
+
+- [Gilles Vollant brought this change]
- http2: Stop drain from being permanently set on
+ setopt: add CURLOPT_PROXY_ISSUERCERT(_BLOB) for coherency
- Various functions called within Curl_http2_done() can have the
- side-effect of setting the Easy connection into drain mode (by calling
- drain_this()). However, the last time we unset this for a transfer (by
- calling drained_transfer()) is at the beginning of Curl_http2_done().
- If the Curl_easy is reused for another transfer, it is then stuck in
- drain mode permanently, which in practice makes it unable to write any
- data in the new transfer.
+ Closes #5431
+
+- curl: remove -J "informational" written on stdout
- This fix moves the last call to drained_transfer() to later in
- Curl_http2_done(), after the functions that could potentially call for a
- drain.
+ curl would previously show "curl: Saved to filename 'name from header'"
+ if -J was used and a name was picked from the Content-Disposition
+ header. That output could interfer with other stdout output, such as -w.
- Fixes #3966
- Closes #3967
- Reported-by: Josie-H
+ This commit removes that output line.
+ Bug: https://curl.haxx.se/mail/archive-2020-05/0044.html
+ Reported-by: Коваленко Ðнатолий Викторович
+ Closes #5435
-Steve Holme (29 May 2019)
-- conncache: Remove the DEBUGASSERT on length check
+Peter Wu (22 May 2020)
+- travis: simplify quiche build instructions wrt boringssl
- We trust the calling code as this is an internal function.
+ quiche builds boringssl as static library, reuse that instead of
+ building another shared library.
- Closes #3962
+ Closes #5438
-Jay Satiro (29 May 2019)
-- [Gisle Vanem brought this change]
+- configure: fix pthread check with static boringssl
+
+ A shared boringssl/OpenSSL library requires -lcrypto only for linking.
+ A static build additionally requires `-ldl -lpthread`. In the latter
+ case `-lpthread` is added to LIBS which prevented `-pthread` from being
+ added to CFLAGS. Clear LIBS to fix linking failures for libtest tests.
- system_win32: fix function prototype
+Daniel Stenberg (22 May 2020)
+- Revert "sendf: make failf() use the mvsnprintf() return code"
- - Change if_nametoindex parameter type from char * to const char *.
+ This reverts commit 74623551f306990e70c7c5515b88972005604a74.
- Follow-up to 09eef8af from this morning.
+ Instead mark the function call with (void). Getting the return code and
+ using it instead triggered Coverity warning CID 1463596 because
+ snprintf() can return a negative value...
- Bug: https://github.com/curl/curl/commit/09eef8af#r33716067
+ Closes #5441
-Marcel Raad (29 May 2019)
-- appveyor: add Visual Studio solution build
+- typecheck-gcc.h: CURLINFO_PRIVATE does not need a 'char *'
- Closes https://github.com/curl/curl/pull/3941
+ Reported-by: Billyzou0741326 on github
+ Fixes #5432
+ Closes #5436
-- appveyor: add support for other build systems
-
- Introduce BUILD_SYSTEM variable, which is currently always CMake.
+- tests/server/util.h: add extern to silence compiler warning
- Closes https://github.com/curl/curl/pull/3941
+ Follow-up from a3b0699d5c1
-Steve Holme (29 May 2019)
-- url: Load if_nametoindex() dynamically from iphlpapi.dll on Windows
+- typecheck-gcc.h: fix the OFF_T check
- This fixes the static dependency on iphlpapi.lib and allows curl to
- build for targets prior to Windows Vista.
+ The option number also needs to be less than CURLOPTTYPE_BLOB.
- This partially reverts 170bd047.
-
- Fixes #3960
- Closes #3958
-
-Daniel Stenberg (29 May 2019)
-- http: fix "error: equality comparison with extraneous parentheses"
+ Follow-up to cac5374298
+ Reported-by: Jeroen Ooms
+ Bug: https://github.com/curl/curl/pull/5365#issuecomment-631084114
-- parse_proxy: make sure portptr is initialized
+- TODO: --dry-run
- Reported-by: Benbuck Nason
-
- fixes #3959
+ Closes #5426
-- url: default conn->port to the same as conn->remote_port
-
- ... so that it has a sensible value when ConnectionExists() is called which
- needs it set to differentiate host "bundles" correctly on port number!
-
- Also, make conncache:hashkey() use correct port for bundles that are proxy vs
- host connections.
+- TODO: Ratelimit or wait between serial requests
- Probably a regression from 7.62.0
-
- Reported-by: Tom van der Woerdt
- Fixes #3956
- Closes #3957
+ Closes #5406
-- conncache: make "bundles" per host name when doing proxy tunnels
-
- Only HTTP proxy use where multiple host names can be used over the same
- connection should use the proxy host name for bundles.
+- tool_paramhlp: fixup C89 mistake
- Reported-by: Tom van der Woerdt
- Fixes #3951
- Closes #3955
+ Follow-up to c5f0a9db22.
+
+- [Siva Sivaraman brought this change]
-- multi: track users of a socket better
+ tool_paramhlp: fixed potentially uninitialized strtol() variable
- They need to be removed from the socket hash linked list with more care.
+ Seems highly unlikely to actually be possible, but better safe than
+ sorry.
- When sh_delentry() is called to remove a sockethash entry, remove all
- individual transfers from the list first. To enable this, each Curl_easy struct
- now stores a pointer to the sockethash entry to know how to remove itself.
+ Closes #5417
+
+- [Siva Sivaraman brought this change]
+
+ tool_operate: fixed potentially uninitialized variables
- Reported-by: Tom van der Woerdt and Kunal Ekawde
+ ... in curl_easy_getinfo() calls. They're harmless but clearing the
+ variables makes the code safer and comforts the reader.
- Fixes #3952
- Fixes #3904
- Closes #3953
+ Closes #5416
-Steve Holme (28 May 2019)
-- curl-win32.h: Enable Unix Domain Sockets based on the Windows SDK version
-
- Microsoft added support for Unix Domain Sockets in Windows 10 1803
- (RS4). Rather than expect the user to enable Unix Domain Sockets by
- uncommenting the #define that was added in 0fd6221f we use the RS4
- pre-processor variable that is present in newer versions of the
- Windows SDK.
+- sha256: move assign to the declaration line
- Closes #3939
+ Follow-up to fae30656. Should've been squashed with that commit...
-Daniel Stenberg (28 May 2019)
-- [Jonas Vautherin brought this change]
+- [Siva Sivaraman brought this change]
- cmake: support CMAKE_OSX_ARCHITECTURES when detecting SIZEOF variables
+ sha256: fixed potentially uninitialized variable
- Closes #3945
+ Closes #5414
-Marcel Raad (27 May 2019)
-- HAProxy tests: add keywords
+- sendf: make failf() use the mvsnprintf() return code
- Add the proxy and haproxy keywords in order to be able to exclude or
- run these specific tests.
+ ... and avoid a strlen() call. Fixes a MonocleAI warning.
- Closes https://github.com/curl/curl/pull/3949
-
-Daniel Stenberg (27 May 2019)
-- [Maksim Stsepanenka brought this change]
+ Reported-by: MonocleAI
+ Fixes #5413
+ Closes #5420
- tests: make test 1420 and 1406 work with rtsp-disabled libcurl
+- hostip: make Curl_printable_address not return anything
- Closes #3948
+ It was not used much anyway and instead we let it store a blank buffer
+ in case of failure.
+
+ Reported-by: MonocleAI
+ Fixes #5411
+ Closes #5418
-Kamil Dudka (27 May 2019)
-- [Hubert Kario brought this change]
+- ftp: mark return-ignoring calls to Curl_GetFTPResponse with (void)
+
+ They're done on purpose, make that visible in the code.
+ Reported-by: MonocleAI
+ Fixes #5412
+ Closes #549
- nss: allow to specify TLS 1.3 ciphers if supported by NSS
+- TODO: forbid TLS post-handshake auth and do TLS record padding
- Closes #3916
+ Closes #5396
+ Closes #5398
-Daniel Stenberg (26 May 2019)
- RELEASE-NOTES: synced
-- [Jay Satiro brought this change]
-
- Revert all SASL authzid (new feature) commits
-
- - Revert all commits related to the SASL authzid feature since the next
- release will be a patch release, 7.65.1.
+- dynbuf: return NULL when there's no buffer length
- Prior to this change CURLOPT_SASL_AUTHZID / --sasl-authzid was destined
- for the next release, assuming it would be a feature release 7.66.0.
- However instead the next release will be a patch release, 7.65.1 and
- will not contain any new features.
+ ... as returning a "" is not a good idea as the string is supposed to be
+ allocated and returning a const string will cause issues.
- After the patch release after the reverted commits can be restored by
- using cherry-pick:
-
- git cherry-pick a14d72c a9499ff 8c1cc36 c2a8d52 0edf690
-
- Details for all reverted commits:
-
- Revert "os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid()."
-
- This reverts commit 0edf6907ae37e2020722e6f61229d8ec64095b0a.
+ Reported-by: Brian Carpenter
+ Follow-up to ed35d6590e72c
+ Closes #5405
+
+Peter Wu (16 May 2020)
+- travis: upgrade to bionic, clang-9, improve readability
- Revert "tests: Fix the line endings for the SASL alt-auth tests"
+ Changes, partially to reduce build failures from external dependencies:
+ - Upgrade Ubuntu and drop unnecessary third-party repos.
+ - Properly clone apt config to ensure retries.
+ - Upgrade to clang-9 from the standard repos.
+ - Use Ubuntu 20.04 focal for the libssh build, use of ssh_get_publickey
+ fails on -Werror=deprecated-declarations in Ubuntu 18.04. Do not use
+ focal everywhere yet since Travis CI has not documented this option.
+ In focal, python-impacket (Py2.7) has been removed, leaving only
+ python3-impacket. Since it is only needed for SMB tests and not SSH,
+ skip it for the libssh job since it might need more work.
+ - apt: Remove gcc-8 and libstdc++-8-dev, already installed via g++-8.
- This reverts commit c2a8d52a1356a722ff9f4aeb983cd4eaf80ef221.
+ Non-functional cleanups:
+ - Simplify test matrix, drop redundant os and compiler keys.
+ - Deprecation fixes: remove sudo, rename matrix -> jobs.
+ - Every job has an 'env' key, put this key first in a list item.
- Revert "examples: Added SASL PLAIN authorisation identity (authzid) examples"
+ Closes #5370
+
+- travis: whitespace-only changes for consistency
- This reverts commit 8c1cc369d0c7163c6dcc91fd38edfea1f509ae75.
+ Automatically apply a consistent indentation with:
- Revert "curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool"
+ python3 -c 'from ruamel.yaml import YAML;y=YAML();d=y.load(open(".travis.yml"));y.width=500;y.dump(d,open(".travis.yml.new","w"))'
- This reverts commit a9499ff136d89987af885e2d7dff0a066a3e5817.
+ followed by manually re-indenting three comments.
- Revert "sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID"
+ Closes #5370
+
+- CMake: add libssh build support
- This reverts commit a14d72ca2fec5d4eb5a043936e4f7ce08015c177.
+ Closes #5372
-- [dbrowndan brought this change]
+Daniel Stenberg (15 May 2020)
+- KNOWN_BUGS: wolfssh: publickey auth doesn't work
+
+ Closes #4820
- FAQ: more minor updates and spelling fixes
+- KNOWN_BUGS: OS400 port requires deprecated IBM library
- Closes #3937
+ Closes #5176
-- RELEASE-NOTES: synced
+- [Vyron Tsingaras brought this change]
-- sectransp: handle errSSLPeerAuthCompleted from SSLRead()
+ http2: keep trying to send pending frames after req.upload_done
- Reported-by: smuellerDD on github
- Fixes #3932
- Closes #3933
-
-GitHub (24 May 2019)
-- [Gisle Vanem brought this change]
+ Fixes #1410
+ Closes #5401
- Fix typo.
+- [Gilles Vollant brought this change]
-Daniel Stenberg (23 May 2019)
-- tool_setopt: for builds with disabled-proxy, skip all proxy setopts()
+ setopt: support certificate options in memory with struct curl_blob
- Reported-by: Marcel Raad
- Fixes #3926
- Closes #3929
-
-Steve Holme (23 May 2019)
-- winbuild: Use two space indentation
+ This change introduces a generic way to provide binary data in setopt
+ options, called BLOBs.
- Closes #3930
-
-GitHub (23 May 2019)
-- [Gisle Vanem brought this change]
+ This change introduces these new setopts:
+
+ CURLOPT_ISSUERCERT_BLOB, CURLOPT_PROXY_SSLCERT_BLOB,
+ CURLOPT_PROXY_SSLKEY_BLOB, CURLOPT_SSLCERT_BLOB and CURLOPT_SSLKEY_BLOB.
+
+ Reviewed-by: Daniel Stenberg
+ Closes #5357
- tool_parse_cfg: Avoid 2 fopen() for WIN32
+- source cleanup: remove all custom typedef structs
- Using the memdebug.h mem-leak feature, I noticed 2 calls like:
- FILE tool_parsecfg.c:70 fopen("c:\Users\Gisle\AppData\Roaming\_curlrc","rt")
- FILE tool_parsecfg.c:114 fopen("c:\Users\Gisle\AppData\Roaming\_curlrc","rt")
+ - Stick to a single unified way to use structs
+ - Make checksrc complain on 'typedef struct {'
+ - Allow them in tests, public headers and examples
- No need for 'fopen(), 'fclose()' and a 'fopen()' yet again.
+ - Let MD4_CTX, MD5_CTX, and SHA256_CTX typedefs remain as they actually
+ typedef different types/structs depending on build conditions.
+
+ Closes #5338
-Daniel Stenberg (23 May 2019)
-- md4: include the mbedtls config.h to get the MD4 info
+- travis: remove the .checksrc fiddling
-- md4: build correctly with openssl without MD4
+- ftp: make domore_getsock() return the secondary socket properly
- Reported-by: elsamuko at github
- Fixes #3921
- Closes #3922
-
-Patrick Monnerat (23 May 2019)
-- os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
+ Previously, after PASV and immediately after the data connection has
+ connected, the function would only return the control socket to wait for
+ which then made the data connection simply timeout and not get polled
+ correctly. This become obvious when running test 1631 and 1632 event-
+ based.
-Daniel Stenberg (23 May 2019)
-- .github/FUNDING: mention our opencollective "home" [ci skip]
+- test1632: verify FTP through HTTPS-proxy with connection re-use
-Marcel Raad (23 May 2019)
-- [Zenju brought this change]
+- test1631: verify FTP download through HTTPS-proxy
- config-win32: add support for if_nametoindex and getsockname
+- sws: as last resort, get test number from server cmd file
- Closes https://github.com/curl/curl/pull/3923
-
-Jay Satiro (23 May 2019)
-- tests: Fix the line endings for the SASL alt-auth tests
+ If it can't be found in the request. Also support --cmdfile to set it to
+ a custom file name.
- - Change data and protocol sections to CRLF line endings.
+ runtests.pl always writes this file with the test number in it since a
+ while back.
+
+- ftp: shut down the secondary connection properly when SSL is used
- Prior to this change the tests would fail or hang, which is because
- certain sections such as protocol require CRLF line endings.
+ Reported-by: Neal Poole
+ Fixes #5340
+ Closes #5385
+
+Marcel Raad (14 May 2020)
+- KNOWN_BUGS: adapt 5.5 to recent changes
- Follow-up to a9499ff from today which added the tests.
+ It only applies to non-Unicode builds now.
+ Also merge 5.10 into it as it's effectively a duplicate.
- Ref: https://github.com/curl/curl/pull/3790
+ Closes https://github.com/curl/curl/pull/3784
-Daniel Stenberg (23 May 2019)
-- url: fix bad #ifdef
+- curl_setup: support Unicode functions to open files on Windows
- Regression since e91e48161235272ff485.
+ Use them only if `_UNICODE` is defined, in which case command-line
+ arguments have been converted to UTF-8.
- Reported-by: Tom Greenslade
- Fixes #3924
- Closes #3925
+ Closes https://github.com/curl/curl/pull/3784
-- Revert "progress: CURL_DISABLE_PROGRESS_METER"
+- tool: support UTF-16 command line on Windows
- This reverts commit 3b06e68b7734cb10a555f9d7e804dd5d808236a4.
+ - use `wmain` instead of `main` when `_UNICODE` is defined [0]
+ - define `argv_item_t` as `wchar_t *` in this case
+ - use the curl_multibyte gear to convert the command-line arguments to
+ UTF-8
- Clearly this change wasn't good enough as it broke CURLOPT_LOW_SPEED_LIMIT +
- CURLOPT_LOW_SPEED_TIME
+ This makes it possible to pass parameters with characters outside of
+ the current locale on Windows, which is required for some tests, e.g.
+ the IDN tests. Out of the box, this currently only works with the
+ Visual Studio project files, which default to Unicode, and winbuild
+ with the `ENABLE_UNICODE` option.
- Reported-by: Dave Reisner
+ [0] https://devblogs.microsoft.com/oldnewthing/?p=40643
- Fixes #3927
- Closes #3928
+ Ref: https://github.com/curl/curl/issues/3747
+ Closes https://github.com/curl/curl/pull/3784
-Steve Holme (22 May 2019)
-- examples: Added SASL PLAIN authorisation identity (authzid) examples
-
-- curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
-
-- sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
+- curl_multibyte: add to curlx
- Added the ability for the calling program to specify the authorisation
- identity (authzid), the identity to act as, in addition to the
- authentication identity (authcid) and password when using SASL PLAIN
- authentication.
+ This will also be needed in the tool and tests.
- Fixed #3653
- Closes #3790
+ Ref: https://github.com/curl/curl/pull/3758#issuecomment-482197512
+ Closes https://github.com/curl/curl/pull/3784
-Marc Hoersken (22 May 2019)
-- tests: add support to test against OpenSSH for Windows
+Daniel Stenberg (14 May 2020)
+- url: make the updated credentials URL-encoded in the URL
- Testing against OpenSSH for Windows requires v7.7.0.0 or newer
- due to the use of AllowUsers and DenyUsers. For more info see:
- https://github.com/PowerShell/Win32-OpenSSH/wiki/sshd_config
-
-Daniel Stenberg (22 May 2019)
-- bump: start on the next release
+ Found-by: Gregory Jefferis
+ Reported-by: Jeroen Ooms
+ Added test 1168 to verify. Bug spotted when doing a redirect.
+ Bug: https://github.com/jeroen/curl/issues/224
+ Closes #5400
-Marcel Raad (22 May 2019)
-- examples: fix "clarify calculation precedence" warnings
+- tests: add https-proxy support to the test suite
- Closes https://github.com/curl/curl/pull/3919
-
-- hiperfifo: remove unused variable
+ Initial test 1630 added with basic HTTPS-proxy use. HTTPS-proxy is like
+ HTTP proxy but with a full TLS connection to the proxy.
- Closes https://github.com/curl/curl/pull/3919
+ Closes #5399
-- examples: remove dead variable stores
-
- Closes https://github.com/curl/curl/pull/3919
+- mailmap: James Fuller
-- examples: reduce variable scopes
-
- Closes https://github.com/curl/curl/pull/3919
+- [Major_Tom brought this change]
-- http2-download: fix format specifier
+ vauth/cleartext: fix theoretical integer overflow
+
+ Fix theoretical integer overflow in Curl_auth_create_plain_message.
- Closes https://github.com/curl/curl/pull/3919
+ The security impact of the overflow was discussed on hackerone. We
+ agreed this is more of a theoretical vulnerability, as the integer
+ overflow would only be triggerable on systems using 32-bits size_t with
+ over 4GB of available memory space for the process.
+
+ Closes #5391
-Daniel Stenberg (22 May 2019)
-- PolarSSL: deprecate support step 1. Removed from configure.
+Jay Satiro (13 May 2020)
+- curl.1: Quote globbed URLs
- Also removed mentions from most docs.
+ - Quote the globbing example URLs that contain characters [] {} since
+ otherwise they may be interpreted as shell metacharacters.
- Discussed: https://curl.haxx.se/mail/lib-2019-05/0045.html
+ Bug: https://github.com/curl/curl/issues/5388
+ Reported-by: John Simpson
- Closes #3888
+ Closes https://github.com/curl/curl/pull/5394
-- configure/cmake: check for if_nametoindex()
+Daniel Stenberg (14 May 2020)
+- checksrc: enhance the ASTERISKSPACE and update code accordingly
- - adds the check to cmake
+ Fine: "struct hello *world"
- - fixes the configure check to work for cross-compiled windows builds
+ Not fine: "struct hello* world" (and variations)
- Closes #3917
+ Closes #5386
-- parse_proxy: use the IPv6 zone id if given
+- docs/options-in-versions: which version added each cmdline option
+
+ Added test 971 to verify that the list is in sync with the files in
+ cmdline-opts. The check also verifies that .d-files that uses Added:
+ specify the same version number as the options-in-versions file does.
- If the proxy string is given as an IPv6 numerical address with a zone
- id, make sure to use that for the connect to the proxy.
+ Closes #5381
+
+- docs: unify protocol lists
- Reported-by: Edmond Yu
+ We boast support for 25 transfer protocols. Make sure the lists are
+ consistent
- Fixes #3482
- Closes #3918
+ Closes #5384
-Version 7.65.0 (22 May 2019)
+- OpenSSL: have CURLOPT_CRLFILE imply CURLSSLOPT_NO_PARTIALCHAIN
+
+ ... to avoid an OpenSSL bug that otherwise makes the CRL check to fail.
+
+ Reported-by: Michael Kaufmann
+ Fixes #5374
+ Closes #5376
-Daniel Stenberg (22 May 2019)
-- RELEASE-NOTES: 7.65.0 release
+- tls13-ciphers.d: shorten the Arg
-- THANKS: from the 7.65.0 release-notes
+- sasl-authzid.d: add Arg: and shorten the desc
-- url: convert the zone id from a IPv6 URL to correct scope id
-
- Reported-by: GitYuanQu on github
- Fixes #3902
- Closes #3914
+- cert-type.d: mention the available types in the desc
-- configure: detect getsockname and getpeername on windows too
+- tool: shorten 3 --help descriptions
- Made detection macros for these two functions in the same style as other
- functions possibly in winsock in the hope this will work better to
- detect these functions when cross-compiling for Windows.
+ --happy-eyeballs-timeout-ms, --resolve and --ssl-revoke-best-effort
- Follow-up to e91e4816123
+ gen.pl already warned about these lines but we didn't listen
- Fixes #3913
- Closes #3915
+ Closes #5379
-Marcel Raad (21 May 2019)
-- examples: remove unused variables
-
- Fixes Codacy/CppCheck warnings.
+- configure: the wolfssh backend does not provide SCP
- Closes
+ Closes #5387
-Daniel Gustafsson (21 May 2019)
-- udpateconninfo: mark variable unused
+- RELEASE-NOTES: synced
+
+- url: reject too long input when parsing credentials
- When compiling without getpeername() or getsockname(), the sockfd
- paramter to Curl_udpateconninfo() became unused after commit e91e481612
- added ifdef guards.
+ Since input passed to libcurl with CURLOPT_USERPWD and
+ CURLOPT_PROXYUSERPWD circumvents the regular string length check we have
+ in Curl_setstropt(), the input length limit is enforced in
+ Curl_parse_login_details too, separately.
- Closes #3910
- Fixes https://curl.haxx.se/dev/log.cgi?id=20190520172441-32196
- Reviewed-by: Marcel Raad, Daniel Stenberg
+ Reported-by: Thomas Bouzerar
+ Closes #5383
+
+- list-only.d: this option existed already in 4.0
-- ftp: move ftp_ccc in under featureflag
+Jay Satiro (12 May 2020)
+- retry-all-errors.d: Shorten the summary line
- Commit e91e48161235272ff485ff32bd048c53af731f43 moved ftp_ccc in under
- the FTP featureflag in the UserDefined struct, but vtls callsites were
- still using it unprotected.
+ Follow-up to b995bb5 from a few moments ago.
- Closes #3912
- Fixes: https://curl.haxx.se/dev/log.cgi?id=20190520044705-29865
- Reviewed-by: Daniel Stenberg, Marcel Raad
-
-Daniel Stenberg (20 May 2019)
-- curl: report error for "--no-" on non-boolean options
+ Reported-by: Daniel Stenberg
- Reported-by: Olen Andoni
- Fixes #3906
- Closes #3907
+ Ref: https://github.com/curl/curl/commit/b995bb5#r39108929
-- [Guy Poizat brought this change]
+- [denzor brought this change]
- mbedtls: enable use of EC keys
+ easy: fix dangling pointer on easy_perform fail
- Closes #3892
+ Closes https://github.com/curl/curl/pull/5363
-- lib1560: add tests for parsing URL with too long scheme
+- tool: Add option --retry-all-errors to retry on any error
+
+ The "sledgehammer" of retrying.
- Ref: #3905
+ Closes https://github.com/curl/curl/pull/5185
-- [Omar Ramadan brought this change]
+Daniel Stenberg (12 May 2020)
+- [James Le Cuirot brought this change]
- urlapi: increase supported scheme length to 40 bytes
+ libcurl.pc: Merge Libs.private into Libs for static-only builds
- The longest currently registered URI scheme at IANA is 36 bytes long.
+ A project being built entirely statically will call pkg-config with
+ --static, which utilises the Libs.private field. Conversely it will
+ not use --static when not being built entirely statically, even if
+ there is only a static build of libcurl available. This will most
+ likely cause the build to fail due to underlinking unless we merge the
+ Libs fields.
- Closes #3905
- Closes #3900
-
-Marcel Raad (20 May 2019)
-- lib: reduce variable scopes
+ Consider that this is what the Meson build system does when it
+ generates pkg-config files.
- Fixes Codacy/CppCheck warnings.
+ I have also reflected this in the --libs argument of curl-config even
+ though REQUIRE_LIB_DEPS always seems to be "yes" anyway.
- Closes https://github.com/curl/curl/pull/3872
+ Closes #5373
-- tool_formparse: remove redundant assignment
-
- Just initialize word_begin with the correct value.
-
- Closes https://github.com/curl/curl/pull/3873
+- [Peter Wu brought this change]
-- ssh: move variable declaration to where it's used
+ CMake: fix runtests.pl with CMake, add new test targets
- This way, we need only one call to free.
+ * runtests.pl:
+ - Fix out-of-tree build under CMake when srcdir is not set. Default
+ srcdir to the location of runtests.pl.
+ - Add a hack to allow CMake to use the TFLAGS option as documented
+ in tests/README and used in scripts/travis/script.sh.
+ * Bump CMake version to 3.2 for USES_TERMINAL, dropping Debian Jessie
+ support (no one should care, it is already EOL.).
+ * Remove CTest since it defines its own 'test' target with no tests
+ since all unittests are already broken and not built by default.
+ * Add new test targets based on the options from Makefile.am. Since
+ new test targets are rarely added, I opted for duplicating the
+ runtests.pl options as opposed to creating a new Makefile.inc file.
+ Use top-level target names (test-x) instead of x-test since that is
+ used by CI and others.
- Closes https://github.com/curl/curl/pull/3873
+ Closes #5358
+
+- [Peter Wu brought this change]
-- ssh-libssh: remove unused variable
+ CMake: do not build test programs by default
- sock was only used to be assigned to fd_read.
+ The default target should only build libcurl and curl. Add a dedicated
+ 'testdeps' target which will be used later when running tests. Note that
+ unittests are currently broken in CMake and already excluded.
- Closes https://github.com/curl/curl/pull/3873
+ Closes #5368
-Daniel Stenberg (20 May 2019)
-- test332: verify the blksize fix
+- FILEFORMAT: moved up the variables section and further polished
-- tftp: use the current blksize for recvfrom()
+- runtests: remove ftp2 support, not used
- bug: https://curl.haxx.se/docs/CVE-2019-5436.html
- Reported-by: l00p3r on hackerone
- CVE-2019-5436
-
-Daniel Gustafsson (19 May 2019)
-- version: make ssl_version buffer match for multi_ssl
+ We once supported two separate ftp instances in the test suite. Has not
+ been used the last decade.
- When running a multi TLS backend build the version string needs more
- buffer space. Make the internal ssl_buffer stack buffer match the one
- in Curl_multissl_version() to allow for the longer string. For single
- TLS backend builds there is no use in extended to buffer. This is a
- fallout from #3863 which fixes up the multi_ssl string generation to
- avoid a buffer overflow when the buffer is too small.
-
- Closes #3875
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #5375
-Steve Holme (18 May 2019)
-- http_ntlm_wb: Handle auth for only a single request
+- url: sort the protocol schemes in rough popularity order
- Currently when the server responds with 401 on NTLM authenticated
- connection (re-used) we consider it to have failed. However this is
- legitimate and may happen when for example IIS is set configured to
- 'authPersistSingleRequest' or when the request goes thru a proxy (with
- 'via' header).
+ When looking for a protocol match among supported schemes, check the
+ most "popular" schemes first. It has zero functionality difference and
+ for all practical purposes a speed difference will not be measureable
+ but it still think it makes sense to put the least likely matches last.
- Implemented by imploying an additional state once a connection is
- re-used to indicate that if we receive 401 we need to restart
- authentication.
+ "Popularity" based on the 2019 user survey.
- Missed in fe6049f0.
+ Closes #5377
-- http_ntlm_wb: Cleanup handshake after clean NTLM failure
+Marc Hoersken (11 May 2020)
+- test1238: avoid tftpd being busy for tests shortly following
- Missed in 50b87c4e.
-
-- http_ntlm_wb: Return the correct error on receiving an empty auth message
+ The tftpd server may still be busy if the total timeout of
+ 25 seconds has not been reached or no sread error was received
+ during or after the execution of the timeout test 1238.
- Missed in fe20826b as it wasn't implemented in http.c in b4d6db83.
+ Once the next TFTP test comes around (eg. 1242 or 1243),
+ those will fail because the tftpd server is still waiting
+ on data from curl due to the UDP protocol being stateless
+ and having no connection close. On Linux this error may not
+ happen, because ICMP errors generated due to a swrite error
+ can also be returned async on the next sread call instead.
- Closes #3894
-
-Daniel Stenberg (18 May 2019)
-- curl: make code work with protocol-disabled libcurl
+ Therefore we will now just kill the tftpd server after test
+ 1238 to make sure that the following tests are not affected.
+
+ This enables us to no longer ignore tests 1242, 1243, 2002
+ and 2003 on the CI platforms CirrusCI and AppVeyor.
- Closes #3844
+ Assisted-by: Peter Wu
+ Closes #5364
-- libcurl: #ifdef away more code for disabled features/protocols
+Daniel Stenberg (11 May 2020)
+- write-out.d: added "response_code"
-- progress: CURL_DISABLE_PROGRESS_METER
+- KNOWN_BUGS: Build with staticly built dependency
+
+ I rewrote the item 5.4 to be more generic about static dependencies.
-- hostip: CURL_DISABLE_SHUFFLE_DNS
+- ROADMAP: remove old entries
+
+ MQTT - the start has already landed
+
+ tiny-curl - also mostly landed and is a continuous work
+
+ make menuconfig - basically no interest from users, not pushing there
-- netrc: CURL_DISABLE_NETRC
+- [Peter Wu brought this change]
-Viktor Szakats (16 May 2019)
-- docs: Markdown and misc improvements [ci skip]
+ travis: Add ngtcp2 and quiche tests for CMake
- Approved-by: Daniel Stenberg
- Closes #3896
+ To avoid an explosion of jobs, extend the existing CMake tests with
+ ngtcp2 and quiche support. macOS was previously moved to GitHub actions,
+ so the non-Linux case can be dropped.
-- docs/RELEASE-PROCEDURE: link to live iCalendar [ci skip]
-
- Ref: https://github.com/curl/curl/commit/0af41b40b2c7bd379b2251cbe7cd618e21fa0ea1#commitcomment-33563135
- Approved-by: Daniel Stenberg
- Closes #3895
+- [Peter Wu brought this change]
-Daniel Stenberg (16 May 2019)
-- travis: add an osx http-only build
+ CMake: add ENABLE_ALT_SVC option
- Closes #3887
+ Tested alt-svc with quiche. While at it, add missing MultiSSL reporting
+ (not tested).
-- cleanup: remove FIXME and TODO comments
-
- They serve very little purpose and mostly just add noise. Most of them
- have been around for a very long time. I read them all before removing
- or rephrasing them.
-
- Ref: #3876
- Closes #3883
+- [Peter Wu brought this change]
-- curl: don't set FTP options for FTP-disabled builds
+ CMake: add HTTP/3 support (ngtcp2+nghttp3, quiche)
- ... since libcurl has started to be totally unaware of options for
- disabled protocols they now return error.
+ Add three new CMake Find modules (using the curl license, but I grant
+ others the right to apply the CMake BSD license instead).
- Bug: https://github.com/curl/curl/commit/c9c5304dd4747cbe75d2f24be85920d572fcb5b8#commitcomment-33533937
+ This CMake config is simpler than the autotools one because it assumes
+ ngtcp2 and nghttp3 to be used together. Another difference is that this
+ CMake config checks whether QUIC is actually supported by the TLS
+ library (patched OpenSSL or boringssl) since this can be a common
+ configuration mistake that could result in build errors later.
- Reported-by: Marcel Raad
- Closes #3886
-
-Steve Holme (16 May 2019)
-- http_ntlm_wb: Move the type-2 message processing into a dedicated function
+ Unlike autotools, CMake does not warn you that the features are
+ experimental. The user is supposed to already know that and read the
+ documentation. It requires a very special build environment anyway.
- This brings the code inline with the other HTTP authentication mechanisms.
+ Tested with ngtcp2+OpenSSL+nghttp3 and quiche+boringssl, both built from
+ current git master. Use `LD_DEBUG=files src/curl |& grep need` to figure
+ out which features (libldap-2.4, libssh2) to disable due to conflicts
+ with boringssl.
- Closes #3890
-
-Daniel Stenberg (15 May 2019)
-- RELEASE-NOTES: synced
+ Closes #5359
-- docs/RELEASE-PROCEDURE: updated coming releases dates [ci skip]
-
-- CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [ci skip]
+Marc Hoersken (10 May 2020)
+- tests/server/tftpd.c: fix include and enhance debug logging
- Reported-by: Roy Bellingan
- Bug: #3885
-
-- parse_proxy: use the URL parser API
+ setjmp.h should only be included if HAVE_SETJMP_H is defined.
- As we treat a given proxy as a URL we should use the unified URL parser
- to extract the parts out of it.
+ Add additional log statements to see wether reads and writes
+ are blocking or finishing before an alarm signal is received.
- Closes #3878
+ Assisted-by: Peter Wu
+ Part of #5364
-Steve Holme (15 May 2019)
-- http_negotiate: Move the Negotiate state out of the negotiatedata structure
-
- Given that this member variable is not used by the SASL based protocols
- there is no need to have it here.
+Daniel Stenberg (10 May 2020)
+- tool_operate: only set CURLOPT_SSL_OPTIONS if SSL support is present
- Closes #3882
+ Reported-by: Marcel Raad
+ Follow-up to 148534db5
+ Fixes #5367
+ Closes #5369
-- http_ntlm: Move the NTLM state out of the ntlmdata structure
+Marc Hoersken (9 May 2020)
+- appveyor: update comments to be clear about toolchain
- Given that this member variable is not used by the SASL based protocols
- there is no need to have it here.
-
-- url: Move the negotiate state type into a dedicated enum
-
-- url: Remove duplicate clean up of the winbind variables in conn_shutdown()
+ - CMake-based MSYS builds use mingw-w64 to cross-compile.
+ - autotools-based builds are compiled using msys2-devel.
- Given that Curl_disconnect() calls Curl_http_auth_cleanup_ntlm() prior
- to calling conn_shutdown() and it in turn performs this, there is no
- need to perform the same action in conn_shutdown().
+ The difference is that the later ones are not cross-compiled
+ to Windows and instead require the msys2 runtime to be present.
- Closes #3881
+ At the moment only the Azure Pipelines CI builds actually
+ run autotools-based cross-compilation builds for Windows.
-Daniel Stenberg (14 May 2019)
-- urlapi: require a non-zero host name length when parsing URL
-
- Updated test 1560 to verify.
+- TODO: update regarding missing Schannel features
- Closes #3880
-
-- configure: error out if OpenSSL wasn't detected when asked for
+ Some aspects have already been implemented over the years.
- If --with-ssl is used and configure still couldn't enable SSL this
- creates an error instead of just silently ignoring the fact.
+ 15.1 Client certificates are now supported:
- Suggested-by: Isaiah Norton
- Fixes #3824
- Closes #3830
-
-Daniel Gustafsson (14 May 2019)
-- imap: Fix typo in comment
-
-Steve Holme (14 May 2019)
-- url: Remove unnecessary initialisation from allocate_conn()
+ - System stores via e35b0256eb34f1fe562e3e2a2615beb50a391c52
+ - PKCS#12 files via 0fdf96512613574591f501d63fe49495ba40e1d5
- No need to set variables to zero as calloc() does this for us.
+ 15.2 Ciphers can now be specified through:
- Closes #3879
-
-Daniel Stenberg (14 May 2019)
-- CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [ci skip]
+ - Algorithms via 9aefbff30d280c60fc9d8cc3e0b2f19fc70a2f28
- Clues-provided-by: Jay Satiro
- Clues-provided-by: Jeroen Ooms
- Fixes #3711
- Closes #3874
+ Reviewed-by: Daniel Stenberg and Marcel Raad
+ Closes #5358
-Daniel Gustafsson (13 May 2019)
-- vtls: fix potential ssl_buffer stack overflow
-
- In Curl_multissl_version() it was possible to overflow the passed in
- buffer if the generated version string exceeded the size of the buffer.
- Fix by inverting the logic, and also make sure to not exceed the local
- buffer during the string generation.
-
- Closes #3863
- Reported-by: nevv on HackerOne/curl
- Reviewed-by: Jay Satiro
- Reviewed-by: Daniel Stenberg
+Daniel Stenberg (8 May 2020)
+- checksrc: close the .checksrc file handle when done reading
-Daniel Stenberg (13 May 2019)
- RELEASE-NOTES: synced
+
+ And bumped next version to 7.71.0
-- appveyor: also build "/ci" branches like travis
-
-- pingpong: disable more when no pingpong enabled
+- [Gilles Vollant brought this change]
-- proxy: acknowledge DISABLE_PROXY more
+ CURLOPT_SSL_OPTIONS: add *_NATIVE_CA to use Windows CA store (with openssl)
+
+ Closes #4346
-- parsedate: CURL_DISABLE_PARSEDATE
+- TODO: native IDN support on macOS
-- sasl: only enable if there's a protocol enabled using it
+- urlapi: accept :: as a valid IPv6 address
+
+ Text 1560 is extended to verify.
+
+ Reported-by: Pavel Volgarev
+ Fixes #5344
+ Closes #5351
-- mime: acknowledge CURL_DISABLE_MIME
+- THANKS-filter: Peter Wang
-- wildcard: disable from build when FTP isn't present
+- [Peter Wang brought this change]
-- http: CURL_DISABLE_HTTP_AUTH
+ *_sspi: fix bad uses of CURLE_NOT_BUILT_IN
+
+ Return CURLE_AUTH_ERROR instead of CURLE_NOT_BUILT_IN for other
+ instances of QuerySecurityPackageInfo failing, as in
+ commit 2a81439553286f12cd04a4bdcdf66d8e026d8201.
+
+ Closes #5355
-- base64: build conditionally if there are users
+- docs/HTTP3: add qlog to the quiche build instruction
-- doh: CURL_DISABLE_DOH
+- ngtcp2: introduce qlog support
+
+ If the QLOGDIR environment variable is set, enable qlogging.
+
+ ... and create Curl_qlogdir() in the new generic vquic/vquic.c file for
+ QUIC functions that are backend independent.
+
+ Closes #5353
-Steve Holme (12 May 2019)
-- auth: Rename the various authentication clean up functions
+- ntlm_sspi: fix bad use of CURLE_NOT_BUILT_IN
- For consistency and to a avoid confusion.
+ That return code is reserved for build-time conditional code not being
+ present while this was a regular run-time error from a Windows API.
- Closes #3869
+ Reported-by: wangp on github
+ Fixes #5349
+ Closes #5350
-Daniel Stenberg (12 May 2019)
-- [Jay Satiro brought this change]
+- runtests: show elapsed test time with higher precision (ms)
- docs/INSTALL: fix broken link [ci skip]
-
- Reported-by: Joombalaya on github
- Fixes #3818
+- RELEASE-NOTES: synced
-Marcel Raad (12 May 2019)
-- easy: fix another "clarify calculation precedence" warning
+- http2: simplify and clean up trailer handling
- I missed this one in commit 6b3dde7fe62ea5a557fd1fd323fac2bcd0c2e9be.
-
-- build: fix "clarify calculation precedence" warnings
+ Triggered by a crash detected by OSS-Fuzz after the dynbuf introduction in
+ ed35d6590e72. This should make the trailer handling more straight forward and
+ hopefully less error-prone.
- Codacy/CppCheck warns about this. Consistently use parentheses as we
- already do in some places to silence the warning.
+ Deliver the trailer header to the callback already at receive-time. No
+ longer caches the trailers to get delivered at end of stream.
- Closes https://github.com/curl/curl/pull/3866
+ Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=22030
+ Closes #5348
-- cmake: restore C89 compatibility of CurlTests.c
-
- I broke it in d1b5cf830bfe169745721b21245d2217d2c2453e and
- 97de97daefc2ed084c91eff34af2426f2e55e134.
+Marc Hoersken (7 May 2020)
+- appveyor: disable test 1139 instead of ignoring it
- Reported-by: Viktor Szakats
- Ref: https://github.com/curl/curl/commit/97de97daefc2ed084c91eff34af2426f2e55e134#commitcomment-33499044
- Closes https://github.com/curl/curl/pull/3868
+ Spending time on manpage checking makes no sense
+ for these builds due to lacking manpage support.
-Steve Holme (11 May 2019)
-- http_ntlm: Corrected the name of the include guard
+- appveyor: disable flaky test 1501 and ignore broken 1056
- Missed in f0bdd72c.
+ Test 1501 is flaky on Windows CI due to being time sensitive
+ and the testsuite relying on taskkill.exe to check for the
+ existance of processes which can take to much time itself.
- Closes #3867
+ Test 1056 is broken in autotools-based Windows builds due
+ to scope ID support missing in these builds at the moment.
-- http_digest: Don't expose functions when HTTP and Crypto Auth are disabled
+- test613.pl: make tests 613 and 614 work with OpenSSH for Windows
- Closes #3861
-
-- http_negotiate: Don't expose functions when HTTP is disabled
+ OpenSSH for Windows shows group and other/world permissions as *,
+ because those concepts do not exist on Windows. It also does not
+ show the current or parent directory, so we just ignore those.
+
+ Reviewed-by: Daniel Stenberg
+ Closes #5328
-Daniel Stenberg (11 May 2019)
-- SECURITY-PROCESS: fix links [ci skip]
+Daniel Stenberg (6 May 2020)
+- runtests: set +x mode again
-Marcel Raad (11 May 2019)
-- CMake: suppress unused variable warnings
+- libssh2: convert over to use dynbuf
+
+ In my very basic test that lists sftp://127.0.0.1/tmp/, this patched
+ code makes 161 allocations compared to 194 in git master. A 17%
+ reduction.
- I missed these in commit d1b5cf830bfe169745721b21245d2217d2c2453e.
+ Closes #5336
-Daniel Stenberg (11 May 2019)
-- doh: disable DOH for the cases it doesn't work
+- travis: add "qlog" as feature in the quiche build
+
+- quiche: enable qlog output
- Due to limitations in Curl_resolver_wait_resolv(), it doesn't work for
- DOH resolves. This fix disables DOH for those.
+ quiche has the potential to log qlog files. To enable this, you must
+ build quiche with the qlog feature enabled `cargo build --features
+ qlog`. curl then passes a file descriptor to quiche, which takes
+ ownership of the file. The FD transfer only works on UNIX.
- Limitation added to KNOWN_BUGS.
+ The convention is to enable logging when the QLOGDIR environment is
+ set. This should be a path to a folder where files are written with the
+ naming template <SCID>.qlog.
- Fixes #3850
- Closes #3857
+ Co-authored-by: Lucas Pardue
+ Replaces #5337
+ Closes #5341
-Jay Satiro (11 May 2019)
-- checksrc.bat: Ignore snprintf warnings in docs/examples
-
- .. because we allow snprintf use in docs/examples.
+- urldata.h: remove #define HEADERSIZE, not used anymore
- Closes https://github.com/curl/curl/pull/3862
+ Follow-up to ed35d6590e72c
-Steve Holme (10 May 2019)
-- vauth: Fix incorrect function description for Curl_auth_user_contains_domain()
-
- ...and misalignment of these comments. From a78c61a4.
+- ngtcp2: convert to dynbuf
- Closes #3860
+ Closes #5335
-Jay Satiro (10 May 2019)
-- Revert "multi: support verbose conncache closure handle"
+- connect: make happy eyeballs work for QUIC (again)
- This reverts commit b0972bc.
+ Follow-up from dbd16c3e256c6c (regression in 7.70.0)
- - No longer show verbose output for the conncache closure handle.
+ Closes #5334
+
+- connect: add two asserts to clue code analyzers in a little
+
+- http_proxy: ported to use dynbuf instead of a static size buffer
- The offending commit was added so that the conncache closure handle
- would inherit verbose mode from the user's easy handle. (Note there is
- no way for the user to set options for the closure handle which is why
- that was necessary.) Other debug settings such as the debug function
- were not also inherited since we determined that could lead to crashes
- if the user's per-handle private data was used on an unexpected handle.
+ Removes a 16K static buffer from the easy handle. Simplifies the code.
+
+- dynbuf: introduce internal generic dynamic buffer functions
- The reporter here says he has a debug function to capture the verbose
- output, and does not expect or want any output to stderr; however
- because the conncache closure handle does not inherit the debug function
- the verbose output for that handle does go to stderr.
+ A common set of functions instead of many separate implementations for
+ creating buffers that can grow when appending data to them. Existing
+ functionality has been ported over.
- There are other plausible scenarios as well such as the user redirects
- stderr on their handle, which is also not inherited since it could lead
- to crashes when used on an unexpected handle.
+ In my early basic testing, the total number of allocations seem at
+ roughly the same amount as before, possibly a few less.
- Short of allowing the user to set options for the conncache closure
- handle I don't think there's much we can safely do except no longer
- inherit the verbose setting.
+ See docs/DYNBUF.md for a description of the API.
- Bug: https://curl.haxx.se/mail/lib-2019-05/0021.html
- Reported-by: Kristoffer Gleditsch
+ Closes #5300
+
+- runtests: remove sleep calls
- Ref: https://github.com/curl/curl/pull/3598
- Ref: https://github.com/curl/curl/pull/3618
+ Remove many one second sleeps that were done *after* each newly started
+ test server already has been verified. They should not have any purpose
+ there.
- Closes https://github.com/curl/curl/pull/3856
+ Closes #5323
-Steve Holme (10 May 2019)
-- ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup()
+- asyn-*: remove support for never-used NULL entry pointers
- From 6012fa5a.
+ ... and instead convert those to asserts to make sure they are truly
+ never NULL.
- Closes #3858
-
-Daniel Stenberg (9 May 2019)
-- BUG-BOUNTY: minor formatting fixes [ci skip]
+ Closes #5324
-- RELEASE-NOTES: synced
+- [Emil Engler brought this change]
-- BUG-BOUNTY.md: add the Dropbox "bonus" extra payout ability [ci skip]
+ doc: Rename VERSIONS to VERSIONS.md as it already has Markdown syntax
- Closes #3839
+ Closes #5325
-Kamil Dudka (9 May 2019)
-- http_negotiate: do not treat failure of gss_init_sec_context() as fatal
+Jay Satiro (2 May 2020)
+- asyn-thread: fix cppcheck warning
- Fixes #3726
- Closes #3849
-
-- spnego_gssapi: fix return code on gss_init_sec_context() failure
+ - Check for NULL entry parameter before attempting to deref entry in
+ Curl_resolver_is_resolved, like is already done in asyn-ares.
- Fixes #3726
- Closes #3849
-
-Steve Holme (9 May 2019)
-- gen_resp_file.bat: Removed unnecessary @ from all but the first command
+ This is to silence cppcheck which does not seem to understand that
+ asyn-ares and asyn-thread have separate Curl_resolver_is_resolved
+ and those units are mutually exclusive. Prior to this change it warned
+ of a scenario where asyn-thread's Curl_resolver_is_resolved is called
+ with a NULL entry from asyn-ares, but that couldn't happen.
- There is need to use @ on every command once echo has been turned off.
+ Reported-by: rl1987@users.noreply.github.com
- Closes #3854
+ Fixes https://github.com/curl/curl/issues/5326
-Jay Satiro (8 May 2019)
-- http: Ignore HTTP/2 prior knowledge setting for HTTP proxies
+- select: fix overflow protection in Curl_socket_check
- - Do not switch to HTTP/2 for an HTTP proxy that is not tunnelling to
- the destination host.
+ Follow-up to a96c752 which changed the timeout_ms type from time_t to
+ timediff_t.
- We already do something similar for HTTPS proxies by not sending h2. [1]
+ Ref: https://github.com/curl/curl/pull/5240
- Prior to this change setting CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE would
- incorrectly use HTTP/2 to talk to the proxy, which is not something we
- support (yet?). Also it's debatable whether or not that setting should
- apply to HTTP/2 proxies.
+ Closes https://github.com/curl/curl/pull/5286
+
+Marc Hoersken (2 May 2020)
+- sockfilt: make select_ws stop waiting on exit signal event
- [1]: https://github.com/curl/curl/commit/17c5d05
+ This makes sure that select_ws behaves similar to real select
+ which stops waiting on a signal handler being triggered.
- Bug: https://github.com/curl/curl/issues/3570
- Bug: https://github.com/curl/curl/issues/3832
+ This makes it possible to gracefully stop sockfilt.exe on
+ Windows with taskkill /IM sockfilt.exe (without /F force flag).
- Closes https://github.com/curl/curl/pull/3853
+ Reviewed-by: Jay Satiro
+ Part of #5260
-Marcel Raad (8 May 2019)
-- travis: update mesalink build to xenial
+- tests/server/util.[ch]: add exit event to stop waiting on Windows
- Closes https://github.com/curl/curl/pull/3842
-
-Daniel Stenberg (8 May 2019)
-- [Ricky Leverence brought this change]
-
- OpenSSL: Report -fips in version if OpenSSL is built with FIPS
+ This commit adds a global exit event to the test servers that
+ Windows-specific wait routines can use to get triggered if the
+ program was signaled to be terminated, eg. select_ws in sockfilt.c
- Older versions of OpenSSL report FIPS availabilty via an OPENSSL_FIPS
- define. It uses this define to determine whether to publish -fips at
- the end of the version displayed. Applications that utilize the version
- reported by OpenSSL will see a mismatch if they compare it to what curl
- reports, as curl is not modifying the version in the same way. This
- change simply adds a check to see if OPENSSL_FIPS is defined, and will
- alter the reported version to match what OpenSSL itself provides. This
- only appears to be applicable in versions of OpenSSL <1.1.1
+ The exit event will be managed by the signal handling code and is
+ set to not reset automatically to support multiple wait routines.
- Closes #3771
+ Reviewed-by: Jay Satiro
+ Closes #5260
-Kamil Dudka (7 May 2019)
-- [Frank Gevaerts brought this change]
+- tests/server/util.c: fix thread handle not being closed
+
+ Reviewed-by: Jay Satiro
+ Part of #5260
- nss: allow fifos and character devices for certificates.
+- tests/server/util.c: use raise instead of calling signal handler
- Currently you can do things like --cert <(cat ./cert.crt) with (at least) the
- openssl backend, but that doesn't work for nss because is_file rejects fifos.
+ Use raise to trigger signal handler instead of calling it
+ directly and causing potential unexpected control flow.
- I don't actually know if this is sufficient, nss might do things internally
- (like seeking back) that make this not work, so actual testing is needed.
+ Reviewed-by: Jay Satiro
+ Part of #5260
+
+- tests: add support for SSH server variant specific transfer paths
+
+ OpenSSH for Windows requires paths in the format of /C:/
+ instead of the pseudo-POSIX paths /cygdrive/c/ or just /c/
- Closes #3807
+ Reviewed-by: Daniel Stenberg
+ Closes #5298
-Daniel Gustafsson (6 May 2019)
-- test2100: Fix typos in test description
+Daniel Stenberg (2 May 2020)
+- RELEASE-NOTES: synced
-Daniel Stenberg (6 May 2019)
-- ssh: define USE_SSH if SSH is enabled (any backend)
+- libssh2: set the expected total size in SCP upload init
+
+ ... as otherwise the progress callback gets called without that
+ information, making the progress meter have less info.
- Closes #3846
+ Reported-by: Murugan Balraj
+ Bug: https://curl.haxx.se/mail/archive-2020-05/0000.html
+ Closes #5317
-Steve Holme (5 May 2019)
-- winbuild: Add our standard copyright header to the winbuild batch files
+- runtests: make the logmsg from the ssh server only show in verbose
-- makedebug: Fix ERRORLEVEL detection after running where.exe
+- tests: make test 1248 + 1249 use %NOLISTENPORT
- Closes #3838
-
-Daniel Stenberg (5 May 2019)
-- urlapi: add CURLUPART_ZONEID to set and get
+ ... instead of a port of a non-running server so that it works
+ stand-alone.
- The zoneid can be used with IPv6 numerical addresses.
+ Closes #5318
+
+- examples: remove asiohiper.cpp
- Updated test 1560 to verify.
+ This example has repeatedly been reported to contain bugs, and as users
+ copy and paste code from this into production, I now deem it better to
+ not provide the example at all.
- Closes #3834
+ Closes #5090
+ Closes #5322
-- [Taiyu Len brought this change]
+- [Emil Engler brought this change]
- WRITEFUNCTION: add missing set_in_callback around callback
+ doc: add missing closing parenthesis in CURLINFO_SSL_VERIFYRESULT.3
- Closes #3837
+ Closes #5320
-- RELEASE-NOTES: synced
+- [Emil Engler brought this change]
-- CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [ci skip]
+ KNOWN_BUGS: Remove "curl --upload-file . hang if delay in STDIN"
- Reported-by: Ricardo Gomes
+ It was fixed in 9a2cbf3
- Bug: #3537
- Closes #3836
+ Closes #5319
-- CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value
+- cirrus: disable SFTP and SCP tests
- The time field in the curl_fileinfo struct will always be zero. No code
- was ever implemented to actually convert the date string to a time_t.
+ ... as we can't seem to start the sshd server on it. Those problems
+ existed before d1239b50bececd (running the SSH server on a random port),
+ but they're more noticable now since there are more failed attempts in
+ the logs.
- Fixes #3829
- Closes #3835
+ Closes #5315
-- OS400/ccsidcurl.c: code style fixes
+- [Emil Engler brought this change]
-- OS400/ccsidcurl: replace use of Curl_vsetopt
-
- (and make the code style comply)
+ runtests: fix typo in the existence of disabled tests checker
- Fixes #3833
+ Closes #5316
-- urlapi: strip off scope id from numerical IPv6 addresses
-
- ... to make the host name "usable". Store the scope id and put it back
- when extracting a URL out of it.
+Dan Fandrich (30 Apr 2020)
+- test75: Remove precheck test
- Also makes curl_url_set() syntax check CURLUPART_HOST.
-
- Fixes #3817
- Closes #3822
-
-- RELEASE-NOTES: synced
+ This has not been needed since commit 9fa42bed and often prevents it
+ from running at all with dynamic test ports.
-- multiif.h: remove unused protos
-
- ... for functions related to pipelining. Those functions were removed in
- 2f44e94efb3df.
+- tests: Stop referring to server ports when they're not used
- Closes #3828
+ Several tests referred to specific server ports even when the test
+ didn't actually use that server or specify that it's needed. In such
+ cases, the test harness substitutes the text "[not running]" as the port
+ number which causes many such tests to fail due to the inability to
+ parse the URL. These tests are changed to use %NOLISTENPORT which will
+ always be substituted correctly.
-- [Yiming Jing brought this change]
+Daniel Stenberg (30 Apr 2020)
+- [Emil Engler brought this change]
- travis: mesalink: temporarily disable test 3001
+ GnuTLS: Backend support for CURLINFO_SSL_VERIFYRESULT
- ... due to SHA-1 signatures in test certs
+ Closes #5287
-- [Yiming Jing brought this change]
-
- travis: upgrade the MesaLink TLS backend to v1.0.0
+- conncache: various concept cleanups
- Closes #3823
- Closes #3776
-
-- ConnectionExists: improve non-multiplexing use case
+ More connection cache accesses are protected by locks.
- - better log output
+ CONNCACHE_* is a beter prefix for the connection cache lock macros.
- - make sure multiplex is enabled for it to be used
-
-- multi: provide Curl_multiuse_state to update information
+ Curl_attach_connnection: now called as soon as there's a connection
+ struct available and before the connection is added to the connection
+ cache.
- As soon as a TLS backend gets ALPN conformation about the specific HTTP
- version it can now set the multiplex situation for the "bundle" and
- trigger moving potentially queued up transfers to the CONNECT state.
-
-- process_pending_handles: mark queued transfers as previously pending
+ Curl_disconnect: now assumes that the connection is already removed from
+ the connection cache.
- With transfers being queued up, we only move one at a a time back to the
- CONNECT state but now we mark moved transfers so that when a moved
- transfer is confirmed "successful" (it connected) it will trigger the
- move of another pending transfer. Previously, it would otherwise wait
- until the transfer was done before doing this. This makes queued up
- pending transfers get processed (much) faster.
+ Ref: #4915
+ Closes #5009
-- http: mark bundle as not for multiuse on < HTTP/2 response
+- tests: tests: run stunnel for HTTPS and FTPS on dynamic ports
+
+ As stunnel is an external tool and it has no specific option to export
+ the actually used port number when asked to listen to 0, runtests
+ instead iterates over ten randomly picked high number ports and sticks
+ to the first one stunnel can listen to.
- Fixes #3813
- Closes #3815
+ Closes #5267
-Daniel Gustafsson (1 May 2019)
-- cookie: Guard against possible NULL ptr deref
+- tests: pick a random port number for SSH
- In case the name pointer isn't set (due to memory pressure most likely)
- we need to skip the prefix matching and reject with a badcookie to avoid
- a possible NULL pointer dereference.
+ Since sshd doesn't have such an option by itself, we iterate over a
+ series of random ports until one works.
- Closes #3820 #3821
- Reported-by: Jonathan Moerman
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #5273
-Patrick Monnerat (30 Apr 2019)
-- os400: Add CURLOPT_MAXAGE_CONN to ILE/RPG bindings
+- [Rikard Falkeborn brought this change]
-Kamil Dudka (29 Apr 2019)
-- nss: provide more specific error messages on failed init
+ libtest/cmake: Remove commented code
- Closes #3808
-
-Daniel Stenberg (29 Apr 2019)
-- [Reed Loden brought this change]
+ These were commented out in e9dd0998706a when Makefile.inc was included
+ instead. 11 years have passed since then and the commented code is of
+ course very outdated. Remove it to avoid confusion.
+
+ Closes #5311
- docs: minor polish to the bug bounty / security docs
+- schannel: source code reindent
+
+ White space edits only. Conform better to standard curl source code
+ indenting style.
- Closes #3811
+ Closes #5305
-- CURL_MAX_INPUT_LENGTH: largest acceptable string input size
+Kamil Dudka (29 Apr 2020)
+- test1177: look for curl.h in source directory
- This limits all accepted input strings passed to libcurl to be less than
- CURL_MAX_INPUT_LENGTH (8000000) bytes, for these API calls:
- curl_easy_setopt() and curl_url_set().
+ If we use a separate build directory, there is no copy of the header.
- The 8000000 number is arbitrary picked and is meant to detect mistakes
- or abuse, not to limit actual practical use cases. By limiting the
- acceptable string lengths we also reduce the risk of integer overflows
- all over.
+ Closes #5310
+
+- tests: look for preprocessed tests in build directory
- NOTE: This does not apply to `CURLOPT_POSTFIELDS`.
+ ... which is not always the same directory as source directory
- Test 1559 verifies.
+ Closes #5310
+
+Daniel Stenberg (29 Apr 2020)
+- RELEASE-NOTES: synced
- Closes #3805
+ ... and bumped curlver.h to 7.70.1
-- [Tseng Jun brought this change]
+Version 7.70.0 (29 Apr 2020)
- curlver.h: use parenthesis in CURL_VERSION_BITS macro
-
- Closes #3809
+Daniel Stenberg (29 Apr 2020)
+- RELEASE-NOTES: 7.70.0
-Marcel Raad (27 Apr 2019)
-- [Simon Warta brought this change]
+- THANKS: synced with the 7.70.0 release
- cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP
-
- Closes https://github.com/curl/curl/pull/3769
+- headers: copyright range fix
-Steve Holme (23 Apr 2019)
-- ntlm: Missed pre-processor || (or) during rebase for cd15acd0
+- [Rikard Falkeborn brought this change]
-- ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4
+ doh: Constify some input pointers
- Just like we do for mbed TLS, use our local implementation of MD4 when
- OpenSSL doesn't support it. This allows a type-3 message to include the
- NT response.
+ Closes #5306
-Daniel Gustafsson (23 Apr 2019)
-- INTERNALS: fix misindentation of ToC item
+- nss: check for PK11_CreateDigestContext() returning NULL
- Kerberos was incorrectly indented as a subsection under FTP, which is
- incorrect as they are both top level sections. A fix for this was first
- attempted in commit fef38a0898322f285401c5ff2f5e7c90dbf3be63 but that
- was a few paddles short of being complete.
-
-- [Aron Bergman brought this change]
-
- INTERNALS: Add structs to ToC
+ ... to avoid crashes!
- Add the subsections under "Structs in libcurl" to the table of contents.
+ Reported-by: Hao Wu
+ Fixes #5302
+ Closes #5303
+
+- travis: bump the wolfssl CI build to use 4.4.0
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Closes #5301
-- [Aron Bergman brought this change]
+- copyright updates: adjust year ranges
- INTERNALS: Add code highlighting
+Marc Hoersken (26 Apr 2020)
+- CI: do not include */ci branches in PR builds
- Make all struct members under the Curl_handler section
- print in monospace font.
-
- Closes #3801
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+ Align Azure Pipelines with GitHub Actions.
-Daniel Stenberg (22 Apr 2019)
-- docs/BUG-BOUNTY: bug bounty time [skip ci]
+Daniel Stenberg (25 Apr 2020)
+- runtests: check for the disabled tests relative srcdir
- Introducing the curl bug bounty program on hackerone. We now recommend
- filing security issues directly in the hackerone ticket system which
- only is readable to curl security team members.
+ To make it work correctly for out-of-tree builds.
- Assisted-by: Daniel Gustafsson
+ Follow-up to 75e8feb6fb08b
- Closes #3488
+ Bug: https://github.com/curl/curl/pull/5288#issuecomment-619346389
+ Reported-by: Marcel Raad
+ Closes #5297
-Steve Holme (22 Apr 2019)
-- sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616
+- runtests: revert commenting out a line I did for debugging
- RFC 4616 specifies the authzid is optional in the client authentication
- message and that the server will derive the authorisation identity
- (authzid) from the authentication identity (authcid) when not specified
- by the client.
+ Follow-up to 11091cd4d. It was not meant to be pushed!
-Jay Satiro (22 Apr 2019)
-- [Gisle Vanem brought this change]
-
- memdebug: fix variable name
+- smtp: set auth correctly
- Follow-up to 76b6348 which renamed logfile as curl_dbg_logfile.
+ Regression since 7.69.0 and 68fb25fa3fcff.
- Ref: https://github.com/curl/curl/commit/76b6348#r33259088
-
-Steve Holme (21 Apr 2019)
-- vauth/cleartext: Don't send the authzid if it is empty
+ The code wrongly assigned 'from' instead of 'auth' which probably was a
+ copy and paste mistake from other code, leading to that auth could
+ remain NULL and later cause an error to be returned.
- Follow up to 762a292f.
+ Assisted-by: Eric Sauvageau
+ Fixes #5294
+ Closes #5295
-Daniel Stenberg (21 Apr 2019)
-- test 196,197,198: add 'retry' keyword [skip ci]
-
-- RELEASE-NOTES: synced
-
-- CURLOPT_MAXAGE_CONN: set the maximum allowed age for conn reuse
-
- ... and disconnect too old ones instead of trying to reuse.
-
- Default max age is set to 118 seconds.
+Marcel Raad (25 Apr 2020)
+- lib: clean up whitespace
- Ref: #3722
- Closes #3782
+ This fixes CodeFactor warnings.
-Daniel Gustafsson (20 Apr 2019)
-- [Po-Chuan Hsieh brought this change]
+Daniel Stenberg (25 Apr 2020)
+- [Anderson Toshiyuki Sasaki brought this change]
- altsvc: Fix building with cookies disables
+ libssh: avoid options override by configuration files
- ALTSVC requires Curl_get_line which is defined in lib/cookie.c inside a #if
- check of HTTP and COOKIES. That makes Curl_get_line undefined if COOKIES is
- disabled. Fix by splitting out the function into a separate file which can
- be included where needed.
+ Previously, options set explicitly through command line options could be
+ overridden by the configuration files parsed automatically when
+ ssh_connect() was called.
- Closes #3717
- Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
- Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-
-Daniel Stenberg (20 Apr 2019)
-- test1002: correct the name [skip ci]
-
-- test660: verify CONNECT_ONLY with IMAP
+ By calling ssh_options_parse_config() explicitly, the configuration
+ files are parsed before setting the options, avoiding the options
+ override. Once the configuration files are parsed, the automatic
+ configuration parsing is not executed.
- which basically just makes sure LOGOUT is *not* issued on disconnect
+ Fixes #4972
+ Closes #5283
+ Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
-- Curl_disconnect: treat all CONNECT_ONLY connections as "dead"
+- runtests: when <killserver> mentions http, kill http/2 too
- Since the connection has been used by the "outside" we don't know the
- state of it anymore and curl should not use it anymore.
+ Since the http2 test server is a mere proxy that needs to know about the
+ dynamic port the HTTP server is using, it too needs to get restarted
+ when the http server is killed.
- Bug: https://curl.haxx.se/mail/lib-2019-04/0052.html
+ A regression caused by 80d6515.
- Closes #3795
+ Fixes #5289
+ Closes #5291
-- multi: fix the statenames (follow-up fix from 2f44e94efb3df8e)
+- [Yuri Slobodyanyuk brought this change]
+
+ docs: fix two typos
- The list of names must be in sync with the defined states in the header
- file!
+ Closes #5292
-Steve Holme (16 Apr 2019)
-- openvms: Remove pre-processors for Windows as VMS cannot support them
+- [Emil Engler brought this change]
-- openvms: Remove pre-processor for SecureTransport as VMS cannot support it
+ tests/git: ignore mqttd and port files
- Fixes #3768
- Closes #3785
+ Closes #5290
-Jay Satiro (16 Apr 2019)
-- TODO: Add issue link to an existing entry
+- tests: make runtests check that disabled tests exists
+
+ ... and error out if so. Removed '536' from DISABLED as there is no such
+ test file.
+
+ Closes #5288
-Daniel Stenberg (16 Apr 2019)
-- RELEASE-NOTES: synced
+- test1154: set a proper name
-Jay Satiro (16 Apr 2019)
-- tool_help: Warn if curl and libcurl versions do not match
+- select: make Curl_socket_check take timediff_t timeout
- .. because functionality may be affected if the versions differ.
+ Coverity found CID 1461718:
- This commit implements TODO 18.7 "warning if curl version is not in sync
- with libcurl version".
+ Integer handling issues (CONSTANT_EXPRESSION_RESULT) "timeout_ms >
+ 9223372036854775807L" is always false regardless of the values of its
+ operands. This occurs as the logical second operand of "||".
- Ref: https://github.com/curl/curl/blob/curl-7_64_1/docs/TODO#L1028-L1033
-
- Closes https://github.com/curl/curl/pull/3774
-
-Steve Holme (16 Apr 2019)
-- md5: Update the function signature following d84da52d
+ Closes #5240
-- md5: Forgot to update the code alignment in d84da52d
+- [i-ky brought this change]
-- md5: Return CURLcode from the internally accessible functions
+ libcurl-multi.3: added missing full stop
- Following 28f826b3 to return CURLE_OK instead of numeric 0.
+ Closes #5285
-Daniel Gustafsson (15 Apr 2019)
-- tests: Run global cleanup at end of tests
+Jay Satiro (22 Apr 2020)
+- transfer: Switch PUT to GET/HEAD on 303 redirect
- Make sure to run curl_global_cleanup() when shutting down the test
- suite to release any resources allocated in the SSL setup. This is
- clearly visible when running tests with PolarSSL where the thread
- lock calloc() memory which isn't released when not running cleanup.
- Below is an excerpt from the autobuild logs:
+ Prior to this change if there was a 303 reply to a PUT request then
+ the subsequent request to respond to that redirect would also be a PUT.
+ It was determined that was most likely incorrect based on the language
+ of the RFCs. Basically 303 means "see other" resource, which implies it
+ is most likely not the same resource, therefore we should not try to PUT
+ to that different resource.
- ==12368== 96 bytes in 1 blocks are possibly lost in loss record 1 of 2
- ==12368== at 0x4837B65: calloc (vg_replace_malloc.c:752)
- ==12368== by 0x11A76E: curl_dbg_calloc (memdebug.c:205)
- ==12368== by 0x145CDF: Curl_polarsslthreadlock_thread_setup
- (polarssl_threadlock.c:54)
- ==12368== by 0x145B37: Curl_polarssl_init (polarssl.c:865)
- ==12368== by 0x14129D: Curl_ssl_init (vtls.c:171)
- ==12368== by 0x118B4C: global_init (easy.c:158)
- ==12368== by 0x118BF5: curl_global_init (easy.c:221)
- ==12368== by 0x118D0B: curl_easy_init (easy.c:299)
- ==12368== by 0x114E96: test (lib1906.c:32)
- ==12368== by 0x115495: main (first.c:174)
+ Refer to the discussions in #5237 and #5248 for more information.
- Closes #3783
- Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Fixes https://github.com/curl/curl/issues/5237
+ Closes https://github.com/curl/curl/pull/5248
-Marcel Raad (15 Apr 2019)
-- travis: use mbedtls from Xenial
-
- No need to build it from source anymore.
+Daniel Stenberg (22 Apr 2020)
+- lib/mk-ca-bundle: skip empty certs
- Closes https://github.com/curl/curl/pull/3779
+ Reviewed-by: Emil Engler
+ Reported-by: Ashwin Metpalli
+ Fixes #5278
+ Closes #5280
-- travis: use libpsl from Xenial
+- version: skip idn2_check_version() check and add precaution
- This makes building libpsl and libidn2 from source unnecessary and
- removes the need for the autopoint and libunistring-dev packages.
+ A gcc-10's -fanalyze complaint made me spot and do these improvements.
- Closes https://github.com/curl/curl/pull/3779
+ Closes #5281
-Daniel Stenberg (15 Apr 2019)
-- runtests: start socksd like other servers
-
- ... without a $srcdir prefix. Triggered by the failures in several
- autobuilds.
-
- Closes #3781
+- RELEASE-NOTES: synced
-Daniel Gustafsson (14 Apr 2019)
-- socksd: Fix typos
-
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+- [Brian Bergeron brought this change]
-- socksd: Properly decorate static variables
+ curl.h: update comment typo
- Mark global variables static to avoid compiler warning in Clang when
- using -Wmissing-variable-declarations.
+ "routines with be invoked" -> "routines will be invoked"
- Closes #3778
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #5279
-Steve Holme (14 Apr 2019)
-- md(4|5): Fixed indentation oddities with the importation of replacement code
+- [Emil Engler brought this change]
+
+ GnuTLS: Don't skip really long certificate fields
- The indentation from 211d5329 and 57d6d253 was a little strange as
- parts didn't align correctly, uses 4 spaces rather than 2. Checked
- the indentation of the original source so it aligns, albeit, using
- curl style.
+ Closes #5271
-- md5: Code style to return CURLE_OK rather than numeric 0
+- gnutls: bump lowest supported version to 3.1.10
+
+ GnuTLS 3.1.10 added new functions we want to use. That version was
+ released on Mar 22, 2013. Removing support for older versions also
+ greatly simplifies the code.
+
+ Ref: #5271
+ Closes #5276
-- md5: Corrected code style for some pointer arguments
+- mqtt: make NOSTATE get within the debug name array
-Marcel Raad (13 Apr 2019)
-- travis: update some builds to xenial
+- tests: run the RTSP test server on a dynamic port number
- Xenial comes with more up-to-date software versions and more available
- packages, some of which we currently build from source. Unfortunately,
- some builds would fail with Xenial because of assertion failures in
- Valgrind when using OpenSSL, so leave these at Trusty.
+ To avoid port collisions.
- Closes https://github.com/curl/curl/pull/3777
+ Closes #5272
-Daniel Stenberg (13 Apr 2019)
-- test: make tests and test scripts use socksd for SOCKS
+- tests: add %NOLISTENPORT and use it
- Make all SOCKS tests use socksd instead of ssh.
-
-- socksd: new SOCKS 4+5 server for tests
+ The purpose with this variable is to provide a port number that is
+ reasonably likely to not have a listener on the local host so that tests
+ can try connect failures against it. It uses port 47 - "reserved"
+ according to IANA.
- Closes #3752
-
-- singleipconnect: show port in the verbose "Trying ..." message
+ Updated six tests to use it instead of the previous different ports.
- To aid debugging better.
+ Assisted-by: Emil Engler
+ Closes #5270
-- [tmilburn brought this change]
-
- CURLOPT_ADDRESS_SCOPE: fix range check and more
+- mqtt: remove code with no purpose
- Commit 9081014 fixed most of the confusing issues between scope id and
- scope however 844896d added bad limits checking assuming that the scope
- is being set and not the scope id.
+ Detected by Coverity. CID 1462319.
- I have fixed the documentation so it all refers to scope ids.
+ "The same code is executed when the condition result is true or false,
+ because the code in the if-then branch and after the if statement is
+ identical."
- In addition Curl_if2ip refered to the scope id as remote_scope_id which
- is incorrect, so I renamed it to local_scope_id.
+ Closes #5275
+
+- mqtt: fix Curl_read() error handling while reading remaining length
- Adjusted-by: Daniel Stenberg
+ Detected by Coverity. CID 1462320.
- Closes #3655
- Closes #3765
- Fixes #3713
+ Closes #5274
-- urlapi: stricter CURLUPART_PORT parsing
+- server/tftpd: fix compiler warning
- Only allow well formed decimal numbers in the input.
+ Follow-up from 369ce38ac1d
+ Reported-by: Marc Hörsken
+
+- http: free memory when Alt-Used header creation fails due to OOM
- Document that the number MUST be between 1 and 65535.
+ Reported-by: James Fuller
+ Fixes #5268
+ Closes #5269
+
+Daniel Gustafsson (20 Apr 2020)
+- lib: fix typos in comments and errormessages
- Add tests to test 1560 to verify the above.
+ This fixes a few randomly spotted typos in recently merged code, most
+ notably one in a userfacing errormessage the schannel code.
+
+Daniel Stenberg (20 Apr 2020)
+- tests: run the SOCKS test server on a dynamic port number
- Ref: https://github.com/curl/curl/issues/3753
- Closes #3762
+ Closes #5266
-Jay Satiro (13 Apr 2019)
-- [Jan Ehrhardt brought this change]
+- [Johannes Schindelin brought this change]
- winbuild: Support MultiSSL builds
+ multi-ssl: reset the SSL backend on `Curl_global_cleanup()`
- - Remove the lines in winbuild/Makefile.vc that generate an error with
- multiple SSL backends.
+ When cURL is compiled with support for multiple SSL backends, it is
+ possible to configure an SSL backend via `curl_global_sslset()`, but
+ only *before* `curl_global_init()` was called.
- - Add /DCURL_WITH_MULTI_SSL in winbuild/MakefileBuild.vc if multiple SSL
- backends are set.
+ If another SSL backend should be used after that, a user might be
+ tempted to call `curl_global_cleanup()` to start over. However, we did
+ not foresee that use case and forgot to reset the SSL backend in that
+ cleanup.
- Closes https://github.com/curl/curl/pull/3772
+ Let's allow that use case.
+
+ Fixes #5255
+ Closes #5257
+ Reported-by: davidedec on github
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-Daniel Stenberg (12 Apr 2019)
-- travis: remove mesalink builds (temporarily?)
+- tests: run the TFTP test server on a dynamic port number
- Since the mesalink build started to fail on travis, even though we build
- a fixed release version, we disable it to prevent it from blocking
- progress.
+ Picking a dynamic unused port is better than a fixed to avoid the
+ collision risk.
- Closes #3767
+ Closes #5265
-- openssl: mark connection for close on TLS close_notify
+- mqtt: improve the state machine
- Without this, detecting and avoid reusing a closed TLS connection
- (without a previous GOAWAY) when doing HTTP/2 is tricky.
+ To handle PUBLISH before SUBACK and more.
- Reported-by: Tom van der Woerdt
- Fixes #3750
- Closes #3763
+ Updated the existing tests and added three new ones.
+
+ Reported-by: Christoph Krey
+ Bug: https://curl.haxx.se/mail/lib-2020-04/0021.html
+ Closes #5246
+
+- runtests: always put test number in servercmd file
- RELEASE-NOTES: synced
-Steve Holme (11 Apr 2019)
-- vauth/cleartext: Update the PLAIN login function signature to match RFC 4616
-
- Functionally this doesn't change anything as we still use the username
- for both the authorisation identity and the authentication identity.
-
- Closes #3757
+- release-notes.pl: fix parsing typo
-Daniel Stenberg (11 Apr 2019)
-- test1906: verify CURLOPT_CURLU + CURLOPT_PORT usage
-
- Based-on-code-by: Poul T Lomholt
+James Fuller (20 Apr 2020)
+- ensure all references to ports are replaced by vars
-- url: always clone the CUROPT_CURLU handle
+- add more alt-svc test coverage
+
+Daniel Stenberg (20 Apr 2020)
+- test1247: use http server to get the port number set
- Since a few code paths actually update that data.
+ Follow-up to 0f5db7b263f
+
+- runtests: use a unix domain socket path with the pid in the name
- Fixes #3753
- Closes #3761
+ To make it impossible for test cases to access the file name without
+ using the proper variable for the purpose.
- Reported-by: Poul T Lomholt
+ Closes #5264
+
+Daniel Gustafsson (19 Apr 2020)
+- [Mipsters on github brought this change]
-- CURLOPT_DNS_USE_GLOBAL_CACHE: remove
+ src: Remove C99 constructs to ensure C89 compliance
- Remove the code too. The functionality has been disabled in code since
- 7.62.0. Setting this option will from now on simply be ignored and have
- no function.
+ This fixes the error: 'for' loop initial declaration used outside C99
+ mode by declaring the loop increment variable in the beginning of the
+ block instead of inside the for loop.
- Closes #3654
+ Fixes #5254
+ Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
-Marcel Raad (11 Apr 2019)
-- travis: install libgnutls28-dev only for --with-gnutls build
-
- Reduces the time needed for the other jobs a little.
+Daniel Stenberg (19 Apr 2020)
+- runtests: dummy init the ports variables to avoid warnings
- Closes https://github.com/curl/curl/pull/3721
+ ... and generate something that can help debug test cases.
-- travis: install libnss3-dev only for --with-nss build
+- [Patrick Monnerat brought this change]
+
+ mime: properly check Content-Type even if it has parameters
- Reduces the time needed for the other jobs a little.
+ New test 669 checks this fix is effective.
- Closes https://github.com/curl/curl/pull/3721
+ Fixes #5256
+ Closes #5258
+ Reported-by: thanhchungbtc on github
-- travis: install libssh2-dev only for --with-libssh2 build
-
- Reduces the time needed for the other jobs a little.
+- tests/FILEFORMAT: converted to markdown and extended
- Closes https://github.com/curl/curl/pull/3721
+ Closes #5261
+
+- test1245: make it work with dynamic FTP server port
+
+- test1055: make it work with dynamic FTP port
-- travis: install libssh-dev only for --with-libssh build
+- test1028: make it run on dynamic FTP server port
+
+- tests: move pingpong server to dynamic listening port
- Reduces the time needed for the other jobs a little.
+ FTP, IMAP, POP3, SMTP and their IPv6 versions are now all on dynamic
+ ports
- Closes https://github.com/curl/curl/pull/3721
+ Test 842-845 are unfortunately a bit hard to move over to this concept
+ right now and require "default port" still...
+
+- test1056: work with dynamic HTTP ipv6 port
+
+- test1448: work with dynamic HTTP server port
-- travis: install krb5-user only for --with-gssapi build
+- tests: introduce preprocessed test cases
- Reduces the time needed for the other jobs a little.
+ The runtests script now always performs variable replacement on the
+ entire test source file before the test gets executed, and saves the
+ updated version in a temporary file (log/test[num]) so that all test
+ case readers/servers can use that version (if present) and thus enjoy
+ the powers of test case variable substitution.
- Closes https://github.com/curl/curl/pull/3721
+ This is necessary to allow complete port number freedom.
+
+ Test 309 is updated to work with a non-fixed port number thanks to this.
+
+- tests: make 2006-2010 handle different port number lengths
-- travis: install lcov only for the coverage job
+- tests: run the sws server on "any port"
- Reduces the time needed for the other jobs a little.
+ Makes the test servers for HTTP and Gopher pop up on a currently unused
+ port and runtests adapts to that!
- Closes https://github.com/curl/curl/pull/3721
+ Closes #5247
-- travis: install clang only when needed
+Marc Hoersken (18 Apr 2020)
+- sockfilt: tidy variable naming and data structure in select_ws
- This reduces the GCC job runtimes a little and it's needed to
- selectively update clang builds to xenial.
+ This commit does not introduce any logical changes to the code.
- Closes https://github.com/curl/curl/pull/3721
+ Reviewed-by: Jay Satiro and Marcel Raad
+ Closes #5238
-- AppVeyor: enable testing for WinSSL build
-
- Closes https://github.com/curl/curl/pull/3725
+Daniel Stenberg (17 Apr 2020)
+- [Anderson Toshiyuki Sasaki brought this change]
-- build: fix Codacy/CppCheck warnings
+ libssh: Use new ECDSA key types to check known hosts
- - remove unused variables
- - declare conditionally used variables conditionally
- - suppress unused variable warnings in the CMake tests
- - remove dead variable stores
- - consistently use WIN32 macro to detect Windows
+ From libssh 0.9.0, ssh_key_type() returns different key types for ECDSA
+ keys depending on the curve.
- Closes https://github.com/curl/curl/pull/3739
+ Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
+ Fixes #5252
+ Closes #5253
-- polarssl_threadlock: remove conditionally unused code
+Marcel Raad (17 Apr 2020)
+- appveyor: add Unicode winbuild jobs
- Make functions no-ops if neither both USE_THREADS_POSIX and
- HAVE_PTHREAD_H nor both USE_THREADS_WIN32 and HAVE_PROCESS_H are
- defined. Previously, if only one of them was defined, there was either
- code compiled that did nothing useful or the wrong header included for
- the functions used.
+ These are cheap as they don't build tests.
- Also, move POLARSSL_MUTEX_T define to implementation file as it's not
- used externally.
+ Closes https://github.com/curl/curl/pull/5063
+
+Daniel Stenberg (16 Apr 2020)
+- mqttd: s/errno/SOCKERRNO
- Closes https://github.com/curl/curl/pull/3739
+ To behave proper on Windows
+ Reported-by: Gisle Vanem
+ Bug: https://github.com/curl/curl/commit/5e855bbd18f84a02c951be7cac6188276818cdac#r38507132
+ Closes #5241
-- lib557: initialize variables
+- buildconf: use find -execdir instead, remove -print and the ares files
- These variables are only conditionally initialized.
+ Follow-up to 1e41bec96a6e
- Closes https://github.com/curl/curl/pull/3739
+ Suggested-by: Marc Hörsken
-- lib509: add missing include for strdup
-
- Closes https://github.com/curl/curl/pull/3739
+- [Alexander V. Tikhonov brought this change]
-- README.md: fix no-consecutive-blank-lines Codacy warning
-
- Consistently use one blank line between blocks.
+ buildconf: avoid using tempfile when removing files
- Closes https://github.com/curl/curl/pull/3739
+ Closes #5213
+
+- copyright: bump the copyright year range
-- tests/server/util: fix Windows Unicode build
+- scripts/release-notes.pl: accept colon after the Fixes/Closes keywords
+
+- [JP Mens brought this change]
+
+ docs/MQTT: replace confusing 80 by 75
- Always use the ANSI version of FormatMessage as we don't have the
- curl_multibyte gear available here.
+ I was a bit surprised by the `80`: first thought: what's HTTP doing
+ here? ;)
- Closes https://github.com/curl/curl/pull/3758
+ Closes #5236
-Daniel Stenberg (11 Apr 2019)
-- curl_easy_getinfo.3: fix minor formatting mistake
+- [Brad King brought this change]
-Daniel Gustafsson (11 Apr 2019)
-- xattr: skip unittest on unsupported platforms
+ cmake: Avoid MSVC C4273 warnings in send/recv checks
- The stripcredentials unittest fails to compile on platforms without
- xattr support, for example the Solaris member in the buildfarm which
- fails with the following:
+ We use `check_c_source_compiles` to check possible send/recv signatures
+ by reproducing the forward declarations from system headers. On Windows
+ the `winsock2.h` header adds dll linkage settings to its forward
+ declaration. If ours does not match the compiler warns:
- CC unit1621-unit1621.o
- CC ../libtest/unit1621-first.o
- CCLD unit1621
- Undefined first referenced
- symbol in file
- stripcredentials unit1621-unit1621.o
- goto problem 2
- ld: fatal: symbol referencing errors. No output written to .libs/unit1621
- collect2: error: ld returned 1 exit status
- gmake[2]: *** [Makefile:996: unit1621] Error 1
+ warning C4273: 'recv': inconsistent dll linkage
- Fix by excluding the test on such platforms by using the reverse
- logic from where stripcredentials() is defined.
+ Add `WINSOCK_API_LINKAGE` to our test signatures when it is defined so
+ that our linkage is consistent with that from `winsock2.h`.
- Closes #3759
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Fixes #4764
+ Closes #5232
-Steve Holme (11 Apr 2019)
-- emailL Added reference to RFC8314 for implicit TLS
-
-- README: Schannel, stop calling it "winssl"
+Jay Satiro (14 Apr 2020)
+- KNOWN_BUGS: Add entry 'Blocking socket operations'
- Stick to "Schannel" everywhere - follow up to 180501cb.
-
-Jakub Zakrzewski (10 Apr 2019)
-- cmake: clear CMAKE_REQUIRED_LIBRARIES after each use
+ - Add threaded resolver cleanup and GSSAPI for FTP to the TODO list of
+ known blocking operations.
- This fixes GSSAPI builds with the libraries in a non-standard location.
- The testing for recv() were failing because it failed to link
- the Kerberos libraries, which are not needed for this or subsequent
- tests.
+ - New known bugs entry 'Blocking socket operations in non-blocking API'
+ that directs to the TODO's list of known blocking operations.
- fixes #3743
- closes #3744
-
-- cmake: avoid linking executable for some tests with cmake 3.6+
-
- With CMAKE_TRY_COMPILE_TARGET_TYPE set to STATIC_LIBRARY, the try_compile()
- (which is used by check_c_source_compiles()) will build static library
- instead of executable. This avoids linking additional libraries in and thus
- speeds up those checks a little.
+ Ref: https://github.com/curl/curl/pull/5214#issuecomment-612488021
- This commit also avoids #3743 (GSSAPI build errors) on itself with cmake
- 3.6 or above. That issue was fixed separately for all versions.
+ Reported-by: Marc Hoersken
- Ref: #3744
+ Closes https://github.com/curl/curl/pull/5216
-- cmake: minor cleanup
-
- - Remove nneeded include_regular_expression.
- It was setting what is already a default.
+Marc Hoersken (14 Apr 2020)
+- test2043: use revoked.badssl.com instead of revoked.grc.com
- - Remove duplicated include.
+ The certificate of revoked.grc.com has expired on 2020-04-13.
- - Don't check for pre-3.0.0 CMake version.
- We already require at least 3.0.0, so it's just clutter.
+ Reviewed-by: Jay Satiro
- Ref: #3744
+ Closes #5233
-Steve Holme (8 Apr 2019)
-- build-openssl.bat: Fixed support for OpenSSL v1.1.0+
+- sockfilt: fix broken pipe on Windows to be ready in select_ws
+
+ Closes #5228
-- build-openssl.bat: Perfer the use of if statements rather than goto (where possible)
+Daniel Stenberg (14 Apr 2020)
+- RELEASE-NOTES: synced
-- build-openssl.bat: Perform the install for each build type directly after the build
+- scripts/release-notes: fix duplicate output header
-- build-openssl.bat: Split the install of static and shared build types
+- github/workflow: enable MQTT in the macOS debug build
-- build-openssl.bat: Split the building of static and shared build types
+- azure: add mqtt support to one of the Windows builds
-- build-openssl.bat: Move the installation into a separate function
+- travis: add mqtt job on Linux
-- build-openssl.bat: Move the build step into a separate function
+- tests: add four MQTT tests 1190 - 1193
-- build-openssl.bat: Move the OpenSSL configuration into a separate function
+- tests: add the mqtt test server mqttd
-- build-openssl.bat: Fixed the BUILD_CONFIG variable not being initialised
+- tests: support hex encoded data and mqtt server
- Should the parent environment set this variable then the build might
- not be performed as the user intended.
+ The mqtt server is started using a "random" port.
-Daniel Stenberg (8 Apr 2019)
-- socks: fix error message
+- [Björn Stenberg brought this change]
-- config.d: clarify that initial : and = might need quoting [skip ci]
+ mqtt: add new experimental protocol
- Fixes #3738
- Closes #3749
+ Closes #5173
-- RELEASE-NOTES: synced
+- TODO: Consider convenience options for JSON and XML?
- bumped to 7.65.0 for next release
+ Closes #5203
-- socks5: user name and passwords must be shorter than 256
+- tool: do not declare functions with Curl_ prefix
- bytes... since the protocol needs to store the length in a single byte field.
+ To avoid collision risks with private libcurl symbols when linked with
+ static versions (or just versions not hiding internal symbols).
- Reported-by: XmiliaH on github
- Fixes #3737
- Closes #3740
-
-- [Jakub Zakrzewski brought this change]
+ Reported-by: hydra3333 on github
+ Fixes #5219
+ Closes #5234
- test: urlapi: urlencode characters above 0x7f correctly
+- [Nathaniel R. Lewis brought this change]
-- [Jakub Zakrzewski brought this change]
+ cmake: add aliases so exported target names are available in tree
+
+ Reviewed-by: Brad King
+ Closes #5206
- urlapi: urlencode characters above 0x7f correctly
+- version: increase buffer space for ssl version output
+
+ To avoid it getting truncated, especially when several SSL backends are
+ built-in.
- fixes #3741
- Closes #3742
+ Reported-by: Gisle Vanem
+ Fixes #5222
+ Closes #5226
-- [Even Rouault brought this change]
+Marc Hoersken (13 Apr 2020)
+- cirrus: no longer ignore test 504 which is working again
+
+ The test is working again, because TCP blackholing is disabled.
- multi_runsingle(): fix use-after-free
+- appveyor: completely disable tests that fail to timeout early
- Fixes #3745
- Closes #3746
+ The tests changed from ignored to disabled are tests that are
+ about connecting to non-listening socket. On AppVeyor these
+ tests are not reliable, because for some unknown reason the
+ connect is not timing out before the test time limit is reached.
+
+Daniel Stenberg (13 Apr 2020)
+- test1908: avoid using fixed port number in test data
- The following snippet
- ```
+ Closes #5225
+
+Jay Satiro (12 Apr 2020)
+- [Andrew Kurushin brought this change]
+
+ schannel: Fix blocking timeout logic
- int main()
- {
- CURL* hCurlHandle = curl_easy_init();
- curl_easy_setopt(hCurlHandle, CURLOPT_URL, "http://example.com");
- curl_easy_setopt(hCurlHandle, CURLOPT_PROXY, "1");
- curl_easy_perform(hCurlHandle);
- curl_easy_cleanup(hCurlHandle);
- return 0;
- }
- ```
- triggers the following Valgrind warning
+ - Fix schannel_send for the case when no timeout was set.
- ```
- ==4125== Invalid read of size 8
- ==4125== at 0x4E7D1EE: Curl_llist_remove (llist.c:97)
- ==4125== by 0x4E7EF5C: detach_connnection (multi.c:798)
- ==4125== by 0x4E80545: multi_runsingle (multi.c:1451)
- ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072)
- ==4125== by 0x4E766A0: easy_transfer (easy.c:625)
- ==4125== by 0x4E76915: easy_perform (easy.c:719)
- ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738)
- ==4125== by 0x4008BE: main (in /home/even/curl/test)
- ==4125== Address 0x9b3d1d0 is 1,120 bytes inside a block of size 1,600 free'd
- ==4125== at 0x4C2ECF0: free (vg_replace_malloc.c:530)
- ==4125== by 0x4E62C36: conn_free (url.c:756)
- ==4125== by 0x4E62D34: Curl_disconnect (url.c:818)
- ==4125== by 0x4E48DF9: Curl_once_resolved (hostip.c:1097)
- ==4125== by 0x4E8052D: multi_runsingle (multi.c:1446)
- ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072)
- ==4125== by 0x4E766A0: easy_transfer (easy.c:625)
- ==4125== by 0x4E76915: easy_perform (easy.c:719)
- ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738)
- ==4125== by 0x4008BE: main (in /home/even/curl/test)
- ==4125== Block was alloc'd at
- ==4125== at 0x4C2F988: calloc (vg_replace_malloc.c:711)
- ==4125== by 0x4E6438E: allocate_conn (url.c:1654)
- ==4125== by 0x4E685B4: create_conn (url.c:3496)
- ==4125== by 0x4E6968F: Curl_connect (url.c:4023)
- ==4125== by 0x4E802E7: multi_runsingle (multi.c:1368)
- ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072)
- ==4125== by 0x4E766A0: easy_transfer (easy.c:625)
- ==4125== by 0x4E76915: easy_perform (easy.c:719)
- ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738)
- ==4125== by 0x4008BE: main (in /home/even/curl/test)
- ```
+ Prior to this change schannel would error if the socket was not ready
+ to send data and no timeout was set.
- This has been bisected to commit 2f44e94
+ This commit is similar to parent commit 89dc6e0 which recently made the
+ same change for SOCKS, for the same reason. Basically it was not well
+ understood that when Curl_timeleft returns 0 it is not a timeout of 0 ms
+ but actually means no timeout.
- Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14109
- Credit to OSS Fuzz
+ Fixes https://github.com/curl/curl/issues/5177
+ Closes https://github.com/curl/curl/pull/5221
-- pipelining: removed
+- socks: Fix blocking timeout logic
- As previously planned and documented in DEPRECATE.md, all pipelining
- code is removed.
+ - Document in Curl_timeleft's comment block that returning 0 signals no
+ timeout (ie there's infinite time left).
- Closes #3651
-
-- [cclauss brought this change]
-
- tests: make Impacket (SMB server) Python 3 compatible
+ - Fix SOCKS' Curl_blockread_all for the case when no timeout was set.
- Closes #3731
- Fixes #3289
-
-Marcel Raad (6 Apr 2019)
-- [Simon Warta brought this change]
-
- cmake: set SSL_BACKENDS
+ Prior to this change if the timeout had a value of 0 and that was passed
+ to SOCKET_READABLE it would return right away instead of blocking. That
+ was likely because it was not well understood that when Curl_timeleft
+ returns 0 it is not a timeout of 0 ms but actually means no timeout.
- This groups all SSL backends into the feature "SSL" and sets the
- SSL_BACKENDS analogue to configure.ac
+ Ref: https://github.com/curl/curl/pull/5214#issuecomment-612512360
- Closes https://github.com/curl/curl/pull/3736
+ Closes https://github.com/curl/curl/pull/5220
-- [Simon Warta brought this change]
+- [Marc Hoersken brought this change]
- cmake: don't run SORT on empty list
+ gopher: check remaining time left during write busy loop
+
+ Prior to this change gopher's blocking code would block forever,
+ ignoring any set timeout value.
- In case of an empty list, SORTing leads to the cmake error "list
- sub-command SORT requires list to be present."
+ Assisted-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
- Closes https://github.com/curl/curl/pull/3736
+ Similar to #5220 and #5221
+ Closes #5214
-Daniel Gustafsson (5 Apr 2019)
-- [Eli Schwartz brought this change]
+Daniel Stenberg (13 Apr 2020)
+- [Dirkjan Bussink brought this change]
- configure: fix default location for fish completions
+ gnutls: ensure TLS 1.3 when SRP isn't requested
- Fish defines a vendor completions directory for completions that are not
- installed as part of the fish project itself, and the vendor completions
- are preferred if they exist. This prevents trying to overwrite the
- builtin curl.fish completion (or creating file conflicts in distro
- packaging).
+ When SRP is requested in the priority string, GnuTLS will disable
+ support for TLS 1.3. Before this change, curl would always add +SRP to
+ the priority list, effectively always disabling TLS 1.3 support.
- Prefer the pkg-config defined location exported by fish, if it can be
- found, and fall back to the correct directory defined by most systems.
+ With this change, +SRP is only added to the priority list when SRP
+ authentication is also requested. This also allows updating the error
+ handling here to not have to retry without SRP. This is because SRP is
+ only added when requested and in that case a retry is not needed.
- Closes #3723
- Reviewed-by: Daniel Gustafsson
+ Closes #5223
-Marcel Raad (5 Apr 2019)
-- ftplistparser: fix LGTM alert "Empty block without comment"
+Marc Hoersken (12 Apr 2020)
+- tests/server: add hidden window to gracefully handle WM_CLOSE
- Removing the block is consistent with line 954/957.
-
- Closes https://github.com/curl/curl/pull/3732
+ Forward Window events as signals to existing signal event handler.
-- transfer: fix LGTM alert "Comparison is always true"
+- tests/server: add CTRL event handler for Win32 consoles
- Just remove the redundant condition, which also makes it clear that
- k->buf is always 0-terminated if this break is not hit.
+ Forward CTRL events as signals to existing signal event handler.
+
+- tests/server: move all signal handling routines to util.[ch]
- Closes https://github.com/curl/curl/pull/3732
+ Avoid code duplication to prepare for portability enhancements.
-Jay Satiro (4 Apr 2019)
-- [Rikard Falkeborn brought this change]
+Daniel Stenberg (12 Apr 2020)
+- compressed.d: stress that the headers are not modified
+
+ Suggested-by: Michael Osipov
+ Assisted-by: Jay Satiro
+ Bug: https://github.com/curl/curl/issues/5182#issuecomment-611638008
+ Closes #5217
- smtp: fix compiler warning
+Marc Hoersken (11 Apr 2020)
+- tests/server/util.c: use curl_off_t instead of long for pid
- - Fix clang string-plus-int warning.
+ Avoid potential overflow of huge PIDs on Windows.
- Clang 8 warns about adding a string to an int does not append to the
- string. Indeed it doesn't, but that was not the intention either. Use
- array indexing as suggested to silence the warning. There should be no
- functional changes.
+ Related to #5188
+ Assisted-by: Marcel Raad
+
+- tests: use Cygwin/msys PIDs for stunnel and sshd on Windows
+
+ Since the Windows versions of both programs would write Windows
+ PIDs to their pidfiles which we cannot handle, we need to use
+ our known perl.exe Cygwin/msys PID together with exec() in order
+ to tie the spawned processes to the existance of our perl.exe
- (In other words clang warns about "foo"+2 but not &"foo"[2] so use the
- latter.)
+ The perl.exe that is executing secureserver.pl and sshserver.pl
+ has a Cygwin/msys PID, because it is started inside Cygwin/msys.
- smtp.c:1221:29: warning: adding 'int' to a string does not append to the
- string [-Wstring-plus-int]
- eob = strdup(SMTP_EOB + 2);
- ~~~~~~~~~~~~~~~~^~~~
+ Related to #5188
+
+- tests: add Windows compatible pidwait like pidkill and pidterm
- Closes https://github.com/curl/curl/pull/3729
+ Related to #5188
-Marcel Raad (4 Apr 2019)
-- VS projects: use Unicode for VC10+
+- tests: fix conflict between Cygwin/msys and Windows PIDs
- All Windows APIs have been natively UTF-16 since Windows 2000 and the
- non-Unicode variants are just wrappers around them. Only Windows 9x
- doesn't understand Unicode without the UnicoWS DLL. As later Visual
- Studio versions cannot target Windows 9x anyway, using the ANSI API
- doesn't really have any benefit there.
+ Add 65536 to Windows PIDs to allow Windows specific treatment
+ by having disjunct ranges for Cygwin/msys and Windows PIDs.
- This avoids issues like KNOWN_BUGS 6.5.
+ See also:
+ - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
+ h=b5e1003722cb14235c4f166be72c09acdffc62ea
+ - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
+ h=448cf5aa4b429d5a9cebf92a0da4ab4b5b6d23fe
- Ref: https://github.com/curl/curl/issues/2120
- Closes https://github.com/curl/curl/pull/3720
+ Replaces #5178
+ Closes #5188
-Daniel Gustafsson (3 Apr 2019)
+Daniel Stenberg (11 Apr 2020)
- RELEASE-NOTES: synced
-
- Bump the version in progress to 7.64.2, if we merge any "change"
- before the cut-off date we can update the version.
-- [Tim Rühsen brought this change]
+- release-notes.pl: detect the start of the references in cleanup mode
- documentation: Fix several typos
+- Revert "file: on Windows, refuse paths that start with \\"
- Closes #3724
- Reviewed-by: Jakub Zakrzewski
- Reviewed-by: Daniel Gustafsson
-
-Jay Satiro (2 Apr 2019)
-- [Mert Yazıcıoğlu brought this change]
+ This reverts commit 1b71bc532bde8621fd3260843f8197182a467ff2.
+
+ Reminded-by: Chris Roberts
+ Bug: https://curl.haxx.se/mail/archive-2020-04/0013.html
+
+ Closes #5215
- vauth/oauth2: Fix OAUTHBEARER token generation
+Jay Satiro (11 Apr 2020)
+- lib: fix conversion warnings for SOCKET_WRITABLE/READABLE
- OAUTHBEARER tokens were incorrectly generated in a format similar to
- XOAUTH2 tokens. These changes make OAUTHBEARER tokens conform to the
- RFC7628.
+ - If loss of data may occur converting a timediff_t to time_t and
+ the time value is > TIME_T_MAX then treat it as TIME_T_MAX.
- Fixes: #2487
- Reported-by: Paolo Mossino
+ This is a follow-up to 8843678 which removed the (time_t) typecast
+ from the macros so that conversion warnings could be identified.
- Closes https://github.com/curl/curl/pull/3377
+ Closes https://github.com/curl/curl/pull/5199
-Marcel Raad (2 Apr 2019)
-- tool_cb_wrt: fix bad-function-cast warning
+- test1148: tolerate progress updates better (again)
- Commit f5bc578f4cdfdc6c708211dfc2962a0e9d79352d reintroduced the
- warning fixed in commit 2f5f31bb57d68b54e03bffcd9648aece1fe564f8.
- Extend fhnd's scope and reuse that variable instead of calling
- _get_osfhandle a second time to fix the warning again.
+ - Ignore intermediate progress updates.
- Closes https://github.com/curl/curl/pull/3718
-
-- VC15 project: remove MinimalRebuild
+ - Support locales that use a character other than period as decimal
+ separator (eg 100,0%).
- Already done in commit d5cfefd0ea8e331b884186bff484210fad36e345 for the
- library project, but I forgot the tool project template. Now also
- removed for that.
-
-Dan Fandrich (1 Apr 2019)
-- cirrus: Customize the disabled tests per FreeBSD version
+ test1148 checks that the progress finishes at 100% and has the right
+ bar width. Prior to this change the test assumed that the only progress
+ reported for such a quick transfer was 100%, however in rare instances
+ (like in the CI where transfer time can slow considerably) there may be
+ intermediate updates. For example, below is stderrlog1148 from a failed
+ CI run with explicit \r and \n added (it is one line; broken up so that
+ it's easier to understand).
- Try to run as many test cases as possible on each OS version.
- 12.0 passes 13 more tests than the older versions, so we might as well
- run them.
-
-Daniel Stenberg (1 Apr 2019)
-- tool_help: include <strings.h> for strcasecmp
+ \r
+ \r################################## 48.3%
+ \r######################################################################## 100.0%
+ \n
- Reported-by: Wyatt O'Day
- Fixes #3715
- Closes #3716
+ Closes https://github.com/curl/curl/pull/5194
-Daniel Gustafsson (31 Mar 2019)
-- scripts: fix typos
+Marc Hoersken (10 Apr 2020)
+- sshserver.pl: use cached Win32 environment check variable
-Dan Fandrich (28 Mar 2019)
-- travis: allow builds on branches named "ci"
+- appveyor: partially revert 3413a110 to keep build without proxy
- This allows a way to test changes other than through PRs.
-
-Daniel Stenberg (27 Mar 2019)
-- [Brad Spencer brought this change]
+ Ref: #5211 and #4526
+ Reported-by: Marcel Raad
- resolve: apply Happy Eyeballs philosophy to parallel c-ares queries
+- appveyor: ignore failing 'connect to non-listening proxy' tests
- Closes #3699
+ Closes #5211
+
+- CI/macos: convert CRLF to LF and align indentation
-- multi: improved HTTP_1_1_REQUIRED handling
+Daniel Stenberg (9 Apr 2020)
+- url: allow non-HTTPS altsvc-matching for debug builds
- Make sure to downgrade to 1.1 even when we get this HTTP/2 stream error
- on first flight.
+ This is already partly supported but this part was missing.
+ Reported-by: James Fuller
- Reported-by: niner on github
- Fixes #3696
- Closes #3707
+ Closes #5205
-- [Leonardo Taccari brought this change]
-
- configure: avoid unportable `==' test(1) operator
+- server/resolve: remove AI_CANONNAME to make macos tell the truth
+
+ With this bit set, my mac successfully resolves "ip6-localhost" when in
+ fact there is no such host known to my machine! That in turn made test
+ 241 wrongly execute and fail.
- Closes #3709
+ Closes #5202
-Version 7.64.1 (27 Mar 2019)
+- runtests: fix warning about using an undefined variable
+
+ Follow-up from 4d939ef6ceb2db1
-Daniel Stenberg (27 Mar 2019)
-- RELEASE: 7.64.1
+- release-notes: fix the initial reference list output
-- Revert "ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set"
+- github actions: run when pushed to master or */ci + PRs
- This reverts commit 9130ead9fcabdb6b8fbdb37c0b38be2d326adb00.
+ Avoid double-builds when using "local" branches for PRs. For both macos
+ and fuzz jobs.
- Fixes #3708
+ Closes #5201
+
+- runtests: provide nicer errormsg when protocol "dump" file is empty
-- [Christian Schmitz brought this change]
+- [Gilles Vollant brought this change]
- ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set
+ schannel: support .P12 or .PFX client certificates
- Closes #3704
+ Used with curl command line option like this: --cert
+ <filename>:<password> --cert-type p12
+
+ Closes #5193
-Jay Satiro (26 Mar 2019)
-- tool_cb_wrt: fix writing to Windows null device NUL
+- tests: verify split initial HTTP requests with CURL_SMALLREQSEND
- - Improve console detection.
+ test1294: "split request" being when the entire request isn't sent in
+ the first go, and the remainder is sent in the PERFORM state. A GET
+ request is otherwise not sending anything during PERFORM.
- Prior to this change WriteConsole could be called to write to a handle
- that may not be a console, which would cause an error. This issue is
- limited to character devices that are not also consoles such as the null
- device NUL.
+ test1295: same kind of split but with POST
- Bug: https://github.com/curl/curl/issues/3175#issuecomment-439068724
- Reported-by: Gisle Vanem
+ Closes #5197
-- CURLMOPT_PIPELINING.3: fix typo
+- http: don't consider upload done if the request isn't completely sent off
+
+ Fixes #4919
+ Closes #5197
-Daniel Stenberg (25 Mar 2019)
-- TODO: config file parsing
+- http: allow Curl_add_buffer_send() to do a short first send by force
- Closes #3698
+ In a debug build, settting the environment variable "CURL_SMALLREQSEND"
+ will make the first HTTP request send not send more bytes than the set
+ amount, thus ending up verifying that the logic for handling a split
+ HTTP request send works correctly.
-Jay Satiro (24 Mar 2019)
-- os400: Disable Alt-Svc by default since it's experimental
+- connect: store connection info for QUIC connections
- Follow-up to 520f0b4 which added Alt-Svc support and enabled it by
- default for OS400. Since the feature is experimental, it should be
- disabled by default.
+ Restores the --head functionality to the curl utility which extracts
+ 'protocol' that is stored that way.
- Ref: https://github.com/curl/curl/commit/520f0b4#commitcomment-32792332
- Ref: https://curl.haxx.se/mail/lib-2019-02/0008.html
+ Reported-by: James Fuller
+ Fixes #5196
+ Closes #5198
+
+- tests/README: update the port numbers list
- Closes https://github.com/curl/curl/pull/3688
+ Since the pipelining server is long gone.
+ Reported-by: James Fuller
-Dan Fandrich (24 Mar 2019)
-- tests: Fixed XML validation errors in some test files.
+- select: remove typecast from SOCKET_WRITABLE/READABLE macros
+
+ So that they don't hide conversions-by-mistake
+
+ Reviewed-by: Jay Satiro
+ Closes #5190
-- tests: Fix some incorrect precheck error messages.
+- CURLOPT_WRITEFUNCTION.3: add inline example and new see-also
- [ci skip]
+ Closes #5192
-Daniel Stenberg (22 Mar 2019)
-- curl_url.3: this is not experimental anymore
+- release-notes: output trailing references sorted numerically
-- travis: bump the used wolfSSL version to 4.0.0
+- cleanup: correct copyright year range on a few files
+
+- configure: remove use of -vec-report0 from CFLAGS with icc
- Test 311 is now fine, leaving only 313 (CRL) disabled.
+ ... as it apparently isn't (always) supported.
+ Reported-by: Alain Miniussi
+ Fixes #5096
+ Closes #5191
+
+- warnless: remove code block for icc that didn't work
- Test 313 details can be found here:
- https://github.com/wolfSSL/wolfssl/issues/1546
+ Reported-by: Alain Miniussi
+ Fixes #5096
+
+Marc Hoersken (6 Apr 2020)
+- dist: add missing setup-win32.h
- Closes #3697
+ Follow up to d820224b8b
-Daniel Gustafsson (22 Mar 2019)
-- lib: Fix typos in comments
+Daniel Stenberg (6 Apr 2020)
+- RELEASE-NOTES: synced
-David Woodhouse (20 Mar 2019)
-- openssl: if cert type is ENG and no key specified, key is ENG too
+- scripts/release-notes.pl: add helper script for RELEASE-NOTES maintenance
- Fixes #3692
- Closes #3692
+ This script helps putting entries in the RELEASE-NOTES using a coherent
+ style and sorting with a minimal human editing effort - as long as the
+ first line in the commit message is good enough! There's a short howto
+ at the top of the file.
-Daniel Stenberg (20 Mar 2019)
-- sectransp: tvOS 11 is required for ALPN support
-
- Reported-by: nianxuejie on github
- Assisted-by: Nick Zitzmann
- Assisted-by: Jay Satiro
- Fixes #3689
- Closes #3690
+- [Dennis Felsing brought this change]
-- test1541: threaded connection sharing
-
- The threaded-shared-conn.c example turned into test case. Only works if
- pthread was detected.
+ configure: don't check for Security.framework when cross-compiling
- An attempt to detect future regressions such as e3a53e3efb942a5
+ Since it checks for the local file, not the cross-compiled one.
- Closes #3687
+ Closes #5189
-Patrick Monnerat (17 Mar 2019)
-- os400: alt-svc support.
+- TODO: Option to make -Z merge lined based outputs on stdout
- Although experimental, enable it in the platform config file.
- Upgrade ILE/RPG binding.
+ Closes #5175
-Daniel Stenberg (17 Mar 2019)
-- conncache: use conn->data to know if a transfer owns it
-
- - make sure an already "owned" connection isn't returned unless
- multiplexed.
+- lib: never define CURL_CA_BUNDLE with a getenv
- - clear ->data when returning the connection to the cache again
+ - it breaks the build (since 6de756c9b1de34b7a1)
+ - it's not documented and not consistent across platforms
+ - the curl tool does that getenv magic
- Regression since 7.62.0 (probably in commit 1b76c38904f0)
-
- Bug: https://curl.haxx.se/mail/lib-2019-03/0064.html
+ Bug: https://github.com/curl/curl/commit/6de756c#r38127030
+ Reported-by: Gisle Vanem
- Closes #3686
+ Closes #5187
-- RELEASE-NOTES: synced
-
-- [Chris Young brought this change]
+Marc Hoersken (5 Apr 2020)
+- lib670: use the same Win32 API check as all other lib tests
- configure: add --with-amissl
+- appveyor: use random test server ports based upon APPVEYOR_API_URL
- AmiSSL is an Amiga native library which provides a wrapper over OpenSSL.
- It also requires all programs using it to use bsdsocket.library
- directly, rather than accessing socket functions through clib, which
- libcurl was not necessarily doing previously. Configure will now check
- for the headers and ensure they are included if found.
+ Avoid conflicts of test server ports with AppVeyor API on localhost.
- Closes #3677
+ Closes #5034
-- [Chris Young brought this change]
+- appveyor: sort builds by type and add two new variants
+
+ Related to #5034 and #5063
- vtls: rename some of the SSL functions
+- appveyor: show failed tests in log even if test is ignored
- ... in the SSL structure as AmiSSL is using macros for the socket API
- functions.
+ And print API response with newline only if there is one
-- [Chris Young brought this change]
+- appveyor: turn disabled tests into ignored result tests
- tool_getpass: termios.h is present on AmigaOS 3, but no tcgetattr/tcsetattr
+Daniel Stenberg (5 Apr 2020)
+- KNOWN_BUGS: fixed "USE_UNIX_SOCKETS on Windows"
+
+ Fixed with #5170 (commit 23a870f2fd041278)
-- [Chris Young brought this change]
+- test1566: verify --etag-compare that gets a 304 back
+
+ Verifies the fix in #5183
+
+ Closes #5186
- tool_operate: build on AmigaOS
+- [Kwon-Young Choi brought this change]
-- makefile: make checksrc and hugefile commands "silent"
+ CURLINFO_CONDITION_UNMET: return true for 304 http status code
- ... to match the style already used for compiling, linking
- etc. Acknowledges 'make V=1' to enable verbose.
+ In libcurl, CURLINFO_CONDITION_UNMET is used to avoid writing to the
+ output file if the server did not transfered a file based on time
+ condition. In the same manner, getting a 304 HTTP response back from the
+ server, for example after passing a custom If-Match-* header, also
+ fulfill this condition.
- Closes #3681
+ Fixes #5181
+ Closes #5183
+
+- [Kwon-Young Choi brought this change]
-- curl.1: --user and --proxy-user are hidden from ps output
+ curl: allow both --etag-compare and --etag-save with same file name
- Suggested-by: Eric Curtin
- Improved-by: Dan Fandrich
- Ref: #3680
+ This change inverse the order of processing for the --etag-compare and
+ --etag-save option to process first --etag-compare. This in turn allows
+ to use the same file name to compare and save an etag.
- Closes #3683
-
-- curl.1: mark the argument to --cookie as <data|filename>
+ The original behavior of not failing if the etag file does not exists is
+ conserved.
- From a discussion in #3676
+ Fixes #5179
+ Closes #5180
+
+Viktor Szakats (4 Apr 2020)
+- windows: enable UnixSockets with all build toolchains
- Suggested-by: Tim Rühsen
+ Extend existing unix socket support in Windows builds to be
+ enabled for all toolchain vendors or versions. (Previously
+ it was only supported with certain MSVC versions + more recent
+ Windows 10 SDKs)
- Closes #3682
+ Ref: https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
+ Ref: https://github.com/curl/curl/issues/5162
+ Closes: https://github.com/curl/curl/pull/5170
-Dan Fandrich (14 Mar 2019)
-- fuzzer: Only clone the latest fuzzer code, for speed.
+Daniel Stenberg (4 Apr 2020)
+- KNOWN_BUGS: Store TLS context per transfer instead of per connection
+
+ Closes #5102
-Daniel Stenberg (14 Mar 2019)
-- [Dominik Hölzl brought this change]
+Marc Hoersken (3 Apr 2020)
+- sockfilt: remove redundancy in timeout handling
+
+ And update other logmsg output in select_ws on Windows.
- Negotiate: fix for HTTP POST with Negotiate
+- sockfilt: fix handling of ready closed sockets on Windows
- * Adjusted unit tests 2056, 2057
- * do not generally close connections with CURLAUTH_NEGOTIATE after every request
- * moved negotiatedata from UrlState to connectdata
- * Added stream rewind logic for CURLAUTH_NEGOTIATE
- * introduced negotiatedata::GSS_AUTHDONE and negotiatedata::GSS_AUTHSUCC
- * Consider authproblem state for CURLAUTH_NEGOTIATE
- * Consider reuse_forbid for CURLAUTH_NEGOTIATE
- * moved and adjusted negotiate authentication state handling from
- output_auth_headers into Curl_output_negotiate
- * Curl_output_negotiate: ensure auth done is always set
- * Curl_output_negotiate: Set auth done also if result code is
- GSS_S_CONTINUE_NEEDED/SEC_I_CONTINUE_NEEDED as this result code may
- also indicate the last challenge request (only works with disabled
- Expect: 100-continue and CURLOPT_KEEP_SENDING_ON_ERROR -> 1)
- * Consider "Persistent-Auth" header, detect if not present;
- Reset/Cleanup negotiate after authentication if no persistent
- authentication
- * apply changes introduced with #2546 for negotiate rewind logic
+ Replace the incomplete workaround regarding FD_CLOSE
+ only signalling once by instead doing a pre-check with
+ standard select and storing the result for later use.
- Fixes #1261
- Closes #1975
+ select keeps triggering on closed sockets on Windows while
+ WSAEventSelect fires only once with data still available.
+ By doing the pre-check we do not run in a deadlock
+ due to waiting forever for another FD_CLOSE event.
-- [Marc Schlatter brought this change]
-
- http: send payload when (proxy) authentication is done
+- sockfilt: fix race-condition of waiting threads and event handling
- The check that prevents payload from sending in case of authentication
- doesn't check properly if the authentication is done or not.
+ Fix race-condition of waiting threads finishing while events are
+ already being processed which lead to invalid or skipped events.
- They're cases where the proxy respond "200 OK" before sending
- authentication challenge. This change takes care of that.
+ Use mutex to check for one event at a time or do post-processing.
+ In addition to mutex-based locking use specific event as signal.
- Fixes #2431
- Closes #3669
+ Closes #5156
-- file: fix "Checking if unsigned variable 'readcount' is less than zero."
-
- Pointed out by codacy
+Daniel Stenberg (2 Apr 2020)
+- [Leo Neat brought this change]
+
+ CI-fuzz: increase fuzz time to 40 minutes
- Closes #3672
+ Closes #5174
-- memdebug: log pointer before freeing its data
+Marc Hoersken (2 Apr 2020)
+- CI: increase Azure Pipelines timeouts due to performance issues
- Coverity warned for two potentional "Use after free" cases. Both are false
- positives because the memory wasn't used, it was only the actual pointer
- value that was logged.
+ The current demand on Azure negatively impacts the CI performance.
+
+- runtests.pl: log host OS as detected by Perl environment
+
+- ftpserver.pl: log before and after data connection is closed
+
+Daniel Stenberg (1 Apr 2020)
+- RELEASE-NOTES: synced
+
+- RELEASE-PROCEDURE.md: run the copyright.pl script!
+
+- vquic/ngtcp2.h: update copyright year range
- The fix still changes the order of execution to avoid the warnings.
+ Follow-up to 0736ee73d346a52
+
+- [Daiki Ueno brought this change]
+
+ CI: add build with ngtcp2 + gnutls on Travis CI
+
+- [Daiki Ueno brought this change]
+
+ vquic: add support for GnuTLS backend of ngtcp2
- Coverity CID 1443033 and 1443034
+ Currently, the TLS backend used by vquic/ngtcp2.c is selected at compile
+ time. Therefore OpenSSL support needs to be explicitly disabled.
- Closes #3671
+ Signed-off-by: Daiki Ueno <dueno@redhat.com>
+ Closes #5148
-- RELEASE-NOTES: synced
+- [Gisle Vanem brought this change]
-Marcel Raad (12 Mar 2019)
-- travis: actually use updated compiler versions
+ examples/sessioninfo.c: add include to fix compiler warning
- For the Linux builds, GCC 8 and 7 and clang 7 were installed, but the
- new GCC versions were only used for the coverage build and for building
- nghttp2, while the new clang version was not used at all.
+ Fixes #5171
+
+- misc: copyright year updates
- BoringSSL needs to use the default GCC as it respects CC, but not CXX,
- so it would otherwise pass gcc 8 options to g++ 4.8 and fail.
+ Follow-up to 7a71965e9
+
+- [Harry Sintonen brought this change]
+
+ build: fixed build for systems with select() in unistd.h
- Also remove GCC 7, it's not needed anymore.
+ Closes #5169
+
+- memdebug: don't log free(NULL)
- Ref: https://docs.travis-ci.com/user/languages/c/#c11c11-and-beyond-and-toolchain-versioning
+ ... it serves no purpose and fills up the log.
+
+- cleanup: insert newline after if() conditions
- Closes https://github.com/curl/curl/pull/3670
+ Our code style mandates we put the conditional block on a separate
+ line. These mistakes are now detected by the updated checksrc.
-- travis: update clang to version 7
+- checksrc: warn on obvious conditional blocks on the same line as if()
- Closes https://github.com/curl/curl/pull/3670
+ Closes #5164
-Jay Satiro (11 Mar 2019)
-- [Andre Guibert de Bruet brought this change]
+- [Roger Orr brought this change]
- examples/externalsocket: add missing close socket calls
+ cmake: add CMAKE_MSVC_RUNTIME_LIBRARY
- .. and for Windows also call WSACleanup since we call WSAStartup.
+ Fixes #5165
+ Closes #5167
+
+- [Daiki Ueno brought this change]
+
+ ngtcp2: update to git master for the key installation API change
- The example is to demonstrate handling the socket independently of
- libcurl. In this case libcurl is not responsible for creating, opening
- or closing the socket, it is handled by the application (our example).
+ This updates the ngtcp2 OpenSSL backend to follow the API change in
+ commit 32e703164 of ngtcp2.
- Fixes https://github.com/curl/curl/pull/3663
-
-Daniel Stenberg (11 Mar 2019)
-- multi: removed unused code for request retries
+ Notable changes are:
+ - ngtcp2_crypto_derive_and_install_{rx,tx}_key have been added to replace
+ ngtcp2_crypto_derive_and_install_key
+ - the 'side' argument of ngtcp2_crypto_derive_and_install_initial_key
+ has been removed
- This code was once used for the non multi-interface using code path, but
- ever since easy_perform was turned into a wrapper around the multi
- interface, this code path never runs.
+ Fixes #5166
+ Closes #5168
+
+- [Cyrus brought this change]
+
+ SECURITY.md: minor rephrase
- Closes #3666
+ Closes #5158
-Jay Satiro (11 Mar 2019)
-- doh: inherit some SSL options from user's easy handle
+- output.d: quote the URL when globbing
- - Inherit SSL options for the doh handle but not SSL client certs,
- SSL ALPN/NPN, SSL engine, SSL version, SSL issuer cert,
- SSL pinned public key, SSL ciphers, SSL id cache setting,
- SSL kerberos or SSL gss-api settings.
+ Some shells do globbing of their own unless the URL is quoted, so maybe
+ encourage this.
- - Fix inheritance of verbose setting.
+ Co-authored-by: Jay Satiro
+ Closes #5160
+
+- dist: add tests/version-scan.pl to tarball
- - Inherit NOSIGNAL.
+ ... used in test 1177.
- There is no way for the user to set options for the doh (DNS-over-HTTPS)
- handles and instead we inherit some options from the user's easy handle.
+ Follow-up to a97d826f6de3
+
+- test1177: verify that all the CURL_VERSION_ bits are documented
+
+- curl.h: remnove CURL_VERSION_ESNI. Never supported nor documented
- My thinking for the SSL options not inherited is they are most likely
- not intended by the user for the DOH transfer. I did inherit insecure
- because I think that should still be in control of the user.
+ Considered experimental and therefore we can do this.
- Prior to this change doh did not work for me because CAINFO was not
- inherited. Also verbose was set always which AFAICT was a bug (#3660).
+ Closes #5157
+
+- KNOWN_BUGS: DoH doesn't inherit all transfer options
- Fixes https://github.com/curl/curl/issues/3660
- Closes https://github.com/curl/curl/pull/3661
+ Closes #4578
+ Closes #4579
-Daniel Stenberg (9 Mar 2019)
-- test331: verify set-cookie for dotless host name
+- KNOWN_BUGS: DoH leaks memory after followlocation
- Reproduced bug #3649
- Closes #3659
+ Closes #4592
-- Revert "cookies: extend domain checks to non psl builds"
+- KNOWN_BUGS: "FTPS needs session reuse"
- This reverts commit 3773de378d48b06c09931e44dca4d274d0bfdce0.
+ Closes #4654
+
+- KNOWN_BUGS: "stick to same family over SOCKS pro" is presumed fixed
+
+- TODO: Set custom client ip when using haproxy protocol
- Regression shipped in 7.64.0
- Fixes #3649
+ Closes #5125
-- memdebug: make debug-specific functions use curl_dbg_ prefix
+Michael Kaufmann (27 Mar 2020)
+- writeout_json: Fix data type issues
- To not "collide" or use up the regular curl_ name space. Also makes them
- easier to detect in helper scripts.
+ Load long values correctly (e.g. for http_code).
- Closes #3656
-
-- cmdline-opts/proxytunnel.d: the option tunnnels all protocols
+ Use curl_off_t (not long) for:
+ - size_download (CURLINFO_SIZE_DOWNLOAD_T)
+ - size_upload (CURLINFO_SIZE_UPLOAD_T)
- Clarify the language and simplify.
+ The unit for these values is bytes/second, not microseconds:
+ - speed_download (CURLINFO_SPEED_DOWNLOAD_T)
+ - speed_upload (CURLINFO_SPEED_UPLOAD_T)
- Reported-by: Daniel Lublin
- Closes #3658
+ Fixes #5131
+ Closes #5152
-- KNOWN_BUGS: Client cert (MTLS) issues with Schannel
+Daniel Stenberg (27 Mar 2020)
+- mailmap: fixup a few author names/fields
- Closes #3145
+ Douglas Steinwand, Gökhan Şengün, Jessa Chandler, Julian Z and
+ Svyatoslav Mishyn
-- ROADMAP: updated to some more current things to work on
-
-- tests: fix multiple may be used uninitialized warnings
+- version: add 'cainfo' and 'capath' to version info struct
+
+ Suggested-by: Timothe Litt
+ URL: https://curl.haxx.se/mail/lib-2020-03/0090.html
+ Reviewed-by: Jay Satiro
+
+ Closes #5150
- RELEASE-NOTES: synced
-- source: fix two 'nread' may be used uninitialized warnings
+Jay Satiro (26 Mar 2020)
+- SSLCERTS.md: Fix example code for setting CA cert file
- Both seem to be false positives but we don't like warnings.
+ Prior to this change the documentation erroneously said use
+ CURLOPT_CAPATH to set a CA cert file.
- Closes #3646
-
-- gopher: remove check for path == NULL
+ Bug: https://curl.haxx.se/mail/lib-2020-03/0121.html
+ Reported-by: Timothe Litt
- Since it can't be NULL and it makes Coverity believe we lack proper NULL
- checks. Verified by test 659, landed in commit 15401fa886b.
+ Closes https://github.com/curl/curl/pull/5151
+
+Marc Hoersken (26 Mar 2020)
+- sockfilt: add logmsg output to select_ws_wait_thread on Windows
- Pointed out by Coverity CID 1442746.
+ Assisted-by: Jay Satiro
+ Reviewed-by: Daniel Stenberg
- Assisted-by: Dan Fandrich
- Fixes #3617
- Closes #3642
+ Closes #5086
-- examples: only include <curl/curl.h>
+Daniel Stenberg (26 Mar 2020)
+- docs/make: generate curl.1 from listed files only
- That's the only public curl header we should encourage use of.
+ Previously it rendered the page from files matching "*.d" in the correct
+ directory, which worked fine in git builds when the files were added but
+ made it easy to forget adding the files to the dist.
- Reviewed-by: Marcel Raad
- Closes #3645
+ Now, only man page sections listed in DPAGES in Makefile.inc will be
+ used, thus "forcing" us to update this to get the man page right and get
+ it included in the dist at the same time.
+
+ Ref: #5146
+ Closes #5149
-- ssh: loop the state machine if not done and not blocking
+- openssl: adapt to functions marked as deprecated since version 3
- If the state machine isn't complete, didn't fail and it didn't return
- due to blocking it can just as well loop again.
+ OpenSSL 3 deprecates SSL_CTX_load_verify_locations and the MD4, DES
+ functions we use.
- This addresses the problem with SFTP directory listings where we would
- otherwise return back to the parent and as the multi state machine
- doesn't have any code for using CURLM_CALL_MULTI_PERFORM for as long the
- doing phase isn't complete, it would return out when in reality there
- was more data to deal with.
+ Fix the MD4 and SSL_CTX_load_verify_locations warnings.
- Fixes #3506
- Closes #3644
+ In configure, detect OpenSSL v3 and if so, inhibit the deprecation
+ warnings. OpenSSL v3 deprecates the DES functions we use for NTLM and
+ until we rewrite the code to use non-deprecated functions we better
+ ignore these warnings as they don't help us.
+
+ Closes #5139
-Jay Satiro (5 Mar 2019)
-- multi: support verbose conncache closure handle
+- dist: add mail-rcpt-allowfails.d to the tarball
- - Change closure handle to receive verbose setting from the easy handle
- most recently added via curl_multi_add_handle.
+ Reported-by: Maksim Stsepanenka
+ Reviewed-by: Jat Satiro
- The closure handle is a special easy handle used for closing cached
- connections. It receives limited settings from the easy handle most
- recently added to the multi handle. Prior to this change that did not
- include verbose which was a problem because on connection shutdown
- verbose mode was not acknowledged.
+ Closes #5146
+
+- travis: update the ngtcp2 build to use the latest OpenSSL patch
- Ref: https://github.com/curl/curl/pull/3598
+ ... which also makes it OpenSSL 1.1.1d based and not v3.
+
+Marc Hoersken (24 Mar 2020)
+- CI: remove default Ubuntu build from GitHub Actions
- Co-authored-by: Daniel Stenberg
+ We are already running a very similar Ubuntu build on Travis CI.
+ The macOS variant of this default build is kept on Github Actions.
+
+- CI: bring GitHub Actions fuzzing job in line with macOS jobs
- Closes https://github.com/curl/curl/pull/3618
+ Update YAML formatting, job naming and triggers.
-Daniel Stenberg (4 Mar 2019)
-- CURLU: fix NULL dereference when used over proxy
+- CI: migrate macOS jobs from Azure and Travis CI to GitHub Actions
- Test 659 verifies
+ Reduce workload on Azure Pipelines and Travis CI while
+ consolidating macOS jobs onto less utilized GitHub Actions.
- Also fixed the test 658 name
+ Reviewed-by: Daniel Stenberg
- Closes #3641
+ Closes #5124
-- altsvc_out: check the return code from Curl_gmtime
+Daniel Stenberg (24 Mar 2020)
+- config: remove all defines of HAVE_DES_H
- Pointed out by Coverity, CID 1442956.
+ As there's no code using it.
- Closes #3640
+ Closes #5144
-- docs/ALTSVC.md: docs describing the approach
+- copyright: fix out-of-date copyright ranges and missing headers
- Closes #3498
-
-- alt-svc: add a travis build
-
-- alt-svc: add test 355 and 356 to verify with command line curl
+ Reported by the new script 'scripts/copyright.pl'. The script has a
+ regex whitelist for the files that don't need copyright headers.
+
+ Removed three (mostly usesless) README files from docs/
+
+ Closes #5141
-- alt-svc: the curl command line bits
+- packages: add OS400/chkstrings.c to the dist
+
+ Reported-by: Jon Rumsey
+ Fixes #5142
+ Closes #5143
-- alt-svc: the libcurl bits
+- [Clément Notin brought this change]
-- travis: add build using gnutls
+ nghttp2: 1.12.0 required
- Closes #3637
+ since nghttp2_session_set_local_window_size is needed
+
+ Closes #5140
- RELEASE-NOTES: synced
-- [Simon Legner brought this change]
+- [Calvin Buckley brought this change]
- scripts/completion.pl: also generate fish completion file
+ OS400: Update strings for ccsid-ifier
- This is the renamed script formerly known as zsh.pl
+ Fixes build.
- Closes #3545
+ Closes #5132
-- gnutls: remove call to deprecated gnutls_compression_get_name
-
- It has been deprecated by GnuTLS since a year ago and now causes build
- warnings.
+- cirrus: make freebsd ignore the tests instead of skipping
- Ref: https://gitlab.com/gnutls/gnutls/commit/b0041897d2846737f5fb0f
- Docs: https://www.gnutls.org/manual/html_node/Compatibility-API.html
+ To allow us to see in the CI logs how they actually behave
- Closes #3636
+ Closes #5091
+
+- cirrus: move the sanitizer build from freebsd 13 to freebsd 12
-Jay Satiro (2 Mar 2019)
-- system_win32: move win32_init here from easy.c
+- Revert "cirrus-ci: disable the FreeBSD 13 builds"
- .. since system_win32 is a more appropriate location for the functions
- and to extern the globals.
+ This reverts commit 691b71be930f0e285c8f7a76efd56bbe0576cda6.
+
+- getinfo: provide CURLINFO_HEADER_SIZE and CURLINFO_REQUEST_SIZE override
- Ref: https://github.com/curl/curl/commit/ca597ad#r32446578
- Reported-by: Gisle Vanem
+ To let debug-builds return fake values, like in test 970.
- Closes https://github.com/curl/curl/pull/3625
+ Ref: #5131
+ Closes #5136
-Daniel Stenberg (1 Mar 2019)
-- curl_easy_duphandle.3: clarify that a duped handle has no shares
+- test970: improve the test
- Reported-by: Sara Golemon
+ - send more data to make problems more obvious
+ - don't start the data with minus, it makes diffs harder to read
+ - skip the headers in the stdout comparison
+ - save to a file name to also verify 'filename_effective'
- Fixes #3592
- Closes #3634
+ Ref: #5131
-- 10-at-a-time.c: fix too long line
+- CURLINFO_NUM_CONNECTS: improve accuracy
+
+ The counter was not bumped in all cases correctly.
+
+ Reported-by: Marcel Raad
+ Ref: #5131
+ Closes #5135
-- [Arnaud Rebillout brought this change]
+- TODO: Use "random" ports for the test servers
- examples: various fixes in ephiperfifo.c
+- lib/curl_setup: adjust the copyright year range
- The main change here is the timer value that was wrong, it was given in
- usecs (ms * 1000), while the itimerspec struct wants nsecs (ms * 1000 *
- 1000). This resulted in the callback being invoked WAY TOO OFTEN.
+ Follow-up from d820224b8
+
+Jay Satiro (21 Mar 2020)
+- curl_setup: define _WIN32_WINNT_[OS] symbols
- As a quick check you can run this command before and after applying this
- commit:
+ .. because not all Windows build systems have those symbols, and even
+ those that do may be missing newer symbols (eg the Windows 7 SDK does
+ not define _WIN32_WINNT_WIN10).
- # shell 1
- ./ephiperfifo 2>&1 | tee ephiperfifo.log
- # shell 2
- echo http://hacking.elboulangero.com > hiper.fifo
+ Those symbols are used in build-time logic to decide which API to use
+ and prior to this change if the symbols were missing it would have
+ resulted in deprecated API being used when more recent functions were
+ available (eg GetVersionEx used instead of VerifyVersionInfo).
- Then just compare the size of the logs files.
+ Reported-by: FuccDucc@users.noreply.github.com
- Closes #3633
- Fixes #3632
- Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
+ Probably fixes https://github.com/curl/curl/issues/4995
+ Closes https://github.com/curl/curl/pull/5057
+
+- [Ross Burton brought this change]
-- urldata: simplify bytecounters
+ curl-functions.m4: remove inappropriate AC_REQUIRE
- - no need to have them protocol specific
+ AC_REQUIRE means "if this macro hasn't been executed already, execute
+ it". So in a wrapper around AC_RUN_IFELSE, AC_REQUIRE(AC_RUN_IFELSE)
+ isn't correct at that will execute AC_RUN_IFELSE without any arguments.
- - no need to set pointers to them with the Curl_setup_transfer() call
+ With autoconf 2.69 this is basically a no-op, but with autoconf 2.70,
+ AC_RUN_IFELSE without a default value when cross-compiling is fatal.
+ The result is that curl with autoconf 2.70 cannot cross-compile.
- - make Curl_setup_transfer() operate on a transfer pointer, not
- connection
+ Fixes https://github.com/curl/curl/issues/5126
+ Closes https://github.com/curl/curl/pull/5130
+
+Marc Hoersken (20 Mar 2020)
+- ci/tests: fix Azure Pipelines not running Windows containers
- - switch some counters from long to the more proper curl_off_t type
+ Workaround posted here: microsoft/azure-pipelines-agent#2864
- Closes #3627
-
-- examples/10-at-a-time.c: improve readability and simplify
+ Assisted-by: Simon Chalifoux
+ Assisted-by: Tommy Petty
- - use better variable names to explain their purposes
- - convert logic to curl_multi_wait()
+ Fixes #5117
+ Closes #5129
-- threaded-resolver: shutdown the resolver thread without error message
-
- When a transfer is done, the resolver thread will be brought down. That
- could accidentally generate an error message in the error buffer even
- though this is not an error situationand the transfer would still return
- OK. An application that still reads the error buffer could find a
- "Could not resolve host: [host name]" message there and get confused.
+Daniel Stenberg (20 Mar 2020)
+- tests: add test 430, 431 and 432 to verify the --config fix
- Reported-by: Michael Schmid
- Fixes #3629
- Closes #3630
+ Verify the fixes in 4e0b4fee4
-- [Ԝеѕ brought this change]
+- [Rici Lake brought this change]
- docs: update max-redirs.d phrasing
+ cmdline: fix handling of OperationConfig linked list (--next)
- clarify redir - "in absurdum" doesn't seem to make sense in this context
+ Ensures that -K/--config inserts new items at the end of the list
+ instead of overwriting the second item, and that after a -K/--config
+ option has been parsed, the option parser's view of the current config
+ is update.
- Closes #3631
+ Fixes #5120
+ Closes #5123
-- ssh: fix Condition '!status' is always true
-
- in the same sftp_done function in both SSH backends. Simplify them
- somewhat.
-
- Pointed out by Codacy.
-
- Closes #3628
+Marc Hoersken (20 Mar 2020)
+- test2100: fix static port instead of dynamic value being used
-- test578: make it read data from the correct test
+- test970: fix static ip:port instead of dynamic values being used
-- Curl_easy: remove req.maxfd - never used!
-
- Introduced in 8b6314ccfb, but not used anymore in current code. Unclear
- since when.
+Daniel Stenberg (19 Mar 2020)
+- secure transport: remove the BACKEND define kludge
- Closes #3626
+ Closes #5122
-- http: set state.infilesize when sending formposts
-
- Without it set, we would unwillingly triger the "HTTP error before end
- of send, stop sending" condition even if the entire POST body had been
- sent (since it wouldn't know the expected size) which would
- unnecessarily log that message and close the connection when it didn't
- have to.
-
- Reported-by: Matt McClure
- Bug: https://curl.haxx.se/mail/archive-2019-02/0023.html
- Closes #3624
+- mbedtls: remove the BACKEND define kludge
+
+- bearssl: remove the BACKEND define kludge
-- INSTALL: refer to the current TLS library names and configure options
+- wolfssl: remove the BACKEND define kludge
-- FAQ: minor updates and spelling fixes
+- nss: remove the BACKEND define kludge
-- GOVERNANCE.md: minor spelling fixes
+- gnutls: remove the BACKEND define kludge
-- Secure Transport: no more "darwinssl"
+- openssl: remove the BACKEND define kludge
- Everyone calls it Secure Transport, now we do too.
+ Use a proper variable instead to make it easier to use a debugger and
+ read the code.
+
+Marc Hoersken (19 Mar 2020)
+- tests: make Python-based servers compatible with Python 2 and 3
- Reviewed-by: Nick Zitzmann
+ Update smbserver.py and negtelnetserver.py to be compatible with
+ Python 3 while staying backwards-compatible to support Python 2.
- Closes #3619
-
-Marcel Raad (27 Feb 2019)
-- AppVeyor: add classic MinGW build
+ Fix string encoding and handling of echoed and transferred data.
+
+ Tested with both Python 2.7.17 and Python 3.7.7
- But use the MSYS2 shell rather than the default MSYS shell because of
- POSIX path conversion issues. Classic MinGW is only available on the
- Visual Studio 2015 image.
+ Reported-by: Daniel Stenberg
+ Assisted-by: Kamil Dudka
+ Reviewed-by: Marcel Raad
- Closes https://github.com/curl/curl/pull/3623
+ Fixes #5104
+ Closes #5110
-- AppVeyor: add MinGW-w64 build
+Daniel Stenberg (18 Mar 2020)
+- writeout_json: use curl_off_t printf() option for the time output
- Add a MinGW-w64 build using CMake's MSYS Makefiles generator.
- Use the Visual Studio 2015 image as it has GCC 8, while the
- Visual Studio 2017 image only has GCC 7.2.
+ Follow-up to: 04c03416e68fd635a15
- Closes https://github.com/curl/curl/pull/3623
+ Closes #5115
-Daniel Stenberg (27 Feb 2019)
-- cookies: only save the cookie file if the engine is enabled
+- RELEASE-NOTES: synced
- Follow-up to 8eddb8f4259.
+ Uh, I missed this in 1a46b218db
+
+- RELEASE-NOTES: synced
- If the cookieinfo pointer is NULL there really is nothing to save.
+ ... and bumped curlver.h to 7.70.0
+
+Jay Satiro (18 Mar 2020)
+- http2: Fix erroneous debug message that h2 connection closed
- Without this fix, we got a problem when a handle was using shared object
- with cookies and is told to "FLUSH" it to file (which worked) and then
- the share object was removed and when the easy handle was closed just
- afterwards it has no cookieinfo and no cookies so it decided to save an
- empty jar (overwriting the file just flushed).
+ Prior to this change in libcurl debug builds http2 stream closure was
+ erroneously referred to as connection closure.
- Test 1905 now verifies that this works.
+ Before:
+ * nread <= 0, server closed connection, bailing
- Assisted-by: Michael Wallner
- Assisted-by: Marcel Raad
+ After:
+ * nread == 0, stream closed, bailing
- Closes #3621
-
-- [DaVieS brought this change]
+ Closes https://github.com/curl/curl/pull/5118
- cacertinmem.c: use multiple certificates for loading CA-chain
+Daniel Stenberg (18 Mar 2020)
+- tool_setopt: correct the copyright year range
- Closes #3421
+ Follow-up to 5450428491
-- urldata: convert bools to bitfields and move to end
+Jay Satiro (18 Mar 2020)
+- [Johannes Schindelin brought this change]
+
+ schannel: add "best effort" revocation check option
- This allows the compiler to pack and align the structs better in
- memory. For a rather feature-complete build on x86_64 Linux, gcc 8.1.2
- makes the Curl_easy struct 4.9% smaller. From 6312 bytes to 6000.
+ - Implement new option CURLSSLOPT_REVOKE_BEST_EFFORT and
+ --ssl-revoke-best-effort to allow a "best effort" revocation check.
- Removed an unused struct field.
+ A best effort revocation check ignores errors that the revocation check
+ was unable to take place. The reasoning is described in detail below and
+ discussed further in the PR.
- No functionality changes.
+ ---
- Closes #3610
-
-- [Don J Olmstead brought this change]
-
- curl.h: use __has_declspec_attribute for shared builds
+ When running e.g. with Fiddler, the schannel backend fails with an
+ unhelpful error message:
- Closes #3616
-
-- curl: display --version features sorted alphabetically
+ Unknown error (0x80092012) - The revocation function was unable
+ to check revocation for the certificate.
- Closes #3611
-
-- runtests: detect "schannel" as an alias for "winssl"
+ Sadly, many enterprise users who are stuck behind MITM proxies suffer
+ the very same problem.
- Follow-up to 180501cb02
+ This has been discussed in plenty of issues:
+ https://github.com/curl/curl/issues/3727,
+ https://github.com/curl/curl/issues/264, for example.
- Reported-by: Marcel Raad
- Fixes #3609
- Closes #3620
-
-Marcel Raad (26 Feb 2019)
-- AppVeyor: update to Visual Studio 2017
+ In the latter, a Microsoft Edge developer even made the case that the
+ common behavior is to ignore issues when a certificate has no recorded
+ distribution point for revocation lists, or when the server is offline.
+ This is also known as "best effort" strategy and addresses the Fiddler
+ issue.
- Switch all Visual Studio 2015 builds to Visual Studio 2017. It's not a
- moving target anymore as the last update, Update 9, has been released.
+ Unfortunately, this strategy was not chosen as the default for schannel
+ (and is therefore a backend-specific behavior: OpenSSL seems to happily
+ ignore the offline servers and missing distribution points).
- Closes https://github.com/curl/curl/pull/3606
-
-- AppVeyor: switch VS 2015 builds to VS 2017 image
+ To maintain backward-compatibility, we therefore add a new flag
+ (`CURLSSLOPT_REVOKE_BEST_EFFORT`) and a new option
+ (`--ssl-revoke-best-effort`) to select the new behavior.
+
+ Due to the many related issues Git for Windows and GitHub Desktop, the
+ plan is to make this behavior the default in these software packages.
- The Visual Studio 2017 image has Visual Studio 2015 and 2017 installed.
+ The test 2070 was added to verify this behavior, adapted from 310.
- Closes https://github.com/curl/curl/pull/3606
+ Based-on-work-by: georgeok <giorgos.n.oikonomou@gmail.com>
+ Co-authored-by: Markus Olsson <j.markus.olsson@gmail.com>
+ Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+
+ Closes https://github.com/curl/curl/pull/4981
-- AppVeyor: explicitly select worker image
+- multi: Improve parameter check for curl_multi_remove_handle
+
+ - If an easy handle is owned by a multi different from the one specified
+ then return CURLM_BAD_EASY_HANDLE.
- Currently, we're using the default Visual Studio 2015 image for
- everything.
+ Prior to this change I assume user error could cause corruption.
- Closes https://github.com/curl/curl/pull/3606
+ Closes https://github.com/curl/curl/pull/5116
-Daniel Stenberg (26 Feb 2019)
-- strerror: make the strerror function use local buffers
+Viktor Szakats (17 Mar 2020)
+- windows: suppress UI in all CryptAcquireContext() calls
- Instead of using a fixed 256 byte buffer in the connectdata struct.
+ Ref: https://docs.microsoft.com/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta#parameters
+ Reviewed-by: Marc Hörsken
+ Closes https://github.com/curl/curl/pull/5088
+
+Daniel Stenberg (17 Mar 2020)
+- writeout_json: add missing comma to fix the HTTP version
- In my build, this reduces the size of the connectdata struct by 11.8%,
- from 2160 to 1904 bytes with no functionality or performance loss.
+ Follow-up to 04c03416e68fd635a15
+
+- test 970: verify --write-out '%{json}'
- This also fixes a bug in schannel's Curl_verify_certificate where it
- called Curl_sspi_strerror when it should have called Curl_strerror for
- string from GetLastError. the only effect would have been no text or the
- wrong text being shown for the error.
+ Makes curl_easy_getinfo() of "variable" numerical content instead return
+ the number set in the env variable `CURL_TIME`.
- Co-authored-by: Jay Satiro
+ Makes curl_version() of "variable" textual content. This guarantees a
+ stable version string which can be tested against. Environment variable
+ `CURL_VERSION` defines the content.
- Closes #3612
+ Assisted-by: Mathias Gumz
-- [Michael Wallner brought this change]
+- [Mathias Gumz brought this change]
- cookies: fix NULL dereference if flushing cookies with no CookieInfo set
+ writeout: support to generate JSON output
- Regression brought by a52e46f3900fb0 (shipped in 7.63.0)
+ This commit adds support to generate JSON via the writeout feature:
- Closes #3613
-
-Marcel Raad (26 Feb 2019)
-- AppVeyor: re-enable test 500
+ -w "%{json}"
- It's passing now.
+ It leverages the existing infrastructure as much as possible. Thus,
+ generating the JSON on STDERR is possible by:
- Closes https://github.com/curl/curl/pull/3615
-
-- AppVeyor: remove redundant builds
+ -w "%{stderr}%{json}"
- Remove the Visual Studio 2012 and 2013 builds as they add little value.
+ This implements a variant of
+ https://github.com/curl/curl/wiki/JSON#--write-out-json.
- Ref: https://github.com/curl/curl/pull/3606
- Closes https://github.com/curl/curl/pull/3614
-
-Daniel Stenberg (25 Feb 2019)
-- RELEASE-NOTES: synced
+ Closes #4870
-- [Bernd Mueller brought this change]
+- CI: stop ignoring 323, it is disabled
- OpenSSL: add support for TLS ASYNC state
+- DISABLED: disable test 323
- Closes #3591
-
-Jay Satiro (25 Feb 2019)
-- [Michael Felt brought this change]
-
- acinclude: add additional libraries to check for LDAP support
+ The test uses SRP to "a server not supporting it" but modern stunnel
+ versions will silently accept it and remain happy. The test is therefore
+ faulty.
- - Add an additional check for LDAP that also checks for OpenSSL since
- on AIX those libraries may be required to link LDAP properly.
+ I haven't figured out how to make stunnel explicitly reject SRP-using
+ connects.
- Fixes https://github.com/curl/curl/issues/3595
- Closes https://github.com/curl/curl/pull/3596
+ Reported-by: Marc Hörsken
+ Fixes #5105
+ Closes #5113
-- [Giorgos Oikonomou brought this change]
-
- schannel: support CALG_ECDH_EPHEM algorithm
+Marc Hoersken (17 Mar 2020)
+- ci/tests: increase timeouts for torture builds on Azure Pipelines
- Add support for Ephemeral elliptic curve Diffie-Hellman key exchange
- algorithm option when selecting ciphers. This became available on the
- Win10 SDK.
+ For some reason the torture builds have slowed down recently.
- Closes https://github.com/curl/curl/pull/3608
+ Reported-by: Daniel Stenberg
-Daniel Stenberg (24 Feb 2019)
-- multi: call multi_done on connect timeouts
+Daniel Stenberg (16 Mar 2020)
+- cmake: add support for building with wolfSSL
+
+ My working build cmdline:
- Failing to do so would make the CURLINFO_TOTAL_TIME timeout to not get
- updated correctly and could end up getting reported to the application
- completely wrong (way too small).
+ $ cmake -DCMAKE_PREFIX_PATH=$HOME/build-wolfssl -DCMAKE_USE_WOLFSSL=ON .
- Reported-by: accountantM on github
- Fixes #3602
- Closes #3605
+ Assisted-by: Brad King
+ Closes #5095
-- examples: remove recursive calls to curl_multi_socket_action
+- tool_operate: fix add_parallel_transfers when more are in queue
- From within the timer callbacks. Recursive is problematic for several
- reasons. They should still work, but this way the examples and the
- documentation becomes simpler. I don't think we need to encourage
- recursive calls.
+ Trying to return early from the function if no new transfers were added
+ would break the "morep" argument and cause issues. This could lead to
+ zero content "transfers" (within quotes since they would never be
+ started) when parallel-max was reduced.
- Discussed in #3537
- Closes #3601
+ Reported-by: Gavin Wong
+ Analyzed-by: Jay Satiro
+ Fixes #4937
+ Closes #5112
-Marcel Raad (23 Feb 2019)
-- configure: remove CURL_CHECK_FUNC_FDOPEN call
+- vtls: free ssl_config leftovers on out-of-memory
- The macro itself has been removed in commit
- 11974ac859c5d82def59e837e0db56fef7f6794e.
+ Torture testing 2034 and 2037 found this.
- Closes https://github.com/curl/curl/pull/3604
+ Reported-by: Marc Hörsken
+ Fixes #5108
+ Closes #5109
-Daniel Stenberg (23 Feb 2019)
-- wolfssl: stop custom-adding curves
+Marc Hoersken (16 Mar 2020)
+- ci/tests: fix Azure Pipelines not running for pull requests
- since wolfSSL PR https://github.com/wolfSSL/wolfssl/pull/717 (shipped in
- wolfSSL 3.10.2 and later) it sends these curves by default already.
-
- Pointed-out-by: David Garske
+ Closes #5111
+
+Daniel Stenberg (15 Mar 2020)
+- gskit: update the copyright year range
- Closes #3599
+ Follow-up from 083603c63a3
-- configure: remove the unused fdopen macro
+Marc Hoersken (15 Mar 2020)
+- gskit: use our internal select wrapper for portability
- and the two remaining #ifdefs for it
+ Follow up to c52b342
+ Closes #5106
+
+- tests: fix verification of stdout in test 1452 due to newline
- Closes #3600
+ Fixes test1452:41:1: error: missing </stdout> tag before </verify>
-Jay Satiro (22 Feb 2019)
-- url: change conn shutdown order to unlink data as last step
+- ci/tests: install impacket for SMB tests on FreeBSD using CirrusCI
- - Split off connection shutdown procedure from Curl_disconnect into new
- function conn_shutdown.
+ Also force the package index/cache to be updated before installing.
- - Change the shutdown procedure to close the sockets before
- disassociating the transfer.
+ Closes #5103
+
+- tests/README: add note about manually installing python-impacket
- Prior to this change the sockets were closed after disassociating the
- transfer so SOCKETFUNCTION wasn't called since the transfer was already
- disassociated. That likely came about from recent work started in
- Jan 2019 (#3442) to separate transfers from connections.
+ Follow up to 4be2560
+
+Daniel Stenberg (15 Mar 2020)
+- transfer: cap retries of "dead connections" to 5
- Bug: https://curl.haxx.se/mail/lib-2019-02/0101.html
- Reported-by: Pavel Löbl
+ When libcurl retries a connection due to it being "seemingly dead" or by
+ REFUSED_STREAM, it will now only do it up five times before giving up,
+ to avoid never-ending loops.
- Closes https://github.com/curl/curl/issues/3597
- Closes https://github.com/curl/curl/pull/3598
+ Reported-by: Dima Tisnek
+ Bug: https://curl.haxx.se/mail/lib-2020-03/0044.html
+ Closes #5074
-Marcel Raad (22 Feb 2019)
-- Fix strict-prototypes GCC warning
+- TODO: TLS-PSK with OpenSSL
- As seen in the MinGW autobuilds. Caused by commit
- f26bc29cfec0be84c67cf74065cf8e5e78fd68b7.
+ Closes #5081
-Dan Fandrich (21 Feb 2019)
-- tests: Fixed XML validation errors in some test files.
+Marc Hoersken (15 Mar 2020)
+- select: add 'timeout_ms' wrap-around precaution to Curl_select
-Daniel Stenberg (20 Feb 2019)
-- TODO: Allow SAN names in HTTP/2 server push
+- select: fix 'pending_ms' is assigned a value that is never used
- Suggested-by: Nicolas Grekas
-
-- RELEASE-NOTES: synced
+ Detected by Codacy
-- curl: remove MANUAL from -M output
+- select: move duplicate select preparation code into Curl_select
- ... and remove it from the dist tarball. It has served its time, it
- barely gets updated anymore and "everything curl" is now convering all
- this document once tried to include, and does it more and better.
+ Reviewed by Daniel Stenberg
+ Reviewed by Marcel Raad
+ Closes #5078
+
+Daniel Stenberg (15 Mar 2020)
+- connect: happy eyeballs cleanup
- In the compressed scenario, this removes ~15K data from the binary,
- which is 25% of the -M output.
+ Make sure each separate index in connn->tempaddr[] is used for a fixed
+ family (and only that family) during the connection process.
- It remains in the git repo for now for as long as the web site builds a
- page using that as source. It renders poorly on the site (especially for
- mobile users) so its not even good there.
+ If family one takes a long time and family two fails immediately, the
+ previous logic could misbehave and retry the same family two address
+ repeatedly.
- Closes #3587
+ Reported-by: Paul Vixie
+ Reported-by: Jay Satiro
+ Fixes #5083
+ Fixes #4954
+ Closes #5089
+
+Marc Hoersken (15 Mar 2020)
+- ci/tests: fix and align setting TFLAGS for make test-nonflaky
-- http2: verify :athority in push promise requests
+- ci/tests: install test suite dependencies stunnel and impacket
+
+- tests: remove python_dependencies for smbserver from our tree
+
+ Users of the SMB tests will have to install impacket manually.
- RFC 7540 says we should verify that the push is for an "authoritative"
- server. We make sure of this by only allowing push with an :athority
- header that matches the host that was asked for in the URL.
+ Reasoning: our in-tree version of impacket was quite outdated
+ and only compatible with Python 2 which is already end-of-life.
+ Upgrading to Python 3 and a compatible impacket version would
+ require to import additional Python-only and CPython-extension
+ dependencies. This would have hindered portability enormously.
- Fixes #3577
- Reported-by: Nicolas Grekas
- Bug: https://curl.haxx.se/mail/lib-2019-02/0057.html
- Closes #3581
+ Closes #5094
-- singlesocket: fix the 'sincebefore' placement
+Jay Satiro (14 Mar 2020)
+- Makefile.m32: Improve windres parameter compatibility
+
+ - s/COFF/coff/
- The variable wasn't properly reset within the loop and thus could remain
- set for sockets that hadn't been set before and miss notifying the app.
+ Some versions of windres do not recognize uppercase COFF as a valid
+ way to specify the COFF output format.
- This is a follow-up to 4c35574 (shipped in curl 7.64.0)
+ Reported-by: Steven Penny
- Reported-by: buzo-ffm on github
- Detected-by: Jan Alexander Steffens
- Fixes #3585
- Closes #3589
+ Fixes https://github.com/curl/curl/issues/5099
+ Closes https://github.com/curl/curl/pull/5101
-- connection: never reuse CONNECT_ONLY conections
+- easy: Fix curl_easy_duphandle for builds missing IPv6 that use c-ares
- and make CONNECT_ONLY conections never reuse any existing ones either.
+ - Ignore CURLE_NOT_BUILT_IN errors returned by c-ares functions in
+ curl_easy_duphandle.
- Reported-by: Pavel Löbl
- Bug: https://curl.haxx.se/mail/lib-2019-02/0064.html
- Closes #3586
-
-Patrick Monnerat (19 Feb 2019)
-- cli tool: fix mime post with --disable-libcurl-option configure option
+ Prior to this change if c-ares was used as the resolver backend and
+ either it was too old or libcurl was built without IPv6 support then
+ some of our resolver functions could return CURLE_NOT_BUILT_IN to
+ curl_easy_duphandle causing it to fail.
- Reported-by: Marcel Raad
- Fixes #3576
- Closes #3583
-
-Daniel Stenberg (19 Feb 2019)
-- x509asn1: cleanup and unify code layout
+ Caused by c8f086b which shipped in 7.69.1.
- - rename 'n' to buflen in functions, and use size_t for them. Don't pass
- in negative buffer lengths.
+ Reported-by: Karl Chen
- - move most function comments to above the function starts like we use
- to
+ Fixes https://github.com/curl/curl/issues/5097
+ Closes https://github.com/curl/curl/pull/5100
+
+Daniel Stenberg (13 Mar 2020)
+- docs: add warnings about FILE: URLs on Windows
- - remove several unnecessary typecasts (especially of NULL)
+ - --url man page section
+ - libcurl-security.3 gets the full text
+ - CURLOPT_URL.3
- Reviewed-by: Patrick Monnerat
- Closes #3582
+ Reported-by: Tim Sedlmeyer
-- curl_multi_remove_handle.3: use at any time, just not from within callbacks
+- server/getpart: make the "XML-parser" stricter
- [ci skip]
+ When extracting a <section> <part> and there's no </part> before
+ </section>, this now outputs an error and returns a wrong string to
+ make users spot the mistake.
+
+ Ref: #5070
+ Closes #5071
-- http: make adding a blank header thread-safe
+Marc Hoersken (13 Mar 2020)
+- impacket: some more Python 3 code compatibility updates
- Previously the function would edit the provided header in-place when a
- semicolon is used to signify an empty header. This made it impossible to
- use the same set of custom headers in multiple threads simultaneously.
+ This makes smbserver load on Python 3, but still not work completely.
+
+- smbserver: pin Python version to 2 since we are not yet 3 compatible
- This approach now makes a local copy when it needs to edit the string.
+ Even though the existing code can be fixed to run on Python 3, the
+ tests will fail due to the Unicode transition the protocol is invalid.
- Reported-by: d912e3 on github
- Fixes #3578
- Closes #3579
+ Follow up to ee63837
+ Closes #5085
-- unit1651: survive curl_easy_init() fails
+Daniel Stenberg (12 Mar 2020)
+- [Viktor Szakats brought this change]
-- [Frank Gevaerts brought this change]
+ cleanup: fix some text/comment typos
+
+ Closes #5087
- rand: Fix a mismatch between comments in source and header.
+Marc Hoersken (12 Mar 2020)
+- smbserver: fix Python version specific ConfigParser import
- Reported-by: Björn Stenberg <bjorn@haxx.se>
- Closes #3584
+ Follow up to ee63837 and 8c7c4a6
+ Fixes #5077
-Patrick Monnerat (18 Feb 2019)
-- x509asn1: replace single char with an array
+Daniel Stenberg (11 Mar 2020)
+- RELEASE-NOTES: synced
- Although safe in this context, using a single char as an array may
- cause invalid accesses to adjacent memory locations.
+ bumped to 7.69.2
+
+Dan Fandrich (11 Mar 2020)
+- tests/data: Fix some XML formatting issues in test cases
- Detected by Coverity.
+ This allows these test files to pass xmllint.
-Daniel Stenberg (18 Feb 2019)
-- examples/http2-serverpush: add some sensible error checks
+Daniel Stenberg (11 Mar 2020)
+- [Muhammad Herdiansyah brought this change]
+
+ Makefile: run the cd commands in a subshell
- To avoid NULL pointer dereferences etc in the case of problems.
+ In bmake, if the directory is changed (with cd or anything else), bmake
+ won't return to the "root directory" on the next command (in the same
+ Makefile rule). This commit runs the cd command in a subshell so it
+ would work in bmake.
- Closes #3580
+ Closes #5073
-Jay Satiro (18 Feb 2019)
-- easy: fix win32 init to work without CURL_GLOBAL_WIN32
+- configure: convert -I to -isystem as a last step
- - Change the behavior of win32_init so that the required initialization
- procedures are not affected by CURL_GLOBAL_WIN32 flag.
+ As all the -I uses in CFLAGS at that point are for system headers and
+ third party libraries this helps us remove/ignore warnings on those!
- libcurl via curl_global_init supports initializing for win32 with an
- optional flag CURL_GLOBAL_WIN32, which if omitted was meant to stop
- Winsock initialization. It did so internally by skipping win32_init()
- when that flag was set. Since then win32_init() has been expanded to
- include required initialization routines that are separate from
- Winsock and therefore must be called in all cases. This commit fixes
- it so that CURL_GLOBAL_WIN32 only controls the optional win32
- initialization (which is Winsock initialization, according to our doc).
+ Closes #5060
+
+- configure: fix -pedantic-errors for GCC 5 and later
- The only users affected by this change are those that don't pass
- CURL_GLOBAL_WIN32 to curl_global_init. For them this commit removes the
- risk of a potential crash.
+ If --enable-werror is used.
- Ref: https://github.com/curl/curl/pull/3573
+ Follow-up to d5c0351055d5709da which added it too early in the configure
+ script before $compiler_num was set correctly and thus this option was
+ never used.
- Fixes https://github.com/curl/curl/issues/3313
- Closes https://github.com/curl/curl/pull/3575
+ Reported-by: Stepan Efremov
+ Fixes #5067
+ Closes #5068
-Daniel Gustafsson (17 Feb 2019)
-- cookie: Add support for cookie prefixes
+- configure: document 'compiler_num' for gcc
- The draft-ietf-httpbis-rfc6265bis-02 draft, specify a set of prefixes
- and how they should affect cookie initialization, which has been
- adopted by the major browsers. This adds support for the two prefixes
- defined, __Host- and __Secure, and updates the testcase with the
- supplied examples from the draft.
+ The CURL_CHECK_COMPILER_GNU_C function sets the number to MAJOR*100 +
+ MINOR and ignores the patch version, and since gcc version 7 it only
+ sets it to MAJOR*100.
- Closes #3554
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Reported-by: Stepan Efremov
+ Ref: #5067
+ Closes #5069
-- mbedtls: release sessionid resources on error
-
- If mbedtls_ssl_get_session() fails, it may still have allocated
- memory that needs to be freed to avoid leaking. Call the library
- API function to release session resources on this errorpath as
- well as on Curl_ssl_addsessionid() errors.
-
- Closes: #3574
- Reported-by: Michał Antoniak <M.Antoniak@posnet.com>
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+Version 7.69.1 (11 Mar 2020)
-Patrick Monnerat (16 Feb 2019)
-- cli tool: refactor encoding conversion sequence for switch case fallthrough.
+Daniel Stenberg (11 Mar 2020)
+- RELEASE-NOTES: 7.69.1
-- version.c: silent scan-build even when librtmp is not enabled
+- THANKS: from the 7.69.1 release
-Daniel Stenberg (15 Feb 2019)
-- RELEASE-NOTES: synced
+- [Marc Hoersken brought this change]
-- Curl_now: figure out windows version in win32_init
-
- ... and avoid use of static variables that aren't thread safe.
+ test1129: fix invalid case of closing XML-tag and Content-Length
- Fixes regression from e9ababd4f5a (present in the 7.64.0 release)
-
- Reported-by: Paul Groke
- Fixes #3572
- Closes #3573
+ Fixes #5070
+ Closes #5072
-Marcel Raad (15 Feb 2019)
-- unit1307: just fail without FTP support
-
- I missed to check this in with commit
- 71786c0505926aaf7e9b2477b2fb7ee16a915ec6, which only disabled the test.
- This fixes the actual linker error.
+Marc Hoersken (10 Mar 2020)
+- tests/data: fix static ip instead of dynamic value being used
- Closes https://github.com/curl/curl/pull/3568
+ Follow up to 94ced8e
-Daniel Stenberg (15 Feb 2019)
-- travis: enable valgrind for the iconv tests too
+- tests/data: fix static ip:port instead of dynamic values being used
- Closes #3571
+ Closes #5065
-- travis: add scan-build
+- tests/server: fix missing use of exe_ext helper function
- Closes #3564
+ Follow up to 9819984 and 3dce984
+ Reviewed-By: Daniel Stenberg
+ Closes #5064
-- examples/sftpuploadresume: Value stored to 'result' is never read
-
- Detected by scan-build
+- runtests: log minimal and maximal used port numbers
+
+Daniel Stenberg (9 Mar 2020)
+- [James Fuller brought this change]
-- examples/http2-upload: cleaned up
+ sftp: fix segfault regression introduced by #4747
+
+ This fix adds a defensive check for the case where the char *name in
+ struct libssh2_knownhost is NULL
- Fix scan-build warnings, no globals, no silly handle scan. Also remove
- handles from the multi before cleaning up.
+ Fixes #5041
+ Closes #5062
+
+- RELEASE-NOTES: synced
-- examples/http2-download: cleaned up
+- socks4: fix host resolve regression
- To avoid scan-build warnings and global variables.
+ 1. The socks4 state machine was broken in the host resolving phase
+
+ 2. The code now insists on IPv4-only when using SOCKS4 as the protocol
+ only supports that.
+
+ Regression from #4907 and 4a4b63d, shipped in 7.69.0
+
+ Reported-by: amishmm on github
+ Bug: https://github.com/curl/curl/issues/5053#issuecomment-596191594
+ Closes #5061
+
+- [Patrick Monnerat brought this change]
-- examples/postinmemory: Potential leak of memory pointed to by 'chunk.memory'
+ silly web server: silent a compilation warning
- Detected by scan-build
+ Recent gcc warns when byte count of strncpy() equals the destination
+ buffer size. Since the destination buffer is previously cleared and
+ the source string is always shorter, reducing the byte count by one
+ silents the warning without affecting the result.
+
+ Closes #5059
+
+- [Patrick Monnerat brought this change]
-- examples/httpcustomheader: Value stored to 'res' is never read
+ cookie: get_top_domain() sets zero length for null domains
- Detected by scan-build
+ This silents a compilation warning with gcc -O3.
+
+- [Patrick Monnerat brought this change]
-- examples: remove superfluous null-pointer checks
+ test 1560: avoid valgrind false positives
- in ftpget, ftpsget and sftpget, so that scan-build stops warning for
- potential NULL pointer dereference below!
+ When using maximum code optimization level (-O3), valgrind wrongly
+ detects uses of uninitialized values in strcmp().
- Detected by scan-build
+ Preset buffers with all zeroes to avoid that.
-- strip_trailing_dot: make sure NULL is never used for strlen
+Steve Holme (8 Mar 2020)
+- sha256: Added WinCrypt implementation
- scan-build warning: Null pointer passed as an argument to a 'nonnull'
- parameter
+ Closed #5030
-- [Jay Satiro brought this change]
+- sha256: Added SecureTransport implementation
- connection_check: restore original conn->data after the check
+Daniel Stenberg (7 Mar 2020)
+- lib1564: reduce number of mid-wait wakeup calls
- - Save the original conn->data before it's changed to the specified
- data transfer for the connection check and then restore it afterwards.
+ This test does A LOT of *wakeup() calls and then calls curl_multi_poll()
+ twice. The first *poll() is then expected to return early and the second
+ not - as the first is supposed to drain the socketpair pipe.
- This is a follow-up to 38d8e1b 2019-02-11.
+ It turns out however that when given "excessive" amounts of writes to
+ the pipe, some operating systems (the Solaris based are known) will
+ return EAGAIN before the pipe is drained, which in our test case causes
+ the second *poll() call to also abort early.
- History:
+ This change attempts to avoid the OS-specific behaviors in the test by
+ reducing the amount of wakeup calls from 1234567 to 10.
- It was discovered a month ago that before checking whether to extract a
- dead connection that that connection should be associated with a "live"
- transfer for the check (ie original conn->data ignored and set to the
- passed in data). A fix was landed in 54b201b which did that and also
- cleared conn->data after the check. The original conn->data was not
- restored, so presumably it was thought that a valid conn->data was no
- longer needed.
+ Reported-by: Andy Fiddaman
+ Fixes #5037
+ Closes #5058
+
+- [Patrick Monnerat brought this change]
+
+ mime: fix the binary encoder to handle large data properly
- Several days later it was discovered that a valid conn->data was needed
- after the check and follow-up fix was landed in bbae24c which partially
- reverted the original fix and attempted to limit the scope of when
- conn->data was changed to only when pruning dead connections. In that
- case conn->data was not cleared and the original conn->data not
- restored.
+ New test 666 checks this is effective.
+ As upload buffer size is significant in this kind of tests, shorten it
+ in similar test 652.
- A month later it was discovered that the original fix was somewhat
- correct; a "live" transfer is needed for the check in all cases
- because original conn->data could be null which could cause a bad deref
- at arbitrary points in the check. A fix was landed in 38d8e1b which
- expanded the scope to all cases. conn->data was not cleared and the
- original conn->data not restored.
+ Fixes #4860
+ Closes #4833
+ Reported-by: RuurdBeerstra on github
+
+- [Patrick Monnerat brought this change]
+
+ mime: do not perform more than one read in a row
- A day later it was discovered that not restoring the original conn->data
- may lead to busy loops in applications that use the event interface, and
- given this observation it's a pretty safe assumption that there is some
- code path that still needs the original conn->data. This commit is the
- follow-up fix for that, it restores the original conn->data after the
- connection check.
+ Input buffer filling may delay the data sending if data reads are slow.
+ To overcome this problem, file and callback data reads do not accumulate
+ in buffer anymore. All other data (memory data and mime framing) are
+ considered as fast and still concatenated in buffer.
+ As this may highly impact performance in terms of data overhead, an early
+ end of part data check is added to spare a read call.
+ When encoding a part's data, an encoder may require more bytes than made
+ available by a single read. In this case, the above rule does not apply
+ and reads are performed until the encoder is able to deliver some data.
- Assisted-by: tholin@users.noreply.github.com
- Reported-by: tholin@users.noreply.github.com
+ Tests 643, 644, 645, 650 and 654 have been adapted to the output data
+ changes, with test data size reduced to avoid the boredom of long lists of
+ 1-byte chunks in verification data.
+ New test 667 checks mimepost using single-byte read callback with encoder.
+ New test 668 checks the end of part data early detection.
- Fixes https://github.com/curl/curl/issues/3542
- Closes #3559
+ Fixes #4826
+ Reported-by: MrdUkk on github
+
+- [Patrick Monnerat brought this change]
-- memdebug: bring back curl_mark_sclose
+ mime: latch last read callback status.
- Used by debug builds with NSS.
+ In case a read callback returns a status (pause, abort, eof,
+ error) instead of a byte count, drain the bytes read so far but
+ remember this status for further processing.
+ Takes care of not losing data when pausing, and properly resume a
+ paused mime structure when requested.
+ New tests 670-673 check unpausing cases, with easy or multi
+ interface and mime or form api.
- Reverted from 05b100aee247bb
+ Fixes #4813
+ Reported-by: MrdUkk on github
+
+Marc Hoersken (7 Mar 2020)
+- runtests: fix missing use of exe_ext helper function
+
+Daniel Stenberg (7 Mar 2020)
+- [Ernst Sjöstrand brought this change]
-Patrick Monnerat (14 Feb 2019)
-- transfer.c: do not compute length of undefined hex buffer.
+ ares: store dns parameters for duphandle
- On non-ascii platforms, the chunked hex header was measured for char code
- conversion length, even for chunked trailers that do not have an hex header.
- In addition, the efective length is already known: use it.
- Since the hex length can be zero, only convert if needed.
+ With c-ares the dns parameters lives in ares_channel. Store them in the
+ curl handle and set them again in easy_duphandle.
- Reported by valgrind.
-
-Daniel Stenberg (14 Feb 2019)
-- KNOWN_BUGS: Cannot compile against a static build of OpenLDAP
+ Regression introduced in #3228 (6765e6d), shipped in curl 7.63.0.
- Closes #2367
+ Fixes #4893
+ Closes #5020
+ Signed-off-by: Ernst Sjöstrand <ernst.sjostrand@verisure.com>
-Patrick Monnerat (14 Feb 2019)
-- x509asn1: "Dereference of null pointer"
+- version: make curl_version* thread-safe without using global context
- Detected by scan-build (false positive).
+ Closes #5010
-Daniel Stenberg (14 Feb 2019)
-- configure: show features as well in the final summary
-
- Closes #3569
+- RELEASE-NOTES: synced
-- KNOWN_BUGS: curl compiled on OSX 10.13 failed to run on OSX 10.10
+Marc Hoersken (7 Mar 2020)
+- tests: use native Sleep function as fallback on Windows
- Closes #2905
+ Reviewed-By: Daniel Stenberg
+ Closes #5054
-- KNOWN_BUGS: Deflate error after all content was received
+- perl: align order and completeness of Windows OS checks
+
+Daniel Stenberg (7 Mar 2020)
+- tool_cb_see: set correct copyright year range
- Closes #2719
+ Follow-up to a39e5bfb9
-- gssapi: fix deprecated header warnings
+Marc Hoersken (7 Mar 2020)
+- seek: fix fallback for missing ftruncate on Windows
- Heimdal includes on FreeBSD spewed out lots of them. Less so now.
+ This fixes test 198 on versions of MinGW-w64 without ftruncate
- Closes #3566
+ Reviewed-By: Daniel Stenberg
+ Reviewed-By: Marcel Raad
+ Closes #5055
-- TODO: Upgrade to websockets
-
- Closes #3523
+- config-win32: Windows does not have ftruncate
-- TODO: cmake test suite improvements
+Daniel Stenberg (7 Mar 2020)
+- pause: force a connection (re-)check after unpausing
- Closes #3109
+ There might be data available that was already read off the socket, for
+ example in the TLS layer.
+
+ Reported-by: Anders Berg
+ Fixes #4966
+ Closes #5049
-Patrick Monnerat (13 Feb 2019)
-- curl: "Dereference of null pointer"
+- socks5: switch state properly when the resolve is done
- Rephrase to satisfy scan-build.
+ Regression from 4a4b63d (and #4907)
+ Reported-by: vitaha85 on github
+ Fixes #5053
+ Closes #5056
-Marcel Raad (13 Feb 2019)
-- unit1307: require FTP support
+Jay Satiro (7 Mar 2020)
+- libssh: Fix matching user-specified MD5 hex key
+
+ Prior to this change a match would never be successful because it
+ was mistakenly coded to compare binary data from libssh to a
+ user-specified hex string (ie CURLOPT_SSH_HOST_PUBLIC_KEY_MD5).
- This test doesn't link without FTP support after
- fc7ab4835b5fd09d0a6f57000633bb6bb6edfda1, which made Curl_fnmatch
- unavailable without FTP support.
+ Reported-by: fds242@users.noreply.github.com
- Closes https://github.com/curl/curl/pull/3565
+ Fixes https://github.com/curl/curl/issues/4971
+ Closes https://github.com/curl/curl/pull/4974
-Daniel Stenberg (13 Feb 2019)
-- TODO: TFO support on Windows
+Daniel Stenberg (6 Mar 2020)
+- pause: bail out on bad input
- Nobody works on this now.
+ A NULL easy handle or an easy handle without an associated connection
+ cannot be paused or unpaused.
- Closes #3378
+ Closes #5050
-- multi: Dereference of null pointer
+Steve Holme (6 Mar 2020)
+- unit1612: fixed the inclusion and compilation of the HMAC unit test
- Mostly a false positive, but this makes the code easier to read anyway.
+ Follow up to 3f74e5e6 to fix:
- Detected by scan-build.
+ - A typo in Makefile.inc where unit1611 was used instead
+ - Some compilation issues in unit1612.c
- Closes #3563
+ Closes #5024
-- urlglob: Argument with 'nonnull' attribute passed null
+Daniel Stenberg (6 Mar 2020)
+- pause: return early for calls that don't change pause state
- Detected by scan-build.
+ Reviewed-by: Patrick Monnerat
+ Ref: #4833
+ Closes #5026
-Jay Satiro (12 Feb 2019)
-- schannel: restore some debug output but only for debug builds
+Jay Satiro (6 Mar 2020)
+- curl_share_setopt.3: Note sharing cookies doesn't enable the engine
- Follow-up to 84c10dc from earlier today which wrapped a lot of the noisy
- debug output in DEBUGF but omitted a few lines.
+ Follow-up to d0a7ee3 which fixed a bug in 7.66.0 that caused
+ CURL_LOCK_DATA_COOKIE to enable the easy handle's cookie engine.
- Ref: https://github.com/curl/curl/commit/84c10dc#r32292900
+ Bug: https://curl.haxx.se/mail/lib-2020-03/0019.html
+ Reported-by: Felipe Gasper
+
+ Closes https://github.com/curl/curl/pull/5048
-- examples/crawler: Fix the Accept-Encoding setting
+- multi: skip EINTR check on wakeup socket if it was closed
+
+ - Don't check errno on wakeup socket if sread returned 0 since sread
+ doesn't set errno in that case.
- - Pass an empty string to CURLOPT_ACCEPT_ENCODING to use the default
- supported encodings.
+ This is a follow-up to cf7760a from several days ago which fixed
+ Curl_multi_wait to stop busy looping sread on the non-blocking wakeup
+ socket if it was closed (ie sread returns 0). Due to a logic error it
+ was still possible to busy loop in that case if errno == EINTR.
- Prior to this change the specific encodings of gzip and deflate were set
- but there's no guarantee they'd be supported by the user's libcurl.
+ Closes https://github.com/curl/curl/pull/5047
-Daniel Stenberg (12 Feb 2019)
-- mime: put the boundary buffer into the curl_mime struct
+Daniel Stenberg (6 Mar 2020)
+- transfer: set correct copyright year range
+
+- urldata: remove the 'stream_was_rewound' connectdata struct member
- ... instead of allocating it separately and point to it. It is
- fixed-size and always used for each part.
+ ... as it is never set anywhere.
- Closes #3561
+ Follow-up to 2f44e94ef
+ Closes #5046
-- schannel: be quiet
+- Revert "pause: force-drain the transfer on unpause"
- Convert numerous infof() calls into debug-build only messages since they
- are annoyingly verbose for regular applications. Removed a few.
+ This reverts commit fa0216b294af4c7113a9040ca65eefc7fc18ac1c (from #5000)
- Bug: https://curl.haxx.se/mail/lib-2019-02/0027.html
- Reported-by: Volker Schmid
- Closes #3552
-
-- [Romain Geissler brought this change]
+ Clearly that didn't solve the problem correctly.
+
+ Reported-by: Christopher Reid
+ Reopens #4966
+ Fixes #5044
- Curl_resolv: fix a gcc -Werror=maybe-uninitialized warning
+- RELEASE-NOTES: synced
- Closes #3562
+ and bumped curlver.h
-- http2: multi_connchanged() moved from multi.c, only used for h2
+- MANUAL: update a dict-using command line
- Closes #3557
+ The 'web1913' database is now invalid, use 'gcide' instead.
-- curl: "Function call argument is an uninitialized value"
+- KNOWN_BUGS: configure --with-gssapi with Heimdal is ignored on macOS
- Follow-up to cac0e4a6ad14b42471eb
+ Closes #3841
+
+- polarssl: remove more references and mentions
- Detected by scan-build
- Closes #3560
+ Assisted-by: Jay Satiro
+ Follow-up to 6357a19ff29dac04
+ Closes #5036
-- pretransfer: don't strlen() POSTFIELDS set for GET requests
+Marc Hoersken (4 Mar 2020)
+- tests: wrap ignored test failures in braces
+
+- tests: align some Windows sleep defines with each other
+
+- tests: try to make sleeping portable by avoiding select
- ... since that data won't be used in the request anyway.
+ select does not support just waiting on Windows:
+ https://perldoc.perl.org/perlport.html#select
- Fixes #3548
- Reported-by: Renaud Allard
- Close #3549
+ Reviewed-By: Daniel Stenberg
+ Closes #5035
-- multi: remove verbose "Expire in" ... messages
+Daniel Stenberg (4 Mar 2020)
+- runtests.1: rephrase how to specify what tests to run
- Reported-by: James Brown
- Bug: https://curl.haxx.se/mail/archive-2019-02/0013.html
- Closes #3558
-
-- mbedtls: make it build even if MBEDTLS_VERSION_C isn't set
+ Also mention the new tilde-prefixed way to ignore test results.
- Reported-by: MAntoniak on github
- Fixes #3553
- Closes #3556
+ Reviewed-By: Marc Hoersken
+ Closes #5033
-Daniel Gustafsson (12 Feb 2019)
-- non-ascii.c: fix typos in comments
+- cirrus-ci: disable the FreeBSD 13 builds
- Fix two occurrences of s/convers/converts/ spotted while reading code.
-
-Daniel Stenberg (12 Feb 2019)
-- fnmatch: disable if FTP is disabled
+ FreeBSD 13.0 is apparently close to a year away from a stable release
+ and has proven to cause intermittent builds failures recently.
- Closes #3551
+ Assisted-by: Dan Fandrich
+ Assisted-by: Fedor Korotkov
+ Fixes #5028
+ Closes #5029
-- curl_path: only enabled for SSH builds
+Version 7.69.0 (4 Mar 2020)
-- [Frank Gevaerts brought this change]
+Daniel Stenberg (4 Mar 2020)
+- RELEASE-NOTES: 7.69.0
- tests: add stderr comparison to the test suite
+- THANKS: from 7.69.0
- The code is more or less copied from the stdout comparison code, maybe
- some better reuse is possible.
+ Now sorted case insensitive
+
+Marc Hoersken (3 Mar 2020)
+- ci/tests: fix escaping of testnames and disable proxy for CI APIs
+
+ Follow up to ada581f and c0d8b96
+ Closes #5031
+
+Jay Satiro (3 Mar 2020)
+- cmake: Show HTTPS-proxy in the features output
+
+ - Show HTTPS-proxy in the features output for those backends that
+ support it: OpenSSL, GnuTLS and NSS.
+
+ Prior to this change HTTPS-proxy was missing from the cmake features
+ output even if curl was built with it. Only cmake output was affected.
+ Both the library and tool correctly reported the feature.
- test 1457 is adjusted to make the output actually match (by using --silent)
- test 506 used <stderr> without actually needing it, so that <stderr> block is removed
+ Bug: https://curl.haxx.se/mail/lib-2020-03/0008.html
+ Reported-by: David Lopes
- Closes #3536
+ Closes https://github.com/curl/curl/pull/5025
-Patrick Monnerat (11 Feb 2019)
-- cli tool: do not use mime.h private structures.
+Marc Hoersken (3 Mar 2020)
+- ci/tests: Make it possible to still run but ignore failing tests
- Option -F generates an intermediate representation of the mime structure
- that is used later to create the libcurl mime structure and generate
- the --libcurl statements.
+ This enables the development of a solution for the failing tests by
+ running them on CI while ignoring their result for the overall status.
- Reported-by: Daniel Stenberg
- Fixes #3532
- Closes #3546
+ Closes #4994
-Daniel Stenberg (11 Feb 2019)
-- curlver: bump to 7.64.1-dev
+- README.md: add Azure DevOps Pipelines build status badge
-- RELEASE-NOTES: synced
+- ci/tests: Move CI test result creation above environment setup
- and bump the version in progress to 7.64.1. If we merge any "change"
- before the cut-off date, we update again.
-
-Daniel Gustafsson (11 Feb 2019)
-- curl: follow-up to 3f16990ec84
+ This avoids using our test servers as proxy to the AppVeyor API.
- Commit 3f16990ec84cc4b followed-up a bug in b49652ac66cc0 but was
- inadvertently introducing a new bug in the ternary expression.
+ Closes #5022
+
+- ci/tests: Send test results to AppVeyor for status overview
- Close #3555
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+ Closes #5021
-- dns: release sharelock as soon as possible
+Daniel Stenberg (3 Mar 2020)
+- Revert "sha256: Added SecureTransport implementation"
- There is no benefit to holding the data sharelock when freeing the
- addrinfo in case it fails, so ensure releaseing it as soon as we can
- rather than holding on to it. This also aligns the code with other
- consumers of sharelocks.
+ This reverts commit 4feb38deed33fed14ff7c370a6a9153c661dbb9c (from #4956)
- Closes #3516
- Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Daniel Stenberg (11 Feb 2019)
-- curl: follow-up to b49652ac66cc0
+ That commit broke test 1610 on macos builds without TLS.
- On FreeBSD, return non-zero on error otherwise zero.
+ Closes #5027
+
+- dist: include tests/azure.pm in the tarball
+ Bug: https://github.com/curl/curl/commit/ada581f2cc32f48c1629b729707ac19208435b27#commitcomment-37601589
Reported-by: Marcel Raad
-- multi: (void)-prefix when ignoring return values
+Steve Holme (3 Mar 2020)
+- configure.ac: Disable metalink if mbedTLS is specified
- ... and added braces to two function calls which fixes warnings if they
- are replace by empty macros at build-time.
-
-- curl: fix FreeBSD compiler warning in the --xattr code
+ Follow up to cdcc9df1 and #5006. Even though I mentioned mbedTLS as
+ being one of the backends that metalink needs to be disabled for, I
+ seem to have included it in the list of allowed SSL/TLS backends in
+ comnfigure.ac :(
- Closes #3550
+ Closes #5013
-- connection_check: set ->data to the transfer doing the check
-
- The http2 code for connection checking needs a transfer to use. Make
- sure a working one is set before handler->connection_check() is called.
+- sha256: Tidy up following recent changes
- Reported-by: jnbr on github
- Fixes #3541
- Closes #3547
+ Reviewed-by: Daniel Stenberg
+ Closes #4956
+
+- sha256: Added WinCrypt implementation
+
+- sha256: Added SecureTransport implementation
+
+- sha256: Added mbedtls implementation
+
+- sha256: Added GNU TLS gcrypt implementation
+
+- sha256: Added GNU TLS Nettle implementation
-- hostip: make create_hostcache_id avoid alloc + free
+Jay Satiro (2 Mar 2020)
+- curl_escape.3: Add a link to curl_free
- Closes #3544
+ Ref: https://github.com/curl/curl/pull/5016#issuecomment-593628582
-- scripts/singleuse: script to use to track single-use functions
+- curl_getenv.3: Fix the memory handling description
- That is functions that are declared global but are not used from outside
- of the file in which it is declared. Such functions should be made
- static or even at times be removed.
+ - Tell the user to call curl_free() to free the pointer returned by
+ curl_getenv().
- It also verifies that all used curl_ prefixed functions are "blessed"
+ Prior to this change the user was directed to call free(), but that
+ would not work in cases where the library and application use separate C
+ runtimes and therefore have separate heap memory management.
- Closes #3538
+ Closes https://github.com/curl/curl/pull/5016
-- cleanup: make local functions static
+Daniel Stenberg (2 Mar 2020)
+- [Nick Zitzmann brought this change]
+
+ md4: use init/update/final functions in Secure Transport
- urlapi: turn three local-only functions into statics
+ We can use CC_MD4_Init/Update/Final without having to allocate memory
+ directly.
- conncache: make conncache_find_first_connection static
+ Closes #4979
+
+Marc Hoersken (2 Mar 2020)
+- ci/tests: some MacOS builds randomly take longer than 20min
+
+Daniel Stenberg (2 Mar 2020)
+- multi_wait: stop loop when sread() returns zero
- multi: make detach_connnection static
+ It's unclear why it would ever return zero here, but this change fixes
+ Robert's problem and it shouldn't loop forever...
- connect: make getaddressinfo static
+ Reported-by: Robert Dunaj
+ Bug: https://curl.haxx.se/mail/archive-2020-02/0011.html
+ Closes #5019
+
+- http: mark POSTs with no body as "upload done" from the start
- curl_ntlm_core: make hmac_md5 static
+ As we have logic that checks if we get a >= 400 reponse code back before
+ the upload is done, which then got confused since it wasn't "done" but
+ yet there was no data to send!
- http2: make two functions static
+ Reported-by: IvanoG on github
+ Fixes #4996
+ Closes #5002
+
+- tests: disable 962, 963 and 964 on Windows
- http: make http_setup_conn static
+ These tests are also doing UTF-8 SMTP.
- connect: make tcpnodelay static
+ Follow-up to df207d2dd93b9e73
+
+Marc Hoersken (2 Mar 2020)
+- ci/tests: fine-tune Azure Pipeline timeouts with a small puffer
+
+Daniel Stenberg (2 Mar 2020)
+- configure: bump the AC_COPYRIGHT year range
+
+- [Steve Holme brought this change]
+
+ tests: disable SMTP UTF-8 tests on Windows
- tests: make UNITTEST a thing to mark functions with, so they can be static for
- normal builds and non-static for unit test builds
+ Fixes #4988
+ Closes #4992
+
+- formdata/mime: copyright year range update
- ... and mark Curl_shuffle_addr accordingly.
+ Due to the merge/revert cycle
+
+- Revert "mime: latch last read callback status."
- url: make up_free static
+ This reverts commit 87869e38d7afdec3ef1bb4965711458b088e254f.
- setopt: make vsetopt static
+ Fixes #5014
+ Closes #5015
+ Reopens #4833
+
+- Revert "mime: do not perform more than one read in a row"
+
+ This reverts commit ed0f357f7d25566110d4302f33759f4ffb5a6f83.
+
+- Revert "mime: fix the binary encoder to handle large data properly"
- curl_endian: make write32_le static
+ This reverts commit b2caaa0681f329eed317ffb6ae6927f4a539f0c1.
+
+- altsvc: both h3 backends now speak h3-27
- rtsp: make rtsp_connisdead static
+ ... also updated the HTTP3 build description for ngtcp2 accordingly.
+
+- [Patrick Monnerat brought this change]
+
+ mime: fix the binary encoder to handle large data properly
- warnless: remove unused functions
+ New test 666 checks this is effective.
+ As upload buffer size is significant in this kind of tests, shorten it
+ in similar test 652.
- memdebug: remove one unused function, made another static
+ Fixes #4860
+ Reported-by: RuurdBeerstra on github
+
+- [Patrick Monnerat brought this change]
-Dan Fandrich (10 Feb 2019)
-- cirrus: Added FreeBSD builds using Cirrus CI.
+ mime: do not perform more than one read in a row
+
+ Input buffer filling may delay the data sending if data reads are slow.
+ To overcome this problem, file and callback data reads do not accumulate
+ in buffer anymore. All other data (memory data and mime framing) are
+ considered as fast and still concatenated in buffer.
+ As this may highly impact performance in terms of data overhead, an early
+ end of part data check is added to spare a read call.
+ When encoding a part's data, an encoder may require more bytes than made
+ available by a single read. In this case, the above rule does not apply
+ and reads are performed until the encoder is able to deliver some data.
- The build logs will be at https://cirrus-ci.com/github/curl/curl
+ Tests 643, 644, 645, 650 and 654 have been adapted to the output data
+ changes, with test data size reduced to avoid the boredom of long lists of
+ 1-byte chunks in verification data.
+ New test 664 checks mimepost using single-byte read callback with encoder.
+ New test 665 checks the end of part data early detection.
- Some tests are currently failing and so disabled for now. The SSH server
- isn't starting for the SSH tests due to unsupported options used in its
- config file. The DICT server also is failing on startup.
+ Fixes #4826
+ Reported-by: MrdUkk on github
-Daniel Stenberg (9 Feb 2019)
-- url/idnconvert: remove scan for <= 32 ascii values
+- [Patrick Monnerat brought this change]
+
+ mime: latch last read callback status.
- The check was added back in fa939220df before the URL parser would catch
- these problems and therefore these will never trigger now.
+ In case a read callback returns a status (pause, abort, eof,
+ error) instead of a byte count, drain the bytes read so far but
+ remember this status for further processing.
+ Takes care of not losing data when pausing, and properly resume a
+ paused mime structure when requested.
+ New tests 670-673 check unpausing cases, with easy or multi
+ interface and mime or form api.
- Closes #3539
+ Fixes #4813
+ Reported-by: MrdUkk on github
+ Closes #4833
-- urlapi: reduce variable scope, remove unreachable 'break'
+Steve Holme (1 Mar 2020)
+- unit1651: Fixed conversion compilation warning
- Both nits pointed out by codacy.com
+ 371:17: warning: conversion to 'unsigned char' from 'int' may alter its
+ value [-Wconversion]
- Closes #3540
+ Closes #5008
-Alessandro Ghedini (7 Feb 2019)
-- zsh.pl: escape ':' character
+- configure.ac: Disable metalink support if an incompatible SSL/TLS specified
+
+ tool_metalink only supports cryptography from OpenSSL, GnuTLS, NSS,
+ The Win32 Crypto library and Apple's Common Crypto library.
- ':' is interpreted as separator by zsh, so if used as part of the argument
- or option's description it needs to be escaped.
+ If an TLS backend such as mbedTLS or WolfSSL is specified then the
+ following error is given during compilation along, with a load of
+ unresolved extern errors:
- The problem can be reproduced as follows:
+ Can't compile METALINK support without a crypto library.
- % curl --reso<TAB>
- % curl -E <TAB>
+ Reviewed-by: Daniel Stenberg
+ Closes #5006
+
+Marc Hoersken (1 Mar 2020)
+- ci/tests: Update Azure DevOps pipeline job display names
+
+ Make the configure step more descriptive and align others.
+
+- ci/tests: Fix typo in previous commit 597cf2
+
+- ci/tests: Make sure that the AZURE_ACCESS_TOKEN is available
- Bug: https://bugs.debian.org/921452
+ For security reasons the access token is not available to PR builds.
+ Therefore we should not try to use the DevOps API with an empty token.
diff --git a/CMake/CMakeConfigurableFile.in b/CMake/CMakeConfigurableFile.in
index df2c382e9..2bafe2c10 100644
--- a/CMake/CMakeConfigurableFile.in
+++ b/CMake/CMakeConfigurableFile.in
@@ -1 +1,22 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
@CMAKE_CONFIGURABLE_FILE_CONTENT@
diff --git a/CMake/CurlSymbolHiding.cmake b/CMake/CurlSymbolHiding.cmake
index 224755a31..aaac9fead 100644
--- a/CMake/CurlSymbolHiding.cmake
+++ b/CMake/CurlSymbolHiding.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
include(CheckCSourceCompiles)
option(CURL_HIDDEN_SYMBOLS "Set to ON to hide libcurl internal symbols (=hide all symbols that aren't officially external)." ON)
@@ -11,13 +32,7 @@ if(CURL_HIDDEN_SYMBOLS)
set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
set(_CFLAG_SYMBOLS_HIDE "-fvisibility=hidden")
elseif(CMAKE_COMPILER_IS_GNUCC)
- if(NOT CMAKE_VERSION VERSION_LESS 2.8.10)
- set(GCC_VERSION ${CMAKE_C_COMPILER_VERSION})
- else()
- execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
- OUTPUT_VARIABLE GCC_VERSION)
- endif()
- if(NOT GCC_VERSION VERSION_LESS 3.4)
+ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
# note: this is considered buggy prior to 4.0 but the autotools don't care, so let's ignore that fact
set(SUPPORTS_SYMBOL_HIDING TRUE)
set(_SYMBOL_EXTERN "__attribute__ ((__visibility__ (\"default\")))")
diff --git a/CMake/FindBearSSL.cmake b/CMake/FindBearSSL.cmake
new file mode 100644
index 000000000..a8f72c92d
--- /dev/null
+++ b/CMake/FindBearSSL.cmake
@@ -0,0 +1,30 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+find_path(BEARSSL_INCLUDE_DIRS bearssl.h)
+
+find_library(BEARSSL_LIBRARY bearssl)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(BEARSSL DEFAULT_MSG
+ BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY)
+
+mark_as_advanced(BEARSSL_INCLUDE_DIRS BEARSSL_LIBRARY)
diff --git a/CMake/FindBrotli.cmake b/CMake/FindBrotli.cmake
new file mode 100644
index 000000000..c43172b64
--- /dev/null
+++ b/CMake/FindBrotli.cmake
@@ -0,0 +1,41 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+include(FindPackageHandleStandardArgs)
+
+find_path(BROTLI_INCLUDE_DIR "brotli/decode.h")
+
+find_library(BROTLICOMMON_LIBRARY NAMES brotlicommon)
+find_library(BROTLIDEC_LIBRARY NAMES brotlidec)
+
+find_package_handle_standard_args(BROTLI
+ FOUND_VAR
+ BROTLI_FOUND
+ REQUIRED_VARS
+ BROTLIDEC_LIBRARY
+ BROTLICOMMON_LIBRARY
+ BROTLI_INCLUDE_DIR
+ FAIL_MESSAGE
+ "Could NOT find BROTLI"
+)
+
+set(BROTLI_INCLUDE_DIRS ${BROTLI_INCLUDE_DIR})
+set(BROTLI_LIBRARIES ${BROTLICOMMON_LIBRARY} ${BROTLIDEC_LIBRARY})
diff --git a/CMake/FindCARES.cmake b/CMake/FindCARES.cmake
index 723044a64..9160ae5fd 100644
--- a/CMake/FindCARES.cmake
+++ b/CMake/FindCARES.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# - Find c-ares
# Find the c-ares includes and library
# This module defines
@@ -7,34 +28,16 @@
# also defined, but not for general use are
# CARES_LIBRARY, where to find the c-ares library.
-find_path(CARES_INCLUDE_DIR ares.h
- /usr/local/include
- /usr/include
- )
+find_path(CARES_INCLUDE_DIR ares.h)
set(CARES_NAMES ${CARES_NAMES} cares)
find_library(CARES_LIBRARY
NAMES ${CARES_NAMES}
- PATHS /usr/lib /usr/local/lib
)
-if(CARES_LIBRARY AND CARES_INCLUDE_DIR)
- set(CARES_LIBRARIES ${CARES_LIBRARY})
- set(CARES_FOUND "YES")
-else()
- set(CARES_FOUND "NO")
-endif()
-
-
-if(CARES_FOUND)
- if(NOT CARES_FIND_QUIETLY)
- message(STATUS "Found c-ares: ${CARES_LIBRARIES}")
- endif()
-else()
- if(CARES_FIND_REQUIRED)
- message(FATAL_ERROR "Could not find c-ares library")
- endif()
-endif()
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(CARES
+ REQUIRED_VARS CARES_LIBRARY CARES_INCLUDE_DIR)
mark_as_advanced(
CARES_LIBRARY
diff --git a/CMake/FindGSS.cmake b/CMake/FindGSS.cmake
index a2f150cda..02111a20f 100644
--- a/CMake/FindGSS.cmake
+++ b/CMake/FindGSS.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# - Try to find the GSS Kerberos library
# Once done this will define
#
diff --git a/CMake/FindLibSSH2.cmake b/CMake/FindLibSSH2.cmake
index 84822dba7..4cdf3e310 100644
--- a/CMake/FindLibSSH2.cmake
+++ b/CMake/FindLibSSH2.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# - Try to find the libssh2 library
# Once done this will define
#
@@ -5,31 +26,18 @@
# LIBSSH2_INCLUDE_DIR - the libssh2 include directory
# LIBSSH2_LIBRARY - the libssh2 library name
-if(LIBSSH2_INCLUDE_DIR AND LIBSSH2_LIBRARY)
- set(LibSSH2_FIND_QUIETLY TRUE)
-endif()
-
-find_path(LIBSSH2_INCLUDE_DIR libssh2.h
-)
+find_path(LIBSSH2_INCLUDE_DIR libssh2.h)
-find_library(LIBSSH2_LIBRARY NAMES ssh2
-)
+find_library(LIBSSH2_LIBRARY NAMES ssh2 libssh2)
if(LIBSSH2_INCLUDE_DIR)
- file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION_NUM[\t ]+0x[0-9][0-9][0-9][0-9][0-9][0-9].*")
-
- string(REGEX REPLACE "^.*LIBSSH2_VERSION_NUM[\t ]+0x([0-9][0-9]).*$" "\\1" LIBSSH2_VERSION_MAJOR "${libssh2_version_str}")
- string(REGEX REPLACE "^.*LIBSSH2_VERSION_NUM[\t ]+0x[0-9][0-9]([0-9][0-9]).*$" "\\1" LIBSSH2_VERSION_MINOR "${libssh2_version_str}")
- string(REGEX REPLACE "^.*LIBSSH2_VERSION_NUM[\t ]+0x[0-9][0-9][0-9][0-9]([0-9][0-9]).*$" "\\1" LIBSSH2_VERSION_PATCH "${libssh2_version_str}")
-
- string(REGEX REPLACE "^0(.+)" "\\1" LIBSSH2_VERSION_MAJOR "${LIBSSH2_VERSION_MAJOR}")
- string(REGEX REPLACE "^0(.+)" "\\1" LIBSSH2_VERSION_MINOR "${LIBSSH2_VERSION_MINOR}")
- string(REGEX REPLACE "^0(.+)" "\\1" LIBSSH2_VERSION_PATCH "${LIBSSH2_VERSION_PATCH}")
-
- set(LIBSSH2_VERSION "${LIBSSH2_VERSION_MAJOR}.${LIBSSH2_VERSION_MINOR}.${LIBSSH2_VERSION_PATCH}")
+ file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION[\t ]+\"(.*)\"")
+ string(REGEX REPLACE "^.*\"([^\"]+)\"" "\\1" LIBSSH2_VERSION "${libssh2_version_str}")
endif()
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(LibSSH2 DEFAULT_MSG LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY )
+find_package_handle_standard_args(LibSSH2
+ REQUIRED_VARS LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR
+ VERSION_VAR LIBSSH2_VERSION)
-mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY LIBSSH2_VERSION_MAJOR LIBSSH2_VERSION_MINOR LIBSSH2_VERSION_PATCH LIBSSH2_VERSION)
+mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY)
diff --git a/CMake/FindMbedTLS.cmake b/CMake/FindMbedTLS.cmake
index a91639589..2ebe721a6 100644
--- a/CMake/FindMbedTLS.cmake
+++ b/CMake/FindMbedTLS.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
find_path(MBEDTLS_INCLUDE_DIRS mbedtls/ssl.h)
find_library(MBEDTLS_LIBRARY mbedtls)
diff --git a/CMake/FindNGHTTP2.cmake b/CMake/FindNGHTTP2.cmake
index 348b9612d..e1eba0532 100644
--- a/CMake/FindNGHTTP2.cmake
+++ b/CMake/FindNGHTTP2.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
include(FindPackageHandleStandardArgs)
find_path(NGHTTP2_INCLUDE_DIR "nghttp2/nghttp2.h")
@@ -10,9 +31,9 @@ find_package_handle_standard_args(NGHTTP2
REQUIRED_VARS
NGHTTP2_LIBRARY
NGHTTP2_INCLUDE_DIR
- FAIL_MESSAGE
- "Could NOT find NGHTTP2"
)
set(NGHTTP2_INCLUDE_DIRS ${NGHTTP2_INCLUDE_DIR})
set(NGHTTP2_LIBRARIES ${NGHTTP2_LIBRARY})
+
+mark_as_advanced(NGHTTP2_INCLUDE_DIRS NGHTTP2_LIBRARIES)
diff --git a/CMake/FindNGHTTP3.cmake b/CMake/FindNGHTTP3.cmake
new file mode 100644
index 000000000..73ce9e188
--- /dev/null
+++ b/CMake/FindNGHTTP3.cmake
@@ -0,0 +1,76 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+#[=======================================================================[.rst:
+FindNGHTTP3
+----------
+
+Find the nghttp3 library
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+``NGHTTP3_FOUND``
+ System has nghttp3
+``NGHTTP3_INCLUDE_DIRS``
+ The nghttp3 include directories.
+``NGHTTP3_LIBRARIES``
+ The libraries needed to use nghttp3
+``NGHTTP3_VERSION``
+ version of nghttp3.
+#]=======================================================================]
+
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_NGHTTP3 libnghttp3)
+endif()
+
+find_path(NGHTTP3_INCLUDE_DIR nghttp3/nghttp3.h
+ HINTS
+ ${PC_NGHTTP3_INCLUDEDIR}
+ ${PC_NGHTTP3_INCLUDE_DIRS}
+)
+
+find_library(NGHTTP3_LIBRARY NAMES nghttp3
+ HINTS
+ ${PC_NGHTTP3_LIBDIR}
+ ${PC_NGHTTP3_LIBRARY_DIRS}
+)
+
+if(PC_NGHTTP3_VERSION)
+ set(NGHTTP3_VERSION ${PC_NGHTTP3_VERSION})
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NGHTTP3
+ REQUIRED_VARS
+ NGHTTP3_LIBRARY
+ NGHTTP3_INCLUDE_DIR
+ VERSION_VAR NGHTTP3_VERSION
+)
+
+if(NGHTTP3_FOUND)
+ set(NGHTTP3_LIBRARIES ${NGHTTP3_LIBRARY})
+ set(NGHTTP3_INCLUDE_DIRS ${NGHTTP3_INCLUDE_DIR})
+endif()
+
+mark_as_advanced(NGHTTP3_INCLUDE_DIRS NGHTTP3_LIBRARIES)
diff --git a/CMake/FindNGTCP2.cmake b/CMake/FindNGTCP2.cmake
new file mode 100644
index 000000000..a1ed8cd4b
--- /dev/null
+++ b/CMake/FindNGTCP2.cmake
@@ -0,0 +1,113 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+#[=======================================================================[.rst:
+FindNGTCP2
+----------
+
+Find the ngtcp2 library
+
+This module accepts optional COMPONENTS to control the crypto library (these are
+mutually exclusive)::
+
+ OpenSSL: Use libngtcp2_crypto_openssl
+ GnuTLS: Use libngtcp2_crypto_gnutls
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+``NGTCP2_FOUND``
+ System has ngtcp2
+``NGTCP2_INCLUDE_DIRS``
+ The ngtcp2 include directories.
+``NGTCP2_LIBRARIES``
+ The libraries needed to use ngtcp2
+``NGTCP2_VERSION``
+ version of ngtcp2.
+#]=======================================================================]
+
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_NGTCP2 libngtcp2)
+endif()
+
+find_path(NGTCP2_INCLUDE_DIR ngtcp2/ngtcp2.h
+ HINTS
+ ${PC_NGTCP2_INCLUDEDIR}
+ ${PC_NGTCP2_INCLUDE_DIRS}
+)
+
+find_library(NGTCP2_LIBRARY NAMES ngtcp2
+ HINTS
+ ${PC_NGTCP2_LIBDIR}
+ ${PC_NGTCP2_LIBRARY_DIRS}
+)
+
+if(PC_NGTCP2_VERSION)
+ set(NGTCP2_VERSION ${PC_NGTCP2_VERSION})
+endif()
+
+if(NGTCP2_FIND_COMPONENTS)
+ set(NGTCP2_CRYPTO_BACKEND "")
+ foreach(component IN LISTS NGTCP2_FIND_COMPONENTS)
+ if(component MATCHES "^(OpenSSL|GnuTLS)")
+ if(NGTCP2_CRYPTO_BACKEND)
+ message(FATAL_ERROR "NGTCP2: Only one crypto library can be selected")
+ endif()
+ set(NGTCP2_CRYPTO_BACKEND ${component})
+ endif()
+ endforeach()
+
+ if(NGTCP2_CRYPTO_BACKEND)
+ string(TOLOWER "ngtcp2_crypto_${NGTCP2_CRYPTO_BACKEND}" _crypto_library)
+ if(UNIX)
+ pkg_search_module(PC_${_crypto_library} lib${_crypto_library})
+ endif()
+ find_library(${_crypto_library}_LIBRARY
+ NAMES
+ ${_crypto_library}
+ HINTS
+ ${PC_${_crypto_library}_LIBDIR}
+ ${PC_${_crypto_library}_LIBRARY_DIRS}
+ )
+ if(${_crypto_library}_LIBRARY)
+ set(NGTCP2_${NGTCP2_CRYPTO_BACKEND}_FOUND TRUE)
+ set(NGTCP2_CRYPTO_LIBRARY ${${_crypto_library}_LIBRARY})
+ endif()
+ endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NGTCP2
+ REQUIRED_VARS
+ NGTCP2_LIBRARY
+ NGTCP2_INCLUDE_DIR
+ VERSION_VAR NGTCP2_VERSION
+ HANDLE_COMPONENTS
+)
+
+if(NGTCP2_FOUND)
+ set(NGTCP2_LIBRARIES ${NGTCP2_LIBRARY} ${NGTCP2_CRYPTO_LIBRARY})
+ set(NGTCP2_INCLUDE_DIRS ${NGTCP2_INCLUDE_DIR})
+endif()
+
+mark_as_advanced(NGTCP2_INCLUDE_DIRS NGTCP2_LIBRARIES)
diff --git a/CMake/FindNSS.cmake b/CMake/FindNSS.cmake
new file mode 100644
index 000000000..5fdb2b776
--- /dev/null
+++ b/CMake/FindNSS.cmake
@@ -0,0 +1,38 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_NSS nss)
+endif()
+if(NOT PC_NSS_FOUND)
+ return()
+endif()
+
+set(NSS_LIBRARIES ${PC_NSS_LINK_LIBRARIES})
+set(NSS_INCLUDE_DIRS ${PC_NSS_INCLUDE_DIRS})
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NSS
+ REQUIRED_VARS NSS_LIBRARIES NSS_INCLUDE_DIRS
+ VERSION_VAR PC_NSS_VERSION)
+
+mark_as_advanced(NSS_INCLUDE_DIRS NSS_LIBRARIES)
diff --git a/CMake/FindQUICHE.cmake b/CMake/FindQUICHE.cmake
new file mode 100644
index 000000000..01d17582b
--- /dev/null
+++ b/CMake/FindQUICHE.cmake
@@ -0,0 +1,68 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+#[=======================================================================[.rst:
+FindQUICHE
+----------
+
+Find the quiche library
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+``QUICHE_FOUND``
+ System has quiche
+``QUICHE_INCLUDE_DIRS``
+ The quiche include directories.
+``QUICHE_LIBRARIES``
+ The libraries needed to use quiche
+#]=======================================================================]
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_QUICHE quiche)
+endif()
+
+find_path(QUICHE_INCLUDE_DIR quiche.h
+ HINTS
+ ${PC_QUICHE_INCLUDEDIR}
+ ${PC_QUICHE_INCLUDE_DIRS}
+)
+
+find_library(QUICHE_LIBRARY NAMES quiche
+ HINTS
+ ${PC_QUICHE_LIBDIR}
+ ${PC_QUICHE_LIBRARY_DIRS}
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(QUICHE
+ REQUIRED_VARS
+ QUICHE_LIBRARY
+ QUICHE_INCLUDE_DIR
+)
+
+if(QUICHE_FOUND)
+ set(QUICHE_LIBRARIES ${QUICHE_LIBRARY})
+ set(QUICHE_INCLUDE_DIRS ${QUICHE_INCLUDE_DIR})
+endif()
+
+mark_as_advanced(QUICHE_INCLUDE_DIRS QUICHE_LIBRARIES)
diff --git a/CMake/FindWolfSSL.cmake b/CMake/FindWolfSSL.cmake
new file mode 100644
index 000000000..54df1a86c
--- /dev/null
+++ b/CMake/FindWolfSSL.cmake
@@ -0,0 +1,34 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+find_path(WolfSSL_INCLUDE_DIR NAMES wolfssl/ssl.h)
+find_library(WolfSSL_LIBRARY NAMES wolfssl)
+mark_as_advanced(WolfSSL_INCLUDE_DIR WolfSSL_LIBRARY)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(WolfSSL
+ REQUIRED_VARS WolfSSL_INCLUDE_DIR WolfSSL_LIBRARY
+ )
+
+if(WolfSSL_FOUND)
+ set(WolfSSL_INCLUDE_DIRS ${WolfSSL_INCLUDE_DIR})
+ set(WolfSSL_LIBRARIES ${WolfSSL_LIBRARY})
+endif()
diff --git a/CMake/FindZstd.cmake b/CMake/FindZstd.cmake
new file mode 100644
index 000000000..44c741ae8
--- /dev/null
+++ b/CMake/FindZstd.cmake
@@ -0,0 +1,69 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+#[=======================================================================[.rst:
+FindZstd
+----------
+
+Find the zstd library
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+``Zstd_FOUND``
+ System has zstd
+``Zstd_INCLUDE_DIRS``
+ The zstd include directories.
+``Zstd_LIBRARIES``
+ The libraries needed to use zstd
+#]=======================================================================]
+
+if(UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_search_module(PC_Zstd libzstd)
+endif()
+
+find_path(Zstd_INCLUDE_DIR zstd.h
+ HINTS
+ ${PC_Zstd_INCLUDEDIR}
+ ${PC_Zstd_INCLUDE_DIRS}
+)
+
+find_library(Zstd_LIBRARY NAMES zstd
+ HINTS
+ ${PC_Zstd_LIBDIR}
+ ${PC_Zstd_LIBRARY_DIRS}
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Zstd
+ REQUIRED_VARS
+ Zstd_LIBRARY
+ Zstd_INCLUDE_DIR
+)
+
+if(Zstd_FOUND)
+ set(Zstd_LIBRARIES ${Zstd_LIBRARY})
+ set(Zstd_INCLUDE_DIRS ${Zstd_INCLUDE_DIR})
+endif()
+
+mark_as_advanced(Zstd_INCLUDE_DIRS Zstd_LIBRARIES)
diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake
index 7f7134515..65a41e484 100644
--- a/CMake/Macros.cmake
+++ b/CMake/Macros.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#File defines convenience macros for available feature testing
# This macro checks if the symbol exists in the library and if it
diff --git a/CMake/OtherTests.cmake b/CMake/OtherTests.cmake
index c1c9aa32a..7cec6da6d 100644
--- a/CMake/OtherTests.cmake
+++ b/CMake/OtherTests.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
include(CheckCSourceCompiles)
# The begin of the sources (macros and includes)
set(_source_epilogue "#undef inline")
@@ -32,7 +53,7 @@ int main(void) {
return 0;
}" curl_cv_recv)
if(curl_cv_recv)
- if(NOT DEFINED curl_cv_func_recv_args OR "${curl_cv_func_recv_args}" STREQUAL "unknown")
+ if(NOT DEFINED curl_cv_func_recv_args OR curl_cv_func_recv_args STREQUAL "unknown")
foreach(recv_retv "int" "ssize_t" )
foreach(recv_arg1 "SOCKET" "int" )
foreach(recv_arg2 "char *" "void *" )
@@ -42,6 +63,9 @@ if(curl_cv_recv)
unset(curl_cv_func_recv_test CACHE)
check_c_source_compiles("
${_source_epilogue}
+ #ifdef WINSOCK_API_LINKAGE
+ WINSOCK_API_LINKAGE
+ #endif
extern ${recv_retv} ${signature_call_conv}
recv(${recv_arg1}, ${recv_arg2}, ${recv_arg3}, ${recv_arg4});
int main(void) {
@@ -81,7 +105,7 @@ if(curl_cv_recv)
string(REGEX REPLACE "^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*)$" "\\1" RECV_TYPE_RETV "${curl_cv_func_recv_args}")
endif()
- if("${curl_cv_func_recv_args}" STREQUAL "unknown")
+ if(curl_cv_func_recv_args STREQUAL "unknown")
message(FATAL_ERROR "Cannot find proper types to use for recv args")
endif()
else()
@@ -106,6 +130,9 @@ if(curl_cv_send)
unset(curl_cv_func_send_test CACHE)
check_c_source_compiles("
${_source_epilogue}
+ #ifdef WINSOCK_API_LINKAGE
+ WINSOCK_API_LINKAGE
+ #endif
extern ${send_retv} ${signature_call_conv}
send(${send_arg1}, ${send_arg2}, ${send_arg3}, ${send_arg4});
int main(void) {
diff --git a/CMake/Platforms/WindowsCache.cmake b/CMake/Platforms/WindowsCache.cmake
index ead4115a3..9ae9b56f0 100644
--- a/CMake/Platforms/WindowsCache.cmake
+++ b/CMake/Platforms/WindowsCache.cmake
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
if(NOT UNIX)
if(WIN32)
set(HAVE_LIBDL 0)
diff --git a/CMake/Utilities.cmake b/CMake/Utilities.cmake
index 5cb1d4497..59b17d074 100644
--- a/CMake/Utilities.cmake
+++ b/CMake/Utilities.cmake
@@ -1,13 +1,33 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# File containing various utilities
# Returns a list of arguments that evaluate to true
function(count_true output_count_var)
- set(lst)
+ set(lst_len 0)
foreach(option_var IN LISTS ARGN)
if(${option_var})
- list(APPEND lst ${option_var})
+ math(EXPR lst_len "${lst_len} + 1")
endif()
endforeach()
- list(LENGTH lst lst_len)
set(${output_count_var} ${lst_len} PARENT_SCOPE)
endfunction()
diff --git a/CMake/cmake_uninstall.cmake.in b/CMake/cmake_uninstall.cmake.in
index db8e5367d..4a0de5e6b 100644
--- a/CMake/cmake_uninstall.cmake.in
+++ b/CMake/cmake_uninstall.cmake.in
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
endif()
diff --git a/CMake/curl-config.cmake.in b/CMake/curl-config.cmake.in
index 1294e173a..ae8cc30f1 100644
--- a/CMake/curl-config.cmake.in
+++ b/CMake/curl-config.cmake.in
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 20b9bd011..ec1cfa782 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -26,7 +26,6 @@
# The output .so file lacks the soname number which we currently have within the lib/Makefile.am file
# Add full (4 or 5 libs) SSL support
# Add INSTALL target (EXTRA_DIST variables in Makefile.am may be moved to Makefile.inc so that CMake/CPack is aware of what's to include).
-# Add CTests(?)
# Check on all possible platforms
# Test with as many configurations possible (With or without any option)
# Create scripts that help keeping the CMake build system up to date (to reduce maintenance). According to Tetetest:
@@ -38,7 +37,8 @@
# To check:
# (From Daniel Stenberg) The cmake build selected to run gcc with -fPIC on my box while the plain configure script did not.
# (From Daniel Stenberg) The gcc command line use neither -g nor any -O options. As a developer, I also treasure our configure scripts's --enable-debug option that sets a long range of "picky" compiler options.
-cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.2...3.16 FATAL_ERROR)
+
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
include(Utilities)
include(Macros)
@@ -47,9 +47,7 @@ include(CheckCCompilerFlag)
project(CURL C)
-message(WARNING "the curl cmake build system is poorly maintained. Be aware")
-
-file(READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
+file(STRINGS ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )")
string(REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
CURL_VERSION ${CURL_VERSION_H_CONTENTS})
string(REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION})
@@ -79,7 +77,28 @@ option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
if(WIN32)
option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)
option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)
+ option(ENABLE_UNICODE "Set to ON to use the Unicode version of the Windows API functions" OFF)
+ set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string")
+ if(CURL_TARGET_WINDOWS_VERSION)
+ add_definitions(-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION})
+ set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}")
+ elseif(ENABLE_INET_PTON)
+ # _WIN32_WINNT_VISTA (0x0600)
+ add_definitions(-D_WIN32_WINNT=0x0600)
+ set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0600")
+ else()
+ # _WIN32_WINNT_WINXP (0x0501)
+ add_definitions(-D_WIN32_WINNT=0x0501)
+ set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0501")
+ endif()
+ if(ENABLE_UNICODE)
+ add_definitions(-DUNICODE -D_UNICODE)
+ if(MINGW)
+ add_compile_options(-municode)
+ endif()
+ endif()
endif()
+option(CURL_LTO "Turn on compiler Link Time Optimizations" OFF)
cmake_dependent_option(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup"
ON "NOT ENABLE_ARES"
@@ -90,14 +109,24 @@ option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OF
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
if(PICKY_COMPILER)
- foreach(_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wundef -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wno-sign-conversion -Wvla -Wdouble-promotion -Wno-system-headers -Wno-pedantic-ms-format)
+ foreach(_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wfloat-equal -Wsign-compare -Wundef -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wvla -Wdouble-promotion)
# surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
# test result in.
- check_c_compiler_flag(${_CCOPT} OPT${_CCOPT})
- if(OPT${_CCOPT})
+ string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
+ check_c_compiler_flag(${_CCOPT} ${_optvarname})
+ if(${_optvarname})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_CCOPT}")
endif()
endforeach()
+ foreach(_CCOPT long-long multichar format-nonliteral sign-conversion system-headers pedantic-ms-format)
+ # GCC only warns about unknown -Wno- options if there are also other diagnostic messages,
+ # so test for the positive form instead
+ string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
+ check_c_compiler_flag("-W${_CCOPT}" ${_optvarname})
+ if(${_optvarname})
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-${_CCOPT}")
+ endif()
+ endforeach()
endif()
endif()
@@ -123,7 +152,6 @@ if(ENABLE_ARES)
set(USE_ARES 1)
find_package(CARES REQUIRED)
list(APPEND CURL_LIBS ${CARES_LIBRARY})
- set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
endif()
include(CurlSymbolHiding)
@@ -160,20 +188,24 @@ option(CURL_DISABLE_SMTP "to disable SMTP" OFF)
mark_as_advanced(CURL_DISABLE_SMTP)
option(CURL_DISABLE_GOPHER "to disable Gopher" OFF)
mark_as_advanced(CURL_DISABLE_GOPHER)
+option(CURL_DISABLE_MQTT "to disable MQTT" OFF)
+mark_as_advanced(CURL_DISABLE_MQTT)
if(HTTP_ONLY)
+ set(CURL_DISABLE_DICT ON)
+ set(CURL_DISABLE_FILE ON)
set(CURL_DISABLE_FTP ON)
+ set(CURL_DISABLE_GOPHER ON)
+ set(CURL_DISABLE_IMAP ON)
set(CURL_DISABLE_LDAP ON)
set(CURL_DISABLE_LDAPS ON)
- set(CURL_DISABLE_TELNET ON)
- set(CURL_DISABLE_DICT ON)
- set(CURL_DISABLE_FILE ON)
- set(CURL_DISABLE_TFTP ON)
- set(CURL_DISABLE_RTSP ON)
+ set(CURL_DISABLE_MQTT ON)
set(CURL_DISABLE_POP3 ON)
- set(CURL_DISABLE_IMAP ON)
+ set(CURL_DISABLE_RTSP ON)
+ set(CURL_DISABLE_SMB ON)
set(CURL_DISABLE_SMTP ON)
- set(CURL_DISABLE_GOPHER ON)
+ set(CURL_DISABLE_TELNET ON)
+ set(CURL_DISABLE_TFTP ON)
endif()
option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
@@ -199,26 +231,22 @@ if(ENABLE_IPV6 AND NOT WIN32)
endif()
endif()
-curl_nroff_check()
+if(USE_MANUAL)
+ #nroff is currently only used when USE_MANUAL is set, so we can prevent the warning of no *NROFF if USE_MANUAL is OFF (or not defined), by not even looking for NROFF..
+ curl_nroff_check()
+endif()
find_package(Perl)
cmake_dependent_option(ENABLE_MANUAL "to provide the built-in manual"
ON "NROFF_USEFUL;PERL_FOUND"
OFF)
-if(NOT PERL_FOUND)
- message(STATUS "Perl not found, testing disabled.")
- set(BUILD_TESTING OFF)
-endif()
if(ENABLE_MANUAL)
set(USE_MANUAL ON)
endif()
-# We need ansi c-flags, especially on HP
-set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
-set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
-
if(CURL_STATIC_CRT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
endif()
@@ -234,6 +262,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
endif()
# Include all the necessary files for macros
+include(CMakePushCheckState)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckIncludeFiles)
@@ -284,38 +313,47 @@ if(WIN32)
endif()
# check SSL libraries
-# TODO support GNUTLS, NSS, POLARSSL, CYASSL
+# TODO support GnuTLS
+if(CMAKE_USE_WINSSL)
+ message(FATAL_ERROR "The cmake option CMAKE_USE_WINSSL was renamed to CMAKE_USE_SCHANNEL.")
+endif()
if(APPLE)
option(CMAKE_USE_SECTRANSP "enable Apple OS native SSL/TLS" OFF)
endif()
if(WIN32)
- option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF)
+ option(CMAKE_USE_SCHANNEL "enable Windows native SSL/TLS" OFF)
cmake_dependent_option(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
- CMAKE_USE_WINSSL OFF)
+ CMAKE_USE_SCHANNEL OFF)
endif()
option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
+option(CMAKE_USE_BEARSSL "Enable BearSSL for SSL/TLS" OFF)
+option(CMAKE_USE_NSS "Enable NSS for SSL/TLS" OFF)
+option(CMAKE_USE_WOLFSSL "enable wolfSSL for SSL/TLS" OFF)
set(openssl_default ON)
-if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
+if(WIN32 OR CMAKE_USE_SECTRANSP OR CMAKE_USE_SCHANNEL OR CMAKE_USE_MBEDTLS OR CMAKE_USE_NSS OR CMAKE_USE_WOLFSSL)
set(openssl_default OFF)
endif()
option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
count_true(enabled_ssl_options_count
- CMAKE_USE_WINSSL
+ CMAKE_USE_SCHANNEL
CMAKE_USE_SECTRANSP
CMAKE_USE_OPENSSL
CMAKE_USE_MBEDTLS
+ CMAKE_USE_BEARSSL
+ CMAKE_USE_NSS
+ CMAKE_USE_WOLFSSL
)
if(enabled_ssl_options_count GREATER "1")
set(CURL_WITH_MULTI_SSL ON)
endif()
-if(CMAKE_USE_WINSSL)
+if(CMAKE_USE_SCHANNEL)
set(SSL_ENABLED ON)
set(USE_SCHANNEL ON) # Windows native SSL/TLS support
- set(USE_WINDOWS_SSPI ON) # CMAKE_USE_WINSSL implies CURL_WINDOWS_SSPI
+ set(USE_WINDOWS_SSPI ON) # CMAKE_USE_SCHANNEL implies CURL_WINDOWS_SSPI
list(APPEND CURL_LIBS "crypt32")
endif()
if(CURL_WINDOWS_SSPI)
@@ -379,6 +417,35 @@ if(CMAKE_USE_MBEDTLS)
include_directories(${MBEDTLS_INCLUDE_DIRS})
endif()
+if(CMAKE_USE_BEARSSL)
+ find_package(BearSSL REQUIRED)
+ set(SSL_ENABLED ON)
+ set(USE_BEARSSL ON)
+ list(APPEND CURL_LIBS ${BEARSSL_LIBRARY})
+ include_directories(${BEARSSL_INCLUDE_DIRS})
+endif()
+
+if(CMAKE_USE_WOLFSSL)
+ find_package(WolfSSL REQUIRED)
+ set(SSL_ENABLED ON)
+ set(USE_WOLFSSL ON)
+ list(APPEND CURL_LIBS ${WolfSSL_LIBRARIES})
+ include_directories(${WolfSSL_INCLUDE_DIRS})
+endif()
+
+if(CMAKE_USE_NSS)
+ find_package(NSS REQUIRED)
+ include_directories(${NSS_INCLUDE_DIRS})
+ list(APPEND CURL_LIBS ${NSS_LIBRARIES})
+ set(SSL_ENABLED ON)
+ set(USE_NSS ON)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES ${NSS_INCLUDE_DIRS})
+ set(CMAKE_REQUIRED_LIBRARIES ${NSS_LIBRARIES})
+ check_symbol_exists(PK11_CreateManagedGenericObject "pk11pub.h" HAVE_PK11_CREATEMANAGEDGENERICOBJECT)
+ cmake_pop_check_state()
+endif()
+
option(USE_NGHTTP2 "Use Nghttp2 library" OFF)
if(USE_NGHTTP2)
find_package(NGHTTP2 REQUIRED)
@@ -386,6 +453,60 @@ if(USE_NGHTTP2)
list(APPEND CURL_LIBS ${NGHTTP2_LIBRARIES})
endif()
+function(CheckQuicSupportInOpenSSL)
+ # Be sure that the OpenSSL library actually supports QUIC.
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
+ set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
+ check_symbol_exists(SSL_CTX_set_quic_method "openssl/ssl.h" HAVE_SSL_CTX_SET_QUIC_METHOD)
+ if(NOT HAVE_SSL_CTX_SET_QUIC_METHOD)
+ message(FATAL_ERROR "QUIC support is missing in OpenSSL/boringssl. Try setting -DOPENSSL_ROOT_DIR")
+ endif()
+ cmake_pop_check_state()
+endfunction()
+
+option(USE_NGTCP2 "Use ngtcp2 and nghttp3 libraries for HTTP/3 support" OFF)
+if(USE_NGTCP2)
+ if(USE_OPENSSL)
+ find_package(NGTCP2 REQUIRED OpenSSL)
+ CheckQuicSupportInOpenSSL()
+ elseif(USE_GNUTLS)
+ # TODO add GnuTLS support as vtls library.
+ find_package(NGTCP2 REQUIRED GnuTLS)
+ else()
+ message(FATAL_ERROR "ngtcp2 requires OpenSSL or GnuTLS")
+ endif()
+ set(USE_NGTCP2 ON)
+ include_directories(${NGTCP2_INCLUDE_DIRS})
+ list(APPEND CURL_LIBS ${NGTCP2_LIBRARIES})
+
+ find_package(NGHTTP3 REQUIRED)
+ set(USE_NGHTTP3 ON)
+ include_directories(${NGHTTP3_INCLUDE_DIRS})
+ list(APPEND CURL_LIBS ${NGHTTP3_LIBRARIES})
+endif()
+
+option(USE_QUICHE "Use quiche library for HTTP/3 support" OFF)
+if(USE_QUICHE)
+ if(USE_NGTCP2)
+ message(FATAL_ERROR "Only one HTTP/3 backend can be selected!")
+ endif()
+ find_package(QUICHE REQUIRED)
+ CheckQuicSupportInOpenSSL()
+ set(USE_QUICHE ON)
+ include_directories(${QUICHE_INCLUDE_DIRS})
+ list(APPEND CURL_LIBS ${QUICHE_LIBRARIES})
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES "${QUICHE_INCLUDE_DIRS}")
+ set(CMAKE_REQUIRED_LIBRARIES "${QUICHE_LIBRARIES}")
+ check_symbol_exists(quiche_conn_set_qlog_fd "quiche.h" HAVE_QUICHE_CONN_SET_QLOG_FD)
+ cmake_pop_check_state()
+endif()
+
+if(WIN32)
+ set(USE_WIN32_CRYPTO ON)
+endif()
+
if(NOT CURL_DISABLE_LDAP)
if(WIN32)
option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
@@ -537,6 +658,22 @@ if(CURL_BROTLI)
endif()
endif()
+option(CURL_ZSTD "Set to ON to enable building curl with zstd support." OFF)
+set(HAVE_ZSTD OFF)
+if(CURL_ZSTD)
+ find_package(Zstd REQUIRED)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES ${Zstd_INCLUDE_DIRS})
+ set(CMAKE_REQUIRED_LIBRARIES ${Zstd_LIBRARIES})
+ check_symbol_exists(ZSTD_createDStream "zstd.h" HAVE_ZSTD_CREATEDSTREAM)
+ cmake_pop_check_state()
+ if(Zstd_FOUND AND HAVE_ZSTD_CREATEDSTREAM)
+ set(HAVE_ZSTD ON)
+ list(APPEND CURL_LIBS ${Zstd_LIBRARIES})
+ include_directories(${Zstd_INCLUDE_DIRS})
+ endif()
+endif()
+
#libSSH2
option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON)
mark_as_advanced(CMAKE_USE_LIBSSH2)
@@ -571,6 +708,20 @@ if(CMAKE_USE_LIBSSH2)
endif()
endif()
+# libssh
+option(CMAKE_USE_LIBSSH "Use libSSH" OFF)
+mark_as_advanced(CMAKE_USE_LIBSSH)
+if(NOT HAVE_LIBSSH2 AND CMAKE_USE_LIBSSH)
+ find_package(libssh CONFIG)
+ if(libssh_FOUND)
+ message(STATUS "Found libssh ${libssh_VERSION}")
+ # Use imported target for include and library paths.
+ list(APPEND CURL_LIBS ssh)
+ set(USE_LIBSSH ON)
+ set(HAVE_LIBSSH_LIBSSH_H 1)
+ endif()
+endif()
+
option(CMAKE_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF)
mark_as_advanced(CMAKE_USE_GSSAPI)
@@ -639,6 +790,9 @@ else()
unset(USE_UNIX_SOCKETS CACHE)
endif()
+option(ENABLE_ALT_SVC "Enable alt-svc support" OFF)
+set(USE_ALTSVC ${ENABLE_ALT_SVC})
+
#
# CA handling
#
@@ -666,7 +820,9 @@ elseif("${CURL_CA_PATH}" STREQUAL "none")
unset(CURL_CA_PATH CACHE)
elseif("${CURL_CA_PATH}" STREQUAL "auto")
unset(CURL_CA_PATH CACHE)
- set(CURL_CA_PATH_AUTODETECT TRUE)
+ if(NOT USE_NSS)
+ set(CURL_CA_PATH_AUTODETECT TRUE)
+ endif()
else()
set(CURL_CA_PATH_SET TRUE)
endif()
@@ -705,7 +861,7 @@ elseif(CURL_CA_PATH_AUTODETECT OR CURL_CA_BUNDLE_AUTODETECT)
endif()
if(CURL_CA_PATH_SET AND NOT USE_OPENSSL AND NOT USE_MBEDTLS)
- message(FATAL_ERROR
+ message(STATUS
"CA path only supported by OpenSSL, GnuTLS or mbed TLS. "
"Set CURL_CA_PATH=none or enable one of those TLS backends.")
endif()
@@ -743,7 +899,6 @@ check_include_file_concat("arpa/inet.h" HAVE_ARPA_INET_H)
check_include_file_concat("arpa/tftp.h" HAVE_ARPA_TFTP_H)
check_include_file_concat("assert.h" HAVE_ASSERT_H)
check_include_file_concat("crypto.h" HAVE_CRYPTO_H)
-check_include_file_concat("des.h" HAVE_DES_H)
check_include_file_concat("err.h" HAVE_ERR_H)
check_include_file_concat("errno.h" HAVE_ERRNO_H)
check_include_file_concat("fcntl.h" HAVE_FCNTL_H)
@@ -895,20 +1050,7 @@ check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL)
check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL)
check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
-
-# symbol exists in win32, but function does not.
-if(WIN32)
- if(ENABLE_INET_PTON)
- check_function_exists(inet_pton HAVE_INET_PTON)
- # _WIN32_WINNT_VISTA (0x0600)
- add_definitions(-D_WIN32_WINNT=0x0600)
- else()
- # _WIN32_WINNT_WINXP (0x0501)
- add_definitions(-D_WIN32_WINNT=0x0501)
- endif()
-else()
- check_function_exists(inet_pton HAVE_INET_PTON)
-endif()
+check_symbol_exists(inet_pton "${CURL_INCLUDES}" HAVE_INET_PTON)
check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR)
if(HAVE_FSETXATTR)
@@ -1132,6 +1274,23 @@ if(CURL_WERROR)
endif()
endif()
+if(CURL_LTO)
+ if(CMAKE_VERSION VERSION_LESS 3.9)
+ message(FATAL_ERROR "Requested LTO but your cmake version ${CMAKE_VERSION} is to old. You need at least 3.9")
+ endif()
+
+ cmake_policy(SET CMP0069 NEW)
+
+ include(CheckIPOSupported)
+ check_ipo_supported(RESULT CURL_HAS_LTO OUTPUT CURL_LTO_ERROR LANGUAGES C)
+ if(CURL_HAS_LTO)
+ message(STATUS "LTO supported and enabled")
+ else()
+ message(FATAL_ERROR "LTO was requested - but compiler doesn't support it\n${CURL_LTO_ERROR}")
+ endif()
+endif()
+
+
# Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
function(transform_makefile_inc INPUT_FILE OUTPUT_FILE)
file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
@@ -1145,7 +1304,7 @@ function(transform_makefile_inc INPUT_FILE OUTPUT_FILE)
string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}
string(REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace @@ with ${}, even if that may not be read by CMake scripts.
file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
-
+ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${INPUT_FILE}")
endfunction()
include(GNUInstallDirs)
@@ -1166,19 +1325,29 @@ if(BUILD_CURL_EXE)
add_subdirectory(src)
endif()
-include(CTest)
-if(BUILD_TESTING)
+option(BUILD_TESTING "Build tests" "${PERL_FOUND}")
+if(NOT PERL_FOUND)
+ message(STATUS "Perl not found, testing disabled.")
+elseif(BUILD_TESTING)
add_subdirectory(tests)
endif()
+# NTLM support requires crypto function adaptions from various SSL libs
+# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
+if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_DARWINSSL OR USE_MBEDTLS OR USE_WIN32_CRYPTO))
+ set(use_ntlm ON)
+else()
+ set(use_ntlm OFF)
+endif()
+
# Helper to populate a list (_items) with a label when conditions (the remaining
# args) are satisfied
-function(_add_if label)
- # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection
+macro(_add_if label)
+ # needs to be a macro to allow this indirection
if(${ARGN})
- set(_items ${_items} "${label}" PARENT_SCOPE)
+ set(_items ${_items} "${label}")
endif()
-endfunction()
+endmacro()
# Clear list and try to detect available features
set(_items)
@@ -1186,13 +1355,16 @@ _add_if("SSL" SSL_ENABLED)
_add_if("IPv6" ENABLE_IPV6)
_add_if("unix-sockets" USE_UNIX_SOCKETS)
_add_if("libz" HAVE_LIBZ)
+_add_if("brotli" HAVE_BROTLI)
+_add_if("zstd" HAVE_ZSTD)
_add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32)
_add_if("IDN" HAVE_LIBIDN2)
_add_if("Largefile" (CURL_SIZEOF_CURL_OFF_T GREATER 4) AND
((SIZEOF_OFF_T GREATER 4) OR USE_WIN32_LARGE_FILES))
-# TODO SSP1 (WinSSL) check is missing
+# TODO SSP1 (Schannel) check is missing
_add_if("SSPI" USE_WINDOWS_SSPI)
_add_if("GSS-API" HAVE_GSSAPI)
+_add_if("alt-svc" ENABLE_ALT_SVC)
# TODO SSP1 missing for SPNEGO
_add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
@@ -1200,15 +1372,16 @@ _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
# NTLM support requires crypto function adaptions from various SSL libs
# TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
-if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_SECTRANSP OR USE_MBEDTLS))
- _add_if("NTLM" 1)
- # TODO missing option (autoconf: --enable-ntlm-wb)
- _add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
-endif()
+_add_if("NTLM" use_ntlm OR USE_WINDOWS_SSPI)
+# TODO missing option (autoconf: --enable-ntlm-wb)
+_add_if("NTLM_WB" use_ntlm AND NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
# TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
_add_if("TLS-SRP" USE_TLS_SRP)
# TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header
_add_if("HTTP2" USE_NGHTTP2)
+_add_if("HTTP3" USE_NGTCP2 OR USE_QUICHE)
+_add_if("MultiSSL" CURL_WITH_MULTI_SSL)
+_add_if("HTTPS-proxy" SSL_ENABLED AND (USE_OPENSSL OR USE_GNUTLS OR USE_NSS))
string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
message(STATUS "Enabled features: ${SUPPORT_FEATURES}")
@@ -1233,12 +1406,15 @@ _add_if("POP3" NOT CURL_DISABLE_POP3)
_add_if("POP3S" NOT CURL_DISABLE_POP3 AND SSL_ENABLED)
_add_if("IMAP" NOT CURL_DISABLE_IMAP)
_add_if("IMAPS" NOT CURL_DISABLE_IMAP AND SSL_ENABLED)
+_add_if("SMB" NOT CURL_DISABLE_SMB AND use_ntlm)
+_add_if("SMBS" NOT CURL_DISABLE_SMB AND SSL_ENABLED AND use_ntlm)
_add_if("SMTP" NOT CURL_DISABLE_SMTP)
_add_if("SMTPS" NOT CURL_DISABLE_SMTP AND SSL_ENABLED)
-_add_if("SCP" USE_LIBSSH2)
-_add_if("SFTP" USE_LIBSSH2)
+_add_if("SCP" USE_LIBSSH2 OR USE_LIBSSH)
+_add_if("SFTP" USE_LIBSSH2 OR USE_LIBSSH)
_add_if("RTSP" NOT CURL_DISABLE_RTSP)
_add_if("RTMP" USE_LIBRTMP)
+_add_if("MQTT" NOT CURL_DISABLE_MQTT)
if(_items)
list(SORT _items)
endif()
@@ -1247,10 +1423,13 @@ message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
# Clear list and collect SSL backends
set(_items)
-_add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI)
+_add_if("Schannel" SSL_ENABLED AND USE_WINDOWS_SSPI)
_add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
_add_if("Secure Transport" SSL_ENABLED AND USE_SECTRANSP)
_add_if("mbedTLS" SSL_ENABLED AND USE_MBEDTLS)
+_add_if("BearSSL" SSL_ENABLED AND USE_BEARSSL)
+_add_if("NSS" SSL_ENABLED AND USE_NSS)
+_add_if("wolfSSL" SSL_ENABLED AND USE_WOLFSSL)
if(_items)
list(SORT _items)
endif()
@@ -1264,25 +1443,43 @@ set(CONFIGURE_OPTIONS "")
# TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB?
set(CPPFLAG_CURL_STATICLIB "")
set(CURLVERSION "${CURL_VERSION}")
-if(BUILD_SHARED_LIBS)
- set(ENABLE_SHARED "yes")
- set(ENABLE_STATIC "no")
-else()
- set(ENABLE_SHARED "no")
- set(ENABLE_STATIC "yes")
-endif()
set(exec_prefix "\${prefix}")
set(includedir "\${prefix}/include")
set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
set(LIBCURL_LIBS "")
set(libdir "${CMAKE_INSTALL_PREFIX}/lib")
foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
+ if(TARGET "${_lib}")
+ set(_libname "${_lib}")
+ get_target_property(_libtype "${_libname}" TYPE)
+ if(_libtype STREQUAL INTERFACE_LIBRARY)
+ # Interface libraries can occur when an external project embeds curl and
+ # defined targets such as ZLIB::ZLIB by themselves. Ignore these as
+ # reading the LOCATION property will error out. Assume the user won't need
+ # this information in the .pc file.
+ continue()
+ endif()
+ get_target_property(_lib "${_libname}" LOCATION)
+ if(NOT _lib)
+ message(WARNING "Bad lib in library list: ${_libname}")
+ continue()
+ endif()
+ endif()
if(_lib MATCHES ".*/.*" OR _lib MATCHES "^-")
set(LIBCURL_LIBS "${LIBCURL_LIBS} ${_lib}")
else()
set(LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}")
endif()
endforeach()
+if(BUILD_SHARED_LIBS)
+ set(ENABLE_SHARED "yes")
+ set(ENABLE_STATIC "no")
+ set(LIBCURL_NO_SHARED "")
+else()
+ set(ENABLE_SHARED "no")
+ set(ENABLE_STATIC "yes")
+ set(LIBCURL_NO_SHARED "${LIBCURL_LIBS}")
+endif()
# "a" (Linux) or "lib" (Windows)
string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(prefix "${CMAKE_INSTALL_PREFIX}")
diff --git a/COPYING b/COPYING
index 3528bd756..9d9e4af8d 100644
--- a/COPYING
+++ b/COPYING
@@ -1,6 +1,6 @@
COPYRIGHT AND PERMISSION NOTICE
-Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many
+Copyright (c) 1996 - 2020, Daniel Stenberg, <daniel@haxx.se>, and many
contributors, see the THANKS file.
All rights reserved.
diff --git a/METADATA b/METADATA
index 550afee48..a1da2fe8d 100644
--- a/METADATA
+++ b/METADATA
@@ -7,12 +7,13 @@ third_party {
}
url {
type: ARCHIVE
- value: "https://github.com/curl/curl/releases/download/curl-7_67_0/curl-7.67.0.tar.xz"
+ value: "https://github.com/curl/curl/releases/download/curl-7_73_0/curl-7.73.0.tar.xz"
}
- version: "curl-7_67_0"
+ version: "curl-7_73_0"
+ license_type: NOTICE
last_upgrade_date {
- year: 2019
- month: 11
- day: 6
+ year: 2020
+ month: 10
+ day: 28
}
}
diff --git a/MacOSX-Framework b/MacOSX-Framework
index e6badcde5..73d9ed8b4 100755
--- a/MacOSX-Framework
+++ b/MacOSX-Framework
@@ -1,4 +1,25 @@
#!/bin/bash
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# This script performs all of the steps needed to build a
# universal binary libcurl.framework for Mac OS X 10.4 or greater.
#
@@ -82,7 +103,7 @@ MINVER64='-mmacosx-version-min='$MACVER64
if test ! -z $SDK32; then
echo "----Configuring libcurl for 32 bit universal framework..."
make clean
- ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \
+ ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-secure-transport \
CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32" \
LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 -Wl,-headerpad_max_install_names" \
CC=$CC
@@ -111,7 +132,7 @@ if test ! -z $SDK32; then
popd
make clean
echo "----Configuring libcurl for 64 bit universal framework..."
- ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \
+ ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-secure-transport \
CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64" \
LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 -Wl,-headerpad_max_install_names" \
CC=$CC
diff --git a/Makefile.am b/Makefile.am
index 3116e1053..1a6d7f997 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -24,14 +24,30 @@ AUTOMAKE_OPTIONS = foreign
ACLOCAL_AMFLAGS = -I m4
-CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
- CMake/CurlTests.c CMake/FindGSS.cmake CMake/OtherTests.cmake \
- CMake/Platforms/WindowsCache.cmake CMake/Utilities.cmake \
- CMake/Macros.cmake \
- CMake/CurlSymbolHiding.cmake CMake/FindCARES.cmake \
- CMake/FindLibSSH2.cmake CMake/FindNGHTTP2.cmake \
- CMake/FindMbedTLS.cmake CMake/cmake_uninstall.cmake.in \
- CMake/curl-config.cmake.in
+CMAKE_DIST = \
+ CMake/cmake_uninstall.cmake.in \
+ CMake/CMakeConfigurableFile.in \
+ CMake/curl-config.cmake.in \
+ CMake/CurlSymbolHiding.cmake \
+ CMake/CurlTests.c \
+ CMake/FindBearSSL.cmake \
+ CMake/FindBrotli.cmake \
+ CMake/FindCARES.cmake \
+ CMake/FindGSS.cmake \
+ CMake/FindLibSSH2.cmake \
+ CMake/FindMbedTLS.cmake \
+ CMake/FindNGHTTP2.cmake \
+ CMake/FindNGHTTP3.cmake \
+ CMake/FindNGTCP2.cmake \
+ CMake/FindNSS.cmake \
+ CMake/FindQUICHE.cmake \
+ CMake/FindWolfSSL.cmake \
+ CMake/FindZstd.cmake \
+ CMake/Macros.cmake \
+ CMake/OtherTests.cmake \
+ CMake/Platforms/WindowsCache.cmake \
+ CMake/Utilities.cmake \
+ CMakeLists.txt
VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -151,14 +167,14 @@ VC_DIST = projects/README \
projects/wolfssl_options.h \
projects/wolfssl_override.props
-WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
+WINBUILD_DIST = winbuild/README.md winbuild/gen_resp_file.bat \
winbuild/MakefileBuild.vc winbuild/Makefile.vc
PLAN9_DIST = plan9/include/mkfile \
plan9/include/mkfile \
plan9/mkfile.proto \
plan9/mkfile \
- plan9/BUILD.PLAN9.txt \
+ plan9/README \
plan9/lib/mkfile.inc \
plan9/lib/mkfile \
plan9/src/mkfile.inc \
@@ -289,15 +305,15 @@ cygwinbin:
# We extend the standard install with a custom hook:
install-data-hook:
- cd include && $(MAKE) install
- cd docs && $(MAKE) install
- cd docs/libcurl && $(MAKE) install
+ (cd include && $(MAKE) install)
+ (cd docs && $(MAKE) install)
+ (cd docs/libcurl && $(MAKE) install)
# We extend the standard uninstall with a custom hook:
uninstall-hook:
- cd include && $(MAKE) uninstall
- cd docs && $(MAKE) uninstall
- cd docs/libcurl && $(MAKE) uninstall
+ (cd include && $(MAKE) uninstall)
+ (cd docs && $(MAKE) uninstall)
+ (cd docs/libcurl && $(MAKE) uninstall)
ca-bundle: lib/mk-ca-bundle.pl
@echo "generating a fresh ca-bundle.crt"
@@ -308,11 +324,11 @@ ca-firefox: lib/firefox-db2pem.sh
./lib/firefox-db2pem.sh lib/ca-bundle.crt
checksrc:
- cd lib && $(MAKE) checksrc
- cd src && $(MAKE) checksrc
- cd tests && $(MAKE) checksrc
- cd include/curl && $(MAKE) checksrc
- cd docs/examples && $(MAKE) checksrc
+ (cd lib && $(MAKE) checksrc)
+ (cd src && $(MAKE) checksrc)
+ (cd tests && $(MAKE) checksrc)
+ (cd include/curl && $(MAKE) checksrc)
+ (cd docs/examples && $(MAKE) checksrc)
.PHONY: vc-ide
@@ -328,6 +344,10 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
win32_lib_rc='$(LIB_RCFILES)'; \
win32_lib_vauth_srcs='$(LIB_VAUTH_CFILES)'; \
win32_lib_vauth_hdrs='$(LIB_VAUTH_HFILES)'; \
+ win32_lib_vquic_srcs='$(LIB_VQUIC_CFILES)'; \
+ win32_lib_vquic_hdrs='$(LIB_VQUIC_HFILES)'; \
+ win32_lib_vssh_srcs='$(LIB_VSSH_CFILES)'; \
+ win32_lib_vssh_hdrs='$(LIB_VSSH_HFILES)'; \
win32_lib_vtls_srcs='$(LIB_VTLS_CFILES)'; \
win32_lib_vtls_hdrs='$(LIB_VTLS_HFILES)'; \
win32_src_srcs='$(CURL_CFILES)'; \
@@ -340,6 +360,10 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
sorted_lib_hdrs=`for file in $$win32_lib_hdrs; do echo $$file; done | sort`; \
sorted_lib_vauth_srcs=`for file in $$win32_lib_vauth_srcs; do echo $$file; done | sort`; \
sorted_lib_vauth_hdrs=`for file in $$win32_lib_vauth_hdrs; do echo $$file; done | sort`; \
+ sorted_lib_vquic_srcs=`for file in $$win32_lib_vquic_srcs; do echo $$file; done | sort`; \
+ sorted_lib_vquic_hdrs=`for file in $$win32_lib_vquic_hdrs; do echo $$file; done | sort`; \
+ sorted_lib_vssh_srcs=`for file in $$win32_lib_vssh_srcs; do echo $$file; done | sort`; \
+ sorted_lib_vssh_hdrs=`for file in $$win32_lib_vssh_hdrs; do echo $$file; done | sort`; \
sorted_lib_vtls_srcs=`for file in $$win32_lib_vtls_srcs; do echo $$file; done | sort`; \
sorted_lib_vtls_hdrs=`for file in $$win32_lib_vtls_hdrs; do echo $$file; done | sort`; \
sorted_src_srcs=`for file in $$win32_src_srcs; do echo $$file; done | sort`; \
@@ -351,10 +375,15 @@ vc-ide: $(VC6_LIBDSP_DEPS) $(VC6_SRCDSP_DEPS) $(VC7_LIBVCPROJ_DEPS) \
function gen_element(type, dir, file)\
{\
sub(/vauth\//, "", file);\
+ sub(/vquic\//, "", file);\
+ sub(/vssh\//, "", file);\
sub(/vtls\//, "", file);\
\
spaces=" ";\
- if(dir == "lib\\vauth" || dir == "lib\\vtls")\
+ if(dir == "lib\\vauth" ||\
+ dir == "lib\\vquic" ||\
+ dir == "lib\\vssh" ||\
+ dir == "lib\\vtls")\
tabs=" ";\
else\
tabs=" ";\
@@ -416,6 +445,22 @@ function gen_element(type, dir, file)\
split(lib_vauth_hdrs, arr);\
for(val in arr) gen_element(proj_type, "lib\\vauth", arr[val]);\
}\
+ else if($$0 == "CURL_LIB_VQUIC_C_FILES") {\
+ split(lib_vquic_srcs, arr);\
+ for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
+ }\
+ else if($$0 == "CURL_LIB_VQUIC_H_FILES") {\
+ split(lib_vquic_hdrs, arr);\
+ for(val in arr) gen_element(proj_type, "lib\\vquic", arr[val]);\
+ }\
+ else if($$0 == "CURL_LIB_VSSH_C_FILES") {\
+ split(lib_vssh_srcs, arr);\
+ for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
+ }\
+ else if($$0 == "CURL_LIB_VSSH_H_FILES") {\
+ split(lib_vssh_hdrs, arr);\
+ for(val in arr) gen_element(proj_type, "lib\\vssh", arr[val]);\
+ }\
else if($$0 == "CURL_LIB_VTLS_C_FILES") {\
split(lib_vtls_srcs, arr);\
for(val in arr) gen_element(proj_type, "lib\\vtls", arr[val]);\
@@ -461,6 +506,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC6_LIBTMPL) > $(VC6_LIBDSP) || { exit 1; }; \
@@ -481,6 +530,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC7_LIBTMPL) > $(VC7_LIBVCPROJ) || { exit 1; }; \
@@ -501,6 +554,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC71_LIBTMPL) > $(VC71_LIBVCPROJ) || { exit 1; }; \
@@ -521,6 +578,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC8_LIBTMPL) > $(VC8_LIBVCPROJ) || { exit 1; }; \
@@ -541,6 +602,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC9_LIBTMPL) > $(VC9_LIBVCPROJ) || { exit 1; }; \
@@ -561,6 +626,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC10_LIBTMPL) > $(VC10_LIBVCXPROJ) || { exit 1; }; \
@@ -581,6 +650,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC11_LIBTMPL) > $(VC11_LIBVCXPROJ) || { exit 1; }; \
@@ -601,6 +674,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC12_LIBTMPL) > $(VC12_LIBVCXPROJ) || { exit 1; }; \
@@ -621,6 +698,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC14_LIBTMPL) > $(VC14_LIBVCXPROJ) || { exit 1; }; \
@@ -641,6 +722,10 @@ function gen_element(type, dir, file)\
-v lib_rc="$$win32_lib_rc" \
-v lib_vauth_srcs="$$sorted_lib_vauth_srcs" \
-v lib_vauth_hdrs="$$sorted_lib_vauth_hdrs" \
+ -v lib_vquic_srcs="$$sorted_lib_vquic_srcs" \
+ -v lib_vquic_hdrs="$$sorted_lib_vquic_hdrs" \
+ -v lib_vssh_srcs="$$sorted_lib_vssh_srcs" \
+ -v lib_vssh_hdrs="$$sorted_lib_vssh_hdrs" \
-v lib_vtls_srcs="$$sorted_lib_vtls_srcs" \
-v lib_vtls_hdrs="$$sorted_lib_vtls_hdrs" \
"$$awk_code" $(srcdir)/$(VC15_LIBTMPL) > $(VC15_LIBVCXPROJ) || { exit 1; }; \
diff --git a/README b/README
index c439dab9e..f337f3511 100644
--- a/README
+++ b/README
@@ -17,9 +17,9 @@ README
You find answers to the most frequent questions we get in the FAQ document.
- Study the COPYING file for distribution terms and similar. If you distribute
- curl binaries or other binaries that involve libcurl, you might enjoy the
- LICENSE-MIXING document.
+ Study the COPYING file for distribution terms.
+
+ Those documents and more can be found in the docs/ directory.
CONTACT
@@ -28,9 +28,9 @@ CONTACT
All contributors to the project are listed in the THANKS document.
-WEB SITE
+WEBSITE
- Visit the curl web site for the latest news and downloads:
+ Visit the curl website for the latest news and downloads:
https://curl.haxx.se/
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index cea2debda..7ec031d1c 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,144 +1,160 @@
-curl and libcurl 7.67.0
+curl and libcurl 7.73.0
- Public curl releases: 186
- Command line options: 226
- curl_easy_setopt() options: 269
- Public functions in libcurl: 81
- Contributors: 2056
+ Public curl releases: 195
+ Command line options: 234
+ curl_easy_setopt() options: 278
+ Public functions in libcurl: 85
+ Contributors: 2270
This release includes the following changes:
- o curl: added --no-progress-meter [73]
- o setopt: CURLMOPT_MAX_CONCURRENT_STREAMS is new [55]
- o urlapi: CURLU_NO_AUTHORITY allows empty authority/host part [22]
+ o curl: add --output-dir [25]
+ o curl: support XDG_CONFIG_HOME to find .curlrc [3]
+ o curl: update --help with categories [77]
+ o curl_easy_option_*: new API for meta-data about easy options [40]
+ o CURLE_PROXY: new error code [7]
+ o mqtt: enable by default [28]
+ o sftp: add new quote commands 'atime' and 'mtime' [6]
+ o ssh: add the option CURLKHSTAT_FINE_REPLACE [27]
+ o tls: add CURLOPT_SSL_EC_CURVES and --curves [29]
This release includes the following bugfixes:
- o BINDINGS: five new bindings addded
- o CURLOPT_TIMEOUT.3: Clarify transfer timeout time includes queue time [78]
- o CURLOPT_TIMEOUT.3: remove the mention of "minutes" [74]
- o ESNI: initial build/setup support [71]
- o FTP: FTPFILE_NOCWD: avoid redundant CWDs [28]
- o FTP: allow "rubbish" prepended to the SIZE response [15]
- o FTP: remove trailing slash from path for LIST/MLSD [6]
- o FTP: skip CWD to entry dir when target is absolute [16]
- o FTP: url-decode path before evaluation [36]
- o HTTP3.md: move -p for mkdir, remove -j for make [46]
- o HTTP3: fix invalid use of sendto for connected UDP socket [109]
- o HTTP3: fix ngtcp2 Windows build [93]
- o HTTP3: fix prefix parameter for ngtcp2 build [40]
- o HTTP3: fix typo somehere1 > somewhere1 [108]
- o HTTP3: show an --alt-svc using example too
- o INSTALL: add missing space for configure commands [106]
- o INSTALL: add vcpkg installation instructions [35]
- o README: minor grammar fix [39]
- o altsvc: accept quoted ma and persist values [60]
- o altsvc: both backends run h3-23 now [31]
- o appveyor: Add MSVC ARM64 build [87]
- o appveyor: Use two parallel compilation on appveyor with CMake [98]
- o appveyor: add --disable-proxy autotools build [94]
- o appveyor: add 32-bit MinGW-w64 build [58]
- o appveyor: add a winbuild [14]
- o appveyor: add a winbuild that uses VS2017 [84]
- o appveyor: make winbuilds with DEBUG=no/yes and VS 2015/2017 [95]
- o appveyor: publish artifacts on appveyor [105]
- o appveyor: upgrade VS2017 to VS2019 [29]
- o asyn-thread: make use of Curl_socketpair() where available [85]
- o asyn-thread: s/AF_LOCAL/AF_UNIX for Solaris [3]
- o build: Remove unused HAVE_LIBSSL and HAVE_LIBCRYPTO defines [77]
- o checksrc: fix uninitialized variable warning [57]
- o chunked-encoding: stop hiding the CURLE_BAD_CONTENT_ENCODING error [56]
- o cirrus: Increase the git clone depth
- o cirrus: Switch the FreeBSD 11.x build to 11.3 and add a 13.0 build
- o cirrus: switch off blackhole status on the freebsd CI machines [72]
- o cleanups: 21 various PVS-Studio warnings [24]
- o configure: only say ipv6 enabled when the variable is set [110]
- o configure: remove all cyassl references [90]
- o conn-reuse: requests wanting NTLM can reuse non-NTLM connections [99]
- o connect: return CURLE_OPERATION_TIMEDOUT for errno == ETIMEDOUT [72]
- o connect: silence sign-compare warning [83]
- o cookie: avoid harmless use after free [69]
- o cookie: pass in the correct cookie amount to qsort() [27]
- o cookies: change argument type for Curl_flush_cookies [67]
- o cookies: using a share with cookies shouldn't enable the cookie engine [63]
- o copyrights: update copyright notices to 2019 [101]
- o curl: create easy handles on-demand and not ahead of time [54]
- o curl: ensure HTTP 429 triggers --retry [64]
- o curl: exit the create_transfers loop on errors [33]
- o curl: fix memory leaked by parse_metalink() [17]
- o curl: load large files with -d @ much faster [19]
- o docs/HTTP3: fix `--with-ssl` ngtcp2 configure flag [21]
- o docs: added multi-event.c example [75]
- o docs: disambiguate CURLUPART_HOST is for host name (ie no port) [62]
- o docs: note on failed handles not being counted by curl_multi_perform [70]
- o doh: allow only http and https in debug mode [48]
- o doh: avoid truncating DNS QTYPE to lower octet [23]
- o doh: clean up dangling DOH memory on easy close [9]
- o doh: fix (harmless) buffer overrun [13]
- o doh: fix undefined behaviour and open up for gcc and clang optimization [12]
- o doh: return early if there is no time left [48]
- o examples/sslbackend: fix -Wchar-subscripts warning [89]
- o examples: remove the "this exact code has not been verified"
- o git: add tests/server/disabled to .gitignore [59]
- o gnutls: make gnutls_bye() not wait for response on shutdown [104]
- o http2: expire a timeout at end of stream [88]
- o http2: prevent dup'ed handles to send dummy PRIORITY frames [68]
- o http2: relax verification of :authority in push promise requests [8]
- o http2_recv: a closed stream trumps pause state [88]
- o http: lowercase headernames for HTTP/2 and HTTP/3 [49]
- o ldap: Stop using wide char version of ldapp_err2string [1]
- o ldap: fix OOM error on missing query string [76]
- o mbedtls: add error message for cert validity starting in the future [102]
- o mime: when disabled, avoid C99 macro [7]
- o ngtcp2: adapt to API change [66]
- o ngtcp2: compile with latest ngtcp2 + nghttp3 draft-23 [25]
- o ngtcp2: remove fprintf() calls [43]
- o openssl: close_notify on the FTP data connection doesn't mean closure [20]
- o openssl: fix compiler warning with LibreSSL [34]
- o openssl: use strerror on SSL_ERROR_SYSCALL [41]
- o os400: getpeername() and getsockname() return ebcdic AF_UNIX sockaddr [47]
- o parsedate: fix date parsing disabled builds [18]
- o quiche: don't close connection at end of stream
- o quiche: persist connection details (fixes -I with --http3) [11]
- o quiche: set 'drain' when returning without having drained the queues
- o quiche: update HTTP/3 config creation to new API [61]
- o redirect: handle redirects to absolute URLs containing spaces [52]
- o runtests: get textaware info from curl instead of perl [86]
- o schannel: reverse the order of certinfo insertions [96]
- o schannel_verify: Fix concurrent openings of CA file [103]
- o security: silence conversion warning [83]
- o setopt: handle ALTSVC set to NULL
- o setopt: make it easier to add new enum values [4]
- o setopt: store CURLOPT_RTSP_SERVER_CSEQ correctly [24]
- o smb: check for full size message before reading message details [10]
- o smbserver: fix Python 3 compatibility [82]
- o socks: Fix destination host shown on SOCKS5 error [32]
- o test1162: disable MSYS2's POSIX path conversion
- o test1591: fix spelling of http feature [97]
- o tests: add `connect to non-listen` keywords [91]
- o tests: fix narrowing conversion warnings [37]
- o tests: fix the test 3001 cert failures [100]
- o tests: makes tests succeed when using --disable-proxy [81]
- o tests: use %FILE_PWD for file:// URLs [92]
- o tests: use port 2 instead of 60000 for a safer non-listening port [72]
- o tool_operate: Fix retry sleep time shown to user when Retry-After [79]
- o travis: Add an ARM64 build
- o url: Curl_free_request_state() should also free doh handles [107]
- o url: don't set appconnect time for non-ssl/non-ssh connections [42]
- o url: fix the NULL hostname compiler warning [44]
- o url: normalize CURLINFO_EFFECTIVE_URL [80]
- o url: only reuse TLS connections with matching pinning [5]
- o urlapi: avoid index underflow for short ipv6 hostnames [26]
- o urlapi: fix URL encoding when setting a full URL [53]
- o urlapi: fix unused variable warning [57]
- o urlapi: question mark within fragment is still fragment [45]
- o urldata: use 'bool' for the bit type on MSVC compilers [30]
- o vtls: Fix comment typo about macosx-version-min compiler flag [38]
- o vtls: fix narrowing conversion warnings [50]
- o winbuild/MakefileBuild.vc: Add vssh [2]
- o winbuild/MakefileBuild.vc: Fix line endings
- o winbuild: Add manifest to curl.exe for proper OS version detection [51]
- o winbuild: add ENABLE_UNICODE option [65]
+ o altsvc: clone setting in curl_easy_duphandle [60]
+ o base64: also build for smtp, pop3 and imap [81]
+ o BUGS: convert document to markdown [107]
+ o build-wolfssl: fix build with Visual Studio 2019 [114]
+ o buildconf: invoke 'autoreconf -fi' instead [37]
+ o checksrc: detect // comments on column 0 [132]
+ o checksrc: verify do-while and spaces between the braces [2]
+ o checksrc: warn on space after exclamation mark [129]
+ o CI/azure: disable test 571 in the msys2 builds [93]
+ o CI/azure: MQTT is now enabled by default [64]
+ o CI/azure: no longer ignore results of test 1013 [43]
+ o CI/tests: fix invocation of tests for CMake builds [117]
+ o CI/travis: add a CI job with openssl3 (from git master) [51]
+ o cleanups: avoid curl_ on local variables [53]
+ o CMake: add option to enable Unicode on Windows [48]
+ o cmake: make HTTP_ONLY also disable MQTT [58]
+ o CMake: remove explicit `CMAKE_ANSI_CFLAGS` [45]
+ o cmake: remove scary warning [96]
+ o cmdline-opts/gen.pl: generate nicer "See Also" in curl.1 [66]
+ o configure: don't say HTTPS-proxy is enabled when disabled [120]
+ o configure: fix pkg-config detecting wolfssl [26]
+ o configure: let --enable-debug set -Wenum-conversion with gcc >= 10 [56]
+ o conn: check for connection being dead before reuse [39]
+ o connect.c: remove superfluous 'else' in Curl_getconnectinfo [42]
+ o curl.1: add see also no-progress-meter on two spots [67]
+ o curl.1: fix typo invokved -> invoked [36]
+ o curl: in retry output don't call all problems "transient" [74]
+ o curl: make --libcurl show binary posts correctly [130]
+ o curl: make checkpasswd use dynbuf [100]
+ o curl: make file2memory use dynbuf [102]
+ o curl: make file2string use dynbuf [103]
+ o curl: make glob_match_url use dynbuf [101]
+ o curl: make sure setopt CURLOPT_IPRESOLVE passes on a long [134]
+ o curl: retry delays in parallel mode no longer sleeps blocking [70]
+ o curl: use curlx_dynbuf for realloc when loading config files [73]
+ o curl:parallel_transfers: make sure retry readds the transfer [71]
+ o curl_get_line: build only if cookies or alt-svc are enabled [13]
+ o curl_mime_headers.3: fix the example's use of curl_slist_append [83]
+ o Curl_pgrsTime - return new time to avoid timeout integer overflow [32]
+ o Curl_send: return error when pre_receive_plain can't malloc [111]
+ o dist: add missing CMake Find modules to the distribution [14]
+ o docs/LICENSE-MIXING: remove [79]
+ o docs/opts: fix typos in two manual pages [119]
+ o docs/RESOURCES: remove [105]
+ o docs/TheArtOfHttpScripting: convert to markdown [106]
+ o docs: add description about CI platforms to CONTRIBUTE.md [44]
+ o docs: correct non-existing macros in man pages [35]
+ o doh: add error message for DOH_DNS_NAME_TOO_LONG [17]
+ o dynbuf: make sure Curl_dyn_tail() zero terminates [78]
+ o easy_reset: clear retry counter [82]
+ o easygetopt: pass a valid enum to avoid compiler warning [75]
+ o etag: save and use the full received contents [4]
+ o ftp: a 550 response to SIZE returns CURLE_REMOTE_FILE_NOT_FOUND [99]
+ o ftp: avoid risk of reading uninitialized integers [76]
+ o ftp: get rid of the PPSENDF macro [85]
+ o ftp: make a 552 response return CURLE_REMOTE_DISK_FULL [87]
+ o ftp: separate FTPS from FTP over "HTTPS proxy" [112]
+ o git: ignore libtests in 3XXX area [16]
+ o github: use new issue template feature [88]
+ o HISTORY: mention alt-svc added in 2019
+ o HTTP/3: update to OpenSSL_1_1_1g-quic-draft-29 [41]
+ o http: consolidate nghttp2_session_mem_recv() call paths [80]
+ o http_proxy: do not count proxy headers in the header bytecount [90]
+ o http_proxy: do not crash with HTTPS_PROXY and NO_PROXY set [50]
+ o imap: make imap_send use dynbuf for the send buffer management [110]
+ o imap: set cselect_bits to CURL_CSELECT_IN initially [104]
+ o ldap: reduce the amount of #ifdefs needed [124]
+ o lib/Makefile.am: bump VERSIONINFO due to new functions [65]
+ o lib1560: verify "redirect" to double-slash leading URL [20]
+ o lib583: fix enum mixup
+ o lib: fix -Wassign-enum warnings [84]
+ o lib: make Curl_gethostname accept a const pointer [38]
+ o libssh2: handle the SSH protocols done over HTTPS proxy [125]
+ o libssh2: pass on the error from ssh_force_knownhost_key_type [47]
+ o Makefile.m32: add ability to override zstd libs [ci skip] [10]
+ o man pages: switch to https://example.com URLs [86]
+ o MANUAL: update examples to resolve without redirects [122]
+ o mbedtls: add missing header when defining MBEDTLS_DEBUG [133]
+ o memdebug: remove 9 year old unused debug function [126]
+ o multi: expand pre-check for socket readiness [21]
+ o multi: handle connection state winsock events [31]
+ o multi: implement wait using winsock events [22]
+ o ngtcp2: adapt to new NGTCP2_PROTO_VER_MAX define [108]
+ o ngtcp2: adapt to the new pkt_info arguments [18]
+ o ntlm: fix condition for curl_ntlm_core usage [46]
+ o openssl: avoid error conditions when importing native CA [52]
+ o openssl: consider ALERT_CERTIFICATE_EXPIRED a failed verification [57]
+ o openssl: Fix wincrypt symbols conflict with BoringSSL [9]
+ o parsedate: tune the date to epoch conversion [95]
+ o pause: only trigger a reread if the unpause sticks [92]
+ o pingpong: use a dynbuf for the *_pp_sendf() function [113]
+ o READMEs: convert several to markdown [115]
+ o runtests: add %repeat[]% for test files [116]
+ o runtests: allow creating files without newlines [72]
+ o runtests: allow generating a binary sequence from hex
+ o runtests: clear pid variables when failing to start a server [12]
+ o runtests: make cleardir() erase dot files too [8]
+ o runtests: provide curl's version string as %VERSION for tests [127]
+ o schannel: fix memory leak when using get_cert_location [15]
+ o schannel: return CURLE_PEER_FAILED_VERIFICATION for untrusted root [128]
+ o scripts: improve the "get latest curl release tag" logic
+ o sectransp: make it build with --disable-proxy [123]
+ o select.h: make socket validation macros test for INVALID_SOCKET [24]
+ o select: align poll emulation to return all relevant events [63]
+ o select: fix poll-based check not detecting connect failure
+ o select: reduce duplication of Curl_poll in Curl_socket_check [23]
+ o select: simplify return code handling for poll and select [49]
+ o setopt: if the buffer exists, refuse the new BUFFERSIZE [5]
+ o setopt: return CURLE_BAD_FUNCTION_ARGUMENT on bad argument [91]
+ o socketpair: allow CURL_DISABLE_SOCKETPAIR [11]
+ o sockfilt: handle FD_CLOSE winsock event on write socket [30]
+ o src: spell whitespace without whitespace [121]
+ o SSLCERTS: fix English syntax [34]
+ o strerror: honor Unicode API choice on Windows [109]
+ o symbian: drop support [118]
+ o telnet.c: depend on static requirement of WinSock version 2 [61]
+ o test1541: remove since it is a known bug [68]
+ o test163[12]: require http to be built-in to run [94]
+ o test434: test -K use in a single line without newline [59]
+ o test971: show test mismatches "inline"
+ o tests/data: Fix some mismatched XML tags in test cases
+ o tests/FILEFORMAT: document nonewline support for <file>
+ o tests/FILEFORMAT: document type=shell for <command>
+ o tests/server/util.c: fix support for Windows Unicode builds [131]
+ o tests: remove pipelining tests [69]
+ o tls: fix SRP detection by using the proper #ifdefs [33]
+ o tls: provide the CApath verbose log on its own line [1]
+ o tool_setopt: escape binary data to hex, not octal
+ o tool_writeout: add new writeout variable, %{num_headers} [97]
+ o travis: add a build using libressl (from git master) [55]
+ o url: use blank credentials when using proxy w/o username and password [54]
+ o urlapi: use more Curl_safefree [89]
+ o vtls: deduplicate client certificates in ssl_config_data [98]
+ o win32: drop support for WinSock version 1, require version 2 [62]
+ o winbuild: convert the instruction text to README.md [19]
This release includes the following known bugs:
@@ -147,136 +163,159 @@ This release includes the following known bugs:
This release would not have looked like this without help, code, reports and
advice from friends like these:
- Alessandro Ghedini, Alex Konev, Alex Samorukov, Andrei Valeriu BICA,
- Barry Pollard, Bastien Bouclet, Bernhard Walle, Bylon2 on github,
- Christophe Dervieux, Christoph M. Becker, Dagobert Michelsen, Dan Fandrich,
- Daniel Silverstone, Daniel Stenberg, Denis Chaplygin, Emil Engler,
- Francois Rivard, George Liu, Gilles Vollant, Griffin Downs, Harry Sintonen,
- Ilya Kosarev, infinnovation-dev on github, Jacob Barthelmeh, Javier Blazquez,
- Jens Finkhaeuser, Jeremy Lainé, Jeroen Ooms, Jimmy Gaussen, Joel Depooter,
- Jojojov on github, jzinn on github, Kamil Dudka, Kunal Ekawde, Lucas Pardue,
- Lucas Severo, Marcel Hernandez, Marcel Raad, Martin Gartner, Max Dymond,
- Michael Kaufmann, Michał Janiszewski, momala454 on github,
- Nathaniel J. Smith, Niall O'Reilly, nico-abram on github,
- Nikos Mavrogiannopoulos, Patrick Monnerat, Paul B. Omta, Paul Dreik,
- Peter Sumatra, Philippe Marguinaud, Piotr Komborski, Ray Satiro,
- Richard Alcock, Roland Hieber, Samuel Surtees, Sebastian Haglund,
- Spezifant on github, Stian Soiland-Reyes, SumatraPeter on github,
- Tatsuhiro Tsujikawa, Tom van der Woerdt, Trivikram Kamat,
- Valerii Zapodovnikov, Vilhelm Prytz, Yechiel Kalmenson, Zenju on github,
- (68 contributors)
+ Alessandro Ghedini, Anders Bakken, Andrew Barnes, anio on github,
+ Antarpreet Singh, beckenc on github, Chris Paulson-Ellis,
+ Christian Weisgerber, COFFEETALES on github, Dan Fandrich, Daniel Gustafsson,
+ Daniel Stenberg, Dan Kenigsberg, Diven Qi, Don J Olmstead, Duncan Wilcox,
+ Eli Schwartz, Emil Engler, Eric Curtin, Frederik Wedel-Heinen,
+ fullincome on github, Gaurav Malhotra, Gergely Nagy, Gisle Vanem,
+ Harry Sintonen, htasta on github, iammrtau on github, ihsinme on github,
+ IonuÈ›-Francisc Oancea, Javier Blazquez, Javier Navarro, Jeroen Ooms,
+ jmdavitt on github, Kamil Dudka, Kunal Chandarana, Laramie Leavitt,
+ Marcel Raad, Marc Hörsken, Martin Bašti, Michael Baentsch, Michael Musset,
+ Michael Olbrich, Mingtao Yang, M.R.T on github, Peter Körner, Peter Wu,
+ Quentin Balland, Rasmus Melchior Jacobsen, Ray Satiro, rcombs on github,
+ Robin Douine, Samanta Navarro, Samuel Marks, Samuel Tranchet, Sergei Nikulov,
+ sofaboss on github, Stefan Strogin, Stephan Mühlstrasser,
+ Tatsuhiro Tsujikawa, Tomas Berger, Tom van der Woerdt, Viktor Szakats,
+ xwxbug on github,
+ (63 contributors)
Thanks! (and sorry if I forgot to mention someone)
References to bug reports and discussions on issues:
- [1] = https://curl.haxx.se/bug/?i=4272
- [2] = https://curl.haxx.se/bug/?i=4322
- [3] = https://curl.haxx.se/bug/?i=4328
- [4] = https://curl.haxx.se/bug/?i=4321
- [5] = https://curl.haxx.se/mail/lib-2019-09/0061.html
- [6] = https://curl.haxx.se/bug/?i=4348
- [7] = https://curl.haxx.se/bug/?i=4368
- [8] = https://curl.haxx.se/bug/?i=4365
- [9] = https://curl.haxx.se/bug/?i=4366
- [10] = https://curl.haxx.se/bug/?i=4363
- [11] = https://curl.haxx.se/bug/?i=4358
- [12] = https://curl.haxx.se/bug/?i=4350
- [13] = https://curl.haxx.se/bug/?i=4352
- [14] = https://curl.haxx.se/bug/?i=4324
- [15] = https://curl.haxx.se/bug/?i=4339
- [16] = https://curl.haxx.se/bug/?i=4332
- [17] = https://curl.haxx.se/bug/?i=4326
- [18] = https://curl.haxx.se/bug/?i=4325
- [19] = https://curl.haxx.se/bug/?i=4336
- [20] = https://curl.haxx.se/bug/?i=4329
- [21] = https://curl.haxx.se/bug/?i=4338
- [22] = https://curl.haxx.se/bug/?i=4349
- [23] = https://curl.haxx.se/bug/?i=4381
- [24] = https://curl.haxx.se/bug/?i=4374
- [25] = https://curl.haxx.se/bug/?i=4392
- [26] = https://curl.haxx.se/bug/?i=4389
- [27] = https://curl.haxx.se/bug/?i=4386
- [28] = https://curl.haxx.se/bug/?i=4382
- [29] = https://curl.haxx.se/bug/?i=4383
- [30] = https://curl.haxx.se/bug/?i=4387
- [31] = https://curl.haxx.se/bug/?i=4395
- [32] = https://curl.haxx.se/bug/?i=4394
- [33] = https://curl.haxx.se/bug/?i=4393
- [34] = https://curl.haxx.se/bug/?i=4397
- [35] = https://curl.haxx.se/bug/?i=4435
- [36] = https://curl.haxx.se/bug/?i=4428
- [37] = https://curl.haxx.se/bug/?i=4415
- [38] = https://curl.haxx.se/bug/?i=4425
- [39] = https://curl.haxx.se/bug/?i=4431
- [40] = https://curl.haxx.se/bug/?i=4430
- [41] = https://curl.haxx.se/bug/?i=4411
- [42] = https://curl.haxx.se/bug/?i=3760
- [43] = https://curl.haxx.se/bug/?i=4421
- [44] = https://curl.haxx.se/bug/?i=4403
- [45] = https://curl.haxx.se/bug/?i=4412
- [46] = https://curl.haxx.se/bug/?i=4407
- [47] = https://curl.haxx.se/bug/?i=4214
- [48] = https://curl.haxx.se/bug/?i=4406
- [49] = https://curl.haxx.se/bug/?i=4400
- [50] = https://curl.haxx.se/bug/?i=4398
- [51] = https://curl.haxx.se/bug/?i=4399
- [52] = https://curl.haxx.se/bug/?i=4445
- [53] = https://curl.haxx.se/bug/?i=4447
- [54] = https://curl.haxx.se/bug/?i=4393
- [55] = https://curl.haxx.se/bug/?i=4410
- [56] = https://curl.haxx.se/bug/?i=4310
- [57] = https://curl.haxx.se/bug/?i=4444
- [58] = https://curl.haxx.se/bug/?i=4433
- [59] = https://curl.haxx.se/bug/?i=4441
- [60] = https://curl.haxx.se/bug/?i=4443
- [61] = https://curl.haxx.se/bug/?i=4437
- [62] = https://curl.haxx.se/bug/?i=4424
- [63] = https://curl.haxx.se/bug/?i=4429
- [64] = https://curl.haxx.se/bug/?i=4465
- [65] = https://curl.haxx.se/bug/?i=4308
- [66] = https://curl.haxx.se/bug/?i=4457
- [67] = https://curl.haxx.se/bug/?i=4455
- [68] = https://curl.haxx.se/bug/?i=4303
- [69] = https://curl.haxx.se/bug/?i=4454
- [70] = https://curl.haxx.se/bug/?i=4446
- [71] = https://curl.haxx.se/bug/?i=4011
- [72] = https://curl.haxx.se/bug/?i=4461
- [73] = https://curl.haxx.se/bug/?i=4422
- [74] = https://curl.haxx.se/bug/?i=4469
- [75] = https://curl.haxx.se/bug/?i=4471
- [76] = https://curl.haxx.se/bug/?i=4467
- [77] = https://curl.haxx.se/bug/?i=4460
- [78] = https://curl.haxx.se/bug/?i=4486
- [79] = https://curl.haxx.se/bug/?i=4498
- [80] = https://curl.haxx.se/bug/?i=4491
- [81] = https://curl.haxx.se/bug/?i=4488
- [82] = https://curl.haxx.se/bug/?i=4484
- [83] = https://curl.haxx.se/bug/?i=4483
- [84] = https://curl.haxx.se/bug/?i=4482
- [85] = https://curl.haxx.se/bug/?i=4466
- [86] = https://curl.haxx.se/bug/?i=4506
- [87] = https://curl.haxx.se/bug/?i=4507
- [88] = https://curl.haxx.se/bug/?i=4496
- [89] = https://curl.haxx.se/bug/?i=4503
- [90] = https://curl.haxx.se/bug/?i=4502
- [91] = https://curl.haxx.se/bug/?i=4511
- [92] = https://curl.haxx.se/bug/?i=4512
- [93] = https://curl.haxx.se/bug/?i=4531
- [94] = https://curl.haxx.se/bug/?i=4526
- [95] = https://curl.haxx.se/bug/?i=4523
- [96] = https://curl.haxx.se/bug/?i=4518
- [97] = https://curl.haxx.se/bug/?i=4520
- [98] = https://curl.haxx.se/bug/?i=4508
- [99] = https://curl.haxx.se/bug/?i=4499
- [100] = https://curl.haxx.se/bug/?i=4551
- [101] = https://curl.haxx.se/bug/?i=4547
- [102] = https://curl.haxx.se/bug/?i=4552
- [103] = https://curl.haxx.se/mail/lib-2019-10/0104.html
- [104] = https://curl.haxx.se/bug/?i=4487
- [105] = https://curl.haxx.se/bug/?i=4509
- [106] = https://curl.haxx.se/bug/?i=4539
- [107] = https://curl.haxx.se/bug/?i=4463
- [108] = https://curl.haxx.se/bug/?i=4535
- [109] = https://curl.haxx.se/bug/?i=4529
- [110] = https://curl.haxx.se/bug/?i=4555
+ [1] = https://curl.haxx.se/bug/?i=5826
+ [2] = https://curl.haxx.se/bug/?i=5845
+ [3] = https://curl.haxx.se/bug/?i=5829
+ [4] = https://curl.haxx.se/bug/?i=5610
+ [5] = https://curl.haxx.se/bug/?i=5842
+ [6] = https://curl.haxx.se/bug/?i=5810
+ [7] = https://curl.haxx.se/bug/?i=5770
+ [8] = https://curl.haxx.se/bug/?i=5838
+ [9] = https://curl.haxx.se/bug/?i=5669
+ [10] = https://curl.haxx.se/bug/?i=5840
+ [11] = https://curl.haxx.se/bug/?i=5850
+ [12] = https://curl.haxx.se/mail/lib-2020-08/0018.html
+ [13] = https://curl.haxx.se/bug/?i=5851
+ [14] = https://curl.haxx.se/bug/?i=5836
+ [15] = https://curl.haxx.se/bug/?i=5855
+ [16] = https://curl.haxx.se/bug/?i=5859
+ [17] = https://curl.haxx.se/bug/?i=5863
+ [18] = https://curl.haxx.se/bug/?i=5864
+ [19] = https://curl.haxx.se/bug/?i=5861
+ [20] = https://curl.haxx.se/bug/?i=5849
+ [21] = https://curl.haxx.se/bug/?i=5634
+ [22] = https://curl.haxx.se/bug/?i=5634
+ [23] = https://curl.haxx.se/bug/?i=5707
+ [24] = https://curl.haxx.se/bug/?i=5760
+ [25] = https://curl.haxx.se/bug/?i=5637
+ [26] = https://curl.haxx.se/bug/?i=5848
+ [27] = https://curl.haxx.se/bug/?i=5685
+ [28] = https://curl.haxx.se/bug/?i=5858
+ [29] = https://curl.haxx.se/bug/?i=5892
+ [30] = https://curl.haxx.se/bug/?i=5879
+ [31] = https://curl.haxx.se/bug/?i=5867
+ [32] = https://curl.haxx.se/bug/?i=5583
+ [33] = https://curl.haxx.se/bug/?i=5865
+ [34] = https://curl.haxx.se/bug/?i=5876
+ [35] = https://curl.haxx.se/bug/?i=5846
+ [36] = https://curl.haxx.se/bug/?i=5846
+ [37] = https://curl.haxx.se/bug/?i=5853
+ [38] = https://curl.haxx.se/bug/?i=5866
+ [39] = https://curl.haxx.se/bug/?i=5884
+ [40] = https://curl.haxx.se/bug/?i=5365
+ [41] = https://curl.haxx.se/bug/?i=5871
+ [42] = https://curl.haxx.se/bug/?i=5912
+ [43] = https://curl.haxx.se/bug/?i=5889
+ [44] = https://curl.haxx.se/bug/?i=5882
+ [45] = https://curl.haxx.se/bug/?i=5439
+ [46] = https://curl.haxx.se/bug/?i=1262
+ [47] = https://curl.haxx.se/bug/?i=5909
+ [48] = https://curl.haxx.se/bug/?i=5843
+ [49] = https://curl.haxx.se/bug/?i=5880
+ [50] = https://bugzilla.redhat.com/1873327
+ [51] = https://curl.haxx.se/bug/?i=5908
+ [52] = https://curl.haxx.se/bug/?i=5907
+ [53] = https://curl.haxx.se/bug/?i=5906
+ [54] = https://curl.haxx.se/bug/?i=5914
+ [55] = https://curl.haxx.se/bug/?i=5932
+ [56] = https://curl.haxx.se/bug/?i=5930
+ [57] = https://curl.haxx.se/bug/?i=5934
+ [58] = https://curl.haxx.se/bug/?i=5931
+ [59] = https://curl.haxx.se/bug/?i=5946
+ [60] = https://curl.haxx.se/bug/?i=5923
+ [61] = https://curl.haxx.se/bug/?i=5854
+ [62] = https://curl.haxx.se/bug/?i=5854
+ [63] = https://curl.haxx.se/bug/?i=5883
+ [64] = https://curl.haxx.se/bug/?i=5903
+ [65] = https://curl.haxx.se/bug/?i=5899
+ [66] = https://curl.haxx.se/bug/?i=5898
+ [67] = https://curl.haxx.se/bug/?i=5897
+ [68] = https://curl.haxx.se/bug/?i=5922
+ [69] = https://curl.haxx.se/bug/?i=5921
+ [70] = https://curl.haxx.se/bug/?i=5917
+ [71] = https://curl.haxx.se/bug/?i=5905
+ [72] = https://curl.haxx.se/bug/?i=5946
+ [73] = https://curl.haxx.se/bug/?i=5946
+ [74] = https://curl.haxx.se/bug/?i=5916
+ [75] = https://github.com/curl/curl/commit/6ebe63fac23f38df911edc348e8ccc72280f9434#commitcomment-42042843
+ [76] = https://curl.haxx.se/bug/?i=5972
+ [77] = https://curl.haxx.se/bug/?i=5680
+ [78] = https://curl.haxx.se/bug/?i=5959
+ [79] = https://curl.haxx.se/bug/?i=5955
+ [80] = https://curl.haxx.se/bug/?i=5648
+ [81] = https://curl.haxx.se/bug/?i=5937
+ [82] = https://curl.haxx.se/bug/?i=5974
+ [83] = https://curl.haxx.se/bug/?i=5942
+ [84] = https://github.com/curl/curl/commit/879007f8118771f4896334731aaca5850a154675#commitcomment-42087553
+ [85] = https://curl.haxx.se/bug/?i=5971
+ [86] = https://curl.haxx.se/bug/?i=5969
+ [87] = https://curl.haxx.se/bug/?i=6016
+ [88] = https://curl.haxx.se/bug/?i=5936
+ [89] = https://curl.haxx.se/bug/?i=5968
+ [90] = https://curl.haxx.se/bug/?i=5992
+ [91] = https://curl.haxx.se/bug/?i=5993
+ [92] = https://curl.haxx.se/mail/lib-2020-09/0081.html
+ [93] = https://curl.haxx.se/bug/?i=5954
+ [94] = https://curl.haxx.se/bug/?i=6014
+ [95] = https://curl.haxx.se/bug/?i=5985
+ [96] = https://curl.haxx.se/bug/?i=5984
+ [97] = https://curl.haxx.se/bug/?i=5947
+ [98] = https://curl.haxx.se/bug/?i=5629
+ [99] = https://curl.haxx.se/bug/?i=5953
+ [100] = https://curl.haxx.se/bug/?i=5952
+ [101] = https://curl.haxx.se/bug/?i=5952
+ [102] = https://curl.haxx.se/bug/?i=5952
+ [103] = https://curl.haxx.se/bug/?i=5952
+ [104] = https://curl.haxx.se/bug/?i=5961
+ [105] = https://curl.haxx.se/bug/?i=5980
+ [106] = https://curl.haxx.se/bug/?i=5981
+ [107] = https://curl.haxx.se/bug/?i=5979
+ [108] = https://curl.haxx.se/bug/?i=6012
+ [109] = https://curl.haxx.se/bug/?i=6005
+ [110] = https://curl.haxx.se/bug/?i=6010
+ [111] = https://curl.haxx.se/bug/?i=6011
+ [112] = https://curl.haxx.se/bug/?i=5523
+ [113] = https://curl.haxx.se/bug/?i=6004
+ [114] = https://curl.haxx.se/bug/?i=6033
+ [115] = https://curl.haxx.se/bug/?i=6028
+ [116] = https://curl.haxx.se/bug/?i=6040
+ [117] = https://curl.haxx.se/bug/?i=6052
+ [118] = https://curl.haxx.se/bug/?i=5989
+ [119] = https://curl.haxx.se/bug/?i=6039
+ [120] = https://github.com/curl/curl/pull/5735#issuecomment-701376388
+ [121] = https://curl.haxx.se/bug/?i=6023
+ [122] = https://curl.haxx.se/bug/?i=6024
+ [123] = https://curl.haxx.se/bug/?i=6025
+ [124] = https://curl.haxx.se/bug/?i=6035
+ [125] = https://curl.haxx.se/bug/?i=4295
+ [126] = https://curl.haxx.se/bug/?i=5973
+ [127] = https://curl.haxx.se/bug/?i=6037
+ [128] = https://curl.haxx.se/bug/?i=6003
+ [129] = https://curl.haxx.se/bug/?i=6034
+ [130] = https://curl.haxx.se/bug/?i=6031
+ [131] = https://curl.haxx.se/bug/?i=6070
+ [132] = https://curl.haxx.se/bug/?i=6048
+ [133] = https://curl.haxx.se/bug/?i=6045
+ [134] = https://curl.haxx.se/bug/?i=6042
diff --git a/acinclude.m4 b/acinclude.m4
index 24dad3914..e7a36e4bd 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -661,7 +661,7 @@ dnl -------------------------------------------------
dnl Check for libraries needed for WINLDAP support,
dnl and prepended to LIBS any needed libraries.
dnl This macro can take an optional parameter with a
-dnl white space separated list of libraries to check
+dnl whitespace separated list of libraries to check
dnl before the WINLDAP default ones.
AC_DEFUN([CURL_CHECK_LIBS_WINLDAP], [
@@ -755,7 +755,7 @@ dnl -------------------------------------------------
dnl Check for libraries needed for LDAP support,
dnl and prepended to LIBS any needed libraries.
dnl This macro can take an optional parameter with a
-dnl white space separated list of libraries to check
+dnl whitespace separated list of libraries to check
dnl before the default ones.
AC_DEFUN([CURL_CHECK_LIBS_LDAP], [
@@ -1887,6 +1887,8 @@ struct Library *SocketBase = NULL;
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -1950,6 +1952,8 @@ struct Library *SocketBase = NULL;
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -2174,8 +2178,8 @@ AC_HELP_STRING([--without-ca-bundle], [Don't use a default CA bundle]),
AC_ARG_WITH(ca-path,
AC_HELP_STRING([--with-ca-path=DIRECTORY],
[Path to a directory containing CA certificates stored individually, with \
-their filenames in a hash format. This option can be used with OpenSSL, \
-GnuTLS and PolarSSL backends. Refer to OpenSSL c_rehash for details. \
+their filenames in a hash format. This option can be used with the OpenSSL, \
+GnuTLS and mbedTLS backends. Refer to OpenSSL c_rehash for details. \
(example: /etc/certificates)])
AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
[
@@ -2201,8 +2205,8 @@ AC_HELP_STRING([--without-ca-path], [Don't use a default CA path]),
capath="no"
elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
dnl --with-ca-path given
- if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then
- AC_MSG_ERROR([--with-ca-path only works with OpenSSL, GnuTLS or PolarSSL])
+ if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$MBEDTLS_ENABLED" != "x1"; then
+ AC_MSG_ERROR([--with-ca-path only works with OpenSSL, GnuTLS or mbedTLS])
fi
capath="$want_capath"
ca="no"
diff --git a/aclocal.m4 b/aclocal.m4
index edb17e401..c287d3150 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.16'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.16.1], [],
+m4_if([$1], [1.16.2], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.1])dnl
+[AM_AUTOMAKE_VERSION([1.16.2])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -371,7 +371,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
done
if test $am_rc -ne 0; then
AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
- for automatic dependency tracking. Try re-running configure with the
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
'--disable-dependency-tracking' option to at least be able to build
the package (albeit without support for automatic dependency tracking).])
fi
@@ -398,7 +400,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -595,7 +597,7 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -616,7 +618,7 @@ if test x"${install_sh+set}" != xset; then
fi
AC_SUBST([install_sh])])
-# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+# Copyright (C) 2003-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -638,7 +640,7 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -673,7 +675,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -716,7 +718,7 @@ AC_SUBST([am__quote])])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -755,7 +757,7 @@ fi
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -784,7 +786,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -831,7 +833,7 @@ AC_LANG_POP([C])])
# For backward compatibility.
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -850,7 +852,7 @@ AC_DEFUN([AM_RUN_LOG],
# Check to make sure that the build environment is sane. -*- Autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -931,7 +933,7 @@ AC_CONFIG_COMMANDS_PRE(
rm -f conftest.file
])
-# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+# Copyright (C) 2009-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -991,7 +993,7 @@ AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
])
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1019,7 +1021,7 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -1038,7 +1040,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
diff --git a/androidconfigure b/androidconfigure
index 387e5881d..16bea199d 100755
--- a/androidconfigure
+++ b/androidconfigure
@@ -13,8 +13,8 @@ cd $(dirname "$0")
HOST="arm-linux-androideabi"
T="${ANDROID_BUILD_TOP}"
-export CC="${T}/prebuilts/clang/host/linux-x86/clang-r365631c/bin/clang"
-export LD="${T}/prebuilts/clang/host/linux-x86/clang-r365631c/bin/lld"
+export CC="${T}/prebuilts/clang/host/linux-x86/clang-r399163/bin/clang"
+export LD="${T}/prebuilts/clang/host/linux-x86/clang-r399163/bin/lld"
CFLAGS=(
"-isystem ${T}/external/libcxx/include"
diff --git a/buildconf b/buildconf
index 509575312..4e4c17e99 100755
--- a/buildconf
+++ b/buildconf
@@ -1,448 +1,4 @@
#!/bin/sh
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-###########################################################################
-#--------------------------------------------------------------------------
-# die prints argument string to stdout and exits this shell script.
-#
-die(){
- echo "buildconf: $@"
- exit 1
-}
-
-#--------------------------------------------------------------------------
-# findtool works as 'which' but we use a different name to make it more
-# obvious we aren't using 'which'! ;-)
-# Unlike 'which' does, the current directory is ignored.
-#
-findtool(){
- file="$1"
-
- if { echo "$file" | grep "/" >/dev/null 2>&1; } then
- # when file is given with a path check it first
- if test -f "$file"; then
- echo "$file"
- return
- fi
- fi
-
- old_IFS=$IFS; IFS=':'
- for path in $PATH
- do
- IFS=$old_IFS
- # echo "checks for $file in $path" >&2
- if test "$path" -a "$path" != '.' -a -f "$path/$file"; then
- echo "$path/$file"
- return
- fi
- done
- IFS=$old_IFS
-}
-
-#--------------------------------------------------------------------------
-# removethis() removes all files and subdirectories with the given name,
-# inside and below the current subdirectory at invocation time.
-#
-removethis(){
- if test "$#" = "1"; then
- find . -depth -name $1 -print > buildconf.tmp.$$
- while read fdname
- do
- if test -f "$fdname"; then
- rm -f "$fdname"
- elif test -d "$fdname"; then
- rm -f -r "$fdname"
- fi
- done < buildconf.tmp.$$
- rm -f buildconf.tmp.$$
- fi
-}
-
-#--------------------------------------------------------------------------
-# Ensure that buildconf runs from the subdirectory where configure.ac lives
-#
-if test ! -f configure.ac ||
- test ! -f src/tool_main.c ||
- test ! -f lib/urldata.h ||
- test ! -f include/curl/curl.h ||
- test ! -f m4/curl-functions.m4; then
- echo "Can not run buildconf from outside of curl's source subdirectory!"
- echo "Change to the subdirectory where buildconf is found, and try again."
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# autoconf 2.57 or newer. Unpatched version 2.67 does not generate proper
-# configure script. Unpatched version 2.68 is simply unusable, we should
-# disallow 2.68 usage.
-#
-need_autoconf="2.57"
-ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
-if test -z "$ac_version"; then
- echo "buildconf: autoconf not found."
- echo " You need autoconf version $need_autoconf or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $ac_version; IFS=$old_IFS
-if test "$1" = "2" -a "$2" -lt "57" || test "$1" -lt "2"; then
- echo "buildconf: autoconf version $ac_version found."
- echo " You need autoconf version $need_autoconf or newer installed."
- echo " If you have a sufficient autoconf installed, but it"
- echo " is not named 'autoconf', then try setting the"
- echo " AUTOCONF environment variable."
- exit 1
-fi
-
-if test "$1" = "2" -a "$2" -eq "67"; then
- echo "buildconf: autoconf version $ac_version (BAD)"
- echo " Unpatched version generates broken configure script."
-elif test "$1" = "2" -a "$2" -eq "68"; then
- echo "buildconf: autoconf version $ac_version (BAD)"
- echo " Unpatched version generates unusable configure script."
-else
- echo "buildconf: autoconf version $ac_version (ok)"
-fi
-
-am4te_version=`${AUTOM4TE:-autom4te} --version 2>/dev/null|head -n 1| sed -e 's/autom4te\(.*\)/\1/' -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
-if test -z "$am4te_version"; then
- echo "buildconf: autom4te not found. Weird autoconf installation!"
- exit 1
-fi
-if test "$am4te_version" = "$ac_version"; then
- echo "buildconf: autom4te version $am4te_version (ok)"
-else
- echo "buildconf: autom4te version $am4te_version (ERROR: does not match autoconf version)"
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# autoheader 2.50 or newer
-#
-ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
-if test -z "$ah_version"; then
- echo "buildconf: autoheader not found."
- echo " You need autoheader version 2.50 or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $ah_version; IFS=$old_IFS
-if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then
- echo "buildconf: autoheader version $ah_version found."
- echo " You need autoheader version 2.50 or newer installed."
- echo " If you have a sufficient autoheader installed, but it"
- echo " is not named 'autoheader', then try setting the"
- echo " AUTOHEADER environment variable."
- exit 1
-fi
-
-echo "buildconf: autoheader version $ah_version (ok)"
-
-#--------------------------------------------------------------------------
-# automake 1.7 or newer
-#
-need_automake="1.7"
-am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
-if test -z "$am_version"; then
- echo "buildconf: automake not found."
- echo " You need automake version $need_automake or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $am_version; IFS=$old_IFS
-if test "$1" = "1" -a "$2" -lt "7" || test "$1" -lt "1"; then
- echo "buildconf: automake version $am_version found."
- echo " You need automake version $need_automake or newer installed."
- echo " If you have a sufficient automake installed, but it"
- echo " is not named 'automake', then try setting the"
- echo " AUTOMAKE environment variable."
- exit 1
-fi
-
-echo "buildconf: automake version $am_version (ok)"
-
-acloc_version=`${ACLOCAL:-aclocal} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
-if test -z "$acloc_version"; then
- echo "buildconf: aclocal not found. Weird automake installation!"
- exit 1
-fi
-if test "$acloc_version" = "$am_version"; then
- echo "buildconf: aclocal version $acloc_version (ok)"
-else
- echo "buildconf: aclocal version $acloc_version (ERROR: does not match automake version)"
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# GNU libtoolize preliminary check
-#
-want_lt_major=1
-want_lt_minor=4
-want_lt_patch=2
-want_lt_version=1.4.2
-
-# This approach that tries 'glibtoolize' first is intended for systems that
-# have GNU libtool named as 'glibtoolize' and libtoolize not being GNU's.
-
-libtoolize=`findtool glibtoolize 2>/dev/null`
-if test ! -x "$libtoolize"; then
- libtoolize=`findtool ${LIBTOOLIZE:-libtoolize}`
-fi
-if test -z "$libtoolize"; then
- echo "buildconf: libtoolize not found."
- echo " You need GNU libtoolize $want_lt_version or newer installed."
- exit 1
-fi
-
-lt_pver=`$libtoolize --version 2>/dev/null|head -n 1`
-lt_qver=`echo $lt_pver|sed -e "s/([^)]*)//g" -e "s/^[^0-9]*//g"`
-lt_version=`echo $lt_qver|sed -e "s/[- ].*//" -e "s/\([a-z]*\)$//"`
-if test -z "$lt_version"; then
- echo "buildconf: libtoolize not found."
- echo " You need GNU libtoolize $want_lt_version or newer installed."
- exit 1
-fi
-old_IFS=$IFS; IFS='.'; set $lt_version; IFS=$old_IFS
-lt_major=$1
-lt_minor=$2
-lt_patch=$3
-
-if test -z "$lt_major"; then
- lt_status="bad"
-elif test "$lt_major" -gt "$want_lt_major"; then
- lt_status="good"
-elif test "$lt_major" -lt "$want_lt_major"; then
- lt_status="bad"
-elif test -z "$lt_minor"; then
- lt_status="bad"
-elif test "$lt_minor" -gt "$want_lt_minor"; then
- lt_status="good"
-elif test "$lt_minor" -lt "$want_lt_minor"; then
- lt_status="bad"
-elif test -z "$lt_patch"; then
- lt_status="bad"
-elif test "$lt_patch" -gt "$want_lt_patch"; then
- lt_status="good"
-elif test "$lt_patch" -lt "$want_lt_patch"; then
- lt_status="bad"
-else
- lt_status="good"
-fi
-if test "$lt_status" != "good"; then
- echo "buildconf: libtoolize version $lt_version found."
- echo " You need GNU libtoolize $want_lt_version or newer installed."
- exit 1
-fi
-
-echo "buildconf: libtoolize version $lt_version (ok)"
-
-#--------------------------------------------------------------------------
-# m4 check
-#
-m4=`(${M4:-m4} --version 0<&- || ${M4:-gm4} --version) 2>/dev/null 0<&- | head -n 1`;
-m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
-
-if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
- echo "buildconf: GNU m4 version $m4_version (ok)"
-else
- if test -z "$m4"; then
- echo "buildconf: m4 version not recognized. You need a GNU m4 installed!"
- else
- echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!"
- fi
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# perl check
-#
-PERL=`findtool ${PERL:-perl}`
-if test -z "$PERL"; then
- echo "buildconf: perl not found"
- exit 1
-fi
-
-#--------------------------------------------------------------------------
-# Remove files generated on previous buildconf/configure run.
-#
-for fname in .deps \
- .libs \
- *.la \
- *.lo \
- *.a \
- *.o \
- Makefile \
- Makefile.in \
- aclocal.m4 \
- aclocal.m4.bak \
- ares_build.h \
- ares_config.h \
- ares_config.h.in \
- autom4te.cache \
- compile \
- config.guess \
- curl_config.h \
- curl_config.h.in \
- config.log \
- config.lt \
- config.status \
- config.sub \
- configure \
- configurehelp.pm \
- curl-config \
- depcomp \
- libcares.pc \
- libcurl.pc \
- libtool \
- libtool.m4 \
- libtool.m4.tmp \
- ltmain.sh \
- ltoptions.m4 \
- ltsugar.m4 \
- ltversion.m4 \
- lt~obsolete.m4 \
- missing \
- install-sh \
- stamp-h1 \
- stamp-h2 \
- stamp-h3 ; do
- removethis "$fname"
-done
-
-#--------------------------------------------------------------------------
-# run the correct scripts now
-#
-
-echo "buildconf: running libtoolize"
-${libtoolize} --copy --force || die "libtoolize command failed"
-
-# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4
-# subdirectory and this local copy is patched to fix some warnings that
-# are triggered when running aclocal and using autoconf 2.62 or later.
-
-if test "$lt_major" = "1" && test "$lt_minor" = "5"; then
- if test -z "$lt_patch" || test "$lt_patch" -lt "26"; then
- echo "buildconf: copying libtool.m4 to local m4 subdir"
- ac_dir=`${ACLOCAL:-aclocal} --print-ac-dir`
- if test -f $ac_dir/libtool.m4; then
- cp -f $ac_dir/libtool.m4 m4/libtool.m4
- else
- echo "buildconf: $ac_dir/libtool.m4 not found"
- fi
- if test -f m4/libtool.m4; then
- echo "buildconf: renaming some variables in local m4/libtool.m4"
- $PERL -i.tmp -pe \
- 's/lt_prog_compiler_pic_works/lt_cv_prog_compiler_pic_works/g; \
- s/lt_prog_compiler_static_works/lt_cv_prog_compiler_static_works/g;' \
- m4/libtool.m4
- rm -f m4/libtool.m4.tmp
- fi
- fi
-fi
-
-if test -f m4/libtool.m4; then
- echo "buildconf: converting all mv to mv -f in local m4/libtool.m4"
- $PERL -i.tmp -pe 's/\bmv +([^-\s])/mv -f $1/g' m4/libtool.m4
- rm -f m4/libtool.m4.tmp
-fi
-
-echo "buildconf: running aclocal"
-${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS || die "aclocal command failed"
-
-echo "buildconf: converting all mv to mv -f in local aclocal.m4"
-$PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
-
-echo "buildconf: running autoheader"
-${AUTOHEADER:-autoheader} || die "autoheader command failed"
-
-echo "buildconf: running autoconf"
-${AUTOCONF:-autoconf} || die "autoconf command failed"
-
-if test -d ares; then
- cd ares
- echo "buildconf: running in ares"
- ./buildconf
- cd ..
-fi
-
-echo "buildconf: running automake"
-${AUTOMAKE:-automake} --add-missing --copy || die "automake command failed"
-
-#--------------------------------------------------------------------------
-# GNU libtool complementary check
-#
-# Depending on the libtool and automake versions being used, config.guess
-# might not be installed in the subdirectory until automake has finished.
-# So we can not attempt to use it until this very last buildconf stage.
-#
-if test ! -f ./config.guess; then
- echo "buildconf: config.guess not found"
-else
- buildhost=`./config.guess 2>/dev/null|head -n 1`
- case $buildhost in
- *-*-darwin*)
- need_lt_major=1
- need_lt_minor=5
- need_lt_patch=26
- need_lt_check="yes"
- ;;
- *-*-hpux*)
- need_lt_major=1
- need_lt_minor=5
- need_lt_patch=24
- need_lt_check="yes"
- ;;
- esac
- if test ! -z "$need_lt_check"; then
- if test -z "$lt_major"; then
- lt_status="bad"
- elif test "$lt_major" -gt "$need_lt_major"; then
- lt_status="good"
- elif test "$lt_major" -lt "$need_lt_major"; then
- lt_status="bad"
- elif test -z "$lt_minor"; then
- lt_status="bad"
- elif test "$lt_minor" -gt "$need_lt_minor"; then
- lt_status="good"
- elif test "$lt_minor" -lt "$need_lt_minor"; then
- lt_status="bad"
- elif test -z "$lt_patch"; then
- lt_status="bad"
- elif test "$lt_patch" -gt "$need_lt_patch"; then
- lt_status="good"
- elif test "$lt_patch" -lt "$need_lt_patch"; then
- lt_status="bad"
- else
- lt_status="good"
- fi
- if test "$lt_status" != "good"; then
- need_lt_version="$need_lt_major.$need_lt_minor.$need_lt_patch"
- echo "buildconf: libtool version $lt_version found."
- echo " $buildhost requires GNU libtool $need_lt_version or newer installed."
- rm -f configure
- exit 1
- fi
- fi
-fi
-
-#--------------------------------------------------------------------------
-# Finished successfully.
-#
-echo "buildconf: OK"
-exit 0
+echo "*** Do not use buildconf. Instead, just use: autoreconf -fi" >&2
+exec ${AUTORECONF:-autoreconf} -fi "${@}"
diff --git a/compile b/compile
index 99e50524b..23fcba011 100755
--- a/compile
+++ b/compile
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# This program is free software; you can redistribute it and/or modify
@@ -53,7 +53,7 @@ func_file_conv ()
MINGW*)
file_conv=mingw
;;
- CYGWIN*)
+ CYGWIN* | MSYS*)
file_conv=cygwin
;;
*)
@@ -67,7 +67,7 @@ func_file_conv ()
mingw/*)
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
;;
- cygwin/*)
+ cygwin/* | msys/*)
file=`cygpath -m "$file" || echo "$file"`
;;
wine/*)
diff --git a/configure b/configure
index 45c2bd730..2b0a61456 100755
--- a/configure
+++ b/configure
@@ -11,7 +11,7 @@
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
#
-# Copyright (c) 1998 - 2019 Daniel Stenberg, <daniel@haxx.se>
+# Copyright (c) 1998 - 2020 Daniel Stenberg, <daniel@haxx.se>
# This configure script may be copied, distributed and modified under the
# terms of the curl license; see COPYING for more details
@@ -879,6 +879,7 @@ LIBOBJS
SSL_BACKENDS
SUPPORT_PROTOCOLS
SUPPORT_FEATURES
+LIBCURL_NO_SHARED
ENABLE_STATIC
ENABLE_SHARED
CROSSCOMPILING_FALSE
@@ -902,11 +903,11 @@ USE_MANUAL_TRUE
MANOPT
NROFF
PERL
-IPV6_ENABLED
FISH_FUNCTIONS_DIR
ZSH_FUNCTIONS_DIR
USE_QUICHE
USE_NGHTTP3
+USE_NGTCP2_CRYPTO_GNUTLS
USE_NGTCP2_CRYPTO_OPENSSL
USE_NGTCP2
USE_NGHTTP2
@@ -915,6 +916,7 @@ CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_FALSE
CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE
CURL_LT_SHLIB_VERSIONED_FLAVOUR
USE_LIBRTMP
+USE_WOLFSSH
USE_LIBSSH
USE_LIBSSH2
LIBMETALINK_CPPFLAGS
@@ -927,6 +929,7 @@ CURL_WITH_MULTI_SSL
SSL_ENABLED
NSS_LIBS
USE_NSS
+USE_BEARSSL
USE_MESALINK
USE_WOLFSSL
USE_MBEDTLS
@@ -942,7 +945,9 @@ USE_SCHANNEL
DEFAULT_SSL_BACKEND
BUILD_STUB_GSS_FALSE
BUILD_STUB_GSS_TRUE
+IPV6_ENABLED
USE_OPENLDAP
+HAVE_ZSTD
HAVE_BROTLI
ZLIB_LIBS
HAVE_LIBZ_FALSE
@@ -950,6 +955,7 @@ HAVE_LIBZ_TRUE
HAVE_LIBZ
PKGCONFIG
HAVE_PROTO_BSDSOCKET_H
+CURL_DISABLE_MQTT
CURL_DISABLE_GOPHER
CURL_DISABLE_SMTP
CURL_DISABLE_SMB
@@ -972,6 +978,7 @@ BUILD_UNITTESTS_FALSE
BUILD_UNITTESTS_TRUE
CURLDEBUG_FALSE
CURLDEBUG_TRUE
+CURL_CFLAG_EXTRAS
USE_EXPLICIT_LIB_DEPS_FALSE
USE_EXPLICIT_LIB_DEPS_TRUE
REQUIRE_LIB_DEPS
@@ -1064,7 +1071,6 @@ AR
EGREP
GREP
SED
-CURL_CFLAG_EXTRAS
CONFIGURE_OPTIONS
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
@@ -1127,7 +1133,7 @@ enable_symbol_hiding
enable_hidden_symbols
enable_ares
enable_rt
-enable_esni
+enable_ech
enable_code_coverage
enable_dependency_tracking
enable_largefile
@@ -1154,11 +1160,13 @@ enable_imap
enable_smb
enable_smtp
enable_gopher
+enable_mqtt
enable_manual
enable_libcurl_option
enable_libgcc
with_zlib
with_brotli
+with_zstd
with_ldap_lib
with_lber_lib
enable_ipv6
@@ -1179,6 +1187,7 @@ with_gnutls
with_mbedtls
with_wolfssl
with_mesalink
+with_bearssl
with_nss
with_ca_bundle
with_ca_path
@@ -1187,6 +1196,7 @@ with_libpsl
with_libmetalink
with_libssh2
with_libssh
+with_wolfssh
with_librtmp
enable_versioned_symbols
with_winidn
@@ -1206,6 +1216,7 @@ enable_ntlm_wb
enable_tls_srp
enable_unix_sockets
enable_cookies
+enable_socketpair
enable_http_auth
enable_doh
enable_mime
@@ -1213,6 +1224,7 @@ enable_dateparse
enable_netrc
enable_progress_meter
enable_dnsshuffle
+enable_get_easy_option
enable_alt_svc
'
ac_precious_vars='build_alias
@@ -1877,8 +1889,8 @@ Optional Features:
--enable-ares[=PATH] Enable c-ares for DNS lookups
--disable-ares Disable c-ares for DNS lookups
--disable-rt disable dependency on -lrt
- --enable-esni Enable ESNI support
- --disable-esni Disable ESNI support
+ --enable-ech Enable ECH support
+ --disable-ech Disable ECH support
--enable-code-coverage Provide code coverage
--enable-dependency-tracking
do not reject slow dependency extractors
@@ -1920,6 +1932,8 @@ Optional Features:
--disable-smtp Disable SMTP support
--enable-gopher Enable Gopher support
--disable-gopher Disable Gopher support
+ --enable-mqtt Enable MQTT support
+ --disable-mqtt Disable MQTT support
--enable-manual Enable built-in manual
--disable-manual Disable built-in manual
--enable-libcurl-option Enable --libcurl C code generation support
@@ -1959,6 +1973,8 @@ Optional Features:
--disable-unix-sockets Disable Unix domain sockets
--enable-cookies Enable cookies support
--disable-cookies Disable cookies support
+ --enable-socketpair Enable socketpair support
+ --disable-socketpair Disable socketpair support
--enable-http-auth Enable HTTP authentication support
--disable-http-auth Disable HTTP authentication support
--enable-doh Enable DoH support
@@ -1973,7 +1989,11 @@ Optional Features:
--disable-progress-meter
Disable progress-meter
--enable-dnsshuffle Enable DNS shuffling
- --disable-dnsshuffle Disable DNS shufflinf
+ --disable-dnsshuffle Disable DNS shuffling
+ --enable-get-easy-options
+ Enable curl_easy_options
+ --disable-get-easy-options
+ Disable curl_easy_options
--enable-alt-svc Enable alt-svc support
--disable-alt-svc Disable alt-svc support
@@ -1994,6 +2014,11 @@ Optional Packages:
installation; when possible, set the PKG_CONFIG_PATH
environment variable instead of using this option
--without-brotli disable BROTLI
+ --with-zstd=PATH Where to look for libzstd, PATH points to the
+ libzstd installation; when possible, set the
+ PKG_CONFIG_PATH environment variable instead of
+ using this option
+ --without-zstd disable libzstd
--with-ldap-lib=libname Specify name of ldap lib file
--with-lber-lib=libname Specify name of lber lib file
--with-gssapi-includes=DIR
@@ -2034,6 +2059,9 @@ Optional Packages:
--with-mesalink=PATH where to look for MesaLink, PATH points to the
installation root
--without-mesalink disable MesaLink detection
+ --with-bearssl=PATH where to look for BearSSL, PATH points to the
+ installation root
+ --without-bearssl disable BearSSL detection
--with-nss=PATH where to look for NSS, PATH points to the
installation root
--without-nss disable NSS detection
@@ -2043,9 +2071,9 @@ Optional Packages:
--with-ca-path=DIRECTORY
Path to a directory containing CA certificates
stored individually, with their filenames in a hash
- format. This option can be used with OpenSSL, GnuTLS
- and PolarSSL backends. Refer to OpenSSL c_rehash for
- details. (example: /etc/certificates)
+ format. This option can be used with the OpenSSL,
+ GnuTLS and mbedTLS backends. Refer to OpenSSL
+ c_rehash for details. (example: /etc/certificates)
--without-ca-path Don't use a default CA path
--with-ca-fallback Use the built in CA store of the SSL library
--without-ca-fallback Don't use the built in CA store of the SSL library
@@ -2054,14 +2082,19 @@ Optional Packages:
installation root
--without-libmetalink disable libmetalink detection
--with-libssh2=PATH Where to look for libssh2, PATH points to the
- LIBSSH2 installation; when possible, set the
+ libssh2 installation; when possible, set the
PKG_CONFIG_PATH environment variable instead of
using this option
- --with-libssh2 enable LIBSSH2
- --with-libssh=PATH Where to look for libssh, PATH points to the LIBSSH
+ --with-libssh2 enable libssh2
+ --with-libssh=PATH Where to look for libssh, PATH points to the libssh
installation; when possible, set the PKG_CONFIG_PATH
environment variable instead of using this option
- --with-libssh enable LIBSSH
+ --with-libssh enable libssh
+ --with-wolfssh=PATH Where to look for wolfssh, PATH points to the
+ wolfSSH installation; when possible, set the
+ PKG_CONFIG_PATH environment variable instead of
+ using this option
+ --with-wolfssh enable wolfssh
--with-librtmp=PATH Where to look for librtmp, PATH points to the
LIBRTMP installation; when possible, set the
PKG_CONFIG_PATH environment variable instead of
@@ -2173,7 +2206,7 @@ Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
-Copyright (c) 1998 - 2019 Daniel Stenberg, <daniel@haxx.se>
+Copyright (c) 1998 - 2020 Daniel Stenberg, <daniel@haxx.se>
This configure script may be copied, distributed and modified under the
terms of the curl license; see COPYING for more details
_ACEOF
@@ -3330,31 +3363,31 @@ $as_echo "no" >&6; }
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ESNI support" >&5
-$as_echo_n "checking whether to enable ESNI support... " >&6; }
- OPT_ESNI="default"
- # Check whether --enable-esni was given.
-if test "${enable_esni+set}" = set; then :
- enableval=$enable_esni; OPT_ESNI=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ECH support" >&5
+$as_echo_n "checking whether to enable ECH support... " >&6; }
+ OPT_ECH="default"
+ # Check whether --enable-ech was given.
+if test "${enable_ech+set}" = set; then :
+ enableval=$enable_ech; OPT_ECH=$enableval
fi
- case "$OPT_ESNI" in
+ case "$OPT_ECH" in
no)
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
;;
default)
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
;;
*)
- want_esni="yes"
- curl_esni_msg="enabled (--disable-esni)"
- experimental="esni"
+ want_ech="yes"
+ curl_ech_msg="enabled (--disable-ech)"
+ experimental="ech"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
;;
@@ -3398,17 +3431,6 @@ fi
CONFIGURE_OPTIONS="\"$ac_configure_args\""
-CURL_CFLAG_EXTRAS=""
-if test X"$want_werror" = Xyes; then
- CURL_CFLAG_EXTRAS="-Werror"
- if test "$compiler_id" = "GNU_C"; then
- if test "$compiler_num" -ge "500"; then
- CURL_CFLAG_EXTRAS="$CURL_CFLAG_EXTRAS -pedantic-errors"
- fi
- fi
-fi
-
-
if test -z "$SED"; then
# Extract the first word of "sed", so it can be a program name with args.
set dummy sed; ac_word=$2
@@ -5857,10 +5879,11 @@ PKGADD_VENDOR="curl.haxx.se"
- curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl} )"
- curl_ssh_msg="no (--with-libssh2)"
+ curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl,bearssl} )"
+ curl_ssh_msg="no (--with-{libssh,libssh2})"
curl_zlib_msg="no (--with-zlib)"
curl_brotli_msg="no (--with-brotli)"
+ curl_zstd_msg="no (--with-zstd)"
curl_gss_msg="no (--with-gssapi)"
curl_tls_srp_msg="no (--enable-tls-srp)"
curl_res_msg="default (--enable-ares / --enable-threaded-resolver)"
@@ -8764,7 +8787,7 @@ esac
fi
: ${AR=ar}
-: ${AR_FLAGS=cru}
+: ${AR_FLAGS=cr}
@@ -9325,7 +9348,7 @@ static const void *lt_preloaded_setup() {
#endif
_LT_EOF
# Now try linking the two files.
- mv -f conftest.$ac_objext conftstm.$ac_objext
+ mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
LIBS=conftstm.$ac_objext
@@ -10482,8 +10505,8 @@ int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
- echo "$AR cru libconftest.a conftest.o" >&5
- $AR cru libconftest.a conftest.o 2>&5
+ echo "$AR cr libconftest.a conftest.o" >&5
+ $AR cr libconftest.a conftest.o 2>&5
echo "$RANLIB libconftest.a" >&5
$RANLIB libconftest.a 2>&5
cat > conftest.c << _LT_EOF
@@ -11878,6 +11901,12 @@ lt_prog_compiler_static=
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-static'
;;
+ # flang / f18. f95 an alias for gfortran or flang on Debian
+ flang* | f18* | f95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
# icc used to be incompatible with GCC.
# ICC 10 doesn't accept -KPIC any more.
icc* | ifort*)
@@ -13128,9 +13157,9 @@ fi
hpux9*)
if test yes = "$GCC"; then
- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
@@ -16985,45 +17014,6 @@ squeeze() {
#
if test "$compiler_id" != "unknown"; then
#
- if test "$compiler_id" = "GNU_C" ||
- test "$compiler_id" = "CLANG"; then
-
- if test "$compiler_id" = "GNU_C" ||
- test "$compiler_id" = "CLANG"; then
- tmp_has_include="no"
- tmp_chg_FLAGS="$CFLAGS"
- for word1 in $tmp_chg_FLAGS; do
- case "$word1" in
- -I*)
- tmp_has_include="yes"
- ;;
- esac
- done
- if test "$tmp_has_include" = "yes"; then
- tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/^-I/ -isystem /g'`
- tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/ -I/ -isystem /g'`
- CFLAGS="$tmp_chg_FLAGS"
- squeeze CFLAGS
- fi
- tmp_has_include="no"
- tmp_chg_FLAGS="$CPPFLAGS"
- for word1 in $tmp_chg_FLAGS; do
- case "$word1" in
- -I*)
- tmp_has_include="yes"
- ;;
- esac
- done
- if test "$tmp_has_include" = "yes"; then
- tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/^-I/ -isystem /g'`
- tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/ -I/ -isystem /g'`
- CPPFLAGS="$tmp_chg_FLAGS"
- squeeze CPPFLAGS
- fi
- fi
-
- fi
- #
tmp_save_CPPFLAGS="$CPPFLAGS"
tmp_save_CFLAGS="$CFLAGS"
tmp_CPPFLAGS=""
@@ -17189,7 +17179,6 @@ rm -f core conftest.err conftest.$ac_objext \
if test "x$cross_compiling" != "xyes" &&
test "$tmp_compiler_works" = "yes"; then
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -17386,7 +17375,6 @@ rm -f core conftest.err conftest.$ac_objext \
if test "x$cross_compiling" != "xyes" &&
test "$tmp_compiler_works" = "yes"; then
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -17636,7 +17624,6 @@ rm -f core conftest.err conftest.$ac_objext \
if test "x$cross_compiling" != "xyes" &&
test "$tmp_compiler_works" = "yes"; then
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -17719,33 +17706,337 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
#
if test "$want_warnings" = "yes"; then
tmp_CFLAGS="$tmp_CFLAGS -pedantic"
- tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra"
- tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings"
- tmp_CFLAGS="$tmp_CFLAGS -Wshadow"
- tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes"
+
+ ac_var_added_warnings=""
+ for warning in all extra; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in pointer-arith write-strings; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in shadow; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in inline nested-externs; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in missing-declarations; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in missing-prototypes; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long"
- tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal"
- tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare"
- tmp_CFLAGS="$tmp_CFLAGS -Wundef"
+
+ ac_var_added_warnings=""
+ for warning in float-equal; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in no-multichar sign-compare; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in undef; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral"
- tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes"
- tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement"
- tmp_CFLAGS="$tmp_CFLAGS -Wcast-align"
+
+ ac_var_added_warnings=""
+ for warning in endif-labels strict-prototypes; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in declaration-after-statement; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in cast-align; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers"
- tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32"
+
+ ac_var_added_warnings=""
+ for warning in shorten-64-to-32; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
#
if test "$compiler_num" -ge "101"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wunused"
+
+ ac_var_added_warnings=""
+ for warning in unused; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "208"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wvla"
+
+ ac_var_added_warnings=""
+ for warning in vla; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "209"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wshift-sign-overflow"
+
+ ac_var_added_warnings=""
+ for warning in shift-sign-overflow; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "302"; then
@@ -17753,23 +18044,102 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
cygwin* | mingw*)
;;
*)
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-variable-declarations"
+
+ ac_var_added_warnings=""
+ for warning in missing-variable-declarations; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
;;
esac
fi
#
if test "$compiler_num" -ge "306"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+
+ ac_var_added_warnings=""
+ for warning in double-promotion; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "309"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wcomma"
+
+ ac_var_added_warnings=""
+ for warning in comma; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
# avoid the varargs warning, fixed in 4.0
# https://bugs.llvm.org/show_bug.cgi?id=29140
if test "$compiler_num" -lt "400"; then
tmp_CFLAGS="$tmp_CFLAGS -Wno-varargs"
fi
fi
+ if test "$compiler_num" -ge "700"; then
+
+ ac_var_added_warnings=""
+ for warning in assign-enum; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ fi
fi
;;
#
@@ -17789,34 +18159,226 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
tmp_CFLAGS="$tmp_CFLAGS -pedantic"
fi
#
- tmp_CFLAGS="$tmp_CFLAGS -Wall -W"
+
+ ac_var_added_warnings=""
+ for warning in all; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ tmp_CFLAGS="$tmp_CFLAGS -W"
#
if test "$compiler_num" -ge "104"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings"
+
+ ac_var_added_warnings=""
+ for warning in pointer-arith write-strings; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
if test "x$cross_compiling" != "xyes" ||
test "$compiler_num" -ge "300"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow"
+
+ ac_var_added_warnings=""
+ for warning in unused shadow; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
fi
#
if test "$compiler_num" -ge "207"; then
- tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs"
+
+ ac_var_added_warnings=""
+ for warning in inline nested-externs; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
if test "x$cross_compiling" != "xyes" ||
test "$compiler_num" -ge "300"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes"
+
+ ac_var_added_warnings=""
+ for warning in missing-declarations; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in missing-prototypes; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
fi
#
if test "$compiler_num" -ge "295"; then
tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long"
- tmp_CFLAGS="$tmp_CFLAGS -Wbad-function-cast"
+
+ ac_var_added_warnings=""
+ for warning in bad-function-cast; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "296"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal"
- tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare"
- tmp_CFLAGS="$tmp_CFLAGS -Wundef"
+
+ ac_var_added_warnings=""
+ for warning in float-equal; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar"
+
+ ac_var_added_warnings=""
+ for warning in sign-compare; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in undef; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "297"; then
@@ -17828,12 +18390,69 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
#
if test "$compiler_num" -ge "303"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes"
+
+ ac_var_added_warnings=""
+ for warning in endif-labels strict-prototypes; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "304"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement"
- tmp_CFLAGS="$tmp_CFLAGS -Wold-style-definition"
+
+ ac_var_added_warnings=""
+ for warning in declaration-after-statement; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in old-style-definition; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "400"; then
@@ -17841,14 +18460,130 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
#
if test "$compiler_num" -ge "402"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wcast-align"
+
+ ac_var_added_warnings=""
+ for warning in cast-align; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "403"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body"
- tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers"
- tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla"
+
+ ac_var_added_warnings=""
+ for warning in type-limits old-style-declaration; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in missing-parameter-type empty-body; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in clobbered ignored-qualifiers; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in conversion; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ tmp_CFLAGS="$tmp_CFLAGS -Wno-sign-conversion"
+
+ ac_var_added_warnings=""
+ for warning in vla; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
tmp_CFLAGS="$tmp_CFLAGS -ftree-vrp"
fi
#
@@ -17859,7 +18594,26 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
#
if test "$compiler_num" -ge "406"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+
+ ac_var_added_warnings=""
+ for warning in double-promotion; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "408"; then
@@ -17871,17 +18625,151 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
#
if test "$compiler_num" -ge "600"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wshift-negative-value"
+
+ ac_var_added_warnings=""
+ for warning in shift-negative-value; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
tmp_CFLAGS="$tmp_CFLAGS -Wshift-overflow=2"
- tmp_CFLAGS="$tmp_CFLAGS -Wnull-dereference -fdelete-null-pointer-checks"
- tmp_CFLAGS="$tmp_CFLAGS -Wduplicated-cond"
- tmp_CFLAGS="$tmp_CFLAGS -Wunused-const-variable"
+
+ ac_var_added_warnings=""
+ for warning in null-dereference; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ tmp_CFLAGS="$tmp_CFLAGS -fdelete-null-pointer-checks"
+
+ ac_var_added_warnings=""
+ for warning in duplicated-cond; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in unused-const-variable; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
#
if test "$compiler_num" -ge "700"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wduplicated-branches"
- tmp_CFLAGS="$tmp_CFLAGS -Wrestrict"
- tmp_CFLAGS="$tmp_CFLAGS -Walloc-zero"
+
+ ac_var_added_warnings=""
+ for warning in duplicated-branches; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in restrict; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in alloc-zero; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
tmp_CFLAGS="$tmp_CFLAGS -Wformat-overflow=2"
tmp_CFLAGS="$tmp_CFLAGS -Wformat-truncation=2"
tmp_CFLAGS="$tmp_CFLAGS -Wimplicit-fallthrough=4"
@@ -17902,6 +18790,28 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
fi
fi
fi
+ if test "$compiler_num" -ge "1000"; then
+
+ ac_var_added_warnings=""
+ for warning in enum-conversion; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+ fi
;;
#
HP_UX_C)
@@ -17936,9 +18846,6 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
tmp_CFLAGS="$tmp_CFLAGS -fno-omit-frame-pointer"
tmp_CFLAGS="$tmp_CFLAGS -fno-strict-aliasing"
tmp_CFLAGS="$tmp_CFLAGS -fp-model precise"
- if test "$compiler_num" -ge "1000"; then
- tmp_CFLAGS="$tmp_CFLAGS -vec-report0"
- fi
;;
#
INTEL_WINDOWS_C)
@@ -17978,9 +18885,66 @@ $as_echo "$as_me: WARNING: compiler options rejected: $tmp_options" >&2;}
TINY_C)
#
if test "$want_warnings" = "yes"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wall"
- tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings"
- tmp_CFLAGS="$tmp_CFLAGS -Wunsupported"
+
+ ac_var_added_warnings=""
+ for warning in all; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in write-strings; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
+
+ ac_var_added_warnings=""
+ for warning in unsupported; do
+
+ ac_var_match_word="no"
+ for word1 in $CFLAGS; do
+ for word2 in -Wno-$warning -W$warning; do
+ if test "$word1" = "$word2"; then
+ ac_var_match_word="yes"
+ fi
+ done
+ done
+
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ tmp_CFLAGS="$tmp_CFLAGS $ac_var_added_warnings"
+ squeeze tmp_CFLAGS
+
fi
;;
#
@@ -18074,7 +19038,6 @@ rm -f core conftest.err conftest.$ac_objext \
if test "x$cross_compiling" != "xyes" &&
test "$tmp_compiler_works" = "yes"; then
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -18153,6 +19116,17 @@ if test "$compiler_id" = "INTEL_UNIX_C"; then
#
fi
+CURL_CFLAG_EXTRAS=""
+if test X"$want_werror" = Xyes; then
+ CURL_CFLAG_EXTRAS="-Werror"
+ if test "$compiler_id" = "GNU_C"; then
+ if test "$compiler_num" -ge "500"; then
+ CURL_CFLAG_EXTRAS="$CURL_CFLAG_EXTRAS -pedantic-errors"
+ fi
+ fi
+fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler halts on compilation errors" >&5
$as_echo_n "checking if compiler halts on compilation errors... " >&6; }
@@ -19286,6 +20260,7 @@ $as_echo "#define CURL_DISABLE_PROXY 1" >>confdefs.h
CURL_DISABLE_PROXY=1
+ https_proxy="no"
;;
*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -19498,6 +20473,30 @@ $as_echo "yes" >&6; }
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support mqtt" >&5
+$as_echo_n "checking whether to support mqtt... " >&6; }
+# Check whether --enable-mqtt was given.
+if test "${enable_mqtt+set}" = set; then :
+ enableval=$enable_mqtt; case "$enableval" in
+ no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_MQTT 1" >>confdefs.h
+
+ CURL_DISABLE_MQTT=1
+
+ ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+ esac
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to provide built-in manual" >&5
@@ -20503,7 +21502,6 @@ $as_echo "$curl_cv_gclk_LIBS" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if monotonic clock_gettime works" >&5
$as_echo_n "checking if monotonic clock_gettime works... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -21046,7 +22044,7 @@ $as_echo "found" >&6; }
LD_BROTLI=`$PKGCONFIG --libs-only-L libbrotlidec`
CPP_BROTLI=`$PKGCONFIG --cflags-only-I libbrotlidec`
version=`$PKGCONFIG --modversion libbrotlidec`
- DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/-L//'`
+ DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/^-L//'`
fi
;;
@@ -21154,6 +22152,261 @@ $as_echo "$as_me: Added $DIR_BROTLI to CURL_LIBRARY_PATH" >&6;}
fi
+OPT_ZSTD=off
+
+# Check whether --with-zstd was given.
+if test "${with_zstd+set}" = set; then :
+ withval=$with_zstd; OPT_ZSTD=$withval
+fi
+
+
+if test X"$OPT_ZSTD" != Xno; then
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+ case "$OPT_ZSTD" in
+ yes)
+
+ if test -n "$PKG_CONFIG"; then
+ PKGCONFIG="$PKG_CONFIG"
+ else
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+ ac_pt_PKGCONFIG=$PKGCONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKGCONFIG" = x; then
+ PKGCONFIG="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKGCONFIG=$ac_pt_PKGCONFIG
+ fi
+else
+ PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+ fi
+
+ if test "x$PKGCONFIG" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libzstd options with pkg-config" >&5
+$as_echo_n "checking for libzstd options with pkg-config... " >&6; }
+ itexists=`
+ if test -n ""; then
+ PKG_CONFIG_LIBDIR=""
+ export PKG_CONFIG_LIBDIR
+ fi
+ $PKGCONFIG --exists libzstd >/dev/null 2>&1 && echo 1`
+
+ if test -z "$itexists"; then
+ PKGCONFIG="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+ fi
+ fi
+
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIB_ZSTD=`$PKGCONFIG --libs-only-l libzstd`
+ LD_ZSTD=`$PKGCONFIG --libs-only-L libzstd`
+ CPP_ZSTD=`$PKGCONFIG --cflags-only-I libzstd`
+ version=`$PKGCONFIG --modversion libzstd`
+ DIR_ZSTD=`echo $LD_ZSTD | $SED -e 's/-L//'`
+ fi
+
+ ;;
+ off)
+ ;;
+ *)
+ PREFIX_ZSTD=$OPT_ZSTD
+ ;;
+ esac
+
+ if test -n "$PREFIX_ZSTD"; then
+ LIB_ZSTD="-lzstd"
+ LD_ZSTD=-L${PREFIX_ZSTD}/lib$libsuff
+ CPP_ZSTD=-I${PREFIX_ZSTD}/include
+ DIR_ZSTD=${PREFIX_ZSTD}/lib$libsuff
+ fi
+
+ LDFLAGS="$LDFLAGS $LD_ZSTD"
+ CPPFLAGS="$CPPFLAGS $CPP_ZSTD"
+ LIBS="$LIB_ZSTD $LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZSTD_createDStream in -lzstd" >&5
+$as_echo_n "checking for ZSTD_createDStream in -lzstd... " >&6; }
+if ${ac_cv_lib_zstd_ZSTD_createDStream+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lzstd $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char ZSTD_createDStream ();
+int main (void)
+{
+return ZSTD_createDStream ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_zstd_ZSTD_createDStream=yes
+else
+ ac_cv_lib_zstd_ZSTD_createDStream=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_createDStream" >&5
+$as_echo "$ac_cv_lib_zstd_ZSTD_createDStream" >&6; }
+if test "x$ac_cv_lib_zstd_ZSTD_createDStream" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBZSTD 1
+_ACEOF
+
+ LIBS="-lzstd $LIBS"
+
+fi
+
+
+ for ac_header in zstd.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "zstd.h" "ac_cv_header_zstd_h" "$ac_includes_default"
+if test "x$ac_cv_header_zstd_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ZSTD_H 1
+_ACEOF
+ curl_zstd_msg="enabled (libzstd)"
+ HAVE_ZSTD=1
+
+$as_echo "#define HAVE_ZSTD 1" >>confdefs.h
+
+ HAVE_ZSTD=1
+
+
+fi
+
+done
+
+
+ if test X"$OPT_ZSTD" != Xoff &&
+ test "$HAVE_ZSTD" != "1"; then
+ as_fn_error $? "libzstd was not found where specified!" "$LINENO" 5
+ fi
+
+ if test "$HAVE_ZSTD" = "1"; then
+ if test -n "$DIR_ZSTD"; then
+
+ if test "x$cross_compiling" != "xyes"; then
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_ZSTD"
+ export CURL_LIBRARY_PATH
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_ZSTD to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_ZSTD to CURL_LIBRARY_PATH" >&6;}
+ fi
+ fi
+ else
+ LDFLAGS=$CLEANLDFLAGS
+ CPPFLAGS=$CLEANCPPFLAGS
+ LIBS=$CLEANLIBS
+ fi
+fi
+
+
LDAPLIBNAME=""
# Check whether --with-ldap-lib was given.
@@ -21806,16 +23059,23 @@ $as_echo "yes" >&6; }
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- /* is AF_INET6 available? */
+ /* are AF_INET6 and sockaddr_in6 available? */
#include <sys/types.h>
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
+#include <ws2tcpip.h>
#else
#include <sys/socket.h>
+#include <netinet/in.h>
+#if defined (__TANDEM)
+# include <netinet/in6.h>
+#endif
#endif
#include <stdlib.h> /* for exit() */
main()
{
+ struct sockaddr_in6 s;
+ (void)s;
if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
exit(1);
else
@@ -21839,8 +23099,14 @@ fi
fi
-# Check if struct sockaddr_in6 have sin6_scope_id member
if test "$ipv6" = yes; then
+ curl_ipv6_msg="enabled"
+
+$as_echo "#define ENABLE_IPV6 1" >>confdefs.h
+
+ IPV6_ENABLED=1
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if struct sockaddr_in6 has sin6_scope_id member" >&5
$as_echo_n "checking if struct sockaddr_in6 has sin6_scope_id member... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -21883,7 +23149,6 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if argv can be written to" >&5
$as_echo_n "checking if argv can be written to... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -21894,9 +23159,11 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-int main(int argc, char ** argv) {
- argv00 = ' ';
- return (argv00 == ' ')?0:1;
+int main(int argc, char **argv)
+{
+ (void)argc;
+ argv[0][0] = ' ';
+ return (argv[0][0] == ' ')?0:1;
}
_ACEOF
@@ -22200,26 +23467,26 @@ esac
-OPT_WINSSL=no
+OPT_SCHANNEL=no
# Check whether --with-winssl was given.
if test "${with_winssl+set}" = set; then :
- withval=$with_winssl; OPT_WINSSL=$withval
+ withval=$with_winssl; OPT_SCHANNEL=$withval
fi
# Check whether --with-schannel was given.
if test "${with_schannel+set}" = set; then :
- withval=$with_schannel; OPT_WINSSL=$withval
+ withval=$with_schannel; OPT_SCHANNEL=$withval
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable Windows native SSL/TLS (Windows native builds only)" >&5
$as_echo_n "checking whether to enable Windows native SSL/TLS (Windows native builds only)... " >&6; }
-if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_SCHANNEL" != xno; then
ssl_msg=
- if test "x$OPT_WINSSL" != "xno" &&
+ if test "x$OPT_SCHANNEL" != "xno" &&
test "x$curl_cv_native_windows" = "xyes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -22230,8 +23497,8 @@ $as_echo "#define USE_SCHANNEL 1" >>confdefs.h
ssl_msg="Windows-native"
test schannel != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
- WINSSL_ENABLED=1
- # --with-winssl implies --enable-sspi
+ SCHANNEL_ENABLED=1
+ # --with-schannel implies --enable-sspi
$as_echo "#define USE_WINDOWS_SSPI 1" >>confdefs.h
@@ -22268,7 +23535,7 @@ fi
$as_echo_n "checking whether to enable Secure Transport... " >&6; }
if test -z "$ssl_backends" -o "x$OPT_SECURETRANSPORT" != xno; then
if test "x$OPT_SECURETRANSPORT" != "xno" &&
- test -d "/System/Library/Frameworks/Security.framework"; then
+ (test "x$cross_compiling" != "xno" || test -d "/System/Library/Frameworks/Security.framework"); then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -22574,7 +23841,7 @@ $as_echo "$as_me: pkg-config: SSL_LDFLAGS: \"$SSL_LDFLAGS\"" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: pkg-config: SSL_CPPFLAGS: \"$SSL_CPPFLAGS\"" >&5
$as_echo "$as_me: pkg-config: SSL_CPPFLAGS: \"$SSL_CPPFLAGS\"" >&6;}
- LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/-L//g'`
+ LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/^-L//'`
LIBS="$SSL_LIBS $LIBS"
fi
@@ -22628,6 +23895,8 @@ else
# only set this if pkg-config wasn't used
CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
fi
+ # Linking previously failed, try extra paths from --with-ssl or pkg-config.
+ # Use a different function name to avoid reusing the earlier cached result.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for HMAC_Init_ex in -lcrypto" >&5
$as_echo_n "checking for HMAC_Init_ex in -lcrypto... " >&6; }
if ${ac_cv_lib_crypto_HMAC_Init_ex+:} false; then :
@@ -22993,6 +24262,48 @@ $as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL >= v3" >&5
+$as_echo_n "checking for OpenSSL >= v3... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#include <openssl/opensslv.h>
+
+int main (void)
+{
+
+ #if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3)
+ return 0;
+ #else
+ #error older than 3
+ #endif
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENSSL3 1
+_ACEOF
+
+ CPPFLAGS="$CPPFLAGS -DOPENSSL_SUPPRESS_DEPRECATED"
+ ssl_msg="OpenSSL v3+"
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
if test "$OPENSSL_ENABLED" = "1"; then
@@ -23957,7 +25268,7 @@ $as_echo "found" >&6; }
addld=`$PKGCONFIG --libs-only-L gnutls`
addcflags=`$PKGCONFIG --cflags-only-I gnutls`
version=`$PKGCONFIG --modversion gnutls`
- gtlslib=`echo $addld | $SED -e 's/-L//'`
+ gtlslib=`echo $addld | $SED -e 's/^-L//'`
else
check=`libgnutls-config --version 2>/dev/null`
if test -n "$check"; then
@@ -24000,9 +25311,9 @@ $as_echo "found" >&6; }
CPPFLAGS="$CPPFLAGS $addcflags"
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gnutls_check_version in -lgnutls" >&5
-$as_echo_n "checking for gnutls_check_version in -lgnutls... " >&6; }
-if ${ac_cv_lib_gnutls_gnutls_check_version+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gnutls_x509_crt_get_dn2 in -lgnutls" >&5
+$as_echo_n "checking for gnutls_x509_crt_get_dn2 in -lgnutls... " >&6; }
+if ${ac_cv_lib_gnutls_gnutls_x509_crt_get_dn2+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -24014,26 +25325,26 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char gnutls_check_version ();
+char gnutls_x509_crt_get_dn2 ();
int main (void)
{
-return gnutls_check_version ();
+return gnutls_x509_crt_get_dn2 ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_gnutls_gnutls_check_version=yes
+ ac_cv_lib_gnutls_gnutls_x509_crt_get_dn2=yes
else
- ac_cv_lib_gnutls_gnutls_check_version=no
+ ac_cv_lib_gnutls_gnutls_x509_crt_get_dn2=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gnutls_gnutls_check_version" >&5
-$as_echo "$ac_cv_lib_gnutls_gnutls_check_version" >&6; }
-if test "x$ac_cv_lib_gnutls_gnutls_check_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gnutls_gnutls_x509_crt_get_dn2" >&5
+$as_echo "$ac_cv_lib_gnutls_gnutls_x509_crt_get_dn2" >&6; }
+if test "x$ac_cv_lib_gnutls_gnutls_x509_crt_get_dn2" = xyes; then :
$as_echo "#define USE_GNUTLS 1" >>confdefs.h
@@ -24065,18 +25376,6 @@ $as_echo "$as_me: detected GnuTLS version $version" >&6;}
$as_echo "$as_me: Added $gtlslib to CURL_LIBRARY_PATH" >&6;}
fi
fi
- for ac_func in gnutls_certificate_set_x509_key_file2 gnutls_alpn_set_protocols gnutls_ocsp_req_init
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
fi
fi
@@ -24480,6 +25779,15 @@ if test "${with_wolfssl+set}" = set; then :
fi
+case "$OPT_WOLFSSL" in
+ yes|no)
+ wolfpkg=""
+ ;;
+ *)
+ wolfpkg="$withval/lib/pkgconfig"
+ ;;
+esac
+
if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
ssl_msg=
@@ -24489,22 +25797,192 @@ if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
OPT_WOLFSSL=""
fi
+
+ if test -n "$PKG_CONFIG"; then
+ PKGCONFIG="$PKG_CONFIG"
+ else
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+ ac_pt_PKGCONFIG=$PKGCONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKGCONFIG" = x; then
+ PKGCONFIG="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKGCONFIG=$ac_pt_PKGCONFIG
+ fi
+else
+ PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+ fi
+
+ if test "x$PKGCONFIG" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wolfssl options with pkg-config" >&5
+$as_echo_n "checking for wolfssl options with pkg-config... " >&6; }
+ itexists=`
+ if test -n "$wolfpkg"; then
+ PKG_CONFIG_LIBDIR="$wolfpkg"
+ export PKG_CONFIG_LIBDIR
+ fi
+ $PKGCONFIG --exists wolfssl >/dev/null 2>&1 && echo 1`
+
+ if test -z "$itexists"; then
+ PKGCONFIG="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+ fi
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Check dir $wolfpkg" >&5
+$as_echo "$as_me: Check dir $wolfpkg" >&6;}
+
addld=""
addlib=""
addcflags=""
+ if test "$PKGCONFIG" != "no" ; then
+ addlib=`
+ if test -n "$wolfpkg"; then
+ PKG_CONFIG_LIBDIR="$wolfpkg"
+ export PKG_CONFIG_LIBDIR
+ fi
+
+ $PKGCONFIG --libs-only-l wolfssl`
+ addld=`
+ if test -n "$wolfpkg"; then
+ PKG_CONFIG_LIBDIR="$wolfpkg"
+ export PKG_CONFIG_LIBDIR
+ fi
+
+ $PKGCONFIG --libs-only-L wolfssl`
+ addcflags=`
+ if test -n "$wolfpkg"; then
+ PKG_CONFIG_LIBDIR="$wolfpkg"
+ export PKG_CONFIG_LIBDIR
+ fi
+
+ $PKGCONFIG --cflags-only-I wolfssl`
+ version=`
+ if test -n "$wolfpkg"; then
+ PKG_CONFIG_LIBDIR="$wolfpkg"
+ export PKG_CONFIG_LIBDIR
+ fi
+
+ $PKGCONFIG --modversion wolfssl`
+ wolfssllibpath=`echo $addld | $SED -e 's/^-L//'`
+ else
+ addlib=-lwolfssl
+ if test -n "$OPT_WOLFSSL"; then
+ addld=-L$OPT_WOLFSSL/lib$libsuff
+ addcflags=-I$OPT_WOLFSSL/include
+ wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
+ fi
+ fi
if test "x$USE_WOLFSSL" != "xyes"; then
- addld=-L$OPT_WOLFSSL/lib$libsuff
- addcflags=-I$OPT_WOLFSSL/include
- wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
LDFLAGS="$LDFLAGS $addld"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Add $addld to LDFLAGS" >&5
+$as_echo "$as_me: Add $addld to LDFLAGS" >&6;}
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Add $addcflags to CPPFLAGS" >&5
+$as_echo "$as_me: Add $addcflags to CPPFLAGS" >&6;}
fi
my_ac_save_LIBS="$LIBS"
- LIBS="-lwolfssl -lm $LIBS"
+ LIBS="$addlib $LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Add $addlib to LIBS" >&5
+$as_echo "$as_me: Add $addlib to LIBS" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wolfSSL_Init in -lwolfssl" >&5
$as_echo_n "checking for wolfSSL_Init in -lwolfssl... " >&6; }
@@ -24601,9 +26079,9 @@ _ACEOF
- LIBS="-lwolfssl -lm $LIBS"
+ LIBS="$addlib -lm $LIBS"
- for ac_func in wolfSSLv3_client_method \
+ for ac_func in wolfSSLv3_client_method \
wolfSSL_get_peer_certificate \
wolfSSL_UseALPN
do :
@@ -24618,6 +26096,30 @@ fi
done
+ ac_fn_c_check_func "$LINENO" "wolfSSL_DES_ecb_encrypt" "ac_cv_func_wolfSSL_DES_ecb_encrypt"
+if test "x$ac_cv_func_wolfSSL_DES_ecb_encrypt" = xyes; then :
+
+
+$as_echo "#define HAVE_WOLFSSL_DES_ECB_ENCRYPT 1" >>confdefs.h
+
+ if test -n "$addcflags"; then
+ for f in $addcflags; do
+ CPPFLAGS="$f/wolfssl $CPPFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Add $f/wolfssl to CPPFLAGS" >&5
+$as_echo "$as_me: Add $f/wolfssl to CPPFLAGS" >&6;}
+ break
+ done
+ else
+ CPPFLAGS="-I$includedir/wolfssl $CPPFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Add $includedir/wolfssl to CPPFLAGS" >&5
+$as_echo "$as_me: Add $includedir/wolfssl to CPPFLAGS" >&6;}
+ fi
+ WOLFSSL_NTLM=1
+
+
+fi
+
+
if test -n "$wolfssllibpath"; then
if test "x$cross_compiling" != "xyes"; then
CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$wolfssllibpath"
@@ -24795,6 +26297,168 @@ $as_echo "$as_me: Added $mesalinklib to LD_LIBRARY_PATH" >&6;}
fi
+OPT_BEARSSL=no
+
+_cppflags=$CPPFLAGS
+_ldflags=$LDFLAGS
+
+# Check whether --with-bearssl was given.
+if test "${with_bearssl+set}" = set; then :
+ withval=$with_bearssl; OPT_BEARSSL=$withval
+fi
+
+
+if test -z "$ssl_backends" -o "x$OPT_BEARSSL" != xno; then
+ ssl_msg=
+
+ if test X"$OPT_BEARSSL" != Xno; then
+
+ if test "$OPT_BEARSSL" = "yes"; then
+ OPT_BEARSSL=""
+ fi
+
+ if test -z "$OPT_BEARSSL" ; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for br_ssl_client_init_full in -lbearssl" >&5
+$as_echo_n "checking for br_ssl_client_init_full in -lbearssl... " >&6; }
+if ${ac_cv_lib_bearssl_br_ssl_client_init_full+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbearssl -lbearssl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char br_ssl_client_init_full ();
+int main (void)
+{
+return br_ssl_client_init_full ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_bearssl_br_ssl_client_init_full=yes
+else
+ ac_cv_lib_bearssl_br_ssl_client_init_full=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bearssl_br_ssl_client_init_full" >&5
+$as_echo "$ac_cv_lib_bearssl_br_ssl_client_init_full" >&6; }
+if test "x$ac_cv_lib_bearssl_br_ssl_client_init_full" = xyes; then :
+
+
+$as_echo "#define USE_BEARSSL 1" >>confdefs.h
+
+ USE_BEARSSL=1
+
+ BEARSSL_ENABLED=1
+ USE_BEARSSL="yes"
+ ssl_msg="BearSSL"
+ test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+fi
+
+ fi
+
+ addld=""
+ addlib=""
+ addcflags=""
+ bearssllib=""
+
+ if test "x$USE_BEARSSL" != "xyes"; then
+ addld=-L$OPT_BEARSSL/lib$libsuff
+ addcflags=-I$OPT_BEARSSL/include
+ bearssllib=$OPT_BEARSSL/lib$libsuff
+
+ LDFLAGS="$LDFLAGS $addld"
+ if test "$addcflags" != "-I/usr/include"; then
+ CPPFLAGS="$CPPFLAGS $addcflags"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for br_ssl_client_init_full in -lbearssl" >&5
+$as_echo_n "checking for br_ssl_client_init_full in -lbearssl... " >&6; }
+if ${ac_cv_lib_bearssl_br_ssl_client_init_full+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbearssl -lbearssl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char br_ssl_client_init_full ();
+int main (void)
+{
+return br_ssl_client_init_full ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_bearssl_br_ssl_client_init_full=yes
+else
+ ac_cv_lib_bearssl_br_ssl_client_init_full=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bearssl_br_ssl_client_init_full" >&5
+$as_echo "$ac_cv_lib_bearssl_br_ssl_client_init_full" >&6; }
+if test "x$ac_cv_lib_bearssl_br_ssl_client_init_full" = xyes; then :
+
+
+$as_echo "#define USE_BEARSSL 1" >>confdefs.h
+
+ USE_BEARSSL=1
+
+ BEARSSL_ENABLED=1
+ USE_BEARSSL="yes"
+ ssl_msg="BearSSL"
+ test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+
+else
+
+ CPPFLAGS=$_cppflags
+ LDFLAGS=$_ldflags
+
+fi
+
+ fi
+
+ if test "x$USE_BEARSSL" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: detected BearSSL" >&5
+$as_echo "$as_me: detected BearSSL" >&6;}
+ check_for_ca_bundle=1
+
+ LIBS="-lbearssl $LIBS"
+
+ if test -n "$bearssllib"; then
+ if test "x$cross_compiling" != "xyes"; then
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$bearssllib"
+ export CURL_LIBRARY_PATH
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Added $bearssllib to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $bearssllib to CURL_LIBRARY_PATH" >&6;}
+ fi
+ fi
+ fi
+
+ fi
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
+
+
OPT_NSS=no
@@ -25231,12 +26895,12 @@ $as_echo "$as_me: Added $nssprefix/lib$libsuff to CURL_LIBRARY_PATH" >&6;}
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$AMISSL_ENABLED" in
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$SCHANNEL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$BEARSSL_ENABLED$AMISSL_ENABLED" in
x)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&5
$as_echo "$as_me: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more." >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this." >&5
-$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this." >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this." >&5
+$as_echo "$as_me: WARNING: Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this." >&2;}
;;
x1)
# one SSL backend is enabled
@@ -25326,8 +26990,8 @@ fi
ca="$want_ca"
capath="no"
elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then
- if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then
- as_fn_error $? "--with-ca-path only works with OpenSSL, GnuTLS or PolarSSL" "$LINENO" 5
+ if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$MBEDTLS_ENABLED" != "x1"; then
+ as_fn_error $? "--with-ca-path only works with OpenSSL, GnuTLS or mbedTLS" "$LINENO" 5
fi
capath="$want_capath"
ca="no"
@@ -25834,7 +27498,7 @@ $as_echo "found" >&6; }
export PKG_CONFIG_LIBDIR
fi
$PKGCONFIG --modversion libmetalink`
- libmetalinklib=`echo $addld | $SED -e 's/-L//'`
+ libmetalinklib=`echo $addld | $SED -e 's/^-L//'`
fi
if test -n "$addlib"; then
@@ -25880,6 +27544,13 @@ $as_echo "$as_me: libmetalink library defective or too old" >&6;}
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
+ if test "x$OPENSSL_ENABLED" != "x1" -a "x$USE_WINDOWS_SSPI" != "x1" \
+ -a "x$GNUTLS_ENABLED" != "x1" -a "x$NSS_ENABLED" != "x1" \
+ -a "x$SECURETRANSPORT_ENABLED" != "x1"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: metalink support requires a compatible SSL/TLS backend" >&5
+$as_echo "$as_me: WARNING: metalink support requires a compatible SSL/TLS backend" >&2;}
+ want_metalink="no"
+ fi
CPPFLAGS="$clean_CPPFLAGS"
LDFLAGS="$clean_LDFLAGS"
LIBS="$clean_LIBS"
@@ -25921,6 +27592,16 @@ else
fi
+OPT_WOLFSSH=off
+
+# Check whether --with-wolfssh was given.
+if test "${with_wolfssh+set}" = set; then :
+ withval=$with_wolfssh; OPT_WOLFSSH=$withval
+else
+ OPT_WOLFSSH=no
+fi
+
+
if test X"$OPT_LIBSSH2" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -26060,7 +27741,7 @@ $as_echo "found" >&6; }
LD_SSH2=`$PKGCONFIG --libs-only-L libssh2`
CPP_SSH2=`$PKGCONFIG --cflags-only-I libssh2`
version=`$PKGCONFIG --modversion libssh2`
- DIR_SSH2=`echo $LD_SSH2 | $SED -e 's/-L//'`
+ DIR_SSH2=`echo $LD_SSH2 | $SED -e 's/^-L//'`
fi
;;
@@ -26304,7 +27985,7 @@ $as_echo "found" >&6; }
LD_SSH=`$PKGCONFIG --libs-only-L libssh`
CPP_SSH=`$PKGCONFIG --cflags-only-I libssh`
version=`$PKGCONFIG --modversion libssh`
- DIR_SSH=`echo $LD_SSH | $SED -e 's/-L//'`
+ DIR_SSH=`echo $LD_SSH | $SED -e 's/^-L//'`
fi
;;
@@ -26409,6 +28090,81 @@ $as_echo "$as_me: Added $DIR_SSH to CURL_LIBRARY_PATH" >&6;}
CPPFLAGS=$CLEANCPPFLAGS
LIBS=$CLEANLIBS
fi
+elif test X"$OPT_WOLFSSH" != Xno; then
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+
+ if test "$OPT_WOLFSSH" != yes; then
+ WOLFCONFIG="$OPT_WOLFSSH/bin/wolfssh-config"
+ LDFLAGS="$LDFLAGS `$WOLFCONFIG --libs`"
+ CPPFLAGS="$CPPFLAGS `$WOLFCONFIG --cflags`"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wolfSSH_Init in -lwolfssh" >&5
+$as_echo_n "checking for wolfSSH_Init in -lwolfssh... " >&6; }
+if ${ac_cv_lib_wolfssh_wolfSSH_Init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lwolfssh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char wolfSSH_Init ();
+int main (void)
+{
+return wolfSSH_Init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_wolfssh_wolfSSH_Init=yes
+else
+ ac_cv_lib_wolfssh_wolfSSH_Init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wolfssh_wolfSSH_Init" >&5
+$as_echo "$ac_cv_lib_wolfssh_wolfSSH_Init" >&6; }
+if test "x$ac_cv_lib_wolfssh_wolfSSH_Init" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBWOLFSSH 1
+_ACEOF
+
+ LIBS="-lwolfssh $LIBS"
+
+fi
+
+
+ for ac_header in wolfssh/ssh.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "wolfssh/ssh.h" "ac_cv_header_wolfssh_ssh_h" "$ac_includes_default"
+if test "x$ac_cv_header_wolfssh_ssh_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_WOLFSSH_SSH_H 1
+_ACEOF
+ curl_ssh_msg="enabled (wolfSSH)"
+ WOLFSSH_ENABLED=1
+
+$as_echo "#define USE_WOLFSSH 1" >>confdefs.h
+
+ USE_WOLFSSH=1
+
+
+fi
+
+done
+
+
fi
@@ -26559,7 +28315,7 @@ $as_echo "found" >&6; }
LD_RTMP=`$PKGCONFIG --libs-only-L librtmp`
CPP_RTMP=`$PKGCONFIG --cflags-only-I librtmp`
version=`$PKGCONFIG --modversion librtmp`
- DIR_RTMP=`echo $LD_RTMP | $SED -e 's/-L//'`
+ DIR_RTMP=`echo $LD_RTMP | $SED -e 's/^-L//'`
else
as_fn_error $? "--librtmp was specified but could not find librtmp pkgconfig file." "$LINENO" 5
fi
@@ -26684,7 +28440,7 @@ $as_echo "yes" >&6; }
versioned_symbols_flavour="NSS_"
elif test "x$WOLFSSL_ENABLED" = "x1"; then
versioned_symbols_flavour="WOLFSSL_"
- elif test "x$WINSSL_ENABLED" = "x1"; then
+ elif test "x$SCHANNEL_ENABLED" = "x1"; then
versioned_symbols_flavour="SCHANNEL_"
elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then
versioned_symbols_flavour="SECURE_TRANSPORT_"
@@ -27009,7 +28765,7 @@ $as_echo "found" >&6; }
export PKG_CONFIG_LIBDIR
fi
$PKGCONFIG --cflags-only-I libidn2 2>/dev/null`
- IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/-L//'`
+ IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/^-L//'`
else
IDN_LIBS="-lidn2"
IDN_LDFLAGS="-L$want_idn_path/lib$libsuff"
@@ -27147,7 +28903,7 @@ $as_echo "found" >&6; }
IDN_LIBS=`$PKGCONFIG --libs-only-l libidn2 2>/dev/null`
IDN_LDFLAGS=`$PKGCONFIG --libs-only-L libidn2 2>/dev/null`
IDN_CPPFLAGS=`$PKGCONFIG --cflags-only-I libidn2 2>/dev/null`
- IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/-L//'`
+ IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/^-L//'`
else
IDN_LIBS="-lidn2"
fi
@@ -27290,7 +29046,7 @@ case "$OPT_H2" in
;;
esac
-curl_h2_msg="disabled (--with-nghttp2)"
+curl_h2_msg="no (--with-nghttp2)"
if test X"$want_h2" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -27457,11 +29213,11 @@ $as_echo "$as_me: -L is $LD_H2" >&6;}
CPPFLAGS="$CPPFLAGS $CPP_H2"
LIBS="$LIB_H2 $LIBS"
- # use nghttp2_option_set_no_recv_client_magic to require nghttp2
- # >= 1.0.0
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp2_option_set_no_recv_client_magic in -lnghttp2" >&5
-$as_echo_n "checking for nghttp2_option_set_no_recv_client_magic in -lnghttp2... " >&6; }
-if ${ac_cv_lib_nghttp2_nghttp2_option_set_no_recv_client_magic+:} false; then :
+ # use nghttp2_session_set_local_window_size to require nghttp2
+ # >= 1.12.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp2_session_set_local_window_size in -lnghttp2" >&5
+$as_echo_n "checking for nghttp2_session_set_local_window_size in -lnghttp2... " >&6; }
+if ${ac_cv_lib_nghttp2_nghttp2_session_set_local_window_size+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -27473,26 +29229,26 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus
extern "C"
#endif
-char nghttp2_option_set_no_recv_client_magic ();
+char nghttp2_session_set_local_window_size ();
int main (void)
{
-return nghttp2_option_set_no_recv_client_magic ();
+return nghttp2_session_set_local_window_size ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_nghttp2_nghttp2_option_set_no_recv_client_magic=yes
+ ac_cv_lib_nghttp2_nghttp2_session_set_local_window_size=yes
else
- ac_cv_lib_nghttp2_nghttp2_option_set_no_recv_client_magic=no
+ ac_cv_lib_nghttp2_nghttp2_session_set_local_window_size=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nghttp2_nghttp2_option_set_no_recv_client_magic" >&5
-$as_echo "$ac_cv_lib_nghttp2_nghttp2_option_set_no_recv_client_magic" >&6; }
-if test "x$ac_cv_lib_nghttp2_nghttp2_option_set_no_recv_client_magic" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nghttp2_nghttp2_session_set_local_window_size" >&5
+$as_echo "$ac_cv_lib_nghttp2_nghttp2_session_set_local_window_size" >&6; }
+if test "x$ac_cv_lib_nghttp2_nghttp2_session_set_local_window_size" = xyes; then :
for ac_header in nghttp2/nghttp2.h
do :
@@ -27532,7 +29288,7 @@ fi
OPT_TCP2="yes"
-curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
+curl_h3_msg="no (--with-ngtcp2, --with-quiche)"
if test "x$disable_http" = "xyes"; then
# without HTTP, ngtcp2 is no use
@@ -27559,7 +29315,7 @@ case "$OPT_TCP2" in
;;
esac
-curl_tcp2_msg="disabled (--with-ngtcp2)"
+curl_tcp2_msg="no (--with-ngtcp2)"
if test X"$want_tcp2" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -27727,7 +29483,7 @@ $as_echo "$as_me: -L is $LD_TCP2" >&6;}
LIBS="$LIB_TCP2 $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
+ DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/^-L//'`
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_conn_client_new in -lngtcp2" >&5
$as_echo_n "checking for ngtcp2_conn_client_new in -lngtcp2... " >&6; }
@@ -27803,7 +29559,7 @@ fi
fi
-if test "x$NGTCP2_ENABLED" = "x1"; then
+if test "x$NGTCP2_ENABLED" = "x1" -a "x$OPENSSL_ENABLED" = "x1"; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
CLEANLIBS="$LIBS"
@@ -27970,7 +29726,7 @@ $as_echo "$as_me: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&6;}
LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
+ DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/^-L//'`
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl" >&5
$as_echo_n "checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl... " >&6; }
@@ -28045,6 +29801,248 @@ fi
fi
fi
+if test "x$NGTCP2_ENABLED" = "x1" -a "x$GNUTLS_ENABLED" = "x1"; then
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+
+ if test -n "$PKG_CONFIG"; then
+ PKGCONFIG="$PKG_CONFIG"
+ else
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKGCONFIG=$ac_cv_path_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKGCONFIG"; then
+ ac_pt_PKGCONFIG=$PKGCONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKGCONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
+if test -n "$ac_pt_PKGCONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
+$as_echo "$ac_pt_PKGCONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKGCONFIG" = x; then
+ PKGCONFIG="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKGCONFIG=$ac_pt_PKGCONFIG
+ fi
+else
+ PKGCONFIG="$ac_cv_path_PKGCONFIG"
+fi
+
+ fi
+
+ if test "x$PKGCONFIG" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2_crypto_gnutls options with pkg-config" >&5
+$as_echo_n "checking for libngtcp2_crypto_gnutls options with pkg-config... " >&6; }
+ itexists=`
+ if test -n "$want_tcp2_path"; then
+ PKG_CONFIG_LIBDIR="$want_tcp2_path"
+ export PKG_CONFIG_LIBDIR
+ fi
+ $PKGCONFIG --exists libngtcp2_crypto_gnutls >/dev/null 2>&1 && echo 1`
+
+ if test -z "$itexists"; then
+ PKGCONFIG="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+ fi
+ fi
+
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIB_NGTCP2_CRYPTO_GNUTLS=`
+ if test -n "$want_tcp2_path"; then
+ PKG_CONFIG_LIBDIR="$want_tcp2_path"
+ export PKG_CONFIG_LIBDIR
+ fi
+
+ $PKGCONFIG --libs-only-l libngtcp2_crypto_gnutls`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGTCP2_CRYPTO_GNUTLS" >&5
+$as_echo "$as_me: -l is $LIB_NGTCP2_CRYPTO_GNUTLS" >&6;}
+
+ CPP_NGTCP2_CRYPTO_GNUTLS=`
+ if test -n "$want_tcp2_path"; then
+ PKG_CONFIG_LIBDIR="$want_tcp2_path"
+ export PKG_CONFIG_LIBDIR
+ fi
+ $PKGCONFIG --cflags-only-I libngtcp2_crypto_gnutls`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGTCP2_CRYPTO_GNUTLS" >&5
+$as_echo "$as_me: -I is $CPP_NGTCP2_CRYPTO_GNUTLS" >&6;}
+
+ LD_NGTCP2_CRYPTO_GNUTLS=`
+ if test -n "$want_tcp2_path"; then
+ PKG_CONFIG_LIBDIR="$want_tcp2_path"
+ export PKG_CONFIG_LIBDIR
+ fi
+
+ $PKGCONFIG --libs-only-L libngtcp2_crypto_gnutls`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGTCP2_CRYPTO_GNUTLS" >&5
+$as_echo "$as_me: -L is $LD_NGTCP2_CRYPTO_GNUTLS" >&6;}
+
+ LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_GNUTLS"
+ CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_GNUTLS"
+ LIBS="$LIB_NGTCP2_CRYPTO_GNUTLS $LIBS"
+
+ if test "x$cross_compiling" != "xyes"; then
+ DIR_NGTCP2_CRYPTO_GNUTLS=`echo $LD_NGTCP2_CRYPTO_GNUTLS | $SED -e 's/^-L//'`
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_gnutls" >&5
+$as_echo_n "checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_gnutls... " >&6; }
+if ${ac_cv_lib_ngtcp2_crypto_gnutls_ngtcp2_crypto_ctx_initial+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2_crypto_gnutls $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngtcp2_crypto_ctx_initial ();
+int main (void)
+{
+return ngtcp2_crypto_ctx_initial ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ngtcp2_crypto_gnutls_ngtcp2_crypto_ctx_initial=yes
+else
+ ac_cv_lib_ngtcp2_crypto_gnutls_ngtcp2_crypto_ctx_initial=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_gnutls_ngtcp2_crypto_ctx_initial" >&5
+$as_echo "$ac_cv_lib_ngtcp2_crypto_gnutls_ngtcp2_crypto_ctx_initial" >&6; }
+if test "x$ac_cv_lib_ngtcp2_crypto_gnutls_ngtcp2_crypto_ctx_initial" = xyes; then :
+
+ for ac_header in ngtcp2/ngtcp2_crypto.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2_crypto.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_h" "$ac_includes_default"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NGTCP2_NGTCP2_CRYPTO_H 1
+_ACEOF
+ NGTCP2_ENABLED=1
+
+$as_echo "#define USE_NGTCP2_CRYPTO_GNUTLS 1" >>confdefs.h
+
+ USE_NGTCP2_CRYPTO_GNUTLS=1
+
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_GNUTLS"
+ export CURL_LIBRARY_PATH
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGTCP2_CRYPTO_GNUTLS to CURL_LIBRARY_PATH" >&5
+$as_echo "$as_me: Added $DIR_NGTCP2_CRYPTO_GNUTLS to CURL_LIBRARY_PATH" >&6;}
+
+fi
+
+done
+
+
+else
+ LDFLAGS=$CLEANLDFLAGS
+ CPPFLAGS=$CLEANCPPFLAGS
+ LIBS=$CLEANLIBS
+
+fi
+
+
+ else
+ if test X"$want_tcp2" != Xdefault; then
+ as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2_crypto_gnutls pkg-config file." "$LINENO" 5
+ fi
+ fi
+fi
+
OPT_NGHTTP3="yes"
@@ -28073,7 +30071,7 @@ case "$OPT_NGHTTP3" in
;;
esac
-curl_http3_msg="disabled (--with-nghttp3)"
+curl_http3_msg="no (--with-nghttp3)"
if test X"$want_nghttp3" != Xno; then
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -28241,7 +30239,7 @@ $as_echo "$as_me: -L is $LD_NGHTTP3" >&6;}
LIBS="$LIB_NGHTTP3 $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
+ DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/^-L//'`
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp3_conn_client_new in -lnghttp3" >&5
$as_echo_n "checking for nghttp3_conn_client_new in -lnghttp3... " >&6; }
@@ -28514,7 +30512,7 @@ $as_echo "$as_me: -L is $LD_QUICHE" >&6;}
LIBS="$LIB_QUICHE $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
+ DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/^-L//'`
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche_connect in -lquiche" >&5
$as_echo_n "checking for quiche_connect in -lquiche... " >&6; }
@@ -28568,6 +30566,17 @@ $as_echo "#define USE_QUICHE 1" >>confdefs.h
USE_QUICHE=1
+ for ac_func in quiche_conn_set_qlog_fd
+do :
+ ac_fn_c_check_func "$LINENO" "quiche_conn_set_qlog_fd" "ac_cv_func_quiche_conn_set_qlog_fd"
+if test "x$ac_cv_func_quiche_conn_set_qlog_fd" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_QUICHE_CONN_SET_QLOG_FD 1
+_ACEOF
+
+fi
+done
+
CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
export CURL_LIBRARY_PATH
{ $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&5
@@ -29106,6 +31115,8 @@ ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -29464,7 +31475,6 @@ _ACEOF
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking run-time libs availability" >&5
$as_echo_n "checking run-time libs availability... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -29892,10 +31902,28 @@ fi
fi
+# check for suseconds_t
+ac_fn_c_check_type "$LINENO" "suseconds_t" "ac_cv_type_suseconds_t" "
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+"
+if test "x$ac_cv_type_suseconds_t" = xyes; then :
+
+
+$as_echo "#define HAVE_SUSECONDS_T 1" >>confdefs.h
+
+
+fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if time_t is unsigned" >&5
$as_echo_n "checking if time_t is unsigned... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -30322,6 +32350,8 @@ struct Library *SocketBase = NULL;
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -30407,6 +32437,8 @@ struct Library *SocketBase = NULL;
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -33230,7 +35262,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getaddrinfo seems to work" >&5
$as_echo_n "checking if getaddrinfo seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -35216,7 +37247,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getifaddrs seems to work" >&5
$as_echo_n "checking if getifaddrs seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -35706,7 +37736,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if gmtime_r seems to work" >&5
$as_echo_n "checking if gmtime_r seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -36162,7 +38191,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if inet_ntop seems to work" >&5
$as_echo_n "checking if inet_ntop seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -36414,7 +38442,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if inet_pton seems to work" >&5
$as_echo_n "checking if inet_pton seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -37431,7 +39458,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if localtime_r seems to work" >&5
$as_echo_n "checking if localtime_r seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -37826,7 +39852,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if poll seems to work" >&5
$as_echo_n "checking if poll seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -39758,7 +41783,6 @@ $as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strerror_r seems to work" >&5
$as_echo_n "checking if strerror_r seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -39866,7 +41890,6 @@ $as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strerror_r seems to work" >&5
$as_echo_n "checking if strerror_r seems to work... " >&6; }
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
@@ -41331,17 +43354,6 @@ fi
done
-if test "$ipv6" = "yes"; then
- if test "$curl_cv_func_getaddrinfo" = "yes"; then
-
-$as_echo "#define ENABLE_IPV6 1" >>confdefs.h
-
- IPV6_ENABLED=1
-
- curl_ipv6_msg="enabled"
- fi
-fi
-
#
tst_method="unknown"
@@ -41991,12 +44003,15 @@ if test "x$ac_cv_header_pthread_h" = xyes; then :
$as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h
save_CFLAGS="$CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS=
ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
if test "x$ac_cv_func_pthread_create" = xyes; then :
USE_THREADS_POSIX=1
fi
+ LIBS="$save_LIBS"
case $host in
*-hp-hpux*)
@@ -42078,6 +44093,49 @@ $as_echo "#define USE_THREADS_WIN32 1" >>confdefs.h
fi
fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking convert -I options to -isystem" >&5
+$as_echo_n "checking convert -I options to -isystem... " >&6; }
+ if test "$compiler_id" = "GNU_C" ||
+ test "$compiler_id" = "CLANG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ tmp_has_include="no"
+ tmp_chg_FLAGS="$CFLAGS"
+ for word1 in $tmp_chg_FLAGS; do
+ case "$word1" in
+ -I*)
+ tmp_has_include="yes"
+ ;;
+ esac
+ done
+ if test "$tmp_has_include" = "yes"; then
+ tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/^-I/ -isystem /g'`
+ tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/ -I/ -isystem /g'`
+ CFLAGS="$tmp_chg_FLAGS"
+ squeeze CFLAGS
+ fi
+ tmp_has_include="no"
+ tmp_chg_FLAGS="$CPPFLAGS"
+ for word1 in $tmp_chg_FLAGS; do
+ case "$word1" in
+ -I*)
+ tmp_has_include="yes"
+ ;;
+ esac
+ done
+ if test "$tmp_has_include" = "yes"; then
+ tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/^-I/ -isystem /g'`
+ tmp_chg_FLAGS=`echo "$tmp_chg_FLAGS" | "$SED" 's/ -I/ -isystem /g'`
+ CPPFLAGS="$tmp_chg_FLAGS"
+ squeeze CPPFLAGS
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable verbose strings" >&5
$as_echo_n "checking whether to enable verbose strings... " >&6; }
# Check whether --enable-verbose was given.
@@ -42125,8 +44183,8 @@ $as_echo "$as_me: WARNING: --enable-sspi Ignored. Only supported on native Windo
fi
;;
*)
- if test "x$WINSSL_ENABLED" = "x1"; then
- # --with-winssl implies --enable-sspi
+ if test "x$SCHANNEL_ENABLED" = "x1"; then
+ # --with-schannel implies --enable-sspi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
@@ -42136,8 +44194,8 @@ $as_echo "no" >&6; }
;;
esac
else
- if test "x$WINSSL_ENABLED" = "x1"; then
- # --with-winssl implies --enable-sspi
+ if test "x$SCHANNEL_ENABLED" = "x1"; then
+ # --with-schannel implies --enable-sspi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
@@ -42320,6 +44378,29 @@ $as_echo "yes" >&6; }
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support socketpair" >&5
+$as_echo_n "checking whether to support socketpair... " >&6; }
+# Check whether --enable-socketpair was given.
+if test "${enable_socketpair+set}" = set; then :
+ enableval=$enable_socketpair; case "$enableval" in
+ no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_SOCKETPAIR 1" >>confdefs.h
+
+ ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+ esac
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support HTTP authentication" >&5
$as_echo_n "checking whether to support HTTP authentication... " >&6; }
# Check whether --enable-http-auth was given.
@@ -42481,6 +44562,29 @@ $as_echo "yes" >&6; }
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support curl_easy_option*" >&5
+$as_echo_n "checking whether to support curl_easy_option*... " >&6; }
+# Check whether --enable-get-easy-option was given.
+if test "${enable_get_easy_option+set}" = set; then :
+ enableval=$enable_get_easy_option; case "$enableval" in
+ no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define CURL_DISABLE_GETOPTIONS 1" >>confdefs.h
+
+ ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ;;
+ esac
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
curl_altsvc_msg="no (--enable-alt-svc)";
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to support alt-svc" >&5
$as_echo_n "checking whether to support alt-svc... " >&6; }
@@ -42511,38 +44615,38 @@ $as_echo "#define USE_ALTSVC 1" >>confdefs.h
experimental="$experimental alt-svc"
fi
-if test "x$want_esni" != "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ESNI support is available" >&5
-$as_echo_n "checking whether ESNI support is available... " >&6; }
+if test "x$want_ech" != "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ECH support is available" >&5
+$as_echo_n "checking whether ECH support is available... " >&6; }
- ESNI_ENABLED=0
- ESNI_SUPPORT=''
+ ECH_ENABLED=0
+ ECH_SUPPORT=''
- if test "x$OPENSSL_ENABLED" == "x1"; then
- for ac_func in SSL_get_esni_status
+ if test "x$OPENSSL_ENABLED" = "x1"; then
+ for ac_func in SSL_get_ech_status
do :
- ac_fn_c_check_func "$LINENO" "SSL_get_esni_status" "ac_cv_func_SSL_get_esni_status"
-if test "x$ac_cv_func_SSL_get_esni_status" = xyes; then :
+ ac_fn_c_check_func "$LINENO" "SSL_get_ech_status" "ac_cv_func_SSL_get_ech_status"
+if test "x$ac_cv_func_SSL_get_ech_status" = xyes; then :
cat >>confdefs.h <<_ACEOF
-#define HAVE_SSL_GET_ESNI_STATUS 1
+#define HAVE_SSL_GET_ECH_STATUS 1
_ACEOF
- ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
- ESNI_ENABLED=1
+ ECH_SUPPORT="ECH support available (OpenSSL with SSL_get_ech_status)"
+ ECH_ENABLED=1
fi
done
fi
- if test "x$ESNI_ENABLED" == "x1"; then
+ if test "x$ECH_ENABLED" = "x1"; then
-$as_echo "#define USE_ESNI 1" >>confdefs.h
+$as_echo "#define USE_ECH 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESNI_SUPPORT" >&5
-$as_echo "$ESNI_SUPPORT" >&6; }
- experimental="$experimental ESNI"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECH_SUPPORT" >&5
+$as_echo "$ECH_SUPPORT" >&6; }
+ experimental="$experimental ECH"
else
- as_fn_error $? "--enable-esni ignored: No ESNI support found" "$LINENO" 5
+ as_fn_error $? "--enable-ech ignored: No ECH support found" "$LINENO" 5
fi
fi
@@ -42602,6 +44706,12 @@ ENABLE_SHARED="$enable_shared"
ENABLE_STATIC="$enable_static"
+if test "x$enable_shared" = "xno"; then
+ LIBCURL_NO_SHARED=$LIBCURL_LIBS
+else
+ LIBCURL_NO_SHARED=
+fi
+
if test "x$OPENSSL_ENABLED" = "x1"; then
@@ -42621,6 +44731,9 @@ fi
if test "x$HAVE_BROTLI" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES brotli"
fi
+if test "x$HAVE_ZSTD" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES zstd"
+fi
if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
-o "x$USE_THREADS_WIN32" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
@@ -42657,7 +44770,8 @@ fi
if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then
if test "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1"; then
+ -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \
+ -o "x$WOLFSSL_NTLM" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM"
if test "x$CURL_DISABLE_HTTP" != "x1" -a \
@@ -42683,15 +44797,18 @@ if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi
-if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+if test "x$https_proxy" != "xno"; then
+ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
+ -o "x$NSS_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+ fi
fi
-if test "x$ESNI_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
+if test "x$ECH_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES ECH"
fi
+SUPPORT_FEATURES=`echo $SUPPORT_FEATURES | tr ' ' '\012' | sort | tr '\012' ' '`
if test "x$CURL_DISABLE_HTTP" != "x1"; then
@@ -42730,6 +44847,9 @@ fi
if test "x$CURL_DISABLE_GOPHER" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER"
fi
+if test "x$CURL_DISABLE_MQTT" != "x1"; then
+ SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS MQTT"
+fi
if test "x$CURL_DISABLE_POP3" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS POP3"
if test "x$SSL_ENABLED" = "x1"; then
@@ -42744,9 +44864,10 @@ if test "x$CURL_DISABLE_IMAP" != "x1"; then
fi
if test "x$CURL_DISABLE_SMB" != "x1" \
-a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
- -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
+ -a \( "x$OPENSSL_ENABLED" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \); then
+ -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \
+ -o "x$WOLFSSL_NTLM" = "x1" \); then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB"
if test "x$SSL_ENABLED" = "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMBS"
@@ -42766,6 +44887,9 @@ if test "x$USE_LIBSSH" = "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP"
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
fi
+if test "x$USE_WOLFSSH" = "x1"; then
+ SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
+fi
if test "x$CURL_DISABLE_RTSP" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS RTSP"
fi
@@ -44746,7 +46870,9 @@ $as_echo X/"$am_mf" |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "Something went wrong bootstrapping makefile fragments
- for automatic dependency tracking. Try re-running configure with the
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
'--disable-dependency-tracking' option to at least be able to build
the package (albeit without support for automatic dependency tracking).
See \`config.log' for more details" "$LINENO" 5; }
@@ -45639,6 +47765,7 @@ done
SSH: ${curl_ssh_msg}
zlib: ${curl_zlib_msg}
brotli: ${curl_brotli_msg}
+ zstd: ${curl_zstd_msg}
GSS-API: ${curl_gss_msg}
TLS-SRP: ${curl_tls_srp_msg}
resolver: ${curl_res_msg}
@@ -45663,7 +47790,7 @@ done
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
" >&5
@@ -45682,6 +47809,7 @@ $as_echo "$as_me: Configured to build curl/libcurl:
SSH: ${curl_ssh_msg}
zlib: ${curl_zlib_msg}
brotli: ${curl_brotli_msg}
+ zstd: ${curl_zstd_msg}
GSS-API: ${curl_gss_msg}
TLS-SRP: ${curl_tls_srp_msg}
resolver: ${curl_res_msg}
@@ -45706,7 +47834,7 @@ $as_echo "$as_me: Configured to build curl/libcurl:
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
" >&6;}
diff --git a/configure.ac b/configure.ac
index cb8f4943e..2304775b1 100755
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -31,7 +31,7 @@ XC_OVR_ZZ60
CURL_OVERRIDE_AUTOCONF
dnl configure script copyright
-AC_COPYRIGHT([Copyright (c) 1998 - 2019 Daniel Stenberg, <daniel@haxx.se>
+AC_COPYRIGHT([Copyright (c) 1998 - 2020 Daniel Stenberg, <daniel@haxx.se>
This configure script may be copied, distributed and modified under the
terms of the curl license; see COPYING for more details])
@@ -49,7 +49,7 @@ CURL_CHECK_OPTION_CURLDEBUG
CURL_CHECK_OPTION_SYMBOL_HIDING
CURL_CHECK_OPTION_ARES
CURL_CHECK_OPTION_RT
-CURL_CHECK_OPTION_ESNI
+CURL_CHECK_OPTION_ECH
XC_CHECK_PATH_SEPARATOR
@@ -59,19 +59,6 @@ XC_CHECK_PATH_SEPARATOR
CONFIGURE_OPTIONS="\"$ac_configure_args\""
AC_SUBST(CONFIGURE_OPTIONS)
-CURL_CFLAG_EXTRAS=""
-if test X"$want_werror" = Xyes; then
- CURL_CFLAG_EXTRAS="-Werror"
- if test "$compiler_id" = "GNU_C"; then
- dnl enable -pedantic-errors for GCC 5 and later,
- dnl as before that it was the same as -Werror=pedantic
- if test "$compiler_num" -ge "500"; then
- CURL_CFLAG_EXTRAS="$CURL_CFLAG_EXTRAS -pedantic-errors"
- fi
- fi
-fi
-AC_SUBST(CURL_CFLAG_EXTRAS)
-
dnl SED is mandatory for configure process and libtool.
dnl Set it now, allowing it to be changed later.
if test -z "$SED"; then
@@ -156,10 +143,11 @@ AC_SUBST(PKGADD_VENDOR)
dnl
dnl initialize all the info variables
- curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl} )"
- curl_ssh_msg="no (--with-libssh2)"
+ curl_ssl_msg="no (--with-{ssl,gnutls,nss,mbedtls,wolfssl,schannel,secure-transport,mesalink,amissl,bearssl} )"
+ curl_ssh_msg="no (--with-{libssh,libssh2})"
curl_zlib_msg="no (--with-zlib)"
curl_brotli_msg="no (--with-brotli)"
+ curl_zstd_msg="no (--with-zstd)"
curl_gss_msg="no (--with-gssapi)"
curl_tls_srp_msg="no (--enable-tls-srp)"
curl_res_msg="default (--enable-ares / --enable-threaded-resolver)"
@@ -286,6 +274,19 @@ if test "$compiler_id" = "INTEL_UNIX_C"; then
#
fi
+CURL_CFLAG_EXTRAS=""
+if test X"$want_werror" = Xyes; then
+ CURL_CFLAG_EXTRAS="-Werror"
+ if test "$compiler_id" = "GNU_C"; then
+ dnl enable -pedantic-errors for GCC 5 and later,
+ dnl as before that it was the same as -Werror=pedantic
+ if test "$compiler_num" -ge "500"; then
+ CURL_CFLAG_EXTRAS="$CURL_CFLAG_EXTRAS -pedantic-errors"
+ fi
+ fi
+fi
+AC_SUBST(CURL_CFLAG_EXTRAS)
+
CURL_CHECK_COMPILER_HALT_ON_ERROR
CURL_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
CURL_CHECK_COMPILER_PROTOTYPE_MISMATCH
@@ -502,6 +503,7 @@ AC_HELP_STRING([--disable-proxy],[Disable proxy support]),
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_PROXY, 1, [to disable proxies])
AC_SUBST(CURL_DISABLE_PROXY, [1])
+ https_proxy="no"
;;
*) AC_MSG_RESULT(yes)
;;
@@ -637,6 +639,21 @@ AC_HELP_STRING([--disable-gopher],[Disable Gopher support]),
AC_MSG_RESULT(yes)
)
+AC_MSG_CHECKING([whether to support mqtt])
+AC_ARG_ENABLE(mqtt,
+AC_HELP_STRING([--enable-mqtt],[Enable MQTT support])
+AC_HELP_STRING([--disable-mqtt],[Disable MQTT support]),
+[ case "$enableval" in
+ no)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_MQTT, 1, [to disable MQTT])
+ AC_SUBST(CURL_DISABLE_MQTT, [1])
+ ;;
+ *) AC_MSG_RESULT(yes)
+ ;;
+ esac ],
+ AC_MSG_RESULT(no)
+)
dnl **********************************************************************
dnl Check for built-in manual
@@ -1040,7 +1057,7 @@ if test X"$OPT_BROTLI" != Xno; then
LD_BROTLI=`$PKGCONFIG --libs-only-L libbrotlidec`
CPP_BROTLI=`$PKGCONFIG --cflags-only-I libbrotlidec`
version=`$PKGCONFIG --modversion libbrotlidec`
- DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/-L//'`
+ DIR_BROTLI=`echo $LD_BROTLI | $SED -e 's/^-L//'`
fi
;;
@@ -1100,6 +1117,93 @@ if test X"$OPT_BROTLI" != Xno; then
fi
dnl **********************************************************************
+dnl Check for libzstd
+dnl **********************************************************************
+
+dnl Default to compiler & linker defaults for libzstd
+OPT_ZSTD=off
+AC_ARG_WITH(zstd,dnl
+AC_HELP_STRING([--with-zstd=PATH],[Where to look for libzstd, PATH points to the libzstd installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
+AC_HELP_STRING([--without-zstd], [disable libzstd]),
+ OPT_ZSTD=$withval)
+
+if test X"$OPT_ZSTD" != Xno; then
+ dnl backup the pre-zstd variables
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+ case "$OPT_ZSTD" in
+ yes)
+ dnl --with-zstd (without path) used
+ CURL_CHECK_PKGCONFIG(libzstd)
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIB_ZSTD=`$PKGCONFIG --libs-only-l libzstd`
+ LD_ZSTD=`$PKGCONFIG --libs-only-L libzstd`
+ CPP_ZSTD=`$PKGCONFIG --cflags-only-I libzstd`
+ version=`$PKGCONFIG --modversion libzstd`
+ DIR_ZSTD=`echo $LD_ZSTD | $SED -e 's/-L//'`
+ fi
+
+ ;;
+ off)
+ dnl no --with-zstd option given, just check default places
+ ;;
+ *)
+ dnl use the given --with-zstd spot
+ PREFIX_ZSTD=$OPT_ZSTD
+ ;;
+ esac
+
+ dnl if given with a prefix, we set -L and -I based on that
+ if test -n "$PREFIX_ZSTD"; then
+ LIB_ZSTD="-lzstd"
+ LD_ZSTD=-L${PREFIX_ZSTD}/lib$libsuff
+ CPP_ZSTD=-I${PREFIX_ZSTD}/include
+ DIR_ZSTD=${PREFIX_ZSTD}/lib$libsuff
+ fi
+
+ LDFLAGS="$LDFLAGS $LD_ZSTD"
+ CPPFLAGS="$CPPFLAGS $CPP_ZSTD"
+ LIBS="$LIB_ZSTD $LIBS"
+
+ AC_CHECK_LIB(zstd, ZSTD_createDStream)
+
+ AC_CHECK_HEADERS(zstd.h,
+ curl_zstd_msg="enabled (libzstd)"
+ HAVE_ZSTD=1
+ AC_DEFINE(HAVE_ZSTD, 1, [if libzstd is in use])
+ AC_SUBST(HAVE_ZSTD, [1])
+ )
+
+ if test X"$OPT_ZSTD" != Xoff &&
+ test "$HAVE_ZSTD" != "1"; then
+ AC_MSG_ERROR([libzstd was not found where specified!])
+ fi
+
+ if test "$HAVE_ZSTD" = "1"; then
+ if test -n "$DIR_ZSTD"; then
+ dnl when the zstd shared lib were found in a path that the run-time
+ dnl linker doesn't search through, we need to add it to
+ dnl CURL_LIBRARY_PATH to prevent further configure tests to fail due to
+ dnl this
+
+ if test "x$cross_compiling" != "xyes"; then
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_ZSTD"
+ export CURL_LIBRARY_PATH
+ AC_MSG_NOTICE([Added $DIR_ZSTD to CURL_LIBRARY_PATH])
+ fi
+ fi
+ else
+ dnl no zstd, revert back to clean variables
+ LDFLAGS=$CLEANLDFLAGS
+ CPPFLAGS=$CLEANCPPFLAGS
+ LIBS=$CLEANLIBS
+ fi
+fi
+
+dnl **********************************************************************
dnl Check for LDAP
dnl **********************************************************************
@@ -1203,16 +1307,23 @@ AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]),
;;
esac ],
- AC_TRY_RUN([ /* is AF_INET6 available? */
+ AC_TRY_RUN([ /* are AF_INET6 and sockaddr_in6 available? */
#include <sys/types.h>
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
+#include <ws2tcpip.h>
#else
#include <sys/socket.h>
+#include <netinet/in.h>
+#if defined (__TANDEM)
+# include <netinet/in6.h>
+#endif
#endif
#include <stdlib.h> /* for exit() */
main()
{
+ struct sockaddr_in6 s;
+ (void)s;
if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
exit(1);
else
@@ -1227,8 +1338,12 @@ main()
ipv6=yes
))
-# Check if struct sockaddr_in6 have sin6_scope_id member
if test "$ipv6" = yes; then
+ curl_ipv6_msg="enabled"
+ AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
+ IPV6_ENABLED=1
+ AC_SUBST(IPV6_ENABLED)
+
AC_MSG_CHECKING([if struct sockaddr_in6 has sin6_scope_id member])
AC_TRY_COMPILE([
#include <sys/types.h>
@@ -1255,12 +1370,14 @@ dnl Check if the operating system allows programs to write to their own argv[]
dnl **********************************************************************
AC_MSG_CHECKING([if argv can be written to])
-CURL_RUN_IFELSE([
-int main(int argc, char ** argv) {
- argv[0][0] = ' ';
- return (argv[0][0] == ' ')?0:1;
+CURL_RUN_IFELSE([[
+int main(int argc, char **argv)
+{
+ (void)argc;
+ argv[0][0] = ' ';
+ return (argv[0][0] == ' ')?0:1;
}
-],[
+]],[
curl_cv_writable_argv=yes
],[
curl_cv_writable_argv=no
@@ -1494,29 +1611,29 @@ dnl -------------------------------------------------
dnl check winssl option before other SSL libraries
dnl -------------------------------------------------
-OPT_WINSSL=no
+OPT_SCHANNEL=no
AC_ARG_WITH(winssl,dnl
AC_HELP_STRING([--with-winssl],[enable Windows native SSL/TLS])
AC_HELP_STRING([--without-winssl], [disable Windows native SSL/TLS]),
- OPT_WINSSL=$withval)
+ OPT_SCHANNEL=$withval)
AC_ARG_WITH(schannel,dnl
AC_HELP_STRING([--with-schannel],[enable Windows native SSL/TLS])
AC_HELP_STRING([--without-schannel], [disable Windows native SSL/TLS]),
- OPT_WINSSL=$withval)
+ OPT_SCHANNEL=$withval)
AC_MSG_CHECKING([whether to enable Windows native SSL/TLS (Windows native builds only)])
-if test -z "$ssl_backends" -o "x$OPT_WINSSL" != xno; then
+if test -z "$ssl_backends" -o "x$OPT_SCHANNEL" != xno; then
ssl_msg=
- if test "x$OPT_WINSSL" != "xno" &&
+ if test "x$OPT_SCHANNEL" != "xno" &&
test "x$curl_cv_native_windows" = "xyes"; then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_SCHANNEL, 1, [to enable Windows native SSL/TLS support])
AC_SUBST(USE_SCHANNEL, [1])
ssl_msg="Windows-native"
test schannel != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
- WINSSL_ENABLED=1
- # --with-winssl implies --enable-sspi
+ SCHANNEL_ENABLED=1
+ # --with-schannel implies --enable-sspi
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
AC_SUBST(USE_WINDOWS_SSPI, [1])
curl_sspi_msg="enabled"
@@ -1543,7 +1660,7 @@ AC_HELP_STRING([--without-secure-transport], [disable Apple OS native SSL/TLS]),
AC_MSG_CHECKING([whether to enable Secure Transport])
if test -z "$ssl_backends" -o "x$OPT_SECURETRANSPORT" != xno; then
if test "x$OPT_SECURETRANSPORT" != "xno" &&
- test -d "/System/Library/Frameworks/Security.framework"; then
+ (test "x$cross_compiling" != "xno" || test -d "/System/Library/Frameworks/Security.framework"); then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_SECTRANSP, 1, [enable Secure Transport])
AC_SUBST(USE_SECTRANSP, [1])
@@ -1692,7 +1809,7 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"])
AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"])
- LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/-L//g'`
+ LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/^-L//'`
dnl use the values pkg-config reported. This is here
dnl instead of below with CPPFLAGS and LDFLAGS because we only
@@ -1717,6 +1834,8 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
# only set this if pkg-config wasn't used
CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
fi
+ # Linking previously failed, try extra paths from --with-ssl or pkg-config.
+ # Use a different function name to avoid reusing the earlier cached result.
AC_CHECK_LIB(crypto, HMAC_Init_ex,[
HAVECRYPTO="yes"
LIBS="-lcrypto $LIBS"], [
@@ -1738,6 +1857,7 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
[
AC_MSG_RESULT(no)
dnl ok, so what about both -ldl and -lpthread?
+ dnl This may be necessary for static libraries.
AC_MSG_CHECKING([OpenSSL linking with -ldl and -lpthread])
LIBS="$CLEANLIBS -lcrypto -ldl -lpthread"
@@ -1862,6 +1982,31 @@ if test -z "$ssl_backends" -o "x$OPT_SSL" != xno &&
],[
AC_MSG_RESULT([no])
])
+
+ AC_MSG_CHECKING([for OpenSSL >= v3])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#include <openssl/opensslv.h>
+ ]],[[
+ #if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3)
+ return 0;
+ #else
+ #error older than 3
+ #endif
+ ]])
+ ],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE_UNQUOTED(HAVE_OPENSSL3, 1,
+ [Define to 1 if using OpenSSL 3 or later.])
+ dnl OpenSSLv3 marks the DES functions deprecated but we have no
+ dnl replacements (yet) so tell the compiler to not warn for them
+ dnl
+ dnl Ask OpenSSL to suppress the warnings.
+ CPPFLAGS="$CPPFLAGS -DOPENSSL_SUPPRESS_DEPRECATED"
+ ssl_msg="OpenSSL v3+"
+ ],[
+ AC_MSG_RESULT([no])
+ ])
fi
if test "$OPENSSL_ENABLED" = "1"; then
@@ -1983,7 +2128,7 @@ if test -z "$ssl_backends" -o "x$OPT_GNUTLS" != xno; then
addld=`$PKGCONFIG --libs-only-L gnutls`
addcflags=`$PKGCONFIG --cflags-only-I gnutls`
version=`$PKGCONFIG --modversion gnutls`
- gtlslib=`echo $addld | $SED -e 's/-L//'`
+ gtlslib=`echo $addld | $SED -e 's/^-L//'`
else
dnl without pkg-config, we try libgnutls-config as that was how it
dnl used to be done
@@ -2032,7 +2177,8 @@ if test -z "$ssl_backends" -o "x$OPT_GNUTLS" != xno; then
CPPFLAGS="$CPPFLAGS $addcflags"
fi
- AC_CHECK_LIB(gnutls, gnutls_check_version,
+ dnl this function is selected since it was introduced in 3.1.10
+ AC_CHECK_LIB(gnutls, gnutls_x509_crt_get_dn2,
[
AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled])
AC_SUBST(USE_GNUTLS, [1])
@@ -2060,7 +2206,6 @@ if test -z "$ssl_backends" -o "x$OPT_GNUTLS" != xno; then
AC_MSG_NOTICE([Added $gtlslib to CURL_LIBRARY_PATH])
fi
fi
- AC_CHECK_FUNCS([gnutls_certificate_set_x509_key_file2 gnutls_alpn_set_protocols gnutls_ocsp_req_init])
fi
fi
@@ -2218,6 +2363,15 @@ AC_HELP_STRING([--with-wolfssl=PATH],[where to look for WolfSSL, PATH points to
AC_HELP_STRING([--without-wolfssl], [disable WolfSSL detection]),
OPT_WOLFSSL=$withval)
+case "$OPT_WOLFSSL" in
+ yes|no)
+ wolfpkg=""
+ ;;
+ *)
+ wolfpkg="$withval/lib/pkgconfig"
+ ;;
+esac
+
if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
ssl_msg=
@@ -2227,22 +2381,45 @@ if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
OPT_WOLFSSL=""
fi
+ dnl try pkg-config magic
+ CURL_CHECK_PKGCONFIG(wolfssl, [$wolfpkg])
+ AC_MSG_NOTICE([Check dir $wolfpkg])
+
addld=""
addlib=""
addcflags=""
+ if test "$PKGCONFIG" != "no" ; then
+ addlib=`CURL_EXPORT_PCDIR([$wolfpkg])
+ $PKGCONFIG --libs-only-l wolfssl`
+ addld=`CURL_EXPORT_PCDIR([$wolfpkg])
+ $PKGCONFIG --libs-only-L wolfssl`
+ addcflags=`CURL_EXPORT_PCDIR([$wolfpkg])
+ $PKGCONFIG --cflags-only-I wolfssl`
+ version=`CURL_EXPORT_PCDIR([$wolfpkg])
+ $PKGCONFIG --modversion wolfssl`
+ wolfssllibpath=`echo $addld | $SED -e 's/^-L//'`
+ else
+ addlib=-lwolfssl
+ dnl use system defaults if user does not supply a path
+ if test -n "$OPT_WOLFSSL"; then
+ addld=-L$OPT_WOLFSSL/lib$libsuff
+ addcflags=-I$OPT_WOLFSSL/include
+ wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
+ fi
+ fi
if test "x$USE_WOLFSSL" != "xyes"; then
- addld=-L$OPT_WOLFSSL/lib$libsuff
- addcflags=-I$OPT_WOLFSSL/include
- wolfssllibpath=$OPT_WOLFSSL/lib$libsuff
LDFLAGS="$LDFLAGS $addld"
+ AC_MSG_NOTICE([Add $addld to LDFLAGS])
if test "$addcflags" != "-I/usr/include"; then
CPPFLAGS="$CPPFLAGS $addcflags"
+ AC_MSG_NOTICE([Add $addcflags to CPPFLAGS])
fi
my_ac_save_LIBS="$LIBS"
- LIBS="-lwolfssl -lm $LIBS"
+ LIBS="$addlib $LIBS"
+ AC_MSG_NOTICE([Add $addlib to LIBS])
AC_MSG_CHECKING([for wolfSSL_Init in -lwolfssl])
AC_LINK_IFELSE([
@@ -2280,13 +2457,38 @@ if test -z "$ssl_backends" -o "x$OPT_WOLFSSL" != xno; then
dnl wolfssl/ctaocrypt/types.h needs SIZEOF_LONG_LONG defined!
AX_COMPILE_CHECK_SIZEOF(long long)
- LIBS="-lwolfssl -lm $LIBS"
+ LIBS="$addlib -lm $LIBS"
dnl Recent WolfSSL versions build without SSLv3 by default
dnl WolfSSL needs configure --enable-opensslextra to have *get_peer*
+ dnl DES* is needed for NTLM support and lives in the OpenSSL compatibility
+ dnl layer
AC_CHECK_FUNCS(wolfSSLv3_client_method \
wolfSSL_get_peer_certificate \
- wolfSSL_UseALPN)
+ wolfSSL_UseALPN )
+
+ dnl if this symbol is present, we want the include path to include the
+ dnl OpenSSL API root as well
+ AC_CHECK_FUNC(wolfSSL_DES_ecb_encrypt,
+ [
+ AC_DEFINE(HAVE_WOLFSSL_DES_ECB_ENCRYPT, 1,
+ [if you have wolfSSL_DES_ecb_encrypt])
+ if test -n "$addcflags"; then
+ dnl use a for loop to strip off whitespace
+ for f in $addcflags; do
+ CPPFLAGS="$f/wolfssl $CPPFLAGS"
+ AC_MSG_NOTICE([Add $f/wolfssl to CPPFLAGS])
+ break
+ done
+ else
+ dnl user didn't give a path, so guess/hope they installed wolfssl
+ dnl headers to system default location
+ CPPFLAGS="-I$includedir/wolfssl $CPPFLAGS"
+ AC_MSG_NOTICE([Add $includedir/wolfssl to CPPFLAGS])
+ fi
+ WOLFSSL_NTLM=1
+ ]
+ )
if test -n "$wolfssllibpath"; then
dnl when shared libs were found in a path that the run-time
@@ -2400,6 +2602,98 @@ if test -z "$ssl_backends" -o "x$OPT_MESALINK" != xno; then
fi
dnl ----------------------------------------------------
+dnl check for BearSSL
+dnl ----------------------------------------------------
+
+OPT_BEARSSL=no
+
+_cppflags=$CPPFLAGS
+_ldflags=$LDFLAGS
+AC_ARG_WITH(bearssl,dnl
+AC_HELP_STRING([--with-bearssl=PATH],[where to look for BearSSL, PATH points to the installation root])
+AC_HELP_STRING([--without-bearssl], [disable BearSSL detection]),
+ OPT_BEARSSL=$withval)
+
+if test -z "$ssl_backends" -o "x$OPT_BEARSSL" != xno; then
+ ssl_msg=
+
+ if test X"$OPT_BEARSSL" != Xno; then
+
+ if test "$OPT_BEARSSL" = "yes"; then
+ OPT_BEARSSL=""
+ fi
+
+ if test -z "$OPT_BEARSSL" ; then
+ dnl check for lib first without setting any new path
+
+ AC_CHECK_LIB(bearssl, br_ssl_client_init_full,
+ dnl libbearssl found, set the variable
+ [
+ AC_DEFINE(USE_BEARSSL, 1, [if BearSSL is enabled])
+ AC_SUBST(USE_BEARSSL, [1])
+ BEARSSL_ENABLED=1
+ USE_BEARSSL="yes"
+ ssl_msg="BearSSL"
+ test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ ], [], -lbearssl)
+ fi
+
+ addld=""
+ addlib=""
+ addcflags=""
+ bearssllib=""
+
+ if test "x$USE_BEARSSL" != "xyes"; then
+ dnl add the path and test again
+ addld=-L$OPT_BEARSSL/lib$libsuff
+ addcflags=-I$OPT_BEARSSL/include
+ bearssllib=$OPT_BEARSSL/lib$libsuff
+
+ LDFLAGS="$LDFLAGS $addld"
+ if test "$addcflags" != "-I/usr/include"; then
+ CPPFLAGS="$CPPFLAGS $addcflags"
+ fi
+
+ AC_CHECK_LIB(bearssl, br_ssl_client_init_full,
+ [
+ AC_DEFINE(USE_BEARSSL, 1, [if BearSSL is enabled])
+ AC_SUBST(USE_BEARSSL, [1])
+ BEARSSL_ENABLED=1
+ USE_BEARSSL="yes"
+ ssl_msg="BearSSL"
+ test bearssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
+ ],
+ [
+ CPPFLAGS=$_cppflags
+ LDFLAGS=$_ldflags
+ ], -lbearssl)
+ fi
+
+ if test "x$USE_BEARSSL" = "xyes"; then
+ AC_MSG_NOTICE([detected BearSSL])
+ check_for_ca_bundle=1
+
+ LIBS="-lbearssl $LIBS"
+
+ if test -n "$bearssllib"; then
+ dnl when shared libs were found in a path that the run-time
+ dnl linker doesn't search through, we need to add it to
+ dnl CURL_LIBRARY_PATH to prevent further configure tests to fail
+ dnl due to this
+ if test "x$cross_compiling" != "xyes"; then
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$bearssllib"
+ export CURL_LIBRARY_PATH
+ AC_MSG_NOTICE([Added $bearssllib to CURL_LIBRARY_PATH])
+ fi
+ fi
+ fi
+
+ fi dnl BearSSL not disabled
+
+ test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
+fi
+
+dnl ----------------------------------------------------
dnl NSS. Only check if GnuTLS and OpenSSL are not enabled
dnl ----------------------------------------------------
@@ -2529,10 +2823,10 @@ if test -z "$ssl_backends" -o "x$OPT_NSS" != xno; then
test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
fi
-case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$WINSSL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$AMISSL_ENABLED" in
+case "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$MBEDTLS_ENABLED$WOLFSSL_ENABLED$SCHANNEL_ENABLED$SECURETRANSPORT_ENABLED$MESALINK_ENABLED$BEARSSL_ENABLED$AMISSL_ENABLED" in
x)
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
- AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink or --with-amissl to address this.])
+ AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-wolfssl, --with-mbedtls, --with-nss, --with-schannel, --with-secure-transport, --with-mesalink, --with-amissl or --with-bearssl to address this.])
;;
x1)
# one SSL backend is enabled
@@ -2641,7 +2935,7 @@ if test X"$OPT_LIBMETALINK" != Xno; then
$PKGCONFIG --cflags-only-I libmetalink`
version=`CURL_EXPORT_PCDIR([$LIBMETALINK_PCDIR]) dnl
$PKGCONFIG --modversion libmetalink`
- libmetalinklib=`echo $addld | $SED -e 's/-L//'`
+ libmetalinklib=`echo $addld | $SED -e 's/^-L//'`
fi
if test -n "$addlib"; then
@@ -2667,6 +2961,12 @@ if test X"$OPT_LIBMETALINK" != Xno; then
AC_MSG_NOTICE([libmetalink library defective or too old])
want_metalink="no"
])
+ if test "x$OPENSSL_ENABLED" != "x1" -a "x$USE_WINDOWS_SSPI" != "x1" \
+ -a "x$GNUTLS_ENABLED" != "x1" -a "x$NSS_ENABLED" != "x1" \
+ -a "x$SECURETRANSPORT_ENABLED" != "x1"; then
+ AC_MSG_WARN([metalink support requires a compatible SSL/TLS backend])
+ want_metalink="no"
+ fi
CPPFLAGS="$clean_CPPFLAGS"
LDFLAGS="$clean_LDFLAGS"
LIBS="$clean_LIBS"
@@ -2692,17 +2992,23 @@ dnl **********************************************************************
dnl Default to compiler & linker defaults for LIBSSH2 files & libraries.
OPT_LIBSSH2=off
AC_ARG_WITH(libssh2,dnl
-AC_HELP_STRING([--with-libssh2=PATH],[Where to look for libssh2, PATH points to the LIBSSH2 installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
-AC_HELP_STRING([--with-libssh2], [enable LIBSSH2]),
+AC_HELP_STRING([--with-libssh2=PATH],[Where to look for libssh2, PATH points to the libssh2 installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
+AC_HELP_STRING([--with-libssh2], [enable libssh2]),
OPT_LIBSSH2=$withval, OPT_LIBSSH2=no)
OPT_LIBSSH=off
AC_ARG_WITH(libssh,dnl
-AC_HELP_STRING([--with-libssh=PATH],[Where to look for libssh, PATH points to the LIBSSH installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
-AC_HELP_STRING([--with-libssh], [enable LIBSSH]),
+AC_HELP_STRING([--with-libssh=PATH],[Where to look for libssh, PATH points to the libssh installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
+AC_HELP_STRING([--with-libssh], [enable libssh]),
OPT_LIBSSH=$withval, OPT_LIBSSH=no)
+OPT_WOLFSSH=off
+AC_ARG_WITH(wolfssh,dnl
+AC_HELP_STRING([--with-wolfssh=PATH],[Where to look for wolfssh, PATH points to the wolfSSH installation; when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
+AC_HELP_STRING([--with-wolfssh], [enable wolfssh]),
+ OPT_WOLFSSH=$withval, OPT_WOLFSSH=no)
+
if test X"$OPT_LIBSSH2" != Xno; then
dnl backup the pre-libssh2 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -2719,7 +3025,7 @@ if test X"$OPT_LIBSSH2" != Xno; then
LD_SSH2=`$PKGCONFIG --libs-only-L libssh2`
CPP_SSH2=`$PKGCONFIG --cflags-only-I libssh2`
version=`$PKGCONFIG --modversion libssh2`
- DIR_SSH2=`echo $LD_SSH2 | $SED -e 's/-L//'`
+ DIR_SSH2=`echo $LD_SSH2 | $SED -e 's/^-L//'`
fi
;;
@@ -2792,7 +3098,7 @@ elif test X"$OPT_LIBSSH" != Xno; then
LD_SSH=`$PKGCONFIG --libs-only-L libssh`
CPP_SSH=`$PKGCONFIG --cflags-only-I libssh`
version=`$PKGCONFIG --modversion libssh`
- DIR_SSH=`echo $LD_SSH | $SED -e 's/-L//'`
+ DIR_SSH=`echo $LD_SSH | $SED -e 's/^-L//'`
fi
;;
@@ -2849,6 +3155,28 @@ elif test X"$OPT_LIBSSH" != Xno; then
CPPFLAGS=$CLEANCPPFLAGS
LIBS=$CLEANLIBS
fi
+elif test X"$OPT_WOLFSSH" != Xno; then
+ dnl backup the pre-wolfssh variables
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+
+ if test "$OPT_WOLFSSH" != yes; then
+ WOLFCONFIG="$OPT_WOLFSSH/bin/wolfssh-config"
+ LDFLAGS="$LDFLAGS `$WOLFCONFIG --libs`"
+ CPPFLAGS="$CPPFLAGS `$WOLFCONFIG --cflags`"
+ fi
+
+ AC_CHECK_LIB(wolfssh, wolfSSH_Init)
+
+ AC_CHECK_HEADERS(wolfssh/ssh.h,
+ curl_ssh_msg="enabled (wolfSSH)"
+ WOLFSSH_ENABLED=1
+ AC_DEFINE(USE_WOLFSSH, 1, [if wolfSSH is in use])
+ AC_SUBST(USE_WOLFSSH, [1])
+ )
+
fi
dnl **********************************************************************
@@ -2878,7 +3206,7 @@ if test X"$OPT_LIBRTMP" != Xno; then
LD_RTMP=`$PKGCONFIG --libs-only-L librtmp`
CPP_RTMP=`$PKGCONFIG --cflags-only-I librtmp`
version=`$PKGCONFIG --modversion librtmp`
- DIR_RTMP=`echo $LD_RTMP | $SED -e 's/-L//'`
+ DIR_RTMP=`echo $LD_RTMP | $SED -e 's/^-L//'`
else
dnl To avoid link errors, we do not allow --librtmp without
dnl a pkgconfig file
@@ -2958,7 +3286,7 @@ AC_HELP_STRING([--disable-versioned-symbols], [Disable versioned symbols in shar
versioned_symbols_flavour="NSS_"
elif test "x$WOLFSSL_ENABLED" = "x1"; then
versioned_symbols_flavour="WOLFSSL_"
- elif test "x$WINSSL_ENABLED" = "x1"; then
+ elif test "x$SCHANNEL_ENABLED" = "x1"; then
versioned_symbols_flavour="SCHANNEL_"
elif test "x$SECURETRANSPORT_ENABLED" = "x1"; then
versioned_symbols_flavour="SECURE_TRANSPORT_"
@@ -3114,7 +3442,7 @@ if test "$want_idn" = "yes"; then
$PKGCONFIG --libs-only-L libidn2 2>/dev/null`
IDN_CPPFLAGS=`CURL_EXPORT_PCDIR([$IDN_PCDIR]) dnl
$PKGCONFIG --cflags-only-I libidn2 2>/dev/null`
- IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/-L//'`
+ IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/^-L//'`
else
dnl pkg-config not available or provides no info
IDN_LIBS="-lidn2"
@@ -3129,7 +3457,7 @@ if test "$want_idn" = "yes"; then
IDN_LIBS=`$PKGCONFIG --libs-only-l libidn2 2>/dev/null`
IDN_LDFLAGS=`$PKGCONFIG --libs-only-L libidn2 2>/dev/null`
IDN_CPPFLAGS=`$PKGCONFIG --cflags-only-I libidn2 2>/dev/null`
- IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/-L//'`
+ IDN_DIR=`echo $IDN_LDFLAGS | $SED -e 's/^-L//'`
else
dnl pkg-config not available or provides no info
IDN_LIBS="-lidn2"
@@ -3222,7 +3550,7 @@ case "$OPT_H2" in
;;
esac
-curl_h2_msg="disabled (--with-nghttp2)"
+curl_h2_msg="no (--with-nghttp2)"
if test X"$want_h2" != Xno; then
dnl backup the pre-nghttp2 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -3248,9 +3576,9 @@ if test X"$want_h2" != Xno; then
CPPFLAGS="$CPPFLAGS $CPP_H2"
LIBS="$LIB_H2 $LIBS"
- # use nghttp2_option_set_no_recv_client_magic to require nghttp2
- # >= 1.0.0
- AC_CHECK_LIB(nghttp2, nghttp2_option_set_no_recv_client_magic,
+ # use nghttp2_session_set_local_window_size to require nghttp2
+ # >= 1.12.0
+ AC_CHECK_LIB(nghttp2, nghttp2_session_set_local_window_size,
[
AC_CHECK_HEADERS(nghttp2/nghttp2.h,
curl_h2_msg="enabled (nghttp2)"
@@ -3281,7 +3609,7 @@ dnl Check for ngtcp2 (QUIC)
dnl **********************************************************************
OPT_TCP2="yes"
-curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"
+curl_h3_msg="no (--with-ngtcp2, --with-quiche)"
if test "x$disable_http" = "xyes"; then
# without HTTP, ngtcp2 is no use
@@ -3309,7 +3637,7 @@ case "$OPT_TCP2" in
;;
esac
-curl_tcp2_msg="disabled (--with-ngtcp2)"
+curl_tcp2_msg="no (--with-ngtcp2)"
if test X"$want_tcp2" != Xno; then
dnl backup the pre-ngtcp2 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -3336,7 +3664,7 @@ if test X"$want_tcp2" != Xno; then
LIBS="$LIB_TCP2 $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
+ DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/^-L//'`
fi
AC_CHECK_LIB(ngtcp2, ngtcp2_conn_client_new,
[
@@ -3366,7 +3694,7 @@ if test X"$want_tcp2" != Xno; then
fi
-if test "x$NGTCP2_ENABLED" = "x1"; then
+if test "x$NGTCP2_ENABLED" = "x1" -a "x$OPENSSL_ENABLED" = "x1"; then
dnl backup the pre-ngtcp2_crypto_openssl variables
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
@@ -3392,7 +3720,7 @@ if test "x$NGTCP2_ENABLED" = "x1"; then
LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
+ DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/^-L//'`
fi
AC_CHECK_LIB(ngtcp2_crypto_openssl, ngtcp2_crypto_ctx_initial,
[
@@ -3421,6 +3749,61 @@ if test "x$NGTCP2_ENABLED" = "x1"; then
fi
fi
+if test "x$NGTCP2_ENABLED" = "x1" -a "x$GNUTLS_ENABLED" = "x1"; then
+ dnl backup the pre-ngtcp2_crypto_gnutls variables
+ CLEANLDFLAGS="$LDFLAGS"
+ CLEANCPPFLAGS="$CPPFLAGS"
+ CLEANLIBS="$LIBS"
+
+ CURL_CHECK_PKGCONFIG(libngtcp2_crypto_gnutls, $want_tcp2_path)
+
+ if test "$PKGCONFIG" != "no" ; then
+ LIB_NGTCP2_CRYPTO_GNUTLS=`CURL_EXPORT_PCDIR([$want_tcp2_path])
+ $PKGCONFIG --libs-only-l libngtcp2_crypto_gnutls`
+ AC_MSG_NOTICE([-l is $LIB_NGTCP2_CRYPTO_GNUTLS])
+
+ CPP_NGTCP2_CRYPTO_GNUTLS=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
+ $PKGCONFIG --cflags-only-I libngtcp2_crypto_gnutls`
+ AC_MSG_NOTICE([-I is $CPP_NGTCP2_CRYPTO_GNUTLS])
+
+ LD_NGTCP2_CRYPTO_GNUTLS=`CURL_EXPORT_PCDIR([$want_tcp2_path])
+ $PKGCONFIG --libs-only-L libngtcp2_crypto_gnutls`
+ AC_MSG_NOTICE([-L is $LD_NGTCP2_CRYPTO_GNUTLS])
+
+ LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_GNUTLS"
+ CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_GNUTLS"
+ LIBS="$LIB_NGTCP2_CRYPTO_GNUTLS $LIBS"
+
+ if test "x$cross_compiling" != "xyes"; then
+ DIR_NGTCP2_CRYPTO_GNUTLS=`echo $LD_NGTCP2_CRYPTO_GNUTLS | $SED -e 's/^-L//'`
+ fi
+ AC_CHECK_LIB(ngtcp2_crypto_gnutls, ngtcp2_crypto_ctx_initial,
+ [
+ AC_CHECK_HEADERS(ngtcp2/ngtcp2_crypto.h,
+ NGTCP2_ENABLED=1
+ AC_DEFINE(USE_NGTCP2_CRYPTO_GNUTLS, 1, [if ngtcp2_crypto_gnutls is in use])
+ AC_SUBST(USE_NGTCP2_CRYPTO_GNUTLS, [1])
+ CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_GNUTLS"
+ export CURL_LIBRARY_PATH
+ AC_MSG_NOTICE([Added $DIR_NGTCP2_CRYPTO_GNUTLS to CURL_LIBRARY_PATH])
+ )
+ ],
+ dnl not found, revert back to clean variables
+ LDFLAGS=$CLEANLDFLAGS
+ CPPFLAGS=$CLEANCPPFLAGS
+ LIBS=$CLEANLIBS
+ )
+
+ else
+ dnl no ngtcp2_crypto_gnutls pkg-config found, deal with it
+ if test X"$want_tcp2" != Xdefault; then
+ dnl To avoid link errors, we do not allow --with-ngtcp2 without
+ dnl a pkgconfig file
+ AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2_crypto_gnutls pkg-config file.])
+ fi
+ fi
+fi
+
dnl **********************************************************************
dnl Check for nghttp3 (HTTP/3 with ngtcp2)
dnl **********************************************************************
@@ -3453,7 +3836,7 @@ case "$OPT_NGHTTP3" in
;;
esac
-curl_http3_msg="disabled (--with-nghttp3)"
+curl_http3_msg="no (--with-nghttp3)"
if test X"$want_nghttp3" != Xno; then
dnl backup the pre-nghttp3 variables
CLEANLDFLAGS="$LDFLAGS"
@@ -3480,7 +3863,7 @@ if test X"$want_nghttp3" != Xno; then
LIBS="$LIB_NGHTTP3 $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
+ DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/^-L//'`
fi
AC_CHECK_LIB(nghttp3, nghttp3_conn_client_new,
[
@@ -3570,7 +3953,7 @@ if test X"$want_quiche" != Xno; then
LIBS="$LIB_QUICHE $LIBS"
if test "x$cross_compiling" != "xyes"; then
- DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
+ DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/^-L//'`
fi
AC_CHECK_LIB(quiche, quiche_connect,
[
@@ -3581,6 +3964,7 @@ if test X"$want_quiche" != Xno; then
QUICHE_ENABLED=1
AC_DEFINE(USE_QUICHE, 1, [if quiche is in use])
AC_SUBST(USE_QUICHE, [1])
+ AC_CHECK_FUNCS([quiche_conn_set_qlog_fd])
CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
export CURL_LIBRARY_PATH
AC_MSG_NOTICE([Added $DIR_QUICHE to CURL_LIBRARY_PATH]),
@@ -3592,9 +3976,9 @@ if test X"$want_quiche" != Xno; then
LIBS=$CLEANLIBS
)
else
- dnl no nghttp3 pkg-config found, deal with it
+ dnl no quiche pkg-config found, deal with it
if test X"$want_quiche" != Xdefault; then
- dnl To avoid link errors, we do not allow --with-nghttp3 without
+ dnl To avoid link errors, we do not allow --with-quiche without
dnl a pkgconfig file
AC_MSG_ERROR([--with-quiche was specified but could not find quiche pkg-config file.])
fi
@@ -3725,6 +4109,8 @@ dnl default includes
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -3823,6 +4209,19 @@ AC_CHECK_TYPE(sa_family_t,
#endif
])
+# check for suseconds_t
+AC_CHECK_TYPE([suseconds_t],[
+ AC_DEFINE(HAVE_SUSECONDS_T, 1,
+ [Define to 1 if suseconds_t is an available type.])
+], ,[
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+])
+
AC_MSG_CHECKING([if time_t is unsigned])
CURL_RUN_IFELSE(
[
@@ -3960,15 +4359,6 @@ AC_CHECK_FUNCS([fnmatch \
fi
])
-if test "$ipv6" = "yes"; then
- if test "$curl_cv_func_getaddrinfo" = "yes"; then
- AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support])
- IPV6_ENABLED=1
- AC_SUBST(IPV6_ENABLED)
- curl_ipv6_msg="enabled"
- fi
-fi
-
CURL_CHECK_NONBLOCKING_SOCKET
dnl ************************************************************
@@ -4085,9 +4475,17 @@ if test "$want_pthreads" != "no"; then
AC_CHECK_HEADER(pthread.h,
[ AC_DEFINE(HAVE_PTHREAD_H, 1, [if you have <pthread.h>])
save_CFLAGS="$CFLAGS"
-
- dnl first check for function without lib
+ dnl When statically linking against boringssl, -lpthread is added to LIBS.
+ dnl Make sure to that this does not pass the check below, we really want
+ dnl -pthread in CFLAGS as recommended for GCC. This also ensures that
+ dnl lib1541 and lib1565 tests are built with these options. Otherwise
+ dnl they fail the build since tests/libtest/Makefile.am clears LIBS.
+ save_LIBS="$LIBS"
+
+ LIBS=
+ dnl Check for libc variants without a separate pthread lib like bionic
AC_CHECK_FUNC(pthread_create, [USE_THREADS_POSIX=1] )
+ LIBS="$save_LIBS"
dnl on HPUX, life is more complicated...
case $host in
@@ -4131,6 +4529,8 @@ if test "$want_thres" = "yes" && test "x$USE_THREADS_POSIX" != "x1"; then
fi
fi
+CURL_CONVERT_INCLUDE_TO_ISYSTEM
+
dnl ************************************************************
dnl disable verbose text strings
dnl
@@ -4170,16 +4570,16 @@ AC_HELP_STRING([--disable-sspi],[Disable SSPI]),
fi
;;
*)
- if test "x$WINSSL_ENABLED" = "x1"; then
- # --with-winssl implies --enable-sspi
+ if test "x$SCHANNEL_ENABLED" = "x1"; then
+ # --with-schannel implies --enable-sspi
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
;;
esac ],
- if test "x$WINSSL_ENABLED" = "x1"; then
- # --with-winssl implies --enable-sspi
+ if test "x$SCHANNEL_ENABLED" = "x1"; then
+ # --with-schannel implies --enable-sspi
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
@@ -4287,6 +4687,24 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
)
dnl ************************************************************
+dnl disable socketpair
+dnl
+AC_MSG_CHECKING([whether to support socketpair])
+AC_ARG_ENABLE(socketpair,
+AC_HELP_STRING([--enable-socketpair],[Enable socketpair support])
+AC_HELP_STRING([--disable-socketpair],[Disable socketpair support]),
+[ case "$enableval" in
+ no)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_SOCKETPAIR, 1, [to disable socketpair support])
+ ;;
+ *) AC_MSG_RESULT(yes)
+ ;;
+ esac ],
+ AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
dnl disable HTTP authentication support
dnl
AC_MSG_CHECKING([whether to support HTTP authentication])
@@ -4400,7 +4818,7 @@ dnl
AC_MSG_CHECKING([whether to support DNS shuffling])
AC_ARG_ENABLE(dnsshuffle,
AC_HELP_STRING([--enable-dnsshuffle],[Enable DNS shuffling])
-AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shufflinf]),
+AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shuffling]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
@@ -4413,6 +4831,24 @@ AC_HELP_STRING([--disable-dnsshuffle],[Disable DNS shufflinf]),
)
dnl ************************************************************
+dnl disable the curl_easy_options API
+dnl
+AC_MSG_CHECKING([whether to support curl_easy_option*])
+AC_ARG_ENABLE(get-easy-option,
+AC_HELP_STRING([--enable-get-easy-options],[Enable curl_easy_options])
+AC_HELP_STRING([--disable-get-easy-options],[Disable curl_easy_options]),
+[ case "$enableval" in
+ no)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(CURL_DISABLE_GETOPTIONS, 1, [to disable curl_easy_options])
+ ;;
+ *) AC_MSG_RESULT(yes)
+ ;;
+ esac ],
+ AC_MSG_RESULT(yes)
+)
+
+dnl ************************************************************
dnl switch on/off alt-svc
dnl
curl_altsvc_msg="no (--enable-alt-svc)";
@@ -4438,32 +4874,32 @@ if test "$enable_altsvc" = "yes"; then
fi
dnl *************************************************************
-dnl check whether ESNI support, if desired, is actually available
+dnl check whether ECH support, if desired, is actually available
dnl
-if test "x$want_esni" != "xno"; then
- AC_MSG_CHECKING([whether ESNI support is available])
+if test "x$want_ech" != "xno"; then
+ AC_MSG_CHECKING([whether ECH support is available])
dnl assume NOT and look for sufficient condition
- ESNI_ENABLED=0
- ESNI_SUPPORT=''
+ ECH_ENABLED=0
+ ECH_SUPPORT=''
- dnl OpenSSL with a chosen ESNI function should be enough
+ dnl OpenSSL with a chosen ECH function should be enough
dnl so more exhaustive checking seems unnecessary for now
- if test "x$OPENSSL_ENABLED" == "x1"; then
- AC_CHECK_FUNCS(SSL_get_esni_status,
- ESNI_SUPPORT="ESNI support available (OpenSSL with SSL_get_esni_status)"
- ESNI_ENABLED=1)
+ if test "x$OPENSSL_ENABLED" = "x1"; then
+ AC_CHECK_FUNCS(SSL_get_ech_status,
+ ECH_SUPPORT="ECH support available (OpenSSL with SSL_get_ech_status)"
+ ECH_ENABLED=1)
dnl add 'elif' chain here for additional implementations
fi
dnl now deal with whatever we found
- if test "x$ESNI_ENABLED" == "x1"; then
- AC_DEFINE(USE_ESNI, 1, [if ESNI support is available])
- AC_MSG_RESULT($ESNI_SUPPORT)
- experimental="$experimental ESNI"
+ if test "x$ECH_ENABLED" = "x1"; then
+ AC_DEFINE(USE_ECH, 1, [if ECH support is available])
+ AC_MSG_RESULT($ECH_SUPPORT)
+ experimental="$experimental ECH"
else
- AC_MSG_ERROR([--enable-esni ignored: No ESNI support found])
+ AC_MSG_ERROR([--enable-ech ignored: No ECH support found])
fi
fi
@@ -4498,6 +4934,13 @@ dnl to let curl-config output the static libraries correctly
ENABLE_STATIC="$enable_static"
AC_SUBST(ENABLE_STATIC)
+dnl merge the pkg-config Libs.private field into Libs when static-only
+if test "x$enable_shared" = "xno"; then
+ LIBCURL_NO_SHARED=$LIBCURL_LIBS
+else
+ LIBCURL_NO_SHARED=
+fi
+AC_SUBST(LIBCURL_NO_SHARED)
dnl
dnl For keeping supported features and protocols also in pkg-config file
@@ -4521,6 +4964,9 @@ fi
if test "x$HAVE_BROTLI" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES brotli"
fi
+if test "x$HAVE_ZSTD" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES zstd"
+fi
if test "x$USE_ARES" = "x1" -o "x$USE_THREADS_POSIX" = "x1" \
-o "x$USE_THREADS_WIN32" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES AsynchDNS"
@@ -4557,7 +5003,8 @@ fi
if test "x$CURL_DISABLE_CRYPTO_AUTH" != "x1"; then
if test "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1"; then
+ -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \
+ -o "x$WOLFSSL_NTLM" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM"
if test "x$CURL_DISABLE_HTTP" != "x1" -a \
@@ -4583,15 +5030,22 @@ if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi
-if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+dnl if not explictily turned off, HTTPS-proxy comes with some TLS backends
+if test "x$https_proxy" != "xno"; then
+ if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
+ -o "x$NSS_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES HTTPS-proxy"
+ fi
fi
-if test "x$ESNI_ENABLED" = "x1"; then
- SUPPORT_FEATURES="$SUPPORT_FEATURES ESNI"
+if test "x$ECH_ENABLED" = "x1"; then
+ SUPPORT_FEATURES="$SUPPORT_FEATURES ECH"
fi
+dnl replace spaces with newlines
+dnl sort the lines
+dnl replace the newlines back to spaces
+SUPPORT_FEATURES=`echo $SUPPORT_FEATURES | tr ' ' '\012' | sort | tr '\012' ' '`
AC_SUBST(SUPPORT_FEATURES)
dnl For supported protocols in pkg-config file
@@ -4631,6 +5085,9 @@ fi
if test "x$CURL_DISABLE_GOPHER" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER"
fi
+if test "x$CURL_DISABLE_MQTT" != "x1"; then
+ SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS MQTT"
+fi
if test "x$CURL_DISABLE_POP3" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS POP3"
if test "x$SSL_ENABLED" = "x1"; then
@@ -4645,9 +5102,10 @@ if test "x$CURL_DISABLE_IMAP" != "x1"; then
fi
if test "x$CURL_DISABLE_SMB" != "x1" \
-a "x$CURL_DISABLE_CRYPTO_AUTH" != "x1" \
- -a \( "x$OPENSSL_ENABLED" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
+ -a \( "x$OPENSSL_ENABLED" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$MBEDTLS_ENABLED" = "x1" \
- -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \); then
+ -o "x$NSS_ENABLED" = "x1" -o "x$SECURETRANSPORT_ENABLED" = "x1" \
+ -o "x$WOLFSSL_NTLM" = "x1" \); then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMB"
if test "x$SSL_ENABLED" = "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SMBS"
@@ -4667,6 +5125,9 @@ if test "x$USE_LIBSSH" = "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP"
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
fi
+if test "x$USE_WOLFSSH" = "x1"; then
+ SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
+fi
if test "x$CURL_DISABLE_RTSP" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS RTSP"
fi
@@ -4751,6 +5212,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
SSH: ${curl_ssh_msg}
zlib: ${curl_zlib_msg}
brotli: ${curl_brotli_msg}
+ zstd: ${curl_zstd_msg}
GSS-API: ${curl_gss_msg}
TLS-SRP: ${curl_tls_srp_msg}
resolver: ${curl_res_msg}
@@ -4775,7 +5237,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
Alt-svc: ${curl_altsvc_msg}
HTTP2: ${curl_h2_msg}
HTTP3: ${curl_h3_msg}
- ESNI: ${curl_esni_msg}
+ ECH: ${curl_ech_msg}
Protocols: ${SUPPORT_PROTOCOLS}
Features: ${SUPPORT_FEATURES}
])
diff --git a/curl-config.in b/curl-config.in
index 0a7e0353f..18b1fc1e6 100644
--- a/curl-config.in
+++ b/curl-config.in
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2001 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2001 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -160,7 +160,7 @@ while test $# -gt 0; do
else
CURLLIBDIR=""
fi
- if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then
+ if test "X@ENABLE_SHARED@" = "Xno"; then
echo ${CURLLIBDIR}-lcurl @LIBCURL_LIBS@
else
echo ${CURLLIBDIR}-lcurl
diff --git a/depcomp b/depcomp
index 65cbf7093..6b391623c 100755
--- a/depcomp
+++ b/depcomp
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/docs/ALTSVC.md b/docs/ALTSVC.md
index 48401415b..6a462bbbc 100644
--- a/docs/ALTSVC.md
+++ b/docs/ALTSVC.md
@@ -27,7 +27,7 @@ space separated fields.
4. The ALPN id for the destination host
5. The host name for the destination host
6. The host number for the destination host
-7. The expiration date and time of this entry withing double quotes. The date format is "YYYYMMDD HH:MM:SS" and the time zone is GMT.
+7. The expiration date and time of this entry within double quotes. The date format is "YYYYMMDD HH:MM:SS" and the time zone is GMT.
8. Boolean (1 or 0) if "persist" was set for this entry
9. Integer priority value (not currently used)
diff --git a/docs/BUGS b/docs/BUGS
deleted file mode 100644
index 480e0caec..000000000
--- a/docs/BUGS
+++ /dev/null
@@ -1,302 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-BUGS
-
- 1. Bugs
- 1.1 There are still bugs
- 1.2 Where to report
- 1.3 Security bugs
- 1.4 What to report
- 1.5 libcurl problems
- 1.6 Who will fix the problems
- 1.7 How to get a stack trace
- 1.8 Bugs in libcurl bindings
- 1.9 Bugs in old versions
-
- 2. Bug fixing procedure
- 2.1 What happens on first filing
- 2.2 First response
- 2.3 Not reproducible
- 2.4 Unresponsive
- 2.5 Lack of time/interest
- 2.6 KNOWN_BUGS
- 2.7 TODO
- 2.8 Closing off stalled bugs
-
-==============================================================================
-
-1.1 There are still bugs
-
- Curl and libcurl keep being developed. Adding features and changing code
- means that bugs will sneak in, no matter how hard we try not to.
-
- Of course there are lots of bugs left. And lots of misfeatures.
-
- To help us make curl the stable and solid product we want it to be, we need
- bug reports and bug fixes.
-
-1.2 Where to report
-
- If you can't fix a bug yourself and submit a fix for it, try to report an as
- detailed report as possible to a curl mailing list to allow one of us to
- have a go at a solution. You can optionally also post your bug/problem at
- curl's bug tracking system over at
-
- https://github.com/curl/curl/issues
-
- Please read the rest of this document below first before doing that!
-
- If you feel you need to ask around first, find a suitable mailing list and
- post there. The lists are available on https://curl.haxx.se/mail/
-
-1.3 Security bugs
-
- If you find a bug or problem in curl or libcurl that you think has a
- security impact, for example a bug that can put users in danger or make them
- vulnerable if the bug becomes public knowledge, then please report that bug
- using our security development process.
-
- Security related bugs or bugs that are suspected to have a security impact,
- should be reported on the curl security tracker at HackerOne:
-
- https://hackerone.com/curl
-
- This ensures that the report reaches the curl security team so that they
- first can be deal with the report away from the public to minimize the harm
- and impact it will have on existing users out there who might be using the
- vulnerable versions.
-
- The curl project's process for handling security related issues is
- documented here:
-
- https://curl.haxx.se/dev/secprocess.html
-
-1.4 What to report
-
- When reporting a bug, you should include all information that will help us
- understand what's wrong, what you expected to happen and how to repeat the
- bad behavior. You therefore need to tell us:
-
- - your operating system's name and version number
-
- - what version of curl you're using (curl -V is fine)
-
- - versions of the used libraries that libcurl is built to use
-
- - what URL you were working with (if possible), at least which protocol
-
- and anything and everything else you think matters. Tell us what you
- expected to happen, tell use what did happen, tell us how you could make it
- work another way. Dig around, try out, test. Then include all the tiny bits
- and pieces in your report. You will benefit from this yourself, as it will
- enable us to help you quicker and more accurately.
-
- Since curl deals with networks, it often helps us if you include a protocol
- debug dump with your bug report. The output you get by using the -v or
- --trace options.
-
- If curl crashed, causing a core dump (in unix), there is hardly any use to
- send that huge file to anyone of us. Unless we have an exact same system
- setup as you, we can't do much with it. Instead we ask you to get a stack
- trace and send that (much smaller) output to us instead!
-
- The address and how to subscribe to the mailing lists are detailed in the
- MANUAL file.
-
-1.5 libcurl problems
-
- When you've written your own application with libcurl to perform transfers,
- it is even more important to be specific and detailed when reporting bugs.
-
- Tell us the libcurl version and your operating system. Tell us the name and
- version of all relevant sub-components like for example the SSL library
- you're using and what name resolving your libcurl uses. If you use SFTP or
- SCP, the libssh2 version is relevant etc.
-
- Showing us a real source code example repeating your problem is the best way
- to get our attention and it will greatly increase our chances to understand
- your problem and to work on a fix (if we agree it truly is a problem).
-
- Lots of problems that appear to be libcurl problems are actually just abuses
- of the libcurl API or other malfunctions in your applications. It is advised
- that you run your problematic program using a memory debug tool like
- valgrind or similar before you post memory-related or "crashing" problems to
- us.
-
-1.6 Who will fix the problems
-
- If the problems or bugs you describe are considered to be bugs, we want to
- have the problems fixed.
-
- There are no developers in the curl project that are paid to work on bugs.
- All developers that take on reported bugs do this on a voluntary basis. We
- do it out of an ambition to keep curl and libcurl excellent products and out
- of pride.
-
- But please do not assume that you can just lump over something to us and it
- will then magically be fixed after some given time. Most often we need
- feedback and help to understand what you've experienced and how to repeat a
- problem. Then we may only be able to assist YOU to debug the problem and to
- track down the proper fix.
-
- We get reports from many people every month and each report can take a
- considerable amount of time to really go to the bottom with.
-
-1.7 How to get a stack trace
-
- First, you must make sure that you compile all sources with -g and that you
- don't 'strip' the final executable. Try to avoid optimizing the code as
- well, remove -O, -O2 etc from the compiler options.
-
- Run the program until it cores.
-
- Run your debugger on the core file, like '<debugger> curl core'. <debugger>
- should be replaced with the name of your debugger, in most cases that will
- be 'gdb', but 'dbx' and others also occur.
-
- When the debugger has finished loading the core file and presents you a
- prompt, enter 'where' (without the quotes) and press return.
-
- The list that is presented is the stack trace. If everything worked, it is
- supposed to contain the chain of functions that were called when curl
- crashed. Include the stack trace with your detailed bug report. It'll help a
- lot.
-
-1.8 Bugs in libcurl bindings
-
- There will of course pop up bugs in libcurl bindings. You should then
- primarily approach the team that works on that particular binding and see
- what you can do to help them fix the problem.
-
- If you suspect that the problem exists in the underlying libcurl, then
- please convert your program over to plain C and follow the steps outlined
- above.
-
-1.9 Bugs in old versions
-
- The curl project typically releases new versions every other month, and we
- fix several hundred bugs per year. For a huge table of releases, number of
- bug fixes and more, see: https://curl.haxx.se/docs/releases.html
-
- The developers in the curl project do not have bandwidth or energy enough to
- maintain several branches or to spend much time on hunting down problems in
- old versions when chances are we already fixed them or at least that they've
- changed nature and appearance in later versions.
-
- When you experience a problem and want to report it, you really SHOULD
- include the version number of the curl you're using when you experience the
- issue. If that version number shows us that you're using an out-of-date
- curl, you should also try out a modern curl version to see if the problem
- persists or how/if it has changed in appearance.
-
- Even if you cannot immediately upgrade your application/system to run the
- latest curl version, you can most often at least run a test version or
- experimental build or similar, to get this confirmed or not.
-
- At times people insist that they cannot upgrade to a modern curl version,
- but instead they "just want the bug fixed". That's fine, just don't count on
- us spending many cycles on trying to identify which single commit, if that's
- even possible, that at some point in the past fixed the problem you're now
- experiencing.
-
- Security wise, it is almost always a bad idea to lag behind the current curl
- versions by a lot. We keeping discovering and reporting security problems
- over time see you can see in this table:
- https://curl.haxx.se/docs/vulnerabilities.html
-
-2. Bug fixing procedure
-
-2.1 What happens on first filing
-
- When a new issue is posted in the issue tracker or on the mailing list, the
- team of developers first need to see the report. Maybe they took the day
- off, maybe they're off in the woods hunting. Have patience. Allow at least a
- few days before expecting someone to have responded.
-
- In the issue tracker you can expect that some labels will be set on the
- issue to help categorize it.
-
-2.2 First response
-
- If your issue/bug report wasn't perfect at once (and few are), chances are
- that someone will ask follow-up questions. Which version did you use? Which
- options did you use? How often does the problem occur? How can we reproduce
- this problem? Which protocols does it involve? Or perhaps much more specific
- and deep diving questions. It all depends on your specific issue.
-
- You should then respond to these follow-up questions and provide more info
- about the problem, so that we can help you figure it out. Or maybe you can
- help us figure it out. An active back-and-forth communication is important
- and the key for finding a cure and landing a fix.
-
-2.3 Not reproducible
-
- For problems that we can't reproduce and can't understand even after having
- gotten all the info we need and having studied the source code over again,
- are really hard to solve so then we may require further work from you who
- actually see or experience the problem.
-
-2.4 Unresponsive
-
- If the problem haven't been understood or reproduced, and there's nobody
- responding to follow-up questions or questions asking for clarifications or
- for discussing possible ways to move forward with the task, we take that as
- a strong suggestion that the bug is not important.
-
- Unimportant issues will be closed as inactive sooner or later as they can't
- be fixed. The inactivity period (waiting for responses) should not be
- shorter than two weeks but may extend months.
-
-2.5 Lack of time/interest
-
- Bugs that are filed and are understood can unfortunately end up in the
- "nobody cares enough about it to work on it" category. Such bugs are
- perfectly valid problems that *should* get fixed but apparently aren't. We
- try to mark such bugs as "KNOWN_BUGS material" after a time of inactivity
- and if no activity is noticed after yet some time those bugs are added to
- KNOWN_BUGS and are closed in the issue tracker.
-
-2.6 KNOWN_BUGS
-
- This is a list of known bugs. Bugs we know exist and that have been pointed
- out but that haven't yet been fixed. The reasons for why they haven't been
- fixed can involve anything really, but the primary reason is that nobody has
- considered these problems to be important enough to spend the necessary time
- and effort to have them fixed.
-
- The KNOWN_BUGS are always up for grabs and we will always love the ones who
- bring one of them back to live and offers solutions to them.
-
- The KNOWN_BUGS document has a sibling document known as TODO.
-
-2.7 TODO
-
- Issues that are filed or reported that aren't really bugs but more missing
- features or ideas for future improvements and so on are marked as
- 'enhancement' or 'feature-request' and will be added to the TODO document
- instead and the issue is closed. We don't keep TODO items in the issue
- tracker.
-
- The TODO document is full of ideas and suggestions of what we can add or fix
- one day. You're always encouraged and free to grab one of those items and
- take up a discussion with the curl development team on how that could be
- implemented or provided in the project so that you can work on ticking it
- odd that document.
-
- If the issue is rather a bug and not a missing feature or functionality, it
- is listed in KNOWN_BUGS instead.
-
-2.8 Closing off stalled bugs
-
- The issue and pull request trackers on https://github.com/curl/curl will
- only hold "active" entries (using a non-precise definition of what active
- actually is, but they're at least not completely dead). Those that are
- abandoned or in other ways dormant will be closed and sometimes added to
- TODO and KNOWN_BUGS instead.
-
- This way, we only have "active" issues open on github. Irrelevant issues and
- pull requests will not distract developers or casual visitors.
diff --git a/docs/BUGS.md b/docs/BUGS.md
new file mode 100644
index 000000000..cc09a5d1b
--- /dev/null
+++ b/docs/BUGS.md
@@ -0,0 +1,266 @@
+# BUGS
+
+## There are still bugs
+
+ Curl and libcurl keep being developed. Adding features and changing code
+ means that bugs will sneak in, no matter how hard we try not to.
+
+ Of course there are lots of bugs left. And lots of misfeatures.
+
+ To help us make curl the stable and solid product we want it to be, we need
+ bug reports and bug fixes.
+
+## Where to report
+
+ If you can't fix a bug yourself and submit a fix for it, try to report an as
+ detailed report as possible to a curl mailing list to allow one of us to have
+ a go at a solution. You can optionally also submit your problem in [curl's
+ bug tracking system](https://github.com/curl/curl/issues).
+
+ Please read the rest of this document below first before doing that!
+
+ If you feel you need to ask around first, find a suitable [mailing list](
+ https://curl.haxx.se/mail/) and post your questions there.
+
+## Security bugs
+
+ If you find a bug or problem in curl or libcurl that you think has a security
+ impact, for example a bug that can put users in danger or make them
+ vulnerable if the bug becomes public knowledge, then please report that bug
+ using our security development process.
+
+ Security related bugs or bugs that are suspected to have a security impact,
+ should be reported on the [curl security tracker at
+ HackerOne](https://hackerone.com/curl).
+
+ This ensures that the report reaches the curl security team so that they
+ first can be deal with the report away from the public to minimize the harm
+ and impact it will have on existing users out there who might be using the
+ vulnerable versions.
+
+ The curl project's process for handling security related issues is
+ [documented separately](https://curl.haxx.se/dev/secprocess.html).
+
+## What to report
+
+ When reporting a bug, you should include all information that will help us
+ understand what's wrong, what you expected to happen and how to repeat the
+ bad behavior. You therefore need to tell us:
+
+ - your operating system's name and version number
+
+ - what version of curl you're using (`curl -V` is fine)
+
+ - versions of the used libraries that libcurl is built to use
+
+ - what URL you were working with (if possible), at least which protocol
+
+ and anything and everything else you think matters. Tell us what you expected
+ to happen, tell use what did happen, tell us how you could make it work
+ another way. Dig around, try out, test. Then include all the tiny bits and
+ pieces in your report. You will benefit from this yourself, as it will enable
+ us to help you quicker and more accurately.
+
+ Since curl deals with networks, it often helps us if you include a protocol
+ debug dump with your bug report. The output you get by using the `-v` or
+ `--trace` options.
+
+ If curl crashed, causing a core dump (in unix), there is hardly any use to
+ send that huge file to anyone of us. Unless we have an exact same system
+ setup as you, we can't do much with it. Instead we ask you to get a stack
+ trace and send that (much smaller) output to us instead!
+
+ The address and how to subscribe to the mailing lists are detailed in the
+ `MANUAL.md` file.
+
+## libcurl problems
+
+ When you've written your own application with libcurl to perform transfers,
+ it is even more important to be specific and detailed when reporting bugs.
+
+ Tell us the libcurl version and your operating system. Tell us the name and
+ version of all relevant sub-components like for example the SSL library
+ you're using and what name resolving your libcurl uses. If you use SFTP or
+ SCP, the libssh2 version is relevant etc.
+
+ Showing us a real source code example repeating your problem is the best way
+ to get our attention and it will greatly increase our chances to understand
+ your problem and to work on a fix (if we agree it truly is a problem).
+
+ Lots of problems that appear to be libcurl problems are actually just abuses
+ of the libcurl API or other malfunctions in your applications. It is advised
+ that you run your problematic program using a memory debug tool like valgrind
+ or similar before you post memory-related or "crashing" problems to us.
+
+## Who will fix the problems
+
+ If the problems or bugs you describe are considered to be bugs, we want to
+ have the problems fixed.
+
+ There are no developers in the curl project that are paid to work on bugs.
+ All developers that take on reported bugs do this on a voluntary basis. We do
+ it out of an ambition to keep curl and libcurl excellent products and out of
+ pride.
+
+ But please do not assume that you can just lump over something to us and it
+ will then magically be fixed after some given time. Most often we need
+ feedback and help to understand what you've experienced and how to repeat a
+ problem. Then we may only be able to assist YOU to debug the problem and to
+ track down the proper fix.
+
+ We get reports from many people every month and each report can take a
+ considerable amount of time to really go to the bottom with.
+
+## How to get a stack trace
+
+ First, you must make sure that you compile all sources with `-g` and that you
+ don't 'strip' the final executable. Try to avoid optimizing the code as well,
+ remove `-O`, `-O2` etc from the compiler options.
+
+ Run the program until it cores.
+
+ Run your debugger on the core file, like `<debugger> curl
+ core`. `<debugger>` should be replaced with the name of your debugger, in
+ most cases that will be `gdb`, but `dbx` and others also occur.
+
+ When the debugger has finished loading the core file and presents you a
+ prompt, enter `where` (without quotes) and press return.
+
+ The list that is presented is the stack trace. If everything worked, it is
+ supposed to contain the chain of functions that were called when curl
+ crashed. Include the stack trace with your detailed bug report. It'll help a
+ lot.
+
+## Bugs in libcurl bindings
+
+ There will of course pop up bugs in libcurl bindings. You should then
+ primarily approach the team that works on that particular binding and see
+ what you can do to help them fix the problem.
+
+ If you suspect that the problem exists in the underlying libcurl, then please
+ convert your program over to plain C and follow the steps outlined above.
+
+## Bugs in old versions
+
+ The curl project typically releases new versions every other month, and we
+ fix several hundred bugs per year. For a huge table of releases, number of
+ bug fixes and more, see: https://curl.haxx.se/docs/releases.html
+
+ The developers in the curl project do not have bandwidth or energy enough to
+ maintain several branches or to spend much time on hunting down problems in
+ old versions when chances are we already fixed them or at least that they've
+ changed nature and appearance in later versions.
+
+ When you experience a problem and want to report it, you really SHOULD
+ include the version number of the curl you're using when you experience the
+ issue. If that version number shows us that you're using an out-of-date curl,
+ you should also try out a modern curl version to see if the problem persists
+ or how/if it has changed in appearance.
+
+ Even if you cannot immediately upgrade your application/system to run the
+ latest curl version, you can most often at least run a test version or
+ experimental build or similar, to get this confirmed or not.
+
+ At times people insist that they cannot upgrade to a modern curl version, but
+ instead they "just want the bug fixed". That's fine, just don't count on us
+ spending many cycles on trying to identify which single commit, if that's
+ even possible, that at some point in the past fixed the problem you're now
+ experiencing.
+
+ Security wise, it is almost always a bad idea to lag behind the current curl
+ versions by a lot. We keeping discovering and reporting security problems
+ over time see you can see in [this
+ table](https://curl.haxx.se/docs/vulnerabilities.html)
+
+# Bug fixing procedure
+
+## What happens on first filing
+
+ When a new issue is posted in the issue tracker or on the mailing list, the
+ team of developers first need to see the report. Maybe they took the day off,
+ maybe they're off in the woods hunting. Have patience. Allow at least a few
+ days before expecting someone to have responded.
+
+ In the issue tracker you can expect that some labels will be set on the issue
+ to help categorize it.
+
+## First response
+
+ If your issue/bug report wasn't perfect at once (and few are), chances are
+ that someone will ask follow-up questions. Which version did you use? Which
+ options did you use? How often does the problem occur? How can we reproduce
+ this problem? Which protocols does it involve? Or perhaps much more specific
+ and deep diving questions. It all depends on your specific issue.
+
+ You should then respond to these follow-up questions and provide more info
+ about the problem, so that we can help you figure it out. Or maybe you can
+ help us figure it out. An active back-and-forth communication is important
+ and the key for finding a cure and landing a fix.
+
+## Not reproducible
+
+ For problems that we can't reproduce and can't understand even after having
+ gotten all the info we need and having studied the source code over again,
+ are really hard to solve so then we may require further work from you who
+ actually see or experience the problem.
+
+## Unresponsive
+
+ If the problem haven't been understood or reproduced, and there's nobody
+ responding to follow-up questions or questions asking for clarifications or
+ for discussing possible ways to move forward with the task, we take that as a
+ strong suggestion that the bug is not important.
+
+ Unimportant issues will be closed as inactive sooner or later as they can't
+ be fixed. The inactivity period (waiting for responses) should not be shorter
+ than two weeks but may extend months.
+
+## Lack of time/interest
+
+ Bugs that are filed and are understood can unfortunately end up in the
+ "nobody cares enough about it to work on it" category. Such bugs are
+ perfectly valid problems that *should* get fixed but apparently aren't. We
+ try to mark such bugs as `KNOWN_BUGS material` after a time of inactivity and
+ if no activity is noticed after yet some time those bugs are added to
+ `KNOWN_BUGS` and are closed in the issue tracker.
+
+## `KNOWN_BUGS`
+
+ This is a list of known bugs. Bugs we know exist and that have been pointed
+ out but that haven't yet been fixed. The reasons for why they haven't been
+ fixed can involve anything really, but the primary reason is that nobody has
+ considered these problems to be important enough to spend the necessary time
+ and effort to have them fixed.
+
+ The `KNOWN_BUGS` are always up for grabs and we will always love the ones who
+ bring one of them back to live and offers solutions to them.
+
+ The `KNOWN_BUGS` document has a sibling document known as `TODO`.
+
+## `TODO`
+
+ Issues that are filed or reported that aren't really bugs but more missing
+ features or ideas for future improvements and so on are marked as
+ 'enhancement' or 'feature-request' and will be added to the `TODO` document
+ instead and the issue is closed. We don't keep TODO items in the issue
+ tracker.
+
+ The `TODO` document is full of ideas and suggestions of what we can add or
+ fix one day. You're always encouraged and free to grab one of those items and
+ take up a discussion with the curl development team on how that could be
+ implemented or provided in the project so that you can work on ticking it odd
+ that document.
+
+ If the issue is rather a bug and not a missing feature or functionality, it
+ is listed in `KNOWN_BUGS` instead.
+
+## Closing off stalled bugs
+
+ The [issue and pull request trackers](https://github.com/curl/curl) only
+ holds "active" entries open (using a non-precise definition of what active
+ actually is, but they're at least not completely dead). Those that are
+ abandoned or in other ways dormant will be closed and sometimes added to
+ `TODO` and `KNOWN_BUGS` instead.
+
+ This way, we only have "active" issues open on github. Irrelevant issues and
+ pull requests will not distract developers or casual visitors.
diff --git a/docs/CHECKSRC.md b/docs/CHECKSRC.md
index 10e2f4d73..d36763bc5 100644
--- a/docs/CHECKSRC.md
+++ b/docs/CHECKSRC.md
@@ -9,7 +9,7 @@ check that it adheres to our [Source Code Style guide](CODE_STYLE.md).
## Command line options
-`-W[file]` whitelists that file and excludes it from being checked. Helpful
+`-W[file]` skip that file and excludes it from being checked. Helpful
when, for example, one of the files is generated.
`-D[dir]` directory name to prepend to file names when accessing them.
@@ -70,6 +70,8 @@ warnings are:
- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer
`a = 2` and *not* `a=2`.
+- `ONELINECONDITION`: do not put the conditional block on the same line as `if()`
+
- `OPENCOMMENT`: File ended with a comment (`/*`) still "open".
- `PARENBRACE`: `){` was used without sufficient space in between.
@@ -98,7 +100,9 @@ warnings are:
- `TABS`: TAB characters are not allowed!
-- `TRAILINGSPACE`: Trailing white space on the line
+- `TRAILINGSPACE`: Trailing whitespace on the line
+
+- `TYPEDEFSTRUCT`: we frown upon (most) typedefed structs
- `UNUSEDIGNORE`: a checksrc inlined warning ignore was asked for but not used,
that's an ignore that should be removed or changed to get used.
@@ -158,5 +162,5 @@ instances are ignored and nothing extra.
This is a method we've transitioned away from. Use inline ignores as far as
possible.
-Make a `checksrc.whitelist` file in the directory of the source code with the
+Make a `checksrc.skip` file in the directory of the source code with the
false positive, and include the full offending line into this file.
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
index 694861725..22863bc0f 100644
--- a/docs/CMakeLists.txt
+++ b/docs/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#add_subdirectory(examples)
add_subdirectory(libcurl)
add_subdirectory(cmdline-opts)
diff --git a/docs/CODE_REVIEW.md b/docs/CODE_REVIEW.md
new file mode 100644
index 000000000..f55cb0985
--- /dev/null
+++ b/docs/CODE_REVIEW.md
@@ -0,0 +1,168 @@
+# How to do code reviews for curl
+
+Anyone and everyone is encouraged and welcome to review code submissions in
+curl. This is a guide on what to check for and how to perform a successful
+code review.
+
+## All submissions should get reviewed
+
+All pull requests and patches submitted to the project should be reviewed by
+at least one experienced curl maintainer before that code is accepted and
+merged.
+
+## Let the tools and tests take the first rounds
+
+On initial pull requests, let the tools and tests do their job first and then
+start out by helping the submitter understand the test failures and tool
+alerts.
+
+## How to provide feedback to author
+
+Be nice. Ask questions. Provide examples or suggestions of improvements.
+Assume best intentions. Remember language barriers.
+
+All first-time contributors can become regulars. Let's help them go there.
+
+## Is this a change we want?
+
+If this is not a change that seems to be aligned with the project's path
+forward and as such cannot be accepted, inform the author about this sooner
+rather than later. Do it gently and explain why and possibly what could be
+done to make it more acceptable.
+
+## API/ABI stability or changed behavior
+
+Changing the API and the ABI may be fine in a change but it needs to be done
+deliberately and carefully. If not, a reviewer must help the author to realize
+the mistake.
+
+curl and libcurl are similarly very strict on not modifying existing
+behavior. API and ABI stability is not enough, the behavior should also remain
+intact as far as possible.
+
+## Code style
+
+Most code style nits are detected by checksrc but not all. Only leave remarks
+on style deviation once checksrc doesn't find any more.
+
+Minor nits from fresh submitters can also be handled by the maintainer when
+merging, in case it seems like the submitter isn't clear on what to do. We
+want to make the process fun and exciting for new contributors.
+
+## Encourage consistency
+
+Make sure new code is written in a similar style as existing code. Naming,
+logic, conditions, etc.
+
+## Are pointers always non-NULL?
+
+If a function or code rely on pointers being non-NULL, take an extra look if
+that seems to be a fair assessment.
+
+## Asserts
+
+Conditions that should never be false can be verified with `DEBUGASSERT()`
+calls to get caught in tests and debugging easier, while not having an impact
+on final or release builds.
+
+## Memory allocation
+
+Can the mallocs be avoided? Do not introduce mallocs in any hot paths. If
+there are (new) mallocs, can they be combined into fewer calls?
+
+Are all allocations handled in errorpaths to avoid leaks and crashes?
+
+## Thread-safety
+
+We do not like static variables as they break thread-safety and prevent
+functions from being reentrant.
+
+## Should features be `#ifdef`ed?
+
+Features and functionality may not be present everywhere and should therefore
+be `#ifdef`ed. Additionally, some features should be possible to switch on/off
+in the build.
+
+Write `#ifdef`s to be as little of a "maze" as possible.
+
+## Does it look portable enough?
+
+curl runs "everywhere". Does the code take a reasonable stance and enough
+precautions to be possible to build and run on most platforms?
+
+Remember that we live by C89 restrictions.
+
+## Tests and testability
+
+New features should be added in conjunction with one or more test cases.
+Ideally, functions should also be written so that unit tests can be done to
+test individual functions.
+
+## Documentation
+
+New features or changes to existing functionality **must** be accompanied with
+updated documentation. Submitting that in a separate follow-up pull request is
+not OK. A code review must also verify that the submitted documentation update
+matches the code submission.
+
+English isn't everyone's first language, be mindful of this and help the
+submitter improve the text if it needs a rewrite to read better.
+
+## Code shouldn't be hard to understand
+
+Source code should be written to maximize readability and be easy to
+understand.
+
+## Functions shouldn't be large
+
+A single function should never be large as that makes it hard to follow and
+understand all the exit points and state changes. Some existing functions in
+curl certainly violate this ground rule but when reviewing new code we should
+propose splitting into smaller functions.
+
+## Duplication is evil
+
+Anything that looks like duplicated code is a red flag. Anything that seems to
+introduce code that we *should* already have or provide needs a closer check.
+
+## Sensitive data
+
+When credentials are involved, take an extra look at what happens with this
+data. Where it comes from and where it goes.
+
+## Variable types differ
+
+`size_t` is not a fixed size. `time_t` can be signed or unsigned and have
+different sizes. Relying on variable sizes is a red flag.
+
+Also remember that endianness and >= 32 bit accesses to unaligned addresses
+are problematic areas.
+
+## Integer overflows
+
+Be careful about integer overflows. Some variable types can be either 32 bit
+or 64 bit. Integer overflows must be detected and acted on *before* they
+happen.
+
+## Dangerous use of functions
+
+Maybe use of `realloc()` should rather use the dynbuf functions?
+
+Do not allow new code that grows buffers without using dynbuf.
+
+Use of C functions that rely on a terminating zero must only be used on data
+that really do have a zero terminating zero.
+
+## Dangerous "data styles"
+
+Make extra precautions and verify that memory buffers that need a terminating
+zero always have exactly that. Buffers *without* a zero terminator must not be
+used as input to string functions.
+
+# Commit messages
+
+Tightly coupled with a code review is making sure that the commit message is
+good. It is the responsibilitiy of the person who merges the code to make sure
+that the commit message follows our standard (detailed in the
+[CONTRIBUTE.md](CONTRIBUTE.md) document). This includes making sure the PR
+identifies related issues and giving credit to reporters and helpers.
diff --git a/docs/CODE_STYLE.md b/docs/CODE_STYLE.md
index 0ceb5b9ad..561343752 100644
--- a/docs/CODE_STYLE.md
+++ b/docs/CODE_STYLE.md
@@ -244,3 +244,22 @@ depending on a build-time conditional:
#endif
int content = magic(3);
+
+## No typedefed structs
+
+Use structs by all means, but do not typedef them. Use the `struct name` way
+of identifying them:
+
+ struct something {
+ void *valid;
+ size_t way_to_write;
+ };
+ struct something instance;
+
+**Not okay**:
+
+ typedef struct {
+ void *wrong;
+ size_t way_to_write;
+ } something;
+ something instance;
diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md
index 978b87d27..69ddfbee0 100644
--- a/docs/CONTRIBUTE.md
+++ b/docs/CONTRIBUTE.md
@@ -108,7 +108,7 @@ submit a small description of your fix or your new features with every
contribution so that it can be swiftly added to the package documentation.
The documentation is always made in man pages (nroff formatted) or plain
-ASCII files. All HTML files on the web site and in the release archives are
+ASCII files. All HTML files on the website and in the release archives are
generated from the nroff/ASCII versions.
### Test Cases
@@ -172,6 +172,33 @@ you are expected to fix the problem. If you don't understand when the issue is
or have other problems to fix the complaint, just ask and other project
members will likely be able to help out.
+Consider the following table while looking at pull request failures:
+
+ | CI platform as shown in PR | State | What to look at next |
+ | ----------------------------------- | ------ | -------------------------- |
+ | CI / codeql | stable | quality check results |
+ | CI / fuzzing | stable | fuzzing results |
+ | CI / macos ... | stable | all errors and failures |
+ | Code scanning results / CodeQL | stable | quality check results |
+ | FreeBSD FreeBSD: ... | stable | all errors and failures |
+ | LGTM analysis: Python | stable | new findings |
+ | LGTM analysis: C/C++ | stable | new findings |
+ | buildbot/curl_winssl_ ... | stable | all errors and failures |
+ | continuous-integration/appveyor/pr | stable | all errors and failures |
+ | continuous-integration/travis-ci/pr | stable | all errors and failures |
+ | curl.curl (linux ...) | stable | all errors and failures |
+ | curl.curl (windows ...) | flaky | repetitive errors/failures |
+ | deepcode-ci-bot | stable | new findings |
+ | musedev | stable | new findings |
+
+Sometimes the tests fail due to a dependency service temporarily being offline
+or otherwise unavailable, eg. package downloads. In this case you can just
+try to update your pull requests to rerun the tests later as described below.
+
+You can update your pull requests by pushing new commits or force-pushing
+changes to existing commits. Force-pushing an amended commit without any
+actual content changed also allows you to retrigger the tests for that commit.
+
When you adjust your pull requests after review, consider squashing the
commits so that we can review the full updated version more easily.
@@ -200,6 +227,16 @@ A short guide to how to write commit messages in the curl project.
[whatever-else-by: credit all helpers, finders, doers]
---- stop ----
+The first line is a succinct description of the change:
+
+ - use the imperative, present tense: "change" not "changed" nor "changes"
+ - don't capitalize first letter
+ - no dot (.) at the end
+
+The `[area]` in the first line can be `http2`, `cookies`, `openssl` or
+similar. There's no fixed list to select from but using the same "area" as
+other related changes could make sense.
+
Don't forget to use commit --author="" if you commit someone else's work, and
make sure that you have your own user and email setup correctly in git before
you commit
@@ -265,3 +302,6 @@ For Windows:
- [https://gnuwin32.sourceforge.io/packages/patch.htm](https://gnuwin32.sourceforge.io/packages/patch.htm)
- [https://gnuwin32.sourceforge.io/packages/diffutils.htm](https://gnuwin32.sourceforge.io/packages/diffutils.htm)
+
+### Useful resources
+* [Webinar on getting code into cURL](https://www.youtube.com/watch?v=QmZ3W1d6LQI)
diff --git a/docs/CURL-DISABLE.md b/docs/CURL-DISABLE.md
new file mode 100644
index 000000000..a9e6acaf8
--- /dev/null
+++ b/docs/CURL-DISABLE.md
@@ -0,0 +1,124 @@
+# Code defines to disable features and protocols
+
+## CURL_DISABLE_COOKIES
+
+Disable support for HTTP cookies.
+
+## CURL_DISABLE_CRYPTO_AUTH
+
+Disable support for authentication methods using crypto.
+
+## CURL_DISABLE_DICT
+
+Disable the DICT protocol
+
+## CURL_DISABLE_DOH
+
+Disable DNS-over-HTTPS
+
+## CURL_DISABLE_FILE
+
+Disable the FILE protocol
+
+## CURL_DISABLE_FTP
+
+Disable the FTP (and FTPS) protocol
+
+## CURL_DISABLE_GETOPTIONS
+
+Disable the `curl_easy_options` API calls that lets users get information
+about existing options to `curl_easy_setopt`.
+
+## CURL_DISABLE_GOPHER
+
+Disable the GOPHER protocol.
+
+## CURL_DISABLE_HTTP
+
+Disable the HTTP(S) protocols. Note that this then also disable HTTP proxy
+support.
+
+## CURL_DISABLE_HTTP_AUTH
+
+Disable support for all HTTP authentication methods.
+
+## CURL_DISABLE_IMAP
+
+Disable the IMAP(S) protocols.
+
+## CURL_DISABLE_LDAP
+
+Disable the LDAP(S) protocols.
+
+## CURL_DISABLE_LDAPS
+
+Disable the LDAPS protocol.
+
+## CURL_DISABLE_LIBCURL_OPTION
+
+Disable the --libcurl option from the curl tool.
+
+## CURL_DISABLE_MIME
+
+Disable MIME support.
+
+## CURL_DISABLE_MQTT
+
+Disable MQTT support.
+
+## CURL_DISABLE_NETRC
+
+Disable the netrc parser.
+
+## CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
+
+Disable the auto load config support in the OpenSSL backend.
+
+## CURL_DISABLE_PARSEDATE
+
+Disable date parsing
+
+## CURL_DISABLE_POP
+
+Disable the POP(S) protocols
+
+## CURL_DISABLE_PROGRESS_METER
+
+Disable the built-in progress meter
+
+## CURL_DISABLE_PROXY
+
+Disable support for proxies
+
+## CURL_DISABLE_RTSP
+
+Disable the RTSP protocol.
+
+## CURL_DISABLE_SHUFFLE_DNS
+
+Disable the shuffle DNS feature
+
+## CURL_DISABLE_SMB
+
+Disable the SMB(S) protocols
+
+## CURL_DISABLE_SMTP
+
+Disable the SMTP(S) protocols
+
+## CURL_DISABLE_SOCKETPAIR
+
+Disable the use of socketpair internally to allow waking up and canceling
+curl_multi_poll().
+
+## CURL_DISABLE_TELNET
+
+Disable the TELNET protocol
+
+## CURL_DISABLE_TFTP
+
+Disable the TFTP protocol
+
+## CURL_DISABLE_VERBOSE_STRINGS
+
+Disable verbose strings and error messages.
diff --git a/docs/DEPRECATE.md b/docs/DEPRECATE.md
index 4f4ef8ab6..26877c48a 100644
--- a/docs/DEPRECATE.md
+++ b/docs/DEPRECATE.md
@@ -5,32 +5,8 @@ email the curl-library mailing list as soon as possible and explain to us why
this is a problem for you and how your use case can't be satisfied properly
using a work around.
-## PolarSSL
+## Past removals
-The polarssl TLS library has not had an update in over three years. The last
-release was done on [January 7
-2016](https://tls.mbed.org/tech-updates/releases). This library has been
-superseded by the mbedTLS library, which is the current incarnation of
-PolarSSL. curl has supported mbedTLS since 2015.
-
-It seems unlikely that this library is a good choice for users to get proper
-TLS security and support today and at the same time there are plenty of good
-and updated alternatives.
-
-I consider it likely that the existing users of curl + polarssl out there are
-stuck on old curl versions and when they eventually manage to update curl they
-should also be able to update their TLS library.
-
-### State
-
-In the curl 7.65.2 release (July 17, 2019) the ability to build with this TLS
-backend is removed from the configure script. The code remains and can be
-built and used going forward, but it has to be manually enabled in a build (or
-the configure removal reverted).
-
-### Removal
-
-The support for PolarSSL and all code for it will be completely removed from
-the curl code base six months after it ships disabled in configure in a
-release. In the release on or near February 27, 2020. (possibly called curl
-7.70.0).
+ - Pipelining
+ - axTLS
+ - PolarSSL
diff --git a/docs/DYNBUF.md b/docs/DYNBUF.md
new file mode 100644
index 000000000..aa528ec3a
--- /dev/null
+++ b/docs/DYNBUF.md
@@ -0,0 +1,86 @@
+# dynbuf
+
+This is the internal module for creating and handling "dynamic buffers". This
+means buffers that can be appended to, dynamically and grow in size to adapt.
+
+There will always be a terminating zero put at the end of the dynamic buffer.
+
+The `struct dynbuf` is used to hold data for each instance of a dynamic
+buffer. The members of that struct **MUST NOT** be accessed or modified
+without using the dedicated dynbuf API.
+
+## init
+
+ void Curl_dyn_init(struct dynbuf *s, size_t toobig);
+
+This inits a struct to use for dynbuf and it can't fail. The `toobig` value
+**must** be set to the maximum size we allow this buffer instance to grow to.
+The functions below will return `CURLE_OUT_OF_MEMORY` when hitting this limit.
+
+## free
+
+ void Curl_dyn_free(struct dynbuf *s);
+
+Free the associated memory and clean up. After a free, the `dynbuf` struct can
+be re-used to start appending new data to.
+
+## addn
+
+ CURLcode Curl_dyn_addn(struct dynbuf *s, const void *mem, size_t len);
+
+Append arbitrary data of a given length to the end of the buffer.
+
+## add
+
+ CURLcode Curl_dyn_add(struct dynbuf *s, const char *str);
+
+Append a C string to the end of the buffer.
+
+## addf
+
+ CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...);
+
+Append a `printf()`-style string to the end of the buffer.
+
+## vaddf
+
+ CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap);
+
+Append a `vprintf()`-style string to the end of the buffer.
+
+## reset
+
+ void Curl_dyn_reset(struct dynbuf *s);
+
+Reset the buffer length, but leave the allocation.
+
+## tail
+
+ CURLcode Curl_dyn_tail(struct dynbuf *s, size_t length)
+
+Keep `length` bytes of the buffer tail (the last `length` bytes of the
+buffer). The rest of the buffer is dropped. The specified `length` must not be
+larger than the buffer length.
+
+## ptr
+
+ char *Curl_dyn_ptr(const struct dynbuf *s);
+
+Returns a `char *` to the buffer if it has a length, otherwise a NULL. Since
+the buffer may be reallocated, this pointer should not be trusted or used
+anymore after the next buffer manipulation call.
+
+## uptr
+
+ unsigned char *Curl_dyn_uptr(const struct dynbuf *s);
+
+Returns an `unsigned char *` to the buffer if it has a length, otherwise a
+NULL. Since the buffer may be reallocated, this pointer should not be trusted
+or used anymore after the next buffer manipulation call.
+
+## len
+
+ size_t Curl_dyn_len(const struct dynbuf *s);
+
+Returns the length of the buffer in bytes. Does not include the terminating
+zero byte.
diff --git a/docs/ESNI.md b/docs/ECH.md
index eefb6662b..ea1efaa67 100644
--- a/docs/ESNI.md
+++ b/docs/ECH.md
@@ -1,24 +1,23 @@
-# TLS: ESNI support in curl and libcurl
+# TLS: ECH support in curl and libcurl
## Summary
-**ESNI** means **Encrypted Server Name Indication**, a TLS 1.3
-extension which is currently the subject of an
-[IETF Draft][tlsesni].
+**ECH** means **Encrypted Client Hello**, a TLS 1.3 extension which is
+currently the subject of an [IETF Draft][tlsesni]. (ECH was formerly known as
+ESNI).
-This file is intended to show the latest current state of ESNI support
+This file is intended to show the latest current state of ECH support
in **curl** and **libcurl**.
-At end of August 2019, an [experimental fork of curl][niallorcurl],
-built using an [experimental fork of OpenSSL][sftcdopenssl], which in
-turn provided an implementation of ESNI, was demonstrated
-interoperating with a server belonging to the [DEfO
-Project][defoproj].
+At end of August 2019, an [experimental fork of curl][niallorcurl], built
+using an [experimental fork of OpenSSL][sftcdopenssl], which in turn provided
+an implementation of ECH, was demonstrated interoperating with a server
+belonging to the [DEfO Project][defoproj].
Further sections here describe
- resources needed for building and demonstrating **curl** support
- for ESNI,
+ for ECH,
- progress to date,
@@ -28,18 +27,18 @@ Further sections here describe
## Resources needed
-To build and demonstrate ESNI support in **curl** and/or **libcurl**,
+To build and demonstrate ECH support in **curl** and/or **libcurl**,
you will need
-- a TLS library, supported by **libcurl**, which implements ESNI;
+- a TLS library, supported by **libcurl**, which implements ECH;
-- an edition of **curl** and/or **libcurl** which supports the ESNI
+- an edition of **curl** and/or **libcurl** which supports the ECH
implementation of the chosen TLS library;
- an environment for building and running **curl**, and at least
building **OpenSSL**;
-- a server, supporting ESNI, against which to run a demonstration
+- a server, supporting ECH, against which to run a demonstration
and perhaps a specific target URL;
- some instructions.
@@ -58,52 +57,49 @@ The following set of resources is currently known to be available.
- Details [below](#pr4011);
-- New **curl** feature: `CURL_VERSION_ESNI`;
+- New configuration option: `--enable-ech`;
-- New configuration option: `--enable-esni`;
-
-- Build-time check for availability of resources needed for ESNI
+- Build-time check for availability of resources needed for ECH
support;
-- Pre-processor symbol `USE_ESNI` for conditional compilation of
- ESNI support code, subject to configuration option and
+- Pre-processor symbol `USE_ECH` for conditional compilation of
+ ECH support code, subject to configuration option and
availability of needed resources.
## TODO
-- (next PR) Add libcurl options to set ESNI parameters.
+- (next PR) Add libcurl options to set ECH parameters.
-- (next PR) Add curl tool command line options to set ESNI parameters.
+- (next PR) Add curl tool command line options to set ECH parameters.
-- (WIP) Extend DoH functions so that published ESNI parameters can be
+- (WIP) Extend DoH functions so that published ECH parameters can be
retrieved from DNS instead of being required as options.
-- (WIP) Work with OpenSSL community to finalize ESNI API.
+- (WIP) Work with OpenSSL community to finalize ECH API.
-- Track OpenSSL ESNI API in libcurl
+- Track OpenSSL ECH API in libcurl
- Identify and implement any changes needed for CMake.
- Optimize build-time checking of available resources.
-- Encourage ESNI support work on other TLS/SSL backends.
+- Encourage ECH support work on other TLS/SSL backends.
## Additional detail
### PR 4011
-**TLS: Provide ESNI support framework for curl and libcurl**
+**TLS: Provide ECH support framework for curl and libcurl**
-The proposed change provides a framework to facilitate work to
-implement ESNI support in curl and libcurl. It is not intended
-either to provide ESNI functionality or to favour any particular
-TLS-providing backend. Specifically, the change reserves a
-feature bit for ESNI support (symbol `CURL_VERSION_ESNI`),
-implements setting and reporting of this bit, includes dummy
-book-keeping for the symbol, adds a build-time configuration
-option (`--enable-esni`), provides an extensible check for
-resources available to provide ESNI support, and defines a
-compiler pre-processor symbol (`USE_ESNI`) accordingly.
+The proposed change provides a framework to facilitate work to implement ECH
+support in curl and libcurl. It is not intended either to provide ECH
+functionality or to favour any particular TLS-providing backend. Specifically,
+the change reserves a feature bit for ECH support (symbol
+`CURL_VERSION_ECH`), implements setting and reporting of this bit, includes
+dummy book-keeping for the symbol, adds a build-time configuration option
+(`--enable-ech`), provides an extensible check for resources available to
+provide ECH support, and defines a compiler pre-processor symbol (`USE_ECH`)
+accordingly.
Proposed-by: @niallor (Niall O'Reilly)\
Encouraged-by: @sftcd (Stephen Farrell)\
@@ -117,12 +113,12 @@ Limitations:
- Check for available resources, although extensible, refers only to
specific work in progress ([described
here](https://github.com/sftcd/openssl/tree/master/esnistuff)) to
- implement ESNI for OpenSSL, as this is the immediate motivation
+ implement ECH for OpenSSL, as this is the immediate motivation
for the proposed change.
## References
-CloudFlare blog: [Encrypting SNI: Fixing One of the Core Internet Bugs][corebug]
+Cloudflare blog: [Encrypting SNI: Fixing One of the Core Internet Bugs][corebug]
Cloudflare blog: [Encrypt it or lose it: how encrypted SNI works][esniworks]
diff --git a/docs/EXPERIMENTAL.md b/docs/EXPERIMENTAL.md
index 6c33bcf53..6a014c3da 100644
--- a/docs/EXPERIMENTAL.md
+++ b/docs/EXPERIMENTAL.md
@@ -20,3 +20,4 @@ Experimental support in curl means:
- HTTP/3 support and options
- alt-svc support and options
+ - CURLSSLOPT_NATIVE_CA (No configure option, feature built in when supported)
diff --git a/docs/FAQ b/docs/FAQ
index 4136b9170..b5efb1192 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -136,8 +136,9 @@ FAQ
libcurl
A free and easy-to-use client-side URL transfer library, supporting DICT,
- FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3,
- POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP.
+ FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT,
+ POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET
+ and TFTP.
libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading,
Kerberos, SPNEGO, HTTP form based upload, proxies, cookies, user+password
@@ -188,7 +189,7 @@ FAQ
curl's development, have we intended curl to replace wget or compete on its
market. Curl is targeted at single-shot file transfers.
- Curl is not a web site mirroring program. If you want to use curl to mirror
+ Curl is not a website mirroring program. If you want to use curl to mirror
something: fine, go ahead and write a script that wraps around curl to make
it reality (like curlmirror.pl does).
@@ -246,21 +247,22 @@ FAQ
1.6 What do you get for making curl?
- Project cURL is entirely free and open. No person gets paid for developing
- curl full time. We do this voluntarily, mostly in our spare time.
- Occasionally companies pay individual developers to work on curl, but that's
- up to each company and developer. This is not controlled by nor supervised in
- any way by the project.
+ Project cURL is entirely free and open. We do this voluntarily, mostly in
+ our spare time. Companies may pay individual developers to work on curl,
+ but that's up to each company and developer. This is not controlled by nor
+ supervised in any way by the curl project.
- We still get help from companies. Haxx provides web site, bandwidth, mailing
- lists etc, GitHub hosts the primary git repository and other services like
- the bug tracker at https://github.com/curl/curl. Also again, some companies
- have sponsored certain parts of the development in the past and I hope some
- will continue to do so in the future.
+ We get help from companies. Haxx provides website, bandwidth, mailing lists
+ etc, GitHub hosts the primary git repository and other services like the bug
+ tracker at https://github.com/curl/curl. Also again, some companies have
+ sponsored certain parts of the development in the past and I hope some will
+ continue to do so in the future.
If you want to support our project, consider a donation or a banner-program
or even better: by helping us with coding, documenting or testing etc.
+ See also: https://curl.haxx.se/sponsors.html
+
1.7 What about CURL from curl.com?
During the summer of 2001, curl.com was busy advertising their client-side
@@ -301,7 +303,7 @@ FAQ
curl is fully open source. It means you can hire any skilled engineer to fix
your curl-related problems.
- We list available alternatives on the curl web site:
+ We list available alternatives on the curl website:
https://curl.haxx.se/support.html
1.10 How many are using curl?
@@ -316,21 +318,14 @@ FAQ
We don't know how many users that downloaded or installed curl and then
never use it.
- In May 2012 Daniel did a counting game and came up with a number that may
- be completely wrong or somewhat accurate. Over 500 million!
-
- See https://daniel.haxx.se/blog/2012/05/16/300m-users/
+ In 2020, we estimate that curl runs in rougly ten billion installations
+ world wide.
1.11 Why don't you update ca-bundle.crt
- The ca cert bundle that used to be shipped with curl was very outdated and
- must be replaced with an up-to-date version by anyone who wants to verify
- peers. It is no longer provided by curl. The last curl release that ever
- shipped a ca cert bundle was curl 7.18.0.
-
In the cURL project we've decided not to attempt to keep this file updated
- (or even present anymore) since deciding what to add to a ca cert bundle is
- an undertaking we've not been ready to accept, and the one we can get from
+ (or even present) since deciding what to add to a ca cert bundle is an
+ undertaking we've not been ready to accept, and the one we can get from
Mozilla is perfectly fine so there's no need to duplicate that work.
Today, with many services performed over HTTPS, every operating system
@@ -373,16 +368,13 @@ FAQ
1.14 How do I submit my patch?
- When you have made a patch or a change of whatever sort, and want to submit
- that to the project, there are a few different ways we prefer:
-
- o send a patch to the curl-library mailing list. We're many subscribers
- there and there are lots of people who can review patches, comment on them
- and "receive" them properly.
+ We strongly encourage you to submit changes and improvements directly as
+ "pull requests" on github: https://github.com/curl/curl/pulls
- o if your patch changes or fixes a bug, you can also opt to submit a bug
- report in the bug tracker and attach your patch there. There are less
- people involved there.
+ If you for any reason can't or won't deal with github, send your patch to
+ the curl-library mailing list. We're many subscribers there and there are
+ lots of people who can review patches, comment on them and "receive" them
+ properly.
Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
@@ -447,9 +439,9 @@ FAQ
curl can be built to use one of the following SSL alternatives: OpenSSL,
libressl, BoringSSL, GnuTLS, wolfSSL, NSS, mbedTLS, MesaLink, Secure
- Transport (native iOS/OS X), Schannel (native Windows) or GSKit (native IBM
- i). They all have their pros and cons, and we try to maintain a comparison
- of them here: https://curl.haxx.se/docs/ssl-compared.html
+ Transport (native iOS/OS X), Schannel (native Windows), GSKit (native IBM
+ i), or BearSSL. They all have their pros and cons, and we try to maintain a
+ comparison of them here: https://curl.haxx.se/docs/ssl-compared.html
2.3 Where can I find a copy of LIBEAY32.DLL?
@@ -457,7 +449,7 @@ FAQ
Curl can be built with OpenSSL to do the SSL stuff. The LIBEAY32.DLL is then
what curl needs on a windows machine to do https:// etc. Check out the curl
- web site to find accurate and up-to-date pointers to recent OpenSSL DLLs and
+ website to find accurate and up-to-date pointers to recent OpenSSL DLLs and
other binary packages.
2.4 Does curl support SOCKS (RFC 1928) ?
@@ -562,7 +554,7 @@ FAQ
a language, you may prefer to use one of these interfaces instead.
Find out more about which languages that support curl directly, and how to
- install and use them, in the libcurl section of the curl web site:
+ install and use them, in the libcurl section of the curl website:
https://curl.haxx.se/libcurl/
All the various bindings to libcurl are made by other projects and people,
@@ -723,7 +715,7 @@ FAQ
3.19 How do I get HTTP from a host using a specific IP address?
- For example, you may be trying out a web site installation that isn't yet in
+ For example, you may be trying out a website installation that isn't yet in
the DNS. Or you have a site using multiple IP addresses for a given host
name and you want to address a specific one out of the set.
diff --git a/docs/FEATURES b/docs/FEATURES
index 68d38fc27..35b26e1b2 100644
--- a/docs/FEATURES
+++ b/docs/FEATURES
@@ -180,6 +180,9 @@ IMAPS (*1)
- explicit "STARTTLS" usage to "upgrade" plain imap:// connections to use SSL
- via http-proxy
+MQTT
+ - Subscribe to and publish topics using url scheme mqtt://broker/topic
+
FOOTNOTES
=========
@@ -191,7 +194,7 @@ FOOTNOTES
currently supported
*5 = requires nghttp2 and possibly a recent TLS library
*6 = requires c-ares
- *7 = requires OpenSSL, NSS, GSKit, WinSSL or Secure Transport; GnuTLS, for
+ *7 = requires OpenSSL, NSS, GSKit, Schannel or Secure Transport; GnuTLS, for
example, only supports SSLv3 and TLSv1
*8 = requires libssh2
*9 = requires OpenSSL, GnuTLS, mbedTLS, NSS, yassl, Secure Transport or SSPI
diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md
index d49358b95..a4c006fbe 100644
--- a/docs/GOVERNANCE.md
+++ b/docs/GOVERNANCE.md
@@ -18,7 +18,8 @@ expects from us.
There is no legal entity. The curl project is just a bunch of people scattered
around the globe with the common goal to produce source code that creates
-great products.
+great products. We are not part of any umbrella organization and we are not
+located in any specific country. We are totally independent.
The copyrights in the project are owned by the individuals and organizations
that wrote those parts of the code.
@@ -36,6 +37,28 @@ If there is no obvious consensus, a maintainer who's knowledgeable in the
specific area will take an "executive" decision that they think is the right
for the project.
+## Donations
+
+Donating plain money to curl is best done to curl's [Open Collective
+fund](https://opencollective.com/curl). Open Collective is a US based
+non-profit organization that holds on to funds for us. This fund is then used
+for paying the curl security bug bounties, to reimburse project related
+expenses etc.
+
+Donations to the project can also come in form of server hosting, providing
+services and paying for people to work on curl related code etc. Usually, such
+donations are services paid for directly by the sponsors.
+
+We grade sponsors in a few different levels and if they meet the criteria,
+they can be mentioned on the Sponsors page on the curl website.
+
+## Commercial Support
+
+The curl project does not do or offer commercial support. It only hosts
+mailing lists, runs bug trackers etc to facilitate communication and work.
+
+However, Daniel works for wolfSSL and we offer commercial curl support there.
+
## Key roles
### Maintainers
@@ -80,7 +103,7 @@ Feltzing serve as backup admins for when Daniel is gone or unable.
The primary server is paid for by Haxx. The machine is physically located in a
server bunker in Stockholm Sweden, operated by the company Portlane.
-The web site contents are served to the web via Fastly and Daniel is the
+The website contents are served to the web via Fastly and Daniel is the
primary curl contact with Fastly.
### BDFL
@@ -108,8 +131,8 @@ within the area of personal expertise and experience.
### Recommendations
-- please enable 2fa on your github account to reduce risk of malicious source
- code tampering
+- we require two-factor authentication enabled on your github account to
+ reduce risk of malicious source code tampering
- consider enabling signed git commits for additional verification of changes
### Merge advice
diff --git a/docs/HELP-US.md b/docs/HELP-US.md
index aae2b9f59..54744346a 100644
--- a/docs/HELP-US.md
+++ b/docs/HELP-US.md
@@ -15,6 +15,23 @@ found yourself or perhaps got annoyed at in the past. It can be a spelling
error in an error text or a weirdly phrased section in a man page. Hunt it
down and report the bug. Or make your first pull request with a fix for that.
+## Smaller tasks
+
+Some projects mark small issues as "beginner friendly", "bite-sized" or
+similar. We don't do that in curl since such issues never linger around long
+enough. Simple issues get handled very fast.
+
+If you're looking for a smaller or simpler task in the project to help out
+with as an entry-point into the project, perhaps because you are a newcomer or
+even maybe not a terribly experienced developer, here's our advice:
+
+ - Read through this document to get a grasp on a general approach to use
+ - Consider adding a test case for something not currentled tested (correctly)
+ - Consider updating or adding documentation
+ - One way to get your feet wet gently in the project, is to participate in an
+ existing issue/PR and help out by reproducing the issue, review the code in
+ the PR etc.
+
## Help wanted
In the issue tracker we occasionally mark bugs with [help
diff --git a/docs/HISTORY.md b/docs/HISTORY.md
index 30249071a..c5ed13846 100644
--- a/docs/HISTORY.md
+++ b/docs/HISTORY.md
@@ -7,9 +7,12 @@ currency-exchange calculations available to Internet Relay Chat (IRC)
users. All the necessary data were published on the Web; he just needed to
automate their retrieval.
-Daniel simply adopted an existing command-line open-source tool, httpget, that
-Brazilian Rafael Sagula had written and recently released version 0.1 of. After
-a few minor adjustments, it did just what he needed.
+1996
+----
+
+Daniel adopted an existing command-line open-source tool, httpget, that
+Brazilian Rafael Sagula had written and recently released version 0.1
+of. After a few minor adjustments, it did just what he needed.
1997
----
@@ -58,7 +61,7 @@ OpenSSL took over and SSLeay was abandoned.
May: first Debian package.
-August: LDAP:// and FILE:// support added. The curl web site gets 1300 visits
+August: LDAP:// and FILE:// support added. The curl website gets 1300 visits
weekly. Moved site to curl.haxx.nu.
September: Released curl 6.0. 15000 lines of code.
@@ -77,7 +80,7 @@ other software and programs to be based on and powered by libcurl. Almost
June: the curl site moves to "curl.haxx.se"
-August, the curl web site gets 4000 visits weekly.
+August, the curl website gets 4000 visits weekly.
The PHP guys adopted libcurl already the same month, when the first ever third
party libcurl binding showed up. CURL has been a supported module in PHP since
@@ -106,7 +109,7 @@ The first experimental ftps:// support was added.
August: curl is bundled in Mac OS X, 10.1. It was already becoming more and
more of a standard utility of Linux distributions and a regular in the BSD
-ports collections. The curl web site gets 8000 visits weekly. Curl Corporation
+ports collections. The curl website gets 8000 visits weekly. Curl Corporation
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
never since got back in touch again.
@@ -117,7 +120,7 @@ without many whistles.
2002
----
-June: the curl web site gets 13000 visits weekly. curl and libcurl is
+June: the curl website gets 13000 visits weekly. curl and libcurl is
35000 lines of code. Reported successful compiles on more than 40 combinations
of CPUs and operating systems.
@@ -126,9 +129,11 @@ impossible. Around 5000 downloaded packages each week from the main site gives
a hint, but the packages are mirrored extensively, bundled with numerous OS
distributions and otherwise retrieved as part of other software.
-September: with the release of curl 7.10 it is released under the MIT license
+October 1: with the release of curl 7.10 it is released under the MIT license
only.
+Starting with 7.10, curl verifies SSL server certificates by default.
+
2003
----
@@ -162,7 +167,7 @@ August: Curl and libcurl 7.12.1
Available command line options: 96
Available curl_easy_setopt() options: 120
Number of public functions in libcurl: 36
- Amount of public web site mirrors: 12
+ Amount of public website mirrors: 12
Number of known libcurl bindings: 26
2005
@@ -175,7 +180,7 @@ April: Added the multi_socket() API
September: TFTP support was added.
-More than 100,000 unique visitors of the curl web site. 25 mirrors.
+More than 100,000 unique visitors of the curl website. 25 mirrors.
December: security vulnerability: libcurl URL Buffer Overflow
@@ -218,6 +223,8 @@ November:
March: security vulnerability: libcurl Arbitrary File Access
+April: added CMake support
+
August: security vulnerability: libcurl embedded zero in cert name
December: Added support for IMAP, POP3 and SMTP
@@ -281,7 +288,9 @@ April: added the cyassl backend (later renamed to WolfSSL)
March: first real release supporting HTTP/2
- September: Web site had 245,000 unique visitors and served 236GB data
+ September: Website had 245,000 unique visitors and served 236GB data
+
+ SMB and SMBS support
2015
----
@@ -304,9 +313,11 @@ April: added the cyassl backend (later renamed to WolfSSL)
2017
----
+ July: OSS-Fuzz started fuzzing libcurl
+
September: Added Multi-SSL support
- The web site serves 3100 GB/month
+ The website serves 3100 GB/month
Public curl releases: 169
Command line options: 211
@@ -316,6 +327,8 @@ April: added the cyassl backend (later renamed to WolfSSL)
October: SSLKEYLOGFILE support, new MIME API
+ October: Daniel received the Polhem Prize for his work on curl
+
November: brotli
2018
@@ -344,3 +357,28 @@ April: added the cyassl backend (later renamed to WolfSSL)
curl_easy_setopt() options: 261
Public functions in libcurl: 80
Contributors: 1808
+
+ December: removed axTLS support
+
+2019
+----
+
+ March: added experimental alt-svc support
+
+ August: the first HTTP/3 requests with curl.
+
+ September: 7.66.0 is released and the tool offers parallel downloads
+
+2020
+----
+
+ curl and libcurl are installed in an estimated 10 *billion* instances
+ world-wide.
+
+ January: added BearSSL support
+
+ March: removed support for PolarSSL, added wolfSSH support
+
+ April: experimental MQTT support
+
+ August: zstd support
diff --git a/docs/HTTP-COOKIES.md b/docs/HTTP-COOKIES.md
index 632cb4ebe..de9d1de68 100644
--- a/docs/HTTP-COOKIES.md
+++ b/docs/HTTP-COOKIES.md
@@ -24,7 +24,7 @@
and in 2017, another update was
[drafted](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01)
to deprecate modification of 'secure' cookies from non-secure origins. Both
- of these drafs have been incorporated into a proposal to
+ of these drafts have been incorporated into a proposal to
[replace](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02)
RFC6265. Cookie prefixes and secure cookie modification protection has been
implemented by curl.
@@ -43,6 +43,27 @@
When libcurl saves a cookiejar, it creates a file header of its own in which
there is a URL mention that will link to the web version of this document.
+## Cookie file format
+
+ The cookie file format is text based and stores one cookie per line. Lines
+ that start with `#` are treated as comments.
+
+ Each line that each specifies a single cookie consists of seven text fields
+ separated with TAB characters. A valid line must end with a newline
+ character.
+
+### Fields in the file
+
+ Field number, what type and example data and the meaning of it:
+
+ 0. string `example.com` - the domain name
+ 1. boolean `FALSE` - include subdomains
+ 2. string `/foobar/` - path
+ 3. boolean `TRUE` - send/receive over HTTPS only
+ 4. number `1462299217` - expires at - seconds since Jan 1st 1970, or 0
+ 5. string `person` - name of the cookie
+ 6. string `daniel` - value of the cookie
+
## Cookies with curl the command line tool
curl has a full cookie "engine" built in. If you just activate it, you can
@@ -108,6 +129,6 @@
Since curl and libcurl are plain HTTP clients without any knowledge of or
capability to handle javascript, such cookies will not be detected or used.
- Often, if you want to mimic what a browser does on such web sites, you can
+ Often, if you want to mimic what a browser does on such websites, you can
record web browser HTTP traffic when using such a site and then repeat the
cookie operations using curl or libcurl.
diff --git a/docs/HTTP2.md b/docs/HTTP2.md
index 5b4435f88..4c72a29b2 100644
--- a/docs/HTTP2.md
+++ b/docs/HTTP2.md
@@ -18,7 +18,7 @@ parts. The reason for this is that HTTP/2 is much more complex at that layer
than HTTP/1.1 (which we implement on our own) and that nghttp2 is an already
existing and well functional library.
-We require at least version 1.0.0.
+We require at least version 1.12.0.
Over an http:// URL
-------------------
diff --git a/docs/HTTP3.md b/docs/HTTP3.md
index 2dbd25688..fa9d24437 100644
--- a/docs/HTTP3.md
+++ b/docs/HTTP3.md
@@ -13,7 +13,7 @@ and libcurl.
## QUIC libraries
-QUIC libraries we're experiementing with:
+QUIC libraries we're experimenting with:
[ngtcp2](https://github.com/ngtcp2/ngtcp2)
@@ -29,11 +29,11 @@ in the master branch using pull-requests, just like ordinary changes.
# ngtcp2 version
-## Build
+## Build with OpenSSL
Build (patched) OpenSSL
- % git clone --depth 1 -b openssl-quic-draft-23 https://github.com/tatsuhiro-t/openssl
+ % git clone --depth 1 -b OpenSSL_1_1_1g-quic-draft-29 https://github.com/tatsuhiro-t/openssl
% cd openssl
% ./config enable-tls1_3 --prefix=<somewhere1>
% make
@@ -65,41 +65,68 @@ Build curl
% git clone https://github.com/curl/curl
% cd curl
% ./buildconf
- % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure --with-ssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3>
+ % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure --with-ssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3> --enable-alt-svc
% make
-# quiche version
+## Build with GnuTLS
-## build
+Build (patched) GnuTLS
-Clone quiche and BoringSSL:
+ % git clone --depth 1 -b tmp-quic https://gitlab.com/gnutls/gnutls.git
+ % cd gnutls
+ % ./bootstrap
+ % ./configure --disable-doc --prefix=<somewhere1>
+ % make
+ % make install
- % git clone --recursive https://github.com/cloudflare/quiche
+Build nghttp3
-Build BoringSSL (it needs to be built manually so it can be reused with curl):
+ % cd ..
+ % git clone https://github.com/ngtcp2/nghttp3
+ % cd nghttp3
+ % autoreconf -i
+ % ./configure --prefix=<somewhere2> --enable-lib-only
+ % make
+ % make install
- % cd quiche/deps/boringssl
- % mkdir build
- % cd build
- % cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
+Build ngtcp2
+
+ % cd ..
+ % git clone https://github.com/ngtcp2/ngtcp2
+ % cd ngtcp2
+ % autoreconf -i
+ % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somewhere1>/lib" --prefix=<somewhere3>
% make
+ % make install
+
+Build curl
+
% cd ..
- % mkdir -p .openssl/lib
- % cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
- % ln -s $PWD/include .openssl
+ % git clone https://github.com/curl/curl
+ % cd curl
+ % ./buildconf
+ % ./configure --without-ssl --with-gnutls=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3> --enable-alt-svc
+ % make
+
+# quiche version
+
+## build
-Build quiche:
+Build quiche and BoringSSL:
- % cd ../..
- % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta
+ % git clone --recursive https://github.com/cloudflare/quiche
+ % cd quiche
+ % cargo build --release --features pkg-config-meta,qlog
+ % mkdir deps/boringssl/src/lib
+ % ln -vnf $(find target/release -name libcrypto.a -o -name libssl.a) deps/boringssl/src/lib/
-Clone and build curl:
+Build curl:
% cd ..
% git clone https://github.com/curl/curl
% cd curl
% ./buildconf
- % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release
+ % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/src --with-quiche=$PWD/../quiche/target/release --enable-alt-svc
% make
## Run
diff --git a/docs/INSTALL.cmake b/docs/INSTALL.cmake
index 03328cbcd..828d9b9c5 100644
--- a/docs/INSTALL.cmake
+++ b/docs/INSTALL.cmake
@@ -24,9 +24,8 @@ Current flaws in the curl CMake build
Missing features in the cmake build:
- Builds libcurl without large file support
- - Does not support all SSL libraries (only OpenSSL, WinSSL, DarwinSSL, and
- mbed TLS)
- - Doesn't build with SCP and SFTP support (libssh2) (see issue #1155)
+ - Does not support all SSL libraries (only OpenSSL, Schannel,
+ Secure Transport, and mbed TLS, NSS, WolfSSL)
- Doesn't allow different resolver backends (no c-ares build support)
- No RTMP support built
- Doesn't allow build curl and libcurl debug enabled
diff --git a/docs/INSTALL.md b/docs/INSTALL.md
index 78d632c70..33b439ec5 100644
--- a/docs/INSTALL.md
+++ b/docs/INSTALL.md
@@ -115,11 +115,11 @@ libressl.
- GnuTLS: `--without-ssl --with-gnutls`.
- wolfSSL: `--without-ssl --with-wolfssl`
- NSS: `--without-ssl --with-nss`
- - PolarSSL: `--without-ssl --with-polarssl`
- mbedTLS: `--without-ssl --with-mbedtls`
- schannel: `--without-ssl --with-schannel`
- secure transport: `--without-ssl --with-secure-transport`
- MesaLink: `--without-ssl --with-mesalink`
+ - BearSSL: `--without-ssl --with-bearssl`
# Windows
@@ -195,20 +195,8 @@ The configure utility, unfortunately, is not available for the Windows
environment, therefore, you cannot use the various disable-protocol options of
the configure utility on this platform.
-However, you can use the following defines to disable specific
-protocols:
-
- - `HTTP_ONLY` disables all protocols except HTTP
- - `CURL_DISABLE_FTP` disables FTP
- - `CURL_DISABLE_LDAP` disables LDAP
- - `CURL_DISABLE_TELNET` disables TELNET
- - `CURL_DISABLE_DICT` disables DICT
- - `CURL_DISABLE_FILE` disables FILE
- - `CURL_DISABLE_TFTP` disables TFTP
- - `CURL_DISABLE_HTTP` disables HTTP
- - `CURL_DISABLE_IMAP` disables IMAP
- - `CURL_DISABLE_POP3` disables POP3
- - `CURL_DISABLE_SMTP` disables SMTP
+You can use specific defines to disable specific protocols and features. See
+[CURL-DISABLE.md](CURL-DISABLE-md) for the full list.
If you want to set any of these defines you have the following options:
@@ -270,9 +258,9 @@ Windows you should choose another SSL backend such as OpenSSL.
On modern Apple operating systems, curl can be built to use Apple's SSL/TLS
implementation, Secure Transport, instead of OpenSSL. To build with Secure
-Transport for SSL/TLS, use the configure option `--with-darwinssl`. (It is not
-necessary to use the option `--without-ssl`.) This feature requires iOS 5.0 or
-later, or OS X 10.5 ("Leopard") or later.
+Transport for SSL/TLS, use the configure option `--with-secure-transport`. (It
+is not necessary to use the option `--without-ssl`.) This feature requires iOS
+5.0 or later, or OS X 10.5 ("Leopard") or later.
When Secure Transport is in use, the curl options `--cacert` and `--capath`
and their libcurl equivalents, will be ignored, because Secure Transport uses
@@ -293,9 +281,50 @@ commands in curl's directory in the shell will build the code such that it
will run on cats as old as OS X 10.6 ("Snow Leopard") (using bash):
export MACOSX_DEPLOYMENT_TARGET="10.6"
- ./configure --with-darwinssl
+ ./configure --with-secure-transport
make
+# Android
+
+When building curl for Android it's recommended to use a Linux environment
+since using curl's `configure` script is the easiest way to build curl
+for Android. Before you can build curl for Android, you need to install the
+Android NDK first. This can be done using the SDK Manager that is part of
+Android Studio. Once you have installed the Android NDK, you need to figure out
+where it has been installed and then set up some environment variables before
+launching `configure`. On macOS, those variables could look like this to compile
+for `aarch64` and API level 29:
+
+ export NDK=~/Library/Android/sdk/ndk/20.1.5948944
+ export HOST_TAG=darwin-x86_64
+ export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
+ export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
+ export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
+ export CC=$TOOLCHAIN/bin/aarch64-linux-android29-clang
+ export CXX=$TOOLCHAIN/bin/aarch64-linux-android29-clang++
+ export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
+ export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
+ export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
+
+When building on Linux or targeting other API levels or architectures, you need
+to adjust those variables accordingly. After that you can build curl like this:
+
+ ./configure --host aarch64-linux-android --with-pic --disable-shared
+
+Note that this won't give you SSL/TLS support. If you need SSL/TLS, you have
+to build curl against a SSL/TLS layer, e.g. OpenSSL, because it's impossible for
+curl to access Android's native SSL/TLS layer. To build curl for Android using
+OpenSSL, follow the OpenSSL build instructions and then install `libssl.a` and
+`libcrypto.a` to `$TOOLCHAIN/sysroot/usr/lib` and copy `include/openssl` to
+`$TOOLCHAIN/sysroot/usr/include`. Now you can build curl for Android using
+OpenSSL like this:
+
+ ./configure --host aarch64-linux-android --with-pic --disable-shared --with-ssl="$TOOLCHAIN/sysroot/usr"
+
+Note, however, that you must target at least Android M (API level 23) or `configure`
+won't be able to detect OpenSSL since `stderr` (and the like) weren't defined
+before Android M.
+
# Cross compile
Download and unpack the curl package.
diff --git a/docs/INTERNALS.md b/docs/INTERNALS.md
index 9ae722898..e9be0889a 100644
--- a/docs/INTERNALS.md
+++ b/docs/INTERNALS.md
@@ -85,7 +85,7 @@ Dependencies
------------
- OpenSSL 0.9.7
- - GnuTLS 2.11.3
+ - GnuTLS 3.1.10
- zlib 1.1.4
- libssh2 0.16
- c-ares 1.6.0
@@ -95,9 +95,9 @@ Dependencies
- MIT Kerberos 1.2.4
- GSKit V5R3M0
- NSS 3.14.x
- - PolarSSL 1.3.0
- Heimdal ?
- - nghttp2 1.0.0
+ - nghttp2 1.12.0
+ - WinSock 2.2 (on Windows 95+ and Windows CE .NET 4.1+)
Operating Systems
-----------------
@@ -147,6 +147,8 @@ Windows vs Unix
also do it etc there might be reasons for applications to alter that
behaviour.
+ We require WinSock version 2.2 and load this version during global init.
+
3. The file descriptors for network communication and file operations are
not as easily interchangeable as in Unix.
@@ -324,9 +326,9 @@ FTP
Kerberos
========
- Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also
- `curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and
- `socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics.
+ Kerberos support is mainly in `lib/krb5.c` but also `curl_sasl_sspi.c` and
+ `curl_sasl_gssapi.c` for the email protocols and `socks_gssapi.c` and
+ `socks_sspi.c` for SOCKS5 proxy specifics.
<a name="telnet"></a>
TELNET
@@ -501,7 +503,7 @@ Client
status and exits.
When the operation is done, the `ourWriteOut()` function in `src/writeout.c`
- may be called to report about the operation. That function is using the
+ may be called to report about the operation. That function is mostly using the
`curl_easy_getinfo()` function to extract useful information from the curl
session.
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index 5134e7367..1aa025fd5 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -12,6 +12,7 @@ check the changelog of the current development status, as one or more of these
problems may have been fixed or changed somewhat since this was written!
1. HTTP
+ 1.2 Multiple methods in a single WWW-Authenticate: header
1.3 STARTTRANSFER time is wrong for HTTP POSTs
1.4 multipart formposts file name encoding
1.5 Expect-100 meets 417
@@ -24,37 +25,39 @@ problems may have been fixed or changed somewhat since this was written!
2. TLS
2.1 CURLINFO_SSL_VERIFYRESULT has limited support
2.2 DER in keychain
- 2.3 GnuTLS backend skips really long certificate fields
- 2.4 DarwinSSL won't import PKCS#12 client certificates without a password
+ 2.3 Unable to use PKCS12 certificate with Secure Transport
+ 2.4 Secure Transport won't import PKCS#12 client certificates without a password
2.5 Client cert handling with Issuer DN differs between backends
2.6 CURL_GLOBAL_SSL
2.7 Client cert (MTLS) issues with Schannel
2.8 Schannel disable CURLOPT_SSL_VERIFYPEER and verify hostname
+ 2.9 TLS session cache doesn't work with TFO
+ 2.10 Store TLS context per transfer instead of per connection
+ 2.11 Schannel TLS 1.2 handshake bug in old Windows versions
3. Email protocols
3.1 IMAP SEARCH ALL truncated response
3.2 No disconnect command
- 3.3 SMTP to multiple recipients
- 3.4 POP3 expects "CRLF.CRLF" eob for some single-line responses
+ 3.3 POP3 expects "CRLF.CRLF" eob for some single-line responses
+ 3.4 AUTH PLAIN for SMTP is not working on all servers
4. Command line
4.1 -J and -O with %-encoded file names
4.2 -J with -C - fails
4.3 --retry and transfer timeouts
- 4.4 --upload-file . hang if delay in STDIN
- 4.5 Improve --data-urlencode space encoding
+ 4.4 Improve --data-urlencode space encoding
5. Build and portability issues
- 5.1 USE_UNIX_SOCKETS on Windows
+ 5.1 OS400 port requires deprecated IBM library
5.2 curl-config --libs contains private details
5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
- 5.4 Cannot compile against a static build of OpenLDAP
- 5.5 can't handle Unicode arguments in Windows
+ 5.4 Build with statically built dependency
+ 5.5 can't handle Unicode arguments in non-Unicode builds on Windows
5.6 cmake support gaps
5.7 Visual Studio project gaps
5.8 configure finding libs in wrong directory
5.9 Utilize Requires.private directives in libcurl.pc
- 5.10 IDN tests failing on Windows / MSYS2
+ 5.11 configure --with-gssapi with Heimdal is ignored on macOS
6. Authentication
6.1 NTLM authentication and unicode
@@ -64,6 +67,7 @@ problems may have been fixed or changed somewhat since this was written!
6.5 NTLM doesn't support password with § character
6.6 libcurl can fail to try alternatives with --proxy-any
6.7 Don't clear digest for single realm
+ 6.8 RTSP authentication breaks without redirect support
7. FTP
7.1 FTP without or slow 220 response
@@ -75,7 +79,7 @@ problems may have been fixed or changed somewhat since this was written!
7.7 FTP and empty path parts in the URL
7.8 Premature transfer end but healthy control channel
7.9 Passive transfer tries only one IP address
- 7.10 Stick to same family over SOCKS proxy
+ 7.10 FTPS needs session reuse
8. TELNET
8.1 TELNET and time limitations don't work
@@ -83,10 +87,9 @@ problems may have been fixed or changed somewhat since this was written!
9. SFTP and SCP
9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct
+ 9.2 wolfssh: publickey auth doesn't work
10. SOCKS
- 10.1 SOCKS proxy connections are done blocking
- 10.2 SOCKS don't support timeouts
10.3 FTPS over SOCKS
10.4 active FTP over a SOCKS
@@ -98,10 +101,16 @@ problems may have been fixed or changed somewhat since this was written!
11.5 Connection information when using TCP Fast Open
11.6 slow connect to localhost on Windows
11.7 signal-based resolver timeouts
+ 11.8 DoH leaks memory after followlocation
+ 11.9 DoH doesn't inherit all transfer options
+ 11.10 Blocking socket operations in non-blocking API
+ 11.11 A shared connection cache is not thread-safe
+ 11.12 'no_proxy' string-matches IPv6 numerical addreses
12. LDAP and OpenLDAP
12.1 OpenLDAP hangs after returning results
12.2 LDAP on Windows does authentication wrong?
+ 12.3 LDAP on Windows doesn't work
13. TCP/IP
13.1 --interface for ipv6 binds to unusable IP address
@@ -113,6 +122,13 @@ problems may have been fixed or changed somewhat since this was written!
1. HTTP
+1.2 Multiple methods in a single WWW-Authenticate: header
+
+ The HTTP responses headers WWW-Authenticate: can provide information about
+ multiple authentication methods as multiple headers or as several methods
+ within a single header. The latter way, several methods in the same physical
+ line, is not supported by libcurl's parser. (For no good reason.)
+
1.3 STARTTRANSFER time is wrong for HTTP POSTs
Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with
@@ -141,7 +157,7 @@ problems may have been fixed or changed somewhat since this was written!
1.6 Unnecessary close when 401 received waiting for 100
libcurl closes the connection if an HTTP 401 reply is received while it is
- waiting for the the 100-continue response.
+ waiting for the 100-continue response.
https://curl.haxx.se/mail/lib-2008-08/0462.html
1.7 Deflate error after all content was received
@@ -189,21 +205,19 @@ problems may have been fixed or changed somewhat since this was written!
2.1 CURLINFO_SSL_VERIFYRESULT has limited support
- CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS
- backends, so relying on this information in a generic app is flaky.
+ CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL, NSS and
+ GnuTLS backends, so relying on this information in a generic app is flaky.
2.2 DER in keychain
Curl doesn't recognize certificates in DER format in keychain, but it works
with PEM. https://curl.haxx.se/bug/view.cgi?id=1065
-2.3 GnuTLS backend skips really long certificate fields
+2.3 Unable to use PKCS12 certificate with Secure Transport
- libcurl calls gnutls_x509_crt_get_dn() with a fixed buffer size and if the
- field is too long in the cert, it'll just return an error and the field will
- be displayed blank.
+ See https://github.com/curl/curl/issues/5403
-2.4 DarwinSSL won't import PKCS#12 client certificates without a password
+2.4 Secure Transport won't import PKCS#12 client certificates without a password
libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that
function rejects certificates that do not have a password.
@@ -255,6 +269,28 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/3284
+2.9 TLS session cache doesn't work with TFO
+
+ See https://github.com/curl/curl/issues/4301
+
+2.10 Store TLS context per transfer instead of per connection
+
+ The GnuTLS `backend->cred` and the OpenSSL `backend->ctx` data and their
+ proxy versions (and possibly other TLS backends), could be better moved to be
+ stored in the Curl_easy handle instead of in per connection so that a single
+ transfer that makes multiple connections can reuse the context and reduce
+ memory consumption.
+
+ https://github.com/curl/curl/issues/5102
+
+2.11 Schannel TLS 1.2 handshake bug in old Windows versions
+
+ In old versions of Windows such as 7 and 8.1 the Schannel TLS 1.2 handshake
+ implementation likely has a bug that can rarely cause the key exchange to
+ fail, resulting in error SEC_E_BUFFER_TOO_SMALL or SEC_E_MESSAGE_ALTERED.
+
+ https://github.com/curl/curl/issues/5488
+
3. Email protocols
3.1 IMAP SEARCH ALL truncated response
@@ -269,20 +305,18 @@ problems may have been fixed or changed somewhat since this was written!
The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 and
SMTP if a failure occurs during the authentication phase of a connection.
-3.3 SMTP to multiple recipients
-
- When sending data to multiple recipients, curl will abort and return failure
- if one of the recipients indicate failure (on the "RCPT TO"
- command). Ordinary mail programs would proceed and still send to the ones
- that can receive data. This is subject for change in the future.
- https://curl.haxx.se/bug/view.cgi?id=1116
-
-3.4 POP3 expects "CRLF.CRLF" eob for some single-line responses
+3.3 POP3 expects "CRLF.CRLF" eob for some single-line responses
You have to tell libcurl not to expect a body, when dealing with one line
response commands. Please see the POP3 examples and test cases which show
this for the NOOP and DELE commands. https://curl.haxx.se/bug/?i=740
+3.4 AUTH PLAIN for SMTP is not working on all servers
+
+ Specifying "--login-options AUTH=PLAIN" on the command line doesn't seem to
+ work correctly.
+
+ See https://github.com/curl/curl/issues/4080
4. Command line
@@ -320,15 +354,7 @@ problems may have been fixed or changed somewhat since this was written!
https://curl.haxx.se/mail/lib-2008-01/0080.html and Mandriva bug report
https://qa.mandriva.com/show_bug.cgi?id=22565
-4.4 --upload-file . hangs if delay in STDIN
-
- "(echo start; sleep 1; echo end) | curl --upload-file . http://mywebsite -vv"
-
- ... causes a hang when it shouldn't.
-
- See https://github.com/curl/curl/issues/2051
-
-4.5 Improve --data-urlencode space encoding
+4.4 Improve --data-urlencode space encoding
ASCII space characters in --data-urlencode are currently encoded as %20
rather than +, which RFC 1866 says should be used.
@@ -337,12 +363,13 @@ problems may have been fixed or changed somewhat since this was written!
5. Build and portability issues
-5.1 USE_UNIX_SOCKETS on Windows
+5.1 OS400 port requires deprecated IBM library
- Due to incorrect CMake checks for the presense of the feature, it will never
- be enabled for windows in a cmake build.
+ curl for OS400 requires QADRT to build, which provides ASCII wrappers for
+ libc/POSIX functions in the ILE, but IBM no longer supports or even offers
+ this library to download.
- See https://github.com/curl/curl/issues/4040
+ See https://github.com/curl/curl/issues/5176
5.2 curl-config --libs contains private details
@@ -354,20 +381,40 @@ problems may have been fixed or changed somewhat since this was written!
See https://github.com/curl/curl/issues/2905
-5.4 Cannot compile against a static build of OpenLDAP
+5.4 Build with statically built dependency
+
+ The build scripts in curl (autotools, cmake and others) are primarily done to
+ work with shared/dynamic third party dependencies. When linking with shared
+ libraries, the dependency "chain" is handled automatically by the library
+ loader - on all modern systems.
+
+ If you instead link with a static library, we need to provide all the
+ dependency libraries already at the link command line.
+
+ Figuring out all the dependency libraries for a given library is hard, as it
+ might also involve figuring out the dependencies of the dependencies and they
+ may vary between platforms and even change between versions.
+
+ When using static dependencies, the build scripts will mostly assume that
+ you, the user, will provide all the necessary additional dependency libraries
+ as additional arguments in the build. With configure, by setting LIBS/LDFLAGS
+ on the command line.
- See https://github.com/curl/curl/issues/2367
+ We welcome help to improve curl's ability to link with static libraries, but
+ it is likely a task that we can never fully support.
-5.5 can't handle Unicode arguments in Windows
+5.5 can't handle Unicode arguments in non-Unicode builds on Windows
If a URL or filename can't be encoded using the user's current codepage then
it can only be encoded properly in the Unicode character set. Windows uses
UTF-16 encoding for Unicode and stores it in wide characters, however curl
- and libcurl are not equipped for that at the moment. And, except for Cygwin,
- Windows can't use UTF-8 as a locale.
+ and libcurl are not equipped for that at the moment except when built with
+ _UNICODE and UNICODE defined. And, except for Cygwin, Windows can't use UTF-8
+ as a locale.
https://curl.haxx.se/bug/?i=345
https://curl.haxx.se/bug/?i=731
+ https://curl.haxx.se/bug/?i=3747
5.6 cmake support gaps
@@ -420,24 +467,23 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/864
-5.10 IDN tests failing on Windows / MSYS2
+5.11 configure --with-gssapi with Heimdal is ignored on macOS
- It seems like MSYS2 does some UTF-8-to-something-else conversion for Windows
- compatibility.
+ ... unless you also pass --with-gssapi-libs
- https://github.com/curl/curl/issues/3747
+ https://github.com/curl/curl/issues/3841
6. Authentication
6.1 NTLM authentication and unicode
NTLM authentication involving unicode user name or password only works
- properly if built with UNICODE defined together with the WinSSL/Schannel
+ properly if built with UNICODE defined together with the Schannel
backend. The original problem was mentioned in:
https://curl.haxx.se/mail/lib-2009-10/0024.html
https://curl.haxx.se/bug/view.cgi?id=896
- The WinSSL/Schannel version verified to work as mentioned in
+ The Schannel version verified to work as mentioned in
https://curl.haxx.se/mail/lib-2012-07/0073.html
6.2 MIT Kerberos for Windows build
@@ -483,6 +529,15 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/3267
+6.8 RTSP authentication breaks without redirect support
+
+ RTSP authentication broke in 7.66.0. A work-around is to enable RTSP in
+ CURLOPT_REDIR_PROTOCOLS. Authentication should however not be considered an
+ actual redirect so a "proper" fix needs to be different and not require users
+ to allow redirects to RTSP to work.
+
+ See https://github.com/curl/curl/pull/4750
+
7. FTP
7.1 FTP without or slow 220 response
@@ -572,15 +627,13 @@ problems may have been fixed or changed somewhat since this was written!
See https://github.com/curl/curl/issues/1508
-7.10 Stick to same family over SOCKS proxy
+7.10 FTPS needs session reuse
- When asked to do FTP over a SOCKS proxy, it might connect to the proxy (and
- then subsequently to the remote server) using for example IPv4. When doing
- the second connection, curl should make sure that the second connection is
- using the same IP protocol version as the first connection did and not try
- others, since the remote server will only accept the same.
+ When the control connection is reused for a subsequent transfer, some FTPS
+ servers complain about "missing session reuse" for the data channel for the
+ second transfer.
- See https://curl.haxx.se/mail/archive-2018-07/0000.html
+ https://github.com/curl/curl/issues/4654
8. TELNET
@@ -606,23 +659,15 @@ problems may have been fixed or changed somewhat since this was written!
report but it cannot be accepted as-is. See
https://curl.haxx.se/bug/view.cgi?id=748
+9.2 wolfssh: publickey auth doesn't work
-10. SOCKS
-
-10.1 SOCKS proxy connections are done blocking
-
- Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very bad
- when used with the multi interface.
+ When building curl to use the wolfSSH backend for SFTP, the publickey
+ authentication doesn't work. This is simply functionality not written for curl
+ yet, the necessary API for make this work is provided by wolfSSH.
-10.2 SOCKS don't support timeouts
+ See https://github.com/curl/curl/issues/4820
- The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
- According to bug #1556528, even the SOCKS5 connect code does not do it right:
- https://curl.haxx.se/bug/view.cgi?id=604
-
- When connecting to a SOCK proxy, the (connect) timeout is not properly
- acknowledged after the actual TCP connect (during the SOCKS "negotiate"
- phase).
+10. SOCKS
10.3 FTPS over SOCKS
@@ -674,7 +719,8 @@ problems may have been fixed or changed somewhat since this was written!
CURLINFO_LOCAL_PORT (and possibly a few other) fails when TCP Fast Open is
enabled.
- See https://github.com/curl/curl/issues/1332
+ See https://github.com/curl/curl/issues/1332 and
+ https://github.com/curl/curl/issues/4296
11.6 slow connect to localhost on Windows
@@ -702,6 +748,32 @@ problems may have been fixed or changed somewhat since this was written!
Also, alarm() provides timeout resolution only to the nearest second. alarm
ought to be replaced by setitimer on systems that support it.
+11.8 DoH leaks memory after followlocation
+
+ https://github.com/curl/curl/issues/4592
+
+11.9 DoH doesn't inherit all transfer options
+
+ https://github.com/curl/curl/issues/4578
+
+11.10 Blocking socket operations in non-blocking API
+
+ The list of blocking socket operations is in TODO section "More non-blocking".
+
+11.11 A shared connection cache is not thread-safe
+
+ The share interface offers CURL_LOCK_DATA_CONNECT to have multiple easy
+ handle share a connection cache, but due to how connections are used they are
+ still not thread-safe when used shared.
+
+ See https://github.com/curl/curl/issues/4915 and lib1541.c
+
+11.12 'no_proxy' string-matches IPv6 numerical addreses
+
+ This has the downside that "::1" for example doesn't match "::0:1" even
+ though they are in fact the same address.
+
+ See https://github.com/curl/curl/issues/5745
12. LDAP and OpenLDAP
@@ -728,6 +800,13 @@ problems may have been fixed or changed somewhat since this was written!
https://github.com/curl/curl/issues/3116
+12.3 LDAP on Windows doesn't work
+
+ A simple curl command line getting "ldap://ldap.forumsys.com" returns an
+ error that says "no memory" !
+
+ https://github.com/curl/curl/issues/4261
+
13. TCP/IP
13.1 --interface for ipv6 binds to unusable IP address
diff --git a/docs/LICENSE-MIXING.md b/docs/LICENSE-MIXING.md
deleted file mode 100644
index e4f6759e4..000000000
--- a/docs/LICENSE-MIXING.md
+++ /dev/null
@@ -1,123 +0,0 @@
-License Mixing
-==============
-
-libcurl can be built to use a fair amount of various third party libraries,
-libraries that are written and provided by other parties that are distributed
-using their own licenses. Even libcurl itself contains code that may cause
-problems to some. This document attempts to describe what licenses libcurl and
-the other libraries use and what possible dilemmas linking and mixing them all
-can lead to for end users.
-
-I am not a lawyer and this is not legal advice!
-
-One common dilemma is that [GPL](https://www.gnu.org/licenses/gpl.html)
-licensed code is not allowed to be linked with code licensed under the
-[Original BSD license](https://spdx.org/licenses/BSD-4-Clause.html) (with the
-announcement clause). You may still build your own copies that use them all,
-but distributing them as binaries would be to violate the GPL license - unless
-you accompany your license with an
-[exception](https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs). This
-particular problem was addressed when the [Modified BSD
-license](https://opensource.org/licenses/BSD-3-Clause) was created, which does
-not have the announcement clause that collides with GPL.
-
-## libcurl
-
- Uses an [MIT style license](https://curl.haxx.se/docs/copyright.html) that is
- very liberal.
-
-## OpenSSL
-
- (May be used for SSL/TLS support) Uses an Original BSD-style license with an
- announcement clause that makes it "incompatible" with GPL. You are not
- allowed to ship binaries that link with OpenSSL that includes GPL code
- (unless that specific GPL code includes an exception for OpenSSL - a habit
- that is growing more and more common). If OpenSSL's licensing is a problem
- for you, consider using another TLS library.
-
-## GnuTLS
-
- (May be used for SSL/TLS support) Uses the
- [LGPL](https://www.gnu.org/licenses/lgpl.html) license. If this is a problem
- for you, consider using another TLS library. Also note that GnuTLS itself
- depends on and uses other libs (libgcrypt and libgpg-error) and they too are
- LGPL- or GPL-licensed.
-
-## WolfSSL
-
- (May be used for SSL/TLS support) Uses the GPL license or a proprietary
- license. If this is a problem for you, consider using another TLS library.
-
-## NSS
-
- (May be used for SSL/TLS support) Is covered by the
- [MPL](https://www.mozilla.org/MPL/) license, the GPL license and the LGPL
- license. You may choose to license the code under MPL terms, GPL terms, or
- LGPL terms. These licenses grant you different permissions and impose
- different obligations. You should select the license that best meets your
- needs.
-
-## mbedTLS
-
- (May be used for SSL/TLS support) Uses the [Apache 2.0
- license](https://opensource.org/licenses/Apache-2.0) or the GPL license.
- You may choose to license the code under Apache 2.0 terms or GPL terms.
- These licenses grant you different permissions and impose different
- obligations. You should select the license that best meets your needs.
-
-## BoringSSL
-
- (May be used for SSL/TLS support) As an OpenSSL fork, it has the same
- license as that.
-
-## libressl
-
- (May be used for SSL/TLS support) As an OpenSSL fork, it has the same
- license as that.
-
-## c-ares
-
- (Used for asynchronous name resolves) Uses an MIT license that is very
- liberal and imposes no restrictions on any other library or part you may link
- with.
-
-## zlib
-
- (Used for compressed Transfer-Encoding support) Uses an MIT-style license
- that shouldn't collide with any other library.
-
-## MIT Kerberos
-
- (May be used for GSS support) MIT licensed, that shouldn't collide with any
- other parts.
-
-## Heimdal
-
- (May be used for GSS support) Heimdal is Original BSD licensed with the
- announcement clause.
-
-## GNU GSS
-
- (May be used for GSS support) GNU GSS is GPL licensed. Note that you may not
- distribute binary curl packages that uses this if you build curl to also link
- and use any Original BSD licensed libraries!
-
-## libidn
-
- (Used for IDNA support) Uses the GNU Lesser General Public License [3]. LGPL
- is a variation of GPL with slightly less aggressive "copyleft". This license
- requires more requirements to be met when distributing binaries, see the
- license for details. Also note that if you distribute a binary that includes
- this library, you must also include the full LGPL license text. Please
- properly point out what parts of the distributed package that the license
- addresses.
-
-## OpenLDAP
-
- (Used for LDAP support) Uses a Modified BSD-style license. Since libcurl uses
- OpenLDAP as a shared library only, I have not heard of anyone that ships
- OpenLDAP linked with libcurl in an app.
-
-## libssh2
-
- (Used for scp and sftp support) libssh2 uses a Modified BSD-style license.
diff --git a/docs/MAIL-ETIQUETTE b/docs/MAIL-ETIQUETTE
index 07660a001..9d210a655 100644
--- a/docs/MAIL-ETIQUETTE
+++ b/docs/MAIL-ETIQUETTE
@@ -170,7 +170,7 @@ MAIL ETIQUETTE
send your email to.
Your email as sent to a curl mailing list will end up in mail archives, on
- the curl web site and elsewhere, for others to see and read. Today and in
+ the curl website and elsewhere, for others to see and read. Today and in
the future. In addition to the archives, the mail is sent out to thousands
of individuals. There is no way to undo a sent email.
diff --git a/docs/MQTT.md b/docs/MQTT.md
new file mode 100644
index 000000000..741b07297
--- /dev/null
+++ b/docs/MQTT.md
@@ -0,0 +1,29 @@
+# MQTT in curl
+
+## Usage
+
+A plain "GET" subscribes to the topic and prints all published messages.
+Doing a "POST" publishes the post data to the topic and exits.
+
+Example subscribe:
+
+ curl mqtt://host/home/bedroom/temp
+
+Example publish:
+
+ curl -d 75 mqtt://host/home/bedroom/dimmer
+
+## What does curl deliver as a response to a subscribe
+
+It outputs two bytes topic length (MSB | LSB), the topic followed by the
+payload.
+
+## Caveats
+
+Remaining limitations:
+ - No username support
+ - Only QoS level 0 is implemented for publish
+ - No way to set retain flag for publish
+ - No username/password support
+ - No TLS (mqtts) support
+ - Naive EAGAIN handling won't handle split messages
diff --git a/docs/Makefile.am b/docs/Makefile.am
index b26967024..b7d179228 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -45,15 +45,18 @@ EXTRA_DIST = \
ALTSVC.md \
BINDINGS.md \
BUG-BOUNTY.md \
- BUGS \
+ BUGS.md \
CHECKSRC.md \
CIPHERS.md \
CMakeLists.txt \
CODE_OF_CONDUCT.md \
+ CODE_REVIEW.md \
CODE_STYLE.md \
CONTRIBUTE.md \
+ CURL-DISABLE.md \
DEPRECATE.md \
- ESNI.md \
+ DYNBUF.md \
+ ECH.md \
EXPERIMENTAL.md \
FAQ \
FEATURES \
@@ -68,23 +71,20 @@ EXTRA_DIST = \
INSTALL.md \
INTERNALS.md \
KNOWN_BUGS \
- LICENSE-MIXING.md \
MAIL-ETIQUETTE \
+ MQTT.md \
+ options-in-versions \
PARALLEL-TRANSFERS.md \
- README.cmake \
README.md \
- README.netware \
- README.win32 \
RELEASE-PROCEDURE.md \
- RESOURCES \
ROADMAP.md \
SECURITY-PROCESS.md \
SSL-PROBLEMS.md \
SSLCERTS.md \
THANKS \
TODO \
- TheArtOfHttpScripting \
- VERSIONS
+ TheArtOfHttpScripting.md \
+ VERSIONS.md
MAN2HTML= roffit $< >$@
diff --git a/docs/PARALLEL-TRANSFERS.md b/docs/PARALLEL-TRANSFERS.md
index d3b38aee1..da688ea05 100644
--- a/docs/PARALLEL-TRANSFERS.md
+++ b/docs/PARALLEL-TRANSFERS.md
@@ -18,7 +18,7 @@ completely different than the regular one used for each single transfer.
o percent download (if known, which means *all* transfers need to have a
known size)
- o precent upload (if known, with the same caveat as for download)
+ o percent upload (if known, with the same caveat as for download)
o total amount of downloaded data
o total amount of uploaded data
o number of transfers to perform
diff --git a/docs/README.cmake b/docs/README.cmake
deleted file mode 100644
index 084c1de6d..000000000
--- a/docs/README.cmake
+++ /dev/null
@@ -1,16 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-README.cmake
- Read the README file first.
-
- Curl contains CMake build files that provide a way to build Curl with the
- CMake build tool (www.cmake.org). CMake is a cross platform meta build tool
- that generates native makefiles and IDE project files. The CMake build
- system can be used to build Curl on any of its supported platforms.
-
- Read the INSTALL.cmake file for instructions on how to compile curl with
- CMake.
diff --git a/docs/README.md b/docs/README.md
index 6ee42aad3..0521937d1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -7,6 +7,6 @@ subdirectories, using several different formats. Some of them are not ideal
for reading directly in your browser.
If you'd rather see the rendered version of the documentation, check out the
-curl web site's [documentation section](https://curl.haxx.se/docs/) for
+curl website's [documentation section](https://curl.haxx.se/docs/) for
general curl stuff or the [libcurl section](https://curl.haxx.se/libcurl/) for
libcurl related documentation.
diff --git a/docs/README.netware b/docs/README.netware
deleted file mode 100644
index e6e1e0002..000000000
--- a/docs/README.netware
+++ /dev/null
@@ -1,24 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-README.netware
-
- Read the README file first.
-
- Curl has been successfully compiled with gcc / nlmconv on different flavours
- of Linux as well as with the official Metrowerks CodeWarrior compiler.
- While not being the main development target, a continuously growing share of
- curl users are NetWare-based, especially also consuming the lib from PHP.
-
- The unix-style man pages are tricky to read on windows, so therefore all
- those pages are also provided as web pages on the curl web site.
-
- The main curl.1 man page is also "built-in" in the command line tool. Use a
- command line similar to this in order to extract a separate text file:
-
- curl -M >manual.txt
-
- Read the INSTALL file for instructions on how to compile curl self.
diff --git a/docs/README.win32 b/docs/README.win32
deleted file mode 100644
index ca34dd162..000000000
--- a/docs/README.win32
+++ /dev/null
@@ -1,23 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-README.win32
-
- Read the README file first.
-
- Curl has been compiled, built and run on all sorts of Windows and win32
- systems. While not being the main develop target, a fair share of curl users
- are win32-based.
-
- The unix-style man pages are tricky to read on windows, so therefore all
- those pages are also provided as web pages on the curl web site.
-
- The main curl.1 man page is also "built-in" in the command line tool. Use a
- command line similar to this in order to extract a separate text file:
-
- curl -M >manual.txt
-
- Read the INSTALL file for instructions on how to compile curl self.
diff --git a/docs/RELEASE-PROCEDURE.md b/docs/RELEASE-PROCEDURE.md
index 70609fd70..b53e5a397 100644
--- a/docs/RELEASE-PROCEDURE.md
+++ b/docs/RELEASE-PROCEDURE.md
@@ -4,6 +4,8 @@ curl release procedure - how to do a release
in the source code repo
-----------------------
+- run `./scripts/copyright.pl` and correct possible omissions
+
- edit `RELEASE-NOTES` to be accurate
- update `docs/THANKS`
@@ -40,7 +42,7 @@ in the curl-www repo
- make sure all relevant changes are committed and pushed on the master branch
- (the web site then updates its contents automatically)
+ (the website then updates its contents automatically)
on github
---------
@@ -61,12 +63,12 @@ celebrate
curl release scheduling
=======================
-Basics
-------
+Release Cycle
+-------------
We do releases every 8 weeks on Wednesdays. If critical problems arise, we can
insert releases outside of the schedule or we can move the release date - but
-this is very rare.
+this is rare.
Each 8 week release cycle is split in two 4-week periods.
@@ -78,20 +80,30 @@ Each 8 week release cycle is split in two 4-week periods.
then only focus on fixing bugs and polishing things to make a solid coming
release.
+- After a regular procedure-following release (made on Wednesdays), the
+ feature window remains closed until the following Monday in case of special
+ actions or patch releases etc.
+
+If a future release date happens to end up on a "bad date", like in the middle
+of common public holidays or when the lead release manager is away traveling,
+the release date can be moved forwards or backwards a full week. This is then
+advertised well in advance.
+
Coming dates
------------
Based on the description above, here are some planned release dates (at the
time of this writing):
-- May 22, 2019
-- July 17, 2019
-- September 11, 2019
-- November 6, 2019
-- January 8, 2020 (moved)
-- February 27, 2020
-- April 22, 2020
-- June 17, 2020
+- August 19, 2020 (7.72.0)
+- October 14, 2020
+- December 9, 2020
+- February 3, 2021
+- March 31, 2021
+- May 26, 2021
+- July 21, 2021
+- September 15, 2021
+- November 10, 2021
The above (and more) curl-related dates are published in
[iCalendar format](https://calendar.google.com/calendar/ical/c9u5d64odop9js55oltfarjk6g%40group.calendar.google.com/public/basic.ics)
diff --git a/docs/RESOURCES b/docs/RESOURCES
deleted file mode 100644
index 55f75df77..000000000
--- a/docs/RESOURCES
+++ /dev/null
@@ -1,85 +0,0 @@
- _ _ ____ _
- Project ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-
-This document lists documents and standards used by curl.
-
- RFC 959 - FTP Protocol
-
- RFC 1635 - How to Use Anonymous FTP
-
- RFC 1738 - Uniform Resource Locators
-
- RFC 1777 - Lightweight Directory Access Protocol (LDAP)
-
- RFC 1808 - Relative Uniform Resource Locators
-
- RFC 1867 - Form-based File Upload in HTML
-
- RFC 1950 - ZLIB Compressed Data Format Specification
-
- RFC 1951 - DEFLATE Compressed Data Format Specification
-
- RFC 1952 - GZIP File Format Specification
-
- RFC 1959 - LDAP URL Syntax
-
- RFC 2045-2049 - Everything you need to know about MIME! (needed for form
- based upload)
-
- RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616)
-
- RFC 2104 - Keyed-Hashing for Message Authentication
-
- RFC 2109 - HTTP State Management Mechanism (cookie stuff)
- - Also, read Netscape's specification at
- https://curl.haxx.se/rfc/cookie_spec.html
-
- RFC 2183 - The Content-Disposition Header Field
-
- RFC 2195 - CRAM-MD5 Authentication
-
- RFC 2229 - A Dictionary Server Protocol
-
- RFC 2255 - Newer LDAP URL Format
-
- RFC 2231 - MIME Parameter Value and Encoded Word Extensions:
- Character Sets, Languages, and Continuations
-
- RFC 2388 - "Returning Values from Forms: multipart/form-data"
- Use this as an addition to the RFC1867
-
- RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" This
- one obsoletes RFC 1738, but since RFC 1738 is often mentioned
- I've left it in this list.
-
- RFC 2428 - FTP Extensions for IPv6 and NATs
-
- RFC 2577 - FTP Security Considerations
-
- RFC 2616 - HTTP 1.1, the latest
-
- RFC 2617 - HTTP Authentication
-
- RFC 2718 - Guidelines for new URL Schemes
-
- RFC 2732 - Format for Literal IPv6 Addresses in URL's
-
- RFC 2818 - HTTP Over TLS (TLS is the successor to SSL)
-
- RFC 2821 - Simple Mail Transfer Protocol (SMTP)
-
- RFC 2964 - Use of HTTP State Management
-
- RFC 2965 - HTTP State Management Mechanism. Cookies. Obsoletes RFC2109
-
- RFC 3207 - SMTP Over TLS
-
- RFC 4616 - PLAIN Authentication
-
- RFC 4954 - SMTP Authentication
-
- RFC 7932 - Brotli Compressed Data Format
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index 1d47682bf..574bd8103 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -8,49 +8,12 @@ participation.
HSTS
----
- Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).
+ Merge [the existing PR](https://github.com/curl/curl/pull/5896).
- Loading a huge preload file is probably not too interesting to most people,
- but using a custom file and reacting to HSTS response header probably are
- good features.
-
-DNS-over-TLS
-------------
-
- Similar to DNS-over-HTTPS. Could share quite a lot of generic code.
-
-ESNI (Encrypted SNI)
---------------------
+ECH (Encrypted Client Hello - formerly known as ESNI)
+-----------------------------------------------------
See Daniel's post on [Support of Encrypted
SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.
Initial work exists in https://github.com/curl/curl/pull/4011
-
-tiny-curl
----------
-
- There's no immediate action for this but users seem keen on being able to
- building custom minimized versions of libcurl for their products. Make sure
- new features that are "niche" can still be disabled at build-time.
-
-MQTT
-----
-
- Support receiving and sending MQTT messages. Initial work exists in
- https://github.com/curl/curl/pull/3514
-
-Hardcode “localhostâ€
---------------------
-
- No need to resolve it. Avoid a risk where this is resolved over the network
- and actually responds with something else than a local address. Some
- operating systems already do this. Also:
- https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
-
-"menu config"-style build feature selection
--------------------------------------------
-
- Allow easier building of custom libcurl versions with only a selected feature
- where the available features are easily browsable and toggle-able ON/OFF or
- similar.
diff --git a/docs/SECURITY-PROCESS.md b/docs/SECURITY-PROCESS.md
index e844a9a90..d2ac1fd84 100644
--- a/docs/SECURITY-PROCESS.md
+++ b/docs/SECURITY-PROCESS.md
@@ -8,7 +8,7 @@ Publishing Information
----------------------
All known and public curl or libcurl related vulnerabilities are listed on
-[the curl web site security page](https://curl.haxx.se/docs/security.html).
+[the curl website security page](https://curl.haxx.se/docs/security.html).
Security vulnerabilities **should not** be entered in the project's public bug
tracker.
@@ -88,7 +88,7 @@ announcement.
the same manner we always announce releases. It gets sent to the
curl-announce, curl-library and curl-users mailing lists.
-- The security web page on the web site should get the new vulnerability
+- The security web page on the website should get the new vulnerability
mentioned.
curl-security (at haxx dot se)
diff --git a/docs/SSL-PROBLEMS.md b/docs/SSL-PROBLEMS.md
index aaf7bdb59..35000cf76 100644
--- a/docs/SSL-PROBLEMS.md
+++ b/docs/SSL-PROBLEMS.md
@@ -78,7 +78,7 @@
depending on the OS or build configuration. The --ssl-no-revoke option was
introduced in 7.44.0 to disable revocation checking but currently is only
supported for Schannel (the native Windows SSL library), with an exception
- in the case of Windows' Untrusted Publishers blacklist which it seems can't
+ in the case of Windows' Untrusted Publishers block list which it seems can't
be bypassed. This option may have broader support to accommodate other SSL
backends in the future.
diff --git a/docs/SSLCERTS.md b/docs/SSLCERTS.md
index 2c5be68e6..c991f67dd 100644
--- a/docs/SSLCERTS.md
+++ b/docs/SSLCERTS.md
@@ -14,7 +14,7 @@ If libcurl was built with Schannel or Secure Transport support (the native SSL
libraries included in Windows and Mac OS X), then this does not apply to
you. Scroll down for details on how the OS-native engines handle SSL
certificates. If you're not sure, then run "curl -V" and read the results. If
-the version string says "WinSSL" in it, then it was built with Schannel
+the version string says `Schannel` in it, then it was built with Schannel
support.
It is about trust
@@ -55,13 +55,13 @@ server, do one of the following:
2. Get a CA certificate that can verify the remote server and use the proper
option to point out this CA cert for verification when connecting. For
- libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAPATH, capath);`
+ libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAINFO, cacert);`
With the curl command line tool: --cacert [file]
3. Add the CA cert for your server to the existing default CA certificate
- store. The default CA certificate store can changed at compile time with the
- following configure options:
+ store. The default CA certificate store can be changed at compile time with
+ the following configure options:
--with-ca-bundle=FILE: use the specified file as CA certificate store. CA
certificates need to be concatenated in PEM format into this file.
@@ -104,7 +104,7 @@ server, do one of the following:
the security is no better than the way you obtained the certificate.
4. If you're using the curl command line tool, you can specify your own CA
- cert path by setting the environment variable `CURL_CA_BUNDLE` to the path
+ cert file by setting the environment variable `CURL_CA_BUNDLE` to the path
of your choice.
If you're using the curl command line tool on Windows, curl will search
diff --git a/docs/THANKS b/docs/THANKS
index 884906ae2..9e037eecf 100644
--- a/docs/THANKS
+++ b/docs/THANKS
@@ -4,14 +4,15 @@
If you have contributed but are missing here, please let us know!
-"Captain Basil"
-"Spoon Man"
1ocalhost on github
+3dyd on github
Aaro Koskinen
Aaron Oneal
Aaron Orenstein
Aaron Scarisbrick
+aasivov on github
Abram Pousada
+accountantM on github
AceCrow on Github
Adam Barclay
Adam Brown
@@ -23,16 +24,21 @@ Adam Marcionek
Adam Piggott
Adam Sampson
Adam Tkac
+Adnan Khan
+adnn on github
Adrian Burcea
Adrian Peniak
Adrian Schuur
Adriano Meirelles
+afrind on github
+ahodesuka on github
Ajit Dhumale
Akhil Kedia
Aki Koskinen
Akos Pasztory
Akshay Vernekar
Alain Danteny
+Alain Miniussi
Alan Jenkins
Alan Pinstein
Albert Chin-A-Young
@@ -45,12 +51,15 @@ Ales Mlakar
Ales Novak
Alessandro Ghedini
Alessandro Vesely
+Alex aka WindEagle
Alex Baines
Alex Bligh
Alex Chan
Alex Fishman
+Alex Gaynor
Alex Grebenschikov
Alex Gruz
+Alex Kiernan
Alex Konev
Alex Malinovich
Alex Mayorga
@@ -62,7 +71,6 @@ Alex Rousskov
Alex Samorukov
Alex Suykov
Alex Vinnik
-Alex aka WindEagle
Alexander Beedie
Alexander Dyagilev
Alexander Elgert
@@ -74,7 +82,9 @@ Alexander Pepper
Alexander Peslyak
Alexander Sinditskiy
Alexander Traud
+Alexander V. Tikhonov
Alexander Zhuravlev
+Alexandre Pion
Alexey Borzov
Alexey Eremikhin
Alexey Melnichuk
@@ -87,20 +97,24 @@ Alfonso Martone
Alfred Gebert
Allen Pulsifer
Alona Rossen
+amishmm on github
Amit Katyal
Amol Pattekar
Amr Shahin
Anatol Belski
Anatoli Tubman
Anders Bakken
+Anders Berg
Anders Gustafsson
Anders Havn
Anders Roxell
+Anderson Sasaki
Anderson Toshiyuki Sasaki
Andi Jahja
Andre Guibert de Bruet
Andre Heinecke
Andreas Damm
+Andreas Falkenhahn
Andreas Farber
Andreas Kostyrka
Andreas Malzahn
@@ -121,25 +135,33 @@ Andrei Sedoi
Andrei Valeriu BICA
Andrei Virtosu
Andrej E Baranov
+Andrew Barnes
Andrew Benham
Andrew Biggs
Andrew Bushnell
+Andrew de los Reyes
Andrew Francis
Andrew Fuller
+Andrew Ishchuk
Andrew Krieger
Andrew Kurushin
Andrew Lambert
Andrew Moise
+Andrew Potter
Andrew Robbins
Andrew Wansink
-Andrew de los Reyes
Andrey Labunets
Andrii Moiseiev
+Andrius Merkys
Andrés García
Andy Cedilnik
+Andy Fiddaman
Andy Serpa
Andy Tsouladze
Angus Mackay
+anio on github
+anshnd on github
+Antarpreet Singh
Anthon Pang
Anthony Avina
Anthony Bryan
@@ -155,6 +177,7 @@ Antoni Villalonga
Antonio Larrosa
Antony74 on github
Antti Hätälä
+arainchik on github
Archangel_SDY on github
Arkadiusz Miskiewicz
Armel Asselin
@@ -162,15 +185,19 @@ Arnaud Compan
Arnaud Ebalard
Arnaud Rebillout
Aron Bergman
+Aron Rotteveel
Artak Galoyan
Arthur Murray
Arve Knudsen
Arvid Norberg
+asavah on github
Ashish Shukla
+Ashwin Metpalli
Ask Bjørn Hansen
Askar Safin
Ates Goral
Augustus Saunders
+Austin Green
Avery Fay
Axel Tillequin
Ayoub Boudhar
@@ -182,10 +209,14 @@ Balint Szilakszi
Barry Abrahamson
Barry Pollard
Bart Whiteley
+Baruch Siach
Bas Mevissen
Bas van Schaik
Bastien Bouclet
Basuke Suzuki
+baumanj on github
+bdry on github
+beckenc on github
Ben Boeckel
Ben Darnell
Ben Greear
@@ -214,21 +245,26 @@ Bernhard Walle
Bert Huijben
Bertrand Demiddelaer
Bertrand Simonnet
+Bevan Weiss
Bill Doyle
Bill Egert
Bill Hoffman
Bill Middlecamp
Bill Nagel
Bill Pyne
+Billyzou0741326 on github
Bjarni Ingi Gislason
+Bjoern Franke
Bjoern Sikora
Bjorn Augustsson
Bjorn Reese
Björn Stenberg
Blaise Potard
+bnfp on github
Bob Relyea
Bob Richmond
Bob Schader
+bobmitchell1956 on github
Bogdan Nicula
Brad Burdick
Brad Fitzpatrick
@@ -237,18 +273,21 @@ Brad Hards
Brad King
Brad Spencer
Bradford Bruce
+bramus on github
Brandon Casey
Brandon Dong
Brandon Wang
Brendan Jurd
Brent Beardsley
Brian Akins
+Brian Bergeron
Brian Carpenter
Brian Chaplin
Brian Childs
Brian Chrisman
Brian Dessent
Brian E. Gallew
+Brian Inglis
Brian J. Murrell
Brian Prodoehl
Brian R Duffy
@@ -257,18 +296,25 @@ Brock Noland
Bru Rom
Bruce Mitchener
Bruce Stephens
+BrumBrum on hackerone
+Bruno de Carvalho
Bruno Grasselli
Bruno Thomsen
-Bruno de Carvalho
Bryan Henderson
Bryan Kemp
+bsammon on github
+buzo-ffm on github
+bxac on github
Bylon2 on github
Byrial Jensen
Caleb Raitto
+Calvin Buckley
+Cameron Cawley
Cameron Kaiser
Cameron MacMinn
Camille Moncelier
Caolan McNamara
+Captain Basil
Carie Pointer
Carlo Cannas
Carlo Marcelo Arenas Belón
@@ -278,11 +324,15 @@ Carlos ORyan
Carsten Lange
Casey O'Donnell
Catalin Patulea
+causal-agent on github
+cbartl on github
+cclauss on github
Chad Monroe
Chandrakant Bagul
Charles Kerr
Charles Romestant
Chen Prog
+Cherish98 on github
Chester Liu
Chih-Chung Chang
Chih-Hsuan Yen
@@ -297,6 +347,8 @@ Chris Flerackers
Chris Gaukroger
Chris Maltby
Chris Mumford
+Chris Paulson-Ellis
+Chris Roberts
Chris Smowton
Chris Young
Christian Fillion
@@ -310,6 +362,7 @@ Christian Schmitz
Christian Stewart
Christian Vogt
Christian Weisgerber
+Christoph Krey
Christoph M. Becker
Christophe Demory
Christophe Dervieux
@@ -318,19 +371,25 @@ Christopher Conroy
Christopher Head
Christopher Palow
Christopher R. Palmer
+Christopher Reid
Christopher Stone
Chungtsun Li
Ciprian Badescu
Claes Jakobsson
Clarence Gardner
Claudio Neves
+clbr on github
Clemens Gruber
Cliff Crosland
Clifford Wolf
Clint Clayton
Clément Notin
+cmfrolick on github
+codesniffer13 on github
Cody Jones
Cody Mack
+COFFEETALES on github
+coinhubs on github
Colby Ranger
Colin Blair
Colin Hogben
@@ -341,20 +400,27 @@ Cory Benfield
Cory Nelson
Costya Shulyupin
Craig A West
+Craig Andrews
Craig Davison
-Craig Markwardt
Craig de Stigter
+Craig Markwardt
+crazydef on github
Cris Bailiff
+Cristian Greco
Cristian Rodríguez
Curt Bogmine
+Cynthia Coan
Cyril B
Cyrill Osterwalder
Cédric Connes
Cédric Deltheil
D. Flinkmann
+d912e3 on github
Da-Yoon Chung
+daboul on github
Dag Ekengren
Dagobert Michelsen
+Daiki Ueno
Dair Grant
Dambaev Alexander
Damian Dixon
@@ -366,12 +432,14 @@ Dan Donahue
Dan Fandrich
Dan Jacobson
Dan Johnson
+Dan Kenigsberg
Dan Locks
Dan McNulty
Dan Nelson
Dan Petitt
Dan Torop
Dan Zitter
+Daniel at touchtunes
Daniel Bankhead
Daniel Black
Daniel Cater
@@ -384,6 +452,7 @@ Daniel Kahn Gillmor
Daniel Krügler
Daniel Lee Hwang
Daniel Lublin
+Daniel Marjamäki
Daniel Melani
Daniel Mentz
Daniel Romero
@@ -394,13 +463,13 @@ Daniel Silverstone
Daniel Steinberg
Daniel Stenberg
Daniel Theron
-Daniel at touchtunes
Daphne Luong
Dario Nieuwenhuis
Dario Weißer
Darryl House
Darshan Mody
Darío Hereñú
+dasimx on github
Dave Dribin
Dave Halbakken
Dave Hamilton
@@ -428,6 +497,7 @@ David Kimdon
David L.
David Lang
David LeBlanc
+David Lopes
David Lord
David McCreedy
David Odin
@@ -444,13 +514,19 @@ David Walser
David Woodhouse
David Wright
David Yan
+davidedec on github
+dbrowndan on github
Dengminwen
+Denis BaruÄić
Denis Chaplygin
Denis Feklushkin
+Denis Goleshchikhin
Denis Ollier
Dennis Clarke
+Dennis Felsing
Derek Higgins
Desmond O. Chang
+destman on github
Detlef Schmier
Dheeraj Sangamkar
Didier Brisebourg
@@ -469,9 +545,15 @@ Dinar
Dirk Eddelbuettel
Dirk Feytons
Dirk Manske
+Dirkjan Bussink
+Diven Qi
+divinity76 on github
+dkjjr89 on github
+dkwolfe4 on github
Dmitri Shubin
Dmitri Tikhonov
Dmitriy Sergeyev
+dmitrmax on github
Dmitry Bartsevich
Dmitry Eremin-Solenikov
Dmitry Falko
@@ -481,6 +563,7 @@ Dmitry Mikhirev
Dmitry Popov
Dmitry Rechkin
Dmitry S. Baikov
+dnivras on github
Dolbneff A.V
Domenico Andreoli
Dominick Meglio
@@ -498,9 +581,12 @@ Douglas Mencken
Douglas R. Horner
Douglas Steinwand
Dov Murik
+dpull on github
Drake Arconis
+dtmsecurity on github
Duane Cathey
Duncan Mac-Vicar Prett
+Duncan Wilcox
Dustin Boswell
Dusty Mabe
Duy Phan Thanh
@@ -513,6 +599,7 @@ Earnestly on github
Eason-Yu on github
Ebenezer Ikonne
Ed Morley
+Edgaras Janušauskas
Edin Kadribasic
Edmond Yu
Eduard Bloch
@@ -523,12 +610,16 @@ Edward Thomson
Eelco Dolstra
Eetu Ojanen
Egon Eckert
+Ehren Bendler
Eldar Zaitov
+elelel on github
+elephoenix on github
Eli Schwartz
Elia Tufarolo
Elliot Saba
Ellis Pritchard
Elmira A Semenova
+elsamuko on github
Emanuele Bovisio
Emil Engler
Emil Lerner
@@ -552,6 +643,7 @@ Eric Rescorla
Eric Ridge
Eric Rosenquist
Eric S. Raymond
+Eric Sauvageau
Eric Thelin
Eric Vergnaud
Eric Wong
@@ -566,6 +658,7 @@ Ernest Beinrohr
Ernst Sjöstrand
Erwan Legrand
Erwin Authried
+Estanislau Augé-Pujadas
Ethan Glasser Camp
Etienne Simard
Eugene Kotlyarov
@@ -574,7 +667,9 @@ Even Rouault
Evert Pot
Evgeny Grin
Evgeny Turnaev
+eXeC64 on github
Eygene Ryabinkin
+Eylem Ugurel
Fabian Frank
Fabian Hiernaux
Fabian Keil
@@ -582,15 +677,20 @@ Fabian Ruff
Fabrice Fontaine
Fabrizio Ammollo
Fahim Chandurwala
+Faizur Rahman
+fds242 on github
Federico Bianchi
Fedor Karpelevitch
+Fedor Korotkov
Feist Josselin
+Felipe Gasper
Felix Hädicke
Felix Kaiser
-Felix Yan
Felix von Leitner
+Felix Yan
Feng Tu
Fernando Muñoz
+Filip Salomonsson
Flavio Medeiros
Florian Pritz
Florian Schoppmann
@@ -611,13 +711,17 @@ Frank Ticheler
Frank Van Uffelen
FrantiÅ¡ek KuÄera
François Charlier
+François Rigault
Fred Machado
Fred New
Fred Noz
Fred Stluka
Frederic Lepied
Frederik B
+Frederik Wedel-Heinen
Fredrik Thulin
+FuccDucc on github
+fullincome on github
Gabriel Kuri
Gabriel Sjoberg
Garrett Holmstrom
@@ -625,6 +729,7 @@ Gary Maxwell
Gaurav Malhotra
Gautam Kachroo
Gautam Mani
+Gavin Wong
Gavrie Philipson
Gaz Iqbal
Gaël Portay
@@ -669,6 +774,7 @@ Greg Onufer
Greg Pratt
Greg Rowe
Greg Zavertnik
+Gregory Jefferis
Gregory Nicholls
Gregory Szorc
Griffin Downs
@@ -676,6 +782,7 @@ Grigory Entin
Guenole Bescon
Guido Berhoerster
Guillaume Arluison
+guitared on github
Gunter Knauf
Gustaf Hui
Gustavo Grieco
@@ -684,9 +791,11 @@ GwanYeong Kim
Gwenole Beauchesne
Gökhan Şengün
Götz Babin-Ebell
+H3RSKO on github
Hagai Auro
Haibo Huang
Hamish Mackenzie
+hamstergene on github
Han Han
Han Qiao
Hang Kin Lau
@@ -696,6 +805,7 @@ Hanno Böck
Hanno Kranzhoff
Hans Steegers
Hans-Jurgen May
+Hao Wu
Hardeep Singh
Haris Okanovic
Harold Stuart
@@ -722,9 +832,15 @@ Hoi-Ho Chan
Hongli Lai
Howard Blaise
Howard Chu
+hsiao yi
+htasta on github
Hubert Kario
+Hugo van Kemenade
Huzaifa Sidhpurwala
+huzunhao on github
+hydra3333 on github
Hzhijun
+iammrtau on github
Ian D Allen
Ian Fette
Ian Ford
@@ -739,15 +855,19 @@ Igor Makarov
Igor Novoseltsev
Igor Polyakov
Ihor Karpenko
+ihsinme on github
Iida Yosiaki
Ilguiz Latypov
Ilja van Sprundel
Ilya Kosarev
+imilli on github
Immanuel Gregoire
Inca R
+infinnovation-dev on github
Ingmar Runge
Ingo Ralf Blum
Ingo Wilken
+IonuÈ›-Francisc Oancea
Irfan Adilovic
Ironbars13 on github
Irving Wolfe
@@ -756,7 +876,9 @@ Isaiah Norton
Ishan SinghLevett
Ithubg on github
Ivan Avdeev
+IvanoG on github
Ivo Bellin Salarin
+iz8mbw on github
Jack Zhang
Jackarain on github
Jacky Lam
@@ -766,6 +888,7 @@ Jacob Moshenko
Jactry Zeng
Jad Chamcham
Jaime Fullaondo
+jakirkham on github
Jakub Wilk
Jakub Zakrzewski
James Atwill
@@ -775,10 +898,12 @@ James Cheng
James Clancy
James Cone
James Dury
+James Fuller
James Gallagher
James Griffiths
James Housley
James Knight
+James Le Cuirot
James MacMillan
James Slaughter
Jamie Lokier
@@ -792,11 +917,13 @@ Jan Kunder
Jan Schaumann
Jan Schmidt
Jan Van Boghout
+JanB on github
Janne Johansson
Jared Jennings
Jared Lundell
Jari Aalto
Jari Sundell
+jasal82 on github
Jason Baietto
Jason Glasgow
Jason Juang
@@ -807,6 +934,7 @@ Jason S. Priebe
Javier Barroso
Javier Blazquez
Javier G. Sogo
+Javier Navarro
Javier Sixto
Jay Austin
Jayesh A Shah
@@ -826,6 +954,7 @@ Jeff Hodges
Jeff Johnson
Jeff King
Jeff Lawson
+Jeff Mears
Jeff Phillips
Jeff Pohlmeyer
Jeff Weber
@@ -838,6 +967,7 @@ Jeremy Friesner
Jeremy Huddleston
Jeremy Lainé
Jeremy Lin
+Jeremy Maitin-Shepard
Jeremy Pearson
Jeremy Tan
Jeroen Koekkoek
@@ -852,6 +982,7 @@ Jesper Jensen
Jesse Chisholm
Jesse Noller
Jesse Tan
+jethrogb on github
Jie He
Jim Drash
Jim Freeman
@@ -863,12 +994,15 @@ Jiri Dvorak
Jiri Hruska
Jiri Jaburek
Jiří Malák
+jmdavitt on github
+jnbr on github
Jocelyn Jaubert
Joe Halpin
Joe Malicki
Joe Mason
Joel Chen
Joel Depooter
+joey-l-us on github
Jofell Gallardo
Johan Anderson
Johan Lantz
@@ -901,6 +1035,8 @@ John Marino
John Marshall
John McGowan
John P. McCaskey
+John Schroeder
+John Simpson
John Starks
John Suprock
John V. Chow
@@ -912,7 +1048,9 @@ Johnny Luong
Jojojov on github
Jon DeVree
Jon Grubbs
+Jon Johnson Jr
Jon Nelson
+Jon Rumsey
Jon Sargeant
Jon Seymour
Jon Spencer
@@ -930,6 +1068,7 @@ Jonathan Hseu
Jonathan Moerman
Jonathan Nieder
Jongki Suwandi
+jonrumsey on github
Joombalaya on github
Joonas Kuorilehto
Jose Alf
@@ -937,11 +1076,13 @@ Jose Kahan
Josef Wolf
Josh Bialkowski
Josh Kapell
+joshhe on github
Joshua Kwan
Joshua Swink
Josie Huddleston
Josue Andrade Gomes
Jozef Kralik
+JP Mens
Juan Barreto
Juan F. Codagnone
Juan Ignacio Hervás
@@ -959,6 +1100,7 @@ Julien Chaffraix
Julien Nabet
Julien Royer
Jun-ichiro itojun Hagino
+jungle-boogie on github
Junho Choi
Jurij Smakov
Juro Bystricky
@@ -967,19 +1109,24 @@ Justin Ehlert
Justin Fletcher
Justin Karneges
Justin Maggard
+jveazey on github
+jzinn on github
János Fekete
Jérémy Rocher
Jörg Mueller-Tolk
Jörn Hartroth
K. R. Walker
+ka7 on github
Kai Engert
Kai Noda
Kai Sommerfeld
Kai-Uwe Rommel
Kalle Vahlman
Kamil Dudka
+Kane York
Kang Lin
Kang-Jin Lee
+Karl Chen
Karl Moerder
Karol Pietrzak
Kartik Mahajan
@@ -992,6 +1139,7 @@ Kees Dekker
Keith MacDonald
Keith McGuigan
Keith Mok
+Ken Brown
Ken Hirsch
Ken Rastatter
Kenny To
@@ -1018,15 +1166,21 @@ Kobi Gurkan
Koen Dergent
Konstantin Isakov
Konstantin Kushnir
+kotoriã®ã­ã“
+kouzhudong on github
+kreshano on github
Kris Kennaway
Krishnendu Majumdar
Krister Johansen
Kristian Gunstone
Kristian Köhntopp
+Kristian Mide
Kristiyan Tsaklev
Kristoffer Gleditsch
+Kunal Chandarana
Kunal Ekawde
Kurt Fankhauser
+Kwon-Young Choi
Kyle Abramowitz
Kyle Edwards
Kyle J. McKay
@@ -1034,9 +1188,11 @@ Kyle L. Huff
Kyle Sallee
Kyohei Kadota
Kyselgov E.N
+l00p3r on Hackerone
Lachlan O'Dea
Ladar Levison
Lance Ware
+Laramie Leavitt
Larry Campbell
Larry Fahnoe
Larry Lin
@@ -1063,12 +1219,15 @@ Len Krause
Len Marinaccio
Lenaic Lefever
Lenny Rachitsky
+Leo Neat
Leon Breedt
Leon Winter
Leonardo Rosati
Leonardo Taccari
Liam Healy
+lijian996 on github
Lijo Antony
+lilongyan-huawei on github
Linas Vepstas
Lindley French
Ling Thio
@@ -1091,11 +1250,13 @@ Luca Boccassi
Lucas Adamski
Lucas Pardue
Lucas Severo
+Lucien Zürcher
Ludek Finstrle
Ludovico Cavedon
Ludwig Nussel
Lukas Ruzicka
Lukasz Czekierda
+lukaszgn on github
Luke Amery
Luke Call
Luke Dashjr
@@ -1105,10 +1266,11 @@ Luz Paz
Luật Nguyễn
Lyman Epp
Lyndon Hill
-MAntoniak on github
+M.R.T on github
Maciej Karpiuk
Maciej Puzio
Maciej W. Rozycki
+madblobfish on github
Mahmoud Samir Fayed
Maks Naumov
Maksim Kuzevanov
@@ -1117,6 +1279,7 @@ Mamoru Tasaka
Mamta Upadhyay
Mandy Wu
Manfred Schwarb
+MAntoniak on github
Manuel Massing
Marc Aldorasi
Marc Boucher
@@ -1128,6 +1291,7 @@ Marc Kleine-Budde
Marc Renault
Marc Schlatter
Marc-Antoine Perennou
+marc-groundctl on github
Marcel Hernandez
Marcel Raad
Marcel Roelofs
@@ -1164,10 +1328,13 @@ Markus Elfring
Markus Koetter
Markus Moeller
Markus Oberhumer
+Markus Olsson
Markus Westerlind
+Maros Priputen
Marquis de Muesli
Martijn Koster
Martin Ankerl
+Martin Bašti
Martin C. Martin
Martin Drasar
Martin Dreher
@@ -1183,13 +1350,18 @@ Martin Lemke
Martin Skinner
Martin Staael
Martin Storsjö
+Martin V
Martin Vejnár
Marty Kuhrt
Maruko
+Masaya Suzuki
+masbug on github
+Massimiliano Fantuzzi
Massimiliano Ziccardi
Massimo Callegari
Mateusz Loskot
Mathias Axelsson
+Mathias Gumz
Mathieu Legare
Mats Lidell
Matt Arsenault
@@ -1208,6 +1380,7 @@ Matthew Hall
Matthew Kerwin
Matthew Whitehead
Matthias Bolte
+Matthias Naegler
Mattias Fornander
Matus Uzak
Maurice Barnum
@@ -1215,19 +1388,24 @@ Mauro Iorio
Mauro Rappa
Max Dymond
Max Katsev
+Max Kellermann
Max Khon
+Max Peal
Max Savenkov
Maxim Ivanov
Maxim Perenesenko
Maxim Prohorov
Maxime Larocque
Maxime Legros
+mbeifuss on github
+mccormickt12 on github
Mehmet Bozkurt
Mekonikum
Melissa Mears
Mert Yazıcıoğlu
Mettgut Jamalla
Michael Anti
+Michael Baentsch
Michael Benedict
Michael Brehm
Michael Calmer
@@ -1235,6 +1413,7 @@ Michael Cronenworth
Michael Curtis
Michael Day
Michael Felt
+Michael Forney
Michael Gmelin
Michael Goffioul
Michael Jahn
@@ -1248,12 +1427,15 @@ Michael Lee
Michael Maltese
Michael Mealling
Michael Mueller
+Michael Musset
+Michael Olbrich
Michael Osipov
Michael Schmid
Michael Smith
Michael Stapelberg
Michael Steuer
Michael Stillwell
+Michael Vittiglio
Michael Wallner
Michal Bonino
Michal Marek
@@ -1269,6 +1451,7 @@ Michel Promonet
Michele Bini
Miguel Angel
Miguel Diaz
+migueljcrum on github
Mihai Ionescu
Mikael Johansson
Mikael Sennerholm
@@ -1277,46 +1460,65 @@ Mike Bytnar
Mike Crowe
Mike Dobbs
Mike Dowell
+Mike Frysinger
Mike Giancola
Mike Hasselberg
Mike Henshaw
Mike Hommey
Mike Mio
+Mike Norton
Mike Power
Mike Protts
Mike Revi
Miklos Nemeth
Miloš Ljumović
Mingliang Zhu
+Mingtao Yang
Miroslav Franc
Miroslav Spousta
+Mischa Salle
Mitz Wark
+mkzero on github
Mohamed Lrhazi
+Mohamed Osama
Mohammad AlSaleh
+Mohammad Hasbini
Mohun Biswas
+momala454 on github
+moohoorama on github
Mostyn Bramley-Moore
Moti Avrahami
+MrdUkk on github
MrSorcus on github
+Muhammad Herdiansyah
+Murugan Balraj
Muz Dima
Myk Taylor
-NTMan on Github
Nach M. S.
Nagai H
+naost3rn on github
Nate Prewitt
Nathan Coulter
Nathan O'Sullivan
Nathanael Nerode
Nathaniel J. Smith
+Nathaniel R. Lewis
Nathaniel Waisbrot
Naveen Chandran
Naveen Noel
Neal Poole
+nedres on github
+neex on github
Nehal J Wani
+neheb on github
Neil Bowers
Neil Dunbar
Neil Kolban
Neil Spring
+nevv on HackerOne/curl
Niall O'Reilly
+niallor on github
+nianxuejie on github
Nic Roets
Nicholas Maniscalco
Nick Draffen
@@ -1326,11 +1528,14 @@ Nick Miyake
Nick Zitzmann
Nicklas Avén
Nico Baggus
+nico-abram on github
Nicolas Berloquin
Nicolas Croiset
Nicolas François
Nicolas Grekas
+Nicolas Guillier
Nicolas Morey-Chaisemartin
+Nicolas Sterchele
Niels van Tongeren
Nikita Schmidt
Nikitinskit Dmitriy
@@ -1339,14 +1544,19 @@ Niklas Hambüchen
Nikolai Kondrashov
Nikos Mavrogiannopoulos
Nikos Tsipinakis
+niner on github
Ning Dong
Nir Soffer
Nis Jorgensen
+nk
+NobodyXu on github
Nobuhiro Ban
Nodak Sodak
+nopjmp on github
Norbert Frese
Norbert Kett
Norbert Novotny
+NTMan on Github
Octavio Schroeder
Ofer
Okhin Vasilij
@@ -1355,6 +1565,7 @@ Olaf Flebbe
Olaf Stüben
Oleg Pudeyev
Olen Andoni
+olesteban on github
Oli Kingshott
Oliver Gondža
Oliver Graute
@@ -1363,15 +1574,18 @@ Oliver Schindler
Olivier Berger
Olivier Brunel
Omar Ramadan
+omau on github
Orange Tsai
Oren Souroujon
Oren Tirosh
Orgad Shaneh
Ori Avtalion
+osabc on github
Oscar Koeroo
Oscar Norlander
Oskar Liljeblad
Oumph on github
+ovidiu-benea on github
P R Schaffner
Palo Markovic
Paolo Mossino
@@ -1382,6 +1596,8 @@ Pascal Terjan
Pasha Kuznetsov
Pasi Karkkainen
Pat Ray
+patelvivekv1993 on github
+patnyb on github
Patrice Guerin
Patricia Muscalu
Patrick Bihan-Faou
@@ -1401,6 +1617,7 @@ Paul Dreik
Paul Groke
Paul Harrington
Paul Harris
+Paul Hoffman
Paul Howarth
Paul Joyce
Paul Marks
@@ -1410,6 +1627,8 @@ Paul Nolan
Paul Oliver
Paul Querna
Paul Saab
+Paul Vixie
+Paulo Roberto Tomasi
Pavel Cenek
Pavel Gushchin
Pavel Löbl
@@ -1417,11 +1636,14 @@ Pavel Orehov
Pavel Pavlov
Pavel Raiskup
Pavel Rochnyak
+Pavel Volgarev
Pavol Markovic
Pawel A. Gajda
Pawel Kierski
Pedro Larroy
+Pedro Monreal
Pedro Neves
+pendrek at hackerone
Peng Li
Per Lundberg
Per Malmberg
@@ -1433,6 +1655,7 @@ Peter Gal
Peter Heuchert
Peter Hjalmarsson
Peter Korsgaard
+Peter Körner
Peter Lamare
Peter Lamberg
Peter Laser
@@ -1474,6 +1697,7 @@ Pierre Brico
Pierre Chapuis
Pierre Joye
Pierre Ynard
+Pierre-Yves Bigourdan
Piotr Dobrogost
Piotr Komborski
Po-Chuan Hsieh
@@ -1484,11 +1708,16 @@ Prash Dush
Praveen Pvs
Priyanka Shah
Przemysław Tomaszewski
+pszemus on github
+puckipedia on github
Puneet Pawaia
+qiandu2006 on github
Quagmire
Quanah Gibson-Mount
+Quentin Balland
Quinn Slack
R. Dennis Steed
+Radoslav Georgiev
Radu Simionescu
Rafa Muyo
Rafael Antonio
@@ -1504,16 +1733,20 @@ Rajkumar Mandal
Ralf S. Engelschall
Ralph Beckmann
Ralph Mitchell
+Ram Krushna Mishra
+ramsay-jones on github
Ran Mozes
Randall S. Becker
Randy Armstrong
Randy McMurchy
Raphael Gozzo
+Rasmus Melchior Jacobsen
Ravi Pratap
Ray Dassen
Ray Pekowski
Ray Satiro
Razvan Cojocaru
+rcombs on github
Reed Loden
Reinhard Max
Reinout van Schouwen
@@ -1536,11 +1769,13 @@ Rich Burridge
Rich Gray
Rich Mirch
Rich Rauenzahn
+Rich Salz
Rich Turner
Richard Adams
Richard Alcock
Richard Archer
Richard Atterer
+Richard Bowker
Richard Bramante
Richard Clayton
Richard Cooper
@@ -1554,15 +1789,18 @@ Richard Prescott
Richard Silverman
Richard van den Berg
Richy Kim
+Rici Lake
Rick Deist
Rick Jones
Rick Richardson
Rick Welykochy
+Rickard Hallerbäck
Ricki Hirner
Ricky Leverence
Ricky-Tigg on github
Rider Linden
Rikard Falkeborn
+rl1987 on github
Rob Cotrone
Rob Crittenden
Rob Davies
@@ -1573,6 +1811,7 @@ Rob Ward
Robert A. Monat
Robert B. Harris
Robert D. Young
+Robert Dunaj
Robert Foreman
Robert Iakobashvili
Robert Kolcun
@@ -1583,6 +1822,7 @@ Robert Schumann
Robert Weaver
Robert Wruck
Robin Cornelius
+Robin Douine
Robin Johnson
Robin Kay
Robson Braga Araujo
@@ -1592,6 +1832,7 @@ Rodney Simmons
Rodric Glaser
Rodrigo Silva
Roger Leigh
+Roger Orr
Roland Blom
Roland Hieber
Roland Krikava
@@ -1609,6 +1850,7 @@ Ron Parker
Ron Zapp
Ronnie Mose
Rosimildo da Silva
+Ross Burton
Roy Bellingan
Roy Shan
Rune Kleveland
@@ -1616,6 +1858,7 @@ Ruslan Baratov
Ruslan Gazizov
Rutger Hofman
Ruurd Beerstra
+RuurdBeerstra on github
Ryan Braud
Ryan Chan
Ryan Nelson
@@ -1625,28 +1868,34 @@ Ryan Winograd
Ryuichi KAWAMATA
Rémy Léone
S. Moonesamy
-SBKarr on github
Salah-Eddin Shaban
+Saleem Abdulrasool
Salvador Dávila
Salvatore Sorrentino
Sam Deane
Sam Hurst
Sam Roth
Sam Schanken
+Samanta Navarro
Sampo Kellomaki
Samuel Díaz García
Samuel Listopad
+Samuel Marks
Samuel Surtees
Samuel Thibault
+Samuel Tranchet
Sander Gates
Sandor Feldi
Santhana Todatry
+Santino Keupp
Saqib Ali
Sara Golemon
Saran Neti
Sascha Swiercy
Saul good
Saurav Babu
+sayrer on github
+SBKarr on github
Scott Bailey
Scott Barrett
Scott Cantor
@@ -1677,6 +1926,7 @@ Seth Mos
Sevan Janiyan
Sh Diao
Shachaf Ben-Kiki
+Shailesh Kapse
Shankar Jadhavar
Shao Shuchao
Sharad Gupta
@@ -1691,23 +1941,34 @@ Shmulik Regev
Siddhartha Prakash Jain
Sidney San Martín
Siegfried Gyuricsko
+silveja1 on github
+Simon Chalifoux
Simon Dick
Simon H.
Simon Josefsson
Simon Legner
Simon Liu
Simon Warta
+Siva Sivaraman
+SLDiggie on github
+smuellerDD on github
+sn on hackerone
+sofaboss on github
Somnath Kundu
Song Ma
Sonia Subramanian
Spacen Jasset
Spezifant on github
Spiridonoff A.V
+Spoon Man
Spork Schivago
+sspiri on github
+sstruchtrup on github
Stadler Stephan
Stan van de Burgt
Stanislav Ivochkin
Stanislav Zidek
+steelman on github
Stefan Agner
Stefan Bühler
Stefan Eissing
@@ -1716,12 +1977,16 @@ Stefan Grether
Stefan Kanthak
Stefan Krause
Stefan Neis
+Stefan Strogin
Stefan Teleman
Stefan Tomanek
Stefan Ulrich
+Stefan Yohansson
Stefano Simonelli
Steinar H. Gunderson
+steini2000 on github
Stepan Broz
+Stepan Efremov
Stephan Bergmann
Stephan Lagerholm
Stephan Mühlstrasser
@@ -1747,36 +2012,46 @@ Steven G. Johnson
Steven Gu
Steven M. Schweda
Steven Parkes
+Steven Penny
Stian Soiland-Reyes
Stoned Elipot
+stootill on github
Stuart Henderson
SumatraPeter on github
Sune Ahlgren
+Sunny Bean
Sunny Purushe
Sven Anders
Sven Blumenstein
Sven Neuhaus
Sven Wegener
Svyatoslav Mishyn
+swalkaus at yahoo.com
Sylvestre Ledru
Symeon Paraschoudis
Sébastien Willemijns
T. Bharath
T. Yamada
-TJ Saunders
+Tadej Vengust
Tae Hyoung Ahn
Tae Wong
Taiyu Len
Taneli Vähäkangas
Tanguy Fautre
+tarek112 on github
Tatsuhiro Tsujikawa
+tbugfinder on github
Teemu Yli-Elsila
Temprimus
Terri Oda
Terry Wu
+thanhchungbtc on github
The Infinnovation team
TheAssassin on github
Theodore Dubois
+therealhirudo on github
+tholin on github
+Thomas Bouzerar
Thomas Braun
Thomas Gamper
Thomas Glanzmann
@@ -1784,12 +2059,13 @@ Thomas J. Moore
Thomas Klausner
Thomas L. Shinnick
Thomas Lopatic
+Thomas M. DuBuisson
Thomas Petazzoni
Thomas Ruecker
Thomas Schwinge
Thomas Tonino
-Thomas Vegas
Thomas van Hesteren
+Thomas Vegas
Thorsten Schöning
Tiit Pikma
Till Maas
@@ -1803,6 +2079,7 @@ Tim Heckman
Tim Mcdonough
Tim Newsome
Tim Rühsen
+Tim Sedlmeyer
Tim Sneddon
Tim Stack
Tim Starling
@@ -1813,7 +2090,10 @@ Timotej Lazar
Timothe Litt
Timothy Polich
Tinus van den Berg
+TJ Saunders
+tmkk on github
Tobias Blomberg
+Tobias Hieta
Tobias Hintze
Tobias Lindgren
Tobias Markus
@@ -1836,9 +2116,10 @@ Tom Mueller
Tom Regner
Tom Seddon
Tom Sparrow
+Tom van der Woerdt
Tom Wright
Tom Zerucha
-Tom van der Woerdt
+Tomas Berger
Tomas Hoger
Tomas Jakobsson
Tomas Mlcoch
@@ -1849,16 +2130,20 @@ Tomas Tomecek
Tomasz Kojm
Tomasz Lacki
Tommie Gannert
+tommink[at]post.pl
+Tommy Petty
Tommy Tam
Ton Voon
Toni Moreno
Tony Kelman
+tonystz on Github
Toon Verwaest
Tor Arntsen
Torben Dannhauer
Torsten Foertsch
Toshio Kuratomi
Toshiyuki Maezawa
+tpaukrt on github
Traian Nicolescu
Travis Burtrum
Travis Obenhaus
@@ -1876,13 +2161,16 @@ Ulrich Doehner
Ulrich Telle
Ulrich Zadow
Valentin David
+Valentyn Korniienko
Valerii Zapodovnikov
+vanillajonathan on github
Vasiliy Faronov
Vasily Lobaskin
Vasy Okhin
Venkat Akella
Venkataramana Mokkapati
Vicente Garcia
+Victor Magierski
Victor Snezhko
Vijay Panghal
Vikram Saxena
@@ -1896,16 +2184,20 @@ Vincent Le Normand
Vincent Penquerc'h
Vincent Sanders
Vincent Torri
+vitaha85 on github
Vlad Grachov
Vlad Ureche
Vladimir Grishchenko
Vladimir Kotal
Vladimir Lazarenko
+Vlastimil OvÄáÄík
Vojtech Janota
Vojtech Minarik
Vojtěch Král
Volker Schmid
Vsevolod Novikov
+vshmuk on hackerone
+Vyron Tsingaras
W. Mark Kubacki
Waldek Kozba
Walter J. Mack
@@ -1915,23 +2207,31 @@ Wayne Haigh
Wenchao Li
Wenxiang Qian
Werner Koch
+Werner Stolz
+wesinator on github
Wesley Laxton
Wesley Miaw
Wez Furlong
Wham Bang
Wilfredo Sanchez
Will Dietz
+Will Roberts
Willem Sparreboom
William A. Rowe Jr
William Ahern
+wmsch on github
+wncboy on github
Wojciech Zwiefka
Wouter Van Rooy
Wu Yongzheng
Wyatt O'Day
Xavier Bouchoux
XhstormR on github
+Xiang Xiao
Xiangbin Li
+Xiaoyin Liu
XmiliaH on github
+xwxbug on github
Yaakov Selkowitz
Yang Tse
Yarram Sunil
@@ -1940,123 +2240,37 @@ Yasuhiro Matsumoto
Yechiel Kalmenson
Yehezkel Horowitz
Yehoshua Hershberg
+ygthien on github
Yi Huang
Yiming Jing
Yingwei Liu
Yonggang Luo
+youngchopin on github
Yousuke Kimoto
Yu Xin
Yukihiro Kawada
Yun SangHo
+Yuri Slobodyanyuk
Yuriy Sosov
Yves Arrouye
Yves Lejeune
Zachary Seguin
Zdenek Pavlas
Zekun Ni
+zelinchen on github
Zenju on github
Zero King
Zhao Yisha
Zhaoyang Wu
Zhibiao Wu
Zhouyihai Ding
+zloi-user on github
Zmey Petroff
Zvi Har'El
-aasivov on github
-accountantM on github
-adnn on github
-afrind on github
-ahodesuka on github
-anshnd on github
-arainchik on github
-asavah on github
-baumanj on github
-bobmitchell1956 on github
-bsammon on github
-buzo-ffm on github
-cbartl on github
-cclauss on github
-clbr on github
-cmfrolick on github
-codesniffer13 on github
-d912e3 on github
-daboul on github
-dasimx on github
-dbrowndan on github
-destman on github
-dkjjr89 on github
-dkwolfe4 on github
-dnivras on github
-dpull on github
-dtmsecurity on github
-eXeC64 on github
-elelel on github
-elephoenix on github
-elsamuko on github
-guitared on github
-hsiao yi
-imilli on github
-infinnovation-dev on github
-iz8mbw on github
-jakirkham on github
-jasal82 on github
-jnbr on github
-jonrumsey on github
-joshhe on github
-jungle-boogie on github
-jveazey on github
-jzinn on github
-ka7 on github
-kreshano on github
-l00p3r on Hackerone
-lijian996 on github
-lukaszgn on github
-madblobfish on github
-marc-groundctl on github
-masbug on github
-mccormickt12 on github
-migueljcrum on github
-mkzero on github
-momala454 on github
-moohoorama on github
-nedres on github
-neex on github
-neheb on github
-nevv on HackerOne/curl
-niallor on github
-nianxuejie on github
-nico-abram on github
-niner on github
-nk
-nopjmp on github
-olesteban on github
-omau on github
-osabc on github
-ovidiu-benea on github
-patelvivekv1993 on github
-patnyb on github
-pendrek at hackerone
-pszemus on github
-silveja1 on github
-smuellerDD on github
-sstruchtrup on github
-steelman on github
-steini2000 on github
-stootill on github
-swalkaus at yahoo.com
-tarek112 on github
-tholin on github
-tommink[at]post.pl
-tonystz on Github
-tpaukrt on github
-vanillajonathan on github
-wesinator on github
-wmsch on github
-wncboy on github
-youngchopin on github
-zelinchen on github
zzq1015 on github
İsmail Dönmez
Åukasz Domeradzki
Štefan Kremeň
+Коваленко Ðнатолий Викторович
Ðикита Дорохин
+加藤éƒä¹‹
diff --git a/docs/TODO b/docs/TODO
index 42d37c1bc..d45319d7b 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -20,7 +20,9 @@
1.1 TFO support on Windows
1.2 Consult %APPDATA% also for .netrc
1.3 struct lifreq
+ 1.4 alt-svc sharing
1.5 get rid of PATH_MAX
+ 1.6 native IDN support on macOS
1.7 Support HTTP/2 for HTTP(S) proxies
1.8 CURLOPT_RESOLVE for any port number
1.9 Cache negative name resolves
@@ -50,6 +52,8 @@
2.4 Split connect and authentication process
2.5 Edge-triggered sockets should work
2.6 multi upkeep
+ 2.7 Virtual external sockets
+ 2.8 dynamically decide to use socketpair
3. Documentation
3.2 Provide cmake config-file
@@ -65,6 +69,7 @@
5. HTTP
5.1 Better persistency for HTTP 1.0
+ 5.2 Set custom client ip when using haproxy protocol
5.3 Rearrange request header order
5.4 Allow SAN names in HTTP/2 server push
5.5 auth= in URLs
@@ -86,6 +91,8 @@
10. LDAP
10.1 SASL based authentication mechanisms
+ 10.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
+ 10.3 Paged searches on LDAP server
11. SMB
11.1 File listing support
@@ -96,6 +103,7 @@
12. New protocols
13. SSL
+ 13.1 TLS-PSK with OpenSSL
13.2 Provide mutex locking API
13.3 Support in-memory certs/ca certs/keys
13.4 Cache/share OpenSSL contexts
@@ -103,18 +111,21 @@
13.6 Provide callback for cert verification
13.7 improve configure --with-ssl
13.8 Support DANE
+ 13.9 TLS record padding
13.10 Support Authority Information Access certificate extension (AIA)
13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
13.12 Support HSTS
+ 13.13 Make sure we forbid TLS 1.3 post-handshake authentication
13.14 Support the clienthello extension
14. GnuTLS
14.2 check connection
- 15. WinSSL/SChannel
- 15.1 Add support for client certificate authentication
- 15.3 Add support for the --ciphers option
- 15.4 Add option to disable client certificate auto-send
+ 15. Schannel
+ 15.1 Extend support for client certificate authentication
+ 15.2 Extend support for the --ciphers option
+ 15.3 Add option to disable client certificate auto-send
+ 15.4 Add option to allow abrupt server closure
16. SASL
16.1 Other authentication mechanisms
@@ -126,28 +137,37 @@
17.2 Handle growing SFTP files
17.3 Support better than MD5 hostkey hash
17.4 Support CURLOPT_PREQUOTE
+ 17.5 SSH over HTTPS proxy with more backends
18. Command line tool
18.1 sync
18.2 glob posts
18.3 prevent file overwriting
+ 18.4 --proxycommand
18.5 UTF-8 filenames in Content-Disposition
+ 18.6 Option to make -Z merge lined based outputs on stdout
18.7 at least N milliseconds between requests
+ 18.8 Consider convenience options for JSON and XML?
18.9 Choose the name of file in braces for complex URLs
18.10 improve how curl works in a windows console window
18.11 Windows: set attribute 'archive' for completed downloads
18.12 keep running, read instructions from pipe/socket
+ 18.13 Ratelimit or wait between serial requests
+ 18.14 --dry-run
18.15 --retry should resume
18.16 send only part of --data
18.17 consider file name from the redirected URL with -O ?
18.18 retry on network is unreachable
18.19 expand ~/ in config files
18.20 host name sections in config files
+ 18.21 retry on the redirected-to URL
+ 18.23 Set the modification date on an uploaded file
+ 18.24 Use multiple parallel transfers for a single download
19. Build
19.1 roffit
19.2 Enable PIE and RELRO by default
- 19.3 cmake test suite improvements
+ 19.3 Don't use GNU libtool on OpenBSD
20. Test suite
20.1 SSL tunnel
@@ -157,6 +177,8 @@
20.5 Add support for concurrent connections
20.6 Use the RFC6265 test suite
20.7 Support LD_PRELOAD on macOS
+ 20.8 Run web-platform-tests url tests
+ 20.9 Use "random" ports for the test servers
21. Next SONAME bump
21.1 http-style HEAD output for FTP
@@ -195,6 +217,13 @@
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
To support IPv6 interface addresses for network interfaces properly.
+1.4 alt-svc sharing
+
+ The share interface could benefit from allowing the alt-svc cache to be
+ possible to share between easy handles.
+
+ See https://github.com/curl/curl/issues/4476
+
1.5 get rid of PATH_MAX
Having code use and rely on PATH_MAX is not nice:
@@ -204,6 +233,16 @@
there we need libssh2 to properly tell us when we pass in a too small buffer
and its current API (as of libssh2 1.2.7) doesn't.
+1.6 native IDN support on macOS
+
+ On recent macOS versions, the getaddrinfo() function itself has built-in IDN
+ support. By setting the AI_CANONNAME flag, the function will return the
+ encoded name in the ai_canonname struct field in the returned information.
+ This could be used by curl on macOS when built without a separate IDN library
+ and an IDN host name is used in a URL.
+
+ See initial work in https://github.com/curl/curl/pull/5371
+
1.7 Support HTTP/2 for HTTP(S) proxies
Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.
@@ -393,12 +432,21 @@
Make sure we don't ever loop because of non-blocking sockets returning
EWOULDBLOCK or similar. Blocking cases include:
- - Name resolves on non-windows unless c-ares or the threaded resolver is used
- - SOCKS proxy handshakes
+ - Name resolves on non-windows unless c-ares or the threaded resolver is used.
+
+ - The threaded resolver may block on cleanup:
+ https://github.com/curl/curl/issues/4852
+
- file:// transfers
+
- TELNET transfers
+
+ - GSSAPI authentication for FTP transfers
+
- The "DONE" operation (post transfer protocol-specific actions) for the
- protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task.
+ protocols SFTP, SMTP, FTP. Fixing multi_done() for this is a worthy task.
+
+ - curl_multi_remove_handle for any of the above. See section 2.3.
2.2 Better support for same name resolves
@@ -438,6 +486,23 @@
See https://github.com/curl/curl/issues/3199
+2.7 Virtual external sockets
+
+ libcurl performs operations on the given file descriptor that presumes it is
+ a socket and an application cannot replace them at the moment. Allowing an
+ application to fully replace those would allow a larger degree of freedom and
+ flexibility.
+
+ See https://github.com/curl/curl/issues/5835
+
+2.8 dynamically decide to use socketpair
+
+ For users who don't use curl_multi_wait() or don't care for
+ curl_multi_wakeup(), we could introduce a way to make libcurl NOT
+ create a socketpair in the multi handle.
+
+ See https://github.com/curl/curl/issues/4829
+
3. Documentation
3.2 Provide cmake config-file
@@ -499,6 +564,13 @@
"Better" support for persistent connections over HTTP 1.0
https://curl.haxx.se/bug/feature.cgi?id=1089001
+5.2 Set custom client ip when using haproxy protocol
+
+ This would allow testing servers with different client ip addresses (without
+ using x-forward-for header).
+
+ https://github.com/curl/curl/issues/5125
+
5.3 Rearrange request header order
Server implementors often make an effort to detect browser and to reject
@@ -594,6 +666,17 @@
be possible to use ldap_bind_s() instead specifying the security context
information ourselves.
+10.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
+
+ CURLOPT_SSL_CTX_FUNCTION works perfectly for HTTPS and email protocols, but
+ it has no effect for LDAPS connections.
+
+ https://github.com/curl/curl/issues/4108
+
+10.3 Paged searches on LDAP server
+
+ https://github.com/curl/curl/issues/4452
+
11. SMB
11.1 File listing support
@@ -618,6 +701,15 @@ that doesn't exist on the server, just like --ftp-create-dirs.
13. SSL
+13.1 TLS-PSK with OpenSSL
+
+ Transport Layer Security pre-shared key ciphersuites (TLS-PSK) is a set of
+ cryptographic protocols that provide secure communication based on pre-shared
+ keys (PSKs). These pre-shared keys are symmetric keys shared in advance among
+ the communicating parties.
+
+ https://github.com/curl/curl/issues/5081
+
13.2 Provide mutex locking API
Provide a libcurl API for setting mutex callbacks in the underlying SSL
@@ -682,6 +774,14 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Björn Stenberg wrote a separate initial take on DANE that was never
completed.
+13.9 TLS record padding
+
+ TLS (1.3) offers optional record padding and OpenSSL provides an API for it.
+ I could make sense for libcurl to offer this ability to applications to make
+ traffic patterns harder to figure out by network traffic observers.
+
+ See https://github.com/curl/curl/issues/5398
+
13.10 Support Authority Information Access certificate extension (AIA)
AIA can provide various things like CRLs but more importantly information
@@ -697,23 +797,30 @@ that doesn't exist on the server, just like --ftp-create-dirs.
CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root
certificates when comparing the pinned keys. Therefore it is not compatible
- with "HTTP Public Key Pinning" as there also intermediate and root certificates
- can be pinned. This is very useful as it prevents webadmins from "locking
- themself out of their servers".
+ with "HTTP Public Key Pinning" as there also intermediate and root
+ certificates can be pinned. This is very useful as it prevents webadmins from
+ "locking themself out of their servers".
- Adding this feature would make curls pinning 100% compatible to HPKP and allow
- more flexible pinning.
+ Adding this feature would make curls pinning 100% compatible to HPKP and
+ allow more flexible pinning.
13.12 Support HSTS
"HTTP Strict Transport Security" is TOFU (trust on first use), time-based
features indicated by a HTTP header send by the webserver. It is widely used
- in browsers and it's purpose is to prevent insecure HTTP connections after
- a previous HTTPS connection. It protects against SSLStripping attacks.
+ in browsers and it's purpose is to prevent insecure HTTP connections after a
+ previous HTTPS connection. It protects against SSLStripping attacks.
Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
RFC 6797: https://tools.ietf.org/html/rfc6797
+13.13 Make sure we forbid TLS 1.3 post-handshake authentication
+
+ RFC 8740 explains how using HTTP/2 must forbid the use of TLS 1.3
+ post-handshake authentication. We should make sure to live up to that.
+
+ See https://github.com/curl/curl/issues/5396
+
13.14 Support the clienthello extension
Certain stupid networks and middle boxes have a problem with SSL handshake
@@ -731,31 +838,23 @@ that doesn't exist on the server, just like --ftp-create-dirs.
Add a way to check if the connection seems to be alive, to correspond to the
SSL_peak() way we use with OpenSSL.
-15. WinSSL/SChannel
+15. Schannel
-15.1 Add support for client certificate authentication
+15.1 Extend support for client certificate authentication
- WinSSL/SChannel currently makes use of the OS-level system and user
- certificate and private key stores. This does not allow the application
- or the user to supply a custom client certificate using curl or libcurl.
-
- Therefore support for the existing -E/--cert and --key options should be
- implemented by supplying a custom certificate to the SChannel APIs, see:
+ The existing support for the -E/--cert and --key options could be
+ extended by supplying a custom certificate and key in PEM format, see:
- Getting a Certificate for Schannel
https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
-15.3 Add support for the --ciphers option
-
- The cipher suites used by WinSSL/SChannel are configured on an OS-level
- instead of an application-level. This does not allow the application or
- the user to customize the configured cipher suites using curl or libcurl.
+15.2 Extend support for the --ciphers option
- Therefore support for the existing --ciphers option should be implemented
- by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see
+ The existing support for the --ciphers option could be extended
+ by mapping the OpenSSL/GnuTLS cipher suites to the Schannel APIs, see
- Specifying Schannel Ciphers and Cipher Strengths
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
-15.4 Add option to disable client certificate auto-send
+15.3 Add option to disable client certificate auto-send
Microsoft says "By default, Schannel will, with no notification to the client,
attempt to locate a client certificate and send it to the server." That could
@@ -768,6 +867,15 @@ that doesn't exist on the server, just like --ftp-create-dirs.
https://github.com/curl/curl/issues/2262
+15.4 Add option to allow abrupt server closure
+
+ libcurl w/schannel will error without a known termination point from the
+ server (such as length of transfer, or SSL "close notify" alert) to prevent
+ against a truncation attack. Really old servers may neglect to send any
+ termination point. An option could be added to ignore such abrupt closures.
+
+ https://github.com/curl/curl/issues/4427
+
16. SASL
16.1 Other authentication mechanisms
@@ -804,7 +912,7 @@ that doesn't exist on the server, just like --ftp-create-dirs.
The SFTP code in libcurl checks the file size *before* a transfer starts and
then proceeds to transfer exactly that amount of data. If the remote file
- grows while the tranfer is in progress libcurl won't notice and will not
+ grows while the transfer is in progress libcurl won't notice and will not
adapt. The OpenSSH SFTP command line tool does and libcurl could also just
attempt to download more to see if there is more to get...
@@ -824,6 +932,13 @@ that doesn't exist on the server, just like --ftp-create-dirs.
The two other QUOTE options are supported for SFTP, but this was left out for
unknown reasons!
+17.5 SSH over HTTPS proxy with more backends
+
+ The SSH based protocols SFTP and SCP didn't work over HTTPS proxy at
+ all until PR https://github.com/curl/curl/pull/6021 brought the
+ functionality with the libssh2 backend. Presumably, this support
+ can/could be added for the other backends as well.
+
18. Command line tool
18.1 sync
@@ -848,6 +963,16 @@ that doesn't exist on the server, just like --ftp-create-dirs.
existing). So that index.html becomes first index.html.1 and then
index.html.2 etc.
+18.4 --proxycommand
+
+ Allow the user to make curl run a command and use its stdio to make requests
+ and not do any network connection by itself. Example:
+
+ curl --proxycommand 'ssh pi@raspberrypi.local -W 10.1.1.75 80' \
+ http://some/otherwise/unavailable/service.php
+
+ See https://github.com/curl/curl/issues/4941
+
18.5 UTF-8 filenames in Content-Disposition
RFC 6266 documents how UTF-8 names can be passed to a client in the
@@ -855,6 +980,14 @@ that doesn't exist on the server, just like --ftp-create-dirs.
https://github.com/curl/curl/issues/1888
+18.6 Option to make -Z merge lined based outputs on stdout
+
+ When a user requests multiple lined based files using -Z and sends them to
+ stdout, curl will not "merge" and send complete lines fine but may very well
+ send partial lines from several sources.
+
+ https://github.com/curl/curl/issues/5175
+
18.7 at least N milliseconds between requests
Allow curl command lines issue a lot of request against services that limit
@@ -866,6 +999,20 @@ that doesn't exist on the server, just like --ftp-create-dirs.
See https://github.com/curl/curl/issues/3920
+18.8 Consider convenience options for JSON and XML?
+
+ Could we add `--xml` or `--json` to add headers needed to call rest API:
+
+ `--xml` adds -H 'Content-Type: application/xml' -H "Accept: application/xml" and
+ `--json` adds -H 'Content-Type: application/json' -H "Accept: application/json"
+
+ Setting Content-Type when doing a GET or any other method without a body
+ would be a bit strange I think - so maybe only add CT for requests with body?
+ Maybe plain `--xml` and ` --json` are a bit too brief and generic. Maybe
+ `--http-json` etc?
+
+ See https://github.com/curl/curl/issues/5203
+
18.9 Choose the name of file in braces for complex URLs
When using braces to download a list of URLs and you use complicated names
@@ -903,6 +1050,23 @@ that doesn't exist on the server, just like --ftp-create-dirs.
invoke can talk to the still running instance and ask for transfers to get
done, and thus maintain its connection pool, DNS cache and more.
+18.13 Ratelimit or wait between serial requests
+
+ Consider a command line option that can make curl do multiple serial requests
+ slow, potentially with a (random) wait between transfers. There's also a
+ propsed set of standard HTTP headers to let servers let the client adapt to
+ its rate limits:
+ https://www.ietf.org/id/draft-polli-ratelimit-headers-02.html
+
+ See https://github.com/curl/curl/issues/5406
+
+18.14 --dry-run
+
+ A command line option that makes curl show exactly what it would do and send
+ if it would run for real.
+
+ See https://github.com/curl/curl/issues/5426
+
18.15 --retry should resume
When --retry is used and curl actually retries transfer, it should use the
@@ -965,6 +1129,45 @@ that doesn't exist on the server, just like --ftp-create-dirs.
default .curlrc could a specific user-agent only when doing requests against
a certain site.
+18.21 retry on the redirected-to URL
+
+ When curl is told to --retry a failed transfer and follows redirects, it
+ might get a HTTP 429 response from the redirected-to URL and not the original
+ one, which then could make curl decide to rather retry the transfer on that
+ URL only instead of the original operation to the original URL.
+
+ Perhaps extra emphasized if the original transfer is a large POST that
+ redirects to a separate GET, and that GET is what gets the 529
+
+ See https://github.com/curl/curl/issues/5462
+
+18.23 Set the modification date on an uploaded file
+
+ For SFTP and posssibly FTP, curl could offer an option to set the
+ modification time for the uploaded file.
+
+ See https://github.com/curl/curl/issues/5768
+
+18.24 Use multiple parallel transfers for a single download
+
+ To enhance transfer speed, downloading a single URL can be split up into
+ multiple separate range downloads that get combined into a single final
+ result.
+
+ An ideal implementation would not use a specified number of parallel
+ transfers, but curl could:
+ - First start getting the full file as transfer A
+ - If after N seconds have passed and the transfer is expected to continue for
+ M seconds or more, add a new transfer (B) that asks for the second half of
+ A's content (and stop A at the middle).
+ - If splitting up the work improves the transfer rate, it could then be done
+ again. Then again, etc up to a limit.
+
+ This way, if transfer B fails (because Range: isn't supported) it will let
+ transfer A remain the single one. N and M could be set to some sensible
+ defaults.
+
+ See https://github.com/curl/curl/issues/5774
19. Build
@@ -985,13 +1188,15 @@ that doesn't exist on the server, just like --ftp-create-dirs.
to no impact, neither on the performance nor on the general functionality of
curl.
-19.3 cmake test suite improvements
-
- The cmake build doesn't support 'make show' so it doesn't know which tests
- are in the makefile or not (making appveyor builds do many false warnings
- about it) nor does it support running the test suite if building out-of-tree.
+19.3 Don't use GNU libtool on OpenBSD
+ When compiling curl on OpenBSD with "--enable-debug" it will give linking
+ errors when you use GNU libtool. This can be fixed by using the libtool
+ provided by OpenBSD itself. However for this the user always needs to invoke
+ make with "LIBTOOL=/usr/bin/libtool". It would be nice if the script could
+ have some magic to detect if this system is an OpenBSD host and then use the
+ OpenBSD libtool instead.
- See https://github.com/curl/curl/issues/3109
+ See https://github.com/curl/curl/issues/5862
20. Test suite
@@ -1045,6 +1250,26 @@ that doesn't exist on the server, just like --ftp-create-dirs.
properly. Look into making the preload support in runtests.pl portable such
that it uses DYLD_INSERT_LIBRARIES on macOS.
+20.8 Run web-platform-tests url tests
+
+ Run web-platform-tests url tests and compare results with browsers on wpt.fyi
+
+ It would help us find issues to fix and help us document where our parser
+ differs from the WHATWG URL spec parsers.
+
+ See https://github.com/curl/curl/issues/4477
+
+20.9 Use "random" ports for the test servers
+
+ Instead of insisting and using fixed port numbers for the tests (even though
+ they can be changed with a switch), consider letting each server pick a
+ random available one at start-up, store that info in a file and let the test
+ suite use that.
+
+ We could then remove the "check that it is our server that's running"-check
+ and we would immediately detect when we write tests wrongly to use hard-coded
+ port numbers.
+
21. Next SONAME bump
21.1 http-style HEAD output for FTP
diff --git a/docs/TheArtOfHttpScripting b/docs/TheArtOfHttpScripting
deleted file mode 100644
index c5b67ca1b..000000000
--- a/docs/TheArtOfHttpScripting
+++ /dev/null
@@ -1,758 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-
-The Art Of Scripting HTTP Requests Using Curl
-
- 1. HTTP Scripting
- 1.1 Background
- 1.2 The HTTP Protocol
- 1.3 See the Protocol
- 1.4 See the Timing
- 1.5 See the Response
- 2. URL
- 2.1 Spec
- 2.2 Host
- 2.3 Port number
- 2.4 User name and password
- 2.5 Path part
- 3. Fetch a page
- 3.1 GET
- 3.2 HEAD
- 3.3 Multiple URLs in a single command line
- 3.4 Multiple HTTP methods in a single command line
- 4. HTML forms
- 4.1 Forms explained
- 4.2 GET
- 4.3 POST
- 4.4 File Upload POST
- 4.5 Hidden Fields
- 4.6 Figure Out What A POST Looks Like
- 5. HTTP upload
- 5.1 PUT
- 6. HTTP Authentication
- 6.1 Basic Authentication
- 6.2 Other Authentication
- 6.3 Proxy Authentication
- 6.4 Hiding credentials
- 7. More HTTP Headers
- 7.1 Referer
- 7.2 User Agent
- 8. Redirects
- 8.1 Location header
- 8.2 Other redirects
- 9. Cookies
- 9.1 Cookie Basics
- 9.2 Cookie options
- 10. HTTPS
- 10.1 HTTPS is HTTP secure
- 10.2 Certificates
- 11. Custom Request Elements
- 11.1 Modify method and headers
- 11.2 More on changed methods
- 12. Web Login
- 12.1 Some login tricks
- 13. Debug
- 13.1 Some debug tricks
- 14. References
- 14.1 Standards
- 14.2 Sites
-
-==============================================================================
-
-1. HTTP Scripting
-
- 1.1 Background
-
- This document assumes that you're familiar with HTML and general networking.
-
- The increasing amount of applications moving to the web has made "HTTP
- Scripting" more frequently requested and wanted. To be able to automatically
- extract information from the web, to fake users, to post or upload data to
- web servers are all important tasks today.
-
- Curl is a command line tool for doing all sorts of URL manipulations and
- transfers, but this particular document will focus on how to use it when
- doing HTTP requests for fun and profit. I'll assume that you know how to
- invoke 'curl --help' or 'curl --manual' to get basic information about it.
-
- Curl is not written to do everything for you. It makes the requests, it gets
- the data, it sends data and it retrieves the information. You probably need
- to glue everything together using some kind of script language or repeated
- manual invokes.
-
- 1.2 The HTTP Protocol
-
- HTTP is the protocol used to fetch data from web servers. It is a very simple
- protocol that is built upon TCP/IP. The protocol also allows information to
- get sent to the server from the client using a few different methods, as will
- be shown here.
-
- HTTP is plain ASCII text lines being sent by the client to a server to
- request a particular action, and then the server replies a few text lines
- before the actual requested content is sent to the client.
-
- The client, curl, sends a HTTP request. The request contains a method (like
- GET, POST, HEAD etc), a number of request headers and sometimes a request
- body. The HTTP server responds with a status line (indicating if things went
- well), response headers and most often also a response body. The "body" part
- is the plain data you requested, like the actual HTML or the image etc.
-
- 1.3 See the Protocol
-
- Using curl's option --verbose (-v as a short option) will display what kind
- of commands curl sends to the server, as well as a few other informational
- texts.
-
- --verbose is the single most useful option when it comes to debug or even
- understand the curl<->server interaction.
-
- Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer
- even more details as they show EVERYTHING curl sends and receives. Use it
- like this:
-
- curl --trace-ascii debugdump.txt http://www.example.com/
-
- 1.4 See the Timing
-
- Many times you may wonder what exactly is taking all the time, or you just
- want to know the amount of milliseconds between two points in a
- transfer. For those, and other similar situations, the --trace-time option
- is what you need. It'll prepend the time to each trace output line:
-
- curl --trace-ascii d.txt --trace-time http://example.com/
-
- 1.5 See the Response
-
- By default curl sends the response to stdout. You need to redirect it
- somewhere to avoid that, most often that is done with -o or -O.
-
-2. URL
-
- 2.1 Spec
-
- The Uniform Resource Locator format is how you specify the address of a
- particular resource on the Internet. You know these, you've seen URLs like
- https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the
- canonical spec. And yeah, the formal name is not URL, it is URI.
-
- 2.2 Host
-
- The host name is usually resolved using DNS or your /etc/hosts file to an IP
- address and that's what curl will communicate with. Alternatively you specify
- the IP address directly in the URL instead of a name.
-
- For development and other trying out situations, you can point to a different
- IP address for a host name than what would otherwise be used, by using curl's
- --resolve option:
-
- curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
-
- 2.3 Port number
-
- Each protocol curl supports operates on a default port number, be it over TCP
- or in some cases UDP. Normally you don't have to take that into
- consideration, but at times you run test servers on other ports or
- similar. Then you can specify the port number in the URL with a colon and a
- number immediately following the host name. Like when doing HTTP to port
- 1234:
-
- curl http://www.example.org:1234/
-
- The port number you specify in the URL is the number that the server uses to
- offer its services. Sometimes you may use a local proxy, and then you may
- need to specify that proxy's port number separately for what curl needs to
- connect to locally. Like when using a HTTP proxy on port 4321:
-
- curl --proxy http://proxy.example.org:4321 http://remote.example.org/
-
- 2.4 User name and password
-
- Some services are setup to require HTTP authentication and then you need to
- provide name and password which is then transferred to the remote site in
- various ways depending on the exact authentication protocol used.
-
- You can opt to either insert the user and password in the URL or you can
- provide them separately:
-
- curl http://user:password@example.org/
-
- or
-
- curl -u user:password http://example.org/
-
- You need to pay attention that this kind of HTTP authentication is not what
- is usually done and requested by user-oriented web sites these days. They
- tend to use forms and cookies instead.
-
- 2.5 Path part
-
- The path part is just sent off to the server to request that it sends back
- the associated response. The path is what is to the right side of the slash
- that follows the host name and possibly port number.
-
-3. Fetch a page
-
- 3.1 GET
-
- The simplest and most common request/operation made using HTTP is to GET a
- URL. The URL could itself refer to a web page, an image or a file. The client
- issues a GET request to the server and receives the document it asked for.
- If you issue the command line
-
- curl https://curl.haxx.se
-
- you get a web page returned in your terminal window. The entire HTML document
- that that URL holds.
-
- All HTTP replies contain a set of response headers that are normally hidden,
- use curl's --include (-i) option to display them as well as the rest of the
- document.
-
- 3.2 HEAD
-
- You can ask the remote server for ONLY the headers by using the --head (-I)
- option which will make curl issue a HEAD request. In some special cases
- servers deny the HEAD method while others still work, which is a particular
- kind of annoyance.
-
- The HEAD method is defined and made so that the server returns the headers
- exactly the way it would do for a GET, but without a body. It means that you
- may see a Content-Length: in the response headers, but there must not be an
- actual body in the HEAD response.
-
- 3.3 Multiple URLs in a single command line
-
- A single curl command line may involve one or many URLs. The most common case
- is probably to just use one, but you can specify any amount of URLs. Yes
- any. No limits. You'll then get requests repeated over and over for all the
- given URLs.
-
- Example, send two GETs:
-
- curl http://url1.example.com http://url2.example.com
-
- If you use --data to POST to the URL, using multiple URLs means that you send
- that same POST to all the given URLs.
-
- Example, send two POSTs:
-
- curl --data name=curl http://url1.example.com http://url2.example.com
-
-
- 3.4 Multiple HTTP methods in a single command line
-
- Sometimes you need to operate on several URLs in a single command line and do
- different HTTP methods on each. For this, you'll enjoy the --next option. It
- is basically a separator that separates a bunch of options from the next. All
- the URLs before --next will get the same method and will get all the POST
- data merged into one.
-
- When curl reaches the --next on the command line, it'll sort of reset the
- method and the POST data and allow a new set.
-
- Perhaps this is best shown with a few examples. To send first a HEAD and then
- a GET:
-
- curl -I http://example.com --next http://example.com
-
- To first send a POST and then a GET:
-
- curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
-
-
-4. HTML forms
-
- 4.1 Forms explained
-
- Forms are the general way a web site can present a HTML page with fields for
- the user to enter data in, and then press some kind of 'OK' or 'Submit'
- button to get that data sent to the server. The server then typically uses
- the posted data to decide how to act. Like using the entered words to search
- in a database, or to add the info in a bug tracking system, display the entered
- address on a map or using the info as a login-prompt verifying that the user
- is allowed to see what it is about to see.
-
- Of course there has to be some kind of program on the server end to receive
- the data you send. You cannot just invent something out of the air.
-
- 4.2 GET
-
- A GET-form uses the method GET, as specified in HTML like:
-
- <form method="GET" action="junk.cgi">
- <input type=text name="birthyear">
- <input type=submit name=press value="OK">
- </form>
-
- In your favorite browser, this form will appear with a text box to fill in
- and a press-button labeled "OK". If you fill in '1905' and press the OK
- button, your browser will then create a new URL to get for you. The URL will
- get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the
- previous URL.
-
- If the original form was seen on the page "www.hotmail.com/when/birth.html",
- the second page you'll get will become
- "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK".
-
- Most search engines work this way.
-
- To make curl do the GET form post for you, just enter the expected created
- URL:
-
- curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
-
- 4.3 POST
-
- The GET method makes all input field names get displayed in the URL field of
- your browser. That's generally a good thing when you want to be able to
- bookmark that page with your given data, but it is an obvious disadvantage
- if you entered secret information in one of the fields or if there are a
- large amount of fields creating a very long and unreadable URL.
-
- The HTTP protocol then offers the POST method. This way the client sends the
- data separated from the URL and thus you won't see any of it in the URL
- address field.
-
- The form would look very similar to the previous one:
-
- <form method="POST" action="junk.cgi">
- <input type=text name="birthyear">
- <input type=submit name=press value=" OK ">
- </form>
-
- And to use curl to post this form with the same data filled in as before, we
- could do it like:
-
- curl --data "birthyear=1905&press=%20OK%20" \
- http://www.example.com/when.cgi
-
- This kind of POST will use the Content-Type
- application/x-www-form-urlencoded and is the most widely used POST kind.
-
- The data you send to the server MUST already be properly encoded, curl will
- not do that for you. For example, if you want the data to contain a space,
- you need to replace that space with %20 etc. Failing to comply with this
- will most likely cause your data to be received wrongly and messed up.
-
- Recent curl versions can in fact url-encode POST data for you, like this:
-
- curl --data-urlencode "name=I am Daniel" http://www.example.com
-
- If you repeat --data several times on the command line, curl will
- concatenate all the given data pieces - and put a '&' symbol between each
- data segment.
-
- 4.4 File Upload POST
-
- Back in late 1995 they defined an additional way to post data over HTTP. It
- is documented in the RFC 1867, why this method sometimes is referred to as
- RFC1867-posting.
-
- This method is mainly designed to better support file uploads. A form that
- allows a user to upload a file could be written like this in HTML:
-
- <form method="POST" enctype='multipart/form-data' action="upload.cgi">
- <input type=file name=upload>
- <input type=submit name=press value="OK">
- </form>
-
- This clearly shows that the Content-Type about to be sent is
- multipart/form-data.
-
- To post to a form like this with curl, you enter a command line like:
-
- curl --form upload=@localfilename --form press=OK [URL]
-
- 4.5 Hidden Fields
-
- A very common way for HTML based applications to pass state information
- between pages is to add hidden fields to the forms. Hidden fields are
- already filled in, they aren't displayed to the user and they get passed
- along just as all the other fields.
-
- A similar example form with one visible field, one hidden field and one
- submit button could look like:
-
- <form method="POST" action="foobar.cgi">
- <input type=text name="birthyear">
- <input type=hidden name="person" value="daniel">
- <input type=submit name="press" value="OK">
- </form>
-
- To POST this with curl, you won't have to think about if the fields are
- hidden or not. To curl they're all the same:
-
- curl --data "birthyear=1905&press=OK&person=daniel" [URL]
-
- 4.6 Figure Out What A POST Looks Like
-
- When you're about fill in a form and send to a server by using curl instead
- of a browser, you're of course very interested in sending a POST exactly the
- way your browser does.
-
- An easy way to get to see this, is to save the HTML page with the form on
- your local disk, modify the 'method' to a GET, and press the submit button
- (you could also change the action URL if you want to).
-
- You will then clearly see the data get appended to the URL, separated with a
- '?'-letter as GET forms are supposed to.
-
-5. HTTP upload
-
- 5.1 PUT
-
- Perhaps the best way to upload data to a HTTP server is to use PUT. Then
- again, this of course requires that someone put a program or script on the
- server end that knows how to receive a HTTP PUT stream.
-
- Put a file to a HTTP server with curl:
-
- curl --upload-file uploadfile http://www.example.com/receive.cgi
-
-6. HTTP Authentication
-
- 6.1 Basic Authentication
-
- HTTP Authentication is the ability to tell the server your username and
- password so that it can verify that you're allowed to do the request you're
- doing. The Basic authentication used in HTTP (which is the type curl uses by
- default) is *plain* *text* based, which means it sends username and password
- only slightly obfuscated, but still fully readable by anyone that sniffs on
- the network between you and the remote server.
-
- To tell curl to use a user and password for authentication:
-
- curl --user name:password http://www.example.com
-
- 6.2 Other Authentication
-
- The site might require a different authentication method (check the headers
- returned by the server), and then --ntlm, --digest, --negotiate or even
- --anyauth might be options that suit you.
-
- 6.3 Proxy Authentication
-
- Sometimes your HTTP access is only available through the use of a HTTP
- proxy. This seems to be especially common at various companies. A HTTP proxy
- may require its own user and password to allow the client to get through to
- the Internet. To specify those with curl, run something like:
-
- curl --proxy-user proxyuser:proxypassword curl.haxx.se
-
- If your proxy requires the authentication to be done using the NTLM method,
- use --proxy-ntlm, if it requires Digest use --proxy-digest.
-
- If you use any one of these user+password options but leave out the password
- part, curl will prompt for the password interactively.
-
- 6.4 Hiding credentials
-
- Do note that when a program is run, its parameters might be possible to see
- when listing the running processes of the system. Thus, other users may be
- able to watch your passwords if you pass them as plain command line
- options. There are ways to circumvent this.
-
- It is worth noting that while this is how HTTP Authentication works, very
- many web sites will not use this concept when they provide logins etc. See
- the Web Login chapter further below for more details on that.
-
-7. More HTTP Headers
-
- 7.1 Referer
-
- A HTTP request may include a 'referer' field (yes it is misspelled), which
- can be used to tell from which URL the client got to this particular
- resource. Some programs/scripts check the referer field of requests to verify
- that this wasn't arriving from an external site or an unknown page. While
- this is a stupid way to check something so easily forged, many scripts still
- do it. Using curl, you can put anything you want in the referer-field and
- thus more easily be able to fool the server into serving your request.
-
- Use curl to set the referer field with:
-
- curl --referer http://www.example.come http://www.example.com
-
- 7.2 User Agent
-
- Very similar to the referer field, all HTTP requests may set the User-Agent
- field. It names what user agent (client) that is being used. Many
- applications use this information to decide how to display pages. Silly web
- programmers try to make different pages for users of different browsers to
- make them look the best possible for their particular browsers. They usually
- also do different kinds of javascript, vbscript etc.
-
- At times, you will see that getting a page with curl will not return the same
- page that you see when getting the page with your browser. Then you know it
- is time to set the User Agent field to fool the server into thinking you're
- one of those browsers.
-
- To make curl look like Internet Explorer 5 on a Windows 2000 box:
-
- curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
-
- Or why not look like you're using Netscape 4.73 on an old Linux box:
-
- curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
-
-8. Redirects
-
- 8.1 Location header
-
- When a resource is requested from a server, the reply from the server may
- include a hint about where the browser should go next to find this page, or a
- new page keeping newly generated output. The header that tells the browser
- to redirect is Location:.
-
- Curl does not follow Location: headers by default, but will simply display
- such pages in the same manner it displays all HTTP replies. It does however
- feature an option that will make it attempt to follow the Location: pointers.
-
- To tell curl to follow a Location:
-
- curl --location http://www.example.com
-
- If you use curl to POST to a site that immediately redirects you to another
- page, you can safely use --location (-L) and --data/--form together. Curl will
- only use POST in the first request, and then revert to GET in the following
- operations.
-
- 8.2 Other redirects
-
- Browser typically support at least two other ways of redirects that curl
- doesn't: first the html may contain a meta refresh tag that asks the browser
- to load a specific URL after a set number of seconds, or it may use
- javascript to do it.
-
-9. Cookies
-
- 9.1 Cookie Basics
-
- The way the web browsers do "client side state control" is by using
- cookies. Cookies are just names with associated contents. The cookies are
- sent to the client by the server. The server tells the client for what path
- and host name it wants the cookie sent back, and it also sends an expiration
- date and a few more properties.
-
- When a client communicates with a server with a name and path as previously
- specified in a received cookie, the client sends back the cookies and their
- contents to the server, unless of course they are expired.
-
- Many applications and servers use this method to connect a series of requests
- into a single logical session. To be able to use curl in such occasions, we
- must be able to record and send back cookies the way the web application
- expects them. The same way browsers deal with them.
-
- 9.2 Cookie options
-
- The simplest way to send a few cookies to the server when getting a page with
- curl is to add them on the command line like:
-
- curl --cookie "name=Daniel" http://www.example.com
-
- Cookies are sent as common HTTP headers. This is practical as it allows curl
- to record cookies simply by recording headers. Record cookies with curl by
- using the --dump-header (-D) option like:
-
- curl --dump-header headers_and_cookies http://www.example.com
-
- (Take note that the --cookie-jar option described below is a better way to
- store cookies.)
-
- Curl has a full blown cookie parsing engine built-in that comes in use if you
- want to reconnect to a server and use cookies that were stored from a
- previous connection (or hand-crafted manually to fool the server into
- believing you had a previous connection). To use previously stored cookies,
- you run curl like:
-
- curl --cookie stored_cookies_in_file http://www.example.com
-
- Curl's "cookie engine" gets enabled when you use the --cookie option. If you
- only want curl to understand received cookies, use --cookie with a file that
- doesn't exist. Example, if you want to let curl understand cookies from a
- page and follow a location (and thus possibly send back cookies it received),
- you can invoke it like:
-
- curl --cookie nada --location http://www.example.com
-
- Curl has the ability to read and write cookie files that use the same file
- format that Netscape and Mozilla once used. It is a convenient way to share
- cookies between scripts or invokes. The --cookie (-b) switch automatically
- detects if a given file is such a cookie file and parses it, and by using the
- --cookie-jar (-c) option you'll make curl write a new cookie file at the end
- of an operation:
-
- curl --cookie cookies.txt --cookie-jar newcookies.txt \
- http://www.example.com
-
-10. HTTPS
-
- 10.1 HTTPS is HTTP secure
-
- There are a few ways to do secure HTTP transfers. By far the most common
- protocol for doing this is what is generally known as HTTPS, HTTP over
- SSL. SSL encrypts all the data that is sent and received over the network and
- thus makes it harder for attackers to spy on sensitive information.
-
- SSL (or TLS as the latest version of the standard is called) offers a
- truckload of advanced features to allow all those encryptions and key
- infrastructure mechanisms encrypted HTTP requires.
-
- Curl supports encrypted fetches when built to use a TLS library and it can be
- built to use one out of a fairly large set of libraries - "curl -V" will show
- which one your curl was built to use (if any!). To get a page from a HTTPS
- server, simply run curl like:
-
- curl https://secure.example.com
-
- 10.2 Certificates
-
- In the HTTPS world, you use certificates to validate that you are the one
- you claim to be, as an addition to normal passwords. Curl supports client-
- side certificates. All certificates are locked with a pass phrase, which you
- need to enter before the certificate can be used by curl. The pass phrase
- can be specified on the command line or if not, entered interactively when
- curl queries for it. Use a certificate with curl on a HTTPS server like:
-
- curl --cert mycert.pem https://secure.example.com
-
- curl also tries to verify that the server is who it claims to be, by
- verifying the server's certificate against a locally stored CA cert
- bundle. Failing the verification will cause curl to deny the connection. You
- must then use --insecure (-k) in case you want to tell curl to ignore that
- the server can't be verified.
-
- More about server certificate verification and ca cert bundles can be read
- in the SSLCERTS document, available online here:
-
- https://curl.haxx.se/docs/sslcerts.html
-
- At times you may end up with your own CA cert store and then you can tell
- curl to use that to verify the server's certificate:
-
- curl --cacert ca-bundle.pem https://example.com/
-
-
-11. Custom Request Elements
-
-11.1 Modify method and headers
-
- Doing fancy stuff, you may need to add or change elements of a single curl
- request.
-
- For example, you can change the POST request to a PROPFIND and send the data
- as "Content-Type: text/xml" (instead of the default Content-Type) like this:
-
- curl --data "<xml>" --header "Content-Type: text/xml" \
- --request PROPFIND url.com
-
- You can delete a default header by providing one without content. Like you
- can ruin the request by chopping off the Host: header:
-
- curl --header "Host:" http://www.example.com
-
- You can add headers the same way. Your server may want a "Destination:"
- header, and you can add it:
-
- curl --header "Destination: http://nowhere" http://example.com
-
- 11.2 More on changed methods
-
- It should be noted that curl selects which methods to use on its own
- depending on what action to ask for. -d will do POST, -I will do HEAD and so
- on. If you use the --request / -X option you can change the method keyword
- curl selects, but you will not modify curl's behavior. This means that if you
- for example use -d "data" to do a POST, you can modify the method to a
- PROPFIND with -X and curl will still think it sends a POST. You can change
- the normal GET to a POST method by simply adding -X POST in a command line
- like:
-
- curl -X POST http://example.org/
-
- ... but curl will still think and act as if it sent a GET so it won't send any
- request body etc.
-
-
-12. Web Login
-
- 12.1 Some login tricks
-
- While not strictly just HTTP related, it still causes a lot of people problems
- so here's the executive run-down of how the vast majority of all login forms
- work and how to login to them using curl.
-
- It can also be noted that to do this properly in an automated fashion, you
- will most certainly need to script things and do multiple curl invokes etc.
-
- First, servers mostly use cookies to track the logged-in status of the
- client, so you will need to capture the cookies you receive in the
- responses. Then, many sites also set a special cookie on the login page (to
- make sure you got there through their login page) so you should make a habit
- of first getting the login-form page to capture the cookies set there.
-
- Some web-based login systems feature various amounts of javascript, and
- sometimes they use such code to set or modify cookie contents. Possibly they
- do that to prevent programmed logins, like this manual describes how to...
- Anyway, if reading the code isn't enough to let you repeat the behavior
- manually, capturing the HTTP requests done by your browsers and analyzing the
- sent cookies is usually a working method to work out how to shortcut the
- javascript need.
-
- In the actual <form> tag for the login, lots of sites fill-in random/session
- or otherwise secretly generated hidden tags and you may need to first capture
- the HTML code for the login form and extract all the hidden fields to be able
- to do a proper login POST. Remember that the contents need to be URL encoded
- when sent in a normal POST.
-
-13. Debug
-
- 13.1 Some debug tricks
-
- Many times when you run curl on a site, you'll notice that the site doesn't
- seem to respond the same way to your curl requests as it does to your
- browser's.
-
- Then you need to start making your curl requests more similar to your
- browser's requests:
-
- * Use the --trace-ascii option to store fully detailed logs of the requests
- for easier analyzing and better understanding
-
- * Make sure you check for and use cookies when needed (both reading with
- --cookie and writing with --cookie-jar)
-
- * Set user-agent to one like a recent popular browser does
-
- * Set referer like it is set by the browser
-
- * If you use POST, make sure you send all the fields and in the same order as
- the browser does it.
-
- A very good helper to make sure you do this right, is the LiveHTTPHeader tool
- that lets you view all headers you send and receive with Mozilla/Firefox
- (even when using HTTPS). Chrome features similar functionality out of the box
- among the developer's tools.
-
- A more raw approach is to capture the HTTP traffic on the network with tools
- such as ethereal or tcpdump and check what headers that were sent and
- received by the browser. (HTTPS makes this technique inefficient.)
-
-14. References
-
- 14.1 Standards
-
- RFC 7230 is a must to read if you want in-depth understanding of the HTTP
- protocol
-
- RFC 3986 explains the URL syntax
-
- RFC 1867 defines the HTTP post upload format
-
- RFC 6525 defines how HTTP cookies work
-
- 14.2 Sites
-
- https://curl.haxx.se is the home of the curl project
diff --git a/docs/TheArtOfHttpScripting.md b/docs/TheArtOfHttpScripting.md
new file mode 100644
index 000000000..8de00f0a9
--- /dev/null
+++ b/docs/TheArtOfHttpScripting.md
@@ -0,0 +1,692 @@
+# The Art Of Scripting HTTP Requests Using Curl
+
+## Background
+
+ This document assumes that you're familiar with HTML and general networking.
+
+ The increasing amount of applications moving to the web has made "HTTP
+ Scripting" more frequently requested and wanted. To be able to automatically
+ extract information from the web, to fake users, to post or upload data to
+ web servers are all important tasks today.
+
+ Curl is a command line tool for doing all sorts of URL manipulations and
+ transfers, but this particular document will focus on how to use it when
+ doing HTTP requests for fun and profit. I willl assume that you know how to
+ invoke `curl --help` or `curl --manual` to get basic information about it.
+
+ Curl is not written to do everything for you. It makes the requests, it gets
+ the data, it sends data and it retrieves the information. You probably need
+ to glue everything together using some kind of script language or repeated
+ manual invokes.
+
+## The HTTP Protocol
+
+ HTTP is the protocol used to fetch data from web servers. It is a very simple
+ protocol that is built upon TCP/IP. The protocol also allows information to
+ get sent to the server from the client using a few different methods, as will
+ be shown here.
+
+ HTTP is plain ASCII text lines being sent by the client to a server to
+ request a particular action, and then the server replies a few text lines
+ before the actual requested content is sent to the client.
+
+ The client, curl, sends a HTTP request. The request contains a method (like
+ GET, POST, HEAD etc), a number of request headers and sometimes a request
+ body. The HTTP server responds with a status line (indicating if things went
+ well), response headers and most often also a response body. The "body" part
+ is the plain data you requested, like the actual HTML or the image etc.
+
+## See the Protocol
+
+ Using curl's option [`--verbose`](https://curl.haxx.se/docs/manpage.html#-v)
+ (`-v` as a short option) will display what kind of commands curl sends to the
+ server, as well as a few other informational texts.
+
+ `--verbose` is the single most useful option when it comes to debug or even
+ understand the curl<->server interaction.
+
+ Sometimes even `--verbose` is not enough. Then
+ [`--trace`](https://curl.haxx.se/docs/manpage.html#-trace) and
+ [`--trace-ascii`]((https://curl.haxx.se/docs/manpage.html#--trace-ascii)
+ offer even more details as they show **everything** curl sends and
+ receives. Use it like this:
+
+ curl --trace-ascii debugdump.txt http://www.example.com/
+
+## See the Timing
+
+ Many times you may wonder what exactly is taking all the time, or you just
+ want to know the amount of milliseconds between two points in a transfer. For
+ those, and other similar situations, the
+ [`--trace-time`]((https://curl.haxx.se/docs/manpage.html#--trace-time) option
+ is what you need. It'll prepend the time to each trace output line:
+
+ curl --trace-ascii d.txt --trace-time http://example.com/
+
+## See the Response
+
+ By default curl sends the response to stdout. You need to redirect it
+ somewhere to avoid that, most often that is done with ` -o` or `-O`.
+
+# URL
+
+## Spec
+
+ The Uniform Resource Locator format is how you specify the address of a
+ particular resource on the Internet. You know these, you've seen URLs like
+ https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the
+ canonical spec. And yeah, the formal name is not URL, it is URI.
+
+## Host
+
+ The host name is usually resolved using DNS or your /etc/hosts file to an IP
+ address and that's what curl will communicate with. Alternatively you specify
+ the IP address directly in the URL instead of a name.
+
+ For development and other trying out situations, you can point to a different
+ IP address for a host name than what would otherwise be used, by using curl's
+ [`--resolve`](https://curl.haxx.se/docs/manpage.html#--resolve) option:
+
+ curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
+
+## Port number
+
+ Each protocol curl supports operates on a default port number, be it over TCP
+ or in some cases UDP. Normally you don't have to take that into
+ consideration, but at times you run test servers on other ports or
+ similar. Then you can specify the port number in the URL with a colon and a
+ number immediately following the host name. Like when doing HTTP to port
+ 1234:
+
+ curl http://www.example.org:1234/
+
+ The port number you specify in the URL is the number that the server uses to
+ offer its services. Sometimes you may use a local proxy, and then you may
+ need to specify that proxy's port number separately for what curl needs to
+ connect to locally. Like when using a HTTP proxy on port 4321:
+
+ curl --proxy http://proxy.example.org:4321 http://remote.example.org/
+
+## User name and password
+
+ Some services are setup to require HTTP authentication and then you need to
+ provide name and password which is then transferred to the remote site in
+ various ways depending on the exact authentication protocol used.
+
+ You can opt to either insert the user and password in the URL or you can
+ provide them separately:
+
+ curl http://user:password@example.org/
+
+ or
+
+ curl -u user:password http://example.org/
+
+ You need to pay attention that this kind of HTTP authentication is not what
+ is usually done and requested by user-oriented websites these days. They tend
+ to use forms and cookies instead.
+
+## Path part
+
+ The path part is just sent off to the server to request that it sends back
+ the associated response. The path is what is to the right side of the slash
+ that follows the host name and possibly port number.
+
+# Fetch a page
+
+## GET
+
+ The simplest and most common request/operation made using HTTP is to GET a
+ URL. The URL could itself refer to a web page, an image or a file. The client
+ issues a GET request to the server and receives the document it asked for.
+ If you issue the command line
+
+ curl https://curl.haxx.se
+
+ you get a web page returned in your terminal window. The entire HTML document
+ that that URL holds.
+
+ All HTTP replies contain a set of response headers that are normally hidden,
+ use curl's [`--include`](https://curl.haxx.se/docs/manpage.html#-i) (`-i`)
+ option to display them as well as the rest of the document.
+
+## HEAD
+
+ You can ask the remote server for ONLY the headers by using the
+ [`--head`](https://curl.haxx.se/docs/manpage.html#-I) (`-I`) option which
+ will make curl issue a HEAD request. In some special cases servers deny the
+ HEAD method while others still work, which is a particular kind of annoyance.
+
+ The HEAD method is defined and made so that the server returns the headers
+ exactly the way it would do for a GET, but without a body. It means that you
+ may see a `Content-Length:` in the response headers, but there must not be an
+ actual body in the HEAD response.
+
+## Multiple URLs in a single command line
+
+ A single curl command line may involve one or many URLs. The most common case
+ is probably to just use one, but you can specify any amount of URLs. Yes
+ any. No limits. You'll then get requests repeated over and over for all the
+ given URLs.
+
+ Example, send two GETs:
+
+ curl http://url1.example.com http://url2.example.com
+
+ If you use [`--data`](https://curl.haxx.se/docs/manpage.html#-d) to POST to
+ the URL, using multiple URLs means that you send that same POST to all the
+ given URLs.
+
+ Example, send two POSTs:
+
+ curl --data name=curl http://url1.example.com http://url2.example.com
+
+
+## Multiple HTTP methods in a single command line
+
+ Sometimes you need to operate on several URLs in a single command line and do
+ different HTTP methods on each. For this, you'll enjoy the
+ [`--next`](https://curl.haxx.se/docs/manpage.html#-:) option. It is basically
+ a separator that separates a bunch of options from the next. All the URLs
+ before `--next` will get the same method and will get all the POST data
+ merged into one.
+
+ When curl reaches the `--next` on the command line, it'll sort of reset the
+ method and the POST data and allow a new set.
+
+ Perhaps this is best shown with a few examples. To send first a HEAD and then
+ a GET:
+
+ curl -I http://example.com --next http://example.com
+
+ To first send a POST and then a GET:
+
+ curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
+
+# HTML forms
+
+## Forms explained
+
+ Forms are the general way a website can present a HTML page with fields for
+ the user to enter data in, and then press some kind of 'OK' or 'Submit'
+ button to get that data sent to the server. The server then typically uses
+ the posted data to decide how to act. Like using the entered words to search
+ in a database, or to add the info in a bug tracking system, display the
+ entered address on a map or using the info as a login-prompt verifying that
+ the user is allowed to see what it is about to see.
+
+ Of course there has to be some kind of program on the server end to receive
+ the data you send. You cannot just invent something out of the air.
+
+## GET
+
+ A GET-form uses the method GET, as specified in HTML like:
+
+ <form method="GET" action="junk.cgi">
+ <input type=text name="birthyear">
+ <input type=submit name=press value="OK">
+ </form>
+
+ In your favorite browser, this form will appear with a text box to fill in
+ and a press-button labeled "OK". If you fill in '1905' and press the OK
+ button, your browser will then create a new URL to get for you. The URL will
+ get `junk.cgi?birthyear=1905&press=OK` appended to the path part of the
+ previous URL.
+
+ If the original form was seen on the page `www.example.com/when/birth.html`,
+ the second page you'll get will become
+ `www.example.com/when/junk.cgi?birthyear=1905&press=OK`.
+
+ Most search engines work this way.
+
+ To make curl do the GET form post for you, just enter the expected created
+ URL:
+
+ curl "http://www.example.com/when/junk.cgi?birthyear=1905&press=OK"
+
+## POST
+
+ The GET method makes all input field names get displayed in the URL field of
+ your browser. That's generally a good thing when you want to be able to
+ bookmark that page with your given data, but it is an obvious disadvantage if
+ you entered secret information in one of the fields or if there are a large
+ amount of fields creating a very long and unreadable URL.
+
+ The HTTP protocol then offers the POST method. This way the client sends the
+ data separated from the URL and thus you won't see any of it in the URL
+ address field.
+
+ The form would look very similar to the previous one:
+
+ <form method="POST" action="junk.cgi">
+ <input type=text name="birthyear">
+ <input type=submit name=press value=" OK ">
+ </form>
+
+ And to use curl to post this form with the same data filled in as before, we
+ could do it like:
+
+ curl --data "birthyear=1905&press=%20OK%20" http://www.example.com/when.cgi
+
+ This kind of POST will use the Content-Type
+ `application/x-www-form-urlencoded' and is the most widely used POST kind.
+
+ The data you send to the server MUST already be properly encoded, curl will
+ not do that for you. For example, if you want the data to contain a space,
+ you need to replace that space with %20 etc. Failing to comply with this will
+ most likely cause your data to be received wrongly and messed up.
+
+ Recent curl versions can in fact url-encode POST data for you, like this:
+
+ curl --data-urlencode "name=I am Daniel" http://www.example.com
+
+ If you repeat `--data` several times on the command line, curl will
+ concatenate all the given data pieces - and put a `&` symbol between each
+ data segment.
+
+## File Upload POST
+
+ Back in late 1995 they defined an additional way to post data over HTTP. It
+ is documented in the RFC 1867, why this method sometimes is referred to as
+ RFC1867-posting.
+
+ This method is mainly designed to better support file uploads. A form that
+ allows a user to upload a file could be written like this in HTML:
+
+ <form method="POST" enctype='multipart/form-data' action="upload.cgi">
+ <input type=file name=upload>
+ <input type=submit name=press value="OK">
+ </form>
+
+ This clearly shows that the Content-Type about to be sent is
+ `multipart/form-data`.
+
+ To post to a form like this with curl, you enter a command line like:
+
+ curl --form upload=@localfilename --form press=OK [URL]
+
+## Hidden Fields
+
+ A very common way for HTML based applications to pass state information
+ between pages is to add hidden fields to the forms. Hidden fields are already
+ filled in, they aren't displayed to the user and they get passed along just
+ as all the other fields.
+
+ A similar example form with one visible field, one hidden field and one
+ submit button could look like:
+
+ <form method="POST" action="foobar.cgi">
+ <input type=text name="birthyear">
+ <input type=hidden name="person" value="daniel">
+ <input type=submit name="press" value="OK">
+ </form>
+
+ To POST this with curl, you won't have to think about if the fields are
+ hidden or not. To curl they're all the same:
+
+ curl --data "birthyear=1905&press=OK&person=daniel" [URL]
+
+## Figure Out What A POST Looks Like
+
+ When you're about fill in a form and send to a server by using curl instead
+ of a browser, you're of course very interested in sending a POST exactly the
+ way your browser does.
+
+ An easy way to get to see this, is to save the HTML page with the form on
+ your local disk, modify the 'method' to a GET, and press the submit button
+ (you could also change the action URL if you want to).
+
+ You will then clearly see the data get appended to the URL, separated with a
+ `?`-letter as GET forms are supposed to.
+
+# HTTP upload
+
+## PUT
+
+ Perhaps the best way to upload data to a HTTP server is to use PUT. Then
+ again, this of course requires that someone put a program or script on the
+ server end that knows how to receive a HTTP PUT stream.
+
+ Put a file to a HTTP server with curl:
+
+ curl --upload-file uploadfile http://www.example.com/receive.cgi
+
+# HTTP Authentication
+
+## Basic Authentication
+
+ HTTP Authentication is the ability to tell the server your username and
+ password so that it can verify that you're allowed to do the request you're
+ doing. The Basic authentication used in HTTP (which is the type curl uses by
+ default) is **plain text** based, which means it sends username and password
+ only slightly obfuscated, but still fully readable by anyone that sniffs on
+ the network between you and the remote server.
+
+ To tell curl to use a user and password for authentication:
+
+ curl --user name:password http://www.example.com
+
+## Other Authentication
+
+ The site might require a different authentication method (check the headers
+ returned by the server), and then
+ [`--ntlm`](https://curl.haxx.se/docs/manpage.html#--ntlm),
+ [`--digest`](https://curl.haxx.se/docs/manpage.html#--digest),
+ [`--negotiate`](https://curl.haxx.se/docs/manpage.html#--negotiate) or even
+ [`--anyauth`](https://curl.haxx.se/docs/manpage.html#--anyauth) might be
+ options that suit you.
+
+## Proxy Authentication
+
+ Sometimes your HTTP access is only available through the use of a HTTP
+ proxy. This seems to be especially common at various companies. A HTTP proxy
+ may require its own user and password to allow the client to get through to
+ the Internet. To specify those with curl, run something like:
+
+ curl --proxy-user proxyuser:proxypassword curl.haxx.se
+
+ If your proxy requires the authentication to be done using the NTLM method,
+ use [`--proxy-ntlm`](https://curl.haxx.se/docs/manpage.html#--proxy-ntlm), if
+ it requires Digest use
+ [`--proxy-digest`](https://curl.haxx.se/docs/manpage.html#--proxy-digest).
+
+ If you use any one of these user+password options but leave out the password
+ part, curl will prompt for the password interactively.
+
+## Hiding credentials
+
+ Do note that when a program is run, its parameters might be possible to see
+ when listing the running processes of the system. Thus, other users may be
+ able to watch your passwords if you pass them as plain command line
+ options. There are ways to circumvent this.
+
+ It is worth noting that while this is how HTTP Authentication works, very
+ many websites will not use this concept when they provide logins etc. See the
+ Web Login chapter further below for more details on that.
+
+# More HTTP Headers
+
+## Referer
+
+ A HTTP request may include a 'referer' field (yes it is misspelled), which
+ can be used to tell from which URL the client got to this particular
+ resource. Some programs/scripts check the referer field of requests to verify
+ that this wasn't arriving from an external site or an unknown page. While
+ this is a stupid way to check something so easily forged, many scripts still
+ do it. Using curl, you can put anything you want in the referer-field and
+ thus more easily be able to fool the server into serving your request.
+
+ Use curl to set the referer field with:
+
+ curl --referer http://www.example.come http://www.example.com
+
+## User Agent
+
+ Very similar to the referer field, all HTTP requests may set the User-Agent
+ field. It names what user agent (client) that is being used. Many
+ applications use this information to decide how to display pages. Silly web
+ programmers try to make different pages for users of different browsers to
+ make them look the best possible for their particular browsers. They usually
+ also do different kinds of javascript, vbscript etc.
+
+ At times, you will see that getting a page with curl will not return the same
+ page that you see when getting the page with your browser. Then you know it
+ is time to set the User Agent field to fool the server into thinking you're
+ one of those browsers.
+
+ To make curl look like Internet Explorer 5 on a Windows 2000 box:
+
+ curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
+
+ Or why not look like you're using Netscape 4.73 on an old Linux box:
+
+ curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
+
+## Redirects
+
+## Location header
+
+ When a resource is requested from a server, the reply from the server may
+ include a hint about where the browser should go next to find this page, or a
+ new page keeping newly generated output. The header that tells the browser to
+ redirect is `Location:`.
+
+ Curl does not follow `Location:` headers by default, but will simply display
+ such pages in the same manner it displays all HTTP replies. It does however
+ feature an option that will make it attempt to follow the `Location:`
+ pointers.
+
+ To tell curl to follow a Location:
+
+ curl --location http://www.example.com
+
+ If you use curl to POST to a site that immediately redirects you to another
+ page, you can safely use
+ [`--location`](https://curl.haxx.se/docs/manpage.html#-L) (`-L`) and
+ `--data`/`--form` together. curl will only use POST in the first request, and
+ then revert to GET in the following operations.
+
+## Other redirects
+
+ Browser typically support at least two other ways of redirects that curl
+ doesn't: first the html may contain a meta refresh tag that asks the browser
+ to load a specific URL after a set number of seconds, or it may use
+ javascript to do it.
+
+# Cookies
+
+## Cookie Basics
+
+ The way the web browsers do "client side state control" is by using
+ cookies. Cookies are just names with associated contents. The cookies are
+ sent to the client by the server. The server tells the client for what path
+ and host name it wants the cookie sent back, and it also sends an expiration
+ date and a few more properties.
+
+ When a client communicates with a server with a name and path as previously
+ specified in a received cookie, the client sends back the cookies and their
+ contents to the server, unless of course they are expired.
+
+ Many applications and servers use this method to connect a series of requests
+ into a single logical session. To be able to use curl in such occasions, we
+ must be able to record and send back cookies the way the web application
+ expects them. The same way browsers deal with them.
+
+## Cookie options
+
+ The simplest way to send a few cookies to the server when getting a page with
+ curl is to add them on the command line like:
+
+ curl --cookie "name=Daniel" http://www.example.com
+
+ Cookies are sent as common HTTP headers. This is practical as it allows curl
+ to record cookies simply by recording headers. Record cookies with curl by
+ using the [`--dump-header`](https://curl.haxx.se/docs/manpage.html#-D) (`-D`)
+ option like:
+
+ curl --dump-header headers_and_cookies http://www.example.com
+
+ (Take note that the
+ [`--cookie-jar`](https://curl.haxx.se/docs/manpage.html#-c) option described
+ below is a better way to store cookies.)
+
+ Curl has a full blown cookie parsing engine built-in that comes in use if you
+ want to reconnect to a server and use cookies that were stored from a
+ previous connection (or hand-crafted manually to fool the server into
+ believing you had a previous connection). To use previously stored cookies,
+ you run curl like:
+
+ curl --cookie stored_cookies_in_file http://www.example.com
+
+ Curl's "cookie engine" gets enabled when you use the
+ [`--cookie`](https://curl.haxx.se/docs/manpage.html#-b) option. If you only
+ want curl to understand received cookies, use `--cookie` with a file that
+ doesn't exist. Example, if you want to let curl understand cookies from a
+ page and follow a location (and thus possibly send back cookies it received),
+ you can invoke it like:
+
+ curl --cookie nada --location http://www.example.com
+
+ Curl has the ability to read and write cookie files that use the same file
+ format that Netscape and Mozilla once used. It is a convenient way to share
+ cookies between scripts or invokes. The `--cookie` (`-b`) switch
+ automatically detects if a given file is such a cookie file and parses it,
+ and by using the `--cookie-jar` (`-c`) option you'll make curl write a new
+ cookie file at the end of an operation:
+
+ curl --cookie cookies.txt --cookie-jar newcookies.txt \
+ http://www.example.com
+
+# HTTPS
+
+## HTTPS is HTTP secure
+
+ There are a few ways to do secure HTTP transfers. By far the most common
+ protocol for doing this is what is generally known as HTTPS, HTTP over
+ SSL. SSL encrypts all the data that is sent and received over the network and
+ thus makes it harder for attackers to spy on sensitive information.
+
+ SSL (or TLS as the latest version of the standard is called) offers a
+ truckload of advanced features to allow all those encryptions and key
+ infrastructure mechanisms encrypted HTTP requires.
+
+ Curl supports encrypted fetches when built to use a TLS library and it can be
+ built to use one out of a fairly large set of libraries - `curl -V` will show
+ which one your curl was built to use (if any!). To get a page from a HTTPS
+ server, simply run curl like:
+
+ curl https://secure.example.com
+
+## Certificates
+
+ In the HTTPS world, you use certificates to validate that you are the one
+ you claim to be, as an addition to normal passwords. Curl supports client-
+ side certificates. All certificates are locked with a pass phrase, which you
+ need to enter before the certificate can be used by curl. The pass phrase
+ can be specified on the command line or if not, entered interactively when
+ curl queries for it. Use a certificate with curl on a HTTPS server like:
+
+ curl --cert mycert.pem https://secure.example.com
+
+ curl also tries to verify that the server is who it claims to be, by
+ verifying the server's certificate against a locally stored CA cert
+ bundle. Failing the verification will cause curl to deny the connection. You
+ must then use [`--insecure`](https://curl.haxx.se/docs/manpage.html#-k)
+ (`-k`) in case you want to tell curl to ignore that the server can't be
+ verified.
+
+ More about server certificate verification and ca cert bundles can be read in
+ the [SSLCERTS document](https://curl.haxx.se/docs/sslcerts.html).
+
+ At times you may end up with your own CA cert store and then you can tell
+ curl to use that to verify the server's certificate:
+
+ curl --cacert ca-bundle.pem https://example.com/
+
+# Custom Request Elements
+
+## Modify method and headers
+
+ Doing fancy stuff, you may need to add or change elements of a single curl
+ request.
+
+ For example, you can change the POST request to a PROPFIND and send the data
+ as `Content-Type: text/xml` (instead of the default Content-Type) like this:
+
+ curl --data "<xml>" --header "Content-Type: text/xml" \
+ --request PROPFIND example.com
+
+ You can delete a default header by providing one without content. Like you
+ can ruin the request by chopping off the Host: header:
+
+ curl --header "Host:" http://www.example.com
+
+ You can add headers the same way. Your server may want a `Destination:`
+ header, and you can add it:
+
+ curl --header "Destination: http://nowhere" http://example.com
+
+## More on changed methods
+
+ It should be noted that curl selects which methods to use on its own
+ depending on what action to ask for. `-d` will do POST, `-I` will do HEAD and
+ so on. If you use the
+ [`--request`](https://curl.haxx.se/docs/manpage.html#-X) / `-X` option you
+ can change the method keyword curl selects, but you will not modify curl's
+ behavior. This means that if you for example use -d "data" to do a POST, you
+ can modify the method to a `PROPFIND` with `-X` and curl will still think it
+ sends a POST . You can change the normal GET to a POST method by simply
+ adding `-X POST` in a command line like:
+
+ curl -X POST http://example.org/
+
+ ... but curl will still think and act as if it sent a GET so it won't send
+ any request body etc.
+
+# Web Login
+
+## Some login tricks
+
+ While not strictly just HTTP related, it still causes a lot of people
+ problems so here's the executive run-down of how the vast majority of all
+ login forms work and how to login to them using curl.
+
+ It can also be noted that to do this properly in an automated fashion, you
+ will most certainly need to script things and do multiple curl invokes etc.
+
+ First, servers mostly use cookies to track the logged-in status of the
+ client, so you will need to capture the cookies you receive in the
+ responses. Then, many sites also set a special cookie on the login page (to
+ make sure you got there through their login page) so you should make a habit
+ of first getting the login-form page to capture the cookies set there.
+
+ Some web-based login systems feature various amounts of javascript, and
+ sometimes they use such code to set or modify cookie contents. Possibly they
+ do that to prevent programmed logins, like this manual describes how to...
+ Anyway, if reading the code isn't enough to let you repeat the behavior
+ manually, capturing the HTTP requests done by your browsers and analyzing the
+ sent cookies is usually a working method to work out how to shortcut the
+ javascript need.
+
+ In the actual `<form>` tag for the login, lots of sites fill-in
+ random/session or otherwise secretly generated hidden tags and you may need
+ to first capture the HTML code for the login form and extract all the hidden
+ fields to be able to do a proper login POST. Remember that the contents need
+ to be URL encoded when sent in a normal POST.
+
+# Debug
+
+## Some debug tricks
+
+ Many times when you run curl on a site, you'll notice that the site doesn't
+ seem to respond the same way to your curl requests as it does to your
+ browser's.
+
+ Then you need to start making your curl requests more similar to your
+ browser's requests:
+
+ - Use the `--trace-ascii` option to store fully detailed logs of the requests
+ for easier analyzing and better understanding
+
+ - Make sure you check for and use cookies when needed (both reading with
+ `--cookie` and writing with `--cookie-jar`)
+
+ - Set user-agent (with [`-A`](https://curl.haxx.se/docs/manpage.html#-A)) to
+ one like a recent popular browser does
+
+ - Set referer (with [`-E`](https://curl.haxx.se/docs/manpage.html#-E)) like
+ it is set by the browser
+
+ - If you use POST, make sure you send all the fields and in the same order as
+ the browser does it.
+
+## Check what the browsers do
+
+ A very good helper to make sure you do this right, is the web browsers'
+ developers tools that let you view all headers you send and receive (even
+ when using HTTPS).
+
+ A more raw approach is to capture the HTTP traffic on the network with tools
+ such as Wireshark or tcpdump and check what headers that were sent and
+ received by the browser. (HTTPS forces you to use `SSLKEYLOGFILE` to do
+ that.)
diff --git a/docs/VERSIONS b/docs/VERSIONS.md
index 72a45474d..72a45474d 100644
--- a/docs/VERSIONS
+++ b/docs/VERSIONS.md
diff --git a/docs/cmdline-opts/CMakeLists.txt b/docs/cmdline-opts/CMakeLists.txt
index 3c020d418..a63f4eddf 100644
--- a/docs/cmdline-opts/CMakeLists.txt
+++ b/docs/cmdline-opts/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
set(MANPAGE "${CURL_BINARY_DIR}/docs/curl.1")
# Load DPAGES and OTHERPAGES from shared file
diff --git a/docs/cmdline-opts/Makefile.am b/docs/cmdline-opts/Makefile.am
index e6ecf7a6b..0c81b623b 100644
--- a/docs/cmdline-opts/Makefile.am
+++ b/docs/cmdline-opts/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -31,4 +31,5 @@ EXTRA_DIST = $(DPAGES) MANPAGE.md gen.pl $(OTHERPAGES) CMakeLists.txt
all: $(MANPAGE)
$(MANPAGE): $(DPAGES) $(OTHERPAGES) Makefile.inc
- @PERL@ $(srcdir)/gen.pl mainpage $(srcdir) > $(MANPAGE)
+ @echo "generate $(MANPAGE)"
+ @(cd $(srcdir) && @PERL@ ./gen.pl mainpage $(DPAGES)) > $(MANPAGE)
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
index c90e9c5fb..792cadb3c 100644
--- a/docs/cmdline-opts/Makefile.inc
+++ b/docs/cmdline-opts/Makefile.inc
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Shared between Makefile.am and CMakeLists.txt
DPAGES = \
@@ -20,6 +41,7 @@ DPAGES = \
cookie.d \
create-dirs.d \
crlf.d crlfile.d \
+ curves.d \
data-ascii.d \
data-binary.d \
data-urlencode.d \
@@ -38,6 +60,8 @@ DPAGES = \
dump-header.d \
egd-file.d \
engine.d \
+ etag-compare.d \
+ etag-save.d \
expect100-timeout.d \
fail-early.d \
fail.d \
@@ -83,6 +107,7 @@ DPAGES = \
login-options.d \
mail-auth.d \
mail-from.d \
+ mail-rcpt-allowfails.d \
mail-rcpt.d \
manual.d \
max-filesize.d \
@@ -103,9 +128,11 @@ DPAGES = \
ntlm.d ntlm-wb.d \
oauth2-bearer.d \
output.d \
+ output-dir.d \
+ parallel-immediate.d \
+ parallel-max.d \
parallel.d \
pass.d \
- parallel-max.d \
path-as-is.d \
pinnedpubkey.d \
post301.d \
@@ -155,11 +182,12 @@ DPAGES = \
request-target.d \
request.d \
resolve.d \
+ retry-all-errors.d \
retry-connrefused.d \
retry-delay.d \
retry-max-time.d \
retry.d \
- sasl-authzid.d \
+ sasl-authzid.d \
sasl-ir.d \
service-name.d \
show-error.d \
@@ -176,6 +204,7 @@ DPAGES = \
ssl-allow-beast.d \
ssl-no-revoke.d \
ssl-reqd.d \
+ ssl-revoke-best-effort.d \
ssl.d \
sslv2.d sslv3.d \
stderr.d \
diff --git a/docs/cmdline-opts/abstract-unix-socket.d b/docs/cmdline-opts/abstract-unix-socket.d
index 1fda4e5df..8403cab9d 100644
--- a/docs/cmdline-opts/abstract-unix-socket.d
+++ b/docs/cmdline-opts/abstract-unix-socket.d
@@ -3,6 +3,7 @@ Arg: <path>
Help: Connect via abstract Unix domain socket
Added: 7.53.0
Protocols: HTTP
+Category: connection
---
Connect through an abstract Unix domain socket, instead of using the network.
Note: netstat shows the path of an abstract socket prefixed with '@', however
diff --git a/docs/cmdline-opts/alt-svc.d b/docs/cmdline-opts/alt-svc.d
index ba2ded11c..5598b59b4 100644
--- a/docs/cmdline-opts/alt-svc.d
+++ b/docs/cmdline-opts/alt-svc.d
@@ -3,8 +3,9 @@ Arg: <file name>
Protocols: HTTPS
Help: Enable alt-svc with this cache file
Added: 7.64.1
+Category: http
---
-WARNING: this option is experiemental. Do not use in production.
+WARNING: this option is experimental. Do not use in production.
This option enables the alt-svc parser in curl. If the file name points to an
existing alt-svc cache file, that will be used. After a completed transfer,
@@ -14,4 +15,4 @@ Specify a "" file name (zero length) to avoid loading/saving and make curl
just handle the cache in memory.
If this option is used several times, curl will load contents from all the
-files but the the last one will be used for saving.
+files but the last one will be used for saving.
diff --git a/docs/cmdline-opts/anyauth.d b/docs/cmdline-opts/anyauth.d
index c32d1ed5e..bec0c0c86 100644
--- a/docs/cmdline-opts/anyauth.d
+++ b/docs/cmdline-opts/anyauth.d
@@ -2,6 +2,7 @@ Long: anyauth
Help: Pick any authentication method
Protocols: HTTP
See-also: proxy-anyauth basic digest
+Category: http proxy auth
---
Tells curl to figure out authentication method by itself, and use the most
secure one the remote site claims to support. This is done by first doing a
diff --git a/docs/cmdline-opts/append.d b/docs/cmdline-opts/append.d
index f001b1239..8bdb2594d 100644
--- a/docs/cmdline-opts/append.d
+++ b/docs/cmdline-opts/append.d
@@ -2,6 +2,7 @@ Short: a
Long: append
Help: Append to target file when uploading
Protocols: FTP SFTP
+Category: ftp sftp
---
When used in an upload, this makes curl append to the target file instead of
overwriting it. If the remote file doesn't exist, it will be created. Note
diff --git a/docs/cmdline-opts/basic.d b/docs/cmdline-opts/basic.d
index 09d42af9d..e222c51c1 100644
--- a/docs/cmdline-opts/basic.d
+++ b/docs/cmdline-opts/basic.d
@@ -2,6 +2,7 @@ Long: basic
Help: Use HTTP Basic Authentication
See-also: proxy-basic
Protocols: HTTP
+Category: auth
---
Tells curl to use HTTP Basic authentication with the remote host. This is the
default and this option is usually pointless, unless you use it to override a
diff --git a/docs/cmdline-opts/cacert.d b/docs/cmdline-opts/cacert.d
index 6a5678752..793d8c1ba 100644
--- a/docs/cmdline-opts/cacert.d
+++ b/docs/cmdline-opts/cacert.d
@@ -2,6 +2,7 @@ Long: cacert
Arg: <file>
Help: CA certificate to verify peer against
Protocols: TLS
+Category: tls
---
Tells curl to use the specified certificate file to verify the peer. The file
may contain multiple CA certificates. The certificate(s) must be in PEM
diff --git a/docs/cmdline-opts/capath.d b/docs/cmdline-opts/capath.d
index 0763f7a0d..4ce077a14 100644
--- a/docs/cmdline-opts/capath.d
+++ b/docs/cmdline-opts/capath.d
@@ -2,6 +2,7 @@ Long: capath
Arg: <dir>
Help: CA directory to verify peer against
Protocols: TLS
+Category: tls
---
Tells curl to use the specified certificate directory to verify the
peer. Multiple paths can be provided by separating them with ":" (e.g.
diff --git a/docs/cmdline-opts/cert-status.d b/docs/cmdline-opts/cert-status.d
index f1aaa2174..1342b092b 100644
--- a/docs/cmdline-opts/cert-status.d
+++ b/docs/cmdline-opts/cert-status.d
@@ -2,6 +2,7 @@ Long: cert-status
Protocols: TLS
Added: 7.41.0
Help: Verify the status of the server certificate
+Category: tls
---
Tells curl to verify the status of the server certificate by using the
Certificate Status Request (aka. OCSP stapling) TLS extension.
diff --git a/docs/cmdline-opts/cert-type.d b/docs/cmdline-opts/cert-type.d
index 55d8033b4..b041bcb06 100644
--- a/docs/cmdline-opts/cert-type.d
+++ b/docs/cmdline-opts/cert-type.d
@@ -1,8 +1,9 @@
Long: cert-type
Protocols: TLS
Arg: <type>
-Help: Certificate file type
+Help: Certificate type (DER/PEM/ENG)
See-also: cert key key-type
+Category: tls
---
Tells curl what type the provided client certificate is using. PEM, DER, ENG
and P12 are recognized types. If not specified, PEM is assumed.
diff --git a/docs/cmdline-opts/cert.d b/docs/cmdline-opts/cert.d
index de6b42060..2938e571f 100644
--- a/docs/cmdline-opts/cert.d
+++ b/docs/cmdline-opts/cert.d
@@ -4,6 +4,7 @@ Arg: <certificate[:password]>
Help: Client certificate file and password
Protocols: TLS
See-also: cert-type key key-type
+Category: tls
---
Tells curl to use the specified client certificate file when getting a file
with HTTPS, FTPS or another SSL-based protocol. The certificate must be in
diff --git a/docs/cmdline-opts/ciphers.d b/docs/cmdline-opts/ciphers.d
index 69e85525a..ed7438a00 100644
--- a/docs/cmdline-opts/ciphers.d
+++ b/docs/cmdline-opts/ciphers.d
@@ -2,6 +2,7 @@ Long: ciphers
Arg: <list of ciphers>
Help: SSL ciphers to use
Protocols: TLS
+Category: tls
---
Specifies which ciphers to use in the connection. The list of ciphers must
specify valid ciphers. Read up on SSL cipher list details on this URL:
diff --git a/docs/cmdline-opts/compressed-ssh.d b/docs/cmdline-opts/compressed-ssh.d
index 583452ae4..849fe18b0 100644
--- a/docs/cmdline-opts/compressed-ssh.d
+++ b/docs/cmdline-opts/compressed-ssh.d
@@ -2,6 +2,7 @@ Long: compressed-ssh
Help: Enable SSH compression
Protocols: SCP SFTP
Added: 7.56.0
+Category: scp ssh
---
Enables built-in SSH compression.
This is a request, not an order; the server may or may not do it.
diff --git a/docs/cmdline-opts/compressed.d b/docs/cmdline-opts/compressed.d
index dc130c1f0..26bc1514a 100644
--- a/docs/cmdline-opts/compressed.d
+++ b/docs/cmdline-opts/compressed.d
@@ -1,7 +1,10 @@
Long: compressed
Help: Request compressed response
Protocols: HTTP
+Category: http
---
Request a compressed response using one of the algorithms curl supports, and
-save the uncompressed document. If this option is used and the server sends
-an unsupported encoding, curl will report an error.
+automatically decompress the content. Headers are not modified.
+
+If this option is used and the server sends an unsupported encoding, curl will
+report an error.
diff --git a/docs/cmdline-opts/config.d b/docs/cmdline-opts/config.d
index df3d39220..263467997 100644
--- a/docs/cmdline-opts/config.d
+++ b/docs/cmdline-opts/config.d
@@ -2,6 +2,7 @@ Long: config
Arg: <file>
Help: Read config from a file
Short: K
+Category: curl
---
Specify a text file to read curl arguments from. The command line arguments
@@ -34,13 +35,19 @@ When curl is invoked, it (unless --disable is used) checks for a default
config file and uses it if found. The default config file is checked for in
the following places in this order:
-1) curl tries to find the "home dir": It first checks for the CURL_HOME and
-then the HOME environment variables. Failing that, it uses getpwuid() on
-Unix-like systems (which returns the home dir given the current user in your
-system). On Windows, it then checks for the APPDATA variable, or as a last
-resort the '%USERPROFILE%\\Application Data'.
+1) Use the CURL_HOME environment variable if set
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+2) Use the XDG_CONFIG_HOME environment variable if set (Added in 7.73.0)
+
+3) Use the HOME environment variable if set
+
+4) Non-windows: use getpwuid to find the home directory
+
+5) Windows: use APPDATA if set
+
+6) Windows: use "USERPROFILE\Application Data" if set
+
+7) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
diff --git a/docs/cmdline-opts/connect-timeout.d b/docs/cmdline-opts/connect-timeout.d
index 3a32d8685..fa3277221 100644
--- a/docs/cmdline-opts/connect-timeout.d
+++ b/docs/cmdline-opts/connect-timeout.d
@@ -2,6 +2,7 @@ Long: connect-timeout
Arg: <seconds>
Help: Maximum time allowed for connection
See-also: max-time
+Category: connection
---
Maximum time in seconds that you allow curl's connection to take. This only
limits the connection phase, so if curl connects within the given period it
diff --git a/docs/cmdline-opts/connect-to.d b/docs/cmdline-opts/connect-to.d
index 458bfe855..2f015f8ac 100644
--- a/docs/cmdline-opts/connect-to.d
+++ b/docs/cmdline-opts/connect-to.d
@@ -3,6 +3,7 @@ Arg: <HOST1:PORT1:HOST2:PORT2>
Help: Connect to host
Added: 7.49.0
See-also: resolve header
+Category: connection
---
For a request to the given HOST1:PORT1 pair, connect to HOST2:PORT2 instead.
diff --git a/docs/cmdline-opts/continue-at.d b/docs/cmdline-opts/continue-at.d
index 733f4941e..c44d2f496 100644
--- a/docs/cmdline-opts/continue-at.d
+++ b/docs/cmdline-opts/continue-at.d
@@ -3,6 +3,7 @@ Long: continue-at
Arg: <offset>
Help: Resumed transfer offset
See-also: range
+Category: connection
---
Continue/Resume a previous file transfer at the given offset. The given offset
is the exact number of bytes that will be skipped, counting from the beginning
diff --git a/docs/cmdline-opts/cookie-jar.d b/docs/cmdline-opts/cookie-jar.d
index da79777eb..f11991f4e 100644
--- a/docs/cmdline-opts/cookie-jar.d
+++ b/docs/cmdline-opts/cookie-jar.d
@@ -3,6 +3,7 @@ Long: cookie-jar
Arg: <filename>
Protocols: HTTP
Help: Write cookies to <filename> after operation
+Category: http
---
Specify to which file you want curl to write all cookies after a completed
operation. Curl writes all cookies from its in-memory cookie storage to the
diff --git a/docs/cmdline-opts/cookie.d b/docs/cmdline-opts/cookie.d
index 1e9906977..5d2c9d783 100644
--- a/docs/cmdline-opts/cookie.d
+++ b/docs/cmdline-opts/cookie.d
@@ -3,6 +3,7 @@ Long: cookie
Arg: <data|filename>
Protocols: HTTP
Help: Send cookies from string/file
+Category: http
---
Pass the data to the HTTP server in the Cookie header. It is supposedly
the data previously received from the server in a "Set-Cookie:" line. The
@@ -13,7 +14,7 @@ to read previously stored cookie from. This option also activates the cookie
engine which will make curl record incoming cookies, which may be handy if
you're using this in combination with the --location option or do multiple URL
transfers on the same invoke. If the file name is exactly a minus ("-"), curl
-will instead the contents from stdin.
+will instead read the contents from stdin.
The file format of the file to read cookies from should be plain HTTP headers
(Set-Cookie style) or the Netscape/Mozilla cookie file format.
diff --git a/docs/cmdline-opts/create-dirs.d b/docs/cmdline-opts/create-dirs.d
index 49e22e75a..48a8fd466 100644
--- a/docs/cmdline-opts/create-dirs.d
+++ b/docs/cmdline-opts/create-dirs.d
@@ -1,9 +1,12 @@
Long: create-dirs
Help: Create necessary local directory hierarchy
+Category: curl
---
When used in conjunction with the --output option, curl will create the
necessary local directory hierarchy as needed. This option creates the dirs
mentioned with the --output option, nothing else. If the --output file name
uses no dir or if the dirs it mentions already exist, no dir will be created.
+Created dirs are made with mode 0750 on unix style file systems.
+
To create remote directories when using FTP or SFTP, try --ftp-create-dirs.
diff --git a/docs/cmdline-opts/crlf.d b/docs/cmdline-opts/crlf.d
index f6694b654..50c4bef81 100644
--- a/docs/cmdline-opts/crlf.d
+++ b/docs/cmdline-opts/crlf.d
@@ -1,6 +1,7 @@
Long: crlf
Help: Convert LF to CRLF in upload
Protocols: FTP SMTP
+Category: ftp smtp
---
Convert LF to CRLF in upload. Useful for MVS (OS/390).
diff --git a/docs/cmdline-opts/crlfile.d b/docs/cmdline-opts/crlfile.d
index 0fcc63c85..360e668d1 100644
--- a/docs/cmdline-opts/crlfile.d
+++ b/docs/cmdline-opts/crlfile.d
@@ -3,6 +3,7 @@ Arg: <file>
Protocols: TLS
Help: Get a CRL list in PEM format from the given file
Added: 7.19.7
+Category: tls
---
Provide a file using PEM format with a Certificate Revocation List that may
specify peer certificates that are to be considered revoked.
diff --git a/docs/cmdline-opts/curves.d b/docs/cmdline-opts/curves.d
new file mode 100644
index 000000000..47870a278
--- /dev/null
+++ b/docs/cmdline-opts/curves.d
@@ -0,0 +1,18 @@
+Long: curves
+Arg: <algorithm list>
+Help: (EC) TLS key exchange algorithm(s) to request
+Protocols: TLS
+Added: 7.73.0
+Category: tls
+---
+Tells curl to request specific curves to use during SSL session establishment
+according to RFC 8422, 5.1. Multiple algorithms can be provided by separating
+them with ":" (e.g. "X25519:P-521"). The parameter is available identically
+in the "openssl s_client/s_server" utilities.
+
+--curves allows a OpenSSL powered curl to make SSL-connections with exactly
+the (EC) curve requested by the client, avoiding intransparent client/server
+negotiations.
+
+If this option is set, the default curves list built into openssl will be
+ignored.
diff --git a/docs/cmdline-opts/data-ascii.d b/docs/cmdline-opts/data-ascii.d
index bda4abc3d..3522f6345 100644
--- a/docs/cmdline-opts/data-ascii.d
+++ b/docs/cmdline-opts/data-ascii.d
@@ -2,5 +2,6 @@ Long: data-ascii
Arg: <data>
Help: HTTP POST ASCII data
Protocols: HTTP
+Category: http post upload
---
This is just an alias for --data.
diff --git a/docs/cmdline-opts/data-binary.d b/docs/cmdline-opts/data-binary.d
index 3f6ff2dbd..c40785ece 100644
--- a/docs/cmdline-opts/data-binary.d
+++ b/docs/cmdline-opts/data-binary.d
@@ -2,6 +2,7 @@ Long: data-binary
Arg: <data>
Help: HTTP POST binary data
Protocols: HTTP
+Category: http post upload
---
This posts data exactly as specified with no extra processing whatsoever.
diff --git a/docs/cmdline-opts/data-raw.d b/docs/cmdline-opts/data-raw.d
index 7669b4abf..4db83aefa 100644
--- a/docs/cmdline-opts/data-raw.d
+++ b/docs/cmdline-opts/data-raw.d
@@ -4,6 +4,7 @@ Protocols: HTTP
Help: HTTP POST data, '@' allowed
Added: 7.43.0
See-also: data
+Category: http post upload
---
This posts data similarly to --data but without the special
interpretation of the @ character.
diff --git a/docs/cmdline-opts/data-urlencode.d b/docs/cmdline-opts/data-urlencode.d
index 9873f3356..2f2a3645b 100644
--- a/docs/cmdline-opts/data-urlencode.d
+++ b/docs/cmdline-opts/data-urlencode.d
@@ -4,6 +4,7 @@ Help: HTTP POST data url encoded
Protocols: HTTP
See-also: data data-raw
Added: 7.18.0
+Category: http post upload
---
This posts data, similar to the other --data options with the exception
that this performs URL-encoding.
diff --git a/docs/cmdline-opts/data.d b/docs/cmdline-opts/data.d
index d18312aaa..53ba86b36 100644
--- a/docs/cmdline-opts/data.d
+++ b/docs/cmdline-opts/data.d
@@ -2,9 +2,10 @@ Long: data
Short: d
Arg: <data>
Help: HTTP POST data
-Protocols: HTTP
+Protocols: HTTP MQTT
See-also: data-binary data-urlencode data-raw
Mutexed: form head upload-file
+Category: important http post upload
---
Sends the specified data in a POST request to the HTTP server, in the same way
that a browser does when a user has filled in an HTML form and presses the
@@ -22,9 +23,8 @@ data pieces specified will be merged together with a separating
chunk that looks like \&'name=daniel&skill=lousy'.
If you start the data with the letter @, the rest should be a file name to
-read the data from, or - if you want curl to read the data from
-stdin. Multiple files can also be specified. Posting data from a file named
-\&'foobar' would thus be done with --data @foobar. When --data is told to read
-from a file like that, carriage returns and newlines will be stripped out. If
-you don't want the @ character to have a special interpretation use --data-raw
-instead.
+read the data from, or - if you want curl to read the data from stdin. Posting
+data from a file named \&'foobar' would thus be done with --data @foobar. When
+--data is told to read from a file like that, carriage returns and newlines
+will be stripped out. If you don't want the @ character to have a special
+interpretation use --data-raw instead.
diff --git a/docs/cmdline-opts/delegation.d b/docs/cmdline-opts/delegation.d
index 138d82333..fa2795f96 100644
--- a/docs/cmdline-opts/delegation.d
+++ b/docs/cmdline-opts/delegation.d
@@ -2,6 +2,7 @@ Long: delegation
Arg: <LEVEL>
Help: GSS-API delegation permission
Protocols: GSS/kerberos
+Category: auth
---
Set LEVEL to tell the server what it is allowed to delegate when it
comes to user credentials.
diff --git a/docs/cmdline-opts/digest.d b/docs/cmdline-opts/digest.d
index 5cdd9258a..da8c01e26 100644
--- a/docs/cmdline-opts/digest.d
+++ b/docs/cmdline-opts/digest.d
@@ -3,6 +3,7 @@ Help: Use HTTP Digest Authentication
Protocols: HTTP
Mutexed: basic ntlm negotiate
See-also: user proxy-digest anyauth
+Category: proxy auth http
---
Enables HTTP Digest authentication. This is an authentication scheme that
prevents the password from being sent over the wire in clear text. Use this in
diff --git a/docs/cmdline-opts/disable-eprt.d b/docs/cmdline-opts/disable-eprt.d
index a1e53c0bd..ffcf684e4 100644
--- a/docs/cmdline-opts/disable-eprt.d
+++ b/docs/cmdline-opts/disable-eprt.d
@@ -1,6 +1,7 @@
Long: disable-eprt
Help: Inhibit using EPRT or LPRT
Protocols: FTP
+Category: ftp
---
Tell curl to disable the use of the EPRT and LPRT commands when doing active
FTP transfers. Curl will normally always first attempt to use EPRT, then LPRT
diff --git a/docs/cmdline-opts/disable-epsv.d b/docs/cmdline-opts/disable-epsv.d
index 6d2cb7089..df1de8304 100644
--- a/docs/cmdline-opts/disable-epsv.d
+++ b/docs/cmdline-opts/disable-epsv.d
@@ -1,6 +1,7 @@
Long: disable-epsv
Help: Inhibit using EPSV
Protocols: FTP
+Category: ftp
---
(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP
transfers. Curl will normally always first attempt to use EPSV before PASV,
diff --git a/docs/cmdline-opts/disable.d b/docs/cmdline-opts/disable.d
index 20b27b4c5..688fc0c54 100644
--- a/docs/cmdline-opts/disable.d
+++ b/docs/cmdline-opts/disable.d
@@ -1,6 +1,7 @@
Long: disable
Short: q
Help: Disable .curlrc
+Category: curl
---
If used as the first parameter on the command line, the \fIcurlrc\fP config
file will not be read and used. See the --config for details on the default
diff --git a/docs/cmdline-opts/disallow-username-in-url.d b/docs/cmdline-opts/disallow-username-in-url.d
index a7f46ea15..e124f675a 100644
--- a/docs/cmdline-opts/disallow-username-in-url.d
+++ b/docs/cmdline-opts/disallow-username-in-url.d
@@ -3,5 +3,6 @@ Help: Disallow username in url
Protocols: HTTP
Added: 7.61.0
See-also: proto
+Category: curl http
---
This tells curl to exit if passed a url containing a username.
diff --git a/docs/cmdline-opts/dns-interface.d b/docs/cmdline-opts/dns-interface.d
index 45e5af263..3cb818ae3 100644
--- a/docs/cmdline-opts/dns-interface.d
+++ b/docs/cmdline-opts/dns-interface.d
@@ -5,6 +5,7 @@ Protocols: DNS
See-also: dns-ipv4-addr dns-ipv6-addr
Added: 7.33.0
Requires: c-ares
+Category: dns
---
Tell curl to send outgoing DNS requests through <interface>. This option is a
counterpart to --interface (which does not affect DNS). The supplied string
diff --git a/docs/cmdline-opts/dns-ipv4-addr.d b/docs/cmdline-opts/dns-ipv4-addr.d
index 597b85884..5ebdda5ca 100644
--- a/docs/cmdline-opts/dns-ipv4-addr.d
+++ b/docs/cmdline-opts/dns-ipv4-addr.d
@@ -5,6 +5,7 @@ Protocols: DNS
See-also: dns-interface dns-ipv6-addr
Added: 7.33.0
Requires: c-ares
+Category: dns
---
Tell curl to bind to <ip-address> when making IPv4 DNS requests, so that
the DNS requests originate from this address. The argument should be a
diff --git a/docs/cmdline-opts/dns-ipv6-addr.d b/docs/cmdline-opts/dns-ipv6-addr.d
index 581f01953..10e807646 100644
--- a/docs/cmdline-opts/dns-ipv6-addr.d
+++ b/docs/cmdline-opts/dns-ipv6-addr.d
@@ -5,6 +5,7 @@ Protocols: DNS
See-also: dns-interface dns-ipv4-addr
Added: 7.33.0
Requires: c-ares
+Category: dns
---
Tell curl to bind to <ip-address> when making IPv6 DNS requests, so that
the DNS requests originate from this address. The argument should be a
diff --git a/docs/cmdline-opts/dns-servers.d b/docs/cmdline-opts/dns-servers.d
index a98fd07d8..8665426a8 100644
--- a/docs/cmdline-opts/dns-servers.d
+++ b/docs/cmdline-opts/dns-servers.d
@@ -3,6 +3,7 @@ Arg: <addresses>
Help: DNS server addrs to use
Requires: c-ares
Added: 7.33.0
+Category: dns
---
Set the list of DNS servers to be used instead of the system default.
The list of IP addresses should be separated with commas. Port numbers
diff --git a/docs/cmdline-opts/doh-url.d b/docs/cmdline-opts/doh-url.d
index c871c4d22..7fce4460d 100644
--- a/docs/cmdline-opts/doh-url.d
+++ b/docs/cmdline-opts/doh-url.d
@@ -3,6 +3,7 @@ Arg: <URL>
Help: Resolve host names over DOH
Protocols: all
Added: 7.62.0
+Category: dns
---
Specifies which DNS-over-HTTPS (DOH) server to use to resolve hostnames,
instead of using the default name resolver mechanism. The URL must be HTTPS.
diff --git a/docs/cmdline-opts/dump-header.d b/docs/cmdline-opts/dump-header.d
index 33c6674e8..8449dfe85 100644
--- a/docs/cmdline-opts/dump-header.d
+++ b/docs/cmdline-opts/dump-header.d
@@ -4,6 +4,7 @@ Arg: <filename>
Help: Write the received headers to <filename>
Protocols: HTTP FTP
See-also: output
+Category: http ftp
---
Write the received protocol headers to the specified file.
diff --git a/docs/cmdline-opts/egd-file.d b/docs/cmdline-opts/egd-file.d
index c22790f6a..05ede9ad1 100644
--- a/docs/cmdline-opts/egd-file.d
+++ b/docs/cmdline-opts/egd-file.d
@@ -3,6 +3,7 @@ Arg: <file>
Help: EGD socket path for random data
Protocols: TLS
See-also: random-file
+Category: tls
---
Specify the path name to the Entropy Gathering Daemon socket. The socket is
used to seed the random engine for SSL connections.
diff --git a/docs/cmdline-opts/engine.d b/docs/cmdline-opts/engine.d
index cde1a4773..9ed0cf1b0 100644
--- a/docs/cmdline-opts/engine.d
+++ b/docs/cmdline-opts/engine.d
@@ -2,6 +2,7 @@ Long: engine
Arg: <name>
Help: Crypto engine to use
Protocols: TLS
+Category: tls
---
Select the OpenSSL crypto engine to use for cipher operations. Use --engine
list to print a list of build-time supported engines. Note that not all (or
diff --git a/docs/cmdline-opts/etag-compare.d b/docs/cmdline-opts/etag-compare.d
new file mode 100644
index 000000000..cbf48ac5e
--- /dev/null
+++ b/docs/cmdline-opts/etag-compare.d
@@ -0,0 +1,19 @@
+Long: etag-compare
+Arg: <file>
+Help: Pass an ETag from a file as a custom header
+Protocols: HTTP
+Added: 7.68.0
+Category: http
+---
+This option makes a conditional HTTP request for the specific
+ETag read from the given file by sending a custom If-None-Match
+header using the extracted ETag.
+
+For correct results, make sure that specified file contains only a single
+line with a desired ETag. An empty file is parsed as an empty ETag.
+
+Use the option --etag-save to first save the ETag from a response, and
+then use this option to compare using the saved ETag in a subsequent request.
+
+\fCOMPARISON\fP: There are 2 types of comparison or ETags, Weak and Strong.
+This option expects, and uses a strong comparison.
diff --git a/docs/cmdline-opts/etag-save.d b/docs/cmdline-opts/etag-save.d
new file mode 100644
index 000000000..82e6dfa84
--- /dev/null
+++ b/docs/cmdline-opts/etag-save.d
@@ -0,0 +1,17 @@
+Long: etag-save
+Arg: <file>
+Help: Parse ETag from a request and save it to a file
+Protocols: HTTP
+Added: 7.68.0
+Category: http
+---
+This option saves an HTTP ETag to the specified file. Etag is
+usually part of headers returned by a request. When server sends an
+ETag, it must be enveloped by a double quote. This option extracts the
+ETag without the double quotes and saves it into the <file>.
+
+A server can send a week ETag which is prefixed by "W/". This identifier
+is not considered, and only relevant ETag between quotation marks is parsed.
+
+It an ETag wasn't send by the server or it cannot be parsed, and empty
+file is created.
diff --git a/docs/cmdline-opts/expect100-timeout.d b/docs/cmdline-opts/expect100-timeout.d
index c88f0b84f..431a529c2 100644
--- a/docs/cmdline-opts/expect100-timeout.d
+++ b/docs/cmdline-opts/expect100-timeout.d
@@ -4,6 +4,7 @@ Help: How long to wait for 100-continue
Protocols: HTTP
Added: 7.47.0
See-also: connect-timeout
+Category: http
---
Maximum time in seconds that you allow curl to wait for a 100-continue
response when curl emits an Expects: 100-continue header in its request. By
diff --git a/docs/cmdline-opts/fail-early.d b/docs/cmdline-opts/fail-early.d
index 375d4c919..3fbe238af 100644
--- a/docs/cmdline-opts/fail-early.d
+++ b/docs/cmdline-opts/fail-early.d
@@ -1,6 +1,7 @@
Long: fail-early
Help: Fail on first transfer error, do not continue
Added: 7.52.0
+Category: curl
---
Fail and exit on the first detected transfer error.
diff --git a/docs/cmdline-opts/fail.d b/docs/cmdline-opts/fail.d
index c46c571bf..7fc76fb6a 100644
--- a/docs/cmdline-opts/fail.d
+++ b/docs/cmdline-opts/fail.d
@@ -2,6 +2,7 @@ Long: fail
Short: f
Protocols: HTTP
Help: Fail silently (no output at all) on HTTP errors
+Category: important http
---
Fail silently (no output at all) on server errors. This is mostly done to
better enable scripts etc to better deal with failed attempts. In normal cases
diff --git a/docs/cmdline-opts/false-start.d b/docs/cmdline-opts/false-start.d
index 65a8afb8f..abeff0eb5 100644
--- a/docs/cmdline-opts/false-start.d
+++ b/docs/cmdline-opts/false-start.d
@@ -2,6 +2,7 @@ Long: false-start
Help: Enable TLS False Start
Protocols: TLS
Added: 7.42.0
+Category: tls
---
Tells curl to use false start during the TLS handshake. False start is a mode
where a TLS client will start sending application data before verifying the
diff --git a/docs/cmdline-opts/form-string.d b/docs/cmdline-opts/form-string.d
index 49d0d44ef..04d2578c5 100644
--- a/docs/cmdline-opts/form-string.d
+++ b/docs/cmdline-opts/form-string.d
@@ -3,6 +3,7 @@ Help: Specify multipart MIME data
Protocols: HTTP SMTP IMAP
Arg: <name=string>
See-also: form
+Category: http upload
---
Similar to --form except that the value string for the named parameter is used
literally. Leading \&'@' and \&'<' characters, and the \&';type=' string in
diff --git a/docs/cmdline-opts/form.d b/docs/cmdline-opts/form.d
index 0bbc3701f..3cd8dce75 100644
--- a/docs/cmdline-opts/form.d
+++ b/docs/cmdline-opts/form.d
@@ -4,6 +4,7 @@ Arg: <name=content>
Help: Specify multipart MIME data
Protocols: HTTP SMTP IMAP
Mutexed: data head upload-file
+Category: http upload
---
For HTTP protocol family, this lets curl emulate a filled-in form in which a
user has pressed the submit button. This causes curl to POST data using the
@@ -33,11 +34,11 @@ form-field to which the file portrait.jpg will be the input:
curl -F profile=@portrait.jpg https://example.com/upload.cgi
-Example: send a your name and shoe size in two text fields to the server:
+Example: send your name and shoe size in two text fields to the server:
curl -F name=John -F shoesize=11 https://example.com/
-Example: send a your essay in a text field to the server. Send it as a plain
+Example: send your essay in a text field to the server. Send it as a plain
text field, but get the contents for it from a local file:
curl -F "story=<hugefile.txt" https://example.com/
diff --git a/docs/cmdline-opts/ftp-account.d b/docs/cmdline-opts/ftp-account.d
index 013c4f37b..bc04ba047 100644
--- a/docs/cmdline-opts/ftp-account.d
+++ b/docs/cmdline-opts/ftp-account.d
@@ -3,6 +3,7 @@ Arg: <data>
Help: Account data string
Protocols: FTP
Added: 7.13.0
+Category: ftp auth
---
When an FTP server asks for "account data" after user name and password has
been provided, this data is sent off using the ACCT command.
diff --git a/docs/cmdline-opts/ftp-alternative-to-user.d b/docs/cmdline-opts/ftp-alternative-to-user.d
index 8982ba8b8..171484906 100644
--- a/docs/cmdline-opts/ftp-alternative-to-user.d
+++ b/docs/cmdline-opts/ftp-alternative-to-user.d
@@ -3,6 +3,7 @@ Arg: <command>
Help: String to replace USER [name]
Protocols: FTP
Added: 7.15.5
+Category: ftp
---
If authenticating with the USER and PASS commands fails, send this command.
When connecting to Tumbleweed's Secure Transport server over FTPS using a
diff --git a/docs/cmdline-opts/ftp-create-dirs.d b/docs/cmdline-opts/ftp-create-dirs.d
index ede57100d..5d9dfda46 100644
--- a/docs/cmdline-opts/ftp-create-dirs.d
+++ b/docs/cmdline-opts/ftp-create-dirs.d
@@ -2,6 +2,7 @@ Long: ftp-create-dirs
Protocols: FTP SFTP
Help: Create the remote dirs if not present
See-also: create-dirs
+Category: ftp sftp curl
---
When an FTP or SFTP URL/operation uses a path that doesn't currently exist on
the server, the standard behavior of curl is to fail. Using this option, curl
diff --git a/docs/cmdline-opts/ftp-method.d b/docs/cmdline-opts/ftp-method.d
index 95aa522e8..149340b82 100644
--- a/docs/cmdline-opts/ftp-method.d
+++ b/docs/cmdline-opts/ftp-method.d
@@ -3,6 +3,7 @@ Arg: <method>
Help: Control CWD usage
Protocols: FTP
Added: 7.15.1
+Category: ftp
---
Control what method curl should use to reach a file on an FTP(S)
server. The method argument should be one of the following alternatives:
diff --git a/docs/cmdline-opts/ftp-pasv.d b/docs/cmdline-opts/ftp-pasv.d
index 44103e21a..cbd548de3 100644
--- a/docs/cmdline-opts/ftp-pasv.d
+++ b/docs/cmdline-opts/ftp-pasv.d
@@ -3,6 +3,7 @@ Help: Use PASV/EPSV instead of PORT
Protocols: FTP
Added: 7.11.0
See-also: disable-epsv
+Category: ftp
---
Use passive mode for the data connection. Passive is the internal default
behavior, but using this option can be used to override a previous --ftp-port
diff --git a/docs/cmdline-opts/ftp-port.d b/docs/cmdline-opts/ftp-port.d
index e4b145608..9bb1d43f0 100644
--- a/docs/cmdline-opts/ftp-port.d
+++ b/docs/cmdline-opts/ftp-port.d
@@ -4,6 +4,7 @@ Help: Use PORT instead of PASV
Short: P
Protocols: FTP
See-also: ftp-pasv disable-eprt
+Category: ftp
---
Reverses the default initiator/listener roles when connecting with FTP. This
option makes curl use active mode. curl then tells the server to connect back
diff --git a/docs/cmdline-opts/ftp-pret.d b/docs/cmdline-opts/ftp-pret.d
index dac4c3531..e9c7d251a 100644
--- a/docs/cmdline-opts/ftp-pret.d
+++ b/docs/cmdline-opts/ftp-pret.d
@@ -2,6 +2,7 @@ Long: ftp-pret
Help: Send PRET before PASV
Protocols: FTP
Added: 7.20.0
+Category: ftp
---
Tell curl to send a PRET command before PASV (and EPSV). Certain FTP servers,
mainly drftpd, require this non-standard command for directory listings as
diff --git a/docs/cmdline-opts/ftp-skip-pasv-ip.d b/docs/cmdline-opts/ftp-skip-pasv-ip.d
index da6ab11fc..d6fd4589b 100644
--- a/docs/cmdline-opts/ftp-skip-pasv-ip.d
+++ b/docs/cmdline-opts/ftp-skip-pasv-ip.d
@@ -3,6 +3,7 @@ Help: Skip the IP address for PASV
Protocols: FTP
Added: 7.14.2
See-also: ftp-pasv
+Category: ftp
---
Tell curl to not use the IP address the server suggests in its response
to curl's PASV command when curl connects the data connection. Instead curl
diff --git a/docs/cmdline-opts/ftp-ssl-ccc-mode.d b/docs/cmdline-opts/ftp-ssl-ccc-mode.d
index be1029498..6289e544a 100644
--- a/docs/cmdline-opts/ftp-ssl-ccc-mode.d
+++ b/docs/cmdline-opts/ftp-ssl-ccc-mode.d
@@ -4,6 +4,7 @@ Help: Set CCC mode
Protocols: FTP
Added: 7.16.2
See-also: ftp-ssl-ccc
+Category: ftp tls
---
Sets the CCC mode. The passive mode will not initiate the shutdown, but
instead wait for the server to do it, and will not reply to the shutdown from
diff --git a/docs/cmdline-opts/ftp-ssl-ccc.d b/docs/cmdline-opts/ftp-ssl-ccc.d
index c6edc5b39..33cab4302 100644
--- a/docs/cmdline-opts/ftp-ssl-ccc.d
+++ b/docs/cmdline-opts/ftp-ssl-ccc.d
@@ -3,6 +3,7 @@ Help: Send CCC after authenticating
Protocols: FTP
See-also: ssl ftp-ssl-ccc-mode
Added: 7.16.1
+Category: ftp tls
---
Use CCC (Clear Command Channel) Shuts down the SSL/TLS layer after
authenticating. The rest of the control channel communication will be
diff --git a/docs/cmdline-opts/ftp-ssl-control.d b/docs/cmdline-opts/ftp-ssl-control.d
index 87a822531..5191353dd 100644
--- a/docs/cmdline-opts/ftp-ssl-control.d
+++ b/docs/cmdline-opts/ftp-ssl-control.d
@@ -2,6 +2,7 @@ Long: ftp-ssl-control
Help: Require SSL/TLS for FTP login, clear for transfer
Protocols: FTP
Added: 7.16.0
+Category: ftp tls
---
Require SSL/TLS for the FTP login, clear for transfer. Allows secure
authentication, but non-encrypted data transfers for efficiency. Fails the
diff --git a/docs/cmdline-opts/gen.pl b/docs/cmdline-opts/gen.pl
index a921298a6..3fec1646d 100755
--- a/docs/cmdline-opts/gen.pl
+++ b/docs/cmdline-opts/gen.pl
@@ -1,10 +1,31 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
=begin comment
This script generates the manpage.
-Example: gen.pl mainpage > curl.1
+Example: gen.pl <command> [files] > curl.1
Dev notes:
@@ -16,18 +37,13 @@ Unfortunately it seems some perls like msysgit can't handle a global input-only
=end comment
=cut
-my $some_dir=$ARGV[1] || ".";
-
-opendir(my $dh, $some_dir) || die "Can't opendir $some_dir: $!";
-my @s = grep { /\.d$/ && -f "$some_dir/$_" } readdir($dh);
-closedir $dh;
-
my %optshort;
my %optlong;
my %helplong;
my %arglong;
my %redirlong;
my %protolong;
+my %catlong;
# get the long name version, return the man page string
sub manpageify {
@@ -101,7 +117,7 @@ sub added {
sub single {
my ($f, $standalone)=@_;
- open(F, "<:crlf", "$some_dir/$f") ||
+ open(F, "<:crlf", "$f") ||
return 1;
my $short;
my $long;
@@ -111,6 +127,7 @@ sub single {
my $arg;
my $mutexed;
my $requires;
+ my $category;
my $seealso;
my $magic; # cmdline special option
while(<F>) {
@@ -144,6 +161,9 @@ sub single {
elsif(/^Requires: *(.*)/i) {
$requires=$1;
}
+ elsif(/^Category: *(.*)/i) {
+ $category=$1;
+ }
elsif(/^Help: *(.*)/i) {
;
}
@@ -151,6 +171,9 @@ sub single {
if(!$long) {
print STDERR "WARN: no 'Long:' in $f\n";
}
+ if(!$category) {
+ print STDERR "WARN: no 'Category:' in $f\n";
+ }
last;
}
else {
@@ -201,12 +224,24 @@ sub single {
if($seealso) {
my @m=split(/ /, $seealso);
my $mstr;
+ my $and = 0;
+ my $num = scalar(@m);
+ if($num > 2) {
+ # use commas up to this point
+ $and = $num - 1;
+ }
+ my $i = 0;
for my $k (@m) {
if(!$helplong{$k}) {
print STDERR "WARN: $f see-alsos a non-existing option: $k\n";
}
my $l = manpageify($k);
- $mstr .= sprintf "%s$l", $mstr?" and ":"";
+ my $sep = " and";
+ if($and && ($i < $and)) {
+ $sep = ",";
+ }
+ $mstr .= sprintf "%s$l", $mstr?"$sep ":"";
+ $i++;
}
push @foot, seealso($standalone, $mstr);
}
@@ -241,12 +276,13 @@ sub single {
sub getshortlong {
my ($f)=@_;
- open(F, "<:crlf", "$some_dir/$f");
+ open(F, "<:crlf", "$f");
my $short;
my $long;
my $help;
my $arg;
my $protocols;
+ my $category;
while(<F>) {
if(/^Short: (.)/i) {
$short=$1;
@@ -263,6 +299,9 @@ sub getshortlong {
elsif(/^Protocols: (.*)/i) {
$protocols=$1;
}
+ elsif(/^Category: (.*)/i) {
+ $category=$1;
+ }
elsif(/^---/) {
last;
}
@@ -276,18 +315,20 @@ sub getshortlong {
$helplong{$long}=$help;
$arglong{$long}=$arg;
$protolong{$long}=$protocols;
+ $catlong{$long}=$category;
}
}
sub indexoptions {
- foreach my $f (@s) {
- getshortlong($f);
- }
+ my (@files) = @_;
+ foreach my $f (@files) {
+ getshortlong($f);
+ }
}
sub header {
my ($f)=@_;
- open(F, "<:crlf", "$some_dir/$f");
+ open(F, "<:crlf", "$f");
my @d;
while(<F>) {
push @d, $_;
@@ -300,6 +341,8 @@ sub listhelp {
foreach my $f (sort keys %helplong) {
my $long = $f;
my $short = $optlong{$long};
+ my @categories = split ' ', $catlong{$long};
+ my $bitmask;
my $opt;
if(defined($short) && $long) {
@@ -308,7 +351,13 @@ sub listhelp {
elsif($long && !$short) {
$opt = " --$long";
}
-
+ for my $i (0 .. $#categories) {
+ $bitmask .= 'CURLHELP_' . uc $categories[$i];
+ # If not last element, append |
+ if($i < $#categories) {
+ $bitmask .= ' | ';
+ }
+ }
my $arg = $arglong{$long};
if($arg) {
$opt .= " $arg";
@@ -316,7 +365,7 @@ sub listhelp {
my $desc = $helplong{$f};
$desc =~ s/\"/\\\"/g; # escape double quotes
- my $line = sprintf " {\"%s\",\n \"%s\"},\n", $opt, $desc;
+ my $line = sprintf " {\"%s\",\n \"%s\",\n %s},\n", $opt, $desc, $bitmask;
if(length($opt) + length($desc) > 78) {
print STDERR "WARN: the --$long line is too long\n";
@@ -325,13 +374,35 @@ sub listhelp {
}
}
+sub listcats {
+ my %allcats;
+ foreach my $f (sort keys %helplong) {
+ my @categories = split ' ', $catlong{$f};
+ foreach (@categories) {
+ $allcats{$_} = undef;
+ }
+ }
+ my @categories;
+ foreach my $key (keys %allcats) {
+ push @categories, $key;
+ }
+ @categories = sort @categories;
+ unshift @categories, 'hidden';
+ for my $i (0..$#categories) {
+ print '#define ' . 'CURLHELP_' . uc($categories[$i]) . ' ' . "1u << " . $i . "u\n";
+ }
+}
+
sub mainpage {
+ my (@files) = @_;
# show the page header
header("page-header");
# output docs for all options
- foreach my $f (sort @s) {
- single($f, 0);
+ foreach my $f (sort @files) {
+ if(single($f, 0)) {
+ print STDERR "Can't read $f?\n";
+ }
}
header("page-footer");
@@ -358,33 +429,37 @@ sub showprotocols {
}
sub getargs {
- my $f;
- do {
- $f = shift @ARGV;
- if($f eq "mainpage") {
- mainpage();
- return;
- }
- elsif($f eq "listhelp") {
- listhelp();
- return;
- }
- elsif($f eq "single") {
- showonly(shift @ARGV);
- return;
- }
- elsif($f eq "protos") {
- showprotocols();
- return;
- }
- } while($f);
+ my ($f, @s) = @_;
+ if($f eq "mainpage") {
+ mainpage(@s);
+ return;
+ }
+ elsif($f eq "listhelp") {
+ listhelp();
+ return;
+ }
+ elsif($f eq "single") {
+ showonly($s[0]);
+ return;
+ }
+ elsif($f eq "protos") {
+ showprotocols();
+ return;
+ }
+ elsif($f eq "listcats") {
+ listcats();
+ return;
+ }
- print "Usage: gen.pl <mainpage/listhelp/single FILE/protos> [srcdir]\n";
+ print "Usage: gen.pl <mainpage/listhelp/single FILE/protos/listcats> [files]\n";
}
#------------------------------------------------------------------------
+my $cmd = shift @ARGV;
+my @files = @ARGV; # the rest are the files
+
# learn all existing options
-indexoptions();
+indexoptions(@files);
-getargs();
+getargs($cmd, @files);
diff --git a/docs/cmdline-opts/get.d b/docs/cmdline-opts/get.d
index be7cb25f0..d529bb4e0 100644
--- a/docs/cmdline-opts/get.d
+++ b/docs/cmdline-opts/get.d
@@ -1,6 +1,7 @@
Long: get
Short: G
Help: Put the post data in the URL and use GET
+Category: http upload
---
When used, this option will make all data specified with --data, --data-binary
or --data-urlencode to be used in an HTTP GET request instead of the POST
diff --git a/docs/cmdline-opts/globoff.d b/docs/cmdline-opts/globoff.d
index fff6516b6..4b5f30de9 100644
--- a/docs/cmdline-opts/globoff.d
+++ b/docs/cmdline-opts/globoff.d
@@ -1,6 +1,7 @@
Long: globoff
Short: g
Help: Disable URL sequences and ranges using {} and []
+Category: curl
---
This option switches off the "URL globbing parser". When you set this option,
you can specify URLs that contain the letters {}[] without having them being
diff --git a/docs/cmdline-opts/happy-eyeballs-timeout-ms.d b/docs/cmdline-opts/happy-eyeballs-timeout-ms.d
index ec9a8c228..ceff2a7df 100644
--- a/docs/cmdline-opts/happy-eyeballs-timeout-ms.d
+++ b/docs/cmdline-opts/happy-eyeballs-timeout-ms.d
@@ -1,7 +1,8 @@
Long: happy-eyeballs-timeout-ms
Arg: <milliseconds>
-Help: How long to wait in milliseconds for IPv6 before trying IPv4
+Help: Time for IPv6 before trying IPv4
Added: 7.59.0
+Category: connection
---
Happy eyeballs is an algorithm that attempts to connect to both IPv4 and IPv6
addresses for dual-stack hosts, preferring IPv6 first for the number of
diff --git a/docs/cmdline-opts/haproxy-protocol.d b/docs/cmdline-opts/haproxy-protocol.d
index cc41c9c44..835820465 100644
--- a/docs/cmdline-opts/haproxy-protocol.d
+++ b/docs/cmdline-opts/haproxy-protocol.d
@@ -2,6 +2,7 @@ Long: haproxy-protocol
Help: Send HAProxy PROXY protocol v1 header
Protocols: HTTP
Added: 7.60.0
+Category: http proxy
---
Send a HAProxy PROXY protocol v1 header at the beginning of the connection. This
is used by some load balancers and reverse proxies to indicate the client's
diff --git a/docs/cmdline-opts/head.d b/docs/cmdline-opts/head.d
index 350a100f6..6fe468511 100644
--- a/docs/cmdline-opts/head.d
+++ b/docs/cmdline-opts/head.d
@@ -2,6 +2,7 @@ Long: head
Short: I
Help: Show document info only
Protocols: HTTP FTP FILE
+Category: http ftp file
---
Fetch the headers only! HTTP-servers feature the command HEAD which this uses
to get nothing but the header of a document. When used on an FTP or FILE file,
diff --git a/docs/cmdline-opts/header.d b/docs/cmdline-opts/header.d
index d8292ed77..e84168996 100644
--- a/docs/cmdline-opts/header.d
+++ b/docs/cmdline-opts/header.d
@@ -3,6 +3,7 @@ Short: H
Arg: <header/@file>
Help: Pass custom header(s) to server
Protocols: HTTP
+Category: http
---
Extra header to include in the request when sending HTTP to a server. You may
specify any number of extra headers. Note that if you should add a custom
diff --git a/docs/cmdline-opts/help.d b/docs/cmdline-opts/help.d
index 64aa696d4..bf80b7818 100644
--- a/docs/cmdline-opts/help.d
+++ b/docs/cmdline-opts/help.d
@@ -1,6 +1,12 @@
Long: help
+Arg: <category>
Short: h
-Help: This help text
+Help: Get help for commands
+Category: important curl
---
-Usage help. This lists all current command line options with a short
-description.
+Usage help. This lists all commands of the <category>.
+If no arg was provided, curl will display the most important
+command line arguments and the list of categories.
+If the argument "all" was provided, curl will display all options available.
+If the argument "category" was provided, curl will display all categories and
+their meanings.
diff --git a/docs/cmdline-opts/hostpubmd5.d b/docs/cmdline-opts/hostpubmd5.d
index a85115803..c926ed8b5 100644
--- a/docs/cmdline-opts/hostpubmd5.d
+++ b/docs/cmdline-opts/hostpubmd5.d
@@ -3,6 +3,7 @@ Arg: <md5>
Help: Acceptable MD5 hash of the host public key
Protocols: SFTP SCP
Added: 7.17.1
+Category: sftp scp
---
Pass a string containing 32 hexadecimal digits. The string should
be the 128 bit MD5 checksum of the remote host's public key, curl will refuse
diff --git a/docs/cmdline-opts/http0.9.d b/docs/cmdline-opts/http0.9.d
index 7e783f696..954c22a17 100644
--- a/docs/cmdline-opts/http0.9.d
+++ b/docs/cmdline-opts/http0.9.d
@@ -3,6 +3,7 @@ Tags: Versions
Protocols: HTTP
Added:
Help: Allow HTTP 0.9 responses
+Category: http
---
Tells curl to be fine with HTTP version 0.9 response.
diff --git a/docs/cmdline-opts/http1.0.d b/docs/cmdline-opts/http1.0.d
index d9bbd76f0..a4059dbf0 100644
--- a/docs/cmdline-opts/http1.0.d
+++ b/docs/cmdline-opts/http1.0.d
@@ -5,6 +5,7 @@ Protocols: HTTP
Added:
Mutexed: http1.1 http2
Help: Use HTTP 1.0
+Category: http
---
Tells curl to use HTTP version 1.0 instead of using its internally preferred
HTTP version.
diff --git a/docs/cmdline-opts/http1.1.d b/docs/cmdline-opts/http1.1.d
index f1e6b5c3b..a71a40bab 100644
--- a/docs/cmdline-opts/http1.1.d
+++ b/docs/cmdline-opts/http1.1.d
@@ -4,5 +4,6 @@ Protocols: HTTP
Added: 7.33.0
Mutexed: http1.0 http2
Help: Use HTTP 1.1
+Category: http
---
Tells curl to use HTTP version 1.1.
diff --git a/docs/cmdline-opts/http2-prior-knowledge.d b/docs/cmdline-opts/http2-prior-knowledge.d
index f793f775d..ea2906edb 100644
--- a/docs/cmdline-opts/http2-prior-knowledge.d
+++ b/docs/cmdline-opts/http2-prior-knowledge.d
@@ -5,6 +5,7 @@ Added: 7.49.0
Mutexed: http1.1 http1.0 http2
Requires: HTTP/2
Help: Use HTTP 2 without HTTP/1.1 Upgrade
+Category: http
---
Tells curl to issue its non-TLS HTTP requests using HTTP/2 without HTTP/1.1
Upgrade. It requires prior knowledge that the server supports HTTP/2 straight
diff --git a/docs/cmdline-opts/http2.d b/docs/cmdline-opts/http2.d
index cf8f2988e..197515ee8 100644
--- a/docs/cmdline-opts/http2.d
+++ b/docs/cmdline-opts/http2.d
@@ -7,5 +7,6 @@ Requires: HTTP/2
See-also: no-alpn
Help: Use HTTP 2
See-also: http1.1 http3
+Category: http
---
Tells curl to use HTTP version 2.
diff --git a/docs/cmdline-opts/http3.d b/docs/cmdline-opts/http3.d
index ca85e3a64..478b662aa 100644
--- a/docs/cmdline-opts/http3.d
+++ b/docs/cmdline-opts/http3.d
@@ -6,9 +6,10 @@ Mutexed: http1.1 http1.0 http2 http2-prior-knowledge
Requires: HTTP/3
Help: Use HTTP v3
See-also: http1.1 http2
+Category: http
---
-WARNING: this option is experiemental. Do not use in production.
+WARNING: this option is experimental. Do not use in production.
Tells curl to use HTTP version 3 directly to the host and port number used in
the URL. A normal HTTP/3 transaction will be done to a host and then get
diff --git a/docs/cmdline-opts/ignore-content-length.d b/docs/cmdline-opts/ignore-content-length.d
index 53524f518..82ac5da09 100644
--- a/docs/cmdline-opts/ignore-content-length.d
+++ b/docs/cmdline-opts/ignore-content-length.d
@@ -1,6 +1,7 @@
Long: ignore-content-length
Help: Ignore the size of the remote resource
Protocols: FTP HTTP
+Category: http ftp
---
For HTTP, Ignore the Content-Length header. This is particularly useful for
servers running Apache 1.x, which will report incorrect Content-Length for
diff --git a/docs/cmdline-opts/include.d b/docs/cmdline-opts/include.d
index 9d282dd16..250d4accf 100644
--- a/docs/cmdline-opts/include.d
+++ b/docs/cmdline-opts/include.d
@@ -2,6 +2,7 @@ Long: include
Short: i
Help: Include protocol response headers in the output
See-also: verbose
+Category: important verbose
---
Include the HTTP response headers in the output. The HTTP response headers can
include things like server name, cookies, date of the document, HTTP version
diff --git a/docs/cmdline-opts/insecure.d b/docs/cmdline-opts/insecure.d
index 49b0a4322..35f4a2e0f 100644
--- a/docs/cmdline-opts/insecure.d
+++ b/docs/cmdline-opts/insecure.d
@@ -3,6 +3,7 @@ Short: k
Help: Allow insecure server connections when using SSL
Protocols: TLS
See-also: proxy-insecure cacert
+Category: tls
---
By default, every SSL connection curl makes is verified to be secure. This
diff --git a/docs/cmdline-opts/interface.d b/docs/cmdline-opts/interface.d
index 65827fb8b..196e7efa3 100644
--- a/docs/cmdline-opts/interface.d
+++ b/docs/cmdline-opts/interface.d
@@ -2,6 +2,7 @@ Long: interface
Arg: <name>
Help: Use network INTERFACE (or address)
See-also: dns-interface
+Category: connection
---
Perform an operation using a specified interface. You can enter interface
diff --git a/docs/cmdline-opts/ipv4.d b/docs/cmdline-opts/ipv4.d
index 9c40c8c3e..a6691376a 100644
--- a/docs/cmdline-opts/ipv4.d
+++ b/docs/cmdline-opts/ipv4.d
@@ -7,6 +7,7 @@ Mutexed: ipv6
Requires:
See-also: http1.1 http2
Help: Resolve names to IPv4 addresses
+Category: connection dns
---
This option tells curl to resolve names to IPv4 addresses only, and not for
example try IPv6.
diff --git a/docs/cmdline-opts/ipv6.d b/docs/cmdline-opts/ipv6.d
index 6eef6dd03..ce0415caa 100644
--- a/docs/cmdline-opts/ipv6.d
+++ b/docs/cmdline-opts/ipv6.d
@@ -7,6 +7,7 @@ Mutexed: ipv4
Requires:
See-also: http1.1 http2
Help: Resolve names to IPv6 addresses
+Category: connection dns
---
This option tells curl to resolve names to IPv6 addresses only, and not for
example try IPv4.
diff --git a/docs/cmdline-opts/junk-session-cookies.d b/docs/cmdline-opts/junk-session-cookies.d
index 40ccd9c2d..993b77fa8 100644
--- a/docs/cmdline-opts/junk-session-cookies.d
+++ b/docs/cmdline-opts/junk-session-cookies.d
@@ -3,6 +3,7 @@ Short: j
Help: Ignore session cookies read from file
Protocols: HTTP
See-also: cookie cookie-jar
+Category: http
---
When curl is told to read cookies from a given file, this option will make it
discard all "session cookies". This will basically have the same effect as if
diff --git a/docs/cmdline-opts/keepalive-time.d b/docs/cmdline-opts/keepalive-time.d
index c816e13ff..41261535c 100644
--- a/docs/cmdline-opts/keepalive-time.d
+++ b/docs/cmdline-opts/keepalive-time.d
@@ -2,6 +2,7 @@ Long: keepalive-time
Arg: <seconds>
Help: Interval time for keepalive probes
Added: 7.18.0
+Category: connection
---
This option sets the time a connection needs to remain idle before sending
keepalive probes and the time between individual keepalive probes. It is
diff --git a/docs/cmdline-opts/key-type.d b/docs/cmdline-opts/key-type.d
index bf39bcd35..50a068676 100644
--- a/docs/cmdline-opts/key-type.d
+++ b/docs/cmdline-opts/key-type.d
@@ -2,6 +2,7 @@ Long: key-type
Arg: <type>
Help: Private key file type (DER/PEM/ENG)
Protocols: TLS
+Category: tls
---
Private key file type. Specify which type your --key provided private key
is. DER, PEM, and ENG are supported. If not specified, PEM is assumed.
diff --git a/docs/cmdline-opts/key.d b/docs/cmdline-opts/key.d
index 855e2f7b6..a762e6faf 100644
--- a/docs/cmdline-opts/key.d
+++ b/docs/cmdline-opts/key.d
@@ -2,6 +2,7 @@ Long: key
Arg: <key>
Protocols: TLS SSH
Help: Private key file name
+Category: tls ssh
---
Private key file name. Allows you to provide your private key in this separate
file. For SSH, if not specified, curl tries the following candidates in order:
diff --git a/docs/cmdline-opts/krb.d b/docs/cmdline-opts/krb.d
index 19547af08..7759cfb04 100644
--- a/docs/cmdline-opts/krb.d
+++ b/docs/cmdline-opts/krb.d
@@ -3,6 +3,7 @@ Arg: <level>
Help: Enable Kerberos with security <level>
Protocols: FTP
Requires: Kerberos
+Category: ftp
---
Enable Kerberos authentication and use. The level must be entered and should
be one of 'clear', 'safe', 'confidential', or 'private'. Should you use a
diff --git a/docs/cmdline-opts/libcurl.d b/docs/cmdline-opts/libcurl.d
index ef132fe74..eb9850c68 100644
--- a/docs/cmdline-opts/libcurl.d
+++ b/docs/cmdline-opts/libcurl.d
@@ -2,6 +2,7 @@ Long: libcurl
Arg: <file>
Help: Dump libcurl equivalent code of this command line
Added: 7.16.1
+Category: curl
---
Append this option to any ordinary curl command line, and you will get a
libcurl-using C source code written to the file that does the equivalent
diff --git a/docs/cmdline-opts/limit-rate.d b/docs/cmdline-opts/limit-rate.d
index 06c456e3e..cb3a86077 100644
--- a/docs/cmdline-opts/limit-rate.d
+++ b/docs/cmdline-opts/limit-rate.d
@@ -1,6 +1,7 @@
Long: limit-rate
Arg: <speed>
Help: Limit transfer speed to RATE
+Category: connection
---
Specify the maximum transfer rate you want curl to use - for both downloads
and uploads. This feature is useful if you have a limited pipe and you'd like
diff --git a/docs/cmdline-opts/list-only.d b/docs/cmdline-opts/list-only.d
index 4c56304a0..c69885801 100644
--- a/docs/cmdline-opts/list-only.d
+++ b/docs/cmdline-opts/list-only.d
@@ -2,7 +2,8 @@ Long: list-only
Short: l
Protocols: FTP POP3
Help: List only mode
-Added: 7.21.5
+Added: 4.0
+Category: ftp pop3
---
(FTP)
When listing an FTP directory, this switch forces a name-only view. This is
diff --git a/docs/cmdline-opts/local-port.d b/docs/cmdline-opts/local-port.d
index d96b46eb8..3f7a0e024 100644
--- a/docs/cmdline-opts/local-port.d
+++ b/docs/cmdline-opts/local-port.d
@@ -2,6 +2,7 @@ Long: local-port
Arg: <num/range>
Help: Force use of RANGE for local port numbers
Added: 7.15.2
+Category: connection
---
Set a preferred single number or range (FROM-TO) of local port numbers to use
for the connection(s). Note that port numbers by nature are a scarce resource
diff --git a/docs/cmdline-opts/location-trusted.d b/docs/cmdline-opts/location-trusted.d
index 995a8718a..f01d842bc 100644
--- a/docs/cmdline-opts/location-trusted.d
+++ b/docs/cmdline-opts/location-trusted.d
@@ -2,6 +2,7 @@ Long: location-trusted
Help: Like --location, and send auth to other hosts
Protocols: HTTP
See-also: user
+Category: http auth
---
Like --location, but will allow sending the name + password to all hosts that
the site may redirect to. This may or may not introduce a security breach if
diff --git a/docs/cmdline-opts/location.d b/docs/cmdline-opts/location.d
index 7c70e6981..c70b2eba8 100644
--- a/docs/cmdline-opts/location.d
+++ b/docs/cmdline-opts/location.d
@@ -2,6 +2,7 @@ Long: location
Short: L
Help: Follow redirects
Protocols: HTTP
+Category: http
---
If the server reports that the requested page has moved to a different
location (indicated with a Location: header and a 3XX response code), this
@@ -13,11 +14,13 @@ intercept the user+password. See also --location-trusted on how to change
this. You can limit the amount of redirects to follow by using the
--max-redirs option.
-When curl follows a redirect and the request is not a plain GET (for example
-POST or PUT), it will do the following request with a GET if the HTTP response
-was 301, 302, or 303. If the response code was any other 3xx code, curl will
-re-send the following request using the same unmodified method.
+When curl follows a redirect and if the request is a POST, it will do the
+following request with a GET if the HTTP response was 301, 302, or 303. If the
+response code was any other 3xx code, curl will re-send the following request
+using the same unmodified method.
-You can tell curl to not change the non-GET request method to GET after a 30x
-response by using the dedicated options for that: --post301, --post302 and
---post303.
+You can tell curl to not change POST requests to GET after a 30x response by
+using the dedicated options for that: --post301, --post302 and --post303.
+
+The method set with --request overrides the method curl would otherwise select
+to use.
diff --git a/docs/cmdline-opts/login-options.d b/docs/cmdline-opts/login-options.d
index 8bad0511d..887d5d517 100644
--- a/docs/cmdline-opts/login-options.d
+++ b/docs/cmdline-opts/login-options.d
@@ -3,6 +3,7 @@ Arg: <options>
Protocols: IMAP POP3 SMTP
Help: Server login options
Added: 7.34.0
+Category: imap pop3 smtp auth
---
Specify the login options to use during server authentication.
diff --git a/docs/cmdline-opts/mail-auth.d b/docs/cmdline-opts/mail-auth.d
index 70cf0eda4..529997161 100644
--- a/docs/cmdline-opts/mail-auth.d
+++ b/docs/cmdline-opts/mail-auth.d
@@ -4,6 +4,7 @@ Protocols: SMTP
Help: Originator address of the original email
Added: 7.25.0
See-also: mail-rcpt mail-from
+Category: smtp
---
Specify a single address. This will be used to specify the authentication
address (identity) of a submitted message that is being relayed to another
diff --git a/docs/cmdline-opts/mail-from.d b/docs/cmdline-opts/mail-from.d
index 1d932344c..faf48e2a4 100644
--- a/docs/cmdline-opts/mail-from.d
+++ b/docs/cmdline-opts/mail-from.d
@@ -4,5 +4,6 @@ Help: Mail from this address
Protocols: SMTP
Added: 7.20.0
See-also: mail-rcpt mail-auth
+Category: smtp
---
Specify a single address that the given mail should get sent from.
diff --git a/docs/cmdline-opts/mail-rcpt-allowfails.d b/docs/cmdline-opts/mail-rcpt-allowfails.d
new file mode 100644
index 000000000..76457c32e
--- /dev/null
+++ b/docs/cmdline-opts/mail-rcpt-allowfails.d
@@ -0,0 +1,16 @@
+Long: mail-rcpt-allowfails
+Help: Allow RCPT TO command to fail for some recipients
+Protocols: SMTP
+Added: 7.69.0
+Category: smtp
+---
+When sending data to multiple recipients, by default curl will abort SMTP
+conversation if at least one of the recipients causes RCPT TO command to
+return an error.
+
+The default behavior can be changed by passing --mail-rcpt-allowfails
+command-line option which will make curl ignore errors and proceed with the
+remaining valid recipients.
+
+In case when all recipients cause RCPT TO command to fail, curl will abort SMTP
+conversation and return the error received from to the last RCPT TO command. \ No newline at end of file
diff --git a/docs/cmdline-opts/mail-rcpt.d b/docs/cmdline-opts/mail-rcpt.d
index 0a2859b68..d8ae046ee 100644
--- a/docs/cmdline-opts/mail-rcpt.d
+++ b/docs/cmdline-opts/mail-rcpt.d
@@ -3,6 +3,7 @@ Arg: <address>
Help: Mail to this address
Protocols: SMTP
Added: 7.20.0
+Category: smtp
---
Specify a single address, user name or mailing list name. Repeat this
option several times to send to multiple recipients.
diff --git a/docs/cmdline-opts/manual.d b/docs/cmdline-opts/manual.d
index a9dbb0c78..25ed08dd2 100644
--- a/docs/cmdline-opts/manual.d
+++ b/docs/cmdline-opts/manual.d
@@ -1,5 +1,6 @@
Long: manual
Short: M
Help: Display the full manual
+Category: curl
---
Manual. Display the huge help text.
diff --git a/docs/cmdline-opts/max-filesize.d b/docs/cmdline-opts/max-filesize.d
index 50d5266e1..1f6bdc663 100644
--- a/docs/cmdline-opts/max-filesize.d
+++ b/docs/cmdline-opts/max-filesize.d
@@ -2,6 +2,7 @@ Long: max-filesize
Arg: <bytes>
Help: Maximum file size to download
See-also: limit-rate
+Category: connection
---
Specify the maximum size (in bytes) of a file to download. If the file
requested is larger than this value, the transfer will not start and curl will
diff --git a/docs/cmdline-opts/max-redirs.d b/docs/cmdline-opts/max-redirs.d
index a97860a8b..ba16c43fc 100644
--- a/docs/cmdline-opts/max-redirs.d
+++ b/docs/cmdline-opts/max-redirs.d
@@ -2,6 +2,7 @@ Long: max-redirs
Arg: <num>
Help: Maximum number of redirects allowed
Protocols: HTTP
+Category: http
---
Set maximum number of redirection-followings allowed. When --location is used,
is used to prevent curl from following redirections too much. By default, the
diff --git a/docs/cmdline-opts/max-time.d b/docs/cmdline-opts/max-time.d
index 0057f9d04..c4e4ed7eb 100644
--- a/docs/cmdline-opts/max-time.d
+++ b/docs/cmdline-opts/max-time.d
@@ -3,6 +3,7 @@ Short: m
Arg: <seconds>
Help: Maximum time allowed for the transfer
See-also: connect-timeout
+Category: connection
---
Maximum time in seconds that you allow the whole operation to take. This is
useful for preventing your batch jobs from hanging for hours due to slow
diff --git a/docs/cmdline-opts/metalink.d b/docs/cmdline-opts/metalink.d
index 81fc8bc78..883766439 100644
--- a/docs/cmdline-opts/metalink.d
+++ b/docs/cmdline-opts/metalink.d
@@ -2,6 +2,7 @@ Long: metalink
Help: Process given URLs as metalink XML file
Added: 7.27.0
Requires: metalink
+Category: misc
---
This option can tell curl to parse and process a given URI as Metalink file
(both version 3 and 4 (RFC 5854) are supported) and make use of the mirrors
diff --git a/docs/cmdline-opts/negotiate.d b/docs/cmdline-opts/negotiate.d
index 69a6b9170..e247bfbee 100644
--- a/docs/cmdline-opts/negotiate.d
+++ b/docs/cmdline-opts/negotiate.d
@@ -2,6 +2,7 @@ Long: negotiate
Help: Use HTTP Negotiate (SPNEGO) authentication
Protocols: HTTP
See-also: basic ntlm anyauth proxy-negotiate
+Category: auth http
---
Enables Negotiate (SPNEGO) authentication.
diff --git a/docs/cmdline-opts/netrc-file.d b/docs/cmdline-opts/netrc-file.d
index 50126d255..95fb2654a 100644
--- a/docs/cmdline-opts/netrc-file.d
+++ b/docs/cmdline-opts/netrc-file.d
@@ -3,6 +3,7 @@ Help: Specify FILE for netrc
Arg: <filename>
Added: 7.21.5
Mutexed: netrc
+Category: curl
---
This option is similar to --netrc, except that you provide the path (absolute
or relative) to the netrc file that curl should use. You can only specify one
diff --git a/docs/cmdline-opts/netrc-optional.d b/docs/cmdline-opts/netrc-optional.d
index c28540309..fa92032bd 100644
--- a/docs/cmdline-opts/netrc-optional.d
+++ b/docs/cmdline-opts/netrc-optional.d
@@ -2,6 +2,7 @@ Long: netrc-optional
Help: Use either .netrc or URL
Mutexed: netrc
See-also: netrc-file
+Category: curl
---
Very similar to --netrc, but this option makes the .netrc usage \fBoptional\fP
and not mandatory as the --netrc option does.
diff --git a/docs/cmdline-opts/netrc.d b/docs/cmdline-opts/netrc.d
index 2df26782c..6aac568a6 100644
--- a/docs/cmdline-opts/netrc.d
+++ b/docs/cmdline-opts/netrc.d
@@ -1,6 +1,7 @@
Long: netrc
Short: n
Help: Must read .netrc for user name and password
+Category: curl
---
Makes curl scan the \fI.netrc\fP (\fI_netrc\fP on Windows) file in the user's
home directory for login name and password. This is typically used for FTP on
diff --git a/docs/cmdline-opts/next.d b/docs/cmdline-opts/next.d
index 1d1e70a35..1adcc7535 100644
--- a/docs/cmdline-opts/next.d
+++ b/docs/cmdline-opts/next.d
@@ -5,6 +5,7 @@ Protocols:
Added: 7.36.0
Magic: divider
Help: Make next URL use its separate set of options
+Category: curl
---
Tells curl to use a separate operation for the following URL and associated
options. This allows you to send several URL requests, each with their own
diff --git a/docs/cmdline-opts/no-alpn.d b/docs/cmdline-opts/no-alpn.d
index 88abb8368..8031b4f07 100644
--- a/docs/cmdline-opts/no-alpn.d
+++ b/docs/cmdline-opts/no-alpn.d
@@ -5,6 +5,7 @@ Added: 7.36.0
See-also: no-npn http2
Requires: TLS
Help: Disable the ALPN TLS extension
+Category: tls http
---
Disable the ALPN TLS extension. ALPN is enabled by default if libcurl was built
with an SSL library that supports ALPN. ALPN is used by a libcurl that supports
diff --git a/docs/cmdline-opts/no-buffer.d b/docs/cmdline-opts/no-buffer.d
index 65a6282f6..1079f4712 100644
--- a/docs/cmdline-opts/no-buffer.d
+++ b/docs/cmdline-opts/no-buffer.d
@@ -1,6 +1,7 @@
Long: no-buffer
Short: N
Help: Disable buffering of the output stream
+Category: curl
---
Disables the buffering of the output stream. In normal work situations, curl
will use a standard buffered output stream that will have the effect that it
diff --git a/docs/cmdline-opts/no-keepalive.d b/docs/cmdline-opts/no-keepalive.d
index 8fb28a036..72f3bc9a5 100644
--- a/docs/cmdline-opts/no-keepalive.d
+++ b/docs/cmdline-opts/no-keepalive.d
@@ -1,5 +1,6 @@
Long: no-keepalive
Help: Disable TCP keepalive on the connection
+Category: connection
---
Disables the use of keepalive messages on the TCP connection. curl otherwise
enables them by default.
diff --git a/docs/cmdline-opts/no-npn.d b/docs/cmdline-opts/no-npn.d
index ab0f6de2e..27e5974bd 100644
--- a/docs/cmdline-opts/no-npn.d
+++ b/docs/cmdline-opts/no-npn.d
@@ -6,6 +6,7 @@ Mutexed:
See-also: no-alpn http2
Requires: TLS
Help: Disable the NPN TLS extension
+Category: tls http
---
Disable the NPN TLS extension. NPN is enabled by default if libcurl was built
with an SSL library that supports NPN. NPN is used by a libcurl that supports
diff --git a/docs/cmdline-opts/no-progress-meter.d b/docs/cmdline-opts/no-progress-meter.d
index aff0717d3..bf28d635d 100644
--- a/docs/cmdline-opts/no-progress-meter.d
+++ b/docs/cmdline-opts/no-progress-meter.d
@@ -2,6 +2,7 @@ Long: no-progress-meter
Help: Do not show the progress meter
See-also: verbose silent
Added: 7.67.0
+Category: verbose
---
Option to switch off the progress meter output without muting or otherwise
affecting warning and informational messages like --silent does.
diff --git a/docs/cmdline-opts/no-sessionid.d b/docs/cmdline-opts/no-sessionid.d
index 397a15869..013ca4cb4 100644
--- a/docs/cmdline-opts/no-sessionid.d
+++ b/docs/cmdline-opts/no-sessionid.d
@@ -2,6 +2,7 @@ Long: no-sessionid
Help: Disable SSL session-ID reusing
Protocols: TLS
Added: 7.16.0
+Category: tls
---
Disable curl's use of SSL session-ID caching. By default all transfers are
done using the cache. Note that while nothing should ever get hurt by
diff --git a/docs/cmdline-opts/noproxy.d b/docs/cmdline-opts/noproxy.d
index a216e75f4..12ce6d3ed 100644
--- a/docs/cmdline-opts/noproxy.d
+++ b/docs/cmdline-opts/noproxy.d
@@ -2,6 +2,7 @@ Long: noproxy
Arg: <no-proxy-list>
Help: List of hosts which do not use proxy
Added: 7.19.4
+Category: proxy
---
Comma-separated list of hosts which do not use a proxy, if one is specified.
The only wildcard is a single * character, which matches all hosts, and
diff --git a/docs/cmdline-opts/ntlm-wb.d b/docs/cmdline-opts/ntlm-wb.d
index 7b9338408..4a2f7e1e6 100644
--- a/docs/cmdline-opts/ntlm-wb.d
+++ b/docs/cmdline-opts/ntlm-wb.d
@@ -2,6 +2,7 @@ Long: ntlm-wb
Help: Use HTTP NTLM authentication with winbind
Protocols: HTTP
See-also: ntlm proxy-ntlm
+Category: auth http
---
Enables NTLM much in the style --ntlm does, but hand over the authentication
to the separate binary ntlmauth application that is executed when needed.
diff --git a/docs/cmdline-opts/ntlm.d b/docs/cmdline-opts/ntlm.d
index baaa1d534..c63c086eb 100644
--- a/docs/cmdline-opts/ntlm.d
+++ b/docs/cmdline-opts/ntlm.d
@@ -4,6 +4,7 @@ Mutexed: basic negotiate digest anyauth
See-also: proxy-ntlm
Protocols: HTTP
Requires: TLS
+Category: auth http
---
Enables NTLM authentication. The NTLM authentication method was designed by
Microsoft and is used by IIS web servers. It is a proprietary protocol,
diff --git a/docs/cmdline-opts/oauth2-bearer.d b/docs/cmdline-opts/oauth2-bearer.d
index 780716748..e0ea210ed 100644
--- a/docs/cmdline-opts/oauth2-bearer.d
+++ b/docs/cmdline-opts/oauth2-bearer.d
@@ -1,7 +1,8 @@
Long: oauth2-bearer
Help: OAuth 2 Bearer Token
Arg: <token>
-Protocols: IMAP POP3 SMTP
+Protocols: IMAP POP3 SMTP HTTP
+Category: auth
---
Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token
is used in conjunction with the user name which can be specified as part of
diff --git a/docs/cmdline-opts/output-dir.d b/docs/cmdline-opts/output-dir.d
new file mode 100644
index 000000000..d2ff7738e
--- /dev/null
+++ b/docs/cmdline-opts/output-dir.d
@@ -0,0 +1,19 @@
+Long: output-dir
+Arg: <dir>
+Help: Directory to save files in
+Added: 7.73.0
+See-also: remote-name remote-header-name
+Category: curl
+---
+
+This option specifies the directory in which files should be stored, when
+--remote-name or --output are used.
+
+The given output directory is used for all URLs and output options on the
+command line, up until the first --next.
+
+If the specified target directory doesn't exist, the operation will fail
+unless --create-dirs is also used.
+
+If this option is used multiple times, the last specified directory will be
+used.
diff --git a/docs/cmdline-opts/output.d b/docs/cmdline-opts/output.d
index 35f52a213..bf35bf4a0 100644
--- a/docs/cmdline-opts/output.d
+++ b/docs/cmdline-opts/output.d
@@ -3,17 +3,18 @@ Arg: <file>
Short: o
Help: Write to file instead of stdout
See-also: remote-name remote-name-all remote-header-name
+Category: important curl
---
Write output to <file> instead of stdout. If you are using {} or [] to fetch
-multiple documents, you can use '#' followed by a number in the <file>
-specifier. That variable will be replaced with the current string for the URL
-being fetched. Like in:
+multiple documents, you should quote the URL and you can use '#' followed by a
+number in the <file> specifier. That variable will be replaced with the current
+string for the URL being fetched. Like in:
- curl http://{one,two}.example.com -o "file_#1.txt"
+ curl "http://{one,two}.example.com" -o "file_#1.txt"
or use several variables like:
- curl http://{site,host}.host[1-5].com -o "#1_#2"
+ curl "http://{site,host}.host[1-5].com" -o "#1_#2"
You may use this option as many times as the number of URLs you have. For
example, if you specify two URLs on the same command line, you can use it like
diff --git a/docs/cmdline-opts/page-footer b/docs/cmdline-opts/page-footer
index defe7e8b2..479c712af 100644
--- a/docs/cmdline-opts/page-footer
+++ b/docs/cmdline-opts/page-footer
@@ -37,6 +37,26 @@ accesses the target URL through the proxy.
The list of host names can also be include numerical IP addresses, and IPv6
versions should then be given without enclosing brackets.
+IPv6 numerical addresses are compared as strings, so they will only match if
+the representations are the same: "::1" is the same as "::0:1" but they don't
+match.
+.IP "CURL_SSL_BACKEND <TLS backend>"
+If curl was built with support for "MultiSSL", meaning that it has built-in
+support for more than one TLS backend, this environment variable can be set to
+the case insensitive name of the particular backend to use when curl is
+invoked. Setting a name that isn't a built-in alternative, will make curl
+stay with the default.
+.IP "QLOGDIR <directory name>"
+If curl was built with HTTP/3 support, setting this environment variable to a
+local directory will make curl produce qlogs in that directory, using file
+names named after the destination connection id (in hex). Do note that these
+files can become rather large. Works with both QUIC backends.
+.IP "SSLKEYLOGFILE <file name>"
+If you set this environment variable to a file name, curl will store TLS
+secrets from its connections in that file when invoked to enable you to
+analyze the TLS traffic in real time using network analyzing tools such as
+Wireshark. This works with the following TLS backends: OpenSSL, libressl,
+BoringSSL, GnuTLS, NSS and wolfSSL.
.SH "PROXY PROTOCOL PREFIXES"
Since curl version 7.21.7, the proxy string may be specified with a
protocol:// prefix to specify alternative proxy protocols.
@@ -243,6 +263,16 @@ SSL public key does not matched pinned public key
Invalid SSL certificate status.
.IP 92
Stream error in HTTP/2 framing layer.
+.IP 93
+An API function was called from inside a callback.
+.IP 94
+An authentication function returned an error.
+.IP 95
+A problem was detected in the HTTP/3 layer. This is somewhat generic and can
+be one out of several problems, see the error message for details.
+.IP 96
+QUIC connection error. This error may be caused by an SSL library error. QUIC
+is the protocol used for HTTP/3 transfers.
.IP XX
More error codes will appear here in future releases. The existing ones
are meant to never change.
diff --git a/docs/cmdline-opts/page-header b/docs/cmdline-opts/page-header
index 51f45edad..a51e485ba 100644
--- a/docs/cmdline-opts/page-header
+++ b/docs/cmdline-opts/page-header
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -31,8 +31,9 @@ curl \- transfer a URL
.B curl
is a tool to transfer data from or to a server, using one of the supported
protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP,
-LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET
-and TFTP). The command is designed to work without user interaction.
+LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP,
+SMTPS, TELNET and TFTP). The command is designed to work without user
+interaction.
curl offers a busload of useful tricks like proxy support, user
authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer
@@ -46,22 +47,22 @@ The URL syntax is protocol-dependent. You'll find a detailed description in
RFC 3986.
You can specify multiple URLs or parts of URLs by writing part sets within
-braces as in:
+braces and quoting the URL as in:
- http://site.{one,two,three}.com
+ "http://site.{one,two,three}.com"
or you can get sequences of alphanumeric series by using [] as in:
- ftp://ftp.example.com/file[1-100].txt
+ "ftp://ftp.example.com/file[1-100].txt"
- ftp://ftp.example.com/file[001-100].txt (with leading zeros)
+ "ftp://ftp.example.com/file[001-100].txt" (with leading zeros)
- ftp://ftp.example.com/file[a-z].txt
+ "ftp://ftp.example.com/file[a-z].txt"
Nested sequences are not supported, but you can use several ones next to each
other:
- http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html
+ "http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html"
You can specify any amount of URLs on the command line. They will be fetched
in a sequential manner in the specified order. You can specify command line
@@ -70,9 +71,9 @@ options and URLs mixed and in any order on the command line.
You can specify a step counter for the ranges to get every Nth number or
letter:
- http://example.com/file[1-100:10].txt
+ "http://example.com/file[1-100:10].txt"
- http://example.com/file[a-z:2].txt
+ "http://example.com/file[a-z:2].txt"
When using [] or {} sequences when invoked from a command line prompt, you
probably have to put the full URL within double quotes to avoid the shell from
@@ -82,7 +83,7 @@ for example '&', '?' and '*'.
Provide the IPv6 zone index in the URL with an escaped percentage sign and the
interface name. Like in
- http://[fe80::3%25eth0]/
+ "http://[fe80::3%25eth0]/"
If you specify URL without protocol:// prefix, curl will attempt to guess what
protocol you might want. It will then default to HTTP but try other protocols
@@ -98,6 +99,55 @@ getting many files from the same server will not do multiple connects /
handshakes. This improves speed. Of course this is only done on files
specified on a single command line and cannot be used between separate curl
invokes.
+.SH PROTOCOLS
+curl supports numerous protocols, or put in URL terms: schemes. Your
+particular build may not support them all.
+.IP DICT
+Lets you lookup words using online dictionaries.
+.IP FILE
+Read or write local files. curl does not support accessing file:// URL
+remotely, but when running on Microsft Windows using the native UNC approach
+will work.
+.IP FTP(S)
+curl supports the File Transfer Protocol with a lot of tweaks and levers. With
+or without using TLS.
+.IP GOPHER
+Retrieve files.
+.IP HTTP(S)
+curl supports HTTP with numerous options and variations. It can speak HTTP
+version 0.9, 1.0, 1.1, 2 and 3 depending on build options and the correct
+command line options.
+.IP IMAP(S)
+Using the mail reading protocol, curl can "download" emails for you. With or
+without using TLS.
+.IP LDAP(S)
+curl can do directory lookups for you, with or without TLS.
+.IP MQTT
+curl supports MQTT version 3. Downloading over MQTT equals "subscribe" to a
+topic while uploading/posting equals "publish" on a topic. MQTT support is
+experimental and TLS based MQTT is not supported (yet).
+.IP POP3(S)
+Downloading from a pop3 server means getting a mail. With or without using
+TLS.
+.IP RTMP(S)
+The Realtime Messaging Protocol is primarily used to server streaming media
+and curl can download it.
+.IP RTSP
+curl supports RTSP 1.0 downloads.
+.IP SCP
+curl supports SSH version 2 scp transfers.
+.IP SFTP
+curl supports SFTP (draft 5) done over SSH version 2.
+.IP SMB(S)
+curl supports SMB version 1 for upload and download.
+.IP SMTP(S)
+Uploading contents to an SMTP server means sending an email. With or without
+TLS.
+.IP TELNET
+Telling curl to fetch a telnet URL starts an interactive session where it
+sends what it reads on stdin and outputs what the server sends it.
+.IP TFTP
+curl can do TFTP downloads and uploads.
.SH "PROGRESS METER"
curl normally displays a progress meter during operations, indicating the
amount of transferred data, transfer speeds and estimated time left, etc. The
diff --git a/docs/cmdline-opts/parallel-immediate.d b/docs/cmdline-opts/parallel-immediate.d
new file mode 100644
index 000000000..95c8afc42
--- /dev/null
+++ b/docs/cmdline-opts/parallel-immediate.d
@@ -0,0 +1,10 @@
+Long: parallel-immediate
+Help: Do not wait for multiplexing (with --parallel)
+Added: 7.68.0
+See-also: parallel parallel-max
+Category: connection curl
+---
+When doing parallel transfers, this option will instruct curl that it should
+rather prefer opening up more connections in parallel at once rather than
+waiting to see if new transfers can be added as multiplexed streams on another
+connection.
diff --git a/docs/cmdline-opts/parallel-max.d b/docs/cmdline-opts/parallel-max.d
index a8c79c743..d49aeb7a9 100644
--- a/docs/cmdline-opts/parallel-max.d
+++ b/docs/cmdline-opts/parallel-max.d
@@ -2,6 +2,7 @@ Long: parallel-max
Help: Maximum concurrency for parallel transfers
Added: 7.66.0
See-also: parallel
+Category: connection curl
---
When asked to do parallel transfers, using --parallel, this option controls
the maximum amount of transfers to do simultaneously.
diff --git a/docs/cmdline-opts/parallel.d b/docs/cmdline-opts/parallel.d
index fac84e624..d6b4affe3 100644
--- a/docs/cmdline-opts/parallel.d
+++ b/docs/cmdline-opts/parallel.d
@@ -2,6 +2,7 @@ Short: Z
Long: parallel
Help: Perform transfers in parallel
Added: 7.66.0
+Category: connection curl
---
Makes curl perform its transfers in parallel as compared to the regular serial
manner.
diff --git a/docs/cmdline-opts/pass.d b/docs/cmdline-opts/pass.d
index 2639cb9d0..f6633d242 100644
--- a/docs/cmdline-opts/pass.d
+++ b/docs/cmdline-opts/pass.d
@@ -2,6 +2,7 @@ Long: pass
Arg: <phrase>
Help: Pass phrase for the private key
Protocols: SSH TLS
+Category: ssh tls auth
---
Passphrase for the private key
diff --git a/docs/cmdline-opts/path-as-is.d b/docs/cmdline-opts/path-as-is.d
index 946e2f07a..0bfaf6639 100644
--- a/docs/cmdline-opts/path-as-is.d
+++ b/docs/cmdline-opts/path-as-is.d
@@ -1,6 +1,7 @@
Long: path-as-is
Help: Do not squash .. sequences in URL path
Added: 7.42.0
+Category: curl
---
Tell curl to not handle sequences of /../ or /./ in the given URL
path. Normally curl will squash or merge them according to standards but with
diff --git a/docs/cmdline-opts/pinnedpubkey.d b/docs/cmdline-opts/pinnedpubkey.d
index cd21911f8..617252c6c 100644
--- a/docs/cmdline-opts/pinnedpubkey.d
+++ b/docs/cmdline-opts/pinnedpubkey.d
@@ -2,6 +2,7 @@ Long: pinnedpubkey
Arg: <hashes>
Help: FILE/HASHES Public key to verify peer against
Protocols: TLS
+Category: tls
---
Tells curl to use the specified public key file (or hashes) to verify the
peer. This can be a path to a file which contains a single public key in PEM
diff --git a/docs/cmdline-opts/post301.d b/docs/cmdline-opts/post301.d
index 87a9fe7ed..9cc2ad018 100644
--- a/docs/cmdline-opts/post301.d
+++ b/docs/cmdline-opts/post301.d
@@ -3,6 +3,7 @@ Help: Do not switch to GET after following a 301
Protocols: HTTP
See-also: post302 post303 location
Added: 7.17.1
+Category: http post
---
Tells curl to respect RFC 7231/6.4.2 and not convert POST requests into GET
requests when following a 301 redirection. The non-RFC behaviour is ubiquitous
diff --git a/docs/cmdline-opts/post302.d b/docs/cmdline-opts/post302.d
index caf0d87f1..02749032f 100644
--- a/docs/cmdline-opts/post302.d
+++ b/docs/cmdline-opts/post302.d
@@ -3,6 +3,7 @@ Help: Do not switch to GET after following a 302
Protocols: HTTP
See-also: post301 post303 location
Added: 7.19.1
+Category: http post
---
Tells curl to respect RFC 7231/6.4.3 and not convert POST requests into GET
requests when following a 302 redirection. The non-RFC behaviour is ubiquitous
diff --git a/docs/cmdline-opts/post303.d b/docs/cmdline-opts/post303.d
index 44f39e610..1a67e13ef 100644
--- a/docs/cmdline-opts/post303.d
+++ b/docs/cmdline-opts/post303.d
@@ -3,6 +3,7 @@ Help: Do not switch to GET after following a 303
Protocols: HTTP
See-also: post302 post301 location
Added: 7.26.0
+Category: http post
---
Tells curl to violate RFC 7231/6.4.4 and not convert POST requests into GET
requests when following 303 redirections. A server may require a POST to
diff --git a/docs/cmdline-opts/preproxy.d b/docs/cmdline-opts/preproxy.d
index b8eb77fa4..a917c16ed 100644
--- a/docs/cmdline-opts/preproxy.d
+++ b/docs/cmdline-opts/preproxy.d
@@ -2,6 +2,7 @@ Long: preproxy
Arg: [protocol://]host[:port]
Help: Use this proxy first
Added: 7.52.0
+Category: proxy
---
Use the specified SOCKS proxy before connecting to an HTTP or HTTPS --proxy. In
such a case curl first connects to the SOCKS proxy and then connects (through
diff --git a/docs/cmdline-opts/progress-bar.d b/docs/cmdline-opts/progress-bar.d
index f27de2d93..299d5384a 100644
--- a/docs/cmdline-opts/progress-bar.d
+++ b/docs/cmdline-opts/progress-bar.d
@@ -1,6 +1,7 @@
Short: #
Long: progress-bar
Help: Display transfer progress as a bar
+Category: verbose
---
Make curl display transfer progress as a simple progress bar instead of the
standard, more informational, meter.
diff --git a/docs/cmdline-opts/proto-default.d b/docs/cmdline-opts/proto-default.d
index ccc3b85f3..1c2afea2c 100644
--- a/docs/cmdline-opts/proto-default.d
+++ b/docs/cmdline-opts/proto-default.d
@@ -2,6 +2,7 @@ Long: proto-default
Help: Use PROTOCOL for any URL missing a scheme
Arg: <protocol>
Added: 7.45.0
+Category: connection curl
---
Tells curl to use \fIprotocol\fP for any URL missing a scheme name.
diff --git a/docs/cmdline-opts/proto-redir.d b/docs/cmdline-opts/proto-redir.d
index a1205dd03..9a096f531 100644
--- a/docs/cmdline-opts/proto-redir.d
+++ b/docs/cmdline-opts/proto-redir.d
@@ -2,6 +2,7 @@ Long: proto-redir
Arg: <protocols>
Help: Enable/disable PROTOCOLS on redirect
Added: 7.20.2
+Category: connection curl
---
Tells curl to limit what protocols it may use on redirect. Protocols denied by
--proto are not overridden by this option. See --proto for how protocols are
diff --git a/docs/cmdline-opts/proto.d b/docs/cmdline-opts/proto.d
index e1ece1788..46c912254 100644
--- a/docs/cmdline-opts/proto.d
+++ b/docs/cmdline-opts/proto.d
@@ -3,6 +3,7 @@ Arg: <protocols>
Help: Enable/disable PROTOCOLS
See-also: proto-redir proto-default
Added: 7.20.2
+Category: connection curl
---
Tells curl to limit what protocols it may use in the transfer. Protocols are
evaluated left to right, are comma separated, and are each a protocol name or
diff --git a/docs/cmdline-opts/proxy-anyauth.d b/docs/cmdline-opts/proxy-anyauth.d
index b60d0a05e..6410c0e6a 100644
--- a/docs/cmdline-opts/proxy-anyauth.d
+++ b/docs/cmdline-opts/proxy-anyauth.d
@@ -2,6 +2,7 @@ Long: proxy-anyauth
Help: Pick any proxy authentication method
Added: 7.13.2
See-also: proxy proxy-basic proxy-digest
+Category: proxy auth
---
Tells curl to pick a suitable authentication method when communicating with
the given HTTP proxy. This might cause an extra request/response round-trip.
diff --git a/docs/cmdline-opts/proxy-basic.d b/docs/cmdline-opts/proxy-basic.d
index 566f890a9..e842f9900 100644
--- a/docs/cmdline-opts/proxy-basic.d
+++ b/docs/cmdline-opts/proxy-basic.d
@@ -1,6 +1,7 @@
Long: proxy-basic
Help: Use Basic authentication on the proxy
See-also: proxy proxy-anyauth proxy-digest
+Category: proxy auth
---
Tells curl to use HTTP Basic authentication when communicating with the given
proxy. Use --basic for enabling HTTP Basic with a remote host. Basic is the
diff --git a/docs/cmdline-opts/proxy-cacert.d b/docs/cmdline-opts/proxy-cacert.d
index 2713dd2a4..bbc731a28 100644
--- a/docs/cmdline-opts/proxy-cacert.d
+++ b/docs/cmdline-opts/proxy-cacert.d
@@ -3,5 +3,6 @@ Help: CA certificate to verify peer against for proxy
Arg: <file>
Added: 7.52.0
See-also: proxy-capath cacert capath proxy
+Category: proxy tls
---
Same as --cacert but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-capath.d b/docs/cmdline-opts/proxy-capath.d
index 177246aab..cc342b755 100644
--- a/docs/cmdline-opts/proxy-capath.d
+++ b/docs/cmdline-opts/proxy-capath.d
@@ -3,5 +3,6 @@ Help: CA directory to verify peer against for proxy
Arg: <dir>
Added: 7.52.0
See-also: proxy-cacert proxy capath
+Category: proxy tls
---
Same as --capath but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-cert-type.d b/docs/cmdline-opts/proxy-cert-type.d
index 906d2a115..fb7596c17 100644
--- a/docs/cmdline-opts/proxy-cert-type.d
+++ b/docs/cmdline-opts/proxy-cert-type.d
@@ -2,5 +2,6 @@ Long: proxy-cert-type
Arg: <type>
Added: 7.52.0
Help: Client certificate type for HTTPS proxy
+Category: proxy tls
---
Same as --cert-type but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-cert.d b/docs/cmdline-opts/proxy-cert.d
index 43acd3950..7df2712f3 100644
--- a/docs/cmdline-opts/proxy-cert.d
+++ b/docs/cmdline-opts/proxy-cert.d
@@ -2,5 +2,6 @@ Long: proxy-cert
Arg: <cert[:passwd]>
Help: Set client certificate for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --cert but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-ciphers.d b/docs/cmdline-opts/proxy-ciphers.d
index dcac81284..366555673 100644
--- a/docs/cmdline-opts/proxy-ciphers.d
+++ b/docs/cmdline-opts/proxy-ciphers.d
@@ -2,5 +2,6 @@ Long: proxy-ciphers
Arg: <list>
Help: SSL ciphers to use for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --ciphers but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-crlfile.d b/docs/cmdline-opts/proxy-crlfile.d
index 1d6247f47..580dc50ce 100644
--- a/docs/cmdline-opts/proxy-crlfile.d
+++ b/docs/cmdline-opts/proxy-crlfile.d
@@ -2,5 +2,6 @@ Long: proxy-crlfile
Arg: <file>
Help: Set a CRL list for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --crlfile but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-digest.d b/docs/cmdline-opts/proxy-digest.d
index ccf46636c..52f1fcc67 100644
--- a/docs/cmdline-opts/proxy-digest.d
+++ b/docs/cmdline-opts/proxy-digest.d
@@ -1,6 +1,7 @@
Long: proxy-digest
Help: Use Digest authentication on the proxy
See-also: proxy proxy-anyauth proxy-basic
+Category: proxy tls
---
Tells curl to use HTTP Digest authentication when communicating with the given
proxy. Use --digest for enabling HTTP Digest with a remote host.
diff --git a/docs/cmdline-opts/proxy-header.d b/docs/cmdline-opts/proxy-header.d
index c1b0bb7c4..9f1121d2f 100644
--- a/docs/cmdline-opts/proxy-header.d
+++ b/docs/cmdline-opts/proxy-header.d
@@ -3,6 +3,7 @@ Arg: <header/@file>
Help: Pass custom header(s) to proxy
Protocols: HTTP
Added: 7.37.0
+Category: proxy
---
Extra header to include in the request when sending HTTP to a proxy. You may
specify any number of extra headers. This is the equivalent option to --header
diff --git a/docs/cmdline-opts/proxy-insecure.d b/docs/cmdline-opts/proxy-insecure.d
index 762828f43..e123f4019 100644
--- a/docs/cmdline-opts/proxy-insecure.d
+++ b/docs/cmdline-opts/proxy-insecure.d
@@ -1,5 +1,6 @@
Long: proxy-insecure
Help: Do HTTPS proxy connections without verifying the proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --insecure but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-key-type.d b/docs/cmdline-opts/proxy-key-type.d
index ce7482ae9..1906872ef 100644
--- a/docs/cmdline-opts/proxy-key-type.d
+++ b/docs/cmdline-opts/proxy-key-type.d
@@ -2,5 +2,6 @@ Long: proxy-key-type
Arg: <type>
Help: Private key file type for proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --key-type but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-key.d b/docs/cmdline-opts/proxy-key.d
index e61eb18a9..57d469f43 100644
--- a/docs/cmdline-opts/proxy-key.d
+++ b/docs/cmdline-opts/proxy-key.d
@@ -1,5 +1,6 @@
Long: proxy-key
Help: Private key for HTTPS proxy
Arg: <key>
+Category: proxy tls
---
Same as --key but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-negotiate.d b/docs/cmdline-opts/proxy-negotiate.d
index 775f62a9a..72f35960e 100644
--- a/docs/cmdline-opts/proxy-negotiate.d
+++ b/docs/cmdline-opts/proxy-negotiate.d
@@ -2,6 +2,7 @@ Long: proxy-negotiate
Help: Use HTTP Negotiate (SPNEGO) authentication on the proxy
Added: 7.17.1
See-also: proxy-anyauth proxy-basic
+Category: proxy auth
---
Tells curl to use HTTP Negotiate (SPNEGO) authentication when communicating
with the given proxy. Use --negotiate for enabling HTTP Negotiate (SPNEGO)
diff --git a/docs/cmdline-opts/proxy-ntlm.d b/docs/cmdline-opts/proxy-ntlm.d
index c30db53b9..cb1ba7b00 100644
--- a/docs/cmdline-opts/proxy-ntlm.d
+++ b/docs/cmdline-opts/proxy-ntlm.d
@@ -1,6 +1,7 @@
Long: proxy-ntlm
Help: Use NTLM authentication on the proxy
See-also: proxy-negotiate proxy-anyauth
+Category: proxy auth
---
Tells curl to use HTTP NTLM authentication when communicating with the given
proxy. Use --ntlm for enabling NTLM with a remote host.
diff --git a/docs/cmdline-opts/proxy-pass.d b/docs/cmdline-opts/proxy-pass.d
index 3371714ba..627451bbb 100644
--- a/docs/cmdline-opts/proxy-pass.d
+++ b/docs/cmdline-opts/proxy-pass.d
@@ -2,5 +2,6 @@ Long: proxy-pass
Arg: <phrase>
Help: Pass phrase for the private key for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --pass but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-pinnedpubkey.d b/docs/cmdline-opts/proxy-pinnedpubkey.d
index abd6dc4aa..2ab79f19e 100644
--- a/docs/cmdline-opts/proxy-pinnedpubkey.d
+++ b/docs/cmdline-opts/proxy-pinnedpubkey.d
@@ -2,6 +2,7 @@ Long: proxy-pinnedpubkey
Arg: <hashes>
Help: FILE/HASHES public key to verify proxy with
Protocols: TLS
+Category: proxy tls
---
Tells curl to use the specified public key file (or hashes) to verify the
proxy. This can be a path to a file which contains a single public key in PEM
diff --git a/docs/cmdline-opts/proxy-service-name.d b/docs/cmdline-opts/proxy-service-name.d
index 9a73f2be6..f78072906 100644
--- a/docs/cmdline-opts/proxy-service-name.d
+++ b/docs/cmdline-opts/proxy-service-name.d
@@ -2,5 +2,6 @@ Long: proxy-service-name
Arg: <name>
Help: SPNEGO proxy service name
Added: 7.43.0
+Category: proxy tls
---
This option allows you to change the service name for proxy negotiation.
diff --git a/docs/cmdline-opts/proxy-ssl-allow-beast.d b/docs/cmdline-opts/proxy-ssl-allow-beast.d
index de96b8436..138001b36 100644
--- a/docs/cmdline-opts/proxy-ssl-allow-beast.d
+++ b/docs/cmdline-opts/proxy-ssl-allow-beast.d
@@ -1,5 +1,6 @@
Long: proxy-ssl-allow-beast
Help: Allow security flaw for interop for HTTPS proxy
Added: 7.52.0
+Category: proxy tls
---
Same as --ssl-allow-beast but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tls13-ciphers.d b/docs/cmdline-opts/proxy-tls13-ciphers.d
index 08961b72e..19add2260 100644
--- a/docs/cmdline-opts/proxy-tls13-ciphers.d
+++ b/docs/cmdline-opts/proxy-tls13-ciphers.d
@@ -2,6 +2,7 @@ Long: proxy-tls13-ciphers
Arg: <ciphersuite list>
help: TLS 1.3 proxy cipher suites
Protocols: TLS
+Category: proxy tls
---
Specifies which cipher suites to use in the connection to your HTTPS proxy
when it negotiates TLS 1.3. The list of ciphers suites must specify valid
diff --git a/docs/cmdline-opts/proxy-tlsauthtype.d b/docs/cmdline-opts/proxy-tlsauthtype.d
index 7d0ce8e1a..5649a0f5f 100644
--- a/docs/cmdline-opts/proxy-tlsauthtype.d
+++ b/docs/cmdline-opts/proxy-tlsauthtype.d
@@ -2,5 +2,6 @@ Long: proxy-tlsauthtype
Arg: <type>
Help: TLS authentication type for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlsauthtype but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tlspassword.d b/docs/cmdline-opts/proxy-tlspassword.d
index cf003844e..38a33d45d 100644
--- a/docs/cmdline-opts/proxy-tlspassword.d
+++ b/docs/cmdline-opts/proxy-tlspassword.d
@@ -2,5 +2,6 @@ Long: proxy-tlspassword
Arg: <string>
Help: TLS password for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlspassword but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tlsuser.d b/docs/cmdline-opts/proxy-tlsuser.d
index 758a7c953..587f7f510 100644
--- a/docs/cmdline-opts/proxy-tlsuser.d
+++ b/docs/cmdline-opts/proxy-tlsuser.d
@@ -2,5 +2,6 @@ Long: proxy-tlsuser
Arg: <name>
Help: TLS username for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlsuser but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-tlsv1.d b/docs/cmdline-opts/proxy-tlsv1.d
index d024eeac3..5003f5f70 100644
--- a/docs/cmdline-opts/proxy-tlsv1.d
+++ b/docs/cmdline-opts/proxy-tlsv1.d
@@ -1,5 +1,6 @@
Long: proxy-tlsv1
Help: Use TLSv1 for HTTPS proxy
Added: 7.52.0
+Category: proxy tls auth
---
Same as --tlsv1 but used in HTTPS proxy context.
diff --git a/docs/cmdline-opts/proxy-user.d b/docs/cmdline-opts/proxy-user.d
index 152466daa..82fc5170f 100644
--- a/docs/cmdline-opts/proxy-user.d
+++ b/docs/cmdline-opts/proxy-user.d
@@ -2,6 +2,7 @@ Long: proxy-user
Short: U
Arg: <user:password>
Help: Proxy user and password
+Category: proxy auth
---
Specify the user name and password to use for proxy authentication.
diff --git a/docs/cmdline-opts/proxy.d b/docs/cmdline-opts/proxy.d
index 6506692be..0592f13ba 100644
--- a/docs/cmdline-opts/proxy.d
+++ b/docs/cmdline-opts/proxy.d
@@ -2,6 +2,7 @@ Long: proxy
Short: x
Arg: [protocol://]host[:port]
Help: Use this proxy
+Category: proxy
---
Use the specified proxy.
diff --git a/docs/cmdline-opts/proxy1.0.d b/docs/cmdline-opts/proxy1.0.d
index 4a931bd15..b8a232bf7 100644
--- a/docs/cmdline-opts/proxy1.0.d
+++ b/docs/cmdline-opts/proxy1.0.d
@@ -1,6 +1,7 @@
Long: proxy1.0
Arg: <host[:port]>
Help: Use HTTP/1.0 proxy on given port
+Category: proxy
---
Use the specified HTTP 1.0 proxy. If the port number is not specified, it is
assumed at port 1080.
diff --git a/docs/cmdline-opts/proxytunnel.d b/docs/cmdline-opts/proxytunnel.d
index 1f587f120..94dae992f 100644
--- a/docs/cmdline-opts/proxytunnel.d
+++ b/docs/cmdline-opts/proxytunnel.d
@@ -2,6 +2,7 @@ Long: proxytunnel
Short: p
Help: Operate through an HTTP proxy tunnel (using CONNECT)
See-also: proxy
+Category: proxy
---
When an HTTP proxy is used --proxy, this option will make curl tunnel through
the proxy. The tunnel approach is made with the HTTP proxy CONNECT request and
diff --git a/docs/cmdline-opts/pubkey.d b/docs/cmdline-opts/pubkey.d
index b2e11c024..692daf6b0 100644
--- a/docs/cmdline-opts/pubkey.d
+++ b/docs/cmdline-opts/pubkey.d
@@ -2,6 +2,7 @@ Long: pubkey
Arg: <key>
Protocols: SFTP SCP
Help: SSH Public key file name
+Category: sftp scp auth
---
Public key file name. Allows you to provide your public key in this separate
file.
diff --git a/docs/cmdline-opts/quote.d b/docs/cmdline-opts/quote.d
index 59a98eafb..a33ed3571 100644
--- a/docs/cmdline-opts/quote.d
+++ b/docs/cmdline-opts/quote.d
@@ -2,6 +2,7 @@ Long: quote
Short: Q
Help: Send command(s) to server before transfer
Protocols: FTP SFTP
+Category: ftp sftp
---
Send an arbitrary command to the remote FTP or SFTP server. Quote commands are
@@ -26,6 +27,10 @@ itself before sending them to the server. File names may be quoted
shell-style to embed spaces or special characters. Following is the list of
all supported SFTP quote commands:
.RS
+.IP "atime date file"
+The atime command sets the last access time of the file named by the file
+operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "chgrp group file"
The chgrp command sets the group ID of the file named by the file operand to
the group ID specified by the group operand. The group operand is a decimal
@@ -42,6 +47,10 @@ The ln and symlink commands create a symbolic link at the target_file location
pointing to the source_file location.
.IP "mkdir directory_name"
The mkdir command creates the directory named by the directory_name operand.
+.IP "mtime date file"
+The mtime command sets the last modification time of the file named by the
+file operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "pwd"
The pwd command returns the absolute pathname of the current working directory.
.IP "rename source target"
diff --git a/docs/cmdline-opts/random-file.d b/docs/cmdline-opts/random-file.d
index 51626f88d..c57f52364 100644
--- a/docs/cmdline-opts/random-file.d
+++ b/docs/cmdline-opts/random-file.d
@@ -1,6 +1,7 @@
Long: random-file
Arg: <file>
Help: File for reading random data from
+Category: misc
---
Specify the path name to file containing what will be considered as random
data. The data may be used to seed the random engine for SSL connections. See
diff --git a/docs/cmdline-opts/range.d b/docs/cmdline-opts/range.d
index b888dd181..17c6c2aba 100644
--- a/docs/cmdline-opts/range.d
+++ b/docs/cmdline-opts/range.d
@@ -3,6 +3,7 @@ Short: r
Help: Retrieve only the bytes within RANGE
Arg: <range>
Protocols: HTTP FTP SFTP FILE
+Category: http ftp sftp file
---
Retrieve a byte range (i.e. a partial document) from an HTTP/1.1, FTP or SFTP
server or a local FILE. Ranges can be specified in a number of ways.
diff --git a/docs/cmdline-opts/raw.d b/docs/cmdline-opts/raw.d
index c3328e69a..90e777263 100644
--- a/docs/cmdline-opts/raw.d
+++ b/docs/cmdline-opts/raw.d
@@ -2,6 +2,7 @@ Long: raw
Help: Do HTTP "raw"; no transfer decoding
Added: 7.16.2
Protocols: HTTP
+Category: http
---
When used, it disables all internal HTTP decoding of content or transfer
encodings and instead makes them passed on unaltered, raw.
diff --git a/docs/cmdline-opts/referer.d b/docs/cmdline-opts/referer.d
index cd84e9d5a..8b2057b94 100644
--- a/docs/cmdline-opts/referer.d
+++ b/docs/cmdline-opts/referer.d
@@ -4,6 +4,7 @@ Arg: <URL>
Protocols: HTTP
Help: Referrer URL
See-also: user-agent header
+Category: http
---
Sends the "Referrer Page" information to the HTTP server. This can also be set
with the --header flag of course. When used with --location you can append
diff --git a/docs/cmdline-opts/remote-header-name.d b/docs/cmdline-opts/remote-header-name.d
index 771b6d469..700da69fc 100644
--- a/docs/cmdline-opts/remote-header-name.d
+++ b/docs/cmdline-opts/remote-header-name.d
@@ -2,6 +2,7 @@ Long: remote-header-name
Short: J
Protocols: HTTP
Help: Use the header-provided filename
+Category: output
---
This option tells the --remote-name option to use the server-specified
Content-Disposition filename instead of extracting a filename from the URL.
diff --git a/docs/cmdline-opts/remote-name-all.d b/docs/cmdline-opts/remote-name-all.d
index f7a199679..299684c51 100644
--- a/docs/cmdline-opts/remote-name-all.d
+++ b/docs/cmdline-opts/remote-name-all.d
@@ -1,6 +1,7 @@
Long: remote-name-all
Help: Use the remote file name for all URLs
Added: 7.19.0
+Category: output
---
This option changes the default action for all given URLs to be dealt with as
if --remote-name were used for each one. So if you want to disable that for a
diff --git a/docs/cmdline-opts/remote-name.d b/docs/cmdline-opts/remote-name.d
index 9fed64bf4..184c32e47 100644
--- a/docs/cmdline-opts/remote-name.d
+++ b/docs/cmdline-opts/remote-name.d
@@ -1,6 +1,7 @@
Long: remote-name
Short: O
Help: Write output to a file named as the remote file
+Category: important output
---
Write output to a local file named like the remote file we get. (Only the file
part of the remote file is used, the path is cut off.)
diff --git a/docs/cmdline-opts/remote-time.d b/docs/cmdline-opts/remote-time.d
index 7f6809dc3..96fb4fbe9 100644
--- a/docs/cmdline-opts/remote-time.d
+++ b/docs/cmdline-opts/remote-time.d
@@ -1,6 +1,7 @@
Long: remote-time
Short: R
Help: Set the remote file's time on the local output
+Category: output
---
When used, this will make curl attempt to figure out the timestamp of the
remote file, and if that is available make the local file get that same
diff --git a/docs/cmdline-opts/request-target.d b/docs/cmdline-opts/request-target.d
index b46b4af02..df423f87d 100644
--- a/docs/cmdline-opts/request-target.d
+++ b/docs/cmdline-opts/request-target.d
@@ -2,6 +2,7 @@ Long: request-target
Help: Specify the target for this request
Protocols: HTTP
Added: 7.55.0
+Category: http
---
Tells curl to use an alternative "target" (path) instead of using the path as
provided in the URL. Particularly useful when wanting to issue HTTP requests
diff --git a/docs/cmdline-opts/request.d b/docs/cmdline-opts/request.d
index 3919d426a..47c4c8b04 100644
--- a/docs/cmdline-opts/request.d
+++ b/docs/cmdline-opts/request.d
@@ -2,6 +2,7 @@ Long: request
Short: X
Arg: <command>
Help: Specify request command to use
+Category: connection
---
(HTTP) Specifies a custom request method to use when communicating with the
HTTP server. The specified request method will be used instead of the method
diff --git a/docs/cmdline-opts/resolve.d b/docs/cmdline-opts/resolve.d
index 9c37525bd..41f6a1bd5 100644
--- a/docs/cmdline-opts/resolve.d
+++ b/docs/cmdline-opts/resolve.d
@@ -1,7 +1,8 @@
Long: resolve
-Arg: <host:port:address[,address]...>
+Arg: <host:port:addr[,addr]...>
Help: Resolve the host+port to this address
Added: 7.21.3
+Category: connection
---
Provide a custom address for a specific host and port pair. Using this, you
can make the curl requests(s) use a specified address and prevent the
diff --git a/docs/cmdline-opts/retry-all-errors.d b/docs/cmdline-opts/retry-all-errors.d
new file mode 100644
index 000000000..6bda52b6e
--- /dev/null
+++ b/docs/cmdline-opts/retry-all-errors.d
@@ -0,0 +1,20 @@
+Long: retry-all-errors
+Help: Retry all errors (use with --retry)
+Added: 7.71.0
+Category: curl
+---
+Retry on any error. This option is used together with --retry.
+
+This option is the "sledgehammer" of retrying. Do not use this option by
+default (eg in curlrc), there may be unintended consequences such as sending or
+receiving duplicate data. Do not use with redirected input or output. You'd be
+much better off handling your unique problems in shell script. Please read the
+example below.
+
+Warning: For server compatibility curl attempts to retry failed flaky transfers
+as close as possible to how they were started, but this is not possible with
+redirected input or output. For example, before retrying it removes output data
+from a failed partial transfer that was written to an output file. However this
+is not true of data redirected to a | pipe or > file, which are not reset. We
+strongly suggest don't parse or record output via redirect in combination with
+this option, since you may receive duplicate data.
diff --git a/docs/cmdline-opts/retry-connrefused.d b/docs/cmdline-opts/retry-connrefused.d
index 6a78e1fda..be34f973d 100644
--- a/docs/cmdline-opts/retry-connrefused.d
+++ b/docs/cmdline-opts/retry-connrefused.d
@@ -1,6 +1,7 @@
Long: retry-connrefused
Help: Retry on connection refused (use with --retry)
Added: 7.52.0
+Category: curl
---
In addition to the other conditions, consider ECONNREFUSED as a transient
error too for --retry. This option is used together with --retry.
diff --git a/docs/cmdline-opts/retry-delay.d b/docs/cmdline-opts/retry-delay.d
index 1691356d4..5645c0e6a 100644
--- a/docs/cmdline-opts/retry-delay.d
+++ b/docs/cmdline-opts/retry-delay.d
@@ -2,6 +2,7 @@ Long: retry-delay
Arg: <seconds>
Help: Wait time between retries
Added: 7.12.3
+Category: curl
---
Make curl sleep this amount of time before each retry when a transfer has
failed with a transient error (it changes the default backoff time algorithm
diff --git a/docs/cmdline-opts/retry-max-time.d b/docs/cmdline-opts/retry-max-time.d
index 0920c9244..9d6faf304 100644
--- a/docs/cmdline-opts/retry-max-time.d
+++ b/docs/cmdline-opts/retry-max-time.d
@@ -2,6 +2,7 @@ Long: retry-max-time
Arg: <seconds>
Help: Retry only within this period
Added: 7.12.3
+Category: curl
---
The retry timer is reset before the first transfer attempt. Retries will be
done as usual (see --retry) as long as the timer hasn't reached this given
diff --git a/docs/cmdline-opts/retry.d b/docs/cmdline-opts/retry.d
index 3db89b71c..70f6e7bfd 100644
--- a/docs/cmdline-opts/retry.d
+++ b/docs/cmdline-opts/retry.d
@@ -2,6 +2,7 @@ Long: retry
Arg: <num>
Added: 7.12.3
Help: Retry request if transient problems occur
+Category: curl
---
If a transient error is returned when curl tries to perform a transfer, it
will retry this number of times before giving up. Setting the number to 0
diff --git a/docs/cmdline-opts/sasl-authzid.d b/docs/cmdline-opts/sasl-authzid.d
index b34db97fc..e802c80a1 100644
--- a/docs/cmdline-opts/sasl-authzid.d
+++ b/docs/cmdline-opts/sasl-authzid.d
@@ -1,6 +1,8 @@
Long: sasl-authzid
-Help: Use this identity to act as during SASL PLAIN authentication
+Arg: <identity>
+Help: Identity for SASL PLAIN authentication
Added: 7.66.0
+Category: auth
---
Use this authorisation identity (authzid), during SASL PLAIN authentication,
in addition to the authentication identity (authcid) as specified by --user.
diff --git a/docs/cmdline-opts/sasl-ir.d b/docs/cmdline-opts/sasl-ir.d
index c0dab9463..0041c3b4e 100644
--- a/docs/cmdline-opts/sasl-ir.d
+++ b/docs/cmdline-opts/sasl-ir.d
@@ -1,5 +1,6 @@
Long: sasl-ir
Help: Enable initial response in SASL authentication
Added: 7.31.0
+Category: auth
---
Enable initial response in SASL authentication.
diff --git a/docs/cmdline-opts/service-name.d b/docs/cmdline-opts/service-name.d
index 4dfeb27d6..c64496b85 100644
--- a/docs/cmdline-opts/service-name.d
+++ b/docs/cmdline-opts/service-name.d
@@ -2,6 +2,7 @@ Long: service-name
Help: SPNEGO service name
Arg: <name>
Added: 7.43.0
+Category: misc
---
This option allows you to change the service name for SPNEGO.
diff --git a/docs/cmdline-opts/show-error.d b/docs/cmdline-opts/show-error.d
index b9667a4ca..2124409e5 100644
--- a/docs/cmdline-opts/show-error.d
+++ b/docs/cmdline-opts/show-error.d
@@ -1,5 +1,7 @@
Long: show-error
Short: S
Help: Show error even when -s is used
+See-also: no-progress-meter
+Category: curl
---
When used with --silent, it makes curl show an error message if it fails.
diff --git a/docs/cmdline-opts/silent.d b/docs/cmdline-opts/silent.d
index b0b4425b3..58a522335 100644
--- a/docs/cmdline-opts/silent.d
+++ b/docs/cmdline-opts/silent.d
@@ -1,7 +1,8 @@
Long: silent
Short: s
Help: Silent mode
-See-also: verbose stderr
+See-also: verbose stderr no-progress-meter
+Category: important verbose
---
Silent or quiet mode. Don't show progress meter or error messages. Makes Curl
mute. It will still output the data you ask for, potentially even to the
diff --git a/docs/cmdline-opts/socks4.d b/docs/cmdline-opts/socks4.d
index 11f6ae033..bc095d546 100644
--- a/docs/cmdline-opts/socks4.d
+++ b/docs/cmdline-opts/socks4.d
@@ -2,6 +2,7 @@ Long: socks4
Arg: <host[:port]>
Help: SOCKS4 proxy on given host + port
Added: 7.15.2
+Category: proxy
---
Use the specified SOCKS4 proxy. If the port number is not specified, it is
assumed at port 1080.
diff --git a/docs/cmdline-opts/socks4a.d b/docs/cmdline-opts/socks4a.d
index ae254ae0e..d3177a9d7 100644
--- a/docs/cmdline-opts/socks4a.d
+++ b/docs/cmdline-opts/socks4a.d
@@ -2,6 +2,7 @@ Long: socks4a
Arg: <host[:port]>
Help: SOCKS4a proxy on given host + port
Added: 7.18.0
+Category: proxy
---
Use the specified SOCKS4a proxy. If the port number is not specified, it is
assumed at port 1080.
diff --git a/docs/cmdline-opts/socks5-basic.d b/docs/cmdline-opts/socks5-basic.d
index 67d16b3a6..52d1e6619 100644
--- a/docs/cmdline-opts/socks5-basic.d
+++ b/docs/cmdline-opts/socks5-basic.d
@@ -1,6 +1,7 @@
Long: socks5-basic
Help: Enable username/password auth for SOCKS5 proxies
Added: 7.55.0
+Category: proxy auth
---
Tells curl to use username/password authentication when connecting to a SOCKS5
proxy. The username/password authentication is enabled by default. Use
diff --git a/docs/cmdline-opts/socks5-gssapi-nec.d b/docs/cmdline-opts/socks5-gssapi-nec.d
index 477e218e3..b538f33f3 100644
--- a/docs/cmdline-opts/socks5-gssapi-nec.d
+++ b/docs/cmdline-opts/socks5-gssapi-nec.d
@@ -1,6 +1,7 @@
Long: socks5-gssapi-nec
Help: Compatibility with NEC SOCKS5 server
Added: 7.19.4
+Category: proxy auth
---
As part of the GSS-API negotiation a protection mode is negotiated. RFC 1961
says in section 4.3/4.4 it should be protected, but the NEC reference
diff --git a/docs/cmdline-opts/socks5-gssapi-service.d b/docs/cmdline-opts/socks5-gssapi-service.d
index eb3b2407b..e61d0f5ab 100644
--- a/docs/cmdline-opts/socks5-gssapi-service.d
+++ b/docs/cmdline-opts/socks5-gssapi-service.d
@@ -2,6 +2,7 @@ Long: socks5-gssapi-service
Arg: <name>
Help: SOCKS5 proxy service name for GSS-API
Added: 7.19.4
+Category: proxy auth
---
The default service name for a socks server is rcmd/server-fqdn. This option
allows you to change it.
diff --git a/docs/cmdline-opts/socks5-gssapi.d b/docs/cmdline-opts/socks5-gssapi.d
index 0070f37eb..72ae7aeb2 100644
--- a/docs/cmdline-opts/socks5-gssapi.d
+++ b/docs/cmdline-opts/socks5-gssapi.d
@@ -1,6 +1,7 @@
Long: socks5-gssapi
Help: Enable GSS-API auth for SOCKS5 proxies
Added: 7.55.0
+Category: proxy auth
---
Tells curl to use GSS-API authentication when connecting to a SOCKS5 proxy.
The GSS-API authentication is enabled by default (if curl is compiled with
diff --git a/docs/cmdline-opts/socks5-hostname.d b/docs/cmdline-opts/socks5-hostname.d
index 9d9d946e5..247d7660e 100644
--- a/docs/cmdline-opts/socks5-hostname.d
+++ b/docs/cmdline-opts/socks5-hostname.d
@@ -2,6 +2,7 @@ Long: socks5-hostname
Arg: <host[:port]>
Help: SOCKS5 proxy, pass host name to proxy
Added: 7.18.0
+Category: proxy
---
Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If
the port number is not specified, it is assumed at port 1080.
diff --git a/docs/cmdline-opts/socks5.d b/docs/cmdline-opts/socks5.d
index 22fae7629..bbe92f0a1 100644
--- a/docs/cmdline-opts/socks5.d
+++ b/docs/cmdline-opts/socks5.d
@@ -2,6 +2,7 @@ Long: socks5
Arg: <host[:port]>
Help: SOCKS5 proxy on given host + port
Added: 7.18.0
+Category: proxy
---
Use the specified SOCKS5 proxy - but resolve the host name locally. If the
port number is not specified, it is assumed at port 1080.
diff --git a/docs/cmdline-opts/speed-limit.d b/docs/cmdline-opts/speed-limit.d
index e2b81c79a..3f9ad3a46 100644
--- a/docs/cmdline-opts/speed-limit.d
+++ b/docs/cmdline-opts/speed-limit.d
@@ -2,6 +2,7 @@ Long: speed-limit
Short: Y
Arg: <speed>
Help: Stop transfers slower than this
+Category: connection
---
If a download is slower than this given speed (in bytes per second) for
speed-time seconds it gets aborted. speed-time is set with --speed-time and is
diff --git a/docs/cmdline-opts/speed-time.d b/docs/cmdline-opts/speed-time.d
index 98d6ae13c..81acabec4 100644
--- a/docs/cmdline-opts/speed-time.d
+++ b/docs/cmdline-opts/speed-time.d
@@ -2,6 +2,7 @@ Long: speed-time
Short: y
Arg: <seconds>
Help: Trigger 'speed-limit' abort after this time
+Category: connection
---
If a download is slower than speed-limit bytes per second during a speed-time
period, the download gets aborted. If speed-time is used, the default
diff --git a/docs/cmdline-opts/ssl-allow-beast.d b/docs/cmdline-opts/ssl-allow-beast.d
index 973fcd451..f18fe7470 100644
--- a/docs/cmdline-opts/ssl-allow-beast.d
+++ b/docs/cmdline-opts/ssl-allow-beast.d
@@ -1,6 +1,7 @@
Long: ssl-allow-beast
Help: Allow security flaw to improve interop
Added: 7.25.0
+Category: tls
---
This option tells curl to not work around a security flaw in the SSL3 and
TLS1.0 protocols known as BEAST. If this option isn't used, the SSL layer may
diff --git a/docs/cmdline-opts/ssl-no-revoke.d b/docs/cmdline-opts/ssl-no-revoke.d
index f94b11143..3b1614243 100644
--- a/docs/cmdline-opts/ssl-no-revoke.d
+++ b/docs/cmdline-opts/ssl-no-revoke.d
@@ -1,6 +1,7 @@
Long: ssl-no-revoke
Help: Disable cert revocation checks (Schannel)
Added: 7.44.0
+Category: tls
---
(Schannel) This option tells curl to disable certificate revocation checks.
WARNING: this option loosens the SSL security, and by using this flag you ask
diff --git a/docs/cmdline-opts/ssl-reqd.d b/docs/cmdline-opts/ssl-reqd.d
index 3c6f8a257..2e573e39d 100644
--- a/docs/cmdline-opts/ssl-reqd.d
+++ b/docs/cmdline-opts/ssl-reqd.d
@@ -2,6 +2,7 @@ Long: ssl-reqd
Help: Require SSL/TLS
Protocols: FTP IMAP POP3 SMTP
Added: 7.20.0
+Category: tls
---
Require SSL/TLS for the connection. Terminates the connection if the server
doesn't support SSL/TLS.
diff --git a/docs/cmdline-opts/ssl-revoke-best-effort.d b/docs/cmdline-opts/ssl-revoke-best-effort.d
new file mode 100644
index 000000000..af22da461
--- /dev/null
+++ b/docs/cmdline-opts/ssl-revoke-best-effort.d
@@ -0,0 +1,8 @@
+Long: ssl-revoke-best-effort
+Help: Ignore missing/offline cert CRL dist points
+Added: 7.70.0
+Category: tls
+---
+(Schannel) This option tells curl to ignore certificate revocation checks when
+they failed due to missing/offline distribution points for the revocation check
+lists.
diff --git a/docs/cmdline-opts/ssl.d b/docs/cmdline-opts/ssl.d
index dabd83761..8df460106 100644
--- a/docs/cmdline-opts/ssl.d
+++ b/docs/cmdline-opts/ssl.d
@@ -2,6 +2,7 @@ Long: ssl
Help: Try SSL/TLS
Protocols: FTP IMAP POP3 SMTP
Added: 7.20.0
+Category: tls
---
Try to use SSL/TLS for the connection. Reverts to a non-secure connection if
diff --git a/docs/cmdline-opts/sslv2.d b/docs/cmdline-opts/sslv2.d
index 67d2b8506..773ab691e 100644
--- a/docs/cmdline-opts/sslv2.d
+++ b/docs/cmdline-opts/sslv2.d
@@ -7,6 +7,7 @@ Mutexed: sslv3 tlsv1 tlsv1.1 tlsv1.2
Requires: TLS
See-also: http1.1 http2
Help: Use SSLv2
+Category: tls
---
Forces curl to use SSL version 2 when negotiating with a remote SSL
server. Sometimes curl is built without SSLv2 support. SSLv2 is widely
diff --git a/docs/cmdline-opts/sslv3.d b/docs/cmdline-opts/sslv3.d
index 101ad1004..7beed8f81 100644
--- a/docs/cmdline-opts/sslv3.d
+++ b/docs/cmdline-opts/sslv3.d
@@ -7,6 +7,7 @@ Mutexed: sslv2 tlsv1 tlsv1.1 tlsv1.2
Requires: TLS
See-also: http1.1 http2
Help: Use SSLv3
+Category: tls
---
Forces curl to use SSL version 3 when negotiating with a remote SSL
server. Sometimes curl is built without SSLv3 support. SSLv3 is widely
diff --git a/docs/cmdline-opts/stderr.d b/docs/cmdline-opts/stderr.d
index e8cf7ba68..6da040159 100644
--- a/docs/cmdline-opts/stderr.d
+++ b/docs/cmdline-opts/stderr.d
@@ -1,6 +1,7 @@
Long: stderr
Help: Where to redirect stderr
See-also: verbose silent
+Category: verbose
---
Redirect all writes to stderr to the specified file instead. If the file name
is a plain '-', it is instead written to stdout.
diff --git a/docs/cmdline-opts/styled-output.d b/docs/cmdline-opts/styled-output.d
index e4751aecb..8aa4a0f05 100644
--- a/docs/cmdline-opts/styled-output.d
+++ b/docs/cmdline-opts/styled-output.d
@@ -1,6 +1,7 @@
Long: styled-output
Help: Enable styled output for HTTP headers
Added: 7.61.0
+Category: verbose
---
Enables the automatic use of bold font styles when writing HTTP headers to the
terminal. Use --no-styled-output to switch them off.
diff --git a/docs/cmdline-opts/suppress-connect-headers.d b/docs/cmdline-opts/suppress-connect-headers.d
index d208b8917..b4e2a17db 100644
--- a/docs/cmdline-opts/suppress-connect-headers.d
+++ b/docs/cmdline-opts/suppress-connect-headers.d
@@ -1,6 +1,7 @@
Long: suppress-connect-headers
Help: Suppress proxy CONNECT response headers
See-also: dump-header include proxytunnel
+Category: proxy
---
When --proxytunnel is used and a CONNECT request is made don't output proxy
CONNECT response headers. This option is meant to be used with --dump-header or
diff --git a/docs/cmdline-opts/tcp-fastopen.d b/docs/cmdline-opts/tcp-fastopen.d
index 08e141df7..faef499f3 100644
--- a/docs/cmdline-opts/tcp-fastopen.d
+++ b/docs/cmdline-opts/tcp-fastopen.d
@@ -1,5 +1,6 @@
Long: tcp-fastopen
Added: 7.49.0
Help: Use TCP Fast Open
+Category: connection
---
Enable use of TCP Fast Open (RFC7413).
diff --git a/docs/cmdline-opts/tcp-nodelay.d b/docs/cmdline-opts/tcp-nodelay.d
index f047a7c6f..f1cf644a4 100644
--- a/docs/cmdline-opts/tcp-nodelay.d
+++ b/docs/cmdline-opts/tcp-nodelay.d
@@ -1,6 +1,7 @@
Long: tcp-nodelay
Help: Use the TCP_NODELAY option
Added: 7.11.2
+Category: connection
---
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
details about this option.
diff --git a/docs/cmdline-opts/telnet-option.d b/docs/cmdline-opts/telnet-option.d
index a67cb627b..789de3ea1 100644
--- a/docs/cmdline-opts/telnet-option.d
+++ b/docs/cmdline-opts/telnet-option.d
@@ -2,6 +2,7 @@ Long: telnet-option
Short: t
Arg: <opt=val>
Help: Set telnet option
+Category: telnet
---
Pass options to the telnet protocol. Supported options are:
diff --git a/docs/cmdline-opts/tftp-blksize.d b/docs/cmdline-opts/tftp-blksize.d
index c184328de..6e67ed2e1 100644
--- a/docs/cmdline-opts/tftp-blksize.d
+++ b/docs/cmdline-opts/tftp-blksize.d
@@ -3,6 +3,7 @@ Arg: <value>
Help: Set TFTP BLKSIZE option
Protocols: TFTP
Added: 7.20.0
+Category: tftp
---
Set TFTP BLKSIZE option (must be >512). This is the block size that curl will
try to use when transferring data to or from a TFTP server. By default 512
diff --git a/docs/cmdline-opts/tftp-no-options.d b/docs/cmdline-opts/tftp-no-options.d
index e2a4dacd5..023327301 100644
--- a/docs/cmdline-opts/tftp-no-options.d
+++ b/docs/cmdline-opts/tftp-no-options.d
@@ -2,6 +2,7 @@ Long: tftp-no-options
Help: Do not send any TFTP options
Protocols: TFTP
Added: 7.48.0
+Category: tftp
---
Tells curl not to send TFTP options requests.
diff --git a/docs/cmdline-opts/time-cond.d b/docs/cmdline-opts/time-cond.d
index 830b4e1a2..f733eeb0b 100644
--- a/docs/cmdline-opts/time-cond.d
+++ b/docs/cmdline-opts/time-cond.d
@@ -3,6 +3,7 @@ Short: z
Arg: <time>
Help: Transfer based on a time condition
Protocols: HTTP FTP
+Category: http ftp
---
Request a file that has been modified later than the given time and date, or
one that has been modified before that time. The <date expression> can be all
diff --git a/docs/cmdline-opts/tls-max.d b/docs/cmdline-opts/tls-max.d
index b5616f124..07eb65465 100644
--- a/docs/cmdline-opts/tls-max.d
+++ b/docs/cmdline-opts/tls-max.d
@@ -6,10 +6,14 @@ Added: 7.54.0
Requires: TLS
See-also: tlsv1.0 tlsv1.1 tlsv1.2 tlsv1.3
Help: Set maximum allowed TLS version
+Category: tls
---
VERSION defines maximum supported TLS version. The minimum acceptable version
is set by tlsv1.0, tlsv1.1, tlsv1.2 or tlsv1.3.
+If the connection is done without TLS, this option has no effect. This
+includes QUIC-using (HTTP/3) transfers.
+
.RS
.IP "default"
Use up to recommended TLS version.
diff --git a/docs/cmdline-opts/tls13-ciphers.d b/docs/cmdline-opts/tls13-ciphers.d
index 654a25b4c..0f906ce40 100644
--- a/docs/cmdline-opts/tls13-ciphers.d
+++ b/docs/cmdline-opts/tls13-ciphers.d
@@ -1,7 +1,8 @@
Long: tls13-ciphers
-Arg: <list of TLS 1.3 ciphersuites>
+Arg: <ciphersuite list>
help: TLS 1.3 cipher suites to use
Protocols: TLS
+Category: tls
---
Specifies which cipher suites to use in the connection if it negotiates TLS
1.3. The list of ciphers suites must specify valid ciphers. Read up on TLS 1.3
diff --git a/docs/cmdline-opts/tlsauthtype.d b/docs/cmdline-opts/tlsauthtype.d
index ede21c2f7..5b283cf9b 100644
--- a/docs/cmdline-opts/tlsauthtype.d
+++ b/docs/cmdline-opts/tlsauthtype.d
@@ -2,6 +2,7 @@ Long: tlsauthtype
Arg: <type>
Help: TLS authentication type
Added: 7.21.4
+Category: tls auth
---
Set TLS authentication type. Currently, the only supported option is "SRP",
for TLS-SRP (RFC 5054). If --tlsuser and --tlspassword are specified but
diff --git a/docs/cmdline-opts/tlspassword.d b/docs/cmdline-opts/tlspassword.d
index 234a1168c..5c6a0fa51 100644
--- a/docs/cmdline-opts/tlspassword.d
+++ b/docs/cmdline-opts/tlspassword.d
@@ -1,6 +1,9 @@
Long: tlspassword
Help: TLS password
Added: 7.21.4
+Category: tls auth
---
Set password for use with the TLS authentication method specified with
--tlsauthtype. Requires that --tlsuser also be set.
+
+This doesn't work with TLS 1.3.
diff --git a/docs/cmdline-opts/tlsuser.d b/docs/cmdline-opts/tlsuser.d
index 72f1e1667..ada152608 100644
--- a/docs/cmdline-opts/tlsuser.d
+++ b/docs/cmdline-opts/tlsuser.d
@@ -2,6 +2,9 @@ Long: tlsuser
Arg: <name>
Help: TLS user name
Added: 7.21.4
+Category: tls auth
---
Set username for use with the TLS authentication method specified with
--tlsauthtype. Requires that --tlspassword also is set.
+
+This doesn't work with TLS 1.3.
diff --git a/docs/cmdline-opts/tlsv1.0.d b/docs/cmdline-opts/tlsv1.0.d
index 2b1f0156a..4f0176f31 100644
--- a/docs/cmdline-opts/tlsv1.0.d
+++ b/docs/cmdline-opts/tlsv1.0.d
@@ -2,6 +2,7 @@ Long: tlsv1.0
Help: Use TLSv1.0 or greater
Protocols: TLS
Added: 7.34.0
+Category: tls
---
Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
diff --git a/docs/cmdline-opts/tlsv1.1.d b/docs/cmdline-opts/tlsv1.1.d
index 405d552bb..b3649f7f4 100644
--- a/docs/cmdline-opts/tlsv1.1.d
+++ b/docs/cmdline-opts/tlsv1.1.d
@@ -2,6 +2,7 @@ Long: tlsv1.1
Help: Use TLSv1.1 or greater
Protocols: TLS
Added: 7.34.0
+Category: tls
---
Forces curl to use TLS version 1.1 or later when connecting to a remote TLS server.
diff --git a/docs/cmdline-opts/tlsv1.2.d b/docs/cmdline-opts/tlsv1.2.d
index bdf1fcf62..dffbccb9d 100644
--- a/docs/cmdline-opts/tlsv1.2.d
+++ b/docs/cmdline-opts/tlsv1.2.d
@@ -2,6 +2,7 @@ Long: tlsv1.2
Help: Use TLSv1.2 or greater
Protocols: TLS
Added: 7.34.0
+Category: tls
---
Forces curl to use TLS version 1.2 or later when connecting to a remote TLS server.
diff --git a/docs/cmdline-opts/tlsv1.3.d b/docs/cmdline-opts/tlsv1.3.d
index 7061a61b2..37d953552 100644
--- a/docs/cmdline-opts/tlsv1.3.d
+++ b/docs/cmdline-opts/tlsv1.3.d
@@ -2,9 +2,12 @@ Long: tlsv1.3
Help: Use TLSv1.3 or greater
Protocols: TLS
Added: 7.52.0
+Category: tls
---
-Forces curl to use TLS version 1.3 or later when connecting to a remote TLS server.
+Forces curl to use TLS version 1.3 or later when connecting to a remote TLS
+server.
-Note that TLS 1.3 is only supported by a subset of TLS backends. At the time
-of this writing, they are BoringSSL, NSS, and Secure Transport (on iOS 11 or
-later, and macOS 10.13 or later).
+If the connection is done without TLS, this option has no effect. This
+includes QUIC-using (HTTP/3) transfers.
+
+Note that TLS 1.3 is not supported by all TLS backends.
diff --git a/docs/cmdline-opts/tlsv1.d b/docs/cmdline-opts/tlsv1.d
index 4cb405697..d4c0c5160 100644
--- a/docs/cmdline-opts/tlsv1.d
+++ b/docs/cmdline-opts/tlsv1.d
@@ -7,6 +7,7 @@ Mutexed: tlsv1.1 tlsv1.2 tlsv1.3
Requires: TLS
See-also: http1.1 http2
Help: Use TLSv1.0 or greater
+Category: tls
---
Tells curl to use at least TLS version 1.x when negotiating with a remote TLS
server. That means TLS version 1.0 or higher
diff --git a/docs/cmdline-opts/tr-encoding.d b/docs/cmdline-opts/tr-encoding.d
index 01bb62bb3..ce1d00325 100644
--- a/docs/cmdline-opts/tr-encoding.d
+++ b/docs/cmdline-opts/tr-encoding.d
@@ -2,6 +2,7 @@ Long: tr-encoding
Added: 7.21.6
Help: Request compressed transfer encoding
Protocols: HTTP
+Category: http
---
Request a compressed Transfer-Encoding response using one of the algorithms
curl supports, and uncompress the data while receiving it.
diff --git a/docs/cmdline-opts/trace-ascii.d b/docs/cmdline-opts/trace-ascii.d
index fceaa7126..fa7e16ccc 100644
--- a/docs/cmdline-opts/trace-ascii.d
+++ b/docs/cmdline-opts/trace-ascii.d
@@ -2,6 +2,7 @@ Long: trace-ascii
Arg: <file>
Help: Like --trace, but without hex output
Mutexed: trace verbose
+Category: verbose
---
Enables a full trace dump of all incoming and outgoing data, including
descriptive information, to the given output file. Use "-" as filename to have
diff --git a/docs/cmdline-opts/trace-time.d b/docs/cmdline-opts/trace-time.d
index 27dcc42cf..19a31a70e 100644
--- a/docs/cmdline-opts/trace-time.d
+++ b/docs/cmdline-opts/trace-time.d
@@ -1,5 +1,6 @@
Long: trace-time
Help: Add time stamps to trace/verbose output
Added: 7.14.0
+Category: verbose
---
Prepends a time stamp to each trace or verbose line that curl displays.
diff --git a/docs/cmdline-opts/trace.d b/docs/cmdline-opts/trace.d
index 334ea5ad6..502dafd71 100644
--- a/docs/cmdline-opts/trace.d
+++ b/docs/cmdline-opts/trace.d
@@ -2,6 +2,7 @@ Long: trace
Arg: <file>
Help: Write a debug trace to FILE
Mutexed: verbose trace-ascii
+Category: verbose
---
Enables a full trace dump of all incoming and outgoing data, including
descriptive information, to the given output file. Use "-" as filename to have
diff --git a/docs/cmdline-opts/unix-socket.d b/docs/cmdline-opts/unix-socket.d
index 812d20f3b..e4ea91d01 100644
--- a/docs/cmdline-opts/unix-socket.d
+++ b/docs/cmdline-opts/unix-socket.d
@@ -3,5 +3,6 @@ Arg: <path>
Help: Connect through this Unix domain socket
Added: 7.40.0
Protocols: HTTP
+Category: connection
---
Connect through this Unix domain socket, instead of using the network.
diff --git a/docs/cmdline-opts/upload-file.d b/docs/cmdline-opts/upload-file.d
index 6f01dbf35..63584b797 100644
--- a/docs/cmdline-opts/upload-file.d
+++ b/docs/cmdline-opts/upload-file.d
@@ -2,6 +2,7 @@ Long: upload-file
Short: T
Arg: <file>
Help: Transfer local FILE to destination
+Category: important upload
---
This transfers the specified local file to the remote URL. If there is no file
part in the specified URL, curl will append the local file name. NOTE that you
diff --git a/docs/cmdline-opts/url.d b/docs/cmdline-opts/url.d
index ce52cdf06..30f0bf72e 100644
--- a/docs/cmdline-opts/url.d
+++ b/docs/cmdline-opts/url.d
@@ -1,6 +1,7 @@
Long: url
Arg: <url>
Help: URL to work with
+Category: curl
---
Specify a URL to fetch. This option is mostly handy when you want to specify
URL(s) in a config file.
@@ -13,3 +14,6 @@ setting a default protocol, see --proto-default for details.
This option may be used any number of times. To control where this URL is
written, use the --output or the --remote-name options.
+
+Warning: On Windows, particular file:// accesses can be converted to network
+accesses by the operating system. Beware!
diff --git a/docs/cmdline-opts/use-ascii.d b/docs/cmdline-opts/use-ascii.d
index d59fad922..3a5a6a4f8 100644
--- a/docs/cmdline-opts/use-ascii.d
+++ b/docs/cmdline-opts/use-ascii.d
@@ -2,6 +2,7 @@ Short: B
Long: use-ascii
Help: Use ASCII/text transfer
Protocols: FTP LDAP
+Category: misc
---
Enable ASCII transfer. For FTP, this can also be enforced by using a URL that
ends with ";type=A". This option causes data sent to stdout to be in text mode
diff --git a/docs/cmdline-opts/user-agent.d b/docs/cmdline-opts/user-agent.d
index de73f723f..ec2ca82bb 100644
--- a/docs/cmdline-opts/user-agent.d
+++ b/docs/cmdline-opts/user-agent.d
@@ -3,10 +3,15 @@ Long: user-agent
Arg: <name>
Help: Send User-Agent <name> to server
Protocols: HTTP
+Category: important http
---
Specify the User-Agent string to send to the HTTP server. To encode blanks in
the string, surround the string with single quote marks. This header can also
be set with the --header or the --proxy-header options.
+If you give an empty argument to --user-agent (""), it will remove the header
+completely from the request. If you prefer a blank header, you can set it to a
+single space (" ").
+
If this option is used several times, the last one will be used.
diff --git a/docs/cmdline-opts/user.d b/docs/cmdline-opts/user.d
index 7001d28ab..b588700c0 100644
--- a/docs/cmdline-opts/user.d
+++ b/docs/cmdline-opts/user.d
@@ -2,6 +2,7 @@ Long: user
Short: u
Arg: <user:password>
Help: Server user and password
+Category: important auth
---
Specify the user name and password to use for server authentication. Overrides
--netrc and --netrc-optional.
diff --git a/docs/cmdline-opts/verbose.d b/docs/cmdline-opts/verbose.d
index 5d3352183..8db1ea222 100644
--- a/docs/cmdline-opts/verbose.d
+++ b/docs/cmdline-opts/verbose.d
@@ -3,6 +3,7 @@ Long: verbose
Mutexed: trace trace-ascii
Help: Make the operation more talkative
See-also: include
+Category: important verbose
---
Makes curl verbose during the operation. Useful for debugging and seeing
what's going on "under the hood". A line starting with '>' means "header data"
diff --git a/docs/cmdline-opts/version.d b/docs/cmdline-opts/version.d
index cd35f27fb..52c29f177 100644
--- a/docs/cmdline-opts/version.d
+++ b/docs/cmdline-opts/version.d
@@ -1,6 +1,7 @@
Long: version
Short: V
Help: Show version number and quit
+Category: important curl
---
Displays information about curl and the libcurl version it uses.
@@ -13,48 +14,56 @@ reports to support.
The third line (starts with "Features:") shows specific features libcurl
reports to offer. Available features include:
.RS
+.IP "alt-svc"
+Support for the Alt-Svc: header is provided.
+.IP "AsynchDNS"
+This curl uses asynchronous name resolves. Asynchronous name resolves can be
+done using either the c-ares or the threaded resolver backends.
+.IP "brotli"
+Support for automatic brotli compression over HTTP(S).
+.IP "CharConv"
+curl was built with support for character set conversions (like EBCDIC)
+.IP "Debug"
+This curl uses a libcurl built with Debug. This enables more error-tracking
+and memory debugging etc. For curl-developers only!
+.IP "GSS-API"
+GSS-API is supported.
+.IP "HTTP2"
+HTTP/2 support has been built-in.
+.IP "HTTP3"
+HTTP/3 support has been built-in.
+.IP "HTTPS-proxy"
+This curl is built to support HTTPS proxy.
+.IP "IDN"
+This curl supports IDN - international domain names.
.IP "IPv6"
You can use IPv6 with this.
.IP "krb4"
Krb4 for FTP is supported.
-.IP "SSL"
-SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S
-and so on.
+.IP "Largefile"
+This curl supports transfers of large files, files larger than 2GB.
.IP "libz"
Automatic decompression of compressed files over HTTP is supported.
+.IP "Metalink"
+This curl supports Metalink
+.IP "MultiSSL"
+This curl supports multiple TLS backends.
.IP "NTLM"
NTLM authentication is supported.
-.IP "Debug"
-This curl uses a libcurl built with Debug. This enables more error-tracking
-and memory debugging etc. For curl-developers only!
-.IP "AsynchDNS"
-This curl uses asynchronous name resolves. Asynchronous name resolves can be
-done using either the c-ares or the threaded resolver backends.
+.IP "NTLM"
+NTLM authentication is supported.
+.IP "PSL"
+PSL is short for Public Suffix List and means that this curl has been built
+with knowledge about "public suffixes".
.IP "SPNEGO"
SPNEGO authentication is supported.
-.IP "Largefile"
-This curl supports transfers of large files, files larger than 2GB.
-.IP "IDN"
-This curl supports IDN - international domain names.
-.IP "GSS-API"
-GSS-API is supported.
+.IP "SSL"
+SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S
+and so on.
.IP "SSPI"
SSPI is supported.
.IP "TLS-SRP"
SRP (Secure Remote Password) authentication is supported for TLS.
-.IP "HTTP2"
-HTTP/2 support has been built-in.
.IP "UnixSockets"
Unix sockets support is provided.
-.IP "HTTPS-proxy"
-This curl is built to support HTTPS proxy.
-.IP "Metalink"
-This curl supports Metalink (both version 3 and 4 (RFC 5854)), which
-describes mirrors and hashes. curl will use mirrors for failover if
-there are errors (such as the file or server not being available).
-.IP "PSL"
-PSL is short for Public Suffix List and means that this curl has been built
-with knowledge about "public suffixes".
-.IP "MultiSSL"
-This curl supports multiple TLS backends.
.RE
diff --git a/docs/cmdline-opts/write-out.d b/docs/cmdline-opts/write-out.d
index 2fc0ff21a..28b9a13a9 100644
--- a/docs/cmdline-opts/write-out.d
+++ b/docs/cmdline-opts/write-out.d
@@ -2,6 +2,7 @@ Long: write-out
Short: w
Arg: <format>
Help: Use output FORMAT after completion
+Category: verbose
---
Make curl display information on stdout after a completed transfer. The format
is a string that may contain plain text mixed with any number of
@@ -50,6 +51,9 @@ curl CONNECT request. (Added in 7.12.4)
.B http_version
The http version that was effectively used. (Added in 7.50.0)
.TP
+.B json
+A JSON object with all available keys.
+.TP
.B local_ip
The IP address of the local end of the most recently done connection - can be
either IPv4 or IPv6 (Added in 7.29.0)
@@ -57,9 +61,16 @@ either IPv4 or IPv6 (Added in 7.29.0)
.B local_port
The local port number of the most recently done connection (Added in 7.29.0)
.TP
+.B method
+The http method used in the most recent HTTP request (Added in 7.72.0)
+.TP
.B num_connects
Number of new connects made in the recent transfer. (Added in 7.12.3)
.TP
+.B num_headers
+The number of response headers in the most recent request (restarted at each
+ redirect). Note that the status line IS NOT a header. (Added in 7.73.0)
+.TP
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.TP
@@ -79,6 +90,10 @@ IPv4 or IPv6 (Added in 7.29.0)
.B remote_port
The remote port number of the most recently done connection (Added in 7.29.0)
.TP
+.B response_code
+The numerical response code that was found in the last transfer (formerly
+known as "http_code"). (Added in 7.18.2)
+.TP
.B scheme
The URL scheme (sometimes called protocol) that was effectively used (Added in 7.52.0)
.TP
diff --git a/docs/cmdline-opts/xattr.d b/docs/cmdline-opts/xattr.d
index b7553daeb..4b64c6cbf 100644
--- a/docs/cmdline-opts/xattr.d
+++ b/docs/cmdline-opts/xattr.d
@@ -1,5 +1,6 @@
Long: xattr
Help: Store metadata in extended file attributes
+Category: misc
---
When saving output to a file, this option tells curl to store certain file
metadata in extended file attributes. Currently, the URL is stored in the
diff --git a/docs/curl-config.1 b/docs/curl-config.1
index 9711f4bb0..2bf853af8 100644
--- a/docs/curl-config.1
+++ b/docs/curl-config.1
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl-config 1 "November 30, 2017" "Curl 7.67.0" "curl-config manual"
+.TH curl-config 1 "April 26, 2020" "Curl 7.73.0" "curl-config manual"
.SH NAME
curl-config \- Get information about a libcurl installation
@@ -75,8 +75,8 @@ to link your application with libcurl statically. (Added in 7.17.1)
Outputs version information about the installed libcurl.
.IP "--vernum"
Outputs version information about the installed libcurl, in numerical mode.
-This outputs the version number, in hexadecimal, with 8 bits for each part;
-major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
+This outputs the version number, in hexadecimal, with 8 bits for each part:
+major, minor, and patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
12.13.14 would appear as 0c0d0e... Note that the initial zero might be
omitted. (This option was broken in the 7.15.0 release.)
.SH "EXAMPLES"
diff --git a/docs/curl.1 b/docs/curl.1
index 94ac9706a..cf42b91da 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -22,7 +22,7 @@
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
-.TH curl 1 "November 16, 2016" "Curl 7.67.0" "Curl Manual"
+.TH curl 1 "November 16, 2016" "Curl 7.73.0" "Curl Manual"
.SH NAME
curl \- transfer a URL
@@ -32,8 +32,9 @@ curl \- transfer a URL
.B curl
is a tool to transfer data from or to a server, using one of the supported
protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP,
-LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET
-and TFTP). The command is designed to work without user interaction.
+LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP,
+SMTPS, TELNET and TFTP). The command is designed to work without user
+interaction.
curl offers a busload of useful tricks like proxy support, user
authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer
@@ -47,22 +48,22 @@ The URL syntax is protocol-dependent. You'll find a detailed description in
RFC 3986.
You can specify multiple URLs or parts of URLs by writing part sets within
-braces as in:
+braces and quoting the URL as in:
- http://site.{one,two,three}.com
+ "http://site.{one,two,three}.com"
or you can get sequences of alphanumeric series by using [] as in:
- ftp://ftp.example.com/file[1-100].txt
+ "ftp://ftp.example.com/file[1-100].txt"
- ftp://ftp.example.com/file[001-100].txt (with leading zeros)
+ "ftp://ftp.example.com/file[001-100].txt" (with leading zeros)
- ftp://ftp.example.com/file[a-z].txt
+ "ftp://ftp.example.com/file[a-z].txt"
Nested sequences are not supported, but you can use several ones next to each
other:
- http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html
+ "http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html"
You can specify any amount of URLs on the command line. They will be fetched
in a sequential manner in the specified order. You can specify command line
@@ -71,9 +72,9 @@ options and URLs mixed and in any order on the command line.
You can specify a step counter for the ranges to get every Nth number or
letter:
- http://example.com/file[1-100:10].txt
+ "http://example.com/file[1-100:10].txt"
- http://example.com/file[a-z:2].txt
+ "http://example.com/file[a-z:2].txt"
When using [] or {} sequences when invoked from a command line prompt, you
probably have to put the full URL within double quotes to avoid the shell from
@@ -83,7 +84,7 @@ for example '&', '?' and '*'.
Provide the IPv6 zone index in the URL with an escaped percentage sign and the
interface name. Like in
- http://[fe80::3%25eth0]/
+ "http://[fe80::3%25eth0]/"
If you specify URL without protocol:// prefix, curl will attempt to guess what
protocol you might want. It will then default to HTTP but try other protocols
@@ -99,6 +100,55 @@ getting many files from the same server will not do multiple connects /
handshakes. This improves speed. Of course this is only done on files
specified on a single command line and cannot be used between separate curl
invokes.
+.SH PROTOCOLS
+curl supports numerous protocols, or put in URL terms: schemes. Your
+particular build may not support them all.
+.IP DICT
+Lets you lookup words using online dictionaries.
+.IP FILE
+Read or write local files. curl does not support accessing file:// URL
+remotely, but when running on Microsft Windows using the native UNC approach
+will work.
+.IP FTP(S)
+curl supports the File Transfer Protocol with a lot of tweaks and levers. With
+or without using TLS.
+.IP GOPHER
+Retrieve files.
+.IP HTTP(S)
+curl supports HTTP with numerous options and variations. It can speak HTTP
+version 0.9, 1.0, 1.1, 2 and 3 depending on build options and the correct
+command line options.
+.IP IMAP(S)
+Using the mail reading protocol, curl can "download" emails for you. With or
+without using TLS.
+.IP LDAP(S)
+curl can do directory lookups for you, with or without TLS.
+.IP MQTT
+curl supports MQTT version 3. Downloading over MQTT equals "subscribe" to a
+topic while uploading/posting equals "publish" on a topic. MQTT support is
+experimental and TLS based MQTT is not supported (yet).
+.IP POP3(S)
+Downloading from a pop3 server means getting a mail. With or without using
+TLS.
+.IP RTMP(S)
+The Realtime Messaging Protocol is primarily used to server streaming media
+and curl can download it.
+.IP RTSP
+curl supports RTSP 1.0 downloads.
+.IP SCP
+curl supports SSH version 2 scp transfers.
+.IP SFTP
+curl supports SFTP (draft 5) done over SSH version 2.
+.IP SMB(S)
+curl supports SMB version 1 for upload and download.
+.IP SMTP(S)
+Uploading contents to an SMTP server means sending an email. With or without
+TLS.
+.IP TELNET
+Telling curl to fetch a telnet URL starts an interactive session where it
+sends what it reads on stdin and outputs what the server sends it.
+.IP TFTP
+curl can do TFTP downloads and uploads.
.SH "PROGRESS METER"
curl normally displays a progress meter during operations, indicating the
amount of transferred data, transfer speeds and estimated time left, etc. The
@@ -147,7 +197,7 @@ the <path> argument should not have this leading character.
Added in 7.53.0.
.IP "--alt-svc <file name>"
-(HTTPS) WARNING: this option is experiemental. Do not use in production.
+(HTTPS) WARNING: this option is experimental. Do not use in production.
This option enables the alt-svc parser in curl. If the file name points to an
existing alt-svc cache file, that will be used. After a completed transfer,
@@ -157,7 +207,7 @@ Specify a "" file name (zero length) to avoid loading/saving and make curl
just handle the cache in memory.
If this option is used several times, curl will load contents from all the
-files but the the last one will be used for saving.
+files but the last one will be used for saving.
Added in 7.64.1.
.IP "--anyauth"
@@ -174,7 +224,7 @@ fail.
Used together with \fI-u, --user\fP.
-See also \fI--proxy-anyauth\fP and \fI--basic\fP and \fI--digest\fP.
+See also \fI--proxy-anyauth\fP, \fI--basic\fP and \fI--digest\fP.
.IP "-a, --append"
(FTP SFTP) When used in an upload, this makes curl append to the target file instead of
overwriting it. If the remote file doesn't exist, it will be created. Note
@@ -245,7 +295,7 @@ and P12 are recognized types. If not specified, PEM is assumed.
If this option is used several times, the last one will be used.
-See also \fI-E, --cert\fP and \fI--key\fP and \fI--key-type\fP.
+See also \fI-E, --cert\fP, \fI--key\fP and \fI--key-type\fP.
.IP "-E, --cert <certificate[:password]>"
(TLS) Tells curl to use the specified client certificate file when getting a file
with HTTPS, FTPS or another SSL-based protocol. The certificate must be in
@@ -291,7 +341,7 @@ LocalMachineEnterprise.
If this option is used several times, the last one will be used.
-See also \fI--cert-type\fP and \fI--key\fP and \fI--key-type\fP.
+See also \fI--cert-type\fP, \fI--key\fP and \fI--key-type\fP.
.IP "--ciphers <list of ciphers>"
(TLS) Specifies which ciphers to use in the connection. The list of ciphers must
specify valid ciphers. Read up on SSL cipher list details on this URL:
@@ -306,8 +356,10 @@ This is a request, not an order; the server may or may not do it.
Added in 7.56.0.
.IP "--compressed"
(HTTP) Request a compressed response using one of the algorithms curl supports, and
-save the uncompressed document. If this option is used and the server sends
-an unsupported encoding, curl will report an error.
+automatically decompress the content. Headers are not modified.
+
+If this option is used and the server sends an unsupported encoding, curl will
+report an error.
.IP "-K, --config <file>"
Specify a text file to read curl arguments from. The command line arguments
@@ -340,13 +392,19 @@ When curl is invoked, it (unless \fI-q, --disable\fP is used) checks for a defau
config file and uses it if found. The default config file is checked for in
the following places in this order:
-1) curl tries to find the "home dir": It first checks for the CURL_HOME and
-then the HOME environment variables. Failing that, it uses getpwuid() on
-Unix-like systems (which returns the home dir given the current user in your
-system). On Windows, it then checks for the APPDATA variable, or as a last
-resort the '%USERPROFILE%\\Application Data'.
+1) Use the CURL_HOME environment variable if set
+
+2) Use the XDG_CONFIG_HOME environment variable if set (Added in 7.73.0)
+
+3) Use the HOME environment variable if set
+
+4) Non-windows: use getpwuid to find the home directory
+
+5) Windows: use APPDATA if set
+
+6) Windows: use "USERPROFILE\Application Data" if set
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+7) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
@@ -433,7 +491,7 @@ to read previously stored cookie from. This option also activates the cookie
engine which will make curl record incoming cookies, which may be handy if
you're using this in combination with the \fI-L, --location\fP option or do multiple URL
transfers on the same invoke. If the file name is exactly a minus ("-"), curl
-will instead the contents from stdin.
+will instead read the contents from stdin.
The file format of the file to read cookies from should be plain HTTP headers
(Set-Cookie style) or the Netscape/Mozilla cookie file format.
@@ -461,6 +519,8 @@ necessary local directory hierarchy as needed. This option creates the dirs
mentioned with the \fI-o, --output\fP option, nothing else. If the --output file name
uses no dir or if the dirs it mentions already exist, no dir will be created.
+Created dirs are made with mode 0750 on unix style file systems.
+
To create remote directories when using FTP or SFTP, try \fI--ftp-create-dirs\fP.
.IP "--crlf"
(FTP SMTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
@@ -473,6 +533,20 @@ specify peer certificates that are to be considered revoked.
If this option is used several times, the last one will be used.
Added in 7.19.7.
+.IP "--curves <algorithm list>"
+(TLS) Tells curl to request specific curves to use during SSL session establishment
+according to RFC 8422, 5.1. Multiple algorithms can be provided by separating
+them with ":" (e.g. "X25519:P-521"). The parameter is available identically
+in the "openssl s_client/s_server" utilities.
+
+\fI--curves\fP allows a OpenSSL powered curl to make SSL-connections with exactly
+the (EC) curve requested by the client, avoiding intransparent client/server
+negotiations.
+
+If this option is set, the default curves list built into openssl will be
+ignored.
+
+Added in 7.73.0.
.IP "--data-ascii <data>"
(HTTP) This is just an alias for \fI-d, --data\fP.
.IP "--data-binary <data>"
@@ -524,7 +598,7 @@ name is expected to be URL-encoded already.
See also \fI-d, --data\fP and \fI--data-raw\fP. Added in 7.18.0.
.IP "-d, --data <data>"
-(HTTP) Sends the specified data in a POST request to the HTTP server, in the same way
+(HTTP MQTT) Sends the specified data in a POST request to the HTTP server, in the same way
that a browser does when a user has filled in an HTML form and presses the
submit button. This will cause curl to pass the data to the server using the
content-type application/x-www-form-urlencoded. Compare to \fI-F, --form\fP.
@@ -540,14 +614,13 @@ data pieces specified will be merged together with a separating
chunk that looks like \&'name=daniel&skill=lousy'.
If you start the data with the letter @, the rest should be a file name to
-read the data from, or - if you want curl to read the data from
-stdin. Multiple files can also be specified. Posting data from a file named
-\&'foobar' would thus be done with \fI-d, --data\fP @foobar. When --data is told to read
-from a file like that, carriage returns and newlines will be stripped out. If
-you don't want the @ character to have a special interpretation use \fI--data-raw\fP
-instead.
-
-See also \fI--data-binary\fP and \fI--data-urlencode\fP and \fI--data-raw\fP. This option overrides \fI-F, --form\fP and \fI-I, --head\fP and \fI-T, --upload-file\fP.
+read the data from, or - if you want curl to read the data from stdin. Posting
+data from a file named \&'foobar' would thus be done with \fI-d, --data\fP @foobar. When
+\fI-d, --data\fP is told to read from a file like that, carriage returns and newlines
+will be stripped out. If you don't want the @ character to have a special
+interpretation use \fI--data-raw\fP instead.
+
+See also \fI--data-binary\fP, \fI--data-urlencode\fP and \fI--data-raw\fP. This option overrides \fI-F, --form\fP and \fI-I, --head\fP and \fI-T, --upload-file\fP.
.IP "--delegation <LEVEL>"
(GSS/kerberos) Set LEVEL to tell the server what it is allowed to delegate when it
comes to user credentials.
@@ -567,7 +640,7 @@ combination with the normal \fI-u, --user\fP option to set user name and passwor
If this option is used several times, only the first one is used.
-See also \fI-u, --user\fP and \fI--proxy-digest\fP and \fI--anyauth\fP. This option overrides \fI--basic\fP and \fI--ntlm\fP and \fI--negotiate\fP.
+See also \fI-u, --user\fP, \fI--proxy-digest\fP and \fI--anyauth\fP. This option overrides \fI--basic\fP and \fI--ntlm\fP and \fI--negotiate\fP.
.IP "--disable-eprt"
(FTP) Tell curl to disable the use of the EPRT and LPRT commands when doing active
FTP transfers. Curl will normally always first attempt to use EPRT, then LPRT
@@ -662,6 +735,34 @@ See also \fI--random-file\fP.
(TLS) Select the OpenSSL crypto engine to use for cipher operations. Use \fI--engine\fP
list to print a list of build-time supported engines. Note that not all (or
none) of the engines may be available at run-time.
+.IP "--etag-compare <file>"
+(HTTP) This option makes a conditional HTTP request for the specific
+ETag read from the given file by sending a custom If-None-Match
+header using the extracted ETag.
+
+For correct results, make sure that specified file contains only a single
+line with a desired ETag. An empty file is parsed as an empty ETag.
+
+Use the option \fI--etag-save\fP to first save the ETag from a response, and
+then use this option to compare using the saved ETag in a subsequent request.
+
+\fCOMPARISON\fP: There are 2 types of comparison or ETags, Weak and Strong.
+This option expects, and uses a strong comparison.
+
+Added in 7.68.0.
+.IP "--etag-save <file>"
+(HTTP) This option saves an HTTP ETag to the specified file. Etag is
+usually part of headers returned by a request. When server sends an
+ETag, it must be enveloped by a double quote. This option extracts the
+ETag without the double quotes and saves it into the <file>.
+
+A server can send a week ETag which is prefixed by "W/". This identifier
+is not considered, and only relevant ETag between quotation marks is parsed.
+
+It an ETag wasn't send by the server or it cannot be parsed, and empty
+file is created.
+
+Added in 7.68.0.
.IP "--expect100-timeout <seconds>"
(HTTP) Maximum time in seconds that you allow curl to wait for a 100-continue
response when curl emits an Expects: 100-continue header in its request. By
@@ -746,11 +847,11 @@ form-field to which the file portrait.jpg will be the input:
curl -F profile=@portrait.jpg https://example.com/upload.cgi
-Example: send a your name and shoe size in two text fields to the server:
+Example: send your name and shoe size in two text fields to the server:
curl -F name=John -F shoesize=11 https://example.com/
-Example: send a your essay in a text field to the server. Send it as a plain
+Example: send your essay in a text field to the server. Send it as a plain
text field, but get the contents for it from a local file:
curl -F "story=<hugefile.txt" https://example.com/
@@ -1046,9 +1147,13 @@ the header being sent to other hosts than the original host, so sensitive
headers should be used with caution combined with following redirects.
This option can be used multiple times to add/replace/remove multiple headers.
-.IP "-h, --help"
-Usage help. This lists all current command line options with a short
-description.
+.IP "-h, --help <category>"
+Usage help. This lists all commands of the <category>.
+If no arg was provided, curl will display the most important
+command line arguments and the list of categories.
+If the argument "all" was provided, curl will display all options available.
+If the argument "category" was provided, curl will display all categories and
+their meanings.
.IP "--hostpubmd5 <md5>"
(SFTP SCP) Pass a string containing 32 hexadecimal digits. The string should
be the 128 bit MD5 checksum of the remote host's public key, curl will refuse
@@ -1085,7 +1190,7 @@ protocol version in the TLS handshake.
See also \fI--http1.1\fP and \fI--http3\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.
.IP "--http3"
(HTTP)
-WARNING: this option is experiemental. Do not use in production.
+WARNING: this option is experimental. Do not use in production.
Tells curl to use HTTP version 3 directly to the host and port number used in
the URL. A normal HTTP/3 transaction will be done to a host and then get
@@ -1236,7 +1341,7 @@ Note: When combined with \fI-X, --request\fP, this option can be used to send an
command instead, so the user may use the email's unique identifier rather than
it's message id to make the request.
-Added in 7.21.5.
+Added in 4.0.
.IP "--local-port <num/range>"
Set a preferred single number or range (FROM-TO) of local port numbers to use
for the connection(s). Note that port numbers by nature are a scarce resource
@@ -1262,14 +1367,16 @@ intercept the user+password. See also \fI--location-trusted\fP on how to change
this. You can limit the amount of redirects to follow by using the
\fI--max-redirs\fP option.
-When curl follows a redirect and the request is not a plain GET (for example
-POST or PUT), it will do the following request with a GET if the HTTP response
-was 301, 302, or 303. If the response code was any other 3xx code, curl will
-re-send the following request using the same unmodified method.
+When curl follows a redirect and if the request is a POST, it will do the
+following request with a GET if the HTTP response was 301, 302, or 303. If the
+response code was any other 3xx code, curl will re-send the following request
+using the same unmodified method.
+
+You can tell curl to not change POST requests to GET after a 30x response by
+using the dedicated options for that: \fI--post301\fP, \fI--post302\fP and \fI--post303\fP.
-You can tell curl to not change the non-GET request method to GET after a 30x
-response by using the dedicated options for that: \fI--post301\fP, \fI--post302\fP and
-\fI--post303\fP.
+The method set with \fI-X, --request\fP overrides the method curl would otherwise select
+to use.
.IP "--login-options <options>"
(IMAP POP3 SMTP) Specify the login options to use during server authentication.
@@ -1291,6 +1398,18 @@ See also \fI--mail-rcpt\fP and \fI--mail-from\fP. Added in 7.25.0.
(SMTP) Specify a single address that the given mail should get sent from.
See also \fI--mail-rcpt\fP and \fI--mail-auth\fP. Added in 7.20.0.
+.IP "--mail-rcpt-allowfails"
+(SMTP) When sending data to multiple recipients, by default curl will abort SMTP
+conversation if at least one of the recipients causes RCPT TO command to
+return an error.
+
+The default behavior can be changed by passing \fI--mail-rcpt-allowfails\fP
+command-line option which will make curl ignore errors and proceed with the
+remaining valid recipients.
+
+In case when all recipients cause RCPT TO command to fail, curl will abort SMTP
+conversation and return the error received from to the last RCPT TO command.
+Added in 7.69.0.
.IP "--mail-rcpt <address>"
(SMTP) Specify a single address, user name or mailing list name. Repeat this
option several times to send to multiple recipients.
@@ -1375,7 +1494,7 @@ and password from the \fI-u, --user\fP option aren't actually used.
If this option is used several times, only the first one is used.
-See also \fI--basic\fP and \fI--ntlm\fP and \fI--anyauth\fP and \fI--proxy-negotiate\fP.
+See also \fI--basic\fP, \fI--ntlm\fP, \fI--anyauth\fP and \fI--proxy-negotiate\fP.
.IP "--netrc-file <filename>"
This option is similar to \fI-n, --netrc\fP, except that you provide the path (absolute
or relative) to the netrc file that curl should use. You can only specify one
@@ -1497,24 +1616,39 @@ If this option is used several times, only the first one is used.
See also \fI--proxy-ntlm\fP. \fI--ntlm\fP requires that the underlying libcurl was built to support TLS. This option overrides \fI--basic\fP and \fI--negotiate\fP and \fI--digest\fP and \fI--anyauth\fP.
.IP "--oauth2-bearer <token>"
-(IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token
+(IMAP POP3 SMTP HTTP) Specify the Bearer Token for OAUTH 2.0 server authentication. The Bearer Token
is used in conjunction with the user name which can be specified as part of
the \fI--url\fP or \fI-u, --user\fP options.
The Bearer Token and user name are formatted according to RFC 6750.
If this option is used several times, the last one will be used.
+.IP "--output-dir <dir>"
+
+This option specifies the directory in which files should be stored, when
+\fI-O, --remote-name\fP or \fI-o, --output\fP are used.
+
+The given output directory is used for all URLs and output options on the
+command line, up until the first \fI-:, --next\fP.
+
+If the specified target directory doesn't exist, the operation will fail
+unless \fI--create-dirs\fP is also used.
+
+If this option is used multiple times, the last specified directory will be
+used.
+
+See also \fI-O, --remote-name\fP and \fI-J, --remote-header-name\fP. Added in 7.73.0.
.IP "-o, --output <file>"
Write output to <file> instead of stdout. If you are using {} or [] to fetch
-multiple documents, you can use '#' followed by a number in the <file>
-specifier. That variable will be replaced with the current string for the URL
-being fetched. Like in:
+multiple documents, you should quote the URL and you can use '#' followed by a
+number in the <file> specifier. That variable will be replaced with the current
+string for the URL being fetched. Like in:
- curl http://{one,two}.example.com -o "file_#1.txt"
+ curl "http://{one,two}.example.com" -o "file_#1.txt"
or use several variables like:
- curl http://{site,host}.host[1-5].com -o "#1_#2"
+ curl "http://{site,host}.host[1-5].com" -o "#1_#2"
You may use this option as many times as the number of URLs you have. For
example, if you specify two URLs on the same command line, you can use it like
@@ -1532,7 +1666,14 @@ See also the \fI--create-dirs\fP option to create the local directories
dynamically. Specifying the output as '-' (a single dash) will force the
output to be done to stdout.
-See also \fI-O, --remote-name\fP and \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
+See also \fI-O, --remote-name\fP, \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
+.IP "--parallel-immediate"
+When doing parallel transfers, this option will instruct curl that it should
+rather prefer opening up more connections in parallel at once rather than
+waiting to see if new transfers can be added as multiplexed streams on another
+connection.
+
+See also \fI-Z, --parallel\fP and \fI--parallel-max\fP. Added in 7.68.0.
.IP "--parallel-max"
When asked to do parallel transfers, using \fI-Z, --parallel\fP, this option controls
the maximum amount of transfers to do simultaneously.
@@ -1583,7 +1724,7 @@ in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L, --location\fP.
-See also \fI--post302\fP and \fI--post303\fP and \fI-L, --location\fP. Added in 7.17.1.
+See also \fI--post302\fP, \fI--post303\fP and \fI-L, --location\fP. Added in 7.17.1.
.IP "--post302"
(HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST requests into GET
requests when following a 302 redirection. The non-RFC behaviour is ubiquitous
@@ -1591,14 +1732,14 @@ in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may require a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L, --location\fP.
-See also \fI--post301\fP and \fI--post303\fP and \fI-L, --location\fP. Added in 7.19.1.
+See also \fI--post301\fP, \fI--post303\fP and \fI-L, --location\fP. Added in 7.19.1.
.IP "--post303"
(HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST requests into GET
requests when following 303 redirections. A server may require a POST to
remain a POST after a 303 redirection. This option is meaningful only when
using \fI-L, --location\fP.
-See also \fI--post302\fP and \fI--post301\fP and \fI-L, --location\fP. Added in 7.26.0.
+See also \fI--post302\fP, \fI--post301\fP and \fI-L, --location\fP. Added in 7.26.0.
.IP "--preproxy [protocol://]host[:port]"
Use the specified SOCKS proxy before connecting to an HTTP or HTTPS \fI-x, --proxy\fP. In
such a case curl first connects to the SOCKS proxy and then connects (through
@@ -1704,21 +1845,21 @@ See also \fI--proto-redir\fP and \fI--proto-default\fP. Added in 7.20.2.
Tells curl to pick a suitable authentication method when communicating with
the given HTTP proxy. This might cause an extra request/response round-trip.
-See also \fI-x, --proxy\fP and \fI--proxy-basic\fP and \fI--proxy-digest\fP. Added in 7.13.2.
+See also \fI-x, --proxy\fP, \fI--proxy-basic\fP and \fI--proxy-digest\fP. Added in 7.13.2.
.IP "--proxy-basic"
Tells curl to use HTTP Basic authentication when communicating with the given
proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is the
default authentication method curl uses with proxies.
-See also \fI-x, --proxy\fP and \fI--proxy-anyauth\fP and \fI--proxy-digest\fP.
+See also \fI-x, --proxy\fP, \fI--proxy-anyauth\fP and \fI--proxy-digest\fP.
.IP "--proxy-cacert <file>"
Same as \fI--cacert\fP but used in HTTPS proxy context.
-See also \fI--proxy-capath\fP and \fI--cacert\fP and \fI--capath\fP and \fI-x, --proxy\fP. Added in 7.52.0.
+See also \fI--proxy-capath\fP, \fI--cacert\fP, \fI--capath\fP and \fI-x, --proxy\fP. Added in 7.52.0.
.IP "--proxy-capath <dir>"
Same as \fI--capath\fP but used in HTTPS proxy context.
-See also \fI--proxy-cacert\fP and \fI-x, --proxy\fP and \fI--capath\fP. Added in 7.52.0.
+See also \fI--proxy-cacert\fP, \fI-x, --proxy\fP and \fI--capath\fP. Added in 7.52.0.
.IP "--proxy-cert-type <type>"
Same as \fI--cert-type\fP but used in HTTPS proxy context.
@@ -1739,7 +1880,7 @@ Added in 7.52.0.
Tells curl to use HTTP Digest authentication when communicating with the given
proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host.
-See also \fI-x, --proxy\fP and \fI--proxy-anyauth\fP and \fI--proxy-basic\fP.
+See also \fI-x, --proxy\fP, \fI--proxy-anyauth\fP and \fI--proxy-basic\fP.
.IP "--proxy-header <header/@file>"
(HTTP) Extra header to include in the request when sending HTTP to a proxy. You may
specify any number of extra headers. This is the equivalent option to \fI-H, --header\fP
@@ -1934,6 +2075,10 @@ itself before sending them to the server. File names may be quoted
shell-style to embed spaces or special characters. Following is the list of
all supported SFTP quote commands:
.RS
+.IP "atime date file"
+The atime command sets the last access time of the file named by the file
+operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "chgrp group file"
The chgrp command sets the group ID of the file named by the file operand to
the group ID specified by the group operand. The group operand is a decimal
@@ -1950,6 +2095,10 @@ The ln and symlink commands create a symbolic link at the target_file location
pointing to the source_file location.
.IP "mkdir directory_name"
The mkdir command creates the directory named by the directory_name operand.
+.IP "mtime date file"
+The mtime command sets the last modification time of the file named by the
+file operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "pwd"
The pwd command returns the absolute pathname of the current working directory.
.IP "rename source target"
@@ -2109,7 +2258,7 @@ Specifies a custom IMAP command to use instead of LIST. (Added in 7.30.0)
Specifies a custom SMTP command to use instead of HELP or VRFY. (Added in 7.34.0)
If this option is used several times, the last one will be used.
-.IP "--resolve <host:port:address[,address]...>"
+.IP "--resolve <host:port:addr[,addr]...>"
Provide a custom address for a specific host and port pair. Using this, you
can make the curl requests(s) use a specified address and prevent the
otherwise normally resolved address to be used. Consider it a sort of
@@ -2134,6 +2283,24 @@ Support for resolving with wildcard was added in 7.64.0.
This option can be used many times to add many host names to resolve.
Added in 7.21.3.
+.IP "--retry-all-errors"
+Retry on any error. This option is used together with \fI--retry\fP.
+
+This option is the "sledgehammer" of retrying. Do not use this option by
+default (eg in curlrc), there may be unintended consequences such as sending or
+receiving duplicate data. Do not use with redirected input or output. You'd be
+much better off handling your unique problems in shell script. Please read the
+example below.
+
+Warning: For server compatibility curl attempts to retry failed flaky transfers
+as close as possible to how they were started, but this is not possible with
+redirected input or output. For example, before retrying it removes output data
+from a failed partial transfer that was written to an output file. However this
+is not true of data redirected to a | pipe or > file, which are not reset. We
+strongly suggest don't parse or record output via redirect in combination with
+this option, since you may receive duplicate data.
+
+Added in 7.71.0.
.IP "--retry-connrefused"
In addition to the other conditions, consider ECONNREFUSED as a transient
error too for \fI--retry\fP. This option is used together with --retry.
@@ -2177,7 +2344,7 @@ one was present to know when to issue the next retry.
If this option is used several times, the last one will be used.
Added in 7.12.3.
-.IP "--sasl-authzid"
+.IP "--sasl-authzid <identity>"
Use this authorisation identity (authzid), during SASL PLAIN authentication,
in addition to the authentication identity (authcid) as specified by \fI-u, --user\fP.
@@ -2199,6 +2366,8 @@ Examples: \fI--negotiate\fP \fI--service-name\fP sockd would use sockd/server-na
Added in 7.43.0.
.IP "-S, --show-error"
When used with \fI-s, --silent\fP, it makes curl show an error message if it fails.
+
+See also \fI--no-progress-meter\fP.
.IP "-s, --silent"
Silent or quiet mode. Don't show progress meter or error messages. Makes Curl
mute. It will still output the data you ask for, potentially even to the
@@ -2207,7 +2376,7 @@ terminal/stdout unless you redirect it.
Use \fI-S, --show-error\fP in addition to this option to disable progress meter but
still show error messages.
-See also \fI-v, --verbose\fP and \fI--stderr\fP.
+See also \fI-v, --verbose\fP, \fI--stderr\fP and \fI--no-progress-meter\fP.
.IP "--socks4 <host[:port]>"
Use the specified SOCKS4 proxy. If the port number is not specified, it is
assumed at port 1080.
@@ -2344,6 +2513,12 @@ doesn't support SSL/TLS.
This option was formerly known as --ftp-ssl-reqd.
Added in 7.20.0.
+.IP "--ssl-revoke-best-effort"
+(Schannel) This option tells curl to ignore certificate revocation checks when
+they failed due to missing/offline distribution points for the revocation check
+lists.
+
+Added in 7.70.0.
.IP "--ssl"
(FTP IMAP POP3 SMTP)
Try to use SSL/TLS for the connection. Reverts to a non-secure connection if
@@ -2384,7 +2559,7 @@ CONNECT response headers. This option is meant to be used with \fI-D, --dump-hea
\fI-i, --include\fP which are used to show protocol headers in the output. It has no
effect on debug options such as \fI-v, --verbose\fP or \fI--trace\fP, or any statistics.
-See also \fI-D, --dump-header\fP and \fI-i, --include\fP and \fI-p, --proxytunnel\fP.
+See also \fI-D, --dump-header\fP, \fI-i, --include\fP and \fI-p, --proxytunnel\fP.
.IP "--tcp-fastopen"
Enable use of TCP Fast Open (RFC7413).
@@ -2437,6 +2612,9 @@ If this option is used several times, the last one will be used.
(SSL) VERSION defines maximum supported TLS version. The minimum acceptable version
is set by tlsv1.0, tlsv1.1, tlsv1.2 or tlsv1.3.
+If the connection is done without TLS, this option has no effect. This
+includes QUIC-using (HTTP/3) transfers.
+
.RS
.IP "default"
Use up to recommended TLS version.
@@ -2450,8 +2628,8 @@ Use up to TLSv1.2.
Use up to TLSv1.3.
.RE
-See also \fI--tlsv1.0\fP and \fI--tlsv1.1\fP and \fI--tlsv1.2\fP and \fI--tlsv1.3\fP. \fI--tls-max\fP requires that the underlying libcurl was built to support TLS. Added in 7.54.0.
-.IP "--tls13-ciphers <list of TLS 1.3 ciphersuites>"
+See also \fI--tlsv1.0\fP, \fI--tlsv1.1\fP, \fI--tlsv1.2\fP and \fI--tlsv1.3\fP. \fI--tls-max\fP requires that the underlying libcurl was built to support TLS. Added in 7.54.0.
+.IP "--tls13-ciphers <ciphersuite list>"
(TLS) Specifies which cipher suites to use in the connection if it negotiates TLS
1.3. The list of ciphers suites must specify valid ciphers. Read up on TLS 1.3
cipher suite details on this URL:
@@ -2475,11 +2653,15 @@ Added in 7.21.4.
Set password for use with the TLS authentication method specified with
\fI--tlsauthtype\fP. Requires that \fI--tlsuser\fP also be set.
+This doesn't work with TLS 1.3.
+
Added in 7.21.4.
.IP "--tlsuser <name>"
Set username for use with the TLS authentication method specified with
\fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also is set.
+This doesn't work with TLS 1.3.
+
Added in 7.21.4.
.IP "--tlsv1.0"
(TLS) Forces curl to use TLS version 1.0 or later when connecting to a remote TLS server.
@@ -2506,11 +2688,13 @@ you want to set a maximum TLS version.
Added in 7.34.0.
.IP "--tlsv1.3"
-(TLS) Forces curl to use TLS version 1.3 or later when connecting to a remote TLS server.
+(TLS) Forces curl to use TLS version 1.3 or later when connecting to a remote TLS
+server.
+
+If the connection is done without TLS, this option has no effect. This
+includes QUIC-using (HTTP/3) transfers.
-Note that TLS 1.3 is only supported by a subset of TLS backends. At the time
-of this writing, they are BoringSSL, NSS, and Secure Transport (on iOS 11 or
-later, and macOS 10.13 or later).
+Note that TLS 1.3 is not supported by all TLS backends.
Added in 7.52.0.
.IP "-1, --tlsv1"
@@ -2593,6 +2777,9 @@ setting a default protocol, see \fI--proto-default\fP for details.
This option may be used any number of times. To control where this URL is
written, use the \fI-o, --output\fP or the \fI-O, --remote-name\fP options.
+
+Warning: On Windows, particular file:// accesses can be converted to network
+accesses by the operating system. Beware!
.IP "-B, --use-ascii"
(FTP LDAP) Enable ASCII transfer. For FTP, this can also be enforced by using a URL that
ends with ";type=A". This option causes data sent to stdout to be in text mode
@@ -2603,6 +2790,10 @@ Specify the User-Agent string to send to the HTTP server. To encode blanks in
the string, surround the string with single quote marks. This header can also
be set with the \fI-H, --header\fP or the \fI--proxy-header\fP options.
+If you give an empty argument to \fI-A, --user-agent\fP (""), it will remove the header
+completely from the request. If you prefer a blank header, you can set it to a
+single space (" ").
+
If this option is used several times, the last one will be used.
.IP "-u, --user <user:password>"
Specify the user name and password to use for server authentication. Overrides
@@ -2667,50 +2858,58 @@ reports to support.
The third line (starts with "Features:") shows specific features libcurl
reports to offer. Available features include:
.RS
+.IP "alt-svc"
+Support for the Alt-Svc: header is provided.
+.IP "AsynchDNS"
+This curl uses asynchronous name resolves. Asynchronous name resolves can be
+done using either the c-ares or the threaded resolver backends.
+.IP "brotli"
+Support for automatic brotli compression over HTTP(S).
+.IP "CharConv"
+curl was built with support for character set conversions (like EBCDIC)
+.IP "Debug"
+This curl uses a libcurl built with Debug. This enables more error-tracking
+and memory debugging etc. For curl-developers only!
+.IP "GSS-API"
+GSS-API is supported.
+.IP "HTTP2"
+HTTP/2 support has been built-in.
+.IP "HTTP3"
+HTTP/3 support has been built-in.
+.IP "HTTPS-proxy"
+This curl is built to support HTTPS proxy.
+.IP "IDN"
+This curl supports IDN - international domain names.
.IP "IPv6"
You can use IPv6 with this.
.IP "krb4"
Krb4 for FTP is supported.
-.IP "SSL"
-SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S
-and so on.
+.IP "Largefile"
+This curl supports transfers of large files, files larger than 2GB.
.IP "libz"
Automatic decompression of compressed files over HTTP is supported.
+.IP "Metalink"
+This curl supports Metalink
+.IP "MultiSSL"
+This curl supports multiple TLS backends.
.IP "NTLM"
NTLM authentication is supported.
-.IP "Debug"
-This curl uses a libcurl built with Debug. This enables more error-tracking
-and memory debugging etc. For curl-developers only!
-.IP "AsynchDNS"
-This curl uses asynchronous name resolves. Asynchronous name resolves can be
-done using either the c-ares or the threaded resolver backends.
+.IP "NTLM"
+NTLM authentication is supported.
+.IP "PSL"
+PSL is short for Public Suffix List and means that this curl has been built
+with knowledge about "public suffixes".
.IP "SPNEGO"
SPNEGO authentication is supported.
-.IP "Largefile"
-This curl supports transfers of large files, files larger than 2GB.
-.IP "IDN"
-This curl supports IDN - international domain names.
-.IP "GSS-API"
-GSS-API is supported.
+.IP "SSL"
+SSL versions of various protocols are supported, such as HTTPS, FTPS, POP3S
+and so on.
.IP "SSPI"
SSPI is supported.
.IP "TLS-SRP"
SRP (Secure Remote Password) authentication is supported for TLS.
-.IP "HTTP2"
-HTTP/2 support has been built-in.
.IP "UnixSockets"
Unix sockets support is provided.
-.IP "HTTPS-proxy"
-This curl is built to support HTTPS proxy.
-.IP "Metalink"
-This curl supports Metalink (both version 3 and 4 (RFC 5854)), which
-describes mirrors and hashes. curl will use mirrors for failover if
-there are errors (such as the file or server not being available).
-.IP "PSL"
-PSL is short for Public Suffix List and means that this curl has been built
-with knowledge about "public suffixes".
-.IP "MultiSSL"
-This curl supports multiple TLS backends.
.RE
.IP "-w, --write-out <format>"
Make curl display information on stdout after a completed transfer. The format
@@ -2760,6 +2959,9 @@ curl CONNECT request. (Added in 7.12.4)
.B http_version
The http version that was effectively used. (Added in 7.50.0)
.TP
+.B json
+A JSON object with all available keys.
+.TP
.B local_ip
The IP address of the local end of the most recently done connection - can be
either IPv4 or IPv6 (Added in 7.29.0)
@@ -2767,9 +2969,16 @@ either IPv4 or IPv6 (Added in 7.29.0)
.B local_port
The local port number of the most recently done connection (Added in 7.29.0)
.TP
+.B method
+The http method used in the most recent HTTP request (Added in 7.72.0)
+.TP
.B num_connects
Number of new connects made in the recent transfer. (Added in 7.12.3)
.TP
+.B num_headers
+The number of response headers in the most recent request (restarted at each
+ redirect). Note that the status line IS NOT a header. (Added in 7.73.0)
+.TP
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.TP
@@ -2789,6 +2998,10 @@ IPv4 or IPv6 (Added in 7.29.0)
.B remote_port
The remote port number of the most recently done connection (Added in 7.29.0)
.TP
+.B response_code
+The numerical response code that was found in the last transfer (formerly
+known as "http_code"). (Added in 7.18.2)
+.TP
.B scheme
The URL scheme (sometimes called protocol) that was effectively used (Added in 7.52.0)
.TP
@@ -2907,6 +3120,26 @@ accesses the target URL through the proxy.
The list of host names can also be include numerical IP addresses, and IPv6
versions should then be given without enclosing brackets.
+IPv6 numerical addresses are compared as strings, so they will only match if
+the representations are the same: "::1" is the same as "::0:1" but they don't
+match.
+.IP "CURL_SSL_BACKEND <TLS backend>"
+If curl was built with support for "MultiSSL", meaning that it has built-in
+support for more than one TLS backend, this environment variable can be set to
+the case insensitive name of the particular backend to use when curl is
+invoked. Setting a name that isn't a built-in alternative, will make curl
+stay with the default.
+.IP "QLOGDIR <directory name>"
+If curl was built with HTTP/3 support, setting this environment variable to a
+local directory will make curl produce qlogs in that directory, using file
+names named after the destination connection id (in hex). Do note that these
+files can become rather large. Works with both QUIC backends.
+.IP "SSLKEYLOGFILE <file name>"
+If you set this environment variable to a file name, curl will store TLS
+secrets from its connections in that file when invoked to enable you to
+analyze the TLS traffic in real time using network analyzing tools such as
+Wireshark. This works with the following TLS backends: OpenSSL, libressl,
+BoringSSL, GnuTLS, NSS and wolfSSL.
.SH "PROXY PROTOCOL PREFIXES"
Since curl version 7.21.7, the proxy string may be specified with a
protocol:// prefix to specify alternative proxy protocols.
@@ -3113,6 +3346,16 @@ SSL public key does not matched pinned public key
Invalid SSL certificate status.
.IP 92
Stream error in HTTP/2 framing layer.
+.IP 93
+An API function was called from inside a callback.
+.IP 94
+An authentication function returned an error.
+.IP 95
+A problem was detected in the HTTP/3 layer. This is somewhat generic and can
+be one out of several problems, see the error message for details.
+.IP 96
+QUIC connection error. This error may be caused by an SSL library error. QUIC
+is the protocol used for HTTP/3 transfers.
.IP XX
More error codes will appear here in future releases. The existing ones
are meant to never change.
diff --git a/docs/examples/Makefile.am b/docs/examples/Makefile.am
index 53867cb22..b8fd1ffda 100644
--- a/docs/examples/Makefile.am
+++ b/docs/examples/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -22,7 +22,7 @@
AUTOMAKE_OPTIONS = foreign nostdinc
-EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
+EXTRA_DIST = README.md Makefile.example Makefile.inc Makefile.m32 \
Makefile.netware makefile.dj $(COMPLICATED_EXAMPLES)
# Specify our include paths here, and do it relative to $(top_srcdir) and
@@ -67,4 +67,4 @@ CS_1 =
CS_ = $(CS_0)
checksrc:
- $(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -ASNPRINTF $(srcdir)/*.c)
+ $(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(srcdir) $(srcdir)/*.c)
diff --git a/docs/examples/Makefile.example b/docs/examples/Makefile.example
index 17e614ea1..72e762fbb 100644
--- a/docs/examples/Makefile.example
+++ b/docs/examples/Makefile.example
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc
index f03fcf2f0..79c9e509a 100644
--- a/docs/examples/Makefile.inc
+++ b/docs/examples/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -36,13 +36,13 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
ftpuploadresume sslbackend postit2-formadd multi-formadd \
shared-connection-cache sftpuploadresume http2-pushinmemory parseurl \
urlapi imap-authzid pop3-authzid smtp-authzid http3 altsvc \
- http3-present
+ http3-present multi-poll
# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
ghiper.c hiperfifo.c htmltidy.c multithread.c opensslthreadlock.c \
sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
- smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
+ smooth-gtk-thread.c version-check.pl href_extractor.c \
multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
threaded-shared-conn.c crawler.c ephiperfifo.c multi-event.c
diff --git a/docs/examples/Makefile.m32 b/docs/examples/Makefile.m32
index 160afb62f..a2dca6bbc 100644
--- a/docs/examples/Makefile.m32
+++ b/docs/examples/Makefile.m32
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
#
## Makefile for building curl examples with MingW (GCC-3.2 or later)
## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4),
-## brotli (1.0.1)
+## brotli (1.0.1), zstd (1.4.5)
##
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
@@ -39,6 +39,10 @@
ifndef ZLIB_PATH
ZLIB_PATH = ../../../zlib-1.2.8
endif
+# Edit the path below to point to the base of your Zstandard sources.
+ifndef ZSTD_PATH
+ZSTD_PATH = ../../../zstd-1.4.5
+endif
# Edit the path below to point to the base of your Brotli sources.
ifndef BROTLI_PATH
BROTLI_PATH = ../../../brotli-1.0.1
@@ -106,7 +110,7 @@ CFLAGS += -fno-strict-aliasing
# comment LDFLAGS below to keep debug info
LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE) -s
RC = $(CROSSPREFIX)windres
-RCFLAGS = --include-dir=$(PROOT)/include -O COFF
+RCFLAGS = --include-dir=$(PROOT)/include -O coff
# Set environment var ARCH to your architecture to override autodetection.
ifndef ARCH
@@ -180,6 +184,9 @@ endif
ifeq ($(findstring -zlib,$(CFG)),-zlib)
ZLIB = 1
endif
+ifeq ($(findstring -zstd,$(CFG)),-zstd)
+ZSTD = 1
+endif
ifeq ($(findstring -brotli,$(CFG)),-brotli)
BROTLI = 1
endif
@@ -284,6 +291,16 @@ ifdef ZLIB
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
curl_LDADD += -L"$(ZLIB_PATH)" -lz
endif
+ifdef ZSTD
+ INCLUDES += -I"$(ZSTD_PATH)/include"
+ CFLAGS += -DHAVE_ZSTD
+ curl_LDADD += -L"$(ZSTD_PATH)/lib"
+ ifdef ZSTD_LIBS
+ curl_LDADD += $(ZSTD_LIBS)
+ else
+ curl_LDADD += -lzstd
+ endif
+endif
ifdef BROTLI
INCLUDES += -I"$(BROTLI_PATH)/include"
CFLAGS += -DHAVE_BROTLI
diff --git a/docs/examples/Makefile.netware b/docs/examples/Makefile.netware
index 1f50a9266..260c55773 100644
--- a/docs/examples/Makefile.netware
+++ b/docs/examples/Makefile.netware
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2008 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#################################################################
#
## Makefile for building curl.nlm (NetWare version - gnu make)
diff --git a/docs/examples/README b/docs/examples/README.md
index 078cabed0..f2ba0619e 100644
--- a/docs/examples/README
+++ b/docs/examples/README.md
@@ -1,36 +1,32 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
+# libcurl examples
This directory is for libcurl programming examples. They are meant to show
some simple steps on how you can build your own application to take full
advantage of libcurl.
If you end up with other small but still useful example sources, please mail
-them for submission in future packages and on the web site.
+them for submission in future packages and on the website.
-BUILDING
+## Building
The Makefile.example is an example makefile that could be used to build these
examples. Just edit the file according to your system and requirements first.
Most examples should build fine using a command line like this:
- $ `curl-config --cc --cflags --libs` -o example example.c
+ `curl-config --cc --cflags --libs` -o example example.c
Some compilers don't like having the arguments in this order but instead
want you do reorganize them like:
- $ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
+ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
-*PLEASE* do not use the curl.haxx.se site as a test target for your libcurl
-applications/experiments. Even if some of the examples use that site as a URL
-at some places, it doesn't mean that the URLs work or that we expect you to
-actually torture our web site with your tests! Thanks.
+**Please** do not use the `curl.haxx.se` site as a test target for your
+libcurl applications/experiments. Even if some of the examples use that site
+as a URL at some places, it doesn't mean that the URLs work or that we expect
+you to actually torture our website with your tests! Thanks.
-EXAMPLES
+## Examples
Each example source code file is designed to be and work stand-alone and
rather self-explanatory. The examples may at times lack the level of error
diff --git a/docs/examples/anyauthput.c b/docs/examples/anyauthput.c
index 14da10c3b..7faf93dcd 100644
--- a/docs/examples/anyauthput.c
+++ b/docs/examples/anyauthput.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
*
***************************************************************************/
/* <DESC>
- * HTTP PUT upload with authentiction using "any" method. libcurl picks the
+ * HTTP PUT upload with authentication using "any" method. libcurl picks the
* one the server supports/wants.
* </DESC>
*/
@@ -44,7 +44,7 @@
#endif
/*
- * This example shows a HTTP PUT operation with authentiction using "any"
+ * This example shows a HTTP PUT operation with authentication using "any"
* type. It PUTs a file given as a command line argument to the URL also given
* on the command line.
*
diff --git a/docs/examples/asiohiper.cpp b/docs/examples/asiohiper.cpp
deleted file mode 100644
index de1480507..000000000
--- a/docs/examples/asiohiper.cpp
+++ /dev/null
@@ -1,496 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* <DESC>
- * demonstrate the use of multi socket interface with boost::asio
- * </DESC>
- */
-/*
- * This program is in c++ and uses boost::asio instead of libevent/libev.
- * Requires boost::asio, boost::bind and boost::system
- *
- * This is an adaptation of libcurl's "hiperfifo.c" and "evhiperfifo.c"
- * sample programs. This example implements a subset of the functionality from
- * hiperfifo.c, for full functionality refer hiperfifo.c or evhiperfifo.c
- *
- * Written by Lijo Antony based on hiperfifo.c by Jeff Pohlmeyer
- *
- * When running, the program creates an easy handle for a URL and
- * uses the curl_multi API to fetch it.
- *
- * Note:
- * For the sake of simplicity, URL is hard coded to "www.google.com"
- *
- * This is purely a demo app, all retrieved data is simply discarded by the
- * write callback.
- *
- * ===========================================================================
- * WARNING: This example program is known to have flaws:
- * https://github.com/curl/curl/issues/2407
- *
- * It still kept in the example repository with the hope that it might be
- * useful, and maybe some day someone who knows enough about boost::asio will
- * read this text, accept the challenge and make the example code work
- * correctly. Until then: expect this example program to fail occasionally.
- * ===========================================================================
- */
-
-
-#include <curl/curl.h>
-#include <boost/asio.hpp>
-#include <boost/bind.hpp>
-#include <iostream>
-
-#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
-
-/* boost::asio related objects
- * using global variables for simplicity
- */
-boost::asio::io_service io_service;
-boost::asio::deadline_timer timer(io_service);
-std::map<curl_socket_t, boost::asio::ip::tcp::socket *> socket_map;
-
-/* Global information, common to all connections */
-typedef struct _GlobalInfo
-{
- CURLM *multi;
- int still_running;
-} GlobalInfo;
-
-/* Information associated with a specific easy handle */
-typedef struct _ConnInfo
-{
- CURL *easy;
- char *url;
- GlobalInfo *global;
- char error[CURL_ERROR_SIZE];
-} ConnInfo;
-
-static void timer_cb(const boost::system::error_code & error, GlobalInfo *g);
-
-/* Update the event timer after curl_multi library calls */
-static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
-{
- fprintf(MSG_OUT, "\nmulti_timer_cb: timeout_ms %ld", timeout_ms);
-
- /* cancel running timer */
- timer.cancel();
-
- if(timeout_ms > 0) {
- /* update timer */
- timer.expires_from_now(boost::posix_time::millisec(timeout_ms));
- timer.async_wait(boost::bind(&timer_cb, _1, g));
- }
- else if(timeout_ms == 0) {
- /* call timeout function immediately */
- boost::system::error_code error; /*success*/
- timer_cb(error, g);
- }
-
- return 0;
-}
-
-/* Die if we get a bad CURLMcode somewhere */
-static void mcode_or_die(const char *where, CURLMcode code)
-{
- if(CURLM_OK != code) {
- const char *s;
- switch(code) {
- case CURLM_CALL_MULTI_PERFORM:
- s = "CURLM_CALL_MULTI_PERFORM";
- break;
- case CURLM_BAD_HANDLE:
- s = "CURLM_BAD_HANDLE";
- break;
- case CURLM_BAD_EASY_HANDLE:
- s = "CURLM_BAD_EASY_HANDLE";
- break;
- case CURLM_OUT_OF_MEMORY:
- s = "CURLM_OUT_OF_MEMORY";
- break;
- case CURLM_INTERNAL_ERROR:
- s = "CURLM_INTERNAL_ERROR";
- break;
- case CURLM_UNKNOWN_OPTION:
- s = "CURLM_UNKNOWN_OPTION";
- break;
- case CURLM_LAST:
- s = "CURLM_LAST";
- break;
- default:
- s = "CURLM_unknown";
- break;
- case CURLM_BAD_SOCKET:
- s = "CURLM_BAD_SOCKET";
- fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s);
- /* ignore this error */
- return;
- }
-
- fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s);
-
- exit(code);
- }
-}
-
-/* Check for completed transfers, and remove their easy handles */
-static void check_multi_info(GlobalInfo *g)
-{
- char *eff_url;
- CURLMsg *msg;
- int msgs_left;
- ConnInfo *conn;
- CURL *easy;
- CURLcode res;
-
- fprintf(MSG_OUT, "\nREMAINING: %d", g->still_running);
-
- while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
- if(msg->msg == CURLMSG_DONE) {
- easy = msg->easy_handle;
- res = msg->data.result;
- curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
- curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
- fprintf(MSG_OUT, "\nDONE: %s => (%d) %s", eff_url, res, conn->error);
- curl_multi_remove_handle(g->multi, easy);
- free(conn->url);
- curl_easy_cleanup(easy);
- free(conn);
- }
- }
-}
-
-/* Called by asio when there is an action on a socket */
-static void event_cb(GlobalInfo *g, curl_socket_t s,
- int action, const boost::system::error_code & error,
- int *fdp)
-{
- fprintf(MSG_OUT, "\nevent_cb: action=%d", action);
-
- if(socket_map.find(s) == socket_map.end()) {
- fprintf(MSG_OUT, "\nevent_cb: socket already closed");
- return;
- }
-
- /* make sure the event matches what are wanted */
- if(*fdp == action || *fdp == CURL_POLL_INOUT) {
- CURLMcode rc;
- if(error)
- action = CURL_CSELECT_ERR;
- rc = curl_multi_socket_action(g->multi, s, action, &g->still_running);
-
- mcode_or_die("event_cb: curl_multi_socket_action", rc);
- check_multi_info(g);
-
- if(g->still_running <= 0) {
- fprintf(MSG_OUT, "\nlast transfer done, kill timeout");
- timer.cancel();
- }
-
- /* keep on watching.
- * the socket may have been closed and/or fdp may have been changed
- * in curl_multi_socket_action(), so check them both */
- if(!error && socket_map.find(s) != socket_map.end() &&
- (*fdp == action || *fdp == CURL_POLL_INOUT)) {
- boost::asio::ip::tcp::socket *tcp_socket = socket_map.find(s)->second;
-
- if(action == CURL_POLL_IN) {
- tcp_socket->async_read_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, s,
- action, _1, fdp));
- }
- if(action == CURL_POLL_OUT) {
- tcp_socket->async_write_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, s,
- action, _1, fdp));
- }
- }
- }
-}
-
-/* Called by asio when our timeout expires */
-static void timer_cb(const boost::system::error_code & error, GlobalInfo *g)
-{
- if(!error) {
- fprintf(MSG_OUT, "\ntimer_cb: ");
-
- CURLMcode rc;
- rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0,
- &g->still_running);
-
- mcode_or_die("timer_cb: curl_multi_socket_action", rc);
- check_multi_info(g);
- }
-}
-
-/* Clean up any data */
-static void remsock(int *f, GlobalInfo *g)
-{
- fprintf(MSG_OUT, "\nremsock: ");
-
- if(f) {
- free(f);
- }
-}
-
-static void setsock(int *fdp, curl_socket_t s, CURL *e, int act, int oldact,
- GlobalInfo *g)
-{
- fprintf(MSG_OUT, "\nsetsock: socket=%d, act=%d, fdp=%p", s, act, fdp);
-
- std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
- socket_map.find(s);
-
- if(it == socket_map.end()) {
- fprintf(MSG_OUT, "\nsocket %d is a c-ares socket, ignoring", s);
- return;
- }
-
- boost::asio::ip::tcp::socket * tcp_socket = it->second;
-
- *fdp = act;
-
- if(act == CURL_POLL_IN) {
- fprintf(MSG_OUT, "\nwatching for socket to become readable");
- if(oldact != CURL_POLL_IN && oldact != CURL_POLL_INOUT) {
- tcp_socket->async_read_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, s,
- CURL_POLL_IN, _1, fdp));
- }
- }
- else if(act == CURL_POLL_OUT) {
- fprintf(MSG_OUT, "\nwatching for socket to become writable");
- if(oldact != CURL_POLL_OUT && oldact != CURL_POLL_INOUT) {
- tcp_socket->async_write_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, s,
- CURL_POLL_OUT, _1, fdp));
- }
- }
- else if(act == CURL_POLL_INOUT) {
- fprintf(MSG_OUT, "\nwatching for socket to become readable & writable");
- if(oldact != CURL_POLL_IN && oldact != CURL_POLL_INOUT) {
- tcp_socket->async_read_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, s,
- CURL_POLL_IN, _1, fdp));
- }
- if(oldact != CURL_POLL_OUT && oldact != CURL_POLL_INOUT) {
- tcp_socket->async_write_some(boost::asio::null_buffers(),
- boost::bind(&event_cb, g, s,
- CURL_POLL_OUT, _1, fdp));
- }
- }
-}
-
-static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
-{
- /* fdp is used to store current action */
- int *fdp = (int *) calloc(sizeof(int), 1);
-
- setsock(fdp, s, easy, action, 0, g);
- curl_multi_assign(g->multi, s, fdp);
-}
-
-/* CURLMOPT_SOCKETFUNCTION */
-static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
-{
- fprintf(MSG_OUT, "\nsock_cb: socket=%d, what=%d, sockp=%p", s, what, sockp);
-
- GlobalInfo *g = (GlobalInfo*) cbp;
- int *actionp = (int *) sockp;
- const char *whatstr[] = { "none", "IN", "OUT", "INOUT", "REMOVE"};
-
- fprintf(MSG_OUT,
- "\nsocket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
-
- if(what == CURL_POLL_REMOVE) {
- fprintf(MSG_OUT, "\n");
- remsock(actionp, g);
- }
- else {
- if(!actionp) {
- fprintf(MSG_OUT, "\nAdding data: %s", whatstr[what]);
- addsock(s, e, what, g);
- }
- else {
- fprintf(MSG_OUT,
- "\nChanging action from %s to %s",
- whatstr[*actionp], whatstr[what]);
- setsock(actionp, s, e, what, *actionp, g);
- }
- }
-
- return 0;
-}
-
-/* CURLOPT_WRITEFUNCTION */
-static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
-{
- size_t written = size * nmemb;
- char *pBuffer = (char *)malloc(written + 1);
-
- strncpy(pBuffer, (const char *)ptr, written);
- pBuffer[written] = '\0';
-
- fprintf(MSG_OUT, "%s", pBuffer);
-
- free(pBuffer);
-
- return written;
-}
-
-/* CURLOPT_PROGRESSFUNCTION */
-static int prog_cb(void *p, double dltotal, double dlnow, double ult,
- double uln)
-{
- ConnInfo *conn = (ConnInfo *)p;
-
- (void)ult;
- (void)uln;
-
- fprintf(MSG_OUT, "\nProgress: %s (%g/%g)", conn->url, dlnow, dltotal);
- fprintf(MSG_OUT, "\nProgress: %s (%g)", conn->url, ult);
-
- return 0;
-}
-
-/* CURLOPT_OPENSOCKETFUNCTION */
-static curl_socket_t opensocket(void *clientp, curlsocktype purpose,
- struct curl_sockaddr *address)
-{
- fprintf(MSG_OUT, "\nopensocket :");
-
- curl_socket_t sockfd = CURL_SOCKET_BAD;
-
- /* restrict to IPv4 */
- if(purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET) {
- /* create a tcp socket object */
- boost::asio::ip::tcp::socket *tcp_socket =
- new boost::asio::ip::tcp::socket(io_service);
-
- /* open it and get the native handle*/
- boost::system::error_code ec;
- tcp_socket->open(boost::asio::ip::tcp::v4(), ec);
-
- if(ec) {
- /* An error occurred */
- std::cout << std::endl << "Couldn't open socket [" << ec << "][" <<
- ec.message() << "]";
- fprintf(MSG_OUT, "\nERROR: Returning CURL_SOCKET_BAD to signal error");
- }
- else {
- sockfd = tcp_socket->native_handle();
- fprintf(MSG_OUT, "\nOpened socket %d", sockfd);
-
- /* save it for monitoring */
- socket_map.insert(std::pair<curl_socket_t,
- boost::asio::ip::tcp::socket *>(sockfd, tcp_socket));
- }
- }
-
- return sockfd;
-}
-
-/* CURLOPT_CLOSESOCKETFUNCTION */
-static int close_socket(void *clientp, curl_socket_t item)
-{
- fprintf(MSG_OUT, "\nclose_socket : %d", item);
-
- std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
- socket_map.find(item);
-
- if(it != socket_map.end()) {
- delete it->second;
- socket_map.erase(it);
- }
-
- return 0;
-}
-
-/* Create a new easy handle, and add it to the global curl_multi */
-static void new_conn(char *url, GlobalInfo *g)
-{
- ConnInfo *conn;
- CURLMcode rc;
-
- conn = (ConnInfo *) calloc(1, sizeof(ConnInfo));
-
- conn->easy = curl_easy_init();
- if(!conn->easy) {
- fprintf(MSG_OUT, "\ncurl_easy_init() failed, exiting!");
- exit(2);
- }
-
- conn->global = g;
- conn->url = strdup(url);
- curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
- curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
- curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
- curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
- curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
- curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
- curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 1L);
- curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
- curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
- curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
- curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
-
- /* call this function to get a socket */
- curl_easy_setopt(conn->easy, CURLOPT_OPENSOCKETFUNCTION, opensocket);
-
- /* call this function to close a socket */
- curl_easy_setopt(conn->easy, CURLOPT_CLOSESOCKETFUNCTION, close_socket);
-
- fprintf(MSG_OUT,
- "\nAdding easy %p to multi %p (%s)", conn->easy, g->multi, url);
- rc = curl_multi_add_handle(g->multi, conn->easy);
- mcode_or_die("new_conn: curl_multi_add_handle", rc);
-
- /* note that the add_handle() will set a time-out to trigger very soon so
- that the necessary socket_action() call will be called by this app */
-}
-
-int main(int argc, char **argv)
-{
- GlobalInfo g;
-
- (void)argc;
- (void)argv;
-
- memset(&g, 0, sizeof(GlobalInfo));
- g.multi = curl_multi_init();
-
- curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
- curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
- curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
- curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
-
- new_conn((char *)"www.google.com", &g); /* add a URL */
-
- /* enter io_service run loop */
- io_service.run();
-
- curl_multi_cleanup(g.multi);
-
- fprintf(MSG_OUT, "\ndone.\n");
-
- return 0;
-}
diff --git a/docs/examples/chkspeed.c b/docs/examples/chkspeed.c
index 0b0ba72a0..bf9c487f1 100644
--- a/docs/examples/chkspeed.c
+++ b/docs/examples/chkspeed.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/crawler.c b/docs/examples/crawler.c
index 496d88c94..59de99d7a 100644
--- a/docs/examples/crawler.c
+++ b/docs/examples/crawler.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Web crawler based on curl and libxml2.
- * Copyright (C) 2018 Jeroen Ooms <jeroenooms@gmail.com>
+ * Copyright (C) 2018 - 2020 Jeroen Ooms <jeroenooms@gmail.com>
* License: MIT
*
* To compile:
@@ -116,7 +116,8 @@ size_t follow_links(CURLM *multi_handle, memory *mem, char *url)
return 0;
}
size_t count = 0;
- for(int i = 0; i < nodeset->nodeNr; i++) {
+ int i;
+ for(i = 0; i < nodeset->nodeNr; i++) {
double r = rand();
int x = r * nodeset->nodeNr / RAND_MAX;
const xmlNode *node = nodeset->nodeTab[x]->xmlChildrenNode;
diff --git a/docs/examples/curlgtk.c b/docs/examples/curlgtk.c
index 4083c8f95..5990799eb 100644
--- a/docs/examples/curlgtk.c
+++ b/docs/examples/curlgtk.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft
+ * Copyright (c) 2000 - 2019 David Odin (aka DindinX) for MandrakeSoft
*/
/* <DESC>
* use the libcurl in a gtk-threaded application
diff --git a/docs/examples/curlx.c b/docs/examples/curlx.c
index 830207970..8b48c99c8 100644
--- a/docs/examples/curlx.c
+++ b/docs/examples/curlx.c
@@ -15,7 +15,7 @@
*/
/*
- * Copyright (c) 2003 The OpenEvidence Project. All rights reserved.
+ * Copyright (c) 2003 - 2020 The OpenEvidence Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -459,7 +459,7 @@ int main(int argc, char **argv)
if(!serverurl) {
int j = 0;
BIO_printf(p.errorbio, "no service URL in user cert "
- "cherching in others certificats\n");
+ "searching in others certificates\n");
for(j = 0; j<sk_X509_num(p.ca); j++) {
serverurl = my_get_ext(sk_X509_value(p.ca, j), p.accesstype,
NID_info_access);
@@ -474,7 +474,7 @@ int main(int argc, char **argv)
}
if(!serverurl) {
- BIO_printf(p.errorbio, "no service URL in certificats,"
+ BIO_printf(p.errorbio, "no service URL in certificates,"
" check '-accesstype (AD_DVCS | ad_timestamping)'"
" or use '-connect'\n");
goto err;
diff --git a/docs/examples/ephiperfifo.c b/docs/examples/ephiperfifo.c
index c076a8523..c27d7c128 100644
--- a/docs/examples/ephiperfifo.c
+++ b/docs/examples/ephiperfifo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -146,7 +146,7 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
if(timeout_ms > 0) {
- its.it_interval.tv_sec = 1;
+ its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
its.it_value.tv_sec = timeout_ms / 1000;
its.it_value.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
@@ -155,7 +155,7 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
/* libcurl wants us to timeout now, however setting both fields of
* new_value.it_value to zero disarms the timer. The closest we can
* do is to schedule the timer to fire in 1 ns. */
- its.it_interval.tv_sec = 1;
+ its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 1;
@@ -488,7 +488,7 @@ int main(int argc, char **argv)
}
memset(&its, 0, sizeof(struct itimerspec));
- its.it_interval.tv_sec = 1;
+ its.it_interval.tv_sec = 0;
its.it_value.tv_sec = 1;
timerfd_settime(g.tfd, 0, &its, NULL);
diff --git a/docs/examples/fileupload.c b/docs/examples/fileupload.c
index 8128608c4..068927504 100644
--- a/docs/examples/fileupload.c
+++ b/docs/examples/fileupload.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/fopen.c b/docs/examples/fopen.c
index 7151addde..a11a522b4 100644
--- a/docs/examples/fopen.c
+++ b/docs/examples/fopen.c
@@ -13,7 +13,7 @@
* See the main() function at the bottom that shows an app that retrieves from
* a specified url using fgets() and fread() and saves as two output files.
*
- * Copyright (c) 2003, 2017 Simtec Electronics
+ * Copyright (c) 2003 - 2019 Simtec Electronics
*
* Re-implemented by Vincent Sanders <vince@kyllikki.org> with extensive
* reference to original curl example code
diff --git a/docs/examples/ftpupload.c b/docs/examples/ftpupload.c
index bd77bb1f3..25e292d74 100644
--- a/docs/examples/ftpupload.c
+++ b/docs/examples/ftpupload.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/href_extractor.c b/docs/examples/href_extractor.c
index aa2b43816..c04733c5f 100644
--- a/docs/examples/href_extractor.c
+++ b/docs/examples/href_extractor.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/http-post.c b/docs/examples/http-post.c
index 017545271..b4c7d3722 100644
--- a/docs/examples/http-post.c
+++ b/docs/examples/http-post.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/http2-download.c b/docs/examples/http2-download.c
index 333b7df2c..bb854cbeb 100644
--- a/docs/examples/http2-download.c
+++ b/docs/examples/http2-download.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
/* somewhat unix-specific */
#include <sys/time.h>
@@ -33,6 +34,7 @@
/* curl stuff */
#include <curl/curl.h>
+#include <curl/mprintf.h>
#ifndef CURLPIPE_MULTIPLEX
/* This little trick will just make sure that we don't enable pipelining for
@@ -146,9 +148,14 @@ static void setup(struct transfer *t, int num)
hnd = t->easy = curl_easy_init();
- snprintf(filename, 128, "dl-%d", num);
+ curl_msnprintf(filename, 128, "dl-%d", num);
t->out = fopen(filename, "wb");
+ if(!t->out) {
+ fprintf(stderr, "error: could not open file %s for writing: %s\n",
+ filename, strerror(errno));
+ exit(1);
+ }
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, t->out);
diff --git a/docs/examples/http2-upload.c b/docs/examples/http2-upload.c
index 8f1fd4a5f..b8fc27759 100644
--- a/docs/examples/http2-upload.c
+++ b/docs/examples/http2-upload.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <errno.h>
/* somewhat unix-specific */
#include <sys/time.h>
@@ -35,6 +36,7 @@
/* curl stuff */
#include <curl/curl.h>
+#include <curl/mprintf.h>
#ifndef CURLPIPE_MULTIPLEX
/* This little trick will just make sure that we don't enable pipelining for
@@ -123,8 +125,8 @@ int my_trace(CURL *handle, curl_infotype type,
}
secs = epoch_offset + tv.tv_sec;
now = localtime(&secs); /* not thread safe but we don't care */
- snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
- now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
+ curl_msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
+ now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
switch(type) {
case CURLINFO_TEXT:
@@ -176,16 +178,31 @@ static void setup(struct input *i, int num, const char *upload)
hnd = i->hnd = curl_easy_init();
i->num = num;
- snprintf(filename, 128, "dl-%d", num);
+ curl_msnprintf(filename, 128, "dl-%d", num);
out = fopen(filename, "wb");
+ if(!out) {
+ fprintf(stderr, "error: could not open file %s for writing: %s\n", upload,
+ strerror(errno));
+ exit(1);
+ }
- snprintf(url, 256, "https://localhost:8443/upload-%d", num);
+ curl_msnprintf(url, 256, "https://localhost:8443/upload-%d", num);
/* get the file size of the local file */
- stat(upload, &file_info);
+ if(stat(upload, &file_info)) {
+ fprintf(stderr, "error: could not stat file %s: %s\n", upload,
+ strerror(errno));
+ exit(1);
+ }
+
uploadsize = file_info.st_size;
i->in = fopen(upload, "rb");
+ if(!i->in) {
+ fprintf(stderr, "error: could not open file %s for reading: %s\n", upload,
+ strerror(errno));
+ exit(1);
+ }
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
diff --git a/docs/examples/https.c b/docs/examples/https.c
index cca83fee5..07b417fc6 100644
--- a/docs/examples/https.c
+++ b/docs/examples/https.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/imap-list.c b/docs/examples/imap-list.c
index 291e1e671..cbd3ebb76 100644
--- a/docs/examples/imap-list.c
+++ b/docs/examples/imap-list.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/imap-lsub.c b/docs/examples/imap-lsub.c
index d130c3d51..c77d46aa8 100644
--- a/docs/examples/imap-lsub.c
+++ b/docs/examples/imap-lsub.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/imap-noop.c b/docs/examples/imap-noop.c
index 566890efa..719919a66 100644
--- a/docs/examples/imap-noop.c
+++ b/docs/examples/imap-noop.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/imap-store.c b/docs/examples/imap-store.c
index 8479457b1..b08dd421d 100644
--- a/docs/examples/imap-store.c
+++ b/docs/examples/imap-store.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/makefile.dj b/docs/examples/makefile.dj
index 17d93ab89..eca16b8a6 100644
--- a/docs/examples/makefile.dj
+++ b/docs/examples/makefile.dj
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/docs/examples/multi-event.c b/docs/examples/multi-event.c
index 482de8e7f..34bb0d645 100644
--- a/docs/examples/multi-event.c
+++ b/docs/examples/multi-event.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -41,7 +41,7 @@ typedef struct curl_context_s {
static void curl_perform(int fd, short event, void *arg);
-static curl_context_t* create_curl_context(curl_socket_t sockfd)
+static curl_context_t *create_curl_context(curl_socket_t sockfd)
{
curl_context_t *context;
diff --git a/docs/examples/multi-poll.c b/docs/examples/multi-poll.c
new file mode 100644
index 000000000..255a3d45b
--- /dev/null
+++ b/docs/examples/multi-poll.c
@@ -0,0 +1,76 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * single download with the multi interface's curl_multi_poll
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+int main(void)
+{
+ CURL *http_handle;
+ CURLM *multi_handle;
+ int still_running = 1; /* keep number of running handles */
+
+ curl_global_init(CURL_GLOBAL_DEFAULT);
+
+ http_handle = curl_easy_init();
+
+ curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+
+ multi_handle = curl_multi_init();
+
+ curl_multi_add_handle(multi_handle, http_handle);
+
+ while(still_running) {
+ CURLMcode mc; /* curl_multi_poll() return code */
+ int numfds;
+
+ /* we start some action by calling perform right away */
+ mc = curl_multi_perform(multi_handle, &still_running);
+
+ if(still_running)
+ /* wait for activity, timeout or "nothing" */
+ mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
+
+ if(mc != CURLM_OK) {
+ fprintf(stderr, "curl_multi_wait() failed, code %d.\n", mc);
+ break;
+ }
+ }
+
+ curl_multi_remove_handle(multi_handle, http_handle);
+ curl_easy_cleanup(http_handle);
+ curl_multi_cleanup(multi_handle);
+ curl_global_cleanup();
+
+ return 0;
+}
diff --git a/docs/examples/multi-uv.c b/docs/examples/multi-uv.c
index 8ca4b9096..1b4a75252 100644
--- a/docs/examples/multi-uv.c
+++ b/docs/examples/multi-uv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,7 +46,7 @@ typedef struct curl_context_s {
curl_socket_t sockfd;
} curl_context_t;
-static curl_context_t* create_curl_context(curl_socket_t sockfd)
+static curl_context_t *create_curl_context(curl_socket_t sockfd)
{
curl_context_t *context;
diff --git a/docs/examples/multithread.c b/docs/examples/multithread.c
index da07a1686..5777e5c03 100644
--- a/docs/examples/multithread.c
+++ b/docs/examples/multithread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -89,6 +89,6 @@ int main(int argc, char **argv)
pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
-
+ curl_global_cleanup();
return 0;
}
diff --git a/docs/examples/pop3-dele.c b/docs/examples/pop3-dele.c
index 144978353..ca075158a 100644
--- a/docs/examples/pop3-dele.c
+++ b/docs/examples/pop3-dele.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/pop3-list.c b/docs/examples/pop3-list.c
index b530a0446..ef3c6d3ad 100644
--- a/docs/examples/pop3-list.c
+++ b/docs/examples/pop3-list.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/pop3-noop.c b/docs/examples/pop3-noop.c
index bc162d0c9..6242d3297 100644
--- a/docs/examples/pop3-noop.c
+++ b/docs/examples/pop3-noop.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/pop3-retr.c b/docs/examples/pop3-retr.c
index b36ddb55c..61cb4241a 100644
--- a/docs/examples/pop3-retr.c
+++ b/docs/examples/pop3-retr.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/pop3-ssl.c b/docs/examples/pop3-ssl.c
index f0d4e269d..b557906f6 100644
--- a/docs/examples/pop3-ssl.c
+++ b/docs/examples/pop3-ssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/pop3-stat.c b/docs/examples/pop3-stat.c
index 46a0a451c..5b3a8de9c 100644
--- a/docs/examples/pop3-stat.c
+++ b/docs/examples/pop3-stat.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/pop3-uidl.c b/docs/examples/pop3-uidl.c
index f127120e4..578844ad9 100644
--- a/docs/examples/pop3-uidl.c
+++ b/docs/examples/pop3-uidl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/postinmemory.c b/docs/examples/postinmemory.c
index 376f33450..e2718c5ba 100644
--- a/docs/examples/postinmemory.c
+++ b/docs/examples/postinmemory.c
@@ -104,10 +104,9 @@ int main(void)
/* always cleanup */
curl_easy_cleanup(curl);
-
- /* we're done with libcurl, so clean it up */
- curl_global_cleanup();
}
+
free(chunk.memory);
+ curl_global_cleanup();
return 0;
}
diff --git a/docs/examples/rtsp.c b/docs/examples/rtsp.c
index 75b5d396c..c1fc653ac 100644
--- a/docs/examples/rtsp.c
+++ b/docs/examples/rtsp.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Jim Hollinger
+ * Copyright (c) 2011 - 2020, Jim Hollinger
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -192,7 +192,7 @@ int main(int argc, char * const argv[])
char *base_name = NULL;
printf("\nRTSP request %s\n", VERSION_STR);
- printf(" Project web site: "
+ printf(" Project website: "
"https://github.com/BackupGGCode/rtsprequest\n");
printf(" Requires curl V7.20 or greater\n\n");
diff --git a/docs/examples/sessioninfo.c b/docs/examples/sessioninfo.c
index 86a813a04..98bf2bfd8 100644
--- a/docs/examples/sessioninfo.c
+++ b/docs/examples/sessioninfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,7 @@
#include <curl/curl.h>
#include <gnutls/gnutls.h>
+#include <gnutls/x509.h>
static CURL *curl;
diff --git a/docs/examples/smtp-expn.c b/docs/examples/smtp-expn.c
index fb0ed1d12..bc23c426a 100644
--- a/docs/examples/smtp-expn.c
+++ b/docs/examples/smtp-expn.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/smtp-ssl.c b/docs/examples/smtp-ssl.c
index 019da7d09..7c6296670 100644
--- a/docs/examples/smtp-ssl.c
+++ b/docs/examples/smtp-ssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/smtp-tls.c b/docs/examples/smtp-tls.c
index 671a80d09..94d918b67 100644
--- a/docs/examples/smtp-tls.c
+++ b/docs/examples/smtp-tls.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/smtp-vrfy.c b/docs/examples/smtp-vrfy.c
index 4e0623fb8..50bdc06b2 100644
--- a/docs/examples/smtp-vrfy.c
+++ b/docs/examples/smtp-vrfy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/sslbackend.c b/docs/examples/sslbackend.c
index 14c230390..12e515005 100644
--- a/docs/examples/sslbackend.c
+++ b/docs/examples/sslbackend.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,7 +47,7 @@ int main(int argc, char **argv)
const curl_ssl_backend **list;
int i;
- result = curl_global_sslset(-1, NULL, &list);
+ result = curl_global_sslset((curl_sslbackend)-1, NULL, &list);
assert(result == CURLSSLSET_UNKNOWN_BACKEND);
for(i = 0; list[i]; i++)
@@ -62,7 +62,7 @@ int main(int argc, char **argv)
result = curl_global_sslset((curl_sslbackend)id, NULL, NULL);
}
else
- result = curl_global_sslset(-1, name, NULL);
+ result = curl_global_sslset((curl_sslbackend)-1, name, NULL);
if(result == CURLSSLSET_UNKNOWN_BACKEND) {
fprintf(stderr, "Unknown SSL backend id: %s\n", name);
diff --git a/docs/examples/url2file.c b/docs/examples/url2file.c
index 1bede8c18..314cbe003 100644
--- a/docs/examples/url2file.c
+++ b/docs/examples/url2file.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
/* Switch on full protocol/debug output while testing */
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
- /* disable progress meter, set to 0L to enable and disable debug output */
+ /* disable progress meter, set to 0L to enable it */
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
/* send all data to this function */
diff --git a/docs/examples/usercertinmem.c b/docs/examples/usercertinmem.c
index 2dc264310..7427ae715 100644
--- a/docs/examples/usercertinmem.c
+++ b/docs/examples/usercertinmem.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/docs/examples/version-check.pl b/docs/examples/version-check.pl
index 8f734fc75..14959815c 100755
--- a/docs/examples/version-check.pl
+++ b/docs/examples/version-check.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/docs/libcurl/ABI b/docs/libcurl/ABI.md
index c7c914202..39134a1ae 100644
--- a/docs/libcurl/ABI
+++ b/docs/libcurl/ABI.md
@@ -7,8 +7,7 @@ ABI - Application Binary Interface
[Wikipedia has a longer description](https://en.wikipedia.org/wiki/Application_binary_interface)
-Upgrades
---------
+## Upgrades
In the vast majority of all cases, a typical libcurl upgrade does not break
the ABI at all. Your application can remain using libcurl just as before,
@@ -17,14 +16,12 @@ Upgrades
to verify that your application still builds fine and uses libcurl as it now
is defined to work.
-Version Numbers
----------------
+## Version Numbers
In libcurl land, you really can't tell by the libcurl version number if that
libcurl is binary compatible or not with another libcurl version.
-Soname Bumps
-------------
+## Soname Bumps
Whenever there are changes done to the library that will cause an ABI
breakage, that may require your application to get attention or possibly be
@@ -40,8 +37,7 @@ Soname Bumps
We are determined to bump the SONAME as rarely as possible. Ideally, we
never do it again.
-Downgrades
-----------
+## Downgrades
Going to an older libcurl version from one you're currently using can be a
tricky thing. Mostly we add features and options to newer libcurls as that
@@ -51,18 +47,17 @@ Downgrades
downgrade so far so you cross an ABI break border and thus a different
soname, and then your application may need to adapt to the modified ABI.
-History
--------
+## History
- The previous major library soname number bumps (breaking backwards
- compatibility) have happened the following times:
+ The previous major library soname number bumps (breaking backwards
+ compatibility) have happened the following times:
- 0 - libcurl 7.1, August 2000
+ 0 - libcurl 7.1, August 2000
- 1 - libcurl 7.5 December 2000
+ 1 - libcurl 7.5 December 2000
- 2 - libcurl 7.7 March 2001
+ 2 - libcurl 7.7 March 2001
- 3 - libcurl 7.12.0 June 2004
+ 3 - libcurl 7.12.0 June 2004
- 4 - libcurl 7.16.0 October 2006
+ 4 - libcurl 7.16.0 October 2006
diff --git a/docs/libcurl/CMakeLists.txt b/docs/libcurl/CMakeLists.txt
index 0b32c5054..8ef604a42 100644
--- a/docs/libcurl/CMakeLists.txt
+++ b/docs/libcurl/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Load man_MANS from shared file
transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
diff --git a/docs/libcurl/Makefile.am b/docs/libcurl/Makefile.am
index 041f02ea4..8681dbdfb 100644
--- a/docs/libcurl/Makefile.am
+++ b/docs/libcurl/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -38,7 +38,7 @@ dist_m4macro_DATA = libcurl.m4
CLEANFILES = $(HTMLPAGES) $(PDFPAGES) $(TESTS) $(man_DISTMANS) \
libcurl-symbols.3
-EXTRA_DIST = $(man_MANS) ABI symbols-in-versions symbols.pl \
+EXTRA_DIST = $(man_MANS) ABI.md symbols-in-versions symbols.pl \
mksymbolsmanpage.pl CMakeLists.txt
MAN2HTML= roffit --mandir=. $< >$@
diff --git a/docs/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc
index bd88c9c38..fb7ea89a9 100644
--- a/docs/libcurl/Makefile.inc
+++ b/docs/libcurl/Makefile.inc
@@ -1,3 +1,25 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2008 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
# Shared between Makefile.am and CMakeLists.txt
man_MANS = \
@@ -6,6 +28,9 @@ man_MANS = \
curl_easy_escape.3 \
curl_easy_getinfo.3 \
curl_easy_init.3 \
+ curl_easy_option_by_id.3 \
+ curl_easy_option_by_name.3 \
+ curl_easy_option_next.3 \
curl_easy_pause.3 \
curl_easy_perform.3 \
curl_easy_recv.3 \
@@ -54,6 +79,7 @@ man_MANS = \
curl_multi_socket_all.3 \
curl_multi_strerror.3 \
curl_multi_timeout.3 \
+ curl_multi_wakeup.3 \
curl_multi_wait.3 \
curl_share_cleanup.3 \
curl_share_init.3 \
diff --git a/docs/libcurl/curl_easy_cleanup.3 b/docs/libcurl/curl_easy_cleanup.3
index 002c56c30..bcef9e25b 100644
--- a/docs/libcurl/curl_easy_cleanup.3
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_cleanup 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_cleanup - End a libcurl easy handle
@@ -61,7 +61,7 @@ None
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
index db84f6182..b757e8c0f 100644
--- a/docs/libcurl/curl_easy_duphandle.3
+++ b/docs/libcurl/curl_easy_duphandle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
diff --git a/docs/libcurl/curl_easy_escape.3 b/docs/libcurl/curl_easy_escape.3
index 7d54c6c7b..015b5d9dd 100644
--- a/docs/libcurl/curl_easy_escape.3
+++ b/docs/libcurl/curl_easy_escape.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_escape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_escape - URL encodes the given string
@@ -52,7 +52,7 @@ to the function is encoded correctly.
.SH AVAILABILITY
Added in 7.15.4 and replaces the old \fIcurl_escape(3)\fP function.
.SH RETURN VALUE
-A pointer to a zero terminated string or NULL if it failed.
+A pointer to a null-terminated string or NULL if it failed.
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index 09a0a3db5..938ccd1f3 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_getinfo 3 "August 06, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_getinfo 3 "August 24, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_getinfo - extract information from a curl handle
@@ -42,6 +42,9 @@ You should not free the memory returned by this function unless it is
explicitly mentioned below.
.SH AVAILABLE INFORMATION
The following information can be extracted:
+.IP CURLINFO_EFFECTIVE_METHOD
+Last used HTTP method.
+See \fICURLINFO_EFFECTIVE_METHOD(3)\fP
.IP CURLINFO_EFFECTIVE_URL
Last used URL.
See \fICURLINFO_EFFECTIVE_URL(3)\fP
@@ -139,6 +142,9 @@ See \fICURLINFO_REQUEST_SIZE(3)\fP
.IP CURLINFO_SSL_VERIFYRESULT
Certificate verification result.
See \fICURLINFO_SSL_VERIFYRESULT(3)\fP
+.IP CURLINFO_PROXY_ERROR
+Detailed proxy error.
+See \fICURLINFO_PROXY_ERROR(3)\fP
.IP CURLINFO_PROXY_SSL_VERIFYRESULT
Proxy certificate verification result.
See \fICURLINFO_PROXY_SSL_VERIFYRESULT(3)\fP
@@ -211,7 +217,7 @@ TLS session info that can be used for further processing. See
\fICURLINFO_TLS_SESSION(3)\fP. Deprecated option, use
\fICURLINFO_TLS_SSL_PTR(3)\fP instead!
.IP CURLINFO_CONDITION_UNMET
-Whether or not a time conditional was met.
+Whether or not a time conditional was met or 304 HTTP response.
See \fICURLINFO_CONDITION_UNMET(3)\fP
.IP CURLINFO_RTSP_SESSION_ID
RTSP session ID.
diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
index 4b76c0253..38e062efd 100644
--- a/docs/libcurl/curl_easy_init.3
+++ b/docs/libcurl/curl_easy_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_init 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_init - Start a libcurl easy session
@@ -50,7 +50,7 @@ other curl functions.
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_option_by_id.3 b/docs/libcurl/curl_easy_option_by_id.3
new file mode 100644
index 000000000..5aab60bcf
--- /dev/null
+++ b/docs/libcurl/curl_easy_option_by_id.3
@@ -0,0 +1,47 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_option_by_id 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_easy_option_by_id - find an easy setopt option by id
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+const struct curl_easyoption *curl_easy_option_by_id(CURLoption id);
+.fi
+.SH DESCRIPTION
+Given a CURLoption \fBid\fP, this function returns a pointer to the
+curl_easyoption struct, holding information about the
+\fIcurl_easy_setopt(3)\fP option using that id. The option id is the CURLOPT_
+prefix ones provided in the standard curl/curl.h header file. This function
+will return the non-aliases version for the cases where there is an alias
+function as well.
+
+If libcurl has no option with the given id, this function returns NULL.
+.SH AVAILABILITY
+This function was added in libcurl 7.73.0
+.SH RETURN VALUE
+A pointer to the curl_easyoption struct for the option or NULL.
+.SH "SEE ALSO"
+.BR curl_easy_option_by_name "(3)," curl_easy_option_next "(3),"
+.BR curl_easy_setopt "(3),"
diff --git a/docs/libcurl/curl_easy_option_by_name.3 b/docs/libcurl/curl_easy_option_by_name.3
new file mode 100644
index 000000000..a44006a74
--- /dev/null
+++ b/docs/libcurl/curl_easy_option_by_name.3
@@ -0,0 +1,45 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_option_by_name 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_easy_option_by_name - find an easy setopt option by name
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+const struct curl_easyoption *curl_easy_option_by_name(const char *name);
+.fi
+.SH DESCRIPTION
+Given a \fBname\fP, this function returns a pointer to the curl_easyoption
+struct, holding information about the \fIcurl_easy_setopt(3)\fP option using
+that name. The name should be specified without the "CURLOPT_" prefix and the
+name comparison is made case insensitive.
+
+If libcurl has no option with the given name, this function returns NULL.
+.SH AVAILABILITY
+This function was added in libcurl 7.73.0
+.SH RETURN VALUE
+A pointer to the curl_easyoption struct for the option or NULL.
+.SH "SEE ALSO"
+.BR curl_easy_option_next "(3)," curl_easy_option_by_id "(3),"
+.BR curl_easy_setopt "(3),"
diff --git a/docs/libcurl/curl_easy_option_next.3 b/docs/libcurl/curl_easy_option_next.3
new file mode 100644
index 000000000..56132c98e
--- /dev/null
+++ b/docs/libcurl/curl_easy_option_next.3
@@ -0,0 +1,75 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_easy_option_next 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_easy_option_next - iterate over easy setopt options
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+typedef enum {
+ CURLOT_LONG, /* long (a range of values) */
+ CURLOT_VALUES, /* (a defined set or bitmask) */
+ CURLOT_OFF_T, /* curl_off_t (a range of values) */
+ CURLOT_OBJECT, /* pointer (void *) */
+ CURLOT_STRING, /* (char * to zero terminated buffer) */
+ CURLOT_SLIST, /* (struct curl_slist *) */
+ CURLOT_CBPTR, /* (void * passed as-is to a callback) */
+ CURLOT_BLOB, /* blob (struct curl_blob *) */
+ CURLOT_FUNCTION /* function pointer */
+} curl_easytype;
+
+/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size
+ to use for curl_easy_setopt() for the given id */
+struct curl_easyoption {
+ const char *name;
+ CURLoption id;
+ curl_easytype type;
+ unsigned int flags;
+};
+
+const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev);
+.fi
+.SH DESCRIPTION
+This function returns a pointer to the first or the next curl_easyoption
+struct, providing an ability to iterate over all known options for
+\fIcurl_easy_setopt(3)\fP in this instance of libcurl.
+
+Pass a \fBNULL\fP argument as \fBprev\fP to get the first option returned, or
+pass in the current option to get the next one returned. If there is no more
+option to return, \fIcurl_easy_option_next(3)\fP returns NULL.
+
+The options returned by this functions are the ones known to this libcurl and
+information about what argument type they want.
+
+If the \fBCURLOT_FLAG_ALIAS\fP bit is set in the flags field, it means the
+name is provided for backwards compatibility as an alias.
+.SH AVAILABILITY
+This function was added in libcurl 7.73.0
+.SH RETURN VALUE
+A pointer to the curl_easyoption struct for the next option or NULL if no more
+options.
+.SH "SEE ALSO"
+.BR curl_easy_option_by_name "(3)," curl_easy_option_by_id "(3),"
+.BR curl_easy_setopt "(3),"
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
index 472b524eb..37d3f050c 100644
--- a/docs/libcurl/curl_easy_pause.3
+++ b/docs/libcurl/curl_easy_pause.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_pause - pause and unpause a connection
diff --git a/docs/libcurl/curl_easy_perform.3 b/docs/libcurl/curl_easy_perform.3
index 2e45387e3..eeeb5df9a 100644
--- a/docs/libcurl/curl_easy_perform.3
+++ b/docs/libcurl/curl_easy_perform.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_perform 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_perform - perform a blocking file transfer
@@ -64,7 +64,7 @@ the error buffer when non-zero is returned.
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
index d796a1b88..3212e2c37 100644
--- a/docs/libcurl/curl_easy_recv.3
+++ b/docs/libcurl/curl_easy_recv.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
diff --git a/docs/libcurl/curl_easy_reset.3 b/docs/libcurl/curl_easy_reset.3
index e413c80a0..f9caabba6 100644
--- a/docs/libcurl/curl_easy_reset.3
+++ b/docs/libcurl/curl_easy_reset.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_reset 3 "February 09, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
@@ -34,7 +34,8 @@ default values. This puts back the handle to the same state as it was in when
it was just created with \fIcurl_easy_init(3)\fP.
It does not change the following information kept in the handle: live
-connections, the Session ID cache, the DNS cache, the cookies and shares.
+connections, the Session ID cache, the DNS cache, the cookies, the shares or
+the alt-svc cache.
.SH AVAILABILITY
This function was added in libcurl 7.12.1
.SH RETURN VALUE
diff --git a/docs/libcurl/curl_easy_send.3 b/docs/libcurl/curl_easy_send.3
index dc54c8b94..480b4a29e 100644
--- a/docs/libcurl/curl_easy_send.3
+++ b/docs/libcurl/curl_easy_send.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_send - sends raw data over an "easy" connection
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index a35c996e5..2b67d4ae9 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_setopt 3 "August 09, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_setopt 3 "September 21, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_setopt \- set options for a curl easy handle
@@ -358,6 +358,8 @@ Address of the sender. See \fICURLOPT_MAIL_FROM(3)\fP
Address of the recipients. See \fICURLOPT_MAIL_RCPT(3)\fP
.IP CURLOPT_MAIL_AUTH
Authentication address. See \fICURLOPT_MAIL_AUTH(3)\fP
+.IP CURLOPT_MAIL_RCPT_ALLLOWFAILS
+Allow RCPT TO command to fail for some recipients. See \fICURLOPT_MAIL_RCPT_ALLLOWFAILS(3)\fP
.SH TFTP OPTIONS
.IP CURLOPT_TFTP_BLKSIZE
TFTP block size. See \fICURLOPT_TFTP_BLKSIZE(3)\fP
@@ -505,16 +507,24 @@ Sets the interval at which connection upkeep are performed. See
.SH SSL and SECURITY OPTIONS
.IP CURLOPT_SSLCERT
Client cert. See \fICURLOPT_SSLCERT(3)\fP
+.IP CURLOPT_SSLCERT_BLOB
+Client cert memory buffer. See \fICURLOPT_SSLCERT_BLOB(3)\fP
.IP CURLOPT_PROXY_SSLCERT
Proxy client cert. See \fICURLOPT_PROXY_SSLCERT(3)\fP
+.IP CURLOPT_PROXY_SSLCERT_BLOB
+Proxy client cert memory buffer. See \fICURLOPT_PROXY_SSLCERT_BLOB(3)\fP
.IP CURLOPT_SSLCERTTYPE
Client cert type. See \fICURLOPT_SSLCERTTYPE(3)\fP
.IP CURLOPT_PROXY_SSLCERTTYPE
Proxy client cert type. See \fICURLOPT_PROXY_SSLCERTTYPE(3)\fP
.IP CURLOPT_SSLKEY
Client key. See \fICURLOPT_SSLKEY(3)\fP
+.IP CURLOPT_SSLKEY_BLOB
+Client key memory buffer. See \fICURLOPT_SSLKEY_BLOB(3)\fP
.IP CURLOPT_PROXY_SSLKEY
Proxy client key. See \fICURLOPT_PROXY_SSLKEY(3)\fP
+.IP CURLOPT_PROXY_SSLKEY_BLOB
+Proxy client key. See \fICURLOPT_PROXY_SSLKEY_BLOB(3)\fP
.IP CURLOPT_SSLKEYTYPE
Client key type. See \fICURLOPT_SSLKEYTYPE(3)\fP
.IP CURLOPT_PROXY_SSLKEYTYPE
@@ -523,6 +533,8 @@ Proxy client key type. See \fICURLOPT_PROXY_SSLKEYTYPE(3)\fP
Client key password. See \fICURLOPT_KEYPASSWD(3)\fP
.IP CURLOPT_PROXY_KEYPASSWD
Proxy client key password. See \fICURLOPT_PROXY_KEYPASSWD(3)\fP
+.IP CURLOPT_SSL_EC_CURVES
+Set key exchange curves. See \fICURLOPT_SSL_EC_CURVES(3)\fP
.IP CURLOPT_SSL_ENABLE_ALPN
Enable use of ALPN. See \fICURLOPT_SSL_ENABLE_ALPN(3)\fP
.IP CURLOPT_SSL_ENABLE_NPN
@@ -553,6 +565,12 @@ CA cert bundle. See \fICURLOPT_CAINFO(3)\fP
Proxy CA cert bundle. See \fICURLOPT_PROXY_CAINFO(3)\fP
.IP CURLOPT_ISSUERCERT
Issuer certificate. See \fICURLOPT_ISSUERCERT(3)\fP
+.IP CURLOPT_ISSUERCERT_BLOB
+Issuer certificate memory buffer. See \fICURLOPT_ISSUERCERT_BLOB(3)\fP
+.IP CURLOPT_PROXY_ISSUERCERT
+Proxy issuer certificate. See \fICURLOPT_PROXY_ISSUERCERT(3)\fP
+.IP CURLOPT_PROXY_ISSUERCERT_BLOB
+Proxy issuer certificate memory buffer. See \fICURLOPT_PROXY_ISSUERCERT_BLOB(3)\fP
.IP CURLOPT_CAPATH
Path to CA cert bundle. See \fICURLOPT_CAPATH(3)\fP
.IP CURLOPT_PROXY_CAPATH
@@ -624,6 +642,13 @@ TELNET options. See \fICURLOPT_TELNETOPTIONS(3)\fP
error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors(3)\fP
man page for the full list with descriptions.
+Strings passed on to libcurl must be shorter than 8000000 bytes, otherwise
+\fIcurl_easy_setopt(3)\fP returns \fBCURLE_BAD_FUNCTION_ARGUMENT\fP (added in
+7.65.0).
+
+\fBCURLE_BAD_FUNCTION_ARGUMENT\fP is returned when the argument to an option
+is invalid, like perhaps out of range.a
+
If you try to set an option that libcurl doesn't know about, perhaps because
the library is too old to support it or the option was removed in a recent
version, this function will return \fICURLE_UNKNOWN_OPTION\fP. If support for
@@ -634,7 +659,7 @@ the option was disabled at compile-time, it will return
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
index 2a08f42b8..ce274acdb 100644
--- a/docs/libcurl/curl_easy_strerror.3
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_strerror 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_strerror - return string describing error code
@@ -36,6 +36,6 @@ specific error descriptions generated at run-time.
.SH AVAILABILITY
This function was added in libcurl 7.12.0
.SH RETURN VALUE
-A pointer to a zero terminated string.
+A pointer to a null-terminated string.
.SH "SEE ALSO"
.BR libcurl-errors "(3), " curl_multi_strerror "(3), " curl_share_strerror "(3)"
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
index 3188cfc34..29029a245 100644
--- a/docs/libcurl/curl_easy_unescape.3
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_unescape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_easy_unescape - URL decodes the given string
@@ -50,6 +50,6 @@ You must \fIcurl_free(3)\fP the returned string when you're done with it.
.SH AVAILABILITY
Added in 7.15.4 and replaces the old \fIcurl_unescape(3)\fP function.
.SH RETURN VALUE
-A pointer to a zero terminated string or NULL if it failed.
+A pointer to a null-terminated string or NULL if it failed.
.SH "SEE ALSO"
.BR curl_easy_escape "(3), " curl_free "(3)," RFC 3986
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
index 5ef8dd492..73951cdbb 100644
--- a/docs/libcurl/curl_escape.3
+++ b/docs/libcurl/curl_escape.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_escape 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_escape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_escape - URL encodes the given string
@@ -39,11 +39,11 @@ two-digit hexadecimal number).
If the 'length' argument is set to 0, curl_escape() will use strlen() on the
input 'url' string to find out the size.
-You must curl_free() the returned string when you're done with it.
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
.SH AVAILABILITY
Since 7.15.4, \fIcurl_easy_escape(3)\fP should be used. This function will
be removed in a future release.
.SH RETURN VALUE
-A pointer to a zero terminated string or NULL if it failed.
+A pointer to a null-terminated string or NULL if it failed.
.SH "SEE ALSO"
.BR curl_unescape "(3), " curl_free "(3), " RFC 2396
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
index 51b903c8f..f906a74a6 100644
--- a/docs/libcurl/curl_formadd.3
+++ b/docs/libcurl/curl_formadd.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formadd 3 "December 11, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_formadd 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
diff --git a/docs/libcurl/curl_formfree.3 b/docs/libcurl/curl_formfree.3
index b9732fab8..c027253eb 100644
--- a/docs/libcurl/curl_formfree.3
+++ b/docs/libcurl/curl_formfree.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formfree 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_formfree 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
diff --git a/docs/libcurl/curl_formget.3 b/docs/libcurl/curl_formget.3
index a2054c3b5..950bc5d12 100644
--- a/docs/libcurl/curl_formget.3
+++ b/docs/libcurl/curl_formget.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_formget 3 "September 02, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_formget 3 "September 02, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
diff --git a/docs/libcurl/curl_free.3 b/docs/libcurl/curl_free.3
index abaedea16..99b76e158 100644
--- a/docs/libcurl/curl_free.3
+++ b/docs/libcurl/curl_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_free 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_free 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
diff --git a/docs/libcurl/curl_getdate.3 b/docs/libcurl/curl_getdate.3
index 1457d0b92..6b2e2b5e1 100644
--- a/docs/libcurl/curl_getdate.3
+++ b/docs/libcurl/curl_getdate.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getdate 3 "January 18, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_getdate 3 "January 18, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_getdate - Convert a date string to number of seconds
diff --git a/docs/libcurl/curl_getenv.3 b/docs/libcurl/curl_getenv.3
index 7cbabf6b9..1be19e5bb 100644
--- a/docs/libcurl/curl_getenv.3
+++ b/docs/libcurl/curl_getenv.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_getenv 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_getenv 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_getenv - return value for environment name
@@ -32,15 +32,15 @@ curl_getenv - return value for environment name
curl_getenv() is a portable wrapper for the getenv() function, meant to
emulate its behaviour and provide an identical interface for all operating
systems libcurl builds on (including win32).
+
+You must \fIcurl_free(3)\fP the returned string when you're done with it.
.SH AVAILABILITY
This function will be removed from the public libcurl API in a near future. It
will instead be made "available" by source code access only, and then as
curlx_getenv().
.SH RETURN VALUE
-If successful, curl_getenv() returns a pointer to the value of the specified
-environment. The memory it refers to is malloc()ed so the application must
-free() this when the data is no longer needed. When \fIcurl_getenv(3)\fP fails
-to find the specified name, it returns a null pointer.
+A pointer to a null-terminated string or NULL if it failed to find the
+specified name.
.SH NOTE
Under unix operating systems, there isn't any point in returning an allocated
memory, although other systems won't work properly if this isn't done. The
diff --git a/docs/libcurl/curl_global_cleanup.3 b/docs/libcurl/curl_global_cleanup.3
index eb731c606..e11488261 100644
--- a/docs/libcurl/curl_global_cleanup.3
+++ b/docs/libcurl/curl_global_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_cleanup - global libcurl cleanup
diff --git a/docs/libcurl/curl_global_init.3 b/docs/libcurl/curl_global_init.3
index 6c71388ac..1ff813b04 100644
--- a/docs/libcurl/curl_global_init.3
+++ b/docs/libcurl/curl_global_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_init 3 "January 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_init - Global libcurl initialisation
@@ -88,9 +88,11 @@ Initialise nothing extra. This sets no bit.
A sensible default. It will init both SSL and Win32. Right now, this equals
the functionality of the \fBCURL_GLOBAL_ALL\fP mask.
.IP CURL_GLOBAL_ACK_EINTR
-When this flag is set, curl will acknowledge EINTR condition when connecting
-or when waiting for data. Otherwise, curl waits until full timeout
-elapses. (Added in 7.30.0)
+This bit has no point since 7.69.0 but its behavior is instead the default.
+
+Before 7.69.0: when this flag is set, curl will acknowledge EINTR condition
+when connecting or when waiting for data. Otherwise, curl waits until full
+timeout elapses. (Added in 7.30.0)
.SH RETURN VALUE
If this function returns non-zero, something went wrong and you cannot use the
other curl functions.
diff --git a/docs/libcurl/curl_global_init_mem.3 b/docs/libcurl/curl_global_init_mem.3
index c3e99a822..81d642530 100644
--- a/docs/libcurl/curl_global_init_mem.3
+++ b/docs/libcurl/curl_global_init_mem.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
diff --git a/docs/libcurl/curl_global_sslset.3 b/docs/libcurl/curl_global_sslset.3
index eaabbe402..1b653909b 100644
--- a/docs/libcurl/curl_global_sslset.3
+++ b/docs/libcurl/curl_global_sslset.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_global_sslset 3 "October 30, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_global_sslset 3 "August 07, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_global_sslset - Select SSL backend to use with libcurl
@@ -38,13 +38,14 @@ typedef enum {
CURLSSLBACKEND_GNUTLS = 2,
CURLSSLBACKEND_NSS = 3,
CURLSSLBACKEND_GSKIT = 5,
- CURLSSLBACKEND_POLARSSL = 6,
+ CURLSSLBACKEND_POLARSSL = 6, /* deprecated */
CURLSSLBACKEND_WOLFSSL = 7,
CURLSSLBACKEND_SCHANNEL = 8,
- CURLSSLBACKEND_DARWINSSL = 9,
+ CURLSSLBACKEND_SECURETRANSPORT = 9,
CURLSSLBACKEND_AXTLS = 10, /* deprecated */
CURLSSLBACKEND_MBEDTLS = 11,
- CURLSSLBACKEND_MESALINK = 12
+ CURLSSLBACKEND_MESALINK = 12,
+ CURLSSLBACKEND_BEARSSL = 13
} curl_sslbackend;
.B "CURLsslset curl_global_sslset(curl_sslbackend " id,
diff --git a/docs/libcurl/curl_mime_addpart.3 b/docs/libcurl/curl_mime_addpart.3
index cf19bed32..46264c6c3 100644
--- a/docs/libcurl/curl_mime_addpart.3
+++ b/docs/libcurl/curl_mime_addpart.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_addpart - append a new empty part to a mime structure
diff --git a/docs/libcurl/curl_mime_data.3 b/docs/libcurl/curl_mime_data.3
index 2d3588589..dee6b74a5 100644
--- a/docs/libcurl/curl_mime_data.3
+++ b/docs/libcurl/curl_mime_data.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_data 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_data - set a mime part's body data from memory
@@ -35,7 +35,7 @@ curl_mime_data - set a mime part's body data from memory
\fIdata\fP points to the data bytes: those are copied to the part and their
storage may safely be reused after call.
\fIdatasize\fP is the number of data bytes: it can be set to
-\fICURL_ZERO_TERMINATED\fP to indicate \fIdata\fP is a nul-terminated
+\fICURL_ZERO_TERMINATED\fP to indicate \fIdata\fP is a null-terminated
character string.
\fIpart\fP is the part's to assign contents to.
diff --git a/docs/libcurl/curl_mime_data_cb.3 b/docs/libcurl/curl_mime_data_cb.3
index 6d985f8ff..9733d4459 100644
--- a/docs/libcurl/curl_mime_data_cb.3
+++ b/docs/libcurl/curl_mime_data_cb.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_data_cb - set a callback-based data source for a mime part's body
diff --git a/docs/libcurl/curl_mime_encoder.3 b/docs/libcurl/curl_mime_encoder.3
index d6213e601..279ce9e5d 100644
--- a/docs/libcurl/curl_mime_encoder.3
+++ b/docs/libcurl/curl_mime_encoder.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_encoder 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_encoder - set a mime part's encoder and content transfer encoding
@@ -34,7 +34,7 @@ curl_mime_encoder() requests a mime part's content to be encoded before being
transmitted.
\fIpart\fP is the part's handle to assign an encoder.
-\fIencoding\fP is a pointer to a zero-terminated encoding scheme. It may be
+\fIencoding\fP is a pointer to a null-terminated encoding scheme. It may be
set to NULL to disable an encoder previously attached to the part. The encoding
scheme storage may safely be reused after this function returns.
diff --git a/docs/libcurl/curl_mime_filedata.3 b/docs/libcurl/curl_mime_filedata.3
index 259c10d42..38bc28497 100644
--- a/docs/libcurl/curl_mime_filedata.3
+++ b/docs/libcurl/curl_mime_filedata.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_filedata 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_filedata - set a mime part's body data from a file contents
@@ -36,9 +36,9 @@ data to a mime part.
\fIpart\fP is the part's to assign contents to.
-\fIfilename\fP points to the nul-terminated file's path name. The pointer can
-be NULL to detach the previous part contents settings. Filename storage can be
-safely be reused after this call.
+\fIfilename\fP points to the null-terminated file's path name. The pointer can
+be NULL to detach the previous part contents settings. Filename storage can
+be safely be reused after this call.
As a side effect, the part's remote file name is set to the base name of the
given \fIfilename\fP if it is a valid named file. This can be undone or
diff --git a/docs/libcurl/curl_mime_filename.3 b/docs/libcurl/curl_mime_filename.3
index 1b697c7d7..ebf432515 100644
--- a/docs/libcurl/curl_mime_filename.3
+++ b/docs/libcurl/curl_mime_filename.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_filename 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_filename - set a mime part's remote file name
@@ -37,8 +37,8 @@ associated Content-Disposition generated header.
\fIpart\fP is the part's handle to assign the remote file name to.
-\fIfilename\fP points to the nul-terminated file name string; it may be set to
-NULL to remove a previously attached remote file name.
+\fIfilename\fP points to the null-terminated file name string; it may be set
+to NULL to remove a previously attached remote file name.
The remote file name string is copied into the part, thus the associated
storage may safely be released or reused after call. Setting a part's file
diff --git a/docs/libcurl/curl_mime_free.3 b/docs/libcurl/curl_mime_free.3
index 383534dea..bf7753ce4 100644
--- a/docs/libcurl/curl_mime_free.3
+++ b/docs/libcurl/curl_mime_free.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_free - free a previously built mime structure
diff --git a/docs/libcurl/curl_mime_headers.3 b/docs/libcurl/curl_mime_headers.3
index 39c65a4ba..af148b5c5 100644
--- a/docs/libcurl/curl_mime_headers.3
+++ b/docs/libcurl/curl_mime_headers.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_headers 3 "September 08, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_headers - set a mime part's custom headers
@@ -51,7 +51,7 @@ CURLE_OK or a CURL error code upon failure.
.nf
struct curl_slist *headers = NULL;
- headers = curl_slist_append("Custom-Header: mooo", headers);
+ headers = curl_slist_append(headers, "Custom-Header: mooo");
/* use these headers, please take ownership */
curl_mime_headers(part, headers, TRUE);
diff --git a/docs/libcurl/curl_mime_init.3 b/docs/libcurl/curl_mime_init.3
index 0afa6bfab..b3a1da943 100644
--- a/docs/libcurl/curl_mime_init.3
+++ b/docs/libcurl/curl_mime_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_init 3 "September 16, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_init - create a mime handle
@@ -57,7 +57,7 @@ A mime struct handle, or NULL upon failure.
/* Post and send it. */
curl_easy_setopt(easy, CURLOPT_MIMEPOST, mime);
- curl_easy_setopt(easy, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(easy, CURLOPT_URL, "https://example.com");
curl_easy_perform(easy);
/* Clean-up. */
diff --git a/docs/libcurl/curl_mime_name.3 b/docs/libcurl/curl_mime_name.3
index 66789ef2b..10c5b121f 100644
--- a/docs/libcurl/curl_mime_name.3
+++ b/docs/libcurl/curl_mime_name.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_name 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_name - set a mime part's name
@@ -34,7 +34,7 @@ fields are named.
\fIpart\fP is the part's handle to assign a name to.
-\fIname\fP points to the zero-terminated name string.
+\fIname\fP points to the null-terminated name string.
The name string is copied into the part, thus the associated storage may
safely be released or reused after call. Setting a part's name twice is valid:
diff --git a/docs/libcurl/curl_mime_subparts.3 b/docs/libcurl/curl_mime_subparts.3
index bfb4f244f..9240e81aa 100644
--- a/docs/libcurl/curl_mime_subparts.3
+++ b/docs/libcurl/curl_mime_subparts.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_subparts - set subparts of a multipart mime part
diff --git a/docs/libcurl/curl_mime_type.3 b/docs/libcurl/curl_mime_type.3
index 931eeaf5f..3d9ecbbfd 100644
--- a/docs/libcurl/curl_mime_type.3
+++ b/docs/libcurl/curl_mime_type.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_mime_type 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_mime_type - set a mime part's content type
@@ -34,7 +34,7 @@ curl_mime_type - set a mime part's content type
\fIpart\fP is the part's handle to assign the content type to.
-\fImimetype\fP points to the nul-terminated file mime type string; it may be
+\fImimetype\fP points to the null-terminated file mime type string; it may be
set to NULL to remove a previously attached mime type.
The mime type string is copied into the part, thus the associated storage may
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
index 94a78bb01..253490b03 100644
--- a/docs/libcurl/curl_mprintf.3
+++ b/docs/libcurl/curl_mprintf.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_printf 3 "April 01, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_printf 3 "April 01, 2016" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
diff --git a/docs/libcurl/curl_multi_add_handle.3 b/docs/libcurl/curl_multi_add_handle.3
index 3ced4886b..568a74f1a 100644
--- a/docs/libcurl/curl_multi_add_handle.3
+++ b/docs/libcurl/curl_multi_add_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
diff --git a/docs/libcurl/curl_multi_assign.3 b/docs/libcurl/curl_multi_assign.3
index 03240d8a3..6fd1f2ef5 100644
--- a/docs/libcurl/curl_multi_assign.3
+++ b/docs/libcurl/curl_multi_assign.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_assign 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_assign \- set data to associate with an internal socket
diff --git a/docs/libcurl/curl_multi_cleanup.3 b/docs/libcurl/curl_multi_cleanup.3
index b97eebd6a..8b22a2dfa 100644
--- a/docs/libcurl/curl_multi_cleanup.3
+++ b/docs/libcurl/curl_multi_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_cleanup - close down a multi session
diff --git a/docs/libcurl/curl_multi_fdset.3 b/docs/libcurl/curl_multi_fdset.3
index 2a9411ef3..f1f8d60a9 100644
--- a/docs/libcurl/curl_multi_fdset.3
+++ b/docs/libcurl/curl_multi_fdset.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
diff --git a/docs/libcurl/curl_multi_info_read.3 b/docs/libcurl/curl_multi_info_read.3
index 50633afb4..1a67710fa 100644
--- a/docs/libcurl/curl_multi_info_read.3
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_info_read 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_info_read - read multi stack informationals
diff --git a/docs/libcurl/curl_multi_init.3 b/docs/libcurl/curl_multi_init.3
index 9f1a879ca..e62a84816 100644
--- a/docs/libcurl/curl_multi_init.3
+++ b/docs/libcurl/curl_multi_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_init 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_init - create a multi handle
diff --git a/docs/libcurl/curl_multi_perform.3 b/docs/libcurl/curl_multi_perform.3
index a2db4d0ff..179fbfdd3 100644
--- a/docs/libcurl/curl_multi_perform.3
+++ b/docs/libcurl/curl_multi_perform.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_perform 3 "October 31, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_perform 3 "August 14, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
@@ -104,7 +104,7 @@ default:
.SH "RETURN VALUE"
CURLMcode type, general libcurl multi interface error code.
-Before version 7.20.0: If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
+Before version 7.20.0 (released on February 9 2010): If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this
basically means that you should call \fIcurl_multi_perform(3)\fP again, before
you select() on more actions. You don't have to do it immediately, but the
return code means that libcurl may have more data available to return or that
diff --git a/docs/libcurl/curl_multi_poll.3 b/docs/libcurl/curl_multi_poll.3
index 481858ef2..1a0888ee4 100644
--- a/docs/libcurl/curl_multi_poll.3
+++ b/docs/libcurl/curl_multi_poll.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_poll 3 "July 29, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_poll 3 "November 17, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_poll - polls on all easy handles in a multi handle
@@ -49,10 +49,16 @@ total number of file descriptors on which interesting events occurred. This
number can include both libcurl internal descriptors as well as descriptors
provided in \fIextra_fds\fP.
+The \fIcurl_multi_wakeup(3)\fP function can be used from another thread to
+wake up this function and return faster. This is one of the details
+that makes this function different than \fIcurl_multi_wait(3)\fP which cannot
+be woken up this way.
+
If no extra file descriptors are provided and libcurl has no file descriptor
to offer to wait for, this function will instead wait during \fItimeout_ms\fP
milliseconds (or shorter if an internal timer indicates so). This is the
-detail that makes this function different than \fIcurl_multi_wait(3)\fP.
+other detail that makes this function different than
+\fIcurl_multi_wait(3)\fP.
This function is encouraged to be used instead of select(3) when using the
multi interface to allow applications to easier circumvent the common problem
@@ -108,4 +114,5 @@ CURLMcode type, general libcurl multi interface error code. See
.SH AVAILABILITY
This function was added in libcurl 7.66.0.
.SH "SEE ALSO"
-.BR curl_multi_fdset "(3), " curl_multi_perform "(3), " curl_multi_wait "(3)"
+.BR curl_multi_fdset "(3), " curl_multi_perform "(3), "
+.BR curl_multi_wait "(3), " curl_multi_wakeup "(3)"
diff --git a/docs/libcurl/curl_multi_remove_handle.3 b/docs/libcurl/curl_multi_remove_handle.3
index a9f664e82..2395e3008 100644
--- a/docs/libcurl/curl_multi_remove_handle.3
+++ b/docs/libcurl/curl_multi_remove_handle.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3
index 44dba4ad7..d548c58e5 100644
--- a/docs/libcurl/curl_multi_setopt.3
+++ b/docs/libcurl/curl_multi_setopt.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_setopt 3 "September 24, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_setopt 3 "September 24, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_setopt \- set options for a curl multi handle
diff --git a/docs/libcurl/curl_multi_socket.3 b/docs/libcurl/curl_multi_socket.3
index e82d2e05e..c8f049225 100644
--- a/docs/libcurl/curl_multi_socket.3
+++ b/docs/libcurl/curl_multi_socket.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_socket \- reads/writes available data
diff --git a/docs/libcurl/curl_multi_socket_action.3 b/docs/libcurl/curl_multi_socket_action.3
index f3fed74da..121ac0bcc 100644
--- a/docs/libcurl/curl_multi_socket_action.3
+++ b/docs/libcurl/curl_multi_socket_action.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
diff --git a/docs/libcurl/curl_multi_strerror.3 b/docs/libcurl/curl_multi_strerror.3
index 839d89dfb..b5e5f73d9 100644
--- a/docs/libcurl/curl_multi_strerror.3
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_strerror 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_strerror - return string describing error code
@@ -33,6 +33,6 @@ error code passed in the argument \fIerrornum\fP.
.SH AVAILABILITY
This function was added in libcurl 7.12.0
.SH RETURN VALUE
-A pointer to a zero terminated string.
+A pointer to a null-terminated string.
.SH "SEE ALSO"
.BR libcurl-errors "(3), " curl_easy_strerror "(3), " curl_share_strerror "(3)"
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
index 08fe54b0d..cdbc3de3f 100644
--- a/docs/libcurl/curl_multi_timeout.3
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_timeout 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
diff --git a/docs/libcurl/curl_multi_wait.3 b/docs/libcurl/curl_multi_wait.3
index aeaf989dd..61fe44bda 100644
--- a/docs/libcurl/curl_multi_wait.3
+++ b/docs/libcurl/curl_multi_wait.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_multi_wait 3 "October 31, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_multi_wait 3 "November 28, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
@@ -50,7 +50,8 @@ number can include both libcurl internal descriptors as well as descriptors
provided in \fIextra_fds\fP.
If no extra file descriptors are provided and libcurl has no file descriptor
-to offer to wait for, this function will return immediately.
+to offer to wait for, this function will return immediately. (Try
+\fIcurl_multi_poll(3)\fP instead if you rather avoid this behavior.)
This function is encouraged to be used instead of select(3) when using the
multi interface to allow applications to easier circumvent the common problem
@@ -120,4 +121,4 @@ CURLMcode type, general libcurl multi interface error code. See
.SH AVAILABILITY
This function was added in libcurl 7.28.0.
.SH "SEE ALSO"
-.BR curl_multi_fdset "(3), " curl_multi_perform "(3)"
+.BR curl_multi_fdset "(3), " curl_multi_perform "(3)", curl_multi_poll "(3) ",
diff --git a/docs/libcurl/curl_multi_wakeup.3 b/docs/libcurl/curl_multi_wakeup.3
new file mode 100644
index 000000000..a6be26366
--- /dev/null
+++ b/docs/libcurl/curl_multi_wakeup.3
@@ -0,0 +1,87 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.TH curl_multi_wakeup 3 "November 25, 2019" "libcurl 7.73.0" "libcurl Manual"
+
+.SH NAME
+curl_multi_wakeup - wakes up a sleeping curl_multi_poll call
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+.ad
+.SH DESCRIPTION
+This function can be called from any thread and it wakes up a
+sleeping \fIcurl_multi_poll(3)\fP call that is currently (or will be)
+waiting for activity or a timeout.
+
+If the function is called when there is no \fIcurl_multi_poll(3)\fP call,
+it will cause the next call to return immediately.
+
+Calling this function only guarantees to wake up the current (or the next
+if there is no current) \fIcurl_multi_poll(3)\fP call, which means it is
+possible that multiple calls to this function will wake up the same waiting
+operation.
+
+This function has no effect on \fIcurl_multi_wait(3)\fP calls.
+.SH RETURN VALUE
+CURLMcode type, general libcurl multi interface error code.
+.SH AVAILABILITY
+Added in 7.68.0
+.SH EXAMPLE
+.nf
+CURL *easy_handle;
+CURLM *multi_handle;
+
+/* add the individual easy handle */
+curl_multi_add_handle(multi_handle, easy_handle);
+
+/* this is thread 1 */
+do {
+ CURLMcode mc;
+ int numfds;
+
+ mc = curl_multi_perform(multi_handle, &still_running);
+
+ if(mc == CURLM_OK) {
+ /* wait for activity, timeout or wakeup */
+ mc = curl_multi_poll(multi_handle, NULL, 0, 10000, &numfds);
+ }
+
+ if(time_to_die())
+ exit(1);
+
+} while(still_running);
+
+curl_multi_remove_handle(multi_handle, easy_handle);
+
+/* this is thread 2 */
+
+if(something makes us decide to stop thread 1) {
+
+ set_something_to_signal_thread_1_to_exit();
+
+ curl_multi_wakeup(multi_handle);
+}
+
+.fi
+.SH "SEE ALSO"
+.BR curl_multi_poll "(3), " curl_multi_wait "(3)"
diff --git a/docs/libcurl/curl_share_cleanup.3 b/docs/libcurl/curl_share_cleanup.3
index 325e759c7..b5bdb5d59 100644
--- a/docs/libcurl/curl_share_cleanup.3
+++ b/docs/libcurl/curl_share_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_cleanup - Clean up a shared object
diff --git a/docs/libcurl/curl_share_init.3 b/docs/libcurl/curl_share_init.3
index 40df3c1fb..afbbfad13 100644
--- a/docs/libcurl/curl_share_init.3
+++ b/docs/libcurl/curl_share_init.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_init 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_init 3 "March 23, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_init - Create a shared object
diff --git a/docs/libcurl/curl_share_setopt.3 b/docs/libcurl/curl_share_setopt.3
index be034bf42..f2e5c8c33 100644
--- a/docs/libcurl/curl_share_setopt.3
+++ b/docs/libcurl/curl_share_setopt.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_setopt 3 "June 04, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_setopt 3 "August 11, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_setopt - Set options for a shared object
@@ -60,6 +60,8 @@ be set to one of the values described below.
.RS
.IP CURL_LOCK_DATA_COOKIE
Cookie data will be shared across the easy handles using this shared object.
+Note that this does not activate an easy handle's cookie handling. You can do
+that separately by using \fICURLOPT_COOKIEFILE(3)\fP for example.
.IP CURL_LOCK_DATA_DNS
Cached DNS hosts will be shared across the easy handles using this shared
object. Note that when you use the multi interface, all easy handles added to
@@ -73,10 +75,10 @@ by default. Note this symbol was added in 7.10.3 but was not implemented until
7.23.0.
.IP CURL_LOCK_DATA_CONNECT
Put the connection cache in the share object and make all easy handles using
-this share object share the connection cache. Using this, you can for example
-do multi-threaded libcurl use with one handle in each thread, and yet have a
-shared pool of unused connections and this way get way better connection
-re-use than if you use one separate pool in each thread.
+this share object share the connection cache.
+
+Note that due to a known bug, it is not safe to share connections this way
+between multiple concurrent threads.
Connections that are used for HTTP/1.1 Pipelining or HTTP/2 multiplexing only
get additional transfers added to them if the existing connection is held by
diff --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
index c6b3f9cc8..7667570b8 100644
--- a/docs/libcurl/curl_share_strerror.3
+++ b/docs/libcurl/curl_share_strerror.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_share_strerror 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_share_strerror - return string describing error code
@@ -33,6 +33,6 @@ error code passed in the argument \fIerrornum\fP.
.SH AVAILABILITY
This function was added in libcurl 7.12.0
.SH RETURN VALUE
-A pointer to a zero terminated string.
+A pointer to a null-terminated string.
.SH "SEE ALSO"
.BR libcurl-errors "(3), " curl_multi_strerror "(3), " curl_easy_strerror "(3)"
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
index c0603cbf3..3c84193f4 100644
--- a/docs/libcurl/curl_slist_append.3
+++ b/docs/libcurl/curl_slist_append.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_slist_append - add a string to an slist
diff --git a/docs/libcurl/curl_slist_free_all.3 b/docs/libcurl/curl_slist_free_all.3
index 69bd467b7..39b09d72a 100644
--- a/docs/libcurl/curl_slist_free_all.3
+++ b/docs/libcurl/curl_slist_free_all.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_slist_free_all - free an entire curl_slist list
diff --git a/docs/libcurl/curl_strequal.3 b/docs/libcurl/curl_strequal.3
index 4ab8ce288..481b4fde3 100644
--- a/docs/libcurl/curl_strequal.3
+++ b/docs/libcurl/curl_strequal.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_strequal 3 "June 29, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_strequal 3 "June 29, 2017" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
diff --git a/docs/libcurl/curl_unescape.3 b/docs/libcurl/curl_unescape.3
index 5d8068b20..9775efbe2 100644
--- a/docs/libcurl/curl_unescape.3
+++ b/docs/libcurl/curl_unescape.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_unescape 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_unescape 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_unescape - URL decodes the given string
@@ -44,6 +44,6 @@ You must \fIcurl_free(3)\fP the returned string when you're done with it.
Since 7.15.4, \fIcurl_easy_unescape(3)\fP should be used. This function will
be removed in a future release.
.SH RETURN VALUE
-A pointer to a zero terminated string or NULL if it failed.
+A pointer to a null-terminated string or NULL if it failed.
.SH "SEE ALSO"
.br curl_easy_escape "(3)," curl_easy_unescape "(3)," curl_free "(3)," RFC 2396
diff --git a/docs/libcurl/curl_url.3 b/docs/libcurl/curl_url.3
index 55ef54c6c..98435d39b 100644
--- a/docs/libcurl/curl_url.3
+++ b/docs/libcurl/curl_url.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url 3 "March 22, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url 3 "March 22, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url - returns a new CURLU handle
diff --git a/docs/libcurl/curl_url_cleanup.3 b/docs/libcurl/curl_url_cleanup.3
index 8588b5a99..33b0998ff 100644
--- a/docs/libcurl/curl_url_cleanup.3
+++ b/docs/libcurl/curl_url_cleanup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_cleanup - free a CURLU handle
diff --git a/docs/libcurl/curl_url_dup.3 b/docs/libcurl/curl_url_dup.3
index b9b3270ec..8ab084bb3 100644
--- a/docs/libcurl/curl_url_dup.3
+++ b/docs/libcurl/curl_url_dup.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_dup - duplicate a CURLU handle
diff --git a/docs/libcurl/curl_url_get.3 b/docs/libcurl/curl_url_get.3
index e18af64a6..3209931e7 100644
--- a/docs/libcurl/curl_url_get.3
+++ b/docs/libcurl/curl_url_get.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_get 3 "September 25, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_get 3 "September 25, 2019" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_get - extract a part from a URL
diff --git a/docs/libcurl/curl_url_set.3 b/docs/libcurl/curl_url_set.3
index ca5b35796..6a6c54f1c 100644
--- a/docs/libcurl/curl_url_set.3
+++ b/docs/libcurl/curl_url_set.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_url_set 3 "September 25, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_url_set 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_url_set - set a URL part
@@ -36,7 +36,7 @@ Given the \fIurl\fP handle of an already parsed URL, this function lets the
user set/update individual pieces of it.
The \fIpart\fP argument should identify the particular URL part (see list
-below) to set or change, with \fIcontent\fP pointing to a zero terminated
+below) to set or change, with \fIcontent\fP pointing to a null-terminated
string with the new contents for that URL part. The contents should be in the
form and encoding they'd use in a URL: URL encoded.
@@ -52,7 +52,7 @@ populated with a URL, the new URL can be relative to the previous.
When successfully setting a new URL, relative or absolute, the handle contents
will be replaced with the information of the newly set URL.
-Pass a pointer to a zero terminated string to the \fIurl\fP parameter. The
+Pass a pointer to a null-terminated string to the \fIurl\fP parameter. The
string must point to a correctly formatted "RFC 3986+" URL or be a NULL
pointer.
.IP CURLUPART_SCHEME
@@ -123,6 +123,10 @@ permits empty authority sections, similar to how file scheme is handled.
Returns a CURLUcode error value, which is CURLUE_OK (0) if everything went
fine.
+A URL string passed on to \fIcurl_url_set(3)\fP for the \fBCURLUPART_URL\fP
+part, must be shorter than 8000000 bytes otherwise it returns
+\fBCURLUE_MALFORMED_INPUT\fP (added in 7.65.0).
+
If this function returns an error, no URL part is returned.
.SH EXAMPLE
.nf
diff --git a/docs/libcurl/curl_version.3 b/docs/libcurl/curl_version.3
index 42a2d675c..b192b3264 100644
--- a/docs/libcurl/curl_version.3
+++ b/docs/libcurl/curl_version.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH curl_version 3 "February 03, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_version 3 "June 25, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_version - returns the libcurl version string
@@ -34,7 +34,7 @@ its important components (like OpenSSL version).
We recommend using \fIcurl_version_info(3)\fP instead!
.SH RETURN VALUE
-A pointer to a zero terminated string. The string resides in a statically
+A pointer to a null-terminated string. The string resides in a statically
allocated buffer and must not be freed by the caller.
.SH "SEE ALSO"
.BR curl_version_info "(3)"
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
index 25bd5de8a..9e224b94e 100644
--- a/docs/libcurl/curl_version_info.3
+++ b/docs/libcurl/curl_version_info.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH curl_version_info 3 "August 13, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_version_info 3 "August 27, 2020" "libcurl 7.73.0" "libcurl Manual"
.SH NAME
curl_version_info - returns run-time libcurl version info
@@ -50,7 +50,6 @@ The curl_version_info_data struct looks like this
typedef struct {
CURLversion age; /* see description below */
- /* when 'age' is 0 or higher, the members below also exist: */
const char *version; /* human readable string */
unsigned int version_num; /* numeric representation */
const char *host; /* human readable string */
@@ -60,27 +59,27 @@ typedef struct {
const char *libz_version; /* human readable string */
const char * const *protocols; /* protocols */
- /* when 'age' is 1 or higher, the members below also exist: */
+ /* when 'age' is CURLVERSION_SECOND or higher, the members below exist */
const char *ares; /* human readable string */
int ares_num; /* number */
- /* when 'age' is 2 or higher, the member below also exists: */
+ /* when 'age' is CURLVERSION_THIRD or higher, the members below exist */
const char *libidn; /* human readable string */
- /* when 'age' is 3 or higher (7.16.1 or later), the members below also
- exist */
+ /* when 'age' is CURLVERSION_FOURTH or higher (>= 7.16.1), the members
+ below exist */
int iconv_ver_num; /* '_libiconv_version' if iconv support enabled */
const char *libssh_version; /* human readable string */
- /* when 'age' is 4 or higher (7.57.0 or later), the members below also
- exist */
+ /* when 'age' is CURLVERSION_FIFTH or higher (>= 7.57.0), the members
+ below exist */
unsigned int brotli_ver_num; /* Numeric Brotli version
(MAJOR << 24) | (MINOR << 12) | PATCH */
const char *brotli_version; /* human readable string. */
- /* when 'age is CURLVERSION_SIXTH or alter (7.66.0 or later), these fields
- also exist */
+ /* when 'age' is CURLVERSION_SIXTH or higher (>= 7.66.0), the members
+ below exist */
unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
(MAJOR << 16) | (MINOR << 8) | PATCH */
const char *nghttp2_version; /* human readable string. */
@@ -88,6 +87,17 @@ typedef struct {
const char *quic_version; /* human readable quic (+ HTTP/3) library +
version or NULL */
+ /* when 'age' is CURLVERSION_SEVENTH or higher (>= 7.70.0), the members
+ below exist */
+ const char *cainfo; /* the built-in default CURLOPT_CAINFO, might
+ be NULL */
+ const char *capath; /* the built-in default CURLOPT_CAPATH, might
+ be NULL */
+ /* when 'age' is CURLVERSION_EIGHTH or higher (>= 7.71.0), the members
+ below exist */
+ unsigned int zstd_ver_num; /* Numeric Zstd version
+ (MAJOR << 24) | (MINOR << 12) | PATCH */
+ const char *zstd_version; /* human readable string. */
} curl_version_info_data;
.fi
@@ -117,6 +127,8 @@ more exact timeouts (even on Windows) and less blocking when using the multi
interface. (added in 7.10.7)
.IP CURL_VERSION_BROTLI
supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
+.IP CURL_VERSION_ZSTD
+supports HTTP zstd content encoding using zstd library (Added in 7.72.0)
.IP CURL_VERSION_CONV
libcurl was built with support for character conversions, as provided by the
CURLOPT_CONV_* callbacks. (Added in 7.15.4)
@@ -146,12 +158,15 @@ letters. (Added in 7.12.0)
.IP CURL_VERSION_IPV6
supports IPv6
.IP CURL_VERSION_KERBEROS4
-supports Kerberos V4 (when using FTP)
+supports Kerberos V4 (when using FTP). Legacy bit. Deprecated since 7.33.0.
.IP CURL_VERSION_KERBEROS5
supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy
(Added in 7.40.0)
.IP CURL_VERSION_LARGEFILE
libcurl was built with support for large files. (Added in 7.11.1)
+.IP CURL_VERSION_UNICODE
+libcurl was built with Unicode support on Windows. This makes non-ASCII
+characters work in filenames and options passed to libcurl. (Added in 7.72.0)
.IP CURL_VERSION_LIBZ
supports HTTP deflate using libz (Added in 7.10)
.IP CURL_VERSION_MULTI_SSL
@@ -178,7 +193,8 @@ makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
Digest authentication. It also allows libcurl to use the current user
credentials without the app having to pass them on. (Added in 7.13.2)
.IP CURL_VERSION_TLSAUTH_SRP
-libcurl was built with support for TLS-SRP. (Added in 7.21.4)
+libcurl was built with support for TLS-SRP (in one or more of the built-in TLS
+backends). (Added in 7.21.4)
.IP CURL_VERSION_UNIX_SOCKETS
libcurl was built with support for Unix domain sockets.
(Added in 7.40.0)
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
index 02479acd2..78cae734c 100644
--- a/docs/libcurl/libcurl-easy.3
+++ b/docs/libcurl/libcurl-easy.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "February 03, 2016" "libcurl 7.67.0" "libcurl easy interface"
+.TH libcurl 3 "March 23, 2020" "libcurl 7.73.0" "libcurl easy interface"
.SH NAME
libcurl-easy \- easy interface overview
diff --git a/docs/libcurl/libcurl-env.3 b/docs/libcurl/libcurl-env.3
index 0404570f0..f81244d50 100644
--- a/docs/libcurl/libcurl-env.3
+++ b/docs/libcurl/libcurl-env.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-env 3 "April 17, 2018" "libcurl 7.67.0" "libcurl environment variables"
+.TH libcurl-env 3 "September 16, 2020" "libcurl 7.73.0" "libcurl environment variables"
.SH NAME
libcurl-env \- environment variables libcurl understands
@@ -31,7 +31,7 @@ supports a set of additional environment variables independently of this.
.IP "[scheme]_proxy"
When libcurl is given a URL to use in a transfer, it first extracts the
"scheme" part from the URL and checks if there is a given proxy set for that
-in its corresponding environment variable. A URL like "http://example.com"
+in its corresponding environment variable. A URL like "https://example.com"
will hence use the "http_proxy" variable, while a URL like "ftp://example.com"
will use the "ftp_proxy" variable.
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
index b3579fedb..b16cfc3da 100644
--- a/docs/libcurl/libcurl-errors.3
+++ b/docs/libcurl/libcurl-errors.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-errors 3 "October 31, 2019" "libcurl 7.67.0" "libcurl errors"
+.TH libcurl-errors 3 "July 29, 2020" "libcurl 7.73.0" "libcurl errors"
.SH NAME
libcurl-errors \- error codes in libcurl
@@ -60,9 +60,9 @@ Couldn't resolve proxy. The given proxy host could not be resolved.
Couldn't resolve host. The given remote host was not resolved.
.IP "CURLE_COULDNT_CONNECT (7)"
Failed to connect() to host or proxy.
-.IP "CURLE_FTP_WEIRD_SERVER_REPLY (8)"
-The server sent data libcurl couldn't parse. This error code is used for more
-than just FTP and is aliased as \fICURLE_WEIRD_SERVER_REPLY\fP since 7.51.0.
+.IP "CURLE_WEIRD_SERVER_REPLY (8)"
+The server sent data libcurl couldn't parse. This error code was known as as
+\fICURLE_FTP_WEIRD_SERVER_REPLY\fP before 7.51.0.
.IP "CURLE_REMOTE_ACCESS_DENIED (9)"
We were denied access to the resource given in the URL. For FTP, this occurs
while trying to change to the remote directory.
@@ -148,7 +148,7 @@ Function not found. A required zlib function was not found.
.IP "CURLE_ABORTED_BY_CALLBACK (42)"
Aborted by callback. A callback returned "abort" to libcurl.
.IP "CURLE_BAD_FUNCTION_ARGUMENT (43)"
-Internal error. A function was called with a bad parameter.
+A function was called with a bad parameter.
.IP "CURLE_INTERFACE_FAILED (45)"
Interface error. A specified outgoing interface could not be used. Set which
interface to use for outgoing connections' source IP address with
@@ -257,6 +257,12 @@ Stream error in the HTTP/2 framing layer.
An API function was called from inside a callback.
.IP "CURLE_AUTH_ERROR (94)"
An authentication function returned an error.
+.IP "CURLE_HTTP3 (95)"
+A problem was detected in the HTTP/3 layer. This is somewhat generic and can
+be one out of several problems, see the error buffer for details.
+.IP "CURLE_QUIC_CONNECT_ERROR (96)"
+QUIC connection error. This error may be caused by an SSL library error. QUIC
+is the protocol used for HTTP/3 transfers.
.IP "CURLE_OBSOLETE*"
These error codes will never be returned. They were used in an old libcurl
version and are currently unused.
@@ -266,17 +272,20 @@ interface. Also consider \fIcurl_multi_strerror(3)\fP.
.IP "CURLM_CALL_MULTI_PERFORM (-1)"
This is not really an error. It means you should call
\fIcurl_multi_perform(3)\fP again without doing select() or similar in
-between. Before version 7.20.0 this could be returned by
+between. Before version 7.20.0 (released on February 9 2010) this could be returned by
\fIcurl_multi_perform(3)\fP, but in later versions this return code is never
used.
+.IP "CURLM_CALL_MULTI_SOCKET (-1)"
+An alias for CURLM_CALL_MULTI_PERFORM. Never returned by modern libcurl
+versions.
.IP "CURLM_OK (0)"
Things are fine.
.IP "CURLM_BAD_HANDLE (1)"
The passed-in handle is not a valid CURLM handle.
.IP "CURLM_BAD_EASY_HANDLE (2)"
An easy handle was not good/valid. It could mean that it isn't an easy handle
-at all, or possibly that the handle already is in used by this or another
-multi handle.
+at all, or possibly that the handle already is in use by this or another multi
+handle.
.IP "CURLM_OUT_OF_MEMORY (3)"
You are doomed.
.IP "CURLM_INTERNAL_ERROR (4)"
@@ -292,6 +301,10 @@ An easy handle already added to a multi handle was attempted to get added a
second time. (Added in 7.32.1)
.IP "CURLM_RECURSIVE_API_CALL (8)"
An API function was called from inside a callback.
+.IP "CURLM_WAKEUP_FAILURE (9)"
+Wakeup is unavailable or failed.
+.IP "CURLM_BAD_FUNCTION_ARGUMENT (10)"
+A function was called with a bad parameter.
.SH "CURLSHcode"
The "share" interface will return a CURLSHcode to indicate when an error has
occurred. Also consider \fIcurl_share_strerror(3)\fP.
diff --git a/docs/libcurl/libcurl-multi.3 b/docs/libcurl/libcurl-multi.3
index c457c158d..95c3681ae 100644
--- a/docs/libcurl/libcurl-multi.3
+++ b/docs/libcurl/libcurl-multi.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-multi 3 "October 31, 2019" "libcurl 7.67.0" "libcurl multi interface"
+.TH libcurl-multi 3 "April 26, 2020" "libcurl 7.73.0" "libcurl multi interface"
.SH NAME
libcurl-multi \- how to use the multi interface
@@ -86,12 +86,12 @@ returns back to the calling application.
Your application extracts info from libcurl about when it would like to get
invoked to transfer data or do other work. The most convenient way is to use
-\fIcurl_multi_wait(3)\fP that will help you wait until the application should
+\fIcurl_multi_poll(3)\fP that will help you wait until the application should
call libcurl again. The older API to accomplish the same thing is
\fIcurl_multi_fdset(3)\fP that extracts fd_sets from libcurl to use in
select() or poll() calls in order to get to know when the transfers in the
multi stack might need attention. Both these APIs allow for your program to
-wait for input on your own private file descriptors at the same time
+wait for input on your own private file descriptors at the same time.
\fIcurl_multi_timeout(3)\fP also helps you with providing a suitable timeout
period for your select() calls.
diff --git a/docs/libcurl/libcurl-security.3 b/docs/libcurl/libcurl-security.3
index 4d3980281..2460058e5 100644
--- a/docs/libcurl/libcurl-security.3
+++ b/docs/libcurl/libcurl-security.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-security 3 "July 16, 2019" "libcurl 7.67.0" "libcurl security"
+.TH libcurl-security 3 "September 16, 2020" "libcurl 7.73.0" "libcurl security"
.SH NAME
libcurl-security \- security considerations when using libcurl
@@ -155,7 +155,7 @@ behind a firewall. Applications can mitigate against this by using the
\fICURLOPT_FTP_SKIP_PASV_IP(3)\fP option or \fICURLOPT_FTPPORT(3)\fP.
Local servers sometimes assume local access comes from friends and trusted
-users. An application that expects http://example.com/file_to_read that and
+users. An application that expects https://example.com/file_to_read that and
instead gets http://192.168.0.1/my_router_config might print a file that would
otherwise be protected by the firewall.
@@ -218,6 +218,32 @@ avoid that, keep control of what URLs to use and/or prevent curl/libcurl from
using the protocol.
By default, libcurl prohibits redirects to file:// URLs.
+
+.SH "Warning: file:// on Windows"
+The Windows operating system will automatically, and without any way for
+applications to disable it, try to establish a connection to another host over
+the network and access it (over SMB or other protocols), if only the correct
+file path is accessed.
+
+When first realizing this, the curl team tried to filter out such attempts in
+order to protect applications for inadvertent probes of for example internal
+networks etc. This resulted in CVE-2019-15601 and the associated security fix.
+
+However, we've since been made aware of the fact that the previous fix was far
+from adequate as there are several other ways to accomplish more or less the
+same thing: accessing a remote host over the network instead of the local file
+system.
+
+The conclusion we have come to is that this is a weakness or feature in the
+Windows operating system itself, that we as an application cannot safely
+protect users against. It would just be a whack-a-mole race we don't want to
+participate in. There are too many ways to do it and there's no knob we can
+use to turn off the practice.
+
+If you use curl or libcurl on Windows (any version), disable the use of the
+FILE protocol in curl or be prepared that accesses to a range of "magic paths"
+will potentially make your system try to access other hosts on your
+network. curl cannot protect you against this.
.SH "What if the user can set the URL"
Applications may find it tempting to let users set the URL that it can work
on. That's probably fine, but opens up for mischief and trickery that you as
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
index e054a54e4..decfdf314 100644
--- a/docs/libcurl/libcurl-share.3
+++ b/docs/libcurl/libcurl-share.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-share 3 "November 27, 2017" "libcurl 7.67.0" "libcurl share interface"
+.TH libcurl-share 3 "November 27, 2017" "libcurl 7.73.0" "libcurl share interface"
.SH NAME
libcurl-share \- how to use the share interface
diff --git a/docs/libcurl/libcurl-symbols.3 b/docs/libcurl/libcurl-symbols.3
index ec2e4922f..22c7b4bec 100644
--- a/docs/libcurl/libcurl-symbols.3
+++ b/docs/libcurl/libcurl-symbols.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl-symbols 3 "nov 6, 2019" "libcurl 7.41.0" "libcurl symbols"
+.TH libcurl-symbols 3 "Oct 14, 2020" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
@@ -90,6 +90,7 @@ Introduced in 7.1
Introduced in 7.18.2
.IP CURLE_ALREADY_COMPLETE
Introduced in 7.7.2
+Deprecated since 7.8
.IP CURLE_AUTH_ERROR
Introduced in 7.66.0
.IP CURLE_BAD_CALLING_ORDER
@@ -128,6 +129,7 @@ Introduced in 7.24.0
Introduced in 7.24.0
.IP CURLE_FTP_ACCESS_DENIED
Introduced in 7.1
+Deprecated since 7.17.0
.IP CURLE_FTP_BAD_DOWNLOAD_RESUME
Introduced in 7.1
Deprecated since 7.1
@@ -153,6 +155,7 @@ Deprecated since 7.17.0
Introduced in 7.17.0
.IP CURLE_FTP_COULDNT_STOR_FILE
Introduced in 7.1
+Deprecated since 7.16.3
.IP CURLE_FTP_COULDNT_USE_REST
Introduced in 7.1
.IP CURLE_FTP_PARTIAL_FILE
@@ -179,6 +182,7 @@ Introduced in 7.1
Introduced in 7.1
.IP CURLE_FTP_WEIRD_SERVER_REPLY
Introduced in 7.1
+Deprecated since 7.51.0
.IP CURLE_FTP_WEIRD_USER_REPLY
Introduced in 7.1
Deprecated since 7.17.0
@@ -193,8 +197,11 @@ Introduced in 7.9.1
Introduced in 7.38.0
.IP CURLE_HTTP2_STREAM
Introduced in 7.49.0
+.IP CURLE_HTTP3
+Introduced in 7.68.0
.IP CURLE_HTTP_NOT_FOUND
Introduced in 7.1
+Deprecated since 7.10.3
.IP CURLE_HTTP_PORT_FAILED
Introduced in 7.3
Deprecated since 7.12.0
@@ -238,6 +245,10 @@ Introduced in 7.1
Introduced in 7.1
.IP CURLE_PEER_FAILED_VERIFICATION
Introduced in 7.17.1
+.IP CURLE_PROXY
+Introduced in 7.73.0
+.IP CURLE_QUIC_CONNECT_ERROR
+Introduced in 7.69.0
.IP CURLE_QUOTE_ERROR
Introduced in 7.17.0
.IP CURLE_RANGE_ERROR
@@ -323,6 +334,7 @@ Introduced in 7.5
Introduced in 7.21.5
.IP CURLE_UNKNOWN_TELNET_OPTION
Introduced in 7.7
+Deprecated since 7.21.5
.IP CURLE_UNSUPPORTED_PROTOCOL
Introduced in 7.1
.IP CURLE_UPLOAD_FAILED
@@ -517,6 +529,8 @@ Introduced in 7.9.6
Introduced in 7.9.6
.IP CURLINFO_DOUBLE
Introduced in 7.4.1
+.IP CURLINFO_EFFECTIVE_METHOD
+Introduced in 7.72.0
.IP CURLINFO_EFFECTIVE_URL
Introduced in 7.4
.IP CURLINFO_END
@@ -580,6 +594,8 @@ Introduced in 7.10.3
Introduced in 7.52.0
.IP CURLINFO_PROXYAUTH_AVAIL
Introduced in 7.10.8
+.IP CURLINFO_PROXY_ERROR
+Introduced in 7.73.0
.IP CURLINFO_PROXY_SSL_VERIFYRESULT
Introduced in 7.52.0
.IP CURLINFO_PTR
@@ -677,6 +693,8 @@ Introduced in 7.19.6
Introduced in 7.19.6
.IP CURLKHSTAT_FINE_ADD_TO_FILE
Introduced in 7.19.6
+.IP CURLKHSTAT_FINE_REPLACE
+Introduced in 7.73.0
.IP CURLKHSTAT_REJECT
Introduced in 7.19.6
.IP CURLKHTYPE_DSS
@@ -697,14 +715,14 @@ Introduced in 7.30.0
Introduced in 7.30.0
.IP CURLMOPT_MAXCONNECTS
Introduced in 7.16.3
+.IP CURLMOPT_MAX_CONCURRENT_STREAMS
+Introduced in 7.67.0
.IP CURLMOPT_MAX_HOST_CONNECTIONS
Introduced in 7.30.0
.IP CURLMOPT_MAX_PIPELINE_LENGTH
Introduced in 7.30.0
.IP CURLMOPT_MAX_TOTAL_CONNECTIONS
Introduced in 7.30.0
-.IP CURLMOPT_MAX_CONCURRENT_STREAMS
-Introduced in 7.67.0
.IP CURLMOPT_PIPELINING
Introduced in 7.16.0
.IP CURLMOPT_PIPELINING_SERVER_BL
@@ -731,6 +749,8 @@ Introduced in 7.9.6
Introduced in 7.32.1
.IP CURLM_BAD_EASY_HANDLE
Introduced in 7.9.6
+.IP CURLM_BAD_FUNCTION_ARGUMENT
+Introduced in 7.69.0
.IP CURLM_BAD_HANDLE
Introduced in 7.9.6
.IP CURLM_BAD_SOCKET
@@ -749,6 +769,14 @@ Introduced in 7.9.6
Introduced in 7.59.0
.IP CURLM_UNKNOWN_OPTION
Introduced in 7.15.4
+.IP CURLM_WAKEUP_FAILURE
+Introduced in 7.68.0
+.IP CURLOPT
+Introduced in 7.69.0
+.IP CURLOPTTYPE_BLOB
+Introduced in 7.71.0
+.IP CURLOPTTYPE_CBPOINT
+Introduced in 7.73.0
.IP CURLOPTTYPE_FUNCTIONPOINT
Introduced in 7.1
.IP CURLOPTTYPE_LONG
@@ -757,10 +785,12 @@ Introduced in 7.1
Introduced in 7.1
.IP CURLOPTTYPE_OFF_T
Introduced in 7.11.0
-.IP CURLOPTTYPE_STRINGPOINT
-Introduced in 7.46.0
.IP CURLOPTTYPE_SLISTPOINT
Introduced in 7.65.2
+.IP CURLOPTTYPE_STRINGPOINT
+Introduced in 7.46.0
+.IP CURLOPTTYPE_VALUES
+Introduced in 7.73.0
.IP CURLOPT_ABSTRACT_UNIX_SOCKET
Introduced in 7.53.0
.IP CURLOPT_ACCEPTTIMEOUT_MS
@@ -985,6 +1015,8 @@ Introduced in 7.12.3
Introduced in 7.10.8
.IP CURLOPT_ISSUERCERT
Introduced in 7.19.0
+.IP CURLOPT_ISSUERCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_KEEP_SENDING_ON_ERROR
Introduced in 7.51.0
.IP CURLOPT_KEYPASSWD
@@ -1010,6 +1042,8 @@ Introduced in 7.25.0
Introduced in 7.20.0
.IP CURLOPT_MAIL_RCPT
Introduced in 7.20.0
+.IP CURLOPT_MAIL_RCPT_ALLLOWFAILS
+Introduced in 7.69.0
.IP CURLOPT_MAXAGE_CONN
Introduced in 7.65.0
.IP CURLOPT_MAXCONNECTS
@@ -1126,6 +1160,10 @@ Introduced in 7.52.0
Introduced in 7.52.0
.IP CURLOPT_PROXY_CRLFILE
Introduced in 7.52.0
+.IP CURLOPT_PROXY_ISSUERCERT
+Introduced in 7.71.0
+.IP CURLOPT_PROXY_ISSUERCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_PROXY_KEYPASSWD
Introduced in 7.52.0
.IP CURLOPT_PROXY_PINNEDPUBLICKEY
@@ -1136,10 +1174,14 @@ Introduced in 7.43.0
Introduced in 7.52.0
.IP CURLOPT_PROXY_SSLCERTTYPE
Introduced in 7.52.0
+.IP CURLOPT_PROXY_SSLCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_PROXY_SSLKEY
Introduced in 7.52.0
.IP CURLOPT_PROXY_SSLKEYTYPE
Introduced in 7.52.0
+.IP CURLOPT_PROXY_SSLKEY_BLOB
+Introduced in 7.71.0
.IP CURLOPT_PROXY_SSLVERSION
Introduced in 7.52.0
.IP CURLOPT_PROXY_SSL_CIPHER_LIST
@@ -1266,6 +1308,8 @@ Introduced in 7.1.1
Deprecated since 7.17.0
.IP CURLOPT_SSLCERTTYPE
Introduced in 7.9.3
+.IP CURLOPT_SSLCERT_BLOB
+Introduced in 7.71.0
.IP CURLOPT_SSLENGINE
Introduced in 7.9.3
.IP CURLOPT_SSLENGINE_DEFAULT
@@ -1277,6 +1321,8 @@ Introduced in 7.9.3
Deprecated since 7.17.0
.IP CURLOPT_SSLKEYTYPE
Introduced in 7.9.3
+.IP CURLOPT_SSLKEY_BLOB
+Introduced in 7.71.0
.IP CURLOPT_SSLVERSION
Introduced in 7.1
.IP CURLOPT_SSL_CIPHER_LIST
@@ -1285,6 +1331,8 @@ Introduced in 7.9
Introduced in 7.10.6
.IP CURLOPT_SSL_CTX_FUNCTION
Introduced in 7.10.6
+.IP CURLOPT_SSL_EC_CURVES
+Introduced in 7.73.0
.IP CURLOPT_SSL_ENABLE_ALPN
Introduced in 7.36.0
.IP CURLOPT_SSL_ENABLE_NPN
@@ -1391,6 +1439,24 @@ Introduced in 7.32.0
Introduced in 7.32.0
.IP CURLOPT_XOAUTH2_BEARER
Introduced in 7.33.0
+.IP CURLOT_BLOB
+Introduced in 7.73.0
+.IP CURLOT_CBPTR
+Introduced in 7.73.0
+.IP CURLOT_FUNCTION
+Introduced in 7.73.0
+.IP CURLOT_LONG
+Introduced in 7.73.0
+.IP CURLOT_OBJECT
+Introduced in 7.73.0
+.IP CURLOT_OFF_T
+Introduced in 7.73.0
+.IP CURLOT_SLIST
+Introduced in 7.73.0
+.IP CURLOT_STRING
+Introduced in 7.73.0
+.IP CURLOT_VALUES
+Introduced in 7.73.0
.IP CURLPAUSE_ALL
Introduced in 7.18.0
.IP CURLPAUSE_CONT
@@ -1433,6 +1499,8 @@ Introduced in 7.20.0
Introduced in 7.19.4
.IP CURLPROTO_LDAPS
Introduced in 7.19.4
+.IP CURLPROTO_MQTT
+Introduced in 7.71.0
.IP CURLPROTO_POP3
Introduced in 7.20.0
.IP CURLPROTO_POP3S
@@ -1481,6 +1549,74 @@ Introduced in 7.18.0
Introduced in 7.10
.IP CURLPROXY_SOCKS5_HOSTNAME
Introduced in 7.18.0
+.IP CURLPX_BAD_ADDRESS_TYPE
+Introduced in 7.73.0
+.IP CURLPX_BAD_VERSION
+Introduced in 7.73.0
+.IP CURLPX_CLOSED
+Introduced in 7.73.0
+.IP CURLPX_GSSAPI
+Introduced in 7.73.0
+.IP CURLPX_GSSAPI_PERMSG
+Introduced in 7.73.0
+.IP CURLPX_GSSAPI_PROTECTION
+Introduced in 7.73.0
+.IP CURLPX_IDENTD
+Introduced in 7.73.0
+.IP CURLPX_IDENTD_DIFFER
+Introduced in 7.73.0
+.IP CURLPX_LONG_HOSTNAME
+Introduced in 7.73.0
+.IP CURLPX_LONG_PASSWD
+Introduced in 7.73.0
+.IP CURLPX_LONG_USER
+Introduced in 7.73.0
+.IP CURLPX_NO_AUTH
+Introduced in 7.73.0
+.IP CURLPX_OK
+Introduced in 7.73.0
+.IP CURLPX_RECV_ADDRESS
+Introduced in 7.73.0
+.IP CURLPX_RECV_AUTH
+Introduced in 7.73.0
+.IP CURLPX_RECV_CONNECT
+Introduced in 7.73.0
+.IP CURLPX_RECV_REQACK
+Introduced in 7.73.0
+.IP CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_COMMAND_NOT_SUPPORTED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_CONNECTION_REFUSED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_GENERAL_SERVER_FAILURE
+Introduced in 7.73.0
+.IP CURLPX_REPLY_HOST_UNREACHABLE
+Introduced in 7.73.0
+.IP CURLPX_REPLY_NETWORK_UNREACHABLE
+Introduced in 7.73.0
+.IP CURLPX_REPLY_NOT_ALLOWED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_TTL_EXPIRED
+Introduced in 7.73.0
+.IP CURLPX_REPLY_UNASSIGNED
+Introduced in 7.73.0
+.IP CURLPX_REQUEST_FAILED
+Introduced in 7.73.0
+.IP CURLPX_RESOLVE_HOST
+Introduced in 7.73.0
+.IP CURLPX_SEND_AUTH
+Introduced in 7.73.0
+.IP CURLPX_SEND_CONNECT
+Introduced in 7.73.0
+.IP CURLPX_SEND_REQUEST
+Introduced in 7.73.0
+.IP CURLPX_UNKNOWN_FAIL
+Introduced in 7.73.0
+.IP CURLPX_UNKNOWN_MODE
+Introduced in 7.73.0
+.IP CURLPX_USER_REJECTED
+Introduced in 7.73.0
.IP CURLSHE_BAD_OPTION
Introduced in 7.10.3
.IP CURLSHE_INVALID
@@ -1530,6 +1666,8 @@ Introduced in 7.16.1
.IP CURLSSLBACKEND_AXTLS
Introduced in 7.38.0
Deprecated since 7.61.0
+.IP CURLSSLBACKEND_BEARSSL
+Introduced in 7.68.0
.IP CURLSSLBACKEND_BORINGSSL
Introduced in 7.49.0
.IP CURLSSLBACKEND_CYASSL
@@ -1555,6 +1693,7 @@ Introduced in 7.34.0
Introduced in 7.34.0
.IP CURLSSLBACKEND_POLARSSL
Introduced in 7.34.0
+Deprecated since 7.69.0
.IP CURLSSLBACKEND_QSOSSL
Introduced in 7.34.0
.IP CURLSSLBACKEND_SCHANNEL
@@ -1565,8 +1704,14 @@ Introduced in 7.64.1
Introduced in 7.49.0
.IP CURLSSLOPT_ALLOW_BEAST
Introduced in 7.25.0
+.IP CURLSSLOPT_NATIVE_CA
+Introduced in 7.71.0
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Introduced in 7.68.0
.IP CURLSSLOPT_NO_REVOKE
Introduced in 7.44.0
+.IP CURLSSLOPT_REVOKE_BEST_EFFORT
+Introduced in 7.70.0
.IP CURLSSLSET_NO_BACKENDS
Introduced in 7.56.0
.IP CURLSSLSET_OK
@@ -1653,16 +1798,18 @@ Introduced in 7.62.0
Introduced in 7.62.0
.IP CURLU_NON_SUPPORT_SCHEME
Introduced in 7.62.0
-.IP CURLU_NO_DEFAULT_PORT
-Introduced in 7.62.0
.IP CURLU_NO_AUTHORITY
Introduced in 7.67.0
+.IP CURLU_NO_DEFAULT_PORT
+Introduced in 7.62.0
.IP CURLU_PATH_AS_IS
Introduced in 7.62.0
.IP CURLU_URLDECODE
Introduced in 7.62.0
.IP CURLU_URLENCODE
Introduced in 7.62.0
+.IP CURLVERSION_EIGHTH
+Introduced in 7.72.0
.IP CURLVERSION_FIFTH
Introduced in 7.57.0
.IP CURLVERSION_FIRST
@@ -1673,10 +1820,12 @@ Introduced in 7.16.1
Introduced in 7.10
.IP CURLVERSION_SECOND
Introduced in 7.11.1
-.IP CURLVERSION_THIRD
-Introduced in 7.12.0
+.IP CURLVERSION_SEVENTH
+Introduced in 7.70.0
.IP CURLVERSION_SIXTH
Introduced in 7.66.0
+.IP CURLVERSION_THIRD
+Introduced in 7.12.0
.IP CURL_CHUNK_BGN_FUNC_FAIL
Introduced in 7.21.0
.IP CURL_CHUNK_BGN_FUNC_OK
@@ -1835,12 +1984,16 @@ Introduced in 7.14.0
Introduced in 7.14.0
.IP CURL_POLL_REMOVE
Introduced in 7.14.0
+.IP CURL_PROGRESSFUNC_CONTINUE
+Introduced in 7.68.0
.IP CURL_PROGRESS_BAR
Introduced in 7.1.1
.IP CURL_PROGRESS_STATS
Introduced in 7.1.1
.IP CURL_PUSH_DENY
Introduced in 7.44.0
+.IP CURL_PUSH_ERROROUT
+Introduced in 7.72.0
.IP CURL_PUSH_OK
Introduced in 7.44.0
.IP CURL_READFUNC_ABORT
@@ -1957,8 +2110,6 @@ Introduced in 7.15.4
Introduced in 7.19.6
.IP CURL_VERSION_DEBUG
Introduced in 7.10.6
-.IP CURL_VERSION_ESNI
-Introduced in 7.67.0
.IP CURL_VERSION_GSSAPI
Introduced in 7.38.0
.IP CURL_VERSION_GSSNEGOTIATE
@@ -1999,14 +2150,20 @@ Introduced in 7.10
Introduced in 7.13.2
.IP CURL_VERSION_TLSAUTH_SRP
Introduced in 7.21.4
+.IP CURL_VERSION_UNICODE
+Introduced in 7.72.0
.IP CURL_VERSION_UNIX_SOCKETS
Introduced in 7.40.0
+.IP CURL_VERSION_ZSTD
+Introduced in 7.72.0
.IP CURL_WAIT_POLLIN
Introduced in 7.28.0
.IP CURL_WAIT_POLLOUT
Introduced in 7.28.0
.IP CURL_WAIT_POLLPRI
Introduced in 7.28.0
+.IP CURL_WIN32
+Introduced in 7.69.0
.IP CURL_WRITEFUNC_PAUSE
Introduced in 7.18.0
.IP CURL_ZERO_TERMINATED
diff --git a/docs/libcurl/libcurl-thread.3 b/docs/libcurl/libcurl-thread.3
index b608b8957..1205c1b23 100644
--- a/docs/libcurl/libcurl-thread.3
+++ b/docs/libcurl/libcurl-thread.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.67.0" "libcurl thread safety"
+.TH libcurl-thread 3 "August 07, 2020" "libcurl 7.73.0" "libcurl thread safety"
.SH NAME
libcurl-thread \- libcurl thread safety
@@ -60,7 +60,7 @@ https://gnutls.org/manual/html_node/Thread-safety.html
thread-safe already without anything required.
.IP Secure-Transport
The engine is used by libcurl in a way that is fully thread-safe.
-.IP WinSSL
+.IP Schannel
The engine is used by libcurl in a way that is fully thread-safe.
.IP wolfSSL
The engine is used by libcurl in a way that is fully thread-safe.
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
index cee2082c0..853c1f0c4 100644
--- a/docs/libcurl/libcurl-tutorial.3
+++ b/docs/libcurl/libcurl-tutorial.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH libcurl-tutorial 3 "October 31, 2019" "libcurl 7.67.0" "libcurl programming"
+.TH libcurl-tutorial 3 "October 31, 2019" "libcurl 7.73.0" "libcurl programming"
.SH NAME
libcurl-tutorial \- libcurl programming tutorial
diff --git a/docs/libcurl/libcurl-url.3 b/docs/libcurl/libcurl-url.3
index ad75c7a53..f912fce29 100644
--- a/docs/libcurl/libcurl-url.3
+++ b/docs/libcurl/libcurl-url.3
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "September 10, 2018" "libcurl 7.67.0" "libcurl url interface"
+.TH libcurl 3 "September 10, 2018" "libcurl 7.73.0" "libcurl url interface"
.SH NAME
libcurl-url \- URL interface overview
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
index dd0d16ce0..15ac51b0a 100644
--- a/docs/libcurl/libcurl.3
+++ b/docs/libcurl/libcurl.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -19,7 +19,7 @@
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
-.TH libcurl 3 "July 15, 2017" "libcurl 7.67.0" "libcurl overview"
+.TH libcurl 3 "March 23, 2020" "libcurl 7.73.0" "libcurl overview"
.SH NAME
libcurl \- client-side URL transfers
diff --git a/docs/libcurl/libcurl.m4 b/docs/libcurl/libcurl.m4
index 53d694d0a..c3c17661b 100644
--- a/docs/libcurl/libcurl.m4
+++ b/docs/libcurl/libcurl.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2006, David Shaw <dshaw@jabberwocky.com>
+# Copyright (C) 2006 - 2020, David Shaw <dshaw@jabberwocky.com>
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/docs/libcurl/mksymbolsmanpage.pl b/docs/libcurl/mksymbolsmanpage.pl
index 8ae202e46..21860a0e0 100755
--- a/docs/libcurl/mksymbolsmanpage.pl
+++ b/docs/libcurl/mksymbolsmanpage.pl
@@ -6,7 +6,7 @@
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
-# * Copyright (C) 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
diff --git a/docs/libcurl/opts/CMakeLists.txt b/docs/libcurl/opts/CMakeLists.txt
index 709d3e4b8..98acedf2a 100644
--- a/docs/libcurl/opts/CMakeLists.txt
+++ b/docs/libcurl/opts/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Load man_MANS from shared file
transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
diff --git a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
index f76c3746c..bd38d48c3 100644
--- a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
@@ -30,15 +30,17 @@ CURLINFO_ACTIVESOCKET \- get the active socket
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_ACTIVESOCKET,
curl_socket_t *socket);
.SH DESCRIPTION
-Pass a pointer to a curl_socket_t to receive the active socket used by this
-curl session. If the socket is no longer valid, \fICURL_SOCKET_BAD\fP is
-returned. When you finish working with the socket, you must call
-\fIcurl_easy_cleanup(3)\fP as usual on the easy handle and let libcurl close
-the socket and cleanup other resources associated with the handle. This is
-typically used in combination with \fICURLOPT_CONNECT_ONLY(3)\fP.
+Pass a pointer to a curl_socket_t to receive the most recently active socket
+used for the transfer connection by this curl session. If the socket is no
+longer valid, \fICURL_SOCKET_BAD\fP is returned. When you are finished working
+with the socket, you must call \fIcurl_easy_cleanup(3)\fP as usual on the easy
+handle and let libcurl close the socket and cleanup other resources associated
+with the handle. This option returns the active socket only after the transfer
+is complete, and is typically used in combination with
+\fICURLOPT_CONNECT_ONLY(3)\fP, which skips the transfer phase.
-This option was added as a replacement for \fICURLINFO_LASTSOCKET(3)\fP since
-that one isn't working on all platforms.
+\fICURLINFO_ACTIVESOCKET(3)\fP was added as a replacement for
+\fICURLINFO_LASTSOCKET(3)\fP since that one isn't working on all platforms.
.SH PROTOCOLS
All
.SH EXAMPLE
@@ -46,7 +48,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
curl_socket_t sockfd;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
index 6d95889f1..bd50055b6 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
index aa6e80d7d..498053a54 100644
--- a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is completed
diff --git a/docs/libcurl/opts/CURLINFO_CERTINFO.3 b/docs/libcurl/opts/CURLINFO_CERTINFO.3
index af68da442..f7be3209f 100644
--- a/docs/libcurl/opts/CURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/CURLINFO_CERTINFO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "July 04, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
@@ -28,10 +28,10 @@ CURLINFO_CERTINFO \- get the TLS certificate chain
#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CERTINFO,
- struct curl_certinfo *chainp);
+ struct curl_certinfo **chainp);
.SH DESCRIPTION
Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to
-struct that holds a number of linked lists with info about the certificate
+a struct that holds a number of linked lists with info about the certificate
chain, assuming you had \fICURLOPT_CERTINFO(3)\fP enabled when the request was
made. The struct reports how many certs it found and then you can extract info
for each of those certs by following the linked lists. The info chain is
diff --git a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
index b88ec384e..98d72d10c 100644
--- a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,10 +20,10 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
-CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
+CURLINFO_CONDITION_UNMET \- get info on unmet time conditional or 304 HTTP response.
.SH SYNOPSIS
#include <curl/curl.h>
@@ -33,14 +33,16 @@ Pass a pointer to a long to receive the number 1 if the condition provided in
the previous request didn't match (see \fICURLOPT_TIMECONDITION(3)\fP). Alas,
if this returns a 1 you know that the reason you didn't get data in return is
because it didn't fulfill the condition. The long this argument points to will
-get a zero stored if the condition instead was met.
+get a zero stored if the condition instead was met. This can also return 1 if
+the server responded with a 304 HTTP status code, for example after sending a
+custom "If-Match-*" header.
.SH PROTOCOLS
HTTP and some
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
index 624691fa6..bee7a2fa0 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
index 476377c4a..a924573c3 100644
--- a/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONNECT_TIME_T \- get the time until connect
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
index f1bbffb3d..d01f10750 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
@@ -42,7 +42,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
index ee5fa2e72..65647284f 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
@@ -39,7 +39,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
index 4534d1929..ab45f583c 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
@@ -41,7 +41,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the upload */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
index ad0280166..e562e805a 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
@@ -38,7 +38,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the upload */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
index 04a6e6af9..6a739d6ee 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONTENT_TYPE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
@@ -43,7 +43,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_COOKIELIST.3 b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
index 1880eff7b..4ce9ba31a 100644
--- a/docs/libcurl/opts/CURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
@@ -44,10 +44,10 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
- /* enable the cookie engine with a non-existing file */
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "-");
+ /* enable the cookie engine */
+ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
res = curl_easy_perform(curl);
@@ -59,7 +59,7 @@ if(curl) {
/* a linked list of cookies in cookie file format */
struct curl_slist *each = cookies;
while(each) {
- printf("%s", each->data);
+ printf("%s\\n", each->data);
each = each->next;
}
/* we must free these cookies when we're done */
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3
new file mode 100644
index 000000000..36cf62149
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_METHOD.3
@@ -0,0 +1,69 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_EFFECTIVE_METHOD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_EFFECTIVE_METHOD \- get the last used HTTP method
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_EFFECTIVE_METHOD,
+ char **methodp);
+.fi
+.SH DESCRIPTION
+Pass in a pointer to a char pointer and get the last used effective HTTP
+method.
+
+In cases when you've asked libcurl to follow redirects, the method may very
+well not be the same method the first request would use.
+
+The \fBmethodp\fP pointer will be NULL or pointing to private memory you MUST
+NOT free - it gets freed when you call \fIcurl_easy_cleanup(3)\fP on the
+corresponding CURL handle.
+.SH PROTOCOLS
+HTTP(S)
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data");
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ res = curl_easy_perform(curl);
+ if(res == CURLE_OK) {
+ char *method = NULL;
+ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_METHOD, &method);
+ if(method)
+ printf("Redirected to method: %s\\n", method);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.72.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
index 39be19b03..a3066efff 100644
--- a/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
+++ b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_EFFECTIVE_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
@@ -44,7 +44,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME.3 b/docs/libcurl/opts/CURLINFO_FILETIME.3
index 55cd8e4f2..04185bbad 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME_T.3 b/docs/libcurl/opts/CURLINFO_FILETIME_T.3
index c93bfe879..4d3556a69 100644
--- a/docs/libcurl/opts/CURLINFO_FILETIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_FILETIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FILETIME_T \- get the remote time of the retrieved document
diff --git a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3 b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
index 36afa95bd..c38dc5464 100644
--- a/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
+++ b/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
diff --git a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3 b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
index 05482b24f..71aa2d9cf 100644
--- a/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HEADER_SIZE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
@@ -41,7 +41,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long size;
diff --git a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
index f879acc5c..0dadef431 100644
--- a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTPAUTH_AVAIL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
@@ -39,7 +39,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
index 503156acf..68e2b9854 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
index 1054cdb6d..8600f64a3 100644
--- a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_HTTP_VERSION 3 "August 07, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_HTTP_VERSION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
@@ -40,7 +40,7 @@ HTTP
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long http_version;
diff --git a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3 b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
index d3bff6459..9e436a10e 100644
--- a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_LASTSOCKET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
@@ -48,7 +48,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
long sockfd; /* doesn't work on win64! */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3 b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
index f0a9a44f4..f336c40ef 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_IP 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
@@ -29,7 +29,7 @@ CURLINFO_LOCAL_IP \- get local IP address of last connection
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_IP, char **ip);
.SH DESCRIPTION
-Pass a pointer to a char pointer to receive the pointer to a zero-terminated
+Pass a pointer to a char pointer to receive the pointer to a null-terminated
string holding the IP address of the local end of most recent connection done
with this \fBcurl\fP handle. This string may be IPv6 when that is
enabled. Note that you get a pointer to a memory area that will be re-used at
@@ -46,7 +46,7 @@ All
{
char *ip;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
index 212fe2cc7..5e690c763 100644
--- a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_LOCAL_PORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
@@ -41,7 +41,7 @@ All
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
res = curl_easy_perform(curl);
if(CURLE_OK == res) {
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
index 475a2c8e1..40e936edd 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
index f6105911d..833991a87 100644
--- a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
diff --git a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3 b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
index cf0f5c27d..96f7d5f21 100644
--- a/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
+++ b/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_NUM_CONNECTS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
@@ -42,7 +42,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
diff --git a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3 b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
index f37fdef5c..ef58727f7 100644
--- a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_OS_ERRNO 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_OS_ERRNO 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
@@ -39,7 +39,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
long error;
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
index 2a9af4882..97f7d4366 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
index a94f8e8c1..ecbd4f48e 100644
--- a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
index 11f4fd683..f78097b7d 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_IP 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
@@ -29,7 +29,7 @@ CURLINFO_PRIMARY_IP \- get IP address of last connection
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_IP, char **ip);
.SH DESCRIPTION
-Pass a pointer to a char pointer to receive the pointer to a zero-terminated
+Pass a pointer to a char pointer to receive the pointer to a null-terminated
string holding the IP address of the most recent connection done with this
\fBcurl\fP handle. This string may be IPv6 when that is enabled. Note that you
get a pointer to a memory area that will be re-used at next request so you
@@ -45,7 +45,7 @@ All network based ones
{
char *ip;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
index 4b9b240a4..622cb990f 100644
--- a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
+++ b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIMARY_PORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
@@ -38,7 +38,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long port;
diff --git a/docs/libcurl/opts/CURLINFO_PRIVATE.3 b/docs/libcurl/opts/CURLINFO_PRIVATE.3
index 805f881d5..337392242 100644
--- a/docs/libcurl/opts/CURLINFO_PRIVATE.3
+++ b/docs/libcurl/opts/CURLINFO_PRIVATE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PRIVATE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PRIVATE \- get the private pointer
@@ -40,7 +40,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
void *pointer = 0x2345454;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* set the private pointer */
curl_easy_setopt(curl, CURLOPT_PRIVATE, pointer);
diff --git a/docs/libcurl/opts/CURLINFO_PROTOCOL.3 b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
index 438ce6dda..cecf67986 100644
--- a/docs/libcurl/opts/CURLINFO_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROTOCOL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
@@ -39,7 +39,7 @@ CURLPROTO_IMAPS, CURLPROTO_LDAP, CURLPROTO_LDAPS, CURLPROTO_POP3,
CURLPROTO_POP3S, CURLPROTO_RTMP, CURLPROTO_RTMPE, CURLPROTO_RTMPS,
CURLPROTO_RTMPT, CURLPROTO_RTMPTE, CURLPROTO_RTMPTS, CURLPROTO_RTSP,
CURLPROTO_SCP, CURLPROTO_SFTP, CURLPROTO_SMB, CURLPROTO_SMBS, CURLPROTO_SMTP,
-CURLPROTO_SMTPS, CURLPROTO_TELNET, CURLPROTO_TFTP
+CURLPROTO_SMTPS, CURLPROTO_TELNET, CURLPROTO_TFTP, CURLPROTO_MQTT
.SH PROTOCOLS
All
.SH EXAMPLE
@@ -47,7 +47,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long protocol;
diff --git a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
index d0e8ae6dd..5b8da3dac 100644
--- a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
+++ b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXYAUTH_AVAIL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
@@ -39,7 +39,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_ERROR.3 b/docs/libcurl/opts/CURLINFO_PROXY_ERROR.3
new file mode 100644
index 000000000..5d95a4366
--- /dev/null
+++ b/docs/libcurl/opts/CURLINFO_PROXY_ERROR.3
@@ -0,0 +1,105 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLINFO_PROXY_ERROR 3 "August 24, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
+
+.SH NAME
+CURLINFO_PROXY_ERROR \- get the detailed (SOCKS) proxy error
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+typedef enum {
+ CURLPX_OK,
+ CURLPX_BAD_ADDRESS_TYPE,
+ CURLPX_BAD_VERSION,
+ CURLPX_CLOSED,
+ CURLPX_GSSAPI,
+ CURLPX_GSSAPI_PERMSG,
+ CURLPX_GSSAPI_PROTECTION,
+ CURLPX_IDENTD,
+ CURLPX_IDENTD_DIFFER,
+ CURLPX_LONG_HOSTNAME,
+ CURLPX_LONG_PASSWD,
+ CURLPX_LONG_USER,
+ CURLPX_NO_AUTH,
+ CURLPX_RECV_ADDRESS,
+ CURLPX_RECV_AUTH,
+ CURLPX_RECV_CONNECT,
+ CURLPX_RECV_REQACK,
+ CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED,
+ CURLPX_REPLY_COMMAND_NOT_SUPPORTED,
+ CURLPX_REPLY_CONNECTION_REFUSED,
+ CURLPX_REPLY_GENERAL_SERVER_FAILURE,
+ CURLPX_REPLY_HOST_UNREACHABLE,
+ CURLPX_REPLY_NETWORK_UNREACHABLE,
+ CURLPX_REPLY_NOT_ALLOWED,
+ CURLPX_REPLY_TTL_EXPIRED,
+ CURLPX_REPLY_UNASSIGNED,
+ CURLPX_REQUEST_FAILED,
+ CURLPX_RESOLVE_HOST,
+ CURLPX_SEND_AUTH,
+ CURLPX_SEND_CONNECT,
+ CURLPX_SEND_REQUEST,
+ CURLPX_UNKNOWN_FAIL,
+ CURLPX_UNKNOWN_MODE,
+ CURLPX_USER_REJECTED,
+ CURLPX_LAST /* never use */
+} CURLproxycode;
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXY_ERROR, long *detail);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a long to receive a detailed error code when the most recent
+transfer returned a CURLE_PROXY error.
+
+The return value will match the CURLproxycode set.
+
+The returned value will be zero (equal to CURLPX_OK) if no such response code
+was available.
+.SH PROTOCOLS
+All that can be done over SOCKS
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+ curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://127.0.0.1");
+ res = curl_easy_perform(curl);
+ if(res == CURLE_PROXY) {
+ long proxycode;
+ res = curl_easy_getinfo(curl, CURLINFO_PROXY_ERROR, &proxycode);
+ if(!res && proxycode)
+ printf("The detailed proxy error: %ld\\n", proxycode);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.73.0
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLINFO_RESPONSE_CODE "(3), " libcurl-errors "(3), "
+.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
index beeb3bd99..c48e6ba00 100644
--- a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
index 7ed3775f4..bf88f4494 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_COUNT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
@@ -38,7 +38,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
index 46b7b7364..5748f169b 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
index 77623fb5f..ca87a6f55 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
index 8fdc740b5..8d3f91792 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REDIRECT_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
@@ -44,7 +44,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
char *url = NULL;
diff --git a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
index a3a67aac2..af83f1e42 100644
--- a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
+++ b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_REQUEST_SIZE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
@@ -39,7 +39,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long req;
diff --git a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
index af49e8556..649f9d66f 100644
--- a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RESPONSE_CODE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
@@ -43,7 +43,7 @@ HTTP, FTP and SMTP
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long response_code;
diff --git a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
index 366e749da..8ad9e56ad 100644
--- a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
+++ b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RETRY_AFTER 3 "August 06, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RETRY_AFTER 3 "October 03, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
@@ -30,11 +30,11 @@ CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RETRY_AFTER, curl_off_t *retry);
.SH DESCRIPTION
Pass a pointer to a curl_off_t variable to receive the number of seconds the
-HTTP server suggesets the client should wait until the next request is
+HTTP server suggests the client should wait until the next request is
issued. The information from the "Retry-After:" header.
While the HTTP header might contain a fixed date string, the
-\fICURLINFO_RETRY_AFTER(3)\fP will alwaus return number of seconds to wait -
+\fICURLINFO_RETRY_AFTER(3)\fP will always return number of seconds to wait -
or zero if there was no header or the header couldn't be parsed.
.SH DEFAULT
Returns zero delay if there was no header.
@@ -45,7 +45,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
curl_off_t wait = 0;
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
index c17ed75be..4dfe53d09 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3 b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
index 3910cce0f..33edf441f 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
index 33c976a45..dd3f0ded4 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
index 0b92c51a7..246720961 100644
--- a/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
diff --git a/docs/libcurl/opts/CURLINFO_SCHEME.3 b/docs/libcurl/opts/CURLINFO_SCHEME.3
index a96e27399..ed101540d 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
@@ -29,7 +29,7 @@ CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the co
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, char **scheme);
.SH DESCRIPTION
-Pass a pointer to a char pointer to receive the pointer to a zero-terminated
+Pass a pointer to a char pointer to receive the pointer to a null-terminated
string holding the URL scheme used for the most recent connection done with
this CURL \fBhandle\fP.
@@ -43,7 +43,7 @@ All
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
char *scheme = NULL;
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
index 153b280d8..db5763a4f 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
@@ -43,7 +43,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
index 694f1ad50..8efd0a8e5 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_DOWNLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
index 7a0ebea8b..3f2bd192e 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
index 089edfb0d..bc639ddb4 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SIZE_UPLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
@@ -37,7 +37,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
index 6ccb045f5..e8a78d5db 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
@@ -39,7 +39,7 @@ sensible variable type.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
index e11d7f25d..9a9f66a19 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_DOWNLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_DOWNLOAD_T \- get download speed
@@ -36,7 +36,7 @@ that curl measured for the complete download. Measured in bytes/second.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
index aaadcf472..fccc1cec8 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
@@ -39,7 +39,7 @@ sensible variable type.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
index 1611431aa..759049784 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SPEED_UPLOAD_T 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SPEED_UPLOAD_T \- get upload speed
@@ -36,7 +36,7 @@ curl measured for the complete upload. Measured in bytes/second.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Perform the request */
res = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
index 2561e5188..6cccb93e9 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
diff --git a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
index 3a66feb7b..2ab59be62 100644
--- a/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
+++ b/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SSL_VERIFYRESULT 3 "May 02, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
@@ -31,7 +31,7 @@ CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_VERIFYRESULT, long *result
.SH DESCRIPTION
Pass a pointer to a long to receive the result of the server SSL certificate
verification that was requested (using the \fICURLOPT_SSL_VERIFYPEER(3)\fP
-option.
+option).
0 is a positive result. Non-zero is an error.
.SH PROTOCOLS
@@ -51,7 +51,7 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-Added in 7.5. Only set by the OpenSSL/libressl/boringssl and NSS backends.
+Added in 7.5. Only set by the OpenSSL/libressl/boringssl, NSS and GnuTLS backends.
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
index b23a54d32..e0407fd2b 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
index 082d39bb4..972ebe3f8 100644
--- a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3 b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
index 6ad3956a3..05c88e147 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3 b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
index 24e166243..a74e519e8 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TLS_SSL_PTR 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TLS_SSL_PTR 3 "August 07, 2020" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
@@ -55,11 +55,11 @@ struct curl_tlssessioninfo {
The \fIbackend\fP struct member is one of the defines in the CURLSSLBACKEND_*
series: CURLSSLBACKEND_NONE (when built without TLS support),
-CURLSSLBACKEND_WOLFSSL, CURLSSLBACKEND_DARWINSSL,
-CURLSSLBACKEND_GNUTLS, CURLSSLBACKEND_GSKIT, CURLSSLBACKEND_MBEDTLS,
-CURLSSLBACKEND_NSS, CURLSSLBACKEND_OPENSSL, CURLSSLBACKEND_POLARSSL,
-CURLSSLBACKEND_SCHANNEL or CURLSSLBACKEND_MESALINK. (Note that the OpenSSL
-forks are all reported as just OpenSSL here.)
+CURLSSLBACKEND_WOLFSSL, CURLSSLBACKEND_SECURETRANSPORT, CURLSSLBACKEND_GNUTLS,
+CURLSSLBACKEND_GSKIT, CURLSSLBACKEND_MBEDTLS, CURLSSLBACKEND_NSS,
+CURLSSLBACKEND_OPENSSL, CURLSSLBACKEND_SCHANNEL or
+CURLSSLBACKEND_MESALINK. (Note that the OpenSSL forks are all reported as just
+OpenSSL here.)
The \fIinternals\fP struct member will point to a TLS library specific pointer
for the active ("in use") SSL connection, with the following underlying types:
@@ -80,8 +80,6 @@ as well:
.RS
.IP mbedTLS
mbedtls_ssl_context *
-.IP PolarSSL
-ssl_context *
.IP "Secure Channel"
CtxtHandle *
.IP "Secure Transport"
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
index 18696f7cb..13f84ee30 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
index 226760ac4..a96148c1d 100644
--- a/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
+++ b/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.73.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
diff --git a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
index b12a6eab7..6971263b3 100644
--- a/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
diff --git a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
index 2dc7608cb..c2728ea2c 100644
--- a/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
+++ b/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
diff --git a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
index c6fb6c359..6420cff9b 100644
--- a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "March 23, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
index b6250dd55..d825dc8d6 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3 b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
index ddb00fb49..dc97a650c 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
diff --git a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3 b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
index 1a7e05d4d..a616bdb32 100644
--- a/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
index e3427ac1a..d8f1475fa 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
index 22076f55d..898235955 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,10 +20,10 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "June 09, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
-CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
+CURLMOPT_PIPELINING_SERVER_BL \- pipelining server block list
.SH SYNOPSIS
#include <curl/curl.h>
@@ -32,28 +32,28 @@ CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char *
No function since pipelining was removed in 7.62.0.
Pass a \fBservers\fP array of char *, ending with a NULL entry. This is a list
-of server types prefixes (in the Server: HTTP header) that are blacklisted
-from pipelining, i.e server types that are known to not support HTTP
+of server types prefixes (in the Server: HTTP header) that are blocked from
+pipelining, i.e server types that are known to not support HTTP
pipelining. The array is copied by libcurl.
Note that the comparison matches if the Server: header begins with the string
-in the blacklist, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can
-both be blacklisted by having "Ninja" in the backlist.
+in the block list, i.e "Server: Ninja 1.2.3" and "Server: Ninja 1.4.0" can
+both be blocked by having "Ninja" in the list.
-Pass a NULL pointer to clear the blacklist.
+Pass a NULL pointer to clear the block list.
.SH DEFAULT
-The default value is NULL, which means that there is no blacklist.
+The default value is NULL, which means that there is no block list.
.SH PROTOCOLS
.SH EXAMPLE
.nf
- server_blacklist[] =
+ char *server_block_list[] =
{
"Microsoft-IIS/6.0",
"nginx/0.8.54",
NULL
};
- curl_multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_blacklist);
+ curl_multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_block_list);
.fi
.SH AVAILABILITY
Added in 7.30.0
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
index fc4267598..1cc3da3e4 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,10 +20,10 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "June 09, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
-CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
+CURLMOPT_PIPELINING_SITE_BL \- pipelining host block list
.SH SYNOPSIS
#include <curl/curl.h>
@@ -32,24 +32,24 @@ CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **h
No function since pipelining was removed in 7.62.0.
Pass a \fBhosts\fP array of char *, ending with a NULL entry. This is a list
-of sites that are blacklisted from pipelining, i.e sites that are known to not
+of sites that are blocked from pipelining, i.e sites that are known to not
support HTTP pipelining. The array is copied by libcurl.
-Pass a NULL pointer to clear the blacklist.
+Pass a NULL pointer to clear the block list.
.SH DEFAULT
-The default value is NULL, which means that there is no blacklist.
+The default value is NULL, which means that there is no block list.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
.nf
- site_blacklist[] =
+ char *site_block_list[] =
{
"www.haxx.se",
"www.example.com:1234",
NULL
};
- curl_multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_blacklist);
+ curl_multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_block_list);
.fi
.SH AVAILABILITY
Added in 7.30.0
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3 b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
index 04935c6d9..50d9291b2 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
index 9a9ce545f..ca4681309 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "July 16, 2020" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
@@ -87,6 +87,9 @@ the ownership of the CURL handle has been taken over by the application.
.IP "CURL_PUSH_DENY (1)"
The callback denies the stream and no data for this will reach the
application, the easy handle will be destroyed by libcurl.
+.IP "CURL_PUSH_ERROROUT (2)"
+Returning this will reject the pushed stream and return an error back on the
+parent stream making it get closed with an error. (Added in curl 7.72.0)
.IP *
All other return codes are reserved for future use.
.SH DEFAULT
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
index d8be37ba7..e547e9e33 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
index 08c006fa0..5cfcad95d 100644
--- a/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3 b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
index f62320b54..72d232624 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
diff --git a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3 b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
index 848d335e6..4498c2460 100644
--- a/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.73.0" "curl_multi_setopt options"
.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
diff --git a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3 b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
index a4e909033..85ddd2b1e 100644
--- a/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
@@ -30,7 +30,7 @@ CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ABSTRACT_UNIX_SOCKET, char *path);
.SH DESCRIPTION
Enables the use of an abstract Unix domain socket instead of establishing a TCP
-connection to a host. The parameter should be a char * to a zero terminated string
+connection to a host. The parameter should be a char * to a null-terminated string
holding the path of the socket. The path will be set to \fIpath\fP prefixed by a
NULL byte (this is the convention for abstract sockets, however it should be stressed
that the path passed to this function should not contain a leading NULL).
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
index 9b4f2fd23..bb436fec8 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3 b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
index 7c21d60a9..0e2d3708e 100644
--- a/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ACCEPT_ENCODING 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
@@ -46,8 +46,9 @@ Alternatively, you can specify exactly the encoding or list of encodings you
want in the response. Four encodings are supported: \fIidentity\fP, meaning
non-compressed, \fIdeflate\fP which requests the server to compress its
response using the zlib algorithm, \fIgzip\fP which requests the gzip
-algorithm and (since curl 7.57.0) \fIbr\fP which is brotli. Provide them in
-the string as a comma-separated list of accepted encodings, like:
+algorithm, (since curl 7.57.0) \fIbr\fP which is brotli and (since curl
+7.72.0) \fIzstd\fP which is zstd. Provide them in the string as a
+comma-separated list of accepted encodings, like:
"br, gzip, deflate".
@@ -82,7 +83,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable all supported built-in compressions */
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");
@@ -95,8 +96,9 @@ if(curl) {
This option was called CURLOPT_ENCODING before 7.21.6
The specific libcurl you're using must have been built with zlib to be able to
-decompress gzip and deflate responses and with the brotli library to
-decompress brotli responses.
+decompress gzip and deflate responses, with the brotli library to
+decompress brotli responses and with the zstd library to decompress zstd
+responses.
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
CURLE_OUT_OF_MEMORY if there was insufficient heap space.
diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
index 300b2e6e0..13de8f0ba 100644
--- a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
+++ b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC.3 b/docs/libcurl/opts/CURLOPT_ALTSVC.3
index a21628d67..f229e8bf4 100644
--- a/docs/libcurl/opts/CURLOPT_ALTSVC.3
+++ b/docs/libcurl/opts/CURLOPT_ALTSVC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ALTSVC \- set alt-svc cache file name
diff --git a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3 b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
index a27267a2b..a14737d98 100644
--- a/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
+++ b/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ALTSVC_CTRL 3 "August 13, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ALTSVC_CTRL 3 "February 11, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
@@ -70,7 +70,10 @@ Accept alternative services offered over HTTP/3. This will only be used if
libcurl was also built to actually support HTTP/3, otherwise this bit will be
ignored.
.SH DEFAULT
-0. No Alt-Svc treatment.
+Alt-Svc handling is disabled by default. If \fICURLOPT_ALTSVC(3)\fP is set,
+\fICURLOPT_ALTSVC_CTRL(3)\fP has a default value corresponding to
+CURLALTSVC_H1 | CURLALTSVC_H2 | CURLALTSVC_H3 - the HTTP/2 and HTTP/3 bits are
+only set if libcurl was built with support for those versions.
.SH PROTOCOLS
HTTPS
.SH EXAMPLE
diff --git a/docs/libcurl/opts/CURLOPT_APPEND.3 b/docs/libcurl/opts/CURLOPT_APPEND.3
index 8003fe19c..8f0724e82 100644
--- a/docs/libcurl/opts/CURLOPT_APPEND.3
+++ b/docs/libcurl/opts/CURLOPT_APPEND.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
diff --git a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3 b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
index 48b703681..c020fe1e8 100644
--- a/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
+++ b/docs/libcurl/opts/CURLOPT_AUTOREFERER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_AUTOREFERER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
@@ -40,7 +40,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* follow redirects */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
index dcde4a8ed..70bea72d7 100644
--- a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
diff --git a/docs/libcurl/opts/CURLOPT_CAINFO.3 b/docs/libcurl/opts/CURLOPT_CAINFO.3
index 5cf18123f..a3b5719d9 100644
--- a/docs/libcurl/opts/CURLOPT_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CAINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAINFO 3 "June 10, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CAINFO 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
@@ -29,7 +29,7 @@ CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAINFO, char *path);
.SH DESCRIPTION
-Pass a char * to a zero terminated string naming a file holding one or more
+Pass a char * to a null-terminated string naming a file holding one or more
certificates to verify the peer with.
If \fICURLOPT_SSL_VERIFYPEER(3)\fP is zero and you avoid verifying the
diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
index 4d60c6bb9..00c7d6270 100644
--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
@@ -29,7 +29,7 @@ CURLOPT_CAPATH \- specify directory holding CA certificates
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAPATH, char *capath);
.SH DESCRIPTION
-Pass a char * to a zero terminated string naming a directory holding multiple
+Pass a char * to a null-terminated string naming a directory holding multiple
CA certificates to verify the peer with. If libcurl is built against OpenSSL,
the certificate directory must be prepared using the openssl c_rehash utility.
This makes sense only when used in combination with the
@@ -55,9 +55,8 @@ if(curl) {
}
.fi
.SH AVAILABILITY
-This option is supported by the OpenSSL, GnuTLS, PolarSSL and mbedTLS
-(since 7.56.0) backends. The NSS backend provides the option only for
-backward compatibility.
+This option is supported by the OpenSSL, GnuTLS and mbedTLS (since 7.56.0)
+backends. The NSS backend provides the option only for backward compatibility.
.SH RETURN VALUE
CURLE_OK if supported; or an error such as:
diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3
index 0d3b3dc15..d406c7142 100644
--- a/docs/libcurl/opts/CURLOPT_CERTINFO.3
+++ b/docs/libcurl/opts/CURLOPT_CERTINFO.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
index 7f17c265d..a49568dcf 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3 b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
index 5dfb8c740..c92002ce6 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_DATA 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_DATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
diff --git a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
index ea83c701b..c680aecad 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
index c336a0291..4399b39ef 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
diff --git a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
index a5cc5d88e..a5c16a96e 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
index a0745e896..f63fd3060 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
@@ -48,7 +48,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete connection within 10 seconds */
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
index beb606542..03c41099d 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
@@ -48,7 +48,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete connection within 10000 milliseconds */
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 10000L);
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
index ae066ec30..60ca53526 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3 b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
index 8c27c9bfd..ecf3d42b9 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONNECT_TO 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
@@ -94,7 +94,7 @@ connect_to = curl_slist_append(NULL, "example.com::server1.example.com:");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CONNECT_TO, connect_to);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index b7c4b105e..3d23dec94 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
index a71a2b683..8fd45af29 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
diff --git a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
index 42af18cf1..fb682b2ff 100644
--- a/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
diff --git a/docs/libcurl/opts/CURLOPT_COOKIE.3 b/docs/libcurl/opts/CURLOPT_COOKIE.3
index 5393d1ccb..c169efaa0 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
@@ -29,7 +29,7 @@ CURLOPT_COOKIE \- set contents of HTTP Cookie header
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIE, char *cookie);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It will be used to
+Pass a pointer to a null-terminated string as parameter. It will be used to
set a cookie in the HTTP request. The format of the string should be
NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie
should contain.
@@ -67,7 +67,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;");
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
index 0897fb21f..fc4bf93a6 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEFILE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
@@ -29,7 +29,7 @@ CURLOPT_COOKIEFILE \- file name to read cookies from
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It should point to
+Pass a pointer to a null-terminated string as parameter. It should point to
the file name of your file holding cookie data to read. The cookie data can be
in either the old Netscape / Mozilla cookie data format or just regular HTTP
headers (Set-Cookie style) dumped to a file.
@@ -66,7 +66,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* get cookies from an existing file */
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
@@ -76,6 +76,10 @@ if(curl) {
curl_easy_cleanup(curl);
}
.fi
+.SH "Cookie file format"
+The cookie file format and general cookie concepts in curl are described in
+the HTTP-COOKIES.md file, also hosted online here:
+https://curl.haxx.se/docs/http-cookies.html
.SH AVAILABILITY
As long as HTTP is supported
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3 b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
index acbdea11e..c5c4294b9 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIEJAR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIEJAR 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
@@ -29,7 +29,7 @@ CURLOPT_COOKIEJAR \- file name to store cookies to
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEJAR, char *filename);
.SH DESCRIPTION
-Pass a \fIfilename\fP as char *, zero terminated. This will make libcurl write
+Pass a \fIfilename\fP as char *, null-terminated. This will make libcurl write
all internally known cookies to the specified file when
\fIcurl_easy_cleanup(3)\fP is called. If no cookies are known, no file will be
created. Specify "-" as filename to instead have the cookies written to
@@ -58,7 +58,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* export cookies to this file when closing the handle */
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
index 2f5198c33..007baf5c4 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIELIST 3 "January 10, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
@@ -105,6 +105,10 @@ curl_easy_perform(curl); /* cookies imported from cookies.txt */
curl_easy_cleanup(curl); /* cookies exported to cookies.txt */
.fi
+.SH "Cookie file format"
+The cookie file format and general cookie concepts in curl are described in
+the HTTP-COOKIES.md file, also hosted online here:
+https://curl.haxx.se/docs/http-cookies.html
.SH AVAILABILITY
ALL was added in 7.14.1
diff --git a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3 b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
index 958214108..d3a57b078 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIESESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIESESSION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
@@ -46,7 +46,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* new "session", don't load session cookies */
curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
index 55522298a..98be4328a 100644
--- a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
@@ -37,7 +37,7 @@ to overwrite the original data after setting this option.
Because data are copied, care must be taken when using this option in
conjunction with \fICURLOPT_POSTFIELDSIZE(3)\fP or
\fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP: If the size has not been set prior to
-\fICURLOPT_COPYPOSTFIELDS(3)\fP, the data is assumed to be a zero terminated
+\fICURLOPT_COPYPOSTFIELDS(3)\fP, the data is assumed to be a null-terminated
string; else the stored size informs the library about the byte count to
copy. In any case, the size must not be changed after
\fICURLOPT_COPYPOSTFIELDS(3)\fP, unless another \fICURLOPT_POSTFIELDS(3)\fP or
@@ -51,7 +51,7 @@ HTTP(S)
CURL *curl = curl_easy_init();
if(curl) {
char local_buffer[1024]="data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the data to copy from the buffer and send in the request */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L);
diff --git a/docs/libcurl/opts/CURLOPT_CRLF.3 b/docs/libcurl/opts/CURLOPT_CRLF.3
index b32b0a5e5..8a5912fa4 100644
--- a/docs/libcurl/opts/CURLOPT_CRLF.3
+++ b/docs/libcurl/opts/CURLOPT_CRLF.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
diff --git a/docs/libcurl/opts/CURLOPT_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_CRLFILE.3
index de9d4373a..b8995d2d8 100644
--- a/docs/libcurl/opts/CURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
@@ -29,15 +29,18 @@ CURLOPT_CRLFILE \- specify a Certificate Revocation List file
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLFILE, char *file);
.SH DESCRIPTION
-Pass a char * to a zero terminated string naming a \fIfile\fP with the
+Pass a char * to a null-terminated string naming a \fIfile\fP with the
concatenation of CRL (in PEM format) to use in the certificate validation that
occurs during the SSL exchange.
When curl is built to use NSS or GnuTLS, there is no way to influence the use
-of CRL passed to help in the verification process. When libcurl is built with
-OpenSSL support, X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL are both
-set, requiring CRL check against all the elements of the certificate chain if
-a CRL file is passed.
+of CRL passed to help in the verification process.
+
+When libcurl is built with OpenSSL support, X509_V_FLAG_CRL_CHECK and
+X509_V_FLAG_CRL_CHECK_ALL are both set, requiring CRL check against all the
+elements of the certificate chain if a CRL file is passed. Also note that
+\fICURLOPT_CRLFILE(3)\fP will imply \fBCURLSSLOPT_NO_PARTIALCHAIN\fP (see
+\fICURLOPT_SSL_OPTIONS(3)\fP) since curl 7.71.0 due to an OpenSSL bug.
This option makes sense only when used in combination with the
\fICURLOPT_SSL_VERIFYPEER(3)\fP option.
diff --git a/docs/libcurl/opts/CURLOPT_CURLU.3 b/docs/libcurl/opts/CURLOPT_CURLU.3
index 9acead7c6..d5e1d7fec 100644
--- a/docs/libcurl/opts/CURLOPT_CURLU.3
+++ b/docs/libcurl/opts/CURLOPT_CURLU.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CURLU 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CURLU 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CURLU \- set URL with CURLU *
@@ -51,7 +51,7 @@ CURLU *urlp = curl_url();
int res = 0;
if(curl) {
- res = curl_url_set(urlp, CURLUPART_URL, "http://example.com", 0);
+ res = curl_url_set(urlp, CURLUPART_URL, "https://example.com", 0);
curl_easy_setopt(handle, CURLOPT_CURLU, urlp);
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index 1822c3152..77da01bb4 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
@@ -29,7 +29,7 @@ CURLOPT_CUSTOMREQUEST \- custom string for request
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CUSTOMREQUEST, char *request);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter.
+Pass a pointer to a null-terminated string as parameter.
When you change the request method by setting \fICURLOPT_CUSTOMREQUEST(3)\fP
to something, you don't actually change how libcurl behaves or acts in regards
@@ -92,7 +92,7 @@ HTTP, FTP, IMAP, POP3 and SMTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* DELETE the given path */
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
index df833ba05..1a6e8f52c 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3 b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
index 573197b2b..9b6f984c6 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
@@ -55,7 +55,7 @@ shown above.
\fICURLOPT_VERBOSE(3)\fP is in effect. This callback receives debug
information, as specified in the \fItype\fP argument. This function must
return 0. The \fIdata\fP pointed to by the char * passed to this function WILL
-NOT be zero terminated, but will be exactly of the \fIsize\fP as told by the
+NOT be null-terminated, but will be exactly of the \fIsize\fP as told by the
\fIsize\fP argument.
The \fIuserptr\fP argument is the pointer set with \fICURLOPT_DEBUGDATA(3)\fP.
@@ -167,7 +167,7 @@ int main(void)
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
diff --git a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
index 2984c7e4a..3a2c33d37 100644
--- a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEFAULT_PROTOCOL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
diff --git a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3 b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
index d4b6b6d58..ad496d73c 100644
--- a/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
+++ b/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
diff --git a/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3 b/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
index de6ff9621..0a00131af 100644
--- a/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
+++ b/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
@@ -40,7 +40,7 @@ Several
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_DISALLOW_USERNAME_IN_URL, 1L);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
index b0edaad16..db2d648bb 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
@@ -51,7 +51,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* only reuse addresses for a very short time */
curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, 2L);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
index dc727edf0..a675ca816 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_INTERFACE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
@@ -43,7 +43,7 @@ NULL
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_INTERFACE, "eth0");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
index 699695ddc..18f9a51af 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP4 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
@@ -44,7 +44,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP4, "192.168.0.14");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
index db00f7f4d..5acb8f67b 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_LOCAL_IP6 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
@@ -44,7 +44,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_LOCAL_IP6, "fe80::a9ff:fe46:b619");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
index 6fb7876c4..7ad020b62 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SERVERS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
@@ -48,7 +48,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_DNS_SERVERS, "192.168.1.100:53,192.168.1.101");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3 b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
index 120dd761f..74011b404 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns more than one
diff --git a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3 b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
index e2391fc50..c098a618a 100644
--- a/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
diff --git a/docs/libcurl/opts/CURLOPT_DOH_URL.3 b/docs/libcurl/opts/CURLOPT_DOH_URL.3
index aed70fb36..007f4c2c4 100644
--- a/docs/libcurl/opts/CURLOPT_DOH_URL.3
+++ b/docs/libcurl/opts/CURLOPT_DOH_URL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DOH_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
@@ -30,7 +30,7 @@ CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DOH_URL, char *URL);
.SH DESCRIPTION
Pass in a pointer to a \fIURL\fP for the DOH server to use for name
-resolving. The parameter should be a char * to a zero terminated string which
+resolving. The parameter should be a char * to a null-terminated string which
must be URL-encoded in the following format: "https://host:port/path". It MUST
specify a HTTPS URL.
@@ -54,7 +54,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_DOH_URL, "https://dns.example.com");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3 b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
index 7eab22933..bf59784ea 100644
--- a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
+++ b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_EGDSOCKET 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
@@ -29,7 +29,7 @@ CURLOPT_EGDSOCKET \- set EGD socket path
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path);
.SH DESCRIPTION
-Pass a char * to the zero terminated path name to the Entropy Gathering Daemon
+Pass a char * to the null-terminated path name to the Entropy Gathering Daemon
socket. It will be used to seed the random engine for SSL.
The application does not have to keep the string around after setting this
diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
index c0973769d..17f2bc780 100644
--- a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
@@ -57,7 +57,7 @@ if(curl) {
CURLcode res;
char errbuf[CURL_ERROR_SIZE];
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* provide a buffer to store errors in */
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
index cfdff2590..c33f324bb 100644
--- a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
@@ -44,7 +44,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* wait 3 seconds for 100-continue */
curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 3000L);
diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
index b89d36944..8d15b4fee 100644
--- a/docs/libcurl/opts/CURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
diff --git a/docs/libcurl/opts/CURLOPT_FILETIME.3 b/docs/libcurl/opts/CURLOPT_FILETIME.3
index c4f5350ef..1f33d67f6 100644
--- a/docs/libcurl/opts/CURLOPT_FILETIME.3
+++ b/docs/libcurl/opts/CURLOPT_FILETIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
index deecdce36..c41be716d 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
diff --git a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
index 8d1709b66..afa6febde 100644
--- a/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
diff --git a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3 b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
index 5556a49d3..aa656257b 100644
--- a/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
+++ b/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FOLLOWLOCATION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FOLLOWLOCATION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
@@ -47,7 +47,7 @@ are also disabled.
When following a Location:, the 3xx response code that redirected it also
dictates which request method it will use in the subsequent request: For 301,
-302 and 303 responses libcurl will switch method to GET unless
+302 and 303 responses libcurl will switch method from POST to GET unless
\fICURLOPT_POSTREDIR(3)\fP instructs libcurl otherwise. All other 3xx codes
will make libcurl send the same method again.
@@ -64,7 +64,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
index 88d2c1c37..0830b5fe3 100644
--- a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
+++ b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
diff --git a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3 b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
index c9291a778..408b11e69 100644
--- a/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
+++ b/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
diff --git a/docs/libcurl/opts/CURLOPT_FTPPORT.3 b/docs/libcurl/opts/CURLOPT_FTPPORT.3
index 072761aad..66f65e507 100644
--- a/docs/libcurl/opts/CURLOPT_FTPPORT.3
+++ b/docs/libcurl/opts/CURLOPT_FTPPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPPORT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
@@ -29,7 +29,7 @@ CURLOPT_FTPPORT \- make FTP transfer active
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPPORT, char *spec);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It specifies that the
+Pass a pointer to a null-terminated string as parameter. It specifies that the
FTP transfer will be made actively and the given string will be used to get
the IP address to use for the FTP PORT instruction.
diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
index 4f2301de7..79a14c8a6 100644
--- a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3 b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
index 55621d7ea..47d46f389 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ACCOUNT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
@@ -29,7 +29,7 @@ CURLOPT_FTP_ACCOUNT \- set account info for FTP
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string (or NULL to disable). When an FTP
+Pass a pointer to a null-terminated string (or NULL to disable). When an FTP
server asks for "account data" after user name and password has been provided,
this data is sent off using the ACCT command.
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
index 472a37415..0ef996f13 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3 b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
index 7de48bb93..e037d984b 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3 b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
index c3fd8214e..1c7059f9c 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
index d9c13f379..739c26188 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3 b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
index 28f614e04..8fb839e44 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
diff --git a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3 b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
index fe03c5b32..febf31158 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
index 55b61f685..c29d03d4d 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPRT 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
index fb4a57955..9a00ef357 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
diff --git a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3 b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
index 795125022..aa3e51516 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
diff --git a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3 b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
index 42c3edd3f..f3c4b0ec7 100644
--- a/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
+++ b/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
diff --git a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
index 47d02e672..ef843d004 100644
--- a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
diff --git a/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3 b/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
index a092626d1..843f75cc7 100644
--- a/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
diff --git a/docs/libcurl/opts/CURLOPT_HEADER.3 b/docs/libcurl/opts/CURLOPT_HEADER.3
index cca9d231b..4a7c5d2f9 100644
--- a/docs/libcurl/opts/CURLOPT_HEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
@@ -56,7 +56,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
index fcdc26820..af3b8c7ee 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERDATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
@@ -61,7 +61,7 @@ static size_t header_callback(char *buffer, size_t size,
CURL *curl = curl_easy_init();
if(curl) {
struct my_info my = { 10, "the cookies are in the cupboard" };
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
index 60c6577b7..9b2ce77d5 100644
--- a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADERFUNCTION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADERFUNCTION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
@@ -40,9 +40,9 @@ shown above.
This function gets called by libcurl as soon as it has received header
data. The header callback will be called once for each header and only
complete header lines are passed on to the callback. Parsing headers is very
-easy using this. The size of the data pointed to by \fIbuffer\fP is \fIsize\fP
-multiplied with \fInitems\fP. Do not assume that the header line is zero
-terminated!
+easy using this. \fIbuffer\fP points to the delivered data, and the size of
+that data is \fInitems\fP; \fIsize\fP is always 1. Do not assume that the
+header line is null-terminated!
The pointer named \fIuserdata\fP is the one you set with the
\fICURLOPT_HEADERDATA(3)\fP option.
@@ -103,7 +103,7 @@ static size_t header_callback(char *buffer, size_t size,
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.3 b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
index 9efb17b28..9f1a7b43d 100644
--- a/docs/libcurl/opts/CURLOPT_HEADEROPT.3
+++ b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HEADEROPT 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HEADEROPT 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
diff --git a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3 b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
index 28393b5ab..53718dbb5 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP09 \- allow HTTP/0.9 response
diff --git a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3 b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
index 3e07980dd..8c66345a1 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP200ALIASES 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
@@ -54,7 +54,7 @@ HTTP
CURL *curl = curl_easy_init();
if(curl) {
struct curl_slist *list;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
list = curl_slist_append(NULL, "ICY 200 OK");
list = curl_slist_append(list, "WEIRDO 99 FINE");
diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3 b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
index 3d16dd6e7..75796957b 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_HTTPGET.3 b/docs/libcurl/opts/CURLOPT_HTTPGET.3
index 7238017f1..305ce272f 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPGET.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPGET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPGET \- ask for an HTTP GET request
@@ -47,7 +47,7 @@ HTTP(S)
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* use a GET to fetch this */
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
index 89b09edab..f13b9d331 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
@@ -103,7 +103,7 @@ CURL *curl = curl_easy_init();
struct curl_slist *list = NULL;
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
list = curl_slist_append(list, "Shoesize: 10");
list = curl_slist_append(list, "Accept:");
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
index 4c306cfda..41af0236a 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPOST.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3 b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
index a1ed04a6d..639f64f74 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
index b21ab4c41..812d7740b 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3 b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
index f88850333..bd0a45db9 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
index e9c948f30..8674519bf 100644
--- a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
+++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_HTTP_VERSION 3 "September 14, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTP_VERSION 3 "September 14, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
index 26bd100b4..d350d3021 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
@@ -52,7 +52,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* we know the server is silly, ignore content-length */
curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
index 2a2d1a21e..f1b8291be 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
index e6b65223b..def8299b7 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE_LARGE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
diff --git a/docs/libcurl/opts/CURLOPT_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_INTERFACE.3
index bc86b98e3..52e73de8d 100644
--- a/docs/libcurl/opts/CURLOPT_INTERFACE.3
+++ b/docs/libcurl/opts/CURLOPT_INTERFACE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERFACE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
@@ -55,7 +55,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_INTERFACE, "eth0");
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
index 8c59cc886..95f695cf1 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
index 601836725..5f9755ca1 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3 b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
index 9cfc97162..d05b4add0 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
diff --git a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3 b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
index c0dc8565b..ba5606c54 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
diff --git a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3 b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
index 6b12e8206..9516852c8 100644
--- a/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_IPRESOLVE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IPRESOLVE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
@@ -46,7 +46,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
/* resolve host name using IPv6-names only */
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
index 70925f8a8..7abe206c4 100644
--- a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
+++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ISSUERCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
@@ -29,7 +29,7 @@ CURLOPT_ISSUERCERT \- issuer SSL certificate filename
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT, char *file);
.SH DESCRIPTION
-Pass a char * to a zero terminated string naming a \fIfile\fP holding a CA
+Pass a char * to a null-terminated string naming a \fIfile\fP holding a CA
certificate in PEM format. If the option is set, an additional check against
the peer certificate is performed to verify the issuer is indeed the one
associated with the certificate provided by the option. This additional check
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT_BLOB.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT_BLOB.3
new file mode 100644
index 000000000..5fbf86df4
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_ISSUERCERT_BLOB.3
@@ -0,0 +1,79 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_ISSUERCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_ISSUERCERT_BLOB \- issuer SSL certificate from memory blob
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT_BLOB, struct curl_blob *stblob);
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains information (pointer
+and size) about a memory block with binary data of a CA certificate in PEM
+format. If the option is set, an additional check against the peer certificate
+is performed to verify the issuer is indeed the one associated with the
+certificate provided by the option. This additional check is useful in
+multi-level PKI where one needs to enforce that the peer certificate is from a
+specific branch of the tree.
+
+This option should be used in combination with the
+\fICURLOPT_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the check is
+not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER(3)\fP
+has to be set too for the check to fail).
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_ISSUERCERT(3)\fP which instead
+expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_ISSUERCERT_BLOB, &blob);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_ISSUERCERT "(3),"
+.BR CURLOPT_CRLFILE "(3), " CURLOPT_SSL_VERIFYPEER "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
index 0561e77a5..46e4f01f4 100644
--- a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
+++ b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
diff --git a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
index b63d1d076..d8c27d09d 100644
--- a/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_KEYPASSWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_KEYPASSWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
@@ -29,7 +29,7 @@ CURLOPT_KEYPASSWD \- set passphrase to private key
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEYPASSWD, char *pwd);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It will be used as
+Pass a pointer to a null-terminated string as parameter. It will be used as
the password required to use the \fICURLOPT_SSLKEY(3)\fP or
\fICURLOPT_SSH_PRIVATE_KEYFILE(3)\fP private key. You never needed a pass
phrase to load a certificate but you need one to load your private key.
@@ -44,7 +44,7 @@ All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem");
curl_easy_setopt(curl, CURLOPT_SSLKEY, "key.pem");
curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "superman");
diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
index 1286d6391..ac8497d4a 100644
--- a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
+++ b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORT.3 b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
index fe2dbf46c..18e08014a 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORT.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORT 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
@@ -41,7 +41,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
/* and try 20 more ports following that */
curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
index f13e0fec1..63a2f1962 100644
--- a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
+++ b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOCALPORTRANGE 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOCALPORTRANGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
@@ -45,7 +45,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_LOCALPORT, 49152L);
/* and try 20 more ports following that */
curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, 20L);
diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
index 46cc892b9..6b593f4f0 100644
--- a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOGIN_OPTIONS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
@@ -29,7 +29,7 @@ CURLOPT_LOGIN_OPTIONS \- set login options
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOGIN_OPTIONS, char *options);
.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
+Pass a char * as parameter, which should be pointing to the null-terminated
\fIoptions\fP string to use for the transfer.
For more information about the login options please see RFC2384, RFC5092 and
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
index 144a01f5a..f29df3ace 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
index 0b30ebe88..2696e5426 100644
--- a/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
+++ b/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3 b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
index 1f382ccc2..61ce76c65 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_AUTH 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
@@ -29,7 +29,7 @@ CURLOPT_MAIL_AUTH \- SMTP authentication address
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_AUTH, char *auth);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. This will be used to
+Pass a pointer to a null-terminated string as parameter. This will be used to
specify the authentication address (identity) of a submitted message that is
being relayed to another server.
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
index 7b4bff72c..f707022c4 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_FROM 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
@@ -29,7 +29,7 @@ CURLOPT_MAIL_FROM \- SMTP sender address
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_FROM, char *from);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. This should be used
+Pass a pointer to a null-terminated string as parameter. This should be used
to specify the sender's email address when sending SMTP mail with libcurl.
An originator email address should be specified with angled brackets (<>)
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
index ac4bcbe87..cc6026b65 100644
--- a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3
new file mode 100644
index 000000000..996619177
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_MAIL_RCPT_ALLLOWFAILS.3
@@ -0,0 +1,72 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_MAIL_RCPT_ALLLOWFAILS 3 "January 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_MAIL_RCPT_ALLLOWFAILS \- allow RCPT TO command to fail for some recipients
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_RCPT_ALLLOWFAILS,
+ long allow);
+.SH DESCRIPTION
+If \fIallow\fP is set to 1L, allow RCPT TO command to fail for some recipients.
+
+When sending data to multiple recipients, by default curl will abort SMTP
+conversation if at least one of the recipients causes RCPT TO command to
+return an error.
+
+The default behavior can be changed by setting \fIignore\fP to 1L which will
+make curl ignore errors and proceed with the remaining valid recipients.
+
+In case when all recipients cause RCPT TO command to fail, curl will abort SMTP
+conversation and return the error received from to the last RCPT TO command.
+.SH DEFAULT
+0
+.SH PROTOCOLS
+SMTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_slist *list;
+
+ /* Adding one valid and one invalid email address */
+ list = curl_slist_append(NULL, "person@example.com");
+ list = curl_slist_append(list, "invalidemailaddress");
+
+ curl_easy_setopt(curl, CURLOPT_URL, "smtp://example.com/");
+ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT_ALLLOWFAILS, 1L);
+
+ ret = curl_easy_perform(curl);
+ curl_slist_free_all(list);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.69.0.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_MAIL_FROM "(3), " CURLOPT_MAIL_RCPT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3 b/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
index 18845135b..d36767bf6 100644
--- a/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
+++ b/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXAGE_CONN 3 "April 14, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXAGE_CONN 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
@@ -49,7 +49,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* only allow 30 seconds idle time */
curl_easy_setopt(curl, CURLOPT_MAXAGE_CONN, 30L);
diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
index 31d224e95..85821f5bf 100644
--- a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
index 83cc15b74..ab2ae4eab 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
index db24c5b86..f4166e062 100644
--- a/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
diff --git a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3 b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
index 2d9188db7..ec0267952 100644
--- a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
@@ -45,7 +45,7 @@ HTTP(S)
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
/* enable redirect following */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
index d7c75a4a6..264a40d4d 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "August 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
@@ -29,12 +29,18 @@ CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAX_RECV_SPEED_LARGE,
- curl_off_t speed);
+ curl_off_t maxspeed);
.SH DESCRIPTION
-Pass a curl_off_t as parameter. If a download exceeds this \fIspeed\fP
+Pass a curl_off_t as parameter. If a download exceeds this \fImaxspeed\fP
(counted in bytes per second) the transfer will pause to keep the speed less
than or equal to the parameter value. Defaults to unlimited speed.
+This is not an exact science. libcurl attempts to keep the average speed below
+the given threshold over a period time.
+
+If you set \fImaxspeed\fP to a value lower than \fICURLOPT_BUFFERSIZE(3)\fP,
+libcurl might download faster than the set limit initially.
+
This option doesn't affect transfer speeds done with FILE:// URLs.
.SH DEFAULT
0, disabled
diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
index 5201a6e79..31e0db064 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "August 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
@@ -36,6 +36,13 @@ this speed (counted in bytes per second) the transfer will pause to keep the
speed less than or equal to the parameter value. Defaults to unlimited
speed.
+This is not an exact science. libcurl attempts to keep the average speed below
+the given threshold over a period time.
+
+If you set \fImaxspeed\fP to a value lower than
+\fICURLOPT_UPLOAD_BUFFERSIZE(3)\fP, libcurl might "shoot over" the limit on
+its first send and still send off a full buffer.
+
This option doesn't affect transfer speeds done with FILE:// URLs.
.SH DEFAULT
0, disabled
diff --git a/docs/libcurl/opts/CURLOPT_MIMEPOST.3 b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
index 9d2466b42..79d7b8bac 100644
--- a/docs/libcurl/opts/CURLOPT_MIMEPOST.3
+++ b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_MIMEPOST \- set post/send data from mime structure
diff --git a/docs/libcurl/opts/CURLOPT_NETRC.3 b/docs/libcurl/opts/CURLOPT_NETRC.3
index c6c3122e2..2e9476b0b 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC \- request that .netrc is used
diff --git a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3 b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
index 7b80c0394..544a76702 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC_FILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
@@ -29,7 +29,7 @@ CURLOPT_NETRC_FILE \- file name to read .netrc info from
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC_FILE, char *file);
.SH DESCRIPTION
-Pass a char * as parameter, pointing to a zero terminated string containing
+Pass a char * as parameter, pointing to a null-terminated string containing
the full path name to the \fIfile\fP you want libcurl to use as .netrc
file. If this option is omitted, and \fICURLOPT_NETRC(3)\fP is set, libcurl
will attempt to find a .netrc file in the current user's home
diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
index 5c0eaadd8..89db0bc0b 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
diff --git a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
index b12132376..d22de64e0 100644
--- a/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
+++ b/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
diff --git a/docs/libcurl/opts/CURLOPT_NOBODY.3 b/docs/libcurl/opts/CURLOPT_NOBODY.3
index 4776ff8b1..e87b17a43 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "July 27, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
@@ -34,7 +34,17 @@ output when doing what would otherwise be a download. For HTTP(S), this makes
libcurl do a HEAD request. For most other protocols it means just not asking
to transfer the body data.
-Enabling this option means asking for a download but without a body.
+For HTTP operations when \fICURLOPT_NOBODY(3)\fP has been set, unsetting the
+option (with 0) will make it a GET again - only if the method is still set to
+be HEAD. The proper way to get back to a GET request is to set
+\fICURLOPT_HTTPGET(3)\fP and for other methods, use the POST ur UPLOAD
+options.
+
+Enabling \fICURLOPT_NOBODY(3)\fP means asking for a download without a body.
+
+If you do a transfer with HTTP that involves a method other than HEAD, you
+will get a body (unless the resource and server sends a zero byte body for the
+specific URL you request).
.SH DEFAULT
0, the body is transferred
.SH PROTOCOLS
@@ -43,9 +53,9 @@ Most
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
- /* get us the resource without a body! */
+ /* get us the resource without a body - use HEAD! */
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
/* Perform the request */
@@ -57,5 +67,5 @@ Always
.SH RETURN VALUE
Returns CURLE_OK
.SH "SEE ALSO"
-.BR CURLOPT_HTTPGET "(3), " CURLOPT_POST "(3), "
-.BR CURLOPT_REQUEST_TARGET "(3), "
+.BR CURLOPT_HTTPGET "(3), " CURLOPT_POSTFIELDS "(3), " CURLOPT_UPLOAD "(3), "
+.BR CURLOPT_REQUEST_TARGET "(3), " CURLOPT_MIMEPOST "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3 b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
index 9533bc8d6..13512ecd2 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROGRESS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
@@ -41,7 +41,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable progress meter */
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3
index 460550a9f..597468e16 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "August 22, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
@@ -29,7 +29,7 @@ CURLOPT_NOPROXY \- disable proxy use for specific hosts
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROXY, char *noproxy);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string. The string consists of a comma
+Pass a pointer to a null-terminated string. The string consists of a comma
separated list of host names that do not require a proxy to get reached, even
if one is specified. The only wildcard available is a single * character,
which matches all hosts, and effectively disables the proxy. Each name in this
@@ -50,6 +50,10 @@ brackets:
"example.com,::1,localhost"
+IPv6 numerical addresses are compared as strings, so they will only match if
+the representations are the same: "::1" is the same as "::0:1" but they don't
+match.
+
The application does not have to keep the string around after setting this
option.
.SH "Environment variables"
diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
index 05092508f..466273de0 100644
--- a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
index d7b4c9af8..10beb2c56 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
diff --git a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3 b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
index acb38f31f..0f88f19ad 100644
--- a/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "June 09, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
@@ -30,8 +30,6 @@ CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
typedef enum {
CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */
- CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */
- CURLSOCKTYPE_LAST /* never use */
} curlsocktype;
struct curl_sockaddr {
@@ -53,10 +51,9 @@ shown above.
This callback function gets called by libcurl instead of the \fIsocket(2)\fP
call. The callback's \fIpurpose\fP argument identifies the exact purpose for
-this particular socket: \fICURLSOCKTYPE_IPCXN\fP is for IP based connections
-and \fICURLSOCKTYPE_ACCEPT\fP is for sockets created after accept() - such as
-when doing active FTP. Future versions of libcurl may support more
-purposes.
+this particular socket. \fICURLSOCKTYPE_IPCXN\fP is for IP based connections
+and is the only purpose currently used in libcurl. Future versions of libcurl
+may support more purposes.
The \fIclientp\fP pointer contains whatever user-defined value set using the
\fICURLOPT_OPENSOCKETDATA(3)\fP function.
@@ -69,7 +66,7 @@ additional \fIsetsockopt(2)\fP calls can of course be done on the socket at
the user's discretion. A \fICURL_SOCKET_BAD\fP return value from the callback
function will signal an unrecoverable error to libcurl and it will return
\fICURLE_COULDNT_CONNECT\fP from the function that triggered this callback.
-This return code can be used for IP address blacklisting.
+This return code can be used for IP address block listing.
If you want to pass in a socket with an already established connection, pass
the socket back with this callback and then use
diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PASSWORD.3
index 8fe212f42..eff48dc96 100644
--- a/docs/libcurl/opts/CURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PASSWORD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
@@ -29,7 +29,7 @@ CURLOPT_PASSWORD \- password to use in authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PASSWORD, char *pwd);
.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
+Pass a char * as parameter, which should be pointing to the null-terminated
password to use for the transfer.
The \fICURLOPT_PASSWORD(3)\fP option should be used in conjunction with the
@@ -45,7 +45,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "qwerty");
diff --git a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
index 5b0574859..8d8ca0d7f 100644
--- a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PATH_AS_IS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
@@ -49,7 +49,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/../../etc/password");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/../../etc/password");
curl_easy_setopt(curl, CURLOPT_PATH_AS_IS, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
index 93836f312..21ed6e9e7 100644
--- a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PINNEDPUBLICKEY 3 "June 02, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PINNEDPUBLICKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
@@ -29,7 +29,7 @@ CURLOPT_PINNEDPUBLICKEY \- set pinned public key
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PINNEDPUBLICKEY, char *pinnedpubkey);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string can be the
+Pass a pointer to a null-terminated string as parameter. The string can be the
file name of your pinned public key. The file format expected is "PEM" or "DER".
The string can also be any number of base64 encoded sha256 hashes preceded by
"sha256//" and separated by ";"
diff --git a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3 b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
index 4dc706e1f..32fcdb5a7 100644
--- a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
+++ b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
diff --git a/docs/libcurl/opts/CURLOPT_PORT.3 b/docs/libcurl/opts/CURLOPT_PORT.3
index 1285bf5a1..c50828d62 100644
--- a/docs/libcurl/opts/CURLOPT_PORT.3
+++ b/docs/libcurl/opts/CURLOPT_PORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PORT \- set remote port number to work with
@@ -46,7 +46,7 @@ Used for all protocols that speak to a port number.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PORT, 8080L);
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3
index 8013ee516..e43203b87 100644
--- a/docs/libcurl/opts/CURLOPT_POST.3
+++ b/docs/libcurl/opts/CURLOPT_POST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POST 3 "July 22, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POST 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POST \- request an HTTP POST
@@ -73,7 +73,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
/* set up the read callback with CURLOPT_READFUNCTION */
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
index 168c3e832..672722201 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
@@ -55,8 +55,8 @@ the POST data from the read callback. If you want to send a zero-byte POST set
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header,
and libcurl will add that header automatically if the POST is either known to
-be larger than 1024 bytes or if the expected size is unknown. You can disable
-this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
+be larger than 1MB or if the expected size is unknown. You can disable this
+header with \fICURLOPT_HTTPHEADER(3)\fP as usual.
To make multipart/formdata posts (aka RFC2388-posts), check out the
\fICURLOPT_HTTPPOST(3)\fP option combined with \fIcurl_formadd(3)\fP.
@@ -70,7 +70,7 @@ CURL *curl = curl_easy_init();
if(curl) {
const char *data = "data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 12L);
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
index 83b09e33f..c3ea8c92e 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
@@ -45,7 +45,7 @@ CURL *curl = curl_easy_init();
if(curl) {
const char *data = "data to send";
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(data));
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
index 57bc47c36..d330c25dc 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
@@ -46,7 +46,7 @@ if(curl) {
const char *data = large_chunk;
curl_off_t length_of_data; /* set somehow */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* size of the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, length_of_data);
diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3 b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
index 8aec0399f..9d1f433ad 100644
--- a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
@@ -41,16 +41,16 @@ NULL
SFTP and FTP
.SH EXAMPLE
.nf
-struct curl_slist *h = NULL;
-h = curl_slist_append(h, "RNFR source-name");
-h = curl_slist_append(h, "RNTO new-name");
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "RNFR source-name");
+cmdlist = curl_slist_append(cmdlist, "RNTO new-name");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
/* pass in the FTP commands to run after the transfer */
- curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
+ curl_easy_setopt(curl, CURLOPT_POSTQUOTE, cmdlist);
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_POSTREDIR.3 b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
index c29d85e5a..6ee062045 100644
--- a/docs/libcurl/opts/CURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
@@ -53,7 +53,7 @@ HTTP(S)
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* a silly POST example */
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "data=true");
diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
index 19f38f0b8..959fbbbf3 100644
--- a/docs/libcurl/opts/CURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PREQUOTE \- commands to run before an FTP transfer
@@ -44,15 +44,15 @@ NULL
FTP
.SH EXAMPLE
.nf
-struct curl_slist *h = NULL;
-h = curl_slist_append(h, "SYST");
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "SYST");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
/* pass in the FTP commands to run */
- curl_easy_setopt(curl, CURLOPT_PREQUOTE, headerlist);
+ curl_easy_setopt(curl, CURLOPT_PREQUOTE, cmdlist);
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3 b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
index 838d2d895..c53556585 100644
--- a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PRE_PROXY 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
@@ -30,7 +30,7 @@ CURLOPT_PRE_PROXY \- set pre-proxy to use
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRE_PROXY, char *preproxy);
.SH DESCRIPTION
Set the \fIpreproxy\fP to use for the upcoming request. The parameter
-should be a char * to a zero terminated string holding the host name or dotted
+should be a char * to a null-terminated string holding the host name or dotted
numerical IP address. A numerical IPv6 address must be written within
[brackets].
@@ -65,7 +65,7 @@ All except file://. Note that some protocols don't do very well over proxy.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
curl_easy_setopt(curl, CURLOPT_PREPROXY, "socks4://socks-proxy:1080");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3
index 698175a74..e8144574c 100644
--- a/docs/libcurl/opts/CURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PRIVATE \- store a private pointer
@@ -43,7 +43,7 @@ CURL *curl = curl_easy_init();
struct private secrets;
if(curl) {
struct private *extracted;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* store a pointer to our private struct */
curl_easy_setopt(curl, CURLOPT_PRIVATE, &secrets);
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
index 27b211c9c..1ff69e22d 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
index 10ad5af94..9d3387877 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
@@ -61,8 +61,11 @@ Unknown/unused argument values passed to the callback will be set to zero
the callback will be called one or more times first, before it knows the data
sizes so a program must be made to handle that.
-Returning a non-zero value from this callback will cause libcurl to abort the
-transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
+If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
+libcurl to continue executing the default progress function.
+
+Returning any other non-zero value from this callback will cause libcurl to
+abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
If you transfer data with the multi interface, this function will not be
called during periods of idleness unless you call the appropriate libcurl
diff --git a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
index 743a2721a..2f3e8c5ee 100644
--- a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
diff --git a/docs/libcurl/opts/CURLOPT_PROXY.3 b/docs/libcurl/opts/CURLOPT_PROXY.3
index 0e68cdf41..9f1c45b12 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY \- set proxy to use
@@ -30,7 +30,7 @@ CURLOPT_PROXY \- set proxy to use
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY, char *proxy);
.SH DESCRIPTION
Set the \fIproxy\fP to use for the upcoming request. The parameter should be a
-char * to a zero terminated string holding the host name or dotted numerical
+char * to a null-terminated string holding the host name or dotted numerical
IP address. A numerical IPv6 address must be written within [brackets].
To specify port number in this string, append :[port] to the end of the host
@@ -96,7 +96,7 @@ All except file://. Note that some protocols don't do very well over proxy.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy:80");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
index f8d287d33..cf3c083ca 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
diff --git a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3 b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
index 3d5897544..a1b9aaa82 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYHEADER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
index 4543e9adf..49a7c31ca 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPASSWORD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
@@ -29,7 +29,7 @@ CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPASSWORD, char *pwd);
.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
+Pass a char * as parameter, which should be pointing to the null-terminated
password to use for authentication with the proxy.
The \fICURLOPT_PROXYPASSWORD(3)\fP option should be used in conjunction with
@@ -45,7 +45,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
index 73c882d8b..d72fd0a1f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYPORT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYPORT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
@@ -43,7 +43,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "localhost");
curl_easy_setopt(curl, CURLOPT_PROXYPORT, 8080L);
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
index cd6ad8c83..14d360345 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
index 8d76597d0..55b8ac499 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERNAME 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
@@ -31,7 +31,7 @@ CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERNAME,
char *username);
.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
+Pass a char * as parameter, which should be pointing to the null-terminated
user name to use for the transfer.
\fICURLOPT_PROXYUSERNAME(3)\fP sets the user name to be used in protocol
@@ -49,7 +49,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
curl_easy_setopt(curl, CURLOPT_PROXYUSERNAME, "mrsmith");
curl_easy_setopt(curl, CURLOPT_PROXYPASSWORD, "qwerty");
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
index c2c3dd681..868fcfa1d 100644
--- a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXYUSERPWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
@@ -47,7 +47,7 @@ Used with all protocols that can use a proxy
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "http://localhost:8080");
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
index fc28516c5..e838f86ed 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAINFO 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
@@ -31,7 +31,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAINFO, char *path);
.SH DESCRIPTION
This option is for connecting to an HTTPS proxy, not an HTTPS server.
-Pass a char * to a zero terminated string naming a file holding one or more
+Pass a char * to a null-terminated string naming a file holding one or more
certificates to verify the HTTPS proxy with.
If \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is zero and you avoid verifying the
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
index 5535dea1b..6b36f72f9 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CAPATH 3 "May 15, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CAPATH 3 "August 24, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
@@ -29,7 +29,7 @@ CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAPATH, char *capath);
.SH DESCRIPTION
-Pass a char * to a zero terminated string naming a directory holding multiple
+Pass a char * to a null-terminated string naming a directory holding multiple
CA certificates to verify the HTTPS proxy with. If libcurl is built against
OpenSSL, the certificate directory must be prepared using the openssl c_rehash
utility. This makes sense only when \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is
@@ -68,5 +68,5 @@ CURLE_UNKNOWN_OPTION
CURLE_OUT_OF_MEMORY
.SH "SEE ALSO"
.BR CURLOPT_PROXY_CAINFO "(3), "
-.Br CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_CAINFO "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
index 75637a6f8..5465fa281 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_CRLFILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
@@ -31,7 +31,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CRLFILE, char *file);
.SH DESCRIPTION
This option is for connecting to an HTTPS proxy, not an HTTPS server.
-Pass a char * to a zero terminated string naming a \fIfile\fP with the
+Pass a char * to a null-terminated string naming a \fIfile\fP with the
concatenation of CRL (in PEM format) to use in the certificate validation that
occurs during the SSL exchange.
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3
new file mode 100644
index 000000000..821ebe770
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT.3
@@ -0,0 +1,74 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_PROXY_ISSUERCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_PROXY_ISSUERCERT \- proxy issuer SSL certificate filename
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_ISSUERCERT, char *file);
+.SH DESCRIPTION
+Pass a char * to a null-terminated string naming a \fIfile\fP holding a CA
+certificate in PEM format. If the option is set, an additional check against
+the peer certificate is performed to verify the issuer of the the HTTPS proxy
+is indeed the one associated with the certificate provided by the option.
+This additional check is useful in multi-level PKI where one needs to enforce
+that the peer certificate is from a specific branch of the tree.
+
+This option makes sense only when used in combination with the
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the
+check is not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate
+(\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP has to be set too for the check to
+fail).
+
+The application does not have to keep the string around after setting this
+option.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using an HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ curl_easy_setopt(curl, CURLOPT_PROXY_ISSUERCERT, "/etc/certs/cacert.pem");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT_BLOB.3 b/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT_BLOB.3
new file mode 100644
index 000000000..857fffde9
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_PROXY_ISSUERCERT_BLOB.3
@@ -0,0 +1,85 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_PROXY_ISSUERCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_ISSUERCERT_BLOB \- proxy issuer SSL certificate from memory blob
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_ISSUERCERT_BLOB,
+ struct curl_blob *blob);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a curl_blob struct, which contains information (pointer and
+size) about a memory block with binary data of a CA certificate in PEM
+format. If the option is set, an additional check against the peer certificate
+is performed to verify the issuer of the the HTTPS proxy is indeed the one
+associated with the certificate provided by the option. This additional check
+is useful in multi-level PKI where one needs to enforce that the peer
+certificate is from a specific branch of the tree.
+
+This option should be used in combination with the
+\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP option. Otherwise, the result of the
+check is not considered as failure.
+
+A specific error code (CURLE_SSL_ISSUER_ERROR) is defined with the option,
+which is returned if the setup of the SSL/TLS session has failed due to a
+mismatch with the issuer of peer certificate
+(\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP has to be set too for the check to
+fail).
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_PROXY_ISSUERCERT(3)\fP which
+instead expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS-based protocols
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ /* using an HTTPS proxy */
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://localhost:443");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_PROXY_ISSUERCERT_BLOB, &blob);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSL_VERIFYPEER "(3), " CURLOPT_PROXY_SSL_VERIFYHOST "(3), "
+.BR CURLOPT_SSL_VERIFYPEER "(3), " CURLOPT_SSL_VERIFYHOST "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
index 58414a20c..29128d4db 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_KEYPASSWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
@@ -31,7 +31,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_KEYPASSWD, char *pwd);
.SH DESCRIPTION
This option is for connecting to an HTTPS proxy, not an HTTPS server.
-Pass a pointer to a zero terminated string as parameter. It will be used as
+Pass a pointer to a null-terminated string as parameter. It will be used as
the password required to use the \fICURLOPT_PROXY_SSLKEY(3)\fP private key.
You never needed a pass phrase to load a certificate but you need one to load
your private key.
@@ -46,7 +46,7 @@ Used with HTTPS proxy
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy:443");
curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "superman");
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
index 224225d31..2b3eac526 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 15, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
@@ -29,7 +29,7 @@ CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_PINNEDPUBLICKEY, char *pinnedpubkey);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string can be the
+Pass a pointer to a null-terminated string as parameter. The string can be the
file name of your pinned public key. The file format expected is "PEM" or "DER".
The string can also be any number of base64 encoded sha256 hashes preceded by
"sha256//" and separated by ";"
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
index 754a0ca18..2850258fc 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
index 750523a06..1bfb8e863 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
@@ -31,7 +31,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERT, char *cert);
.SH DESCRIPTION
This option is for connecting to an HTTPS proxy, not an HTTPS server.
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the file name of your client certificate used to connect to the HTTPS proxy.
The default format is "P12" on Secure Transport and "PEM" on other engines,
and can be changed with \fICURLOPT_PROXY_SSLCERTTYPE(3)\fP.
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
index 25aeb67a3..917c02647 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLCERTTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
@@ -29,7 +29,7 @@ CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERTTYPE, char *type);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the format of your client certificate used when connecting to an HTTPS proxy.
Supported formats are "PEM" and "DER", except with Secure Transport. OpenSSL
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT_BLOB.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT_BLOB.3
new file mode 100644
index 000000000..8b5a1336d
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT_BLOB.3
@@ -0,0 +1,72 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_PROXY_SSLCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLCERT_BLOB \- SSL proxy client certificate from memory blob
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERT_BLOB, struct curl_blob *blob);
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains information (pointer
+and size) about a memory block with binary data of the certificate used to
+connect to the HTTPS proxy. The format must be "P12" on Secure Transport or
+Schannel. The format must be "P12" or "PEM" on OpenSSL. The string "P12" or
+"PEM" must be specified with \fICURLOPT_PROXY_SSLCERTTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_PROXY_SSLCERT(3)\fP which instead
+expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY, "key.pem");
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT_BLOB, &blob);
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL, Secure
+Transport and Schannel backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_PROXY_SSLCERTTYPE "(3), " CURLOPT_PROXY_SSLKEY "(3), "
+.BR CURLOPT_PROXY_SSLCERT "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
index 48fc1604b..4cc4bcde9 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
@@ -29,7 +29,7 @@ CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cer
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEY, char *keyfile);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the file name of your private key used for connecting to the HTTPS proxy. The
default format is "PEM" and can be changed with
\fICURLOPT_PROXY_SSLKEYTYPE(3)\fP.
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
index a477de675..e1c615f61 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLKEYTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
@@ -31,7 +31,7 @@ CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEYTYPE, char *type);
.SH DESCRIPTION
This option is for connecting to an HTTPS proxy, not an HTTPS server.
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the format of your private key. Supported formats are "PEM", "DER" and "ENG".
The application does not have to keep the string around after setting this
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY_BLOB.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY_BLOB.3
new file mode 100644
index 000000000..daaff0df0
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY_BLOB.3
@@ -0,0 +1,73 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_PROXY_SSLKEY_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_PROXY_SSLKEY_BLOB \- private key for proxy cert from memory blob
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEY_BLOB,
+ struct curl_blob *blob);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure that contains information (pointer and
+size) about the private key for connecting to the HTTPS proxy. Compatible with
+OpenSSL. The format (like "PEM") must be specified with
+\fICURLOPT_PROXY_SSLKEYTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_PROXY, "https://proxy");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERT_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLCERTTYPE, "PEM");
+
+ blob.data = privateKeyData;
+ blob.len = privateKeySize;
+ curl_easy_setopt(curl, CURLOPT_PROXY_SSLKEY_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_PROXY_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
index 3d0153b25..f436be5d4 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSLVERSION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSLVERSION 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
index 520732ea6..626a782c1 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
@@ -29,7 +29,7 @@ CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_CIPHER_LIST, char *list);
.SH DESCRIPTION
-Pass a char *, pointing to a zero terminated string holding the list of
+Pass a char *, pointing to a null-terminated string holding the list of
ciphers to use for the connection to the HTTPS proxy. The list must be
syntactically correct, it consists of one or more cipher strings separated by
colons. Commas or spaces are also acceptable separators but colons are
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
index fbe58d6a0..0a6bbf0cf 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
@@ -29,25 +29,38 @@ CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_OPTIONS, long bitmask);
.SH DESCRIPTION
-Pass a long with a bitmask to tell libcurl about specific SSL behaviors.
+Pass a long with a bitmask to tell libcurl about specific SSL
+behaviors. Available bits:
+.IP CURLSSLOPT_ALLOW_BEAST
+Tells libcurl to not attempt to use any workarounds for a security flaw in the
+SSL3 and TLS1.0 protocols. If this option isn't used or this bit is set to 0,
+the SSL layer libcurl uses may use a work-around for this flaw although it
+might cause interoperability problems with some (older) SSL
+implementations. WARNING: avoiding this work-around lessens the security, and
+by setting this option to 1 you ask for exactly that. This option is only
+supported for Secure Transport, NSS and OpenSSL.
+.IP CURLSSLOPT_NO_REVOKE
+Tells libcurl to disable certificate revocation checks for those SSL backends
+where such behavior is present. This option is only supported for Schannel
+(the native Windows SSL library), with an exception in the case of Windows'
+Untrusted Publishers block list which it seems can't be bypassed. (Added in
+7.44.0)
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Tells libcurl to not accept "partial" certificate chains, which it otherwise
+does by default. This option is only supported for OpenSSL and will fail the
+certificate verification if the chain ends with an intermediate certificate
+and not with a root cert. (Added in 7.68.0)
-\fICURLSSLOPT_ALLOW_BEAST\fP tells libcurl to not attempt to use any
-workarounds for a security flaw in the SSL3 and TLS1.0 protocols. If this
-option isn't used or this bit is set to 0, the SSL layer libcurl uses may use
-a work-around for this flaw although it might cause interoperability problems
-with some (older) SSL implementations. WARNING: avoiding this work-around
-lessens the security, and by setting this option to 1 you ask for exactly
-that. This option is only supported for DarwinSSL, NSS and OpenSSL.
-
-\fICURLSSLOPT_NO_REVOKE\fP tells libcurl to disable certificate revocation
-checks for those SSL backends where such behavior is present. This option is
-only supported for Schannel (the native Windows SSL library), with an
-exception in the case of Windows' Untrusted Publishers blacklist which it
-seems can't be bypassed.
+.IP CURLSSLOPT_REVOKE_BEST_EFFORT
+Tells libcurl to ignore certificate revocation checks in case of missing or
+offline distribution points for those SSL backends where such behavior is
+present. This option is only supported for Schannel (the native Windows SSL
+library). If combined with \fICURLSSLOPT_NO_REVOKE\fP, the latter takes
+precedence. (Added in 7.70.0)
.SH DEFAULT
0
.SH PROTOCOLS
-All
+All TLS-based protocols
.SH AVAILABLE
Added in 7.52.0
.SH EXAMPLE
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
index 3e4f0460e..e3bc216b4 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
index e048aae98..ec54366f5 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
index 89ffc13a6..c86235988 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
@@ -29,7 +29,7 @@ CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLS13_CIPHERS, char *list);
.SH DESCRIPTION
-Pass a char *, pointing to a zero terminated string holding the list of cipher
+Pass a char *, pointing to a null-terminated string holding the list of cipher
suites to use for the TLS 1.3 connection to a proxy. The list must be
syntactically correct, it consists of one or more cipher suite strings
separated by colons.
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 33b728ace..4f318d52a 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
@@ -29,7 +29,7 @@ CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_PASSWORD, char *pwd);
.SH DESCRIPTION
-Pass a char * as parameter, which should point to the zero terminated password
+Pass a char * as parameter, which should point to the null-terminated password
to use for the TLS authentication method specified with the
\fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_PROXY_TLSAUTH_USERNAME(3)\fP option also be set.
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
index 34fbe9801..917bc4ff5 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
@@ -29,7 +29,7 @@ CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_TYPE, char *type);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the method of the TLS authentication used for the HTTPS connection. Supported
method is "SRP".
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
index 93d7f8d4a..7e54fbf0f 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
@@ -29,7 +29,7 @@ CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_USERNAME, char *user);
.SH DESCRIPTION
-Pass a char * as parameter, which should point to the zero terminated username
+Pass a char * as parameter, which should point to the null-terminated username
to use for the HTTPS proxy TLS authentication method specified with the
\fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP option also be set.
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
index 9e074a3dc..fc33373bd 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROXY_TRANSFER_MODE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
diff --git a/docs/libcurl/opts/CURLOPT_PUT.3 b/docs/libcurl/opts/CURLOPT_PUT.3
index 825edd7c0..0581b7f50 100644
--- a/docs/libcurl/opts/CURLOPT_PUT.3
+++ b/docs/libcurl/opts/CURLOPT_PUT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_PUT \- make an HTTP PUT request
diff --git a/docs/libcurl/opts/CURLOPT_QUOTE.3 b/docs/libcurl/opts/CURLOPT_QUOTE.3
index 78869c405..d5501f5d2 100644
--- a/docs/libcurl/opts/CURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_QUOTE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "August 14, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
@@ -44,6 +44,10 @@ mandatory commands).
The valid SFTP commands are:
.RS
+.IP "atime date file"
+The atime command sets the last access time of the file named by the file
+operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "chgrp group file"
The chgrp command sets the group ID of the file named by the file operand to
the group ID specified by the group operand. The group operand is a decimal
@@ -60,6 +64,10 @@ The ln and symlink commands create a symbolic link at the target_file location
pointing to the source_file location.
.IP "mkdir directory_name"
The mkdir command creates the directory named by the directory_name operand.
+.IP "mtime date file"
+The mtime command sets the last modification time of the file named by the
+file operand. The <date expression> can be all sorts of date strings, see the
+\fIcurl_getdate(3)\fP man page for date expression details. (Added in 7.73.0)
.IP "pwd"
The pwd command returns the absolute pathname of the current working directory.
.IP "rename source target"
@@ -82,16 +90,16 @@ NULL
SFTP and FTP
.SH EXAMPLE
.nf
-struct curl_slist *h = NULL;
-h = curl_slist_append(h, "RNFR source-name");
-h = curl_slist_append(h, "RNTO new-name");
+struct curl_slist *cmdlist = NULL;
+cmdlist = curl_slist_append(cmdlist, "RNFR source-name");
+cmdlist = curl_slist_append(cmdlist, "RNTO new-name");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/foo.bin");
/* pass in the FTP commands to run before the transfer */
- curl_easy_setopt(curl, CURLOPT_QUOTE, headerlist);
+ curl_easy_setopt(curl, CURLOPT_QUOTE, cmdlist);
ret = curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3 b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
index c54f6024d..047748536 100644
--- a/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
+++ b/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RANDOM_FILE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
@@ -29,7 +29,7 @@ CURLOPT_RANDOM_FILE \- specify a source for random data
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path);
.SH DESCRIPTION
-Pass a char * to a zero terminated file name. The file might be used to read
+Pass a char * to a null-terminated file name. The file might be used to read
from to seed the random engine for SSL and more.
The application does not have to keep the string around after setting this
diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3
index 54c98cda7..cf77786f0 100644
--- a/docs/libcurl/opts/CURLOPT_RANGE.3
+++ b/docs/libcurl/opts/CURLOPT_RANGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RANGE 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RANGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RANGE \- set byte range to request
@@ -64,7 +64,7 @@ HTTP, FTP, FILE, RTSP and SFTP.
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* get the first 200 bytes */
curl_easy_setopt(curl, CURLOPT_RANGE, "0-199");
diff --git a/docs/libcurl/opts/CURLOPT_READDATA.3 b/docs/libcurl/opts/CURLOPT_READDATA.3
index 88bf8d385..778a6d044 100644
--- a/docs/libcurl/opts/CURLOPT_READDATA.3
+++ b/docs/libcurl/opts/CURLOPT_READDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
@@ -48,7 +48,7 @@ This is used for all protocols when sending data.
CURL *curl = curl_easy_init();
struct MyData this;
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* pass pointer that gets passed in to the
CURLOPT_READFUNCTION callback */
diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
index 6582b80db..c6c3af113 100644
--- a/docs/libcurl/opts/CURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_READFUNCTION 3 "August 12, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
@@ -65,6 +65,11 @@ server end and the transfer will end there.
If you set this callback pointer to NULL, or don't set it at all, the default
internal read function will be used. It is doing an fread() on the FILE *
userdata set with \fICURLOPT_READDATA(3)\fP.
+
+You can set the total size of the data you are sending by using
+\fICURLOPT_INFILESIZE_LARGE(3)\fP or \fICURLOPT_POSTFIELDSIZE_LARGE(3)\fP,
+depending on the type of transfer. For some transfer types it may be required
+and it allows for better error checking.
.SH DEFAULT
The default internal read callback is fread().
.SH PROTOCOLS
@@ -89,14 +94,14 @@ size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
void setup(char *uploadthis)
{
- FILE *file = fopen("rb", uploadthis);
+ FILE *file = fopen(uploadthis, "rb");
CURLcode result;
/* set callback to use */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* pass in suitable argument to callback */
- curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);
+ curl_easy_setopt(curl, CURLOPT_READDATA, (void *)file);
result = curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3 b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
index 6d9af7012..1bc786fe6 100644
--- a/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REDIR_PROTOCOLS 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REDIR_PROTOCOLS 3 "February 18, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
@@ -76,7 +76,10 @@ CURLPROTO_TELNET
CURLPROTO_TFTP
.fi
.SH DEFAULT
-All protocols except for FILE, SCP and since 7.40.0 SMB and SMBS.
+HTTP, HTTPS, FTP and FTPS (Since 7.65.2).
+
+Older versions defaulted to all protocols except FILE, SCP and since 7.40.0
+SMB and SMBS.
.SH PROTOCOLS
All
.SH EXAMPLE
diff --git a/docs/libcurl/opts/CURLOPT_REFERER.3 b/docs/libcurl/opts/CURLOPT_REFERER.3
index 01a2d5f79..b95f8974d 100644
--- a/docs/libcurl/opts/CURLOPT_REFERER.3
+++ b/docs/libcurl/opts/CURLOPT_REFERER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
@@ -29,7 +29,7 @@ CURLOPT_REFERER \- set the HTTP referer header
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REFERER, char *where);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It will be used to
+Pass a pointer to a null-terminated string as parameter. It will be used to
set the Referer: header in the http request sent to the remote server. This
can be used to fool servers or scripts. You can also set any custom header
with \fICURLOPT_HTTPHEADER(3)\fP.
@@ -44,10 +44,10 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* tell it where we found the link to this place */
- curl_easy_setopt(curl, CURLOPT_REFERER, "http://example.com/aboutme.html");
+ curl_easy_setopt(curl, CURLOPT_REFERER, "https://example.com/aboutme.html");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index f8293cd3f..04ed9f3ad 100644
--- a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
+++ b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REQUEST_TARGET 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
@@ -39,7 +39,7 @@ HTTP
.nf
curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/*");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/*");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "OPTIONS");
/* issue an OPTIONS * request (no leading slash) */
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.3 b/docs/libcurl/opts/CURLOPT_RESOLVE.3
index 2049a9224..43763cfb8 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
@@ -80,7 +80,7 @@ host = curl_slist_append(NULL, "example.com:80:127.0.0.1");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
index 162187f5b..4347e49ee 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_DATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
@@ -51,7 +51,7 @@ CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_FUNCTION, resolver_start_cb);
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_DATA, curl);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
index 79d042207..9b8250c61 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVER_START_FUNCTION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
@@ -71,7 +71,7 @@ CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_FUNCTION, resolver_start_cb);
curl_easy_setopt(curl, CURLOPT_RESOLVER_START_DATA, curl);
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
index e52e5238b..fa0484c7c 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
index d40f981db..982655239 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESUME_FROM_LARGE 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
index e19440c14..c944cf635 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3 b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
index 8d8565a03..49a5c7b4f 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3 b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
index 8526d93cb..96fb872cd 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3 b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
index d2ba95650..131a21053 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3 b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
index c276242f0..6d8c45081 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
diff --git a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3 b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
index 60c776bc8..96c262fb1 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
diff --git a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3 b/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
index 65445475d..35e6c001c 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3
@@ -20,7 +20,8 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_AUTHZID 3 "11 Sep 2019" "libcurl 7.66.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_AUTHZID 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
+
.SH NAME
CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
.SH SYNOPSIS
@@ -28,7 +29,7 @@ CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_AUTHZID, char *authzid);
.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
+Pass a char * as parameter, which should be pointing to the null-terminated
authorisation identity (authzid) for the transfer. Only applicable to the PLAIN
SASL authentication mechanism where it is optional.
diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.3 b/docs/libcurl/opts/CURLOPT_SASL_IR.3
index 6f09c4d9a..09a2becab 100644
--- a/docs/libcurl/opts/CURLOPT_SASL_IR.3
+++ b/docs/libcurl/opts/CURLOPT_SASL_IR.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
diff --git a/docs/libcurl/opts/CURLOPT_SEEKDATA.3 b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
index 8bf2ddd22..4c71c5a6c 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKDATA 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKDATA 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
diff --git a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
index 62cf7cdbd..d740abfc0 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
diff --git a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
index e1e4d5563..941177228 100644
--- a/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
+++ b/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SHARE.3 b/docs/libcurl/opts/CURLOPT_SHARE.3
index 3d2ba331d..193d811a4 100644
--- a/docs/libcurl/opts/CURLOPT_SHARE.3
+++ b/docs/libcurl/opts/CURLOPT_SHARE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SHARE \- specify share handle to use
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
index bff5f28f6..cc43ac453 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTDATA 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
@@ -49,7 +49,7 @@ curl = curl_easy_init();
if(curl) {
int recvbuffersize = 256 * 1024;
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
/* call this function to set options for the socket */
curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
index 44cc5600e..efce2a6f6 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
index d197bd91d..1dc698fd1 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
index 9ca4271ed..7bbae66e6 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
diff --git a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3 b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
index beab699b2..59d5b63cb 100644
--- a/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
+++ b/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
diff --git a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3 b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
index 7f726efdd..09b8b403d 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
diff --git a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3 b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
index 893922c09..9fea8611c 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
diff --git a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3 b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
index 86ffb35a1..cb8b3fa6d 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
index 545007f91..2c09702f0 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
index cda31e36f..fcd95a24f 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KEYFUNCTION 3 "July 15, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
@@ -36,6 +36,7 @@ enum curl_khstat {
now so this causes a CURLE_DEFER error but
otherwise the connection will be left intact
etc */
+ CURLKHSTAT_FINE_REPLACE
};
enum curl_khmatch {
@@ -45,7 +46,7 @@ enum curl_khmatch {
};
struct curl_khkey {
- const char *key; /* points to a zero-terminated string encoded with
+ const char *key; /* points to a null-terminated string encoded with
base64 if len is zero, otherwise to the "raw"
data */
size_t len;
@@ -73,7 +74,13 @@ known_hosts file \fIknownkey\fP, the key from the remote site \fIfoundkey\fP,
info from libcurl on the matching status and a custom pointer (set with
\fICURLOPT_SSH_KEYDATA(3)\fP). It MUST return one of the following return
codes to tell libcurl how to act:
-
+.IP CURLKHSTAT_FINE_REPLACE
+The new host+key is accepted and libcurl will replace the old host+key into
+the known_hosts file before continuing with the connection. This will also
+add the new host+key combo to the known_host pool kept in memory if it wasn't
+already present there. The adding of data to the file is done by completely
+replacing the file with a new copy, so the permissions of the file must allow
+this. (Added in 7.73.0)
.IP CURLKHSTAT_FINE_ADD_TO_FILE
The host+key is accepted and libcurl will append it to the known_hosts file
before continuing with the connection. This will also add the host+key combo
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
index 06afe8c0e..dcdc90915 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_KNOWNHOSTS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
@@ -29,7 +29,7 @@ CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KNOWNHOSTS, char *fname);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string holding the file name of the
+Pass a pointer to a null-terminated string holding the file name of the
known_host file to use. The known_hosts file should use the OpenSSH file
format as supported by libssh2. If this file is specified, libcurl will only
accept connections with hosts that are known and present in that file, with a
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
index 953a3c057..402e57b33 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
index b4c12f27d..75c05ecd9 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT.3 b/docs/libcurl/opts/CURLOPT_SSLCERT.3
index a3e293dfa..5af0e9569 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERT 3 "January 29, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERT 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
@@ -29,7 +29,7 @@ CURLOPT_SSLCERT \- set SSL client certificate
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the file name of your client certificate. The default format is "P12" on
Secure Transport and "PEM" on other engines, and can be changed with
\fICURLOPT_SSLCERTTYPE(3)\fP.
@@ -39,15 +39,17 @@ you wish to authenticate with as it is named in the security database. If you
want to use a file from the current directory, please precede it with "./"
prefix, in order to avoid confusion with a nickname.
-(Schannel only) Client certificates must be specified by a path expression to
-a certificate store. (Loading PFX is not supported; you can import it to a
-store first). You can use "<store location>\\<store name>\\<thumbprint>" to
-refer to a certificate in the system certificates store, for example,
+(Schannel only) Client certificates can be specified by a path expression to
+a certificate store. (You can import PFX to a store first). You can use
+"<store location>\\<store name>\\<thumbprint>" to refer to a certificate
+in the system certificates store, for example,
"CurrentUser\\MY\\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a". Thumbprint is
usually a SHA-1 hex string which you can see in certificate details. Following
store locations are supported: CurrentUser, LocalMachine, CurrentService,
Services, CurrentUserGroupPolicy, LocalMachineGroupPolicy,
LocalMachineEnterprise.
+Schannel also support P12 certificate file, with the string "P12" specified
+with \fICURLOPT_SSLCERTTYPE(3)\fP.
When using a client certificate, you most likely also need to provide a
private key with \fICURLOPT_SSLKEY(3)\fP.
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
index 95f20a358..324996a3b 100644
--- a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLCERTTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
@@ -29,7 +29,7 @@ CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERTTYPE, char *type);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the format of your certificate. Supported formats are "PEM" and "DER", except
with Secure Transport. OpenSSL (versions 0.9.3 and later) and Secure Transport
(on iOS 5 or later, or OS X 10.7 or later) also support "P12" for
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERT_BLOB.3 b/docs/libcurl/opts/CURLOPT_SSLCERT_BLOB.3
new file mode 100644
index 000000000..ed13d6cfc
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SSLCERT_BLOB.3
@@ -0,0 +1,69 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SSLCERT_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSLCERT_BLOB \- SSL client certificate from memory blob
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT_BLOB, struct curl_blob *stblob);
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains (pointer and size) a
+client certificate. The format must be "P12" on Secure Transport or
+Schannel. The format must be "P12" or "PEM" on OpenSSL. The string "P12" or
+"PEM" must be specified with \fICURLOPT_SSLCERTTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_SSLCERT(3)\fP which instead
+expects a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob stblob;
+ stblob.data = certificateData;
+ stblob.len = filesize;
+ stblob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSLCERT_BLOB, &stblob);
+ curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "P12");
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL, Secure
+Transport and Schannel backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLCERTTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
index 2ca6da47f..7be56ead8 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
@@ -29,7 +29,7 @@ CURLOPT_SSLENGINE \- set SSL engine identifier
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It will be used as
+Pass a pointer to a null-terminated string as parameter. It will be used as
the identifier for the crypto engine you want to use for your private key.
The application does not have to keep the string around after setting this
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
index bc64851b0..559a4f056 100644
--- a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
+++ b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_SSLKEY.3
index 9d2fb138e..ce1208a25 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEY.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEY.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEY 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
@@ -29,7 +29,7 @@ CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the file name of your private key. The default format is "PEM" and can be
changed with \fICURLOPT_SSLKEYTYPE(3)\fP.
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
index e4b3ae332..2b71c0817 100644
--- a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLKEYTYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
@@ -29,7 +29,7 @@ CURLOPT_SSLKEYTYPE \- set type of the private key file
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEYTYPE, char *type);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string should be
+Pass a pointer to a null-terminated string as parameter. The string should be
the format of your private key. Supported formats are "PEM", "DER" and "ENG".
The format "ENG" enables you to load the private key from a crypto engine. In
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEY_BLOB.3 b/docs/libcurl/opts/CURLOPT_SSLKEY_BLOB.3
new file mode 100644
index 000000000..1f657c8ec
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SSLKEY_BLOB.3
@@ -0,0 +1,75 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SSLKEY_BLOB 3 "24 Jun 2020" "libcurl 7.71.0" "curl_easy_setopt options"
+.SH NAME
+CURLOPT_SSLKEY_BLOB \- private key for client cert from memory blob
+.SH SYNOPSIS
+.nf
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY_BLOB,
+ struct curl_blob *blob);
+.fi
+.SH DESCRIPTION
+Pass a pointer to a curl_blob structure, which contains information (pointer
+and size) for a private key. Compatible with OpenSSL. The format (like "PEM")
+must be specified with \fICURLOPT_SSLKEYTYPE(3)\fP.
+
+If the blob is initialized with the flags member of struct curl_blob set to
+CURL_BLOB_COPY, the application does not have to keep the buffer around after
+setting this.
+
+This option is an alternative to \fICURLOPT_SSLKEY(3)\fP which instead expects
+a file name as input.
+.SH DEFAULT
+NULL
+.SH PROTOCOLS
+All TLS based protocols: HTTPS, FTPS, IMAPS, POP3S, SMTPS etc.
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ struct curl_blob blob;
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ blob.data = certificateData;
+ blob.len = filesize;
+ blob.flags = CURL_BLOB_COPY;
+ curl_easy_setopt(curl, CURLOPT_SSLCERT_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
+
+ blob.data = privateKeyData;
+ blob.len = privateKeySize;
+ curl_easy_setopt(curl, CURLOPT_SSLKEY_BLOB, &blob);
+ curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
+ curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in libcurl 7.71.0. This option is supported by the OpenSSL backends.
+.SH RETURN VALUE
+Returns CURLE_OK if TLS enabled, CURLE_UNKNOWN_OPTION if not, or
+CURLE_OUT_OF_MEMORY if there was insufficient heap space.
+.SH "SEE ALSO"
+.BR CURLOPT_SSLKEYTYPE "(3), " CURLOPT_SSLKEY "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
index 5cce52a07..7b12b9d7a 100644
--- a/docs/libcurl/opts/CURLOPT_SSLVERSION.3
+++ b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSLVERSION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSLVERSION 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3 b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
index 848dd7f49..2c6ef0d00 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CIPHER_LIST 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
@@ -29,7 +29,7 @@ CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CIPHER_LIST, char *list);
.SH DESCRIPTION
-Pass a char *, pointing to a zero terminated string holding the list of
+Pass a char *, pointing to a null-terminated string holding the list of
ciphers to use for the SSL connection. The list must be syntactically correct,
it consists of one or more cipher strings separated by colons. Commas or
spaces are also acceptable separators but colons are normally used, \&!, \&-
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
index 5e9c125c9..167fe327a 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
index fade26edb..ed238895c 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or mbedTLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.3 b/docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.3
new file mode 100644
index 000000000..db2d87375
--- /dev/null
+++ b/docs/libcurl/opts/CURLOPT_SSL_EC_CURVES.3
@@ -0,0 +1,55 @@
+.\" **************************************************************************
+.\" * _ _ ____ _
+.\" * Project ___| | | | _ \| |
+.\" * / __| | | | |_) | |
+.\" * | (__| |_| | _ <| |___
+.\" * \___|\___/|_| \_\_____|
+.\" *
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" *
+.\" * This software is licensed as described in the file COPYING, which
+.\" * you should have received as part of this distribution. The terms
+.\" * are also available at https://curl.haxx.se/docs/copyright.html.
+.\" *
+.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+.\" * copies of the Software, and permit persons to whom the Software is
+.\" * furnished to do so, under the terms of the COPYING file.
+.\" *
+.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+.\" * KIND, either express or implied.
+.\" *
+.\" **************************************************************************
+.\"
+.TH CURLOPT_SSL_EC_CURVES 3 "August 29, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
+
+.SH NAME
+CURLOPT_SSL_EC_CURVES \- set key exchange curves
+.SH SYNOPSIS
+#include <curl/curl.h>
+
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_EC_CURVES, char *alg_list);
+.SH DESCRIPTION
+Pass a string as parameter with a colon delimited list of (EC) algorithms. This
+option defines the client's key exchange algorithms in the SSL handshake (if
+the SSL backend libcurl is built to use supports it).
+.SH DEFAULT
+"", embedded in SSL backend
+.SH PROTOCOLS
+HTTP
+.SH EXAMPLE
+.nf
+CURL *curl = curl_easy_init();
+if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+ curl_easy_setopt(curl, CURLOPT_SSL_EC_CURVES, "X25519:P-521");
+ ret = curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+.fi
+.SH AVAILABILITY
+Added in 7.73.0. Supported by the OpenSSL backend.
+.SH RETURN VALUE
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
+.SH "SEE ALSO"
+.BR CURLOPT_SSL_OPTIONS "(3), " CURLOPT_SSL_CIPHER_LIST "(3), "
+.BR CURLOPT_TLS13_CIPHERS "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
index 8f55d8916..db7b7c2b1 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
index 1fe88a8ce..5f4fae639 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
diff --git a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3 b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
index 60c7baede..c0bb76717 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
diff --git a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
index d6445fde5..46b5f08f9 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
@@ -29,23 +29,38 @@ CURLOPT_SSL_OPTIONS \- set SSL behavior options
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask);
.SH DESCRIPTION
-Pass a long with a bitmask to tell libcurl about specific SSL behaviors.
-
-\fICURLSSLOPT_ALLOW_BEAST\fP tells libcurl to not attempt to use any
-workarounds for a security flaw in the SSL3 and TLS1.0 protocols. If this
-option isn't used or this bit is set to 0, the SSL layer libcurl uses may use a
-work-around for this flaw although it might cause interoperability problems
-with some (older) SSL implementations. WARNING: avoiding this work-around
-lessens the security, and by setting this option to 1 you ask for exactly that.
-This option is only supported for DarwinSSL, NSS and OpenSSL.
-
-Added in 7.44.0:
-
-\fICURLSSLOPT_NO_REVOKE\fP tells libcurl to disable certificate revocation
-checks for those SSL backends where such behavior is present. This option is
-only supported for Schannel (the native Windows SSL library), with an
-exception in the case of Windows' Untrusted Publishers blacklist which it
-seems can't be bypassed.
+Pass a long with a bitmask to tell libcurl about specific SSL
+behaviors. Available bits:
+.IP CURLSSLOPT_ALLOW_BEAST
+Tells libcurl to not attempt to use any workarounds for a security flaw in the
+SSL3 and TLS1.0 protocols. If this option isn't used or this bit is set to 0,
+the SSL layer libcurl uses may use a work-around for this flaw although it
+might cause interoperability problems with some (older) SSL
+implementations. WARNING: avoiding this work-around lessens the security, and
+by setting this option to 1 you ask for exactly that. This option is only
+supported for Secure Transport, NSS and OpenSSL.
+.IP CURLSSLOPT_NO_REVOKE
+Tells libcurl to disable certificate revocation checks for those SSL backends
+where such behavior is present. This option is only supported for Schannel
+(the native Windows SSL library), with an exception in the case of Windows'
+Untrusted Publishers block list which it seems can't be bypassed. (Added in
+7.44.0)
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Tells libcurl to not accept "partial" certificate chains, which it otherwise
+does by default. This option is only supported for OpenSSL and will fail the
+certificate verification if the chain ends with an intermediate certificate
+and not with a root cert. (Added in 7.68.0)
+.IP CURLSSLOPT_REVOKE_BEST_EFFORT
+Tells libcurl to ignore certificate revocation checks in case of missing or
+offline distribution points for those SSL backends where such behavior is
+present. This option is only supported for Schannel (the native Windows SSL
+library). If combined with \fICURLSSLOPT_NO_REVOKE\fP, the latter takes
+precedence. (Added in 7.70.0)
+.IP CURLSSLOPT_NATIVE_CA
+Tell libcurl to use the operating system's native CA store for certificate
+verification. Works only on Windows when built to use OpenSSL. This option is
+experimental and behavior is subject to change.
+(Added in 7.71.0)
.SH DEFAULT
0
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3 b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
index 20b04a57b..fdc1077c1 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
index 026fcf8c8..219054136 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYHOST 3 "July 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
@@ -65,8 +65,8 @@ This option controls checking the server's certificate's claimed identity.
The server could be lying. To control lying, see
\fICURLOPT_SSL_VERIFYPEER(3)\fP.
.SH LIMITATIONS
-DarwinSSL: If \fIverify\fP value is 0, then SNI is also disabled. SNI is a TLS
-extension that sends the hostname to the server. The server may use that
+Secure Transport: If \fIverify\fP value is 0, then SNI is also disabled. SNI is
+a TLS extension that sends the hostname to the server. The server may use that
information to do such things as sending back a specific certificate for the
hostname, or forwarding the request to a specific origin server. Some hostnames
may be inaccessible if SNI is not sent.
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
index 0aa1f28f1..47d5a26b9 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
index 344ce8e95..fcbfe6fd7 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
diff --git a/docs/libcurl/opts/CURLOPT_STDERR.3 b/docs/libcurl/opts/CURLOPT_STDERR.3
index aebf6858d..ce20f2da8 100644
--- a/docs/libcurl/opts/CURLOPT_STDERR.3
+++ b/docs/libcurl/opts/CURLOPT_STDERR.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
@@ -41,7 +41,7 @@ All
CURL *curl = curl_easy_init();
FILE *filep = fopen("dump", "wb");
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_STDERR, filep);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
index 47949b2ac..38da9c83d 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
index fa2d943a7..f472a75f3 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_DEPENDS_E 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3 b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
index 699304bf2..c063050f9 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STREAM_WEIGHT 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
diff --git a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3 b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
index d7d460767..e23b5574e 100644
--- a/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
+++ b/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
diff --git a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3 b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
index eeb5f06a5..1a39db2df 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_FASTOPEN 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
@@ -42,7 +42,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
index 5f2a16d88..3a4a69ed0 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPALIVE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
@@ -42,7 +42,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
index 0d49cd03a..26bb554ee 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPIDLE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
index 0034c3609..b4d2c6f14 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_KEEPINTVL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
@@ -40,7 +40,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
index e1f22e2ca..53a41d72f 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TCP_NODELAY 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
@@ -51,7 +51,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* disable Nagle */
curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 0);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
index f5309db9f..913a5f3d6 100644
--- a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3 b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
index cdc5a0803..55bd09dde 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
index d814be4ba..9d9ab50ba 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
diff --git a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3 b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
index 05976eb3a..00e9432a9 100644
--- a/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
+++ b/docs/libcurl/opts/CURLOPT_TIMECONDITION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMECONDITION 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
@@ -46,7 +46,7 @@ HTTP, FTP, RTSP, and FILE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
index 0d33da863..19d574979 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT 3 "October 15, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
@@ -55,7 +55,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete within 20 seconds */
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
index d5de79b93..103692b12 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEOUT_MS 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
@@ -58,7 +58,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* complete within 20000 milliseconds */
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 20000L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
index 61542bfc0..b352f671c 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
@@ -43,7 +43,7 @@ HTTP, FTP, RTSP, and FILE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, 1577833200L);
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
index 61de7dd8a..4ebfb017b 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TIMEVALUE_LARGE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
@@ -44,7 +44,7 @@ HTTP, FTP, RTSP, and FILE
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* January 1, 2020 is 1577833200 */
curl_easy_setopt(curl, CURLOPT_TIMEVALUE_LARGE, (curl_off_t)1577833200);
diff --git a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
index 0561d9d95..abd767b48 100644
--- a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
+++ b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLS13_CIPHERS 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLS13_CIPHERS 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
@@ -29,7 +29,7 @@ CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLS13_CIPHERS, char *list);
.SH DESCRIPTION
-Pass a char *, pointing to a zero terminated string holding the list of cipher
+Pass a char *, pointing to a null-terminated string holding the list of cipher
suites to use for the TLS 1.3 connection. The list must be syntactically
correct, it consists of one or more cipher suite strings separated by colons.
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
index 005e5e915..7b9a97cc1 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_PASSWORD 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
@@ -29,13 +29,15 @@ CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_PASSWORD, char *pwd);
.SH DESCRIPTION
-Pass a char * as parameter, which should point to the zero terminated password
+Pass a char * as parameter, which should point to the null-terminated password
to use for the TLS authentication method specified with the
\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_TLSAUTH_USERNAME(3)\fP option also be set.
The application does not have to keep the string around after setting this
option.
+
+This feature relies in TLS SRP which doesn't work with TLS 1.3.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
index aa1ee1604..e52efb45b 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_TYPE 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
@@ -29,8 +29,8 @@ CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, char *type);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. The string
-should be the method of the TLS authentication. Supported method is "SRP".
+Pass a pointer to a null-terminated string as parameter. The string should be
+the method of the TLS authentication. Supported method is "SRP".
.IP SRP
TLS-SRP authentication. Secure Remote Password authentication for TLS is
@@ -41,6 +41,8 @@ options.
The application does not have to keep the string around after setting this
option.
+
+TLS SRP doesn't work with TLS 1.3.
.SH DEFAULT
blank
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
index 764603525..ceecec0e0 100644
--- a/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TLSAUTH_USERNAME 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
@@ -29,13 +29,15 @@ CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_USERNAME, char *user);
.SH DESCRIPTION
-Pass a char * as parameter, which should point to the zero terminated username
+Pass a char * as parameter, which should point to the null-terminated username
to use for the TLS authentication method specified with the
\fICURLOPT_TLSAUTH_TYPE(3)\fP option. Requires that the
\fICURLOPT_TLSAUTH_PASSWORD(3)\fP option also be set.
The application does not have to keep the string around after setting this
option.
+
+This feature relies in TLS SRP which doesn't work with TLS 1.3.
.SH DEFAULT
NULL
.SH PROTOCOLS
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3 b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
index 46c46653a..d5133d7bb 100644
--- a/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
+++ b/docs/libcurl/opts/CURLOPT_TRAILERDATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRAILERDATA 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRAILERDATA 3 "October 31, 2019" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
diff --git a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
index b4535f406..42bcc1636 100644
--- a/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRAILERFUNCTION 3 "October 31, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRAILERFUNCTION 3 "October 03, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
@@ -74,7 +74,7 @@ static int trailer_cb(struct curl_slist **tr, void *data)
CURL *curl = curl_easy_init();
if(curl) {
/* Set the URL of the request */
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
/* Now set it as a put */
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
@@ -83,7 +83,7 @@ if(curl) {
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers, "Trailer: My-super-awsome-trailer");
+ headers = curl_slist_append(headers, "Trailer: My-super-awesome-trailer");
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
/* Set the trailers filling callback */
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
index 3f0f97670..cb59cb7e7 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3 b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
index 6cb2d3b6f..c3cc93f8d 100644
--- a/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
+++ b/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_TRANSFER_ENCODING 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
@@ -49,7 +49,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1L);
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
index 7a61b8299..fa6544ff0 100644
--- a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UNIX_SOCKET_PATH 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3 b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
index 493be9ada..92fede0ae 100644
--- a/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
+++ b/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UNRESTRICTED_AUTH 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
@@ -47,7 +47,7 @@ HTTP
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1L);
curl_easy_perform(curl);
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3
index f9b42fe3c..668ee89c9 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD \- enable data upload
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
index dc39eb578..184b12b73 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
diff --git a/docs/libcurl/opts/CURLOPT_URL.3 b/docs/libcurl/opts/CURLOPT_URL.3
index 809769072..bb2916d9e 100644
--- a/docs/libcurl/opts/CURLOPT_URL.3
+++ b/docs/libcurl/opts/CURLOPT_URL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_URL 3 "November 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_URL \- provide the URL to use in the request
@@ -30,7 +30,7 @@ CURLOPT_URL \- provide the URL to use in the request
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_URL, char *URL);
.SH DESCRIPTION
Pass in a pointer to the \fIURL\fP to work with. The parameter should be a
-char * to a zero terminated string which must be URL-encoded in the following
+char * to a null-terminated string which must be URL-encoded in the following
format:
scheme://host:port/path
@@ -153,6 +153,10 @@ path.
ftp://user:password@ftp.example.com//readme.txt - This retrieves the readme.txt
from the root directory when logging in as a specified user.
+.IP FILE
+When a FILE:// URL is accessed on Windows systems, it can be crafted in a way
+so that Windows attempts to connect to a (remote) machine when curl wants to
+read or write such a path.
.IP SMTP
The path part of a SMTP request specifies the host name to present during
communication with the mail server. If the path is omitted then libcurl will
@@ -228,7 +232,6 @@ scp://user@example.com/etc/issue - This specifies the file /etc/issue
scp://example.com/~/my-file - This specifies the file my-file in the
user's home directory on the server
-
.IP SFTP
The path part of a SFTP request specifies the file to retrieve and from what
directory. If the file part is omitted then libcurl downloads the directory
@@ -261,6 +264,7 @@ in the root of the "files" share
smb://server.example.com/files/ -T issue - This specifies the file "issue" will
be uploaded to the root of the "files" share.
+curl supports SMB version 1 (only)
.IP LDAP
The path part of a LDAP request can be used to specify the: Distinguished
Name, Attributes, Scope, Filter and Extension for a LDAP search. Each field
@@ -336,7 +340,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
}
diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3
index edaa01bec..06bf2a22b 100644
--- a/docs/libcurl/opts/CURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
@@ -29,7 +29,7 @@ CURLOPT_USERAGENT \- set HTTP user-agent header
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, char *ua);
.SH DESCRIPTION
-Pass a pointer to a zero terminated string as parameter. It will be used to
+Pass a pointer to a null-terminated string as parameter. It will be used to
set the User-Agent: header in the HTTP request sent to the remote server. This
can be used to fool servers or scripts. You can also set any custom header
with \fICURLOPT_HTTPHEADER(3)\fP.
@@ -44,7 +44,7 @@ HTTP, HTTPS
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Dark Secret Ninja/1.0");
diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3
index 532573106..89497e765 100644
--- a/docs/libcurl/opts/CURLOPT_USERNAME.3
+++ b/docs/libcurl/opts/CURLOPT_USERNAME.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERNAME 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
@@ -31,7 +31,7 @@ CURLOPT_USERNAME \- user name to use in authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERNAME,
char *username);
.SH DESCRIPTION
-Pass a char * as parameter, which should be pointing to the zero terminated
+Pass a char * as parameter, which should be pointing to the null-terminated
user name to use for the transfer.
\fICURLOPT_USERNAME(3)\fP sets the user name to be used in protocol
@@ -67,7 +67,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_USERNAME, "clark");
diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3
index 2b3b92d5c..2706bbf6d 100644
--- a/docs/libcurl/opts/CURLOPT_USERPWD.3
+++ b/docs/libcurl/opts/CURLOPT_USERPWD.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERPWD 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
@@ -29,7 +29,7 @@ CURLOPT_USERPWD \- user name and password to use in authentication
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERPWD, char *userpwd);
.SH DESCRIPTION
-Pass a char * as parameter, pointing to a zero terminated login details string
+Pass a char * as parameter, pointing to a null-terminated login details string
for the connection. The format of which is: [user name]:[password].
When using Kerberos V5 authentication with a Windows based server, you should
@@ -73,7 +73,7 @@ Most
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/foo.bin");
curl_easy_setopt(curl, CURLOPT_USERPWD, "clark:kent");
diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.3 b/docs/libcurl/opts/CURLOPT_USE_SSL.3
index c72812b5c..8382a37f2 100644
--- a/docs/libcurl/opts/CURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/CURLOPT_USE_SSL.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USE_SSL 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
diff --git a/docs/libcurl/opts/CURLOPT_VERBOSE.3 b/docs/libcurl/opts/CURLOPT_VERBOSE.3
index 8063eb2cb..8b307c178 100644
--- a/docs/libcurl/opts/CURLOPT_VERBOSE.3
+++ b/docs/libcurl/opts/CURLOPT_VERBOSE.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_VERBOSE 3 "September 16, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
@@ -47,7 +47,7 @@ All
.nf
CURL *curl = curl_easy_init();
if(curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
+ curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* ask libcurl to show us the verbose output */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
@@ -62,3 +62,4 @@ Always
Returns CURLE_OK
.SH "SEE ALSO"
.BR CURLOPT_STDERR "(3), " CURLOPT_DEBUGFUNCTION "(3), "
+.BR CURLOPT_ERRORBUFFER "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3 b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
index 280d6eaec..b90fca6a8 100644
--- a/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
+++ b/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
diff --git a/docs/libcurl/opts/CURLOPT_WRITEDATA.3 b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
index 4a3491ab1..f6b6764db 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
diff --git a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3 b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
index e9ca2e496..3156c8f7b 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "August 24, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
@@ -53,7 +53,7 @@ means 100K.
This function may be called with zero bytes data if the transferred file is
empty.
-The data passed to this function will not be zero terminated!
+The data passed to this function will not be null-terminated!
Set the \fIuserdata\fP argument with the \fICURLOPT_WRITEDATA(3)\fP option.
@@ -77,8 +77,37 @@ Support for the CURL_WRITEFUNC_PAUSE return code was added in version 7.18.0.
.SH RETURN VALUE
This will return CURLE_OK.
.SH EXAMPLE
-A common technique is to use this callback to store the incoming data into a
-dynamically growing allocated buffer. Like in the getinmemory example:
-https://curl.haxx.se/libcurl/c/getinmemory.html
+.nf
+ struct memory {
+ char *response;
+ size_t size;
+ };
+
+ static size_t cb(void *data, size_t size, size_t nmemb, void *userp)
+ {
+ size_t realsize = size * nmemb;
+ struct memory *mem = (struct memory *)userp;
+
+ char *ptr = realloc(mem->response, mem->size + realsize + 1);
+ if(ptr == NULL)
+ return 0; /* out of memory! */
+
+ mem->response = ptr;
+ memcpy(&(mem->response[mem->size]), data, realsize);
+ mem->size += realsize;
+ mem->response[mem->size] = 0;
+
+ return realsize;
+ }
+
+ struct memory chunk;
+
+ /* send all data to this function */
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, cb);
+
+ /* we pass our 'chunk' struct to the callback function */
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
+.fi
.SH "SEE ALSO"
.BR CURLOPT_WRITEDATA "(3), " CURLOPT_READFUNCTION "(3), "
+.BR CURLOPT_HEADERFUNCTION "(3), "
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
index c7dfbe24e..16789321c 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
index b0ec54fb9..0deb566de 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "March 23, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
@@ -58,8 +58,11 @@ Unknown/unused argument values passed to the callback will be set to zero
the callback will be called one or more times first, before it knows the data
sizes so a program must be made to handle that.
-Returning a non-zero value from this callback will cause libcurl to abort the
-transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
+If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
+libcurl to continue executing the default progress function.
+
+Returning any other non-zero value from this callback will cause libcurl to
+abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
If you transfer data with the multi interface, this function will not be
called during periods of idleness unless you call the appropriate libcurl
diff --git a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3 b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
index 09e5315dc..bbdfb9f00 100644
--- a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XOAUTH2_BEARER 3 "June 25, 2020" "libcurl 7.73.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
@@ -29,7 +29,7 @@ CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token);
.SH DESCRIPTION
-Pass a char * as parameter, which should point to the zero terminated OAuth
+Pass a char * as parameter, which should point to the null-terminated OAuth
2.0 Bearer Access Token for use with HTTP, IMAP, POP3 and SMTP servers
that support the OAuth 2.0 Authorization Framework.
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
index 93c4357d2..fe4177579 100644
--- a/docs/libcurl/opts/Makefile.inc
+++ b/docs/libcurl/opts/Makefile.inc
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Shared between Makefile.am and CMakeLists.txt
man_MANS = \
@@ -14,6 +35,7 @@ man_MANS = \
CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 \
CURLINFO_CONTENT_TYPE.3 \
CURLINFO_COOKIELIST.3 \
+ CURLINFO_EFFECTIVE_METHOD.3 \
CURLINFO_EFFECTIVE_URL.3 \
CURLINFO_FILETIME.3 \
CURLINFO_FILETIME_T.3 \
@@ -35,8 +57,9 @@ man_MANS = \
CURLINFO_PRIMARY_PORT.3 \
CURLINFO_PRIVATE.3 \
CURLINFO_PROTOCOL.3 \
- CURLINFO_PROXYAUTH_AVAIL.3 \
+ CURLINFO_PROXY_ERROR.3 \
CURLINFO_PROXY_SSL_VERIFYRESULT.3 \
+ CURLINFO_PROXYAUTH_AVAIL.3 \
CURLINFO_REDIRECT_COUNT.3 \
CURLINFO_REDIRECT_TIME.3 \
CURLINFO_REDIRECT_TIME_T.3 \
@@ -177,6 +200,7 @@ man_MANS = \
CURLOPT_IOCTLFUNCTION.3 \
CURLOPT_IPRESOLVE.3 \
CURLOPT_ISSUERCERT.3 \
+ CURLOPT_ISSUERCERT_BLOB.3 \
CURLOPT_KEEP_SENDING_ON_ERROR.3 \
CURLOPT_KEYPASSWD.3 \
CURLOPT_KRBLEVEL.3 \
@@ -188,6 +212,7 @@ man_MANS = \
CURLOPT_MAIL_AUTH.3 \
CURLOPT_MAIL_FROM.3 \
CURLOPT_MAIL_RCPT.3 \
+ CURLOPT_MAIL_RCPT_ALLLOWFAILS.3 \
CURLOPT_MAXAGE_CONN.3 \
CURLOPT_MAXCONNECTS.3 \
CURLOPT_MAXFILESIZE.3 \
@@ -235,11 +260,15 @@ man_MANS = \
CURLOPT_PROXY_CAPATH.3 \
CURLOPT_PROXY_CRLFILE.3 \
CURLOPT_PROXY_KEYPASSWD.3 \
+ CURLOPT_PROXY_ISSUERCERT.3 \
+ CURLOPT_PROXY_ISSUERCERT_BLOB.3 \
CURLOPT_PROXY_PINNEDPUBLICKEY.3 \
CURLOPT_PROXY_SERVICE_NAME.3 \
CURLOPT_PROXY_SSLCERT.3 \
+ CURLOPT_PROXY_SSLCERT_BLOB.3 \
CURLOPT_PROXY_SSLCERTTYPE.3 \
CURLOPT_PROXY_SSLKEY.3 \
+ CURLOPT_PROXY_SSLKEY_BLOB.3 \
CURLOPT_PROXY_SSLKEYTYPE.3 \
CURLOPT_PROXY_SSLVERSION.3 \
CURLOPT_PROXY_SSL_CIPHER_LIST.3 \
@@ -291,15 +320,18 @@ man_MANS = \
CURLOPT_SSH_PRIVATE_KEYFILE.3 \
CURLOPT_SSH_PUBLIC_KEYFILE.3 \
CURLOPT_SSLCERT.3 \
+ CURLOPT_SSLCERT_BLOB.3 \
CURLOPT_SSLCERTTYPE.3 \
CURLOPT_SSLENGINE.3 \
CURLOPT_SSLENGINE_DEFAULT.3 \
CURLOPT_SSLKEY.3 \
+ CURLOPT_SSLKEY_BLOB.3 \
CURLOPT_SSLKEYTYPE.3 \
CURLOPT_SSLVERSION.3 \
CURLOPT_SSL_CIPHER_LIST.3 \
CURLOPT_SSL_CTX_DATA.3 \
CURLOPT_SSL_CTX_FUNCTION.3 \
+ CURLOPT_SSL_EC_CURVES.3 \
CURLOPT_SSL_ENABLE_ALPN.3 \
CURLOPT_SSL_ENABLE_NPN.3 \
CURLOPT_SSL_FALSESTART.3 \
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index bf23b4488..74b955093 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -38,7 +38,7 @@ CURLCLOSEPOLICY_OLDEST 7.7
CURLCLOSEPOLICY_SLOWEST 7.7
CURLE_ABORTED_BY_CALLBACK 7.1
CURLE_AGAIN 7.18.2
-CURLE_ALREADY_COMPLETE 7.7.2
+CURLE_ALREADY_COMPLETE 7.7.2 7.8
CURLE_AUTH_ERROR 7.66.0
CURLE_BAD_CALLING_ORDER 7.1 7.17.0
CURLE_BAD_CONTENT_ENCODING 7.10
@@ -56,7 +56,7 @@ CURLE_FILESIZE_EXCEEDED 7.10.8
CURLE_FILE_COULDNT_READ_FILE 7.1
CURLE_FTP_ACCEPT_FAILED 7.24.0
CURLE_FTP_ACCEPT_TIMEOUT 7.24.0
-CURLE_FTP_ACCESS_DENIED 7.1
+CURLE_FTP_ACCESS_DENIED 7.1 7.17.0
CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1
CURLE_FTP_BAD_FILE_LIST 7.21.0
CURLE_FTP_CANT_GET_HOST 7.1
@@ -66,7 +66,7 @@ CURLE_FTP_COULDNT_RETR_FILE 7.1
CURLE_FTP_COULDNT_SET_ASCII 7.1 7.17.0
CURLE_FTP_COULDNT_SET_BINARY 7.1 7.17.0
CURLE_FTP_COULDNT_SET_TYPE 7.17.0
-CURLE_FTP_COULDNT_STOR_FILE 7.1
+CURLE_FTP_COULDNT_STOR_FILE 7.1 7.16.3
CURLE_FTP_COULDNT_USE_REST 7.1
CURLE_FTP_PARTIAL_FILE 7.1 7.1
CURLE_FTP_PORT_FAILED 7.1
@@ -77,14 +77,15 @@ CURLE_FTP_USER_PASSWORD_INCORRECT 7.1 7.17.0
CURLE_FTP_WEIRD_227_FORMAT 7.1
CURLE_FTP_WEIRD_PASS_REPLY 7.1
CURLE_FTP_WEIRD_PASV_REPLY 7.1
-CURLE_FTP_WEIRD_SERVER_REPLY 7.1
+CURLE_FTP_WEIRD_SERVER_REPLY 7.1 7.51.0
CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0
CURLE_FTP_WRITE_ERROR 7.1 7.17.0
CURLE_FUNCTION_NOT_FOUND 7.1
CURLE_GOT_NOTHING 7.9.1
CURLE_HTTP2 7.38.0
CURLE_HTTP2_STREAM 7.49.0
-CURLE_HTTP_NOT_FOUND 7.1
+CURLE_HTTP3 7.68.0
+CURLE_HTTP_NOT_FOUND 7.1 7.10.3
CURLE_HTTP_PORT_FAILED 7.3 7.12.0
CURLE_HTTP_POST_ERROR 7.1
CURLE_HTTP_RANGE_ERROR 7.1 7.17.0
@@ -104,6 +105,8 @@ CURLE_OPERATION_TIMEOUTED 7.1 7.17.0
CURLE_OUT_OF_MEMORY 7.1
CURLE_PARTIAL_FILE 7.1
CURLE_PEER_FAILED_VERIFICATION 7.17.1
+CURLE_PROXY 7.73.0
+CURLE_QUIC_CONNECT_ERROR 7.69.0
CURLE_QUOTE_ERROR 7.17.0
CURLE_RANGE_ERROR 7.17.0
CURLE_READ_ERROR 7.1
@@ -143,7 +146,7 @@ CURLE_TFTP_PERM 7.15.0
CURLE_TFTP_UNKNOWNID 7.15.0
CURLE_TOO_MANY_REDIRECTS 7.5
CURLE_UNKNOWN_OPTION 7.21.5
-CURLE_UNKNOWN_TELNET_OPTION 7.7
+CURLE_UNKNOWN_TELNET_OPTION 7.7 7.21.5
CURLE_UNSUPPORTED_PROTOCOL 7.1
CURLE_UPLOAD_FAILED 7.16.3
CURLE_URL_MALFORMAT 7.1
@@ -227,6 +230,7 @@ CURLINFO_COOKIELIST 7.14.1
CURLINFO_DATA_IN 7.9.6
CURLINFO_DATA_OUT 7.9.6
CURLINFO_DOUBLE 7.4.1
+CURLINFO_EFFECTIVE_METHOD 7.72.0
CURLINFO_EFFECTIVE_URL 7.4
CURLINFO_END 7.9.6
CURLINFO_FILETIME 7.5
@@ -258,6 +262,7 @@ CURLINFO_PRIMARY_PORT 7.21.0
CURLINFO_PRIVATE 7.10.3
CURLINFO_PROTOCOL 7.52.0
CURLINFO_PROXYAUTH_AVAIL 7.10.8
+CURLINFO_PROXY_ERROR 7.73.0
CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0
CURLINFO_PTR 7.54.1
CURLINFO_REDIRECT_COUNT 7.9.7
@@ -306,6 +311,7 @@ CURLKHMATCH_OK 7.19.6
CURLKHSTAT_DEFER 7.19.6
CURLKHSTAT_FINE 7.19.6
CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6
+CURLKHSTAT_FINE_REPLACE 7.73.0
CURLKHSTAT_REJECT 7.19.6
CURLKHTYPE_DSS 7.19.6
CURLKHTYPE_ECDSA 7.58.0
@@ -316,10 +322,10 @@ CURLKHTYPE_UNKNOWN 7.19.6
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 7.30.0
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 7.30.0
CURLMOPT_MAXCONNECTS 7.16.3
+CURLMOPT_MAX_CONCURRENT_STREAMS 7.67.0
CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0
CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0
CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0
-CURLMOPT_MAX_CONCURRENT_STREAMS 7.67.0
CURLMOPT_PIPELINING 7.16.0
CURLMOPT_PIPELINING_SERVER_BL 7.30.0
CURLMOPT_PIPELINING_SITE_BL 7.30.0
@@ -333,6 +339,7 @@ CURLMSG_DONE 7.9.6
CURLMSG_NONE 7.9.6
CURLM_ADDED_ALREADY 7.32.1
CURLM_BAD_EASY_HANDLE 7.9.6
+CURLM_BAD_FUNCTION_ARGUMENT 7.69.0
CURLM_BAD_HANDLE 7.9.6
CURLM_BAD_SOCKET 7.15.4
CURLM_CALL_MULTI_PERFORM 7.9.6
@@ -342,12 +349,17 @@ CURLM_OK 7.9.6
CURLM_OUT_OF_MEMORY 7.9.6
CURLM_RECURSIVE_API_CALL 7.59.0
CURLM_UNKNOWN_OPTION 7.15.4
+CURLM_WAKEUP_FAILURE 7.68.0
+CURLOPT 7.69.0
+CURLOPTTYPE_BLOB 7.71.0
+CURLOPTTYPE_CBPOINT 7.73.0
CURLOPTTYPE_FUNCTIONPOINT 7.1
CURLOPTTYPE_LONG 7.1
CURLOPTTYPE_OBJECTPOINT 7.1
CURLOPTTYPE_OFF_T 7.11.0
-CURLOPTTYPE_STRINGPOINT 7.46.0
CURLOPTTYPE_SLISTPOINT 7.65.2
+CURLOPTTYPE_STRINGPOINT 7.46.0
+CURLOPTTYPE_VALUES 7.73.0
CURLOPT_ABSTRACT_UNIX_SOCKET 7.53.0
CURLOPT_ACCEPTTIMEOUT_MS 7.24.0
CURLOPT_ACCEPT_ENCODING 7.21.6
@@ -454,6 +466,7 @@ CURLOPT_IOCTLDATA 7.12.3
CURLOPT_IOCTLFUNCTION 7.12.3
CURLOPT_IPRESOLVE 7.10.8
CURLOPT_ISSUERCERT 7.19.0
+CURLOPT_ISSUERCERT_BLOB 7.71.0
CURLOPT_KEEP_SENDING_ON_ERROR 7.51.0
CURLOPT_KEYPASSWD 7.17.0
CURLOPT_KRB4LEVEL 7.3 7.17.0
@@ -466,6 +479,7 @@ CURLOPT_LOW_SPEED_TIME 7.1
CURLOPT_MAIL_AUTH 7.25.0
CURLOPT_MAIL_FROM 7.20.0
CURLOPT_MAIL_RCPT 7.20.0
+CURLOPT_MAIL_RCPT_ALLLOWFAILS 7.69.0
CURLOPT_MAXAGE_CONN 7.65.0
CURLOPT_MAXCONNECTS 7.7
CURLOPT_MAXFILESIZE 7.10.8
@@ -518,13 +532,17 @@ CURLOPT_PROXYUSERPWD 7.1
CURLOPT_PROXY_CAINFO 7.52.0
CURLOPT_PROXY_CAPATH 7.52.0
CURLOPT_PROXY_CRLFILE 7.52.0
+CURLOPT_PROXY_ISSUERCERT 7.71.0
+CURLOPT_PROXY_ISSUERCERT_BLOB 7.71.0
CURLOPT_PROXY_KEYPASSWD 7.52.0
CURLOPT_PROXY_PINNEDPUBLICKEY 7.52.0
CURLOPT_PROXY_SERVICE_NAME 7.43.0
CURLOPT_PROXY_SSLCERT 7.52.0
CURLOPT_PROXY_SSLCERTTYPE 7.52.0
+CURLOPT_PROXY_SSLCERT_BLOB 7.71.0
CURLOPT_PROXY_SSLKEY 7.52.0
CURLOPT_PROXY_SSLKEYTYPE 7.52.0
+CURLOPT_PROXY_SSLKEY_BLOB 7.71.0
CURLOPT_PROXY_SSLVERSION 7.52.0
CURLOPT_PROXY_SSL_CIPHER_LIST 7.52.0
CURLOPT_PROXY_SSL_OPTIONS 7.52.0
@@ -587,15 +605,18 @@ CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1
CURLOPT_SSLCERT 7.1
CURLOPT_SSLCERTPASSWD 7.1.1 7.17.0
CURLOPT_SSLCERTTYPE 7.9.3
+CURLOPT_SSLCERT_BLOB 7.71.0
CURLOPT_SSLENGINE 7.9.3
CURLOPT_SSLENGINE_DEFAULT 7.9.3
CURLOPT_SSLKEY 7.9.3
CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0
CURLOPT_SSLKEYTYPE 7.9.3
+CURLOPT_SSLKEY_BLOB 7.71.0
CURLOPT_SSLVERSION 7.1
CURLOPT_SSL_CIPHER_LIST 7.9
CURLOPT_SSL_CTX_DATA 7.10.6
CURLOPT_SSL_CTX_FUNCTION 7.10.6
+CURLOPT_SSL_EC_CURVES 7.73.0
CURLOPT_SSL_ENABLE_ALPN 7.36.0
CURLOPT_SSL_ENABLE_NPN 7.36.0
CURLOPT_SSL_FALSESTART 7.42.0
@@ -649,6 +670,15 @@ CURLOPT_WRITEINFO 7.1
CURLOPT_XFERINFODATA 7.32.0
CURLOPT_XFERINFOFUNCTION 7.32.0
CURLOPT_XOAUTH2_BEARER 7.33.0
+CURLOT_BLOB 7.73.0
+CURLOT_CBPTR 7.73.0
+CURLOT_FUNCTION 7.73.0
+CURLOT_LONG 7.73.0
+CURLOT_OBJECT 7.73.0
+CURLOT_OFF_T 7.73.0
+CURLOT_SLIST 7.73.0
+CURLOT_STRING 7.73.0
+CURLOT_VALUES 7.73.0
CURLPAUSE_ALL 7.18.0
CURLPAUSE_CONT 7.18.0
CURLPAUSE_RECV 7.18.0
@@ -670,6 +700,7 @@ CURLPROTO_IMAP 7.20.0
CURLPROTO_IMAPS 7.20.0
CURLPROTO_LDAP 7.19.4
CURLPROTO_LDAPS 7.19.4
+CURLPROTO_MQTT 7.71.0
CURLPROTO_POP3 7.20.0
CURLPROTO_POP3S 7.20.0
CURLPROTO_RTMP 7.21.0
@@ -694,6 +725,40 @@ CURLPROXY_SOCKS4 7.10
CURLPROXY_SOCKS4A 7.18.0
CURLPROXY_SOCKS5 7.10
CURLPROXY_SOCKS5_HOSTNAME 7.18.0
+CURLPX_BAD_ADDRESS_TYPE 7.73.0
+CURLPX_BAD_VERSION 7.73.0
+CURLPX_CLOSED 7.73.0
+CURLPX_GSSAPI 7.73.0
+CURLPX_GSSAPI_PERMSG 7.73.0
+CURLPX_GSSAPI_PROTECTION 7.73.0
+CURLPX_IDENTD 7.73.0
+CURLPX_IDENTD_DIFFER 7.73.0
+CURLPX_LONG_HOSTNAME 7.73.0
+CURLPX_LONG_PASSWD 7.73.0
+CURLPX_LONG_USER 7.73.0
+CURLPX_NO_AUTH 7.73.0
+CURLPX_OK 7.73.0
+CURLPX_RECV_ADDRESS 7.73.0
+CURLPX_RECV_AUTH 7.73.0
+CURLPX_RECV_CONNECT 7.73.0
+CURLPX_RECV_REQACK 7.73.0
+CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED 7.73.0
+CURLPX_REPLY_COMMAND_NOT_SUPPORTED 7.73.0
+CURLPX_REPLY_CONNECTION_REFUSED 7.73.0
+CURLPX_REPLY_GENERAL_SERVER_FAILURE 7.73.0
+CURLPX_REPLY_HOST_UNREACHABLE 7.73.0
+CURLPX_REPLY_NETWORK_UNREACHABLE 7.73.0
+CURLPX_REPLY_NOT_ALLOWED 7.73.0
+CURLPX_REPLY_TTL_EXPIRED 7.73.0
+CURLPX_REPLY_UNASSIGNED 7.73.0
+CURLPX_REQUEST_FAILED 7.73.0
+CURLPX_RESOLVE_HOST 7.73.0
+CURLPX_SEND_AUTH 7.73.0
+CURLPX_SEND_CONNECT 7.73.0
+CURLPX_SEND_REQUEST 7.73.0
+CURLPX_UNKNOWN_FAIL 7.73.0
+CURLPX_UNKNOWN_MODE 7.73.0
+CURLPX_USER_REJECTED 7.73.0
CURLSHE_BAD_OPTION 7.10.3
CURLSHE_INVALID 7.10.3
CURLSHE_IN_USE 7.10.3
@@ -718,6 +783,7 @@ CURLSSH_AUTH_NONE 7.16.1
CURLSSH_AUTH_PASSWORD 7.16.1
CURLSSH_AUTH_PUBLICKEY 7.16.1
CURLSSLBACKEND_AXTLS 7.38.0 7.61.0
+CURLSSLBACKEND_BEARSSL 7.68.0
CURLSSLBACKEND_BORINGSSL 7.49.0
CURLSSLBACKEND_CYASSL 7.34.0
CURLSSLBACKEND_DARWINSSL 7.34.0 7.64.1
@@ -729,13 +795,16 @@ CURLSSLBACKEND_MESALINK 7.62.0
CURLSSLBACKEND_NONE 7.34.0
CURLSSLBACKEND_NSS 7.34.0
CURLSSLBACKEND_OPENSSL 7.34.0
-CURLSSLBACKEND_POLARSSL 7.34.0
+CURLSSLBACKEND_POLARSSL 7.34.0 7.69.0
CURLSSLBACKEND_QSOSSL 7.34.0 - 7.38.1
CURLSSLBACKEND_SCHANNEL 7.34.0
CURLSSLBACKEND_SECURETRANSPORT 7.64.1
CURLSSLBACKEND_WOLFSSL 7.49.0
CURLSSLOPT_ALLOW_BEAST 7.25.0
+CURLSSLOPT_NATIVE_CA 7.71.0
+CURLSSLOPT_NO_PARTIALCHAIN 7.68.0
CURLSSLOPT_NO_REVOKE 7.44.0
+CURLSSLOPT_REVOKE_BEST_EFFORT 7.70.0
CURLSSLSET_NO_BACKENDS 7.56.0
CURLSSLSET_OK 7.56.0
CURLSSLSET_TOO_LATE 7.56.0
@@ -779,18 +848,20 @@ CURLU_DEFAULT_SCHEME 7.62.0
CURLU_DISALLOW_USER 7.62.0
CURLU_GUESS_SCHEME 7.62.0
CURLU_NON_SUPPORT_SCHEME 7.62.0
-CURLU_NO_DEFAULT_PORT 7.62.0
CURLU_NO_AUTHORITY 7.67.0
+CURLU_NO_DEFAULT_PORT 7.62.0
CURLU_PATH_AS_IS 7.62.0
CURLU_URLDECODE 7.62.0
CURLU_URLENCODE 7.62.0
+CURLVERSION_EIGHTH 7.72.0
CURLVERSION_FIFTH 7.57.0
CURLVERSION_FIRST 7.10
CURLVERSION_FOURTH 7.16.1
CURLVERSION_NOW 7.10
CURLVERSION_SECOND 7.11.1
-CURLVERSION_THIRD 7.12.0
+CURLVERSION_SEVENTH 7.70.0
CURLVERSION_SIXTH 7.66.0
+CURLVERSION_THIRD 7.12.0
CURL_CHUNK_BGN_FUNC_FAIL 7.21.0
CURL_CHUNK_BGN_FUNC_OK 7.21.0
CURL_CHUNK_BGN_FUNC_SKIP 7.21.0
@@ -866,9 +937,11 @@ CURL_POLL_INOUT 7.14.0
CURL_POLL_NONE 7.14.0
CURL_POLL_OUT 7.14.0
CURL_POLL_REMOVE 7.14.0
+CURL_PROGRESSFUNC_CONTINUE 7.68.0
CURL_PROGRESS_BAR 7.1.1 - 7.4.1
CURL_PROGRESS_STATS 7.1.1 - 7.4.1
CURL_PUSH_DENY 7.44.0
+CURL_PUSH_ERROROUT 7.72.0
CURL_PUSH_OK 7.44.0
CURL_READFUNC_ABORT 7.12.1
CURL_READFUNC_PAUSE 7.18.0
@@ -927,7 +1000,6 @@ CURL_VERSION_BROTLI 7.57.0
CURL_VERSION_CONV 7.15.4
CURL_VERSION_CURLDEBUG 7.19.6
CURL_VERSION_DEBUG 7.10.6
-CURL_VERSION_ESNI 7.67.0
CURL_VERSION_GSSAPI 7.38.0
CURL_VERSION_GSSNEGOTIATE 7.10.6 7.38.0
CURL_VERSION_HTTP2 7.33.0
@@ -947,9 +1019,12 @@ CURL_VERSION_SPNEGO 7.10.8
CURL_VERSION_SSL 7.10
CURL_VERSION_SSPI 7.13.2
CURL_VERSION_TLSAUTH_SRP 7.21.4
+CURL_VERSION_UNICODE 7.72.0
CURL_VERSION_UNIX_SOCKETS 7.40.0
+CURL_VERSION_ZSTD 7.72.0
CURL_WAIT_POLLIN 7.28.0
CURL_WAIT_POLLOUT 7.28.0
CURL_WAIT_POLLPRI 7.28.0
+CURL_WIN32 7.69.0
CURL_WRITEFUNC_PAUSE 7.18.0
CURL_ZERO_TERMINATED 7.56.0
diff --git a/docs/libcurl/symbols.pl b/docs/libcurl/symbols.pl
index d61bd048f..ed614ca12 100755
--- a/docs/libcurl/symbols.pl
+++ b/docs/libcurl/symbols.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2011 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/docs/mk-ca-bundle.1 b/docs/mk-ca-bundle.1
index f754e74c7..2f3d933d3 100644
--- a/docs/mk-ca-bundle.1
+++ b/docs/mk-ca-bundle.1
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 2008 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 2008 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
diff --git a/docs/options-in-versions b/docs/options-in-versions
new file mode 100644
index 000000000..683363239
--- /dev/null
+++ b/docs/options-in-versions
@@ -0,0 +1,246 @@
+ _ _ ____ _
+ ___| | | | _ \| |
+ / __| | | | |_) | |
+ | (__| |_| | _ <| |___
+ \___|\___/|_| \_\_____|
+
+ This document lists all command line options present in curl, together with
+ exact information about the first curl version that supports it. The options
+ are sorted alphabetically on the long name.
+
+ Long (short) Introduced
+
+--abstract-unix-socket 7.53.0
+--alt-svc 7.64.1
+--anyauth 7.10.6
+--append (-a) 4.8
+--basic 7.10.6
+--cacert 7.5
+--capath 7.9.8
+--cert (-E) 5.0
+--cert-status 7.41.0
+--cert-type 7.9.3
+--ciphers 7.9
+--compressed 7.10
+--compressed-ssh 7.56.0
+--config (-K) 4.10
+--connect-timeout 7.7
+--connect-to 7.49.0
+--continue-at (-C) 4.8
+--cookie (-b) 4.9
+--cookie-jar (-c) 7.9
+--create-dirs 7.10.3
+--crlf 5.7
+--crlfile 7.19.7
+--curves 7.73.0
+--data (-d) 4.0
+--data-ascii 7.2
+--data-binary 7.2
+--data-raw 7.43.0
+--data-urlencode 7.18.0
+--delegation 7.22.0
+--digest 7.10.6
+--disable (-q) 5.0
+--disable-eprt 7.10.5
+--disable-epsv 7.9.2
+--disallow-username-in-url 7.61.0
+--dns-interface 7.33.0
+--dns-ipv4-addr 7.33.0
+--dns-ipv6-addr 7.33.0
+--dns-servers 7.33.0
+--doh-url 7.62.0
+--dump-header (-D) 5.7
+--egd-file 7.7
+--engine 7.9.3
+--etag-compare 7.68.0
+--etag-save 7.68.0
+--expect100-timeout 7.47.0
+--fail (-f) 4.0
+--fail-early 7.52.0
+--false-start 7.42.0
+--form (-F) 5.0
+--form-string 7.13.2
+--ftp-account 7.13.0
+--ftp-alternative-to-user 7.15.5
+--ftp-create-dirs 7.10.7
+--ftp-method 7.15.1
+--ftp-pasv 7.11.0
+--ftp-port (-P) 4.0
+--ftp-pret 7.20.0
+--ftp-skip-pasv-ip 7.14.2
+--ftp-ssl-ccc 7.16.1
+--ftp-ssl-ccc-mode 7.16.2
+--ftp-ssl-control 7.16.0
+--get (-G) 7.8.1
+--globoff (-g) 7.6
+--happy-eyeballs-timeout-ms 7.59.0
+--haproxy-protocol 7.60.0
+--head (-I) 4.0
+--header (-H) 5.0
+--help (-h) 4.0
+--hostpubmd5 7.17.1
+--http0.9 7.64.0
+--http1.0 (-0) 7.9.1
+--http1.1 7.33.0
+--http2 7.33.0
+--http2-prior-knowledge 7.49.0
+--http3 7.66.0
+--ignore-content-length 7.14.1
+--include (-i) 4.8
+--insecure (-k) 7.10
+--interface 7.3
+--ipv4 (-4) 7.10.8
+--ipv6 (-6) 7.10.8
+--junk-session-cookies (-j) 7.9.7
+--keepalive-time 7.18.0
+--key 7.9.3
+--key-type 7.9.3
+--krb 7.3
+--libcurl 7.16.1
+--limit-rate 7.10
+--list-only (-l) 4.0
+--local-port 7.15.2
+--location (-L) 4.9
+--location-trusted 7.10.4
+--login-options 7.34.0
+--mail-auth 7.25.0
+--mail-from 7.20.0
+--mail-rcpt 7.20.0
+--mail-rcpt-allowfails 7.69.0
+--manual (-M) 5.2
+--max-filesize 7.10.8
+--max-redirs 7.5
+--max-time (-m) 4.0
+--metalink 7.27.0
+--negotiate 7.10.6
+--netrc (-n) 4.6
+--netrc-file 7.21.5
+--netrc-optional 7.9.8
+--next (-:) 7.36.0
+--no-alpn 7.36.0
+--no-buffer (-N) 6.5
+--no-keepalive 7.18.0
+--no-npn 7.36.0
+--no-progress-meter 7.67.0
+--no-sessionid 7.16.0
+--noproxy 7.19.4
+--ntlm 7.10.6
+--ntlm-wb 7.22.0
+--oauth2-bearer 7.33.0
+--output (-o) 4.0
+--output-dir 7.73.0
+--parallel (-Z) 7.66.0
+--parallel-immediate 7.68.0
+--parallel-max 7.66.0
+--pass 7.9.3
+--path-as-is 7.42.0
+--pinnedpubkey 7.39.0
+--post301 7.17.1
+--post302 7.19.1
+--post303 7.26.0
+--preproxy 7.52.0
+--progress-bar (-#) 5.10
+--proto 7.20.2
+--proto-default 7.45.0
+--proto-redir 7.20.2
+--proxy (-x) 4.0
+--proxy-anyauth 7.13.2
+--proxy-basic 7.12.0
+--proxy-cacert 7.52.0
+--proxy-capath 7.52.0
+--proxy-cert 7.52.0
+--proxy-cert-type 7.52.0
+--proxy-ciphers 7.52.0
+--proxy-crlfile 7.52.0
+--proxy-digest 7.12.0
+--proxy-header 7.37.0
+--proxy-insecure 7.52.0
+--proxy-key 7.52.0
+--proxy-key-type 7.52.0
+--proxy-negotiate 7.17.1
+--proxy-ntlm 7.10.7
+--proxy-pass 7.52.0
+--proxy-pinnedpubkey 7.59.0
+--proxy-service-name 7.43.0
+--proxy-ssl-allow-beast 7.52.0
+--proxy-tls13-ciphers 7.61.0
+--proxy-tlsauthtype 7.52.0
+--proxy-tlspassword 7.52.0
+--proxy-tlsuser 7.52.0
+--proxy-tlsv1 7.52.0
+--proxy-user (-U) 4.0
+--proxy1.0 7.19.4
+--proxytunnel (-p) 7.3
+--pubkey 7.16.2
+--quote (-Q) 5.3
+--random-file 7.7
+--range (-r) 4.0
+--raw 7.16.2
+--referer (-e) 4.0
+--remote-header-name (-J) 7.20.0
+--remote-name (-O) 4.0
+--remote-name-all 7.19.0
+--remote-time (-R) 7.9
+--request (-X) 6.0
+--request-target 7.55.0
+--resolve 7.21.3
+--retry 7.12.3
+--retry-all-errors 7.71.0
+--retry-connrefused 7.52.0
+--retry-delay 7.12.3
+--retry-max-time 7.12.3
+--sasl-authzid 7.66.0
+--sasl-ir 7.31.0
+--service-name 7.43.0
+--show-error (-S) 5.9
+--silent (-s) 4.0
+--socks4 7.15.2
+--socks4a 7.18.0
+--socks5 7.18.0
+--socks5-basic 7.55.0
+--socks5-gssapi 7.55.0
+--socks5-gssapi-nec 7.19.4
+--socks5-gssapi-service 7.19.4
+--socks5-hostname 7.18.0
+--speed-limit (-Y) 4.7
+--speed-time (-y) 4.7
+--ssl 7.20.0
+--ssl-allow-beast 7.25.0
+--ssl-no-revoke 7.44.0
+--ssl-reqd 7.20.0
+--ssl-revoke-best-effort 7.70.0
+--sslv2 (-2) 5.9
+--sslv3 (-3) 5.9
+--stderr 6.2
+--styled-output 7.61.0
+--suppress-connect-headers 7.54.0
+--tcp-fastopen 7.49.0
+--tcp-nodelay 7.11.2
+--telnet-option (-t) 7.7
+--tftp-blksize 7.20.0
+--tftp-no-options 7.48.0
+--time-cond (-z) 5.8
+--tls-max 7.54.0
+--tls13-ciphers 7.61.0
+--tlsauthtype 7.21.4
+--tlspassword 7.21.4
+--tlsuser 7.21.4
+--tlsv1 (-1) 7.9.2
+--tlsv1.0 7.34.0
+--tlsv1.1 7.34.0
+--tlsv1.2 7.34.0
+--tlsv1.3 7.52.0
+--tr-encoding 7.21.6
+--trace 7.9.7
+--trace-ascii 7.9.7
+--trace-time 7.14.0
+--unix-socket 7.40.0
+--upload-file (-T) 4.0
+--url 7.5
+--use-ascii (-B) 5.0
+--user (-u) 4.0
+--user-agent (-A) 4.5.1
+--verbose (-v) 4.0
+--version (-V) 4.0
+--write-out (-w) 6.5
+--xattr 7.21.3
diff --git a/include/Makefile.am b/include/Makefile.am
index 3b2486029..611ebdfaa 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -1,5 +1,26 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
SUBDIRS = curl
-EXTRA_DIST = README
+EXTRA_DIST = README.md
AUTOMAKE_OPTIONS = foreign no-dependencies
diff --git a/include/README b/include/README
deleted file mode 100644
index 091ef76d1..000000000
--- a/include/README
+++ /dev/null
@@ -1,18 +0,0 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-Include files for libcurl, external users.
-
-They're all placed in the curl subdirectory here for better fit in any kind
-of environment. You must include files from here using...
-
- #include <curl/curl.h>
-
-... style and point the compiler's include path to the directory holding the
-curl subdirectory. It makes it more likely to survive future modifications.
-
-The public curl include files can be shared freely between different platforms
-and different architectures.
diff --git a/include/README.md b/include/README.md
new file mode 100644
index 000000000..bd28a30e8
--- /dev/null
+++ b/include/README.md
@@ -0,0 +1,14 @@
+# include
+
+Public include files for libcurl, external users.
+
+They're all placed in the curl subdirectory here for better fit in any kind of
+environment. You must include files from here using...
+
+ #include <curl/curl.h>
+
+... style and point the compiler's include path to the directory holding the
+curl subdirectory. It makes it more likely to survive future modifications.
+
+The public curl include files can be shared freely between different platforms
+and different architectures.
diff --git a/include/curl/Makefile.am b/include/curl/Makefile.am
index a31f61b10..db96ace89 100644
--- a/include/curl/Makefile.am
+++ b/include/curl/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
###########################################################################
pkginclude_HEADERS = \
curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
- typecheck-gcc.h system.h urlapi.h
+ typecheck-gcc.h system.h urlapi.h options.h
pkgincludedir= $(includedir)/curl
diff --git a/include/curl/curl.h b/include/curl/curl.h
index dcbe8995c..9026aa5c1 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -38,12 +38,12 @@
#include "system.h" /* determine things run-time */
/*
- * Define WIN32 when build target is Win32 API
+ * Define CURL_WIN32 when build target is Win32 API
*/
-#if (defined(_WIN32) || defined(__WIN32__)) && \
- !defined(WIN32) && !defined(__SYMBIAN32__)
-#define WIN32
+#if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && \
+ !defined(__SYMBIAN32__)
+#define CURL_WIN32
#endif
#include <stdio.h>
@@ -58,7 +58,7 @@
#include <sys/types.h>
#include <time.h>
-#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__)
+#if defined(CURL_WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__)
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \
defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H))
/* The check above prevents the winsock2 inclusion if winsock.h already was
@@ -79,11 +79,11 @@
#include <sys/select.h>
#endif
-#if !defined(WIN32) && !defined(_WIN32_WCE)
+#if !defined(CURL_WIN32) && !defined(_WIN32_WCE)
#include <sys/socket.h>
#endif
-#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
+#if !defined(CURL_WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
#include <sys/time.h>
#endif
@@ -114,7 +114,7 @@ typedef void CURLSH;
#ifdef CURL_STATICLIB
# define CURL_EXTERN
-#elif defined(WIN32) || defined(__SYMBIAN32__) || \
+#elif defined(CURL_WIN32) || defined(__SYMBIAN32__) || \
(__has_declspec_attribute(dllexport) && \
__has_declspec_attribute(dllimport))
# if defined(BUILDING_LIBCURL)
@@ -130,7 +130,7 @@ typedef void CURLSH;
#ifndef curl_socket_typedef
/* socket typedef */
-#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H)
+#if defined(CURL_WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H)
typedef SOCKET curl_socket_t;
#define CURL_SOCKET_BAD INVALID_SOCKET
#else
@@ -154,7 +154,8 @@ typedef enum {
CURLSSLBACKEND_SECURETRANSPORT = 9,
CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */
CURLSSLBACKEND_MBEDTLS = 11,
- CURLSSLBACKEND_MESALINK = 12
+ CURLSSLBACKEND_MESALINK = 12,
+ CURLSSLBACKEND_BEARSSL = 13
} curl_sslbackend;
/* aliases for library clones and renames */
@@ -209,6 +210,11 @@ struct curl_httppost {
set. Added in 7.46.0 */
};
+
+/* This is a return code for the progress callback that, when returned, will
+ signal libcurl to continue executing the default progress function */
+#define CURL_PROGRESSFUNC_CONTINUE 0x10000001
+
/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now
considered deprecated but was the only choice up until 7.31.0 */
typedef int (*curl_progress_callback)(void *clientp,
@@ -602,6 +608,9 @@ typedef enum {
inside a callback */
CURLE_AUTH_ERROR, /* 94 - an authentication function returned an
error */
+ CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */
+ CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */
+ CURLE_PROXY, /* 97 - proxy handshake error */
CURL_LAST /* never use! */
} CURLcode;
@@ -681,6 +690,48 @@ typedef enum {
#endif /*!CURL_NO_OLDIES*/
+/*
+ * Proxy error codes. Returned in CURLINFO_PROXY_ERROR if CURLE_PROXY was
+ * return for the transfers.
+ */
+typedef enum {
+ CURLPX_OK,
+ CURLPX_BAD_ADDRESS_TYPE,
+ CURLPX_BAD_VERSION,
+ CURLPX_CLOSED,
+ CURLPX_GSSAPI,
+ CURLPX_GSSAPI_PERMSG,
+ CURLPX_GSSAPI_PROTECTION,
+ CURLPX_IDENTD,
+ CURLPX_IDENTD_DIFFER,
+ CURLPX_LONG_HOSTNAME,
+ CURLPX_LONG_PASSWD,
+ CURLPX_LONG_USER,
+ CURLPX_NO_AUTH,
+ CURLPX_RECV_ADDRESS,
+ CURLPX_RECV_AUTH,
+ CURLPX_RECV_CONNECT,
+ CURLPX_RECV_REQACK,
+ CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED,
+ CURLPX_REPLY_COMMAND_NOT_SUPPORTED,
+ CURLPX_REPLY_CONNECTION_REFUSED,
+ CURLPX_REPLY_GENERAL_SERVER_FAILURE,
+ CURLPX_REPLY_HOST_UNREACHABLE,
+ CURLPX_REPLY_NETWORK_UNREACHABLE,
+ CURLPX_REPLY_NOT_ALLOWED,
+ CURLPX_REPLY_TTL_EXPIRED,
+ CURLPX_REPLY_UNASSIGNED,
+ CURLPX_REQUEST_FAILED,
+ CURLPX_RESOLVE_HOST,
+ CURLPX_SEND_AUTH,
+ CURLPX_SEND_CONNECT,
+ CURLPX_SEND_REQUEST,
+ CURLPX_UNKNOWN_FAIL,
+ CURLPX_UNKNOWN_MODE,
+ CURLPX_USER_REJECTED,
+ CURLPX_LAST /* never use */
+} CURLproxycode;
+
/* This prototype applies to all conversion callbacks */
typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
@@ -766,7 +817,7 @@ enum curl_khtype {
};
struct curl_khkey {
- const char *key; /* points to a zero-terminated string encoded with base64
+ const char *key; /* points to a null-terminated string encoded with base64
if len is zero, otherwise to the "raw" data */
size_t len;
enum curl_khtype keytype;
@@ -781,6 +832,7 @@ enum curl_khstat {
CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so
this causes a CURLE_DEFER error but otherwise the
connection will be left intact etc */
+ CURLKHSTAT_FINE_REPLACE, /* accept and replace the wrong key*/
CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */
};
@@ -821,6 +873,19 @@ typedef enum {
SSL backends where such behavior is present. */
#define CURLSSLOPT_NO_REVOKE (1<<1)
+/* - NO_PARTIALCHAIN tells libcurl to *NOT* accept a partial certificate chain
+ if possible. The OpenSSL backend has this ability. */
+#define CURLSSLOPT_NO_PARTIALCHAIN (1<<2)
+
+/* - REVOKE_BEST_EFFORT tells libcurl to ignore certificate revocation offline
+ checks and ignore missing revocation list for those SSL backends where such
+ behavior is present. */
+#define CURLSSLOPT_REVOKE_BEST_EFFORT (1<<3)
+
+/* - CURLSSLOPT_NATIVE_CA tells libcurl to use standard certificate store of
+ operating system. Currently implemented under MS-Windows. */
+#define CURLSSLOPT_NATIVE_CA (1<<4)
+
/* The default connection attempt delay in milliseconds for happy eyeballs.
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document
this value, keep them in sync. */
@@ -920,6 +985,7 @@ typedef enum {
#define CURLPROTO_GOPHER (1<<25)
#define CURLPROTO_SMB (1<<26)
#define CURLPROTO_SMBS (1<<27)
+#define CURLPROTO_MQTT (1<<28)
#define CURLPROTO_ALL (~0) /* enable everything */
/* long may be 32 or 64 bits, but we should never depend on anything else
@@ -928,79 +994,73 @@ typedef enum {
#define CURLOPTTYPE_OBJECTPOINT 10000
#define CURLOPTTYPE_FUNCTIONPOINT 20000
#define CURLOPTTYPE_OFF_T 30000
+#define CURLOPTTYPE_BLOB 40000
/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the
string options from the header file */
-/* name is uppercase CURLOPT_<name>,
- type is one of the defined CURLOPTTYPE_<type>
- number is unique identifier */
-#ifdef CINIT
-#undef CINIT
-#endif
-#ifdef CURL_ISOCPP
-#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu
-#else
-/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
-#define LONG CURLOPTTYPE_LONG
-#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
-#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
-#define OFF_T CURLOPTTYPE_OFF_T
-#define CINIT(name,type,number) CURLOPT_/**/name = type + number
-#endif
+#define CURLOPT(na,t,nu) na = t + nu
+
+/* CURLOPT aliases that make no run-time difference */
+
+/* 'char *' argument to a string with a trailing zero */
+#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT
-/* handy aliases that make no run-time difference */
-#define CURLOPTTYPE_STRINGPOINT CURLOPTTYPE_OBJECTPOINT
+/* 'struct curl_slist *' argument */
#define CURLOPTTYPE_SLISTPOINT CURLOPTTYPE_OBJECTPOINT
+/* 'void *' argument passed untouched to callback */
+#define CURLOPTTYPE_CBPOINT CURLOPTTYPE_OBJECTPOINT
+
+/* 'long' argument with a set of values/bitmask */
+#define CURLOPTTYPE_VALUES CURLOPTTYPE_LONG
+
/*
- * This macro-mania below setups the CURLOPT_[what] enum, to be used with
- * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
- * word.
+ * All CURLOPT_* values.
*/
typedef enum {
/* This is the FILE * or void * the regular output should be written to. */
- CINIT(WRITEDATA, OBJECTPOINT, 1),
+ CURLOPT(CURLOPT_WRITEDATA, CURLOPTTYPE_CBPOINT, 1),
/* The full URL to get/put */
- CINIT(URL, STRINGPOINT, 2),
+ CURLOPT(CURLOPT_URL, CURLOPTTYPE_STRINGPOINT, 2),
/* Port number to connect to, if other than default. */
- CINIT(PORT, LONG, 3),
+ CURLOPT(CURLOPT_PORT, CURLOPTTYPE_LONG, 3),
/* Name of proxy to use. */
- CINIT(PROXY, STRINGPOINT, 4),
+ CURLOPT(CURLOPT_PROXY, CURLOPTTYPE_STRINGPOINT, 4),
/* "user:password;options" to use when fetching. */
- CINIT(USERPWD, STRINGPOINT, 5),
+ CURLOPT(CURLOPT_USERPWD, CURLOPTTYPE_STRINGPOINT, 5),
/* "user:password" to use with proxy. */
- CINIT(PROXYUSERPWD, STRINGPOINT, 6),
+ CURLOPT(CURLOPT_PROXYUSERPWD, CURLOPTTYPE_STRINGPOINT, 6),
/* Range to get, specified as an ASCII string. */
- CINIT(RANGE, STRINGPOINT, 7),
+ CURLOPT(CURLOPT_RANGE, CURLOPTTYPE_STRINGPOINT, 7),
/* not used */
/* Specified file stream to upload from (use as input): */
- CINIT(READDATA, OBJECTPOINT, 9),
+ CURLOPT(CURLOPT_READDATA, CURLOPTTYPE_CBPOINT, 9),
/* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE
* bytes big. */
- CINIT(ERRORBUFFER, OBJECTPOINT, 10),
+ CURLOPT(CURLOPT_ERRORBUFFER, CURLOPTTYPE_OBJECTPOINT, 10),
/* Function that will be called to store the output (instead of fwrite). The
* parameters will use fwrite() syntax, make sure to follow them. */
- CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),
+ CURLOPT(CURLOPT_WRITEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 11),
/* Function that will be called to read the input (instead of fread). The
* parameters will use fread() syntax, make sure to follow them. */
- CINIT(READFUNCTION, FUNCTIONPOINT, 12),
+ CURLOPT(CURLOPT_READFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 12),
/* Time-out the read operation after this amount of seconds */
- CINIT(TIMEOUT, LONG, 13),
+ CURLOPT(CURLOPT_TIMEOUT, CURLOPTTYPE_LONG, 13),
/* If the CURLOPT_INFILE is used, this can be used to inform libcurl about
* how large the file being sent really is. That allows better error
@@ -1011,20 +1071,20 @@ typedef enum {
* which takes an off_t type, allowing platforms with larger off_t
* sizes to handle larger files. See below for INFILESIZE_LARGE.
*/
- CINIT(INFILESIZE, LONG, 14),
+ CURLOPT(CURLOPT_INFILESIZE, CURLOPTTYPE_LONG, 14),
/* POST static input fields. */
- CINIT(POSTFIELDS, OBJECTPOINT, 15),
+ CURLOPT(CURLOPT_POSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 15),
/* Set the referrer page (needed by some CGIs) */
- CINIT(REFERER, STRINGPOINT, 16),
+ CURLOPT(CURLOPT_REFERER, CURLOPTTYPE_STRINGPOINT, 16),
/* Set the FTP PORT string (interface name, named or numerical IP address)
Use i.e '-' to use default address. */
- CINIT(FTPPORT, STRINGPOINT, 17),
+ CURLOPT(CURLOPT_FTPPORT, CURLOPTTYPE_STRINGPOINT, 17),
/* Set the User-Agent string (examined by some CGIs) */
- CINIT(USERAGENT, STRINGPOINT, 18),
+ CURLOPT(CURLOPT_USERAGENT, CURLOPTTYPE_STRINGPOINT, 18),
/* If the download receives less than "low speed limit" bytes/second
* during "low speed time" seconds, the operations is aborted.
@@ -1033,10 +1093,10 @@ typedef enum {
*/
/* Set the "low speed limit" */
- CINIT(LOW_SPEED_LIMIT, LONG, 19),
+ CURLOPT(CURLOPT_LOW_SPEED_LIMIT, CURLOPTTYPE_LONG, 19),
/* Set the "low speed time" */
- CINIT(LOW_SPEED_TIME, LONG, 20),
+ CURLOPT(CURLOPT_LOW_SPEED_TIME, CURLOPTTYPE_LONG, 20),
/* Set the continuation offset.
*
@@ -1044,48 +1104,48 @@ typedef enum {
* off_t types, allowing for large file offsets on platforms which
* use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE.
*/
- CINIT(RESUME_FROM, LONG, 21),
+ CURLOPT(CURLOPT_RESUME_FROM, CURLOPTTYPE_LONG, 21),
/* Set cookie in request: */
- CINIT(COOKIE, STRINGPOINT, 22),
+ CURLOPT(CURLOPT_COOKIE, CURLOPTTYPE_STRINGPOINT, 22),
/* This points to a linked list of headers, struct curl_slist kind. This
list is also used for RTSP (in spite of its name) */
- CINIT(HTTPHEADER, SLISTPOINT, 23),
+ CURLOPT(CURLOPT_HTTPHEADER, CURLOPTTYPE_SLISTPOINT, 23),
/* This points to a linked list of post entries, struct curl_httppost */
- CINIT(HTTPPOST, OBJECTPOINT, 24),
+ CURLOPT(CURLOPT_HTTPPOST, CURLOPTTYPE_OBJECTPOINT, 24),
/* name of the file keeping your private SSL-certificate */
- CINIT(SSLCERT, STRINGPOINT, 25),
+ CURLOPT(CURLOPT_SSLCERT, CURLOPTTYPE_STRINGPOINT, 25),
/* password for the SSL or SSH private key */
- CINIT(KEYPASSWD, STRINGPOINT, 26),
+ CURLOPT(CURLOPT_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 26),
/* send TYPE parameter? */
- CINIT(CRLF, LONG, 27),
+ CURLOPT(CURLOPT_CRLF, CURLOPTTYPE_LONG, 27),
/* send linked-list of QUOTE commands */
- CINIT(QUOTE, SLISTPOINT, 28),
+ CURLOPT(CURLOPT_QUOTE, CURLOPTTYPE_SLISTPOINT, 28),
/* send FILE * or void * to store headers to, if you use a callback it
is simply passed to the callback unmodified */
- CINIT(HEADERDATA, OBJECTPOINT, 29),
+ CURLOPT(CURLOPT_HEADERDATA, CURLOPTTYPE_CBPOINT, 29),
/* point to a file to read the initial cookies from, also enables
"cookie awareness" */
- CINIT(COOKIEFILE, STRINGPOINT, 31),
+ CURLOPT(CURLOPT_COOKIEFILE, CURLOPTTYPE_STRINGPOINT, 31),
/* What version to specifically try to use.
See CURL_SSLVERSION defines below. */
- CINIT(SSLVERSION, LONG, 32),
+ CURLOPT(CURLOPT_SSLVERSION, CURLOPTTYPE_VALUES, 32),
/* What kind of HTTP time condition to use, see defines */
- CINIT(TIMECONDITION, LONG, 33),
+ CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_VALUES, 33),
/* Time to use with the above condition. Specified in number of seconds
since 1 Jan 1970 */
- CINIT(TIMEVALUE, LONG, 34),
+ CURLOPT(CURLOPT_TIMEVALUE, CURLOPTTYPE_LONG, 34),
/* 35 = OBSOLETE */
@@ -1093,37 +1153,58 @@ typedef enum {
HTTP: DELETE, TRACE and others
FTP: to use a different list command
*/
- CINIT(CUSTOMREQUEST, STRINGPOINT, 36),
+ CURLOPT(CURLOPT_CUSTOMREQUEST, CURLOPTTYPE_STRINGPOINT, 36),
/* FILE handle to use instead of stderr */
- CINIT(STDERR, OBJECTPOINT, 37),
+ CURLOPT(CURLOPT_STDERR, CURLOPTTYPE_OBJECTPOINT, 37),
/* 38 is not used */
/* send linked-list of post-transfer QUOTE commands */
- CINIT(POSTQUOTE, SLISTPOINT, 39),
+ CURLOPT(CURLOPT_POSTQUOTE, CURLOPTTYPE_SLISTPOINT, 39),
+
+ /* OBSOLETE, do not use! */
+ CURLOPT(CURLOPT_OBSOLETE40, CURLOPTTYPE_OBJECTPOINT, 40),
+
+ /* talk a lot */
+ CURLOPT(CURLOPT_VERBOSE, CURLOPTTYPE_LONG, 41),
+
+ /* throw the header out too */
+ CURLOPT(CURLOPT_HEADER, CURLOPTTYPE_LONG, 42),
+
+ /* shut off the progress meter */
+ CURLOPT(CURLOPT_NOPROGRESS, CURLOPTTYPE_LONG, 43),
+
+ /* use HEAD to get http document */
+ CURLOPT(CURLOPT_NOBODY, CURLOPTTYPE_LONG, 44),
+
+ /* no output on http error codes >= 400 */
+ CURLOPT(CURLOPT_FAILONERROR, CURLOPTTYPE_LONG, 45),
- CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */
+ /* this is an upload */
+ CURLOPT(CURLOPT_UPLOAD, CURLOPTTYPE_LONG, 46),
- CINIT(VERBOSE, LONG, 41), /* talk a lot */
- CINIT(HEADER, LONG, 42), /* throw the header out too */
- CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */
- CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */
- CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */
- CINIT(UPLOAD, LONG, 46), /* this is an upload */
- CINIT(POST, LONG, 47), /* HTTP POST method */
- CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */
+ /* HTTP POST method */
+ CURLOPT(CURLOPT_POST, CURLOPTTYPE_LONG, 47),
- CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */
+ /* bare names when listing directories */
+ CURLOPT(CURLOPT_DIRLISTONLY, CURLOPTTYPE_LONG, 48),
+
+ /* Append instead of overwrite on upload! */
+ CURLOPT(CURLOPT_APPEND, CURLOPTTYPE_LONG, 50),
/* Specify whether to read the user+password from the .netrc or the URL.
* This must be one of the CURL_NETRC_* enums below. */
- CINIT(NETRC, LONG, 51),
+ CURLOPT(CURLOPT_NETRC, CURLOPTTYPE_VALUES, 51),
+
+ /* use Location: Luke! */
+ CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52),
- CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */
+ /* transfer data in text/ASCII format */
+ CURLOPT(CURLOPT_TRANSFERTEXT, CURLOPTTYPE_LONG, 53),
- CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */
- CINIT(PUT, LONG, 54), /* HTTP PUT */
+ /* HTTP PUT */
+ CURLOPT(CURLOPT_PUT, CURLOPTTYPE_LONG, 54),
/* 55 = OBSOLETE */
@@ -1131,265 +1212,267 @@ typedef enum {
* Function that will be called instead of the internal progress display
* function. This function should be defined as the curl_progress_callback
* prototype defines. */
- CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56),
+ CURLOPT(CURLOPT_PROGRESSFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 56),
/* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION
callbacks */
- CINIT(PROGRESSDATA, OBJECTPOINT, 57),
-#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA
+ CURLOPT(CURLOPT_XFERINFODATA, CURLOPTTYPE_CBPOINT, 57),
+#define CURLOPT_PROGRESSDATA CURLOPT_XFERINFODATA
/* We want the referrer field set automatically when following locations */
- CINIT(AUTOREFERER, LONG, 58),
+ CURLOPT(CURLOPT_AUTOREFERER, CURLOPTTYPE_LONG, 58),
/* Port of the proxy, can be set in the proxy string as well with:
"[host]:[port]" */
- CINIT(PROXYPORT, LONG, 59),
+ CURLOPT(CURLOPT_PROXYPORT, CURLOPTTYPE_LONG, 59),
/* size of the POST input data, if strlen() is not good to use */
- CINIT(POSTFIELDSIZE, LONG, 60),
+ CURLOPT(CURLOPT_POSTFIELDSIZE, CURLOPTTYPE_LONG, 60),
/* tunnel non-http operations through a HTTP proxy */
- CINIT(HTTPPROXYTUNNEL, LONG, 61),
+ CURLOPT(CURLOPT_HTTPPROXYTUNNEL, CURLOPTTYPE_LONG, 61),
/* Set the interface string to use as outgoing network interface */
- CINIT(INTERFACE, STRINGPOINT, 62),
+ CURLOPT(CURLOPT_INTERFACE, CURLOPTTYPE_STRINGPOINT, 62),
/* Set the krb4/5 security level, this also enables krb4/5 awareness. This
* is a string, 'clear', 'safe', 'confidential' or 'private'. If the string
* is set but doesn't match one of these, 'private' will be used. */
- CINIT(KRBLEVEL, STRINGPOINT, 63),
+ CURLOPT(CURLOPT_KRBLEVEL, CURLOPTTYPE_STRINGPOINT, 63),
/* Set if we should verify the peer in ssl handshake, set 1 to verify. */
- CINIT(SSL_VERIFYPEER, LONG, 64),
+ CURLOPT(CURLOPT_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 64),
/* The CApath or CAfile used to validate the peer certificate
this option is used only if SSL_VERIFYPEER is true */
- CINIT(CAINFO, STRINGPOINT, 65),
+ CURLOPT(CURLOPT_CAINFO, CURLOPTTYPE_STRINGPOINT, 65),
/* 66 = OBSOLETE */
/* 67 = OBSOLETE */
/* Maximum number of http redirects to follow */
- CINIT(MAXREDIRS, LONG, 68),
+ CURLOPT(CURLOPT_MAXREDIRS, CURLOPTTYPE_LONG, 68),
/* Pass a long set to 1 to get the date of the requested document (if
possible)! Pass a zero to shut it off. */
- CINIT(FILETIME, LONG, 69),
+ CURLOPT(CURLOPT_FILETIME, CURLOPTTYPE_LONG, 69),
/* This points to a linked list of telnet options */
- CINIT(TELNETOPTIONS, SLISTPOINT, 70),
+ CURLOPT(CURLOPT_TELNETOPTIONS, CURLOPTTYPE_SLISTPOINT, 70),
/* Max amount of cached alive connections */
- CINIT(MAXCONNECTS, LONG, 71),
+ CURLOPT(CURLOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 71),
- CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */
+ /* OBSOLETE, do not use! */
+ CURLOPT(CURLOPT_OBSOLETE72, CURLOPTTYPE_LONG, 72),
/* 73 = OBSOLETE */
/* Set to explicitly use a new connection for the upcoming transfer.
Do not use this unless you're absolutely sure of this, as it makes the
operation slower and is less friendly for the network. */
- CINIT(FRESH_CONNECT, LONG, 74),
+ CURLOPT(CURLOPT_FRESH_CONNECT, CURLOPTTYPE_LONG, 74),
/* Set to explicitly forbid the upcoming transfer's connection to be re-used
when done. Do not use this unless you're absolutely sure of this, as it
makes the operation slower and is less friendly for the network. */
- CINIT(FORBID_REUSE, LONG, 75),
+ CURLOPT(CURLOPT_FORBID_REUSE, CURLOPTTYPE_LONG, 75),
/* Set to a file name that contains random data for libcurl to use to
seed the random engine when doing SSL connects. */
- CINIT(RANDOM_FILE, STRINGPOINT, 76),
+ CURLOPT(CURLOPT_RANDOM_FILE, CURLOPTTYPE_STRINGPOINT, 76),
/* Set to the Entropy Gathering Daemon socket pathname */
- CINIT(EGDSOCKET, STRINGPOINT, 77),
+ CURLOPT(CURLOPT_EGDSOCKET, CURLOPTTYPE_STRINGPOINT, 77),
/* Time-out connect operations after this amount of seconds, if connects are
OK within this time, then fine... This only aborts the connect phase. */
- CINIT(CONNECTTIMEOUT, LONG, 78),
+ CURLOPT(CURLOPT_CONNECTTIMEOUT, CURLOPTTYPE_LONG, 78),
/* Function that will be called to store headers (instead of fwrite). The
* parameters will use fwrite() syntax, make sure to follow them. */
- CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79),
+ CURLOPT(CURLOPT_HEADERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 79),
/* Set this to force the HTTP request to get back to GET. Only really usable
if POST, PUT or a custom request have been used first.
*/
- CINIT(HTTPGET, LONG, 80),
+ CURLOPT(CURLOPT_HTTPGET, CURLOPTTYPE_LONG, 80),
/* Set if we should verify the Common name from the peer certificate in ssl
* handshake, set 1 to check existence, 2 to ensure that it matches the
* provided hostname. */
- CINIT(SSL_VERIFYHOST, LONG, 81),
+ CURLOPT(CURLOPT_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 81),
/* Specify which file name to write all known cookies in after completed
operation. Set file name to "-" (dash) to make it go to stdout. */
- CINIT(COOKIEJAR, STRINGPOINT, 82),
+ CURLOPT(CURLOPT_COOKIEJAR, CURLOPTTYPE_STRINGPOINT, 82),
/* Specify which SSL ciphers to use */
- CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83),
+ CURLOPT(CURLOPT_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 83),
/* Specify which HTTP version to use! This must be set to one of the
CURL_HTTP_VERSION* enums set below. */
- CINIT(HTTP_VERSION, LONG, 84),
+ CURLOPT(CURLOPT_HTTP_VERSION, CURLOPTTYPE_VALUES, 84),
/* Specifically switch on or off the FTP engine's use of the EPSV command. By
default, that one will always be attempted before the more traditional
PASV command. */
- CINIT(FTP_USE_EPSV, LONG, 85),
+ CURLOPT(CURLOPT_FTP_USE_EPSV, CURLOPTTYPE_LONG, 85),
/* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */
- CINIT(SSLCERTTYPE, STRINGPOINT, 86),
+ CURLOPT(CURLOPT_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 86),
/* name of the file keeping your private SSL-key */
- CINIT(SSLKEY, STRINGPOINT, 87),
+ CURLOPT(CURLOPT_SSLKEY, CURLOPTTYPE_STRINGPOINT, 87),
/* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */
- CINIT(SSLKEYTYPE, STRINGPOINT, 88),
+ CURLOPT(CURLOPT_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 88),
/* crypto engine for the SSL-sub system */
- CINIT(SSLENGINE, STRINGPOINT, 89),
+ CURLOPT(CURLOPT_SSLENGINE, CURLOPTTYPE_STRINGPOINT, 89),
/* set the crypto engine for the SSL-sub system as default
the param has no meaning...
*/
- CINIT(SSLENGINE_DEFAULT, LONG, 90),
+ CURLOPT(CURLOPT_SSLENGINE_DEFAULT, CURLOPTTYPE_LONG, 90),
/* Non-zero value means to use the global dns cache */
- CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */
+ /* DEPRECATED, do not use! */
+ CURLOPT(CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOPTTYPE_LONG, 91),
/* DNS cache timeout */
- CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
+ CURLOPT(CURLOPT_DNS_CACHE_TIMEOUT, CURLOPTTYPE_LONG, 92),
/* send linked-list of pre-transfer QUOTE commands */
- CINIT(PREQUOTE, SLISTPOINT, 93),
+ CURLOPT(CURLOPT_PREQUOTE, CURLOPTTYPE_SLISTPOINT, 93),
/* set the debug function */
- CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),
+ CURLOPT(CURLOPT_DEBUGFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 94),
/* set the data for the debug function */
- CINIT(DEBUGDATA, OBJECTPOINT, 95),
+ CURLOPT(CURLOPT_DEBUGDATA, CURLOPTTYPE_CBPOINT, 95),
/* mark this as start of a cookie session */
- CINIT(COOKIESESSION, LONG, 96),
+ CURLOPT(CURLOPT_COOKIESESSION, CURLOPTTYPE_LONG, 96),
/* The CApath directory used to validate the peer certificate
this option is used only if SSL_VERIFYPEER is true */
- CINIT(CAPATH, STRINGPOINT, 97),
+ CURLOPT(CURLOPT_CAPATH, CURLOPTTYPE_STRINGPOINT, 97),
/* Instruct libcurl to use a smaller receive buffer */
- CINIT(BUFFERSIZE, LONG, 98),
+ CURLOPT(CURLOPT_BUFFERSIZE, CURLOPTTYPE_LONG, 98),
/* Instruct libcurl to not use any signal/alarm handlers, even when using
timeouts. This option is useful for multi-threaded applications.
See libcurl-the-guide for more background information. */
- CINIT(NOSIGNAL, LONG, 99),
+ CURLOPT(CURLOPT_NOSIGNAL, CURLOPTTYPE_LONG, 99),
/* Provide a CURLShare for mutexing non-ts data */
- CINIT(SHARE, OBJECTPOINT, 100),
+ CURLOPT(CURLOPT_SHARE, CURLOPTTYPE_OBJECTPOINT, 100),
/* indicates type of proxy. accepted values are CURLPROXY_HTTP (default),
CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and
CURLPROXY_SOCKS5. */
- CINIT(PROXYTYPE, LONG, 101),
+ CURLOPT(CURLOPT_PROXYTYPE, CURLOPTTYPE_VALUES, 101),
/* Set the Accept-Encoding string. Use this to tell a server you would like
the response to be compressed. Before 7.21.6, this was known as
CURLOPT_ENCODING */
- CINIT(ACCEPT_ENCODING, STRINGPOINT, 102),
+ CURLOPT(CURLOPT_ACCEPT_ENCODING, CURLOPTTYPE_STRINGPOINT, 102),
/* Set pointer to private data */
- CINIT(PRIVATE, OBJECTPOINT, 103),
+ CURLOPT(CURLOPT_PRIVATE, CURLOPTTYPE_OBJECTPOINT, 103),
/* Set aliases for HTTP 200 in the HTTP Response header */
- CINIT(HTTP200ALIASES, SLISTPOINT, 104),
+ CURLOPT(CURLOPT_HTTP200ALIASES, CURLOPTTYPE_SLISTPOINT, 104),
/* Continue to send authentication (user+password) when following locations,
even when hostname changed. This can potentially send off the name
and password to whatever host the server decides. */
- CINIT(UNRESTRICTED_AUTH, LONG, 105),
+ CURLOPT(CURLOPT_UNRESTRICTED_AUTH, CURLOPTTYPE_LONG, 105),
/* Specifically switch on or off the FTP engine's use of the EPRT command (
it also disables the LPRT attempt). By default, those ones will always be
attempted before the good old traditional PORT command. */
- CINIT(FTP_USE_EPRT, LONG, 106),
+ CURLOPT(CURLOPT_FTP_USE_EPRT, CURLOPTTYPE_LONG, 106),
/* Set this to a bitmask value to enable the particular authentications
methods you like. Use this in combination with CURLOPT_USERPWD.
Note that setting multiple bits may cause extra network round-trips. */
- CINIT(HTTPAUTH, LONG, 107),
+ CURLOPT(CURLOPT_HTTPAUTH, CURLOPTTYPE_VALUES, 107),
/* Set the ssl context callback function, currently only for OpenSSL or
WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument.
The function must match the curl_ssl_ctx_callback prototype. */
- CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),
+ CURLOPT(CURLOPT_SSL_CTX_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 108),
/* Set the userdata for the ssl context callback function's third
argument */
- CINIT(SSL_CTX_DATA, OBJECTPOINT, 109),
+ CURLOPT(CURLOPT_SSL_CTX_DATA, CURLOPTTYPE_CBPOINT, 109),
/* FTP Option that causes missing dirs to be created on the remote server.
In 7.19.4 we introduced the convenience enums for this option using the
CURLFTP_CREATE_DIR prefix.
*/
- CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110),
+ CURLOPT(CURLOPT_FTP_CREATE_MISSING_DIRS, CURLOPTTYPE_LONG, 110),
/* Set this to a bitmask value to enable the particular authentications
methods you like. Use this in combination with CURLOPT_PROXYUSERPWD.
Note that setting multiple bits may cause extra network round-trips. */
- CINIT(PROXYAUTH, LONG, 111),
+ CURLOPT(CURLOPT_PROXYAUTH, CURLOPTTYPE_VALUES, 111),
/* FTP option that changes the timeout, in seconds, associated with
getting a response. This is different from transfer timeout time and
essentially places a demand on the FTP server to acknowledge commands
in a timely manner. */
- CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112),
+ CURLOPT(CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPTTYPE_LONG, 112),
#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT
/* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to
tell libcurl to resolve names to those IP versions only. This only has
affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
- CINIT(IPRESOLVE, LONG, 113),
+ CURLOPT(CURLOPT_IPRESOLVE, CURLOPTTYPE_VALUES, 113),
/* Set this option to limit the size of a file that will be downloaded from
an HTTP or FTP server.
Note there is also _LARGE version which adds large file support for
platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */
- CINIT(MAXFILESIZE, LONG, 114),
+ CURLOPT(CURLOPT_MAXFILESIZE, CURLOPTTYPE_LONG, 114),
/* See the comment for INFILESIZE above, but in short, specifies
* the size of the file being uploaded. -1 means unknown.
*/
- CINIT(INFILESIZE_LARGE, OFF_T, 115),
+ CURLOPT(CURLOPT_INFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 115),
- /* Sets the continuation offset. There is also a LONG version of this;
- * look above for RESUME_FROM.
+ /* Sets the continuation offset. There is also a CURLOPTTYPE_LONG version
+ * of this; look above for RESUME_FROM.
*/
- CINIT(RESUME_FROM_LARGE, OFF_T, 116),
+ CURLOPT(CURLOPT_RESUME_FROM_LARGE, CURLOPTTYPE_OFF_T, 116),
/* Sets the maximum size of data that will be downloaded from
* an HTTP or FTP server. See MAXFILESIZE above for the LONG version.
*/
- CINIT(MAXFILESIZE_LARGE, OFF_T, 117),
+ CURLOPT(CURLOPT_MAXFILESIZE_LARGE, CURLOPTTYPE_OFF_T, 117),
/* Set this option to the file name of your .netrc file you want libcurl
to parse (using the CURLOPT_NETRC option). If not set, libcurl will do
a poor attempt to find the user's home directory and check for a .netrc
file in there. */
- CINIT(NETRC_FILE, STRINGPOINT, 118),
+ CURLOPT(CURLOPT_NETRC_FILE, CURLOPTTYPE_STRINGPOINT, 118),
/* Enable SSL/TLS for FTP, pick one of:
CURLUSESSL_TRY - try using SSL, proceed anyway otherwise
CURLUSESSL_CONTROL - SSL for the control connection or fail
CURLUSESSL_ALL - SSL for all communication or fail
*/
- CINIT(USE_SSL, LONG, 119),
+ CURLOPT(CURLOPT_USE_SSL, CURLOPTTYPE_VALUES, 119),
/* The _LARGE version of the standard POSTFIELDSIZE option */
- CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120),
+ CURLOPT(CURLOPT_POSTFIELDSIZE_LARGE, CURLOPTTYPE_OFF_T, 120),
/* Enable/disable the TCP Nagle algorithm */
- CINIT(TCP_NODELAY, LONG, 121),
+ CURLOPT(CURLOPT_TCP_NODELAY, CURLOPTTYPE_LONG, 121),
/* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
/* 123 OBSOLETE. Gone in 7.16.0 */
@@ -1409,143 +1492,143 @@ typedef enum {
CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS
CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL
*/
- CINIT(FTPSSLAUTH, LONG, 129),
+ CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_VALUES, 129),
- CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
- CINIT(IOCTLDATA, OBJECTPOINT, 131),
+ CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130),
+ CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_CBPOINT, 131),
/* 132 OBSOLETE. Gone in 7.16.0 */
/* 133 OBSOLETE. Gone in 7.16.0 */
- /* zero terminated string for pass on to the FTP server when asked for
+ /* null-terminated string for pass on to the FTP server when asked for
"account" info */
- CINIT(FTP_ACCOUNT, STRINGPOINT, 134),
+ CURLOPT(CURLOPT_FTP_ACCOUNT, CURLOPTTYPE_STRINGPOINT, 134),
/* feed cookie into cookie engine */
- CINIT(COOKIELIST, STRINGPOINT, 135),
+ CURLOPT(CURLOPT_COOKIELIST, CURLOPTTYPE_STRINGPOINT, 135),
/* ignore Content-Length */
- CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),
+ CURLOPT(CURLOPT_IGNORE_CONTENT_LENGTH, CURLOPTTYPE_LONG, 136),
/* Set to non-zero to skip the IP address received in a 227 PASV FTP server
response. Typically used for FTP-SSL purposes but is not restricted to
that. libcurl will then instead use the same IP address it used for the
control connection. */
- CINIT(FTP_SKIP_PASV_IP, LONG, 137),
+ CURLOPT(CURLOPT_FTP_SKIP_PASV_IP, CURLOPTTYPE_LONG, 137),
/* Select "file method" to use when doing FTP, see the curl_ftpmethod
above. */
- CINIT(FTP_FILEMETHOD, LONG, 138),
+ CURLOPT(CURLOPT_FTP_FILEMETHOD, CURLOPTTYPE_VALUES, 138),
/* Local port number to bind the socket to */
- CINIT(LOCALPORT, LONG, 139),
+ CURLOPT(CURLOPT_LOCALPORT, CURLOPTTYPE_LONG, 139),
/* Number of ports to try, including the first one set with LOCALPORT.
Thus, setting it to 1 will make no additional attempts but the first.
*/
- CINIT(LOCALPORTRANGE, LONG, 140),
+ CURLOPT(CURLOPT_LOCALPORTRANGE, CURLOPTTYPE_LONG, 140),
/* no transfer, set up connection and let application use the socket by
extracting it with CURLINFO_LASTSOCKET */
- CINIT(CONNECT_ONLY, LONG, 141),
+ CURLOPT(CURLOPT_CONNECT_ONLY, CURLOPTTYPE_LONG, 141),
/* Function that will be called to convert from the
network encoding (instead of using the iconv calls in libcurl) */
- CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142),
+ CURLOPT(CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 142),
/* Function that will be called to convert to the
network encoding (instead of using the iconv calls in libcurl) */
- CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143),
+ CURLOPT(CURLOPT_CONV_TO_NETWORK_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 143),
/* Function that will be called to convert from UTF8
(instead of using the iconv calls in libcurl)
Note that this is used only for SSL certificate processing */
- CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144),
+ CURLOPT(CURLOPT_CONV_FROM_UTF8_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 144),
/* if the connection proceeds too quickly then need to slow it down */
/* limit-rate: maximum number of bytes per second to send or receive */
- CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145),
- CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146),
+ CURLOPT(CURLOPT_MAX_SEND_SPEED_LARGE, CURLOPTTYPE_OFF_T, 145),
+ CURLOPT(CURLOPT_MAX_RECV_SPEED_LARGE, CURLOPTTYPE_OFF_T, 146),
/* Pointer to command string to send if USER/PASS fails. */
- CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147),
+ CURLOPT(CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPTTYPE_STRINGPOINT, 147),
/* callback function for setting socket options */
- CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),
- CINIT(SOCKOPTDATA, OBJECTPOINT, 149),
+ CURLOPT(CURLOPT_SOCKOPTFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 148),
+ CURLOPT(CURLOPT_SOCKOPTDATA, CURLOPTTYPE_CBPOINT, 149),
/* set to 0 to disable session ID re-use for this transfer, default is
enabled (== 1) */
- CINIT(SSL_SESSIONID_CACHE, LONG, 150),
+ CURLOPT(CURLOPT_SSL_SESSIONID_CACHE, CURLOPTTYPE_LONG, 150),
/* allowed SSH authentication methods */
- CINIT(SSH_AUTH_TYPES, LONG, 151),
+ CURLOPT(CURLOPT_SSH_AUTH_TYPES, CURLOPTTYPE_VALUES, 151),
/* Used by scp/sftp to do public/private key authentication */
- CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152),
- CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153),
+ CURLOPT(CURLOPT_SSH_PUBLIC_KEYFILE, CURLOPTTYPE_STRINGPOINT, 152),
+ CURLOPT(CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPTTYPE_STRINGPOINT, 153),
/* Send CCC (Clear Command Channel) after authentication */
- CINIT(FTP_SSL_CCC, LONG, 154),
+ CURLOPT(CURLOPT_FTP_SSL_CCC, CURLOPTTYPE_LONG, 154),
/* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */
- CINIT(TIMEOUT_MS, LONG, 155),
- CINIT(CONNECTTIMEOUT_MS, LONG, 156),
+ CURLOPT(CURLOPT_TIMEOUT_MS, CURLOPTTYPE_LONG, 155),
+ CURLOPT(CURLOPT_CONNECTTIMEOUT_MS, CURLOPTTYPE_LONG, 156),
/* set to zero to disable the libcurl's decoding and thus pass the raw body
data to the application even when it is encoded/compressed */
- CINIT(HTTP_TRANSFER_DECODING, LONG, 157),
- CINIT(HTTP_CONTENT_DECODING, LONG, 158),
+ CURLOPT(CURLOPT_HTTP_TRANSFER_DECODING, CURLOPTTYPE_LONG, 157),
+ CURLOPT(CURLOPT_HTTP_CONTENT_DECODING, CURLOPTTYPE_LONG, 158),
/* Permission used when creating new files and directories on the remote
server for protocols that support it, SFTP/SCP/FILE */
- CINIT(NEW_FILE_PERMS, LONG, 159),
- CINIT(NEW_DIRECTORY_PERMS, LONG, 160),
+ CURLOPT(CURLOPT_NEW_FILE_PERMS, CURLOPTTYPE_LONG, 159),
+ CURLOPT(CURLOPT_NEW_DIRECTORY_PERMS, CURLOPTTYPE_LONG, 160),
/* Set the behaviour of POST when redirecting. Values must be set to one
of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */
- CINIT(POSTREDIR, LONG, 161),
+ CURLOPT(CURLOPT_POSTREDIR, CURLOPTTYPE_VALUES, 161),
/* used by scp/sftp to verify the host's public key */
- CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162),
+ CURLOPT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, CURLOPTTYPE_STRINGPOINT, 162),
/* Callback function for opening socket (instead of socket(2)). Optionally,
callback is able change the address or refuse to connect returning
CURL_SOCKET_BAD. The callback should have type
curl_opensocket_callback */
- CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163),
- CINIT(OPENSOCKETDATA, OBJECTPOINT, 164),
+ CURLOPT(CURLOPT_OPENSOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 163),
+ CURLOPT(CURLOPT_OPENSOCKETDATA, CURLOPTTYPE_CBPOINT, 164),
/* POST volatile input fields. */
- CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),
+ CURLOPT(CURLOPT_COPYPOSTFIELDS, CURLOPTTYPE_OBJECTPOINT, 165),
/* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */
- CINIT(PROXY_TRANSFER_MODE, LONG, 166),
+ CURLOPT(CURLOPT_PROXY_TRANSFER_MODE, CURLOPTTYPE_LONG, 166),
/* Callback function for seeking in the input stream */
- CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167),
- CINIT(SEEKDATA, OBJECTPOINT, 168),
+ CURLOPT(CURLOPT_SEEKFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 167),
+ CURLOPT(CURLOPT_SEEKDATA, CURLOPTTYPE_CBPOINT, 168),
/* CRL file */
- CINIT(CRLFILE, STRINGPOINT, 169),
+ CURLOPT(CURLOPT_CRLFILE, CURLOPTTYPE_STRINGPOINT, 169),
/* Issuer certificate */
- CINIT(ISSUERCERT, STRINGPOINT, 170),
+ CURLOPT(CURLOPT_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 170),
/* (IPv6) Address scope */
- CINIT(ADDRESS_SCOPE, LONG, 171),
+ CURLOPT(CURLOPT_ADDRESS_SCOPE, CURLOPTTYPE_LONG, 171),
/* Collect certificate chain info and allow it to get retrievable with
CURLINFO_CERTINFO after the transfer is complete. */
- CINIT(CERTINFO, LONG, 172),
+ CURLOPT(CURLOPT_CERTINFO, CURLOPTTYPE_LONG, 172),
/* "name" and "pwd" to use when fetching. */
- CINIT(USERNAME, STRINGPOINT, 173),
- CINIT(PASSWORD, STRINGPOINT, 174),
+ CURLOPT(CURLOPT_USERNAME, CURLOPTTYPE_STRINGPOINT, 173),
+ CURLOPT(CURLOPT_PASSWORD, CURLOPTTYPE_STRINGPOINT, 174),
/* "name" and "pwd" to use with Proxy when fetching. */
- CINIT(PROXYUSERNAME, STRINGPOINT, 175),
- CINIT(PROXYPASSWORD, STRINGPOINT, 176),
+ CURLOPT(CURLOPT_PROXYUSERNAME, CURLOPTTYPE_STRINGPOINT, 175),
+ CURLOPT(CURLOPT_PROXYPASSWORD, CURLOPTTYPE_STRINGPOINT, 176),
/* Comma separated list of hostnames defining no-proxy zones. These should
match both hostnames directly, and hostnames within a domain. For
@@ -1554,102 +1637,103 @@ typedef enum {
implementations of this, .local.com will be considered to be the same as
local.com. A single * is the only valid wildcard, and effectively
disables the use of proxy. */
- CINIT(NOPROXY, STRINGPOINT, 177),
+ CURLOPT(CURLOPT_NOPROXY, CURLOPTTYPE_STRINGPOINT, 177),
/* block size for TFTP transfers */
- CINIT(TFTP_BLKSIZE, LONG, 178),
+ CURLOPT(CURLOPT_TFTP_BLKSIZE, CURLOPTTYPE_LONG, 178),
/* Socks Service */
- CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */
+ /* DEPRECATED, do not use! */
+ CURLOPT(CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPTTYPE_STRINGPOINT, 179),
/* Socks Service */
- CINIT(SOCKS5_GSSAPI_NEC, LONG, 180),
+ CURLOPT(CURLOPT_SOCKS5_GSSAPI_NEC, CURLOPTTYPE_LONG, 180),
/* set the bitmask for the protocols that are allowed to be used for the
transfer, which thus helps the app which takes URLs from users or other
external inputs and want to restrict what protocol(s) to deal
with. Defaults to CURLPROTO_ALL. */
- CINIT(PROTOCOLS, LONG, 181),
+ CURLOPT(CURLOPT_PROTOCOLS, CURLOPTTYPE_LONG, 181),
/* set the bitmask for the protocols that libcurl is allowed to follow to,
as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
to be set in both bitmasks to be allowed to get redirected to. */
- CINIT(REDIR_PROTOCOLS, LONG, 182),
+ CURLOPT(CURLOPT_REDIR_PROTOCOLS, CURLOPTTYPE_LONG, 182),
/* set the SSH knownhost file name to use */
- CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183),
+ CURLOPT(CURLOPT_SSH_KNOWNHOSTS, CURLOPTTYPE_STRINGPOINT, 183),
/* set the SSH host key callback, must point to a curl_sshkeycallback
function */
- CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184),
+ CURLOPT(CURLOPT_SSH_KEYFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 184),
/* set the SSH host key callback custom pointer */
- CINIT(SSH_KEYDATA, OBJECTPOINT, 185),
+ CURLOPT(CURLOPT_SSH_KEYDATA, CURLOPTTYPE_CBPOINT, 185),
/* set the SMTP mail originator */
- CINIT(MAIL_FROM, STRINGPOINT, 186),
+ CURLOPT(CURLOPT_MAIL_FROM, CURLOPTTYPE_STRINGPOINT, 186),
/* set the list of SMTP mail receiver(s) */
- CINIT(MAIL_RCPT, SLISTPOINT, 187),
+ CURLOPT(CURLOPT_MAIL_RCPT, CURLOPTTYPE_SLISTPOINT, 187),
/* FTP: send PRET before PASV */
- CINIT(FTP_USE_PRET, LONG, 188),
+ CURLOPT(CURLOPT_FTP_USE_PRET, CURLOPTTYPE_LONG, 188),
/* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */
- CINIT(RTSP_REQUEST, LONG, 189),
+ CURLOPT(CURLOPT_RTSP_REQUEST, CURLOPTTYPE_VALUES, 189),
/* The RTSP session identifier */
- CINIT(RTSP_SESSION_ID, STRINGPOINT, 190),
+ CURLOPT(CURLOPT_RTSP_SESSION_ID, CURLOPTTYPE_STRINGPOINT, 190),
/* The RTSP stream URI */
- CINIT(RTSP_STREAM_URI, STRINGPOINT, 191),
+ CURLOPT(CURLOPT_RTSP_STREAM_URI, CURLOPTTYPE_STRINGPOINT, 191),
/* The Transport: header to use in RTSP requests */
- CINIT(RTSP_TRANSPORT, STRINGPOINT, 192),
+ CURLOPT(CURLOPT_RTSP_TRANSPORT, CURLOPTTYPE_STRINGPOINT, 192),
/* Manually initialize the client RTSP CSeq for this handle */
- CINIT(RTSP_CLIENT_CSEQ, LONG, 193),
+ CURLOPT(CURLOPT_RTSP_CLIENT_CSEQ, CURLOPTTYPE_LONG, 193),
/* Manually initialize the server RTSP CSeq for this handle */
- CINIT(RTSP_SERVER_CSEQ, LONG, 194),
+ CURLOPT(CURLOPT_RTSP_SERVER_CSEQ, CURLOPTTYPE_LONG, 194),
/* The stream to pass to INTERLEAVEFUNCTION. */
- CINIT(INTERLEAVEDATA, OBJECTPOINT, 195),
+ CURLOPT(CURLOPT_INTERLEAVEDATA, CURLOPTTYPE_CBPOINT, 195),
/* Let the application define a custom write method for RTP data */
- CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196),
+ CURLOPT(CURLOPT_INTERLEAVEFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 196),
/* Turn on wildcard matching */
- CINIT(WILDCARDMATCH, LONG, 197),
+ CURLOPT(CURLOPT_WILDCARDMATCH, CURLOPTTYPE_LONG, 197),
/* Directory matching callback called before downloading of an
individual file (chunk) started */
- CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198),
+ CURLOPT(CURLOPT_CHUNK_BGN_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 198),
/* Directory matching callback called after the file (chunk)
was downloaded, or skipped */
- CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199),
+ CURLOPT(CURLOPT_CHUNK_END_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 199),
/* Change match (fnmatch-like) callback for wildcard matching */
- CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200),
+ CURLOPT(CURLOPT_FNMATCH_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 200),
/* Let the application define custom chunk data pointer */
- CINIT(CHUNK_DATA, OBJECTPOINT, 201),
+ CURLOPT(CURLOPT_CHUNK_DATA, CURLOPTTYPE_CBPOINT, 201),
/* FNMATCH_FUNCTION user pointer */
- CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
+ CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_CBPOINT, 202),
/* send linked-list of name:port:address sets */
- CINIT(RESOLVE, SLISTPOINT, 203),
+ CURLOPT(CURLOPT_RESOLVE, CURLOPTTYPE_SLISTPOINT, 203),
/* Set a username for authenticated TLS */
- CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204),
+ CURLOPT(CURLOPT_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 204),
/* Set a password for authenticated TLS */
- CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205),
+ CURLOPT(CURLOPT_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 205),
/* Set authentication type for authenticated TLS */
- CINIT(TLSAUTH_TYPE, STRINGPOINT, 206),
+ CURLOPT(CURLOPT_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 206),
/* Set to 1 to enable the "TE:" header in HTTP requests to ask for
compressed transfer-encoded responses. Set to 0 to disable the use of TE:
@@ -1661,271 +1745,291 @@ typedef enum {
option is set to 1.
*/
- CINIT(TRANSFER_ENCODING, LONG, 207),
+ CURLOPT(CURLOPT_TRANSFER_ENCODING, CURLOPTTYPE_LONG, 207),
/* Callback function for closing socket (instead of close(2)). The callback
should have type curl_closesocket_callback */
- CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208),
- CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209),
+ CURLOPT(CURLOPT_CLOSESOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 208),
+ CURLOPT(CURLOPT_CLOSESOCKETDATA, CURLOPTTYPE_CBPOINT, 209),
/* allow GSSAPI credential delegation */
- CINIT(GSSAPI_DELEGATION, LONG, 210),
+ CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_VALUES, 210),
/* Set the name servers to use for DNS resolution */
- CINIT(DNS_SERVERS, STRINGPOINT, 211),
+ CURLOPT(CURLOPT_DNS_SERVERS, CURLOPTTYPE_STRINGPOINT, 211),
/* Time-out accept operations (currently for FTP only) after this amount
of milliseconds. */
- CINIT(ACCEPTTIMEOUT_MS, LONG, 212),
+ CURLOPT(CURLOPT_ACCEPTTIMEOUT_MS, CURLOPTTYPE_LONG, 212),
/* Set TCP keepalive */
- CINIT(TCP_KEEPALIVE, LONG, 213),
+ CURLOPT(CURLOPT_TCP_KEEPALIVE, CURLOPTTYPE_LONG, 213),
/* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */
- CINIT(TCP_KEEPIDLE, LONG, 214),
- CINIT(TCP_KEEPINTVL, LONG, 215),
+ CURLOPT(CURLOPT_TCP_KEEPIDLE, CURLOPTTYPE_LONG, 214),
+ CURLOPT(CURLOPT_TCP_KEEPINTVL, CURLOPTTYPE_LONG, 215),
/* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */
- CINIT(SSL_OPTIONS, LONG, 216),
+ CURLOPT(CURLOPT_SSL_OPTIONS, CURLOPTTYPE_VALUES, 216),
/* Set the SMTP auth originator */
- CINIT(MAIL_AUTH, STRINGPOINT, 217),
+ CURLOPT(CURLOPT_MAIL_AUTH, CURLOPTTYPE_STRINGPOINT, 217),
/* Enable/disable SASL initial response */
- CINIT(SASL_IR, LONG, 218),
+ CURLOPT(CURLOPT_SASL_IR, CURLOPTTYPE_LONG, 218),
/* Function that will be called instead of the internal progress display
* function. This function should be defined as the curl_xferinfo_callback
* prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */
- CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219),
+ CURLOPT(CURLOPT_XFERINFOFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 219),
/* The XOAUTH2 bearer token */
- CINIT(XOAUTH2_BEARER, STRINGPOINT, 220),
+ CURLOPT(CURLOPT_XOAUTH2_BEARER, CURLOPTTYPE_STRINGPOINT, 220),
/* Set the interface string to use as outgoing network
* interface for DNS requests.
* Only supported by the c-ares DNS backend */
- CINIT(DNS_INTERFACE, STRINGPOINT, 221),
+ CURLOPT(CURLOPT_DNS_INTERFACE, CURLOPTTYPE_STRINGPOINT, 221),
/* Set the local IPv4 address to use for outgoing DNS requests.
* Only supported by the c-ares DNS backend */
- CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222),
+ CURLOPT(CURLOPT_DNS_LOCAL_IP4, CURLOPTTYPE_STRINGPOINT, 222),
/* Set the local IPv6 address to use for outgoing DNS requests.
* Only supported by the c-ares DNS backend */
- CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223),
+ CURLOPT(CURLOPT_DNS_LOCAL_IP6, CURLOPTTYPE_STRINGPOINT, 223),
/* Set authentication options directly */
- CINIT(LOGIN_OPTIONS, STRINGPOINT, 224),
+ CURLOPT(CURLOPT_LOGIN_OPTIONS, CURLOPTTYPE_STRINGPOINT, 224),
/* Enable/disable TLS NPN extension (http2 over ssl might fail without) */
- CINIT(SSL_ENABLE_NPN, LONG, 225),
+ CURLOPT(CURLOPT_SSL_ENABLE_NPN, CURLOPTTYPE_LONG, 225),
/* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */
- CINIT(SSL_ENABLE_ALPN, LONG, 226),
+ CURLOPT(CURLOPT_SSL_ENABLE_ALPN, CURLOPTTYPE_LONG, 226),
/* Time to wait for a response to a HTTP request containing an
* Expect: 100-continue header before sending the data anyway. */
- CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227),
+ CURLOPT(CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOPTTYPE_LONG, 227),
/* This points to a linked list of headers used for proxy requests only,
struct curl_slist kind */
- CINIT(PROXYHEADER, SLISTPOINT, 228),
+ CURLOPT(CURLOPT_PROXYHEADER, CURLOPTTYPE_SLISTPOINT, 228),
/* Pass in a bitmask of "header options" */
- CINIT(HEADEROPT, LONG, 229),
+ CURLOPT(CURLOPT_HEADEROPT, CURLOPTTYPE_VALUES, 229),
/* The public key in DER form used to validate the peer public key
this option is used only if SSL_VERIFYPEER is true */
- CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230),
+ CURLOPT(CURLOPT_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 230),
/* Path to Unix domain socket */
- CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231),
+ CURLOPT(CURLOPT_UNIX_SOCKET_PATH, CURLOPTTYPE_STRINGPOINT, 231),
/* Set if we should verify the certificate status. */
- CINIT(SSL_VERIFYSTATUS, LONG, 232),
+ CURLOPT(CURLOPT_SSL_VERIFYSTATUS, CURLOPTTYPE_LONG, 232),
/* Set if we should enable TLS false start. */
- CINIT(SSL_FALSESTART, LONG, 233),
+ CURLOPT(CURLOPT_SSL_FALSESTART, CURLOPTTYPE_LONG, 233),
/* Do not squash dot-dot sequences */
- CINIT(PATH_AS_IS, LONG, 234),
+ CURLOPT(CURLOPT_PATH_AS_IS, CURLOPTTYPE_LONG, 234),
/* Proxy Service Name */
- CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235),
+ CURLOPT(CURLOPT_PROXY_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 235),
/* Service Name */
- CINIT(SERVICE_NAME, STRINGPOINT, 236),
+ CURLOPT(CURLOPT_SERVICE_NAME, CURLOPTTYPE_STRINGPOINT, 236),
/* Wait/don't wait for pipe/mutex to clarify */
- CINIT(PIPEWAIT, LONG, 237),
+ CURLOPT(CURLOPT_PIPEWAIT, CURLOPTTYPE_LONG, 237),
/* Set the protocol used when curl is given a URL without a protocol */
- CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238),
+ CURLOPT(CURLOPT_DEFAULT_PROTOCOL, CURLOPTTYPE_STRINGPOINT, 238),
/* Set stream weight, 1 - 256 (default is 16) */
- CINIT(STREAM_WEIGHT, LONG, 239),
+ CURLOPT(CURLOPT_STREAM_WEIGHT, CURLOPTTYPE_LONG, 239),
/* Set stream dependency on another CURL handle */
- CINIT(STREAM_DEPENDS, OBJECTPOINT, 240),
+ CURLOPT(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240),
/* Set E-xclusive stream dependency on another CURL handle */
- CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241),
+ CURLOPT(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241),
/* Do not send any tftp option requests to the server */
- CINIT(TFTP_NO_OPTIONS, LONG, 242),
+ CURLOPT(CURLOPT_TFTP_NO_OPTIONS, CURLOPTTYPE_LONG, 242),
/* Linked-list of host:port:connect-to-host:connect-to-port,
overrides the URL's host:port (only for the network layer) */
- CINIT(CONNECT_TO, SLISTPOINT, 243),
+ CURLOPT(CURLOPT_CONNECT_TO, CURLOPTTYPE_SLISTPOINT, 243),
/* Set TCP Fast Open */
- CINIT(TCP_FASTOPEN, LONG, 244),
+ CURLOPT(CURLOPT_TCP_FASTOPEN, CURLOPTTYPE_LONG, 244),
/* Continue to send data if the server responds early with an
* HTTP status code >= 300 */
- CINIT(KEEP_SENDING_ON_ERROR, LONG, 245),
+ CURLOPT(CURLOPT_KEEP_SENDING_ON_ERROR, CURLOPTTYPE_LONG, 245),
/* The CApath or CAfile used to validate the proxy certificate
this option is used only if PROXY_SSL_VERIFYPEER is true */
- CINIT(PROXY_CAINFO, STRINGPOINT, 246),
+ CURLOPT(CURLOPT_PROXY_CAINFO, CURLOPTTYPE_STRINGPOINT, 246),
/* The CApath directory used to validate the proxy certificate
this option is used only if PROXY_SSL_VERIFYPEER is true */
- CINIT(PROXY_CAPATH, STRINGPOINT, 247),
+ CURLOPT(CURLOPT_PROXY_CAPATH, CURLOPTTYPE_STRINGPOINT, 247),
/* Set if we should verify the proxy in ssl handshake,
set 1 to verify. */
- CINIT(PROXY_SSL_VERIFYPEER, LONG, 248),
+ CURLOPT(CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPTTYPE_LONG, 248),
/* Set if we should verify the Common name from the proxy certificate in ssl
* handshake, set 1 to check existence, 2 to ensure that it matches
* the provided hostname. */
- CINIT(PROXY_SSL_VERIFYHOST, LONG, 249),
+ CURLOPT(CURLOPT_PROXY_SSL_VERIFYHOST, CURLOPTTYPE_LONG, 249),
/* What version to specifically try to use for proxy.
See CURL_SSLVERSION defines below. */
- CINIT(PROXY_SSLVERSION, LONG, 250),
+ CURLOPT(CURLOPT_PROXY_SSLVERSION, CURLOPTTYPE_VALUES, 250),
/* Set a username for authenticated TLS for proxy */
- CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251),
+ CURLOPT(CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPTTYPE_STRINGPOINT, 251),
/* Set a password for authenticated TLS for proxy */
- CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252),
+ CURLOPT(CURLOPT_PROXY_TLSAUTH_PASSWORD, CURLOPTTYPE_STRINGPOINT, 252),
/* Set authentication type for authenticated TLS for proxy */
- CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253),
+ CURLOPT(CURLOPT_PROXY_TLSAUTH_TYPE, CURLOPTTYPE_STRINGPOINT, 253),
/* name of the file keeping your private SSL-certificate for proxy */
- CINIT(PROXY_SSLCERT, STRINGPOINT, 254),
+ CURLOPT(CURLOPT_PROXY_SSLCERT, CURLOPTTYPE_STRINGPOINT, 254),
/* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for
proxy */
- CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255),
+ CURLOPT(CURLOPT_PROXY_SSLCERTTYPE, CURLOPTTYPE_STRINGPOINT, 255),
/* name of the file keeping your private SSL-key for proxy */
- CINIT(PROXY_SSLKEY, STRINGPOINT, 256),
+ CURLOPT(CURLOPT_PROXY_SSLKEY, CURLOPTTYPE_STRINGPOINT, 256),
/* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for
proxy */
- CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257),
+ CURLOPT(CURLOPT_PROXY_SSLKEYTYPE, CURLOPTTYPE_STRINGPOINT, 257),
/* password for the SSL private key for proxy */
- CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258),
+ CURLOPT(CURLOPT_PROXY_KEYPASSWD, CURLOPTTYPE_STRINGPOINT, 258),
/* Specify which SSL ciphers to use for proxy */
- CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259),
+ CURLOPT(CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOPTTYPE_STRINGPOINT, 259),
/* CRL file for proxy */
- CINIT(PROXY_CRLFILE, STRINGPOINT, 260),
+ CURLOPT(CURLOPT_PROXY_CRLFILE, CURLOPTTYPE_STRINGPOINT, 260),
/* Enable/disable specific SSL features with a bitmask for proxy, see
CURLSSLOPT_* */
- CINIT(PROXY_SSL_OPTIONS, LONG, 261),
+ CURLOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLOPTTYPE_LONG, 261),
/* Name of pre proxy to use. */
- CINIT(PRE_PROXY, STRINGPOINT, 262),
+ CURLOPT(CURLOPT_PRE_PROXY, CURLOPTTYPE_STRINGPOINT, 262),
/* The public key in DER form used to validate the proxy public key
this option is used only if PROXY_SSL_VERIFYPEER is true */
- CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263),
+ CURLOPT(CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOPTTYPE_STRINGPOINT, 263),
/* Path to an abstract Unix domain socket */
- CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264),
+ CURLOPT(CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOPTTYPE_STRINGPOINT, 264),
/* Suppress proxy CONNECT response headers from user callbacks */
- CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265),
+ CURLOPT(CURLOPT_SUPPRESS_CONNECT_HEADERS, CURLOPTTYPE_LONG, 265),
/* The request target, instead of extracted from the URL */
- CINIT(REQUEST_TARGET, STRINGPOINT, 266),
+ CURLOPT(CURLOPT_REQUEST_TARGET, CURLOPTTYPE_STRINGPOINT, 266),
/* bitmask of allowed auth methods for connections to SOCKS5 proxies */
- CINIT(SOCKS5_AUTH, LONG, 267),
+ CURLOPT(CURLOPT_SOCKS5_AUTH, CURLOPTTYPE_LONG, 267),
/* Enable/disable SSH compression */
- CINIT(SSH_COMPRESSION, LONG, 268),
+ CURLOPT(CURLOPT_SSH_COMPRESSION, CURLOPTTYPE_LONG, 268),
/* Post MIME data. */
- CINIT(MIMEPOST, OBJECTPOINT, 269),
+ CURLOPT(CURLOPT_MIMEPOST, CURLOPTTYPE_OBJECTPOINT, 269),
/* Time to use with the CURLOPT_TIMECONDITION. Specified in number of
seconds since 1 Jan 1970. */
- CINIT(TIMEVALUE_LARGE, OFF_T, 270),
+ CURLOPT(CURLOPT_TIMEVALUE_LARGE, CURLOPTTYPE_OFF_T, 270),
/* Head start in milliseconds to give happy eyeballs. */
- CINIT(HAPPY_EYEBALLS_TIMEOUT_MS, LONG, 271),
+ CURLOPT(CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, CURLOPTTYPE_LONG, 271),
/* Function that will be called before a resolver request is made */
- CINIT(RESOLVER_START_FUNCTION, FUNCTIONPOINT, 272),
+ CURLOPT(CURLOPT_RESOLVER_START_FUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 272),
/* User data to pass to the resolver start callback. */
- CINIT(RESOLVER_START_DATA, OBJECTPOINT, 273),
+ CURLOPT(CURLOPT_RESOLVER_START_DATA, CURLOPTTYPE_CBPOINT, 273),
/* send HAProxy PROXY protocol header? */
- CINIT(HAPROXYPROTOCOL, LONG, 274),
+ CURLOPT(CURLOPT_HAPROXYPROTOCOL, CURLOPTTYPE_LONG, 274),
/* shuffle addresses before use when DNS returns multiple */
- CINIT(DNS_SHUFFLE_ADDRESSES, LONG, 275),
+ CURLOPT(CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOPTTYPE_LONG, 275),
/* Specify which TLS 1.3 ciphers suites to use */
- CINIT(TLS13_CIPHERS, STRINGPOINT, 276),
- CINIT(PROXY_TLS13_CIPHERS, STRINGPOINT, 277),
+ CURLOPT(CURLOPT_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 276),
+ CURLOPT(CURLOPT_PROXY_TLS13_CIPHERS, CURLOPTTYPE_STRINGPOINT, 277),
/* Disallow specifying username/login in URL. */
- CINIT(DISALLOW_USERNAME_IN_URL, LONG, 278),
+ CURLOPT(CURLOPT_DISALLOW_USERNAME_IN_URL, CURLOPTTYPE_LONG, 278),
/* DNS-over-HTTPS URL */
- CINIT(DOH_URL, STRINGPOINT, 279),
+ CURLOPT(CURLOPT_DOH_URL, CURLOPTTYPE_STRINGPOINT, 279),
/* Preferred buffer size to use for uploads */
- CINIT(UPLOAD_BUFFERSIZE, LONG, 280),
+ CURLOPT(CURLOPT_UPLOAD_BUFFERSIZE, CURLOPTTYPE_LONG, 280),
/* Time in ms between connection upkeep calls for long-lived connections. */
- CINIT(UPKEEP_INTERVAL_MS, LONG, 281),
+ CURLOPT(CURLOPT_UPKEEP_INTERVAL_MS, CURLOPTTYPE_LONG, 281),
/* Specify URL using CURL URL API. */
- CINIT(CURLU, OBJECTPOINT, 282),
+ CURLOPT(CURLOPT_CURLU, CURLOPTTYPE_OBJECTPOINT, 282),
/* add trailing data just after no more data is available */
- CINIT(TRAILERFUNCTION, FUNCTIONPOINT, 283),
+ CURLOPT(CURLOPT_TRAILERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 283),
/* pointer to be passed to HTTP_TRAILER_FUNCTION */
- CINIT(TRAILERDATA, OBJECTPOINT, 284),
+ CURLOPT(CURLOPT_TRAILERDATA, CURLOPTTYPE_CBPOINT, 284),
/* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */
- CINIT(HTTP09_ALLOWED, LONG, 285),
+ CURLOPT(CURLOPT_HTTP09_ALLOWED, CURLOPTTYPE_LONG, 285),
/* alt-svc control bitmask */
- CINIT(ALTSVC_CTRL, LONG, 286),
+ CURLOPT(CURLOPT_ALTSVC_CTRL, CURLOPTTYPE_LONG, 286),
/* alt-svc cache file name to possibly read from/write to */
- CINIT(ALTSVC, STRINGPOINT, 287),
+ CURLOPT(CURLOPT_ALTSVC, CURLOPTTYPE_STRINGPOINT, 287),
/* maximum age of a connection to consider it for reuse (in seconds) */
- CINIT(MAXAGE_CONN, LONG, 288),
+ CURLOPT(CURLOPT_MAXAGE_CONN, CURLOPTTYPE_LONG, 288),
/* SASL authorisation identity */
- CINIT(SASL_AUTHZID, STRINGPOINT, 289),
+ CURLOPT(CURLOPT_SASL_AUTHZID, CURLOPTTYPE_STRINGPOINT, 289),
+
+ /* allow RCPT TO command to fail for some recipients */
+ CURLOPT(CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOPTTYPE_LONG, 290),
+
+ /* the private SSL-certificate as a "blob" */
+ CURLOPT(CURLOPT_SSLCERT_BLOB, CURLOPTTYPE_BLOB, 291),
+ CURLOPT(CURLOPT_SSLKEY_BLOB, CURLOPTTYPE_BLOB, 292),
+ CURLOPT(CURLOPT_PROXY_SSLCERT_BLOB, CURLOPTTYPE_BLOB, 293),
+ CURLOPT(CURLOPT_PROXY_SSLKEY_BLOB, CURLOPTTYPE_BLOB, 294),
+ CURLOPT(CURLOPT_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 295),
+
+ /* Issuer certificate for proxy */
+ CURLOPT(CURLOPT_PROXY_ISSUERCERT, CURLOPTTYPE_STRINGPOINT, 296),
+ CURLOPT(CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOPTTYPE_BLOB, 297),
+
+ /* the EC curves requested by the TLS client (RFC 8422, 5.1);
+ * OpenSSL support via 'set_groups'/'set_curves':
+ * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html
+ */
+ CURLOPT(CURLOPT_SSL_EC_CURVES, CURLOPTTYPE_STRINGPOINT, 298),
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;
@@ -2074,7 +2178,7 @@ typedef enum {
CURL_TIMECOND_LAST
} curl_TimeCond;
-/* Special size_t value signaling a zero-terminated string. */
+/* Special size_t value signaling a null-terminated string. */
#define CURL_ZERO_TERMINATED ((size_t) -1)
/* curl_strequal() and curl_strnequal() are subject for removal in a future
@@ -2083,8 +2187,8 @@ CURL_EXTERN int curl_strequal(const char *s1, const char *s2);
CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n);
/* Mime/form handling support. */
-typedef struct curl_mime_s curl_mime; /* Mime context. */
-typedef struct curl_mimepart_s curl_mimepart; /* Mime part context. */
+typedef struct curl_mime curl_mime; /* Mime context. */
+typedef struct curl_mimepart curl_mimepart; /* Mime part context. */
/*
* NAME curl_mime_init()
@@ -2207,52 +2311,35 @@ CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part,
struct curl_slist *headers,
int take_ownership);
-/* Old form API. */
-/* name is uppercase CURLFORM_<name> */
-#ifdef CFINIT
-#undef CFINIT
-#endif
-
-#ifdef CURL_ISOCPP
-#define CFINIT(name) CURLFORM_ ## name
-#else
-/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
-#define CFINIT(name) CURLFORM_/**/name
-#endif
-
typedef enum {
- CFINIT(NOTHING), /********* the first one is unused ************/
-
- /* */
- CFINIT(COPYNAME),
- CFINIT(PTRNAME),
- CFINIT(NAMELENGTH),
- CFINIT(COPYCONTENTS),
- CFINIT(PTRCONTENTS),
- CFINIT(CONTENTSLENGTH),
- CFINIT(FILECONTENT),
- CFINIT(ARRAY),
- CFINIT(OBSOLETE),
- CFINIT(FILE),
-
- CFINIT(BUFFER),
- CFINIT(BUFFERPTR),
- CFINIT(BUFFERLENGTH),
-
- CFINIT(CONTENTTYPE),
- CFINIT(CONTENTHEADER),
- CFINIT(FILENAME),
- CFINIT(END),
- CFINIT(OBSOLETE2),
-
- CFINIT(STREAM),
- CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */
+ CURLFORM_NOTHING, /********* the first one is unused ************/
+ CURLFORM_COPYNAME,
+ CURLFORM_PTRNAME,
+ CURLFORM_NAMELENGTH,
+ CURLFORM_COPYCONTENTS,
+ CURLFORM_PTRCONTENTS,
+ CURLFORM_CONTENTSLENGTH,
+ CURLFORM_FILECONTENT,
+ CURLFORM_ARRAY,
+ CURLFORM_OBSOLETE,
+ CURLFORM_FILE,
+
+ CURLFORM_BUFFER,
+ CURLFORM_BUFFERPTR,
+ CURLFORM_BUFFERLENGTH,
+
+ CURLFORM_CONTENTTYPE,
+ CURLFORM_CONTENTHEADER,
+ CURLFORM_FILENAME,
+ CURLFORM_END,
+ CURLFORM_OBSOLETE2,
+
+ CURLFORM_STREAM,
+ CURLFORM_CONTENTLEN, /* added in 7.46.0, provide a curl_off_t length */
CURLFORM_LASTENTRY /* the last unused */
} CURLformoption;
-#undef CFINIT /* done */
-
/* structure to be used as parameter for CURLFORM_ARRAY */
struct curl_forms {
CURLformoption option;
@@ -2423,7 +2510,7 @@ CURL_EXTERN CURLcode curl_global_init(long flags);
* initialize libcurl and set user defined memory management callback
* functions. Users can implement memory management routines to check for
* memory leaks, check for mis-use of the curl library etc. User registered
- * callback routines with be invoked by this library instead of the system
+ * callback routines will be invoked by this library instead of the system
* memory management routines like malloc, free etc.
*/
CURL_EXTERN CURLcode curl_global_init_mem(long flags,
@@ -2475,10 +2562,11 @@ struct curl_slist {
* subsequent attempt to change it will result in a CURLSSLSET_TOO_LATE.
*/
-typedef struct {
+struct curl_ssl_backend {
curl_sslbackend id;
const char *name;
-} curl_ssl_backend;
+};
+typedef struct curl_ssl_backend curl_ssl_backend;
typedef enum {
CURLSSLSET_OK = 0,
@@ -2606,10 +2694,6 @@ typedef enum {
CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47,
CURLINFO_PROTOCOL = CURLINFO_LONG + 48,
CURLINFO_SCHEME = CURLINFO_STRING + 49,
- /* Fill in new entries below here! */
-
- /* Preferably these would be defined conditionally based on the
- sizeof curl_off_t being 64-bits */
CURLINFO_TOTAL_TIME_T = CURLINFO_OFF_T + 50,
CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51,
CURLINFO_CONNECT_TIME_T = CURLINFO_OFF_T + 52,
@@ -2618,8 +2702,10 @@ typedef enum {
CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55,
CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
CURLINFO_RETRY_AFTER = CURLINFO_OFF_T + 57,
+ CURLINFO_EFFECTIVE_METHOD = CURLINFO_STRING + 58,
+ CURLINFO_PROXY_ERROR = CURLINFO_LONG + 59,
- CURLINFO_LASTONE = 57
+ CURLINFO_LASTONE = 59
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
@@ -2719,6 +2805,8 @@ typedef enum {
CURLVERSION_FOURTH,
CURLVERSION_FIFTH,
CURLVERSION_SIXTH,
+ CURLVERSION_SEVENTH,
+ CURLVERSION_EIGHTH,
CURLVERSION_LAST /* never actually use this */
} CURLversion;
@@ -2727,9 +2815,9 @@ typedef enum {
meant to be a built-in version number for what kind of struct the caller
expects. If the struct ever changes, we redefine the NOW to another enum
from above. */
-#define CURLVERSION_NOW CURLVERSION_SIXTH
+#define CURLVERSION_NOW CURLVERSION_EIGHTH
-typedef struct {
+struct curl_version_info_data {
CURLversion age; /* age of the returned struct */
const char *version; /* LIBCURL_VERSION */
unsigned int version_num; /* LIBCURL_VERSION_NUM */
@@ -2766,7 +2854,20 @@ typedef struct {
const char *nghttp2_version; /* human readable string. */
const char *quic_version; /* human readable quic (+ HTTP/3) library +
version or NULL */
-} curl_version_info_data;
+
+ /* These fields were added in CURLVERSION_SEVENTH */
+ const char *cainfo; /* the built-in default CURLOPT_CAINFO, might
+ be NULL */
+ const char *capath; /* the built-in default CURLOPT_CAPATH, might
+ be NULL */
+
+ /* These fields were added in CURLVERSION_EIGHTH */
+ unsigned int zstd_ver_num; /* Numeric Zstd version
+ (MAJOR << 24) | (MINOR << 12) | PATCH */
+ const char *zstd_version; /* human readable string. */
+
+};
+typedef struct curl_version_info_data curl_version_info_data;
#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */
#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported
@@ -2799,8 +2900,8 @@ typedef struct {
#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */
#define CURL_VERSION_ALTSVC (1<<24) /* Alt-Svc handling built-in */
#define CURL_VERSION_HTTP3 (1<<25) /* HTTP3 support built-in */
-
-#define CURL_VERSION_ESNI (1<<26) /* ESNI support */
+#define CURL_VERSION_ZSTD (1<<26) /* zstd features are present */
+#define CURL_VERSION_UNICODE (1<<27) /* Unicode support on Windows */
/*
* NAME curl_version_info()
@@ -2863,6 +2964,7 @@ CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
#include "easy.h" /* nothing in curl is fun without the easy stuff */
#include "multi.h"
#include "urlapi.h"
+#include "options.h"
/* the typechecker doesn't work in C++ (yet) */
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
diff --git a/include/curl/curlver.h b/include/curl/curlver.h
index cab09eebd..2c3010e19 100644
--- a/include/curl/curlver.h
+++ b/include/curl/curlver.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,20 +26,20 @@
a script at release-time. This was made its own header file in 7.11.2 */
/* This is the global package copyright */
-#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."
+#define LIBCURL_COPYRIGHT "1996 - 2020 Daniel Stenberg, <daniel@haxx.se>."
/* This is the version number of the libcurl package from which this header
file origins: */
-#define LIBCURL_VERSION "7.67.0"
+#define LIBCURL_VERSION "7.73.0"
/* The numeric version number is also available "in parts" by using these
defines: */
#define LIBCURL_VERSION_MAJOR 7
-#define LIBCURL_VERSION_MINOR 67
+#define LIBCURL_VERSION_MINOR 73
#define LIBCURL_VERSION_PATCH 0
/* This is the numeric version of the libcurl version number, meant for easier
- parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
+ parsing and comparisons by programs. The LIBCURL_VERSION_NUM define will
always follow this syntax:
0xXXYYZZ
@@ -57,7 +57,7 @@
CURL_VERSION_BITS() macro since curl's own configure script greps for it
and needs it to contain the full number.
*/
-#define LIBCURL_VERSION_NUM 0x074300
+#define LIBCURL_VERSION_NUM 0x074900
/*
* This is the date and time when the full source package was created. The
@@ -68,7 +68,7 @@
*
* "2007-11-23"
*/
-#define LIBCURL_TIMESTAMP "2019-11-06"
+#define LIBCURL_TIMESTAMP "2020-10-14"
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
#define CURL_AT_LEAST_VERSION(x,y,z) \
diff --git a/include/curl/easy.h b/include/curl/easy.h
index 592f5d3c1..9aef13396 100644
--- a/include/curl/easy.h
+++ b/include/curl/easy.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,6 +25,17 @@
extern "C" {
#endif
+/* Flag bits in the curl_blob struct: */
+#define CURL_BLOB_COPY 1 /* tell libcurl to copy the data */
+#define CURL_BLOB_NOCOPY 0 /* tell libcurl to NOT copy the data */
+
+struct curl_blob {
+ void *data;
+ size_t len;
+ unsigned int flags; /* bit 0 is defined, the rest are reserved and should be
+ left zeroes */
+};
+
CURL_EXTERN CURL *curl_easy_init(void);
CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
diff --git a/include/curl/multi.h b/include/curl/multi.h
index b39218395..b911ba92d 100644
--- a/include/curl/multi.h
+++ b/include/curl/multi.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,6 +72,8 @@ typedef enum {
attempted to get added - again */
CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
callback */
+ CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */
+ CURLM_BAD_FUNCTION_ARGUMENT, /* function called with a bad parameter */
CURLM_LAST
} CURLMcode;
@@ -187,6 +189,15 @@ CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
int timeout_ms,
int *ret);
+/*
+ * Name: curl_multi_wakeup()
+ *
+ * Desc: wakes up a sleeping curl_multi_poll call.
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
+
/*
* Name: curl_multi_perform()
*
@@ -256,7 +267,7 @@ CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
* value into the equivalent human readable error string. This is
* useful for printing meaningful error messages.
*
- * Returns: A pointer to a zero-terminated error message.
+ * Returns: A pointer to a null-terminated error message.
*/
CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
@@ -333,71 +344,56 @@ CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
long *milliseconds);
-#undef CINIT /* re-using the same name as in curl.h */
-
-#ifdef CURL_ISOCPP
-#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num
-#else
-/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
-#define LONG CURLOPTTYPE_LONG
-#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
-#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
-#define OFF_T CURLOPTTYPE_OFF_T
-#define CINIT(name,type,number) CURLMOPT_/**/name = type + number
-#endif
-
typedef enum {
/* This is the socket callback function pointer */
- CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1),
+ CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1),
/* This is the argument passed to the socket callback */
- CINIT(SOCKETDATA, OBJECTPOINT, 2),
+ CURLOPT(CURLMOPT_SOCKETDATA, CURLOPTTYPE_OBJECTPOINT, 2),
/* set to 1 to enable pipelining for this multi handle */
- CINIT(PIPELINING, LONG, 3),
+ CURLOPT(CURLMOPT_PIPELINING, CURLOPTTYPE_LONG, 3),
/* This is the timer callback function pointer */
- CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4),
+ CURLOPT(CURLMOPT_TIMERFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 4),
/* This is the argument passed to the timer callback */
- CINIT(TIMERDATA, OBJECTPOINT, 5),
+ CURLOPT(CURLMOPT_TIMERDATA, CURLOPTTYPE_OBJECTPOINT, 5),
/* maximum number of entries in the connection cache */
- CINIT(MAXCONNECTS, LONG, 6),
+ CURLOPT(CURLMOPT_MAXCONNECTS, CURLOPTTYPE_LONG, 6),
/* maximum number of (pipelining) connections to one host */
- CINIT(MAX_HOST_CONNECTIONS, LONG, 7),
+ CURLOPT(CURLMOPT_MAX_HOST_CONNECTIONS, CURLOPTTYPE_LONG, 7),
/* maximum number of requests in a pipeline */
- CINIT(MAX_PIPELINE_LENGTH, LONG, 8),
+ CURLOPT(CURLMOPT_MAX_PIPELINE_LENGTH, CURLOPTTYPE_LONG, 8),
/* a connection with a content-length longer than this
will not be considered for pipelining */
- CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9),
+ CURLOPT(CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 9),
/* a connection with a chunk length longer than this
will not be considered for pipelining */
- CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10),
+ CURLOPT(CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLOPTTYPE_OFF_T, 10),
- /* a list of site names(+port) that are blacklisted from
- pipelining */
- CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11),
+ /* a list of site names(+port) that are blocked from pipelining */
+ CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11),
- /* a list of server types that are blacklisted from
- pipelining */
- CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12),
+ /* a list of server types that are blocked from pipelining */
+ CURLOPT(CURLMOPT_PIPELINING_SERVER_BL, CURLOPTTYPE_OBJECTPOINT, 12),
/* maximum number of open connections in total */
- CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13),
+ CURLOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPTTYPE_LONG, 13),
/* This is the server push callback function pointer */
- CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14),
+ CURLOPT(CURLMOPT_PUSHFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 14),
/* This is the argument passed to the server push callback */
- CINIT(PUSHDATA, OBJECTPOINT, 15),
+ CURLOPT(CURLMOPT_PUSHDATA, CURLOPTTYPE_OBJECTPOINT, 15),
/* maximum number of concurrent streams to support on a connection */
- CINIT(MAX_CONCURRENT_STREAMS, LONG, 16),
+ CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16),
CURLMOPT_LASTENTRY /* the last unused */
} CURLMoption;
@@ -431,12 +427,14 @@ CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,
* Name: curl_push_callback
*
* Desc: This callback gets called when a new stream is being pushed by the
- * server. It approves or denies the new stream.
+ * server. It approves or denies the new stream. It can also decide
+ * to completely fail the connection.
*
- * Returns: CURL_PUSH_OK or CURL_PUSH_DENY.
+ * Returns: CURL_PUSH_OK, CURL_PUSH_DENY or CURL_PUSH_ERROROUT
*/
-#define CURL_PUSH_OK 0
-#define CURL_PUSH_DENY 1
+#define CURL_PUSH_OK 0
+#define CURL_PUSH_DENY 1
+#define CURL_PUSH_ERROROUT 2 /* added in 7.72.0 */
struct curl_pushheaders; /* forward declaration only */
@@ -451,9 +449,6 @@ typedef int (*curl_push_callback)(CURL *parent,
struct curl_pushheaders *headers,
void *userp);
-/* value for MAXIMUM CONCURRENT STREAMS upper limit */
-#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1)
-
#ifdef __cplusplus
} /* end of extern "C" */
#endif
diff --git a/include/curl/options.h b/include/curl/options.h
new file mode 100644
index 000000000..f3bd8e191
--- /dev/null
+++ b/include/curl/options.h
@@ -0,0 +1,68 @@
+#ifndef CURLINC_OPTIONS_H
+#define CURLINC_OPTIONS_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ CURLOT_LONG, /* long (a range of values) */
+ CURLOT_VALUES, /* (a defined set or bitmask) */
+ CURLOT_OFF_T, /* curl_off_t (a range of values) */
+ CURLOT_OBJECT, /* pointer (void *) */
+ CURLOT_STRING, /* (char * to zero terminated buffer) */
+ CURLOT_SLIST, /* (struct curl_slist *) */
+ CURLOT_CBPTR, /* (void * passed as-is to a callback) */
+ CURLOT_BLOB, /* blob (struct curl_blob *) */
+ CURLOT_FUNCTION /* function pointer */
+} curl_easytype;
+
+/* Flag bits */
+
+/* "alias" means it is provided for old programs to remain functional,
+ we prefer another name */
+#define CURLOT_FLAG_ALIAS (1<<0)
+
+/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size
+ to use for curl_easy_setopt() for the given id */
+struct curl_easyoption {
+ const char *name;
+ CURLoption id;
+ curl_easytype type;
+ unsigned int flags;
+};
+
+CURL_EXTERN const struct curl_easyoption *
+curl_easy_option_by_name(const char *name);
+
+CURL_EXTERN const struct curl_easyoption *
+curl_easy_option_by_id (CURLoption id);
+
+CURL_EXTERN const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev);
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+#endif /* CURLINC_OPTIONS_H */
diff --git a/include/curl/system.h b/include/curl/system.h
index cd37c2bf5..867af6141 100644
--- a/include/curl/system.h
+++ b/include/curl/system.h
@@ -137,15 +137,26 @@
# define CURL_TYPEOF_CURL_SOCKLEN_T int
#elif defined(__LCC__)
-# define CURL_TYPEOF_CURL_OFF_T long
-# define CURL_FORMAT_CURL_OFF_T "ld"
-# define CURL_FORMAT_CURL_OFF_TU "lu"
-# define CURL_SUFFIX_CURL_OFF_T L
-# define CURL_SUFFIX_CURL_OFF_TU UL
-# define CURL_TYPEOF_CURL_SOCKLEN_T int
+# if defined(__e2k__) /* MCST eLbrus C Compiler */
+# define CURL_TYPEOF_CURL_OFF_T long
+# define CURL_FORMAT_CURL_OFF_T "ld"
+# define CURL_FORMAT_CURL_OFF_TU "lu"
+# define CURL_SUFFIX_CURL_OFF_T L
+# define CURL_SUFFIX_CURL_OFF_TU UL
+# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+# define CURL_PULL_SYS_TYPES_H 1
+# define CURL_PULL_SYS_SOCKET_H 1
+# else /* Local (or Little) C Compiler */
+# define CURL_TYPEOF_CURL_OFF_T long
+# define CURL_FORMAT_CURL_OFF_T "ld"
+# define CURL_FORMAT_CURL_OFF_TU "lu"
+# define CURL_SUFFIX_CURL_OFF_T L
+# define CURL_SUFFIX_CURL_OFF_TU UL
+# define CURL_TYPEOF_CURL_SOCKLEN_T int
+# endif
#elif defined(__SYMBIAN32__)
-# if defined(__EABI__) /* Treat all ARM compilers equally */
+# if defined(__EABI__) /* Treat all ARM compilers equally */
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
@@ -288,7 +299,6 @@
# define CURL_TYPEOF_CURL_SOCKLEN_T int
#elif defined(__TINYC__) /* also known as tcc */
-
# define CURL_TYPEOF_CURL_OFF_T long long
# define CURL_FORMAT_CURL_OFF_T "lld"
# define CURL_FORMAT_CURL_OFF_TU "llu"
@@ -377,6 +387,7 @@
# define CURL_SUFFIX_CURL_OFF_TU ULL
# elif defined(__LP64__) || \
defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
+ defined(__e2k__) || \
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
(defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
# define CURL_TYPEOF_CURL_OFF_T long
diff --git a/include/curl/typecheck-gcc.h b/include/curl/typecheck-gcc.h
index 03c84fc85..318ab0abb 100644
--- a/include/curl/typecheck-gcc.h
+++ b/include/curl/typecheck-gcc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -248,7 +248,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
#define curlcheck_off_t_option(option) \
- ((option) > CURLOPTTYPE_OFF_T)
+ (((option) > CURLOPTTYPE_OFF_T) && ((option) < CURLOPTTYPE_BLOB))
/* evaluates to true if option takes a char* argument */
#define curlcheck_string_option(option) \
@@ -292,6 +292,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_PROXY_CAINFO || \
(option) == CURLOPT_PROXY_CAPATH || \
(option) == CURLOPT_PROXY_CRLFILE || \
+ (option) == CURLOPT_PROXY_ISSUERCERT || \
(option) == CURLOPT_PROXY_KEYPASSWD || \
(option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \
(option) == CURLOPT_PROXY_SERVICE_NAME || \
@@ -334,6 +335,7 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_USERNAME || \
(option) == CURLOPT_USERPWD || \
(option) == CURLOPT_XOAUTH2_BEARER || \
+ (option) == CURLOPT_SSL_EC_CURVES || \
0)
/* evaluates to true if option takes a curl_write_callback argument */
@@ -357,7 +359,6 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
(option) == CURLOPT_INTERLEAVEDATA || \
(option) == CURLOPT_IOCTLDATA || \
(option) == CURLOPT_OPENSOCKETDATA || \
- (option) == CURLOPT_PRIVATE || \
(option) == CURLOPT_PROGRESSDATA || \
(option) == CURLOPT_READDATA || \
(option) == CURLOPT_SEEKDATA || \
@@ -392,8 +393,9 @@ CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
/* groups of curl_easy_getinfo infos that take the same type of argument */
/* evaluates to true if info expects a pointer to char * argument */
-#define curlcheck_string_info(info) \
- (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
+#define curlcheck_string_info(info) \
+ (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG && \
+ (info) != CURLINFO_PRIVATE)
/* evaluates to true if info expects a pointer to long argument */
#define curlcheck_long_info(info) \
diff --git a/install-sh b/install-sh
index 8175c640f..20d8b2eae 100755
--- a/install-sh
+++ b/install-sh
@@ -451,7 +451,18 @@ do
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
# Copy the file name to the temp name.
- (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
# and set any options; do chmod last to preserve setuid bits.
#
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index eca9a8af9..911c9096d 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
set(LIB_NAME libcurl)
if(BUILD_SHARED_LIBS)
@@ -20,7 +41,6 @@ list(APPEND HHEADERS
if(MSVC)
list(APPEND CSOURCES libcurl.rc)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
endif()
# SET(CSOURCES
@@ -30,15 +50,6 @@ endif()
# # strtoofft.c - specify later
# )
-# # if we have Kerberos 4, right now this is never on
-# #OPTION(CURL_KRB4 "Use Kerberos 4" OFF)
-# IF(CURL_KRB4)
-# SET(CSOURCES ${CSOURCES}
-# krb4.c
-# security.c
-# )
-# ENDIF(CURL_KRB4)
-
# #OPTION(CURL_MALLOC_DEBUG "Debug mallocs in Curl" OFF)
# MARK_AS_ADVANCED(CURL_MALLOC_DEBUG)
# IF(CURL_MALLOC_DEBUG)
@@ -72,6 +83,11 @@ add_library(
${HHEADERS} ${CSOURCES}
)
+add_library(
+ ${PROJECT_NAME}::${LIB_NAME}
+ ALIAS ${LIB_NAME}
+ )
+
if(MSVC AND NOT BUILD_SHARED_LIBS)
set_target_properties(${LIB_NAME} PROPERTIES STATIC_LIBRARY_FLAGS ${CMAKE_EXE_LINKER_FLAGS})
endif()
@@ -97,6 +113,12 @@ endif()
set_target_properties(${LIB_NAME} PROPERTIES PREFIX "")
set_target_properties(${LIB_NAME} PROPERTIES IMPORT_PREFIX "")
+if(CURL_HAS_LTO)
+ set_target_properties(${LIB_NAME} PROPERTIES
+ INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE
+ INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
+endif()
+
if(WIN32)
if(BUILD_SHARED_LIBS)
# Add "_imp" as a suffix before the extension to avoid conflicting with the statically linked "libcurl.lib"
@@ -117,5 +139,5 @@ install(TARGETS ${LIB_NAME}
export(TARGETS ${LIB_NAME}
APPEND FILE ${PROJECT_BINARY_DIR}/libcurl-target.cmake
- NAMESPACE CURL::
+ NAMESPACE ${PROJECT_NAME}::
)
diff --git a/lib/Makefile.Watcom b/lib/Makefile.Watcom
deleted file mode 100644
index 942cd0c7b..000000000
--- a/lib/Makefile.Watcom
+++ /dev/null
@@ -1,274 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2005 - 2009, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2005 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-#***************************************************************************
-
-#
-# Watcom / OpenWatcom / Win32 makefile for libcurl.
-#
-
-.ERASE
-
-!if $(__VERSION__) < 1280
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!message ! This Open Watcom version is too old and is no longer supported !
-!message ! Please download latest version from www.openwatcom.org !
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!error Unsupported version of Open Watcom
-!endif
-
-!ifndef %watcom
-!error WATCOM environment variable not set!
-!endif
-
-# In order to process Makefile.inc wmake must be called with -u switch!
-!ifndef %MAKEFLAGS
-!error You MUST call wmake with the -u switch!
-!endif
-
-!ifdef %libname
-LIBNAME = $(%libname)
-!else
-LIBNAME = libcurl
-!endif
-TARGETS = $(LIBNAME).dll $(LIBNAME).lib
-
-CC = wcc386
-LD = wlink
-AR = wlib
-RC = wrc
-
-!ifdef __LOADDLL__
-! loaddll wcc386 wccd386
-! loaddll wpp386 wppd386
-! loaddll wlib wlibd
-! loaddll wlink wlinkd
-!endif
-
-!ifdef __LINUX__
-CP = cp
-MD = mkdir -p
-!else
-CP = copy 2>NUL
-MD = mkdir
-!endif
-!if $(__VERSION__) > 1290
-RD = rm -rf
-!else ifdef __UNIX__
-RD = rm -rf
-!else
-RD = rmdir /q /s 2>NUL
-!endif
-
-SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h"
-
-CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm &
- -wcd=201 -bt=nt -d+ -dWIN32 &
- -dBUILDING_LIBCURL -I. -I"../include" $(SYS_INCL)
-
-!ifdef %debug
-DEBUG = -dDEBUG=1 -dDEBUGBUILD
-CFLAGS += -d3 $(DEBUG)
-!else
-CFLAGS += -d0
-!endif
-
-!ifdef %use_ipv6
-CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6
-!endif
-
-!ifdef %use_sspi
-CFLAGS += -dUSE_WINDOWS_SSPI
-!endif
-
-!ifdef %use_winssl
-CFLAGS += -dUSE_WINDOWS_SSPI
-CFLAGS += -DUSE_SCHANNEL
-!endif
-
-!ifdef %use_winidn
-CFLAGS += -dWINVER=0x0600 -dUSE_WIN32_IDN
-! if $(__VERSION__) <= 1290
-CFLAGS += -dWANT_IDN_PROTOTYPES
-! endif
-!endif
-
-#
-# Change to suite.
-#
-!ifdef %zlib_root
-ZLIB_ROOT = $(%zlib_root)
-!else
-ZLIB_ROOT = ../../zlib-1.2.8
-!endif
-
-!ifdef %libssh2_root
-LIBSSH2_ROOT = $(%libssh2_root)
-!else
-LIBSSH2_ROOT = ../../libssh2-1.5.0
-!endif
-
-!ifdef %librtmp_root
-LIBRTMP_ROOT = $(%librtmp_root)
-!else
-LIBRTMP_ROOT = ../../rtmpdump-2.3
-!endif
-
-!ifdef %openssl_root
-OPENSSL_ROOT = $(%openssl_root)
-!else
-OPENSSL_ROOT = ../../openssl-1.0.2a
-!endif
-
-!ifdef %ares_root
-ARES_ROOT = $(%ares_root)
-!else
-ARES_ROOT = ../ares
-!endif
-
-!ifdef %use_zlib
-CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I"$(ZLIB_ROOT)"
-!endif
-
-!ifdef %use_rtmp
-CFLAGS += -dUSE_LIBRTMP -I"$(LIBRTMP_ROOT)"
-!endif
-
-!ifdef %use_ssh2
-CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH2_ROOT)/win32"
-!endif
-
-!ifdef %use_ssl
-CFLAGS += -wcd=138 -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32"
-!endif
-
-!ifdef %use_ares
-CFLAGS += -dUSE_ARES -I"$(ARES_ROOT)"
-!endif
-
-!ifdef %use_watt32
-CFLAGS += -dUSE_WATT32 -I"$(%watt_root)/inc"
-!endif
-
-OBJ_BASE = WC_Win32.obj
-!if $(__VERSION__) > 1290
-OBJ_STAT = $(OBJ_BASE)/stat
-OBJ_DYN = $(OBJ_BASE)/dyn
-!else ifdef __UNIX__
-OBJ_STAT = $(OBJ_BASE)/stat
-OBJ_DYN = $(OBJ_BASE)/dyn
-!else
-OBJ_STAT = $(OBJ_BASE)\stat
-OBJ_DYN = $(OBJ_BASE)\dyn
-!endif
-
-LINK_ARG = $(OBJ_DYN)/wlink.arg
-LIB_ARG = $(OBJ_STAT)/wlib.arg
-
-!include Makefile.inc
-
-OBJS1 = ./$(CSOURCES:.c=.obj)
-OBJS2 = $(OBJS1:vtls/=)
-OBJS3 = $(OBJS2:vauth/=)
-OBJS4 = $(OBJS3: = ./)
-OBJS_STAT = $(OBJS4:./=$(OBJ_STAT)/)
-OBJS_DYN = $(OBJS4:./=$(OBJ_DYN)/)
-
-RESOURCE = $(OBJ_DYN)/libcurl.res
-
-DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn
-
-.c : vauth vtls
-
-all: $(DIRS) $(TARGETS) .SYMBOLIC
- @echo Welcome to libcurl
-
-clean: .SYMBOLIC
- -rm -f $(OBJS_STAT)
- -rm -f $(OBJS_DYN)
- -rm -f $(RESOURCE) $(LINK_ARG) $(LIB_ARG)
-
-vclean distclean: clean .SYMBOLIC
- -rm -f $(TARGETS) $(LIBNAME).map $(LIBNAME).sym
- -$(RD) $(OBJ_STAT)
- -$(RD) $(OBJ_DYN)
- -$(RD) $(OBJ_BASE)
-
-$(DIRS):
- -$(MD) $^@
-
-$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__)
- %create $(LINK_ARG)
- @%append $(LINK_ARG) system nt dll
-!ifdef %debug
- @%append $(LINK_ARG) debug all
- @%append $(LINK_ARG) option symfile
-!endif
- @%append $(LINK_ARG) option quiet, caseexact, eliminate
- @%append $(LINK_ARG) option map=$(OBJ_DYN)/$(LIBNAME).map
- @%append $(LINK_ARG) option implib=$(LIBNAME)_imp.lib
- @%append $(LINK_ARG) option res=$(RESOURCE)
- @for %f in ($(OBJS_DYN)) do @%append $(LINK_ARG) file %f
- @%append $(LINK_ARG) library wldap32.lib
-!ifdef %use_watt32
- @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib'
-!else
- @%append $(LINK_ARG) library ws2_32.lib
-!endif
-!ifdef %use_zlib
- @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib'
-!endif
-!ifdef %use_rtmp
- @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib'
-!endif
-!ifdef %use_ssh2
- @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib'
-!endif
-!ifdef %use_ssl
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib'
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib'
-!endif
-!ifdef %use_ares
- @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib'
-!endif
-!ifdef %use_winidn
-! if $(__VERSION__) > 1290
- @%append $(LINK_ARG) library normaliz.lib
-! else
- @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii'
- @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode'
-! endif
-!endif
- $(LD) name $^@ @$(LINK_ARG)
-
-$(LIBNAME).lib: $(OBJS_STAT)
- %create $(LIB_ARG)
- @for %f in ($<) do @%append $(LIB_ARG) +- %f
- $(AR) -q -b -c -pa $^@ @$(LIB_ARG)
-
-$(RESOURCE): libcurl.rc
- $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@
-
-.c{$(OBJ_DYN)}.obj:
- $(CC) $(CFLAGS) -bd -br $[@ -fo=$^@
-
-.c{$(OBJ_STAT)}.obj:
- $(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 516a2394d..78b068ffe 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -27,9 +27,10 @@ EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h \
config-plan9.h config-riscos.h config-mac.h curl_config.h.in \
makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h \
- config-os400.h setup-os400.h config-symbian.h Makefile.Watcom \
+ config-os400.h setup-os400.h \
config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST) \
- firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl
+ firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl \
+ setup-win32.h
lib_LTLIBRARIES = libcurl.la
@@ -65,7 +66,7 @@ endif
# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)
-VERSIONINFO=-version-info 10:0:6
+VERSIONINFO=-version-info 11:0:7
# This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1.
@@ -152,3 +153,6 @@ TIDY:=clang-tidy
tidy:
$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
+
+optiontable:
+ perl optiontable.pl < $(top_srcdir)/include/curl/curl.h > easyoptions.c
diff --git a/lib/Makefile.inc b/lib/Makefile.inc
index 72ef428ee..a2fd57a83 100644
--- a/lib/Makefile.inc
+++ b/lib/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -20,73 +20,71 @@
#
###########################################################################
-LIB_VAUTH_CFILES = vauth/vauth.c vauth/cleartext.c vauth/cram.c \
- vauth/digest.c vauth/digest_sspi.c vauth/krb5_gssapi.c \
- vauth/krb5_sspi.c vauth/ntlm.c vauth/ntlm_sspi.c vauth/oauth2.c \
- vauth/spnego_gssapi.c vauth/spnego_sspi.c
+LIB_VAUTH_CFILES = vauth/cleartext.c vauth/cram.c vauth/digest.c \
+ vauth/digest_sspi.c vauth/krb5_gssapi.c vauth/krb5_sspi.c vauth/ntlm.c \
+ vauth/ntlm_sspi.c vauth/oauth2.c vauth/spnego_gssapi.c vauth/spnego_sspi.c \
+ vauth/vauth.c
-LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.h
+LIB_VAUTH_HFILES = vauth/digest.h vauth/ntlm.h vauth/vauth.h
-LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \
- vtls/polarssl.c vtls/polarssl_threadlock.c \
- vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c \
- vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c
+LIB_VTLS_CFILES = vtls/bearssl.c vtls/gskit.c vtls/gtls.c vtls/keylog.c \
+ vtls/mbedtls.c vtls/mbedtls_threadlock.c vtls/mesalink.c vtls/nss.c \
+ vtls/openssl.c vtls/schannel.c vtls/schannel_verify.c vtls/sectransp.c \
+ vtls/vtls.c vtls/wolfssl.c
-LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h \
- vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h \
- vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h \
- vtls/mbedtls.h vtls/mesalink.h
+LIB_VTLS_HFILES = vtls/bearssl.h vtls/gskit.h vtls/gtls.h vtls/keylog.h \
+ vtls/mbedtls.h vtls/mbedtls_threadlock.h vtls/mesalink.h vtls/nssg.h \
+ vtls/openssl.h vtls/schannel.h vtls/sectransp.h vtls/vtls.h vtls/wolfssl.h
-LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
+LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c vquic/vquic.c
-LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
+LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h vquic/vquic.h
-LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
+LIB_VSSH_CFILES = vssh/libssh.c vssh/libssh2.c vssh/wolfssh.c
-LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
- cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \
- ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c \
- getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c \
- fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
- strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c \
- http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c \
- strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c \
- inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c \
- curl_addrinfo.c socks_gssapi.c socks_sspi.c \
- curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c \
- pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c \
- openldap.c curl_gethostname.c gopher.c idn_win32.c \
- http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c \
- http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c \
- curl_multibyte.c hostcheck.c conncache.c dotdot.c \
- x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
- mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c \
- doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c
+LIB_VSSH_HFILES = vssh/ssh.h
-LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
- formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
- speedcheck.h urldata.h curl_ldap.h escape.h telnet.h getinfo.h \
- strcase.h curl_sec.h memdebug.h http_chunks.h curl_fnmatch.h \
- wildcard.h fileinfo.h ftplistparser.h strtok.h connect.h llist.h \
- hash.h content_encoding.h share.h curl_md4.h curl_md5.h http_digest.h \
- http_negotiate.h inet_pton.h amigaos.h strtoofft.h strerror.h \
- inet_ntop.h curlx.h curl_memory.h curl_setup.h transfer.h select.h \
- easyif.h multiif.h parsedate.h tftp.h sockaddr.h splay.h strdup.h \
- socks.h ssh.h curl_base64.h curl_addrinfo.h curl_sspi.h \
- slist.h nonblock.h curl_memrchr.h imap.h pop3.h smtp.h pingpong.h \
- rtsp.h curl_threads.h warnless.h curl_hmac.h curl_rtmp.h \
- curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h \
- http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h \
- curl_sasl.h curl_multibyte.h hostcheck.h conncache.h \
- curl_setup_once.h multihandle.h setup-vms.h dotdot.h \
- x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
- curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h \
- curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h \
- curl_get_line.h altsvc.h quic.h socketpair.h
+LIB_CFILES = altsvc.c amigaos.c asyn-ares.c asyn-thread.c base64.c \
+ conncache.c connect.c content_encoding.c cookie.c curl_addrinfo.c \
+ curl_ctype.c curl_des.c curl_endian.c curl_fnmatch.c curl_get_line.c \
+ curl_gethostname.c curl_gssapi.c curl_memrchr.c curl_multibyte.c \
+ curl_ntlm_core.c curl_ntlm_wb.c curl_path.c curl_range.c curl_rtmp.c \
+ curl_sasl.c curl_sspi.c curl_threads.c dict.c dotdot.c easy.c escape.c \
+ file.c fileinfo.c formdata.c ftp.c url.c ftplistparser.c getenv.c getinfo.c \
+ gopher.c hash.c hmac.c hostasyn.c hostcheck.c hostip.c hostip4.c hostip6.c \
+ hostsyn.c http.c http2.c http_chunks.c http_digest.c http_negotiate.c \
+ http_ntlm.c http_proxy.c idn_win32.c if2ip.c imap.c inet_ntop.c inet_pton.c \
+ krb5.c ldap.c llist.c md4.c md5.c memdebug.c mime.c mprintf.c mqtt.c \
+ multi.c netrc.c non-ascii.c nonblock.c openldap.c parsedate.c pingpong.c \
+ pop3.c progress.c psl.c doh.c rand.c rename.c rtsp.c select.c \
+ sendf.c setopt.c sha256.c share.c slist.c smb.c smtp.c socketpair.c socks.c \
+ socks_gssapi.c socks_sspi.c speedcheck.c splay.c strcase.c strdup.c \
+ strerror.c strtok.c strtoofft.c system_win32.c telnet.c tftp.c timeval.c \
+ transfer.c urlapi.c version.c warnless.c wildcard.c x509asn1.c dynbuf.c \
+ version_win32.c easyoptions.c easygetopt.c
+
+LIB_HFILES = altsvc.h amigaos.h arpa_telnet.h asyn.h conncache.h connect.h \
+ content_encoding.h cookie.h curl_addrinfo.h curl_base64.h curl_ctype.h \
+ curl_des.h curl_endian.h curl_fnmatch.h curl_get_line.h curl_gethostname.h \
+ curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memory.h \
+ curl_memrchr.h curl_multibyte.h curl_ntlm_core.h curl_ntlm_wb.h curl_path.h \
+ curl_printf.h curl_range.h curl_rtmp.h curl_sasl.h curl_krb5.h curl_setup.h \
+ curl_setup_once.h curl_sha256.h curl_sspi.h curl_threads.h curlx.h dict.h \
+ dotdot.h easyif.h escape.h file.h fileinfo.h formdata.h ftp.h url.h \
+ ftplistparser.h getinfo.h gopher.h hash.h hostcheck.h hostip.h http.h \
+ http2.h http_chunks.h http_digest.h http_negotiate.h http_ntlm.h \
+ http_proxy.h if2ip.h imap.h inet_ntop.h inet_pton.h llist.h memdebug.h \
+ mime.h mqtt.h multihandle.h multiif.h netrc.h non-ascii.h nonblock.h \
+ parsedate.h pingpong.h pop3.h progress.h psl.h doh.h quic.h rand.h rename.h \
+ rtsp.h select.h sendf.h setopt.h setup-vms.h share.h sigpipe.h slist.h \
+ smb.h smtp.h sockaddr.h socketpair.h socks.h speedcheck.h splay.h strcase.h \
+ strdup.h strerror.h strtok.h strtoofft.h system_win32.h telnet.h tftp.h \
+ timeval.h transfer.h urlapi-int.h urldata.h warnless.h wildcard.h \
+ x509asn1.h dynbuf.h version_win32.h easyoptions.h
LIB_RCFILES = libcurl.rc
CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
$(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
- $(LIB_VQUIC_HFILES)
+ $(LIB_VQUIC_HFILES) $(LIB_VSSH_HFILES)
diff --git a/lib/Makefile.m32 b/lib/Makefile.m32
index ae88f4dce..37887eed5 100644
--- a/lib/Makefile.m32
+++ b/lib/Makefile.m32
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
#
## Makefile for building libcurl.a with MingW (GCC-3.2 or later or LLVM/Clang)
## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4),
-## brotli (1.0.1)
+## brotli (1.0.1), zstd (1.4.5)
##
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
@@ -39,6 +39,10 @@
ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.8
endif
+# Edit the path below to point to the base of your Zstandard sources.
+ifndef ZSTD_PATH
+ZSTD_PATH = ../../zstd-1.4.5
+endif
# Edit the path below to point to the base of your Brotli sources.
ifndef BROTLI_PATH
BROTLI_PATH = ../../brotli-1.0.1
@@ -99,7 +103,7 @@ LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_DLL) -s
AR = $(CURL_AR)
RANLIB = $(CURL_RANLIB)
RC = $(CROSSPREFIX)windres
-RCFLAGS = --include-dir=$(PROOT)/include -DDEBUGBUILD=0 -O COFF
+RCFLAGS = --include-dir=$(PROOT)/include -DDEBUGBUILD=0 -O coff
STRIP = $(CROSSPREFIX)strip -g
# Set environment var ARCH to your architecture to override autodetection.
@@ -180,6 +184,9 @@ endif
ifeq ($(findstring -zlib,$(CFG)),-zlib)
ZLIB = 1
endif
+ifeq ($(findstring -zstd,$(CFG)),-zstd)
+ZSTD = 1
+endif
ifeq ($(findstring -brotli,$(CFG)),-brotli)
BROTLI = 1
endif
@@ -270,8 +277,8 @@ ifdef SSL
OPENSSL_LIBS += -lgdi32 -lcrypt32
endif
INCLUDES += -I"$(OPENSSL_INCLUDE)"
- CFLAGS += -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \
- -DHAVE_ENGINE_LOAD_BUILTIN_ENGINES -DOPENSSL_NO_KRB5
+ CFLAGS += -DUSE_OPENSSL -DHAVE_OPENSSL_PKCS12_H \
+ -DOPENSSL_NO_KRB5
DLL_LIBS += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
ifdef SRP
ifeq "$(wildcard $(OPENSSL_INCLUDE)/openssl/srp.h)" "$(OPENSSL_INCLUDE)/openssl/srp.h"
@@ -288,6 +295,16 @@ ifdef ZLIB
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
DLL_LIBS += -L"$(ZLIB_PATH)" -lz
endif
+ifdef ZSTD
+ INCLUDES += -I"$(ZSTD_PATH)/include"
+ CFLAGS += -DHAVE_ZSTD
+ DLL_LIBS += -L"$(ZSTD_PATH)/lib"
+ ifdef ZSTD_LIBS
+ DLL_LIBS += $(ZSTD_LIBS)
+ else
+ DLL_LIBS += -lzstd
+ endif
+endif
ifdef BROTLI
INCLUDES += -I"$(BROTLI_PATH)/include"
CFLAGS += -DHAVE_BROTLI
diff --git a/lib/Makefile.netware b/lib/Makefile.netware
index a40534684..2c16adbac 100644
--- a/lib/Makefile.netware
+++ b/lib/Makefile.netware
@@ -6,7 +6,7 @@
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2004 - 2015, Guenter Knauf
-# Copyright (C) 2001 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2001 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -639,7 +639,6 @@ ifdef WITH_SSL
@echo $(DL)#define HAVE_OPENSSL_PEM_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@
- @echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@
@echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@
ifdef WITH_SRP
@echo $(DL)#define USE_TLS_SRP 1$(DL) >> $@
@@ -670,8 +669,6 @@ endif
@echo $(DL)#endif$(DL) >> $@
ifdef CABUNDLE
@echo $(DL)#define CURL_CA_BUNDLE "$(CABUNDLE)"$(DL) >> $@
-else
- @echo $(DL)#define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE")$(DL) >> $@
endif
$(EXPORTF): $(CURL_INC)/curl/curl.h $(CURL_INC)/curl/easy.h $(CURL_INC)/curl/multi.h $(CURL_INC)/curl/mprintf.h
diff --git a/lib/Makefile.vxworks b/lib/Makefile.vxworks
index 7ff197f03..ada87fbd3 100644
--- a/lib/Makefile.vxworks
+++ b/lib/Makefile.vxworks
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#*****************************************************************************
#
#
diff --git a/lib/altsvc.c b/lib/altsvc.c
index 64971a9f0..d3deba3e8 100644
--- a/lib/altsvc.c
+++ b/lib/altsvc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,8 @@
#include "parsedate.h"
#include "sendf.h"
#include "warnless.h"
+#include "rand.h"
+#include "rename.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -48,19 +50,22 @@
#define MAX_ALTSVC_ALPNLENSTR "10"
#define MAX_ALTSVC_ALPNLEN 10
+#if defined(USE_QUICHE) && !defined(UNITTESTS)
+#define H3VERSION "h3-29"
+#elif defined(USE_NGTCP2) && !defined(UNITTESTS)
+#define H3VERSION "h3-29"
+#else
+#define H3VERSION "h3"
+#endif
+
static enum alpnid alpn2alpnid(char *name)
{
if(strcasecompare(name, "h1"))
return ALPN_h1;
if(strcasecompare(name, "h2"))
return ALPN_h2;
-#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
- if(strcasecompare(name, "h3-23"))
- return ALPN_h3;
-#else
- if(strcasecompare(name, "h3"))
+ if(strcasecompare(name, H3VERSION))
return ALPN_h3;
-#endif
return ALPN_none; /* unknown, probably rubbish input */
}
@@ -73,11 +78,7 @@ const char *Curl_alpnid2str(enum alpnid id)
case ALPN_h2:
return "h2";
case ALPN_h3:
-#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
- return "h3-23";
-#else
- return "h3";
-#endif
+ return H3VERSION;
default:
return ""; /* bad */
}
@@ -161,14 +162,13 @@ static CURLcode altsvc_add(struct altsvcinfo *asi, char *line)
date, &persist, &prio);
if(9 == rc) {
struct altsvc *as;
- time_t expires = curl_getdate(date, NULL);
+ time_t expires = Curl_getdate_capped(date);
as = altsvc_create(srchost, dsthost, srcalpn, dstalpn, srcport, dstport);
if(as) {
as->expires = expires;
as->prio = prio;
as->persist = persist ? 1 : 0;
Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
- asi->num++; /* one more entry */
}
}
@@ -188,7 +188,16 @@ static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
{
CURLcode result = CURLE_OK;
char *line = NULL;
- FILE *fp = fopen(file, FOPEN_READTEXT);
+ FILE *fp;
+
+ /* we need a private copy of the file name so that the altsvc cache file
+ name survives an easy handle reset */
+ free(asi->filename);
+ asi->filename = strdup(file);
+ if(!asi->filename)
+ return CURLE_OUT_OF_MEMORY;
+
+ fp = fopen(file, FOPEN_READTEXT);
if(fp) {
line = malloc(MAX_ALTSVC_LINE);
if(!line)
@@ -209,6 +218,7 @@ static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
return result;
fail:
+ Curl_safefree(asi->filename);
free(line);
fclose(fp);
return CURLE_OUT_OF_MEMORY;
@@ -292,51 +302,77 @@ CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl)
* Curl_altsvc_cleanup() frees an altsvc cache instance and all associated
* resources.
*/
-void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
+void Curl_altsvc_cleanup(struct altsvcinfo **altsvcp)
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
- if(altsvc) {
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
+ if(*altsvcp) {
+ struct altsvcinfo *altsvc = *altsvcp;
for(e = altsvc->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
altsvc_free(as);
}
+ free(altsvc->filename);
free(altsvc);
+ *altsvcp = NULL; /* clear the pointer */
}
}
/*
* Curl_altsvc_save() writes the altsvc cache to a file.
*/
-CURLcode Curl_altsvc_save(struct altsvcinfo *altsvc, const char *file)
+CURLcode Curl_altsvc_save(struct Curl_easy *data,
+ struct altsvcinfo *altsvc, const char *file)
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
+ char *tempstore;
+ unsigned char randsuffix[9];
if(!altsvc)
/* no cache activated */
return CURLE_OK;
- if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file[0])
- /* marked as read-only or zero length file name */
+ /* if not new name is given, use the one we stored from the load */
+ if(!file && altsvc->filename)
+ file = altsvc->filename;
+
+ if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file || !file[0])
+ /* marked as read-only, no file or zero length file name */
return CURLE_OK;
- out = fopen(file, FOPEN_WRITETEXT);
+
+ if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
+ return CURLE_FAILED_INIT;
+
+ tempstore = aprintf("%s.%s.tmp", file, randsuffix);
+ if(!tempstore)
+ return CURLE_OUT_OF_MEMORY;
+
+ out = fopen(tempstore, FOPEN_WRITETEXT);
if(!out)
- return CURLE_WRITE_ERROR;
- fputs("# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html\n"
- "# This file was generated by libcurl! Edit at your own risk.\n",
- out);
- for(e = altsvc->list.head; e; e = n) {
- struct altsvc *as = e->ptr;
- n = e->next;
- result = altsvc_out(as, out);
+ result = CURLE_WRITE_ERROR;
+ else {
+ fputs("# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html\n"
+ "# This file was generated by libcurl! Edit at your own risk.\n",
+ out);
+ for(e = altsvc->list.head; e; e = n) {
+ struct altsvc *as = e->ptr;
+ n = e->next;
+ result = altsvc_out(as, out);
+ if(result)
+ break;
+ }
+ fclose(out);
+ if(!result && Curl_rename(tempstore, file))
+ result = CURLE_WRITE_ERROR;
+
if(result)
- break;
+ unlink(tempstore);
}
- fclose(out);
+ free(tempstore);
return result;
}
@@ -351,12 +387,12 @@ static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen)
while(*p && !ISBLANK(*p) && (*p != ';') && (*p != '='))
p++;
len = p - protop;
+ *ptr = p;
if(!len || (len >= buflen))
return CURLE_BAD_FUNCTION_ARGUMENT;
memcpy(alpnbuf, protop, len);
alpnbuf[len] = 0;
- *ptr = p;
return CURLE_OK;
}
@@ -365,8 +401,8 @@ static CURLcode getalnum(const char **ptr, char *alpnbuf, size_t buflen)
static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid,
const char *srchost, unsigned short srcport)
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
for(e = asi->list.head; e; e = n) {
struct altsvc *as = e->ptr;
n = e->next;
@@ -375,7 +411,6 @@ static void altsvc_flush(struct altsvcinfo *asi, enum alpnid srcalpnid,
strcasecompare(srchost, as->src.host)) {
Curl_llist_remove(&asi->list, e, NULL);
altsvc_free(as);
- asi->num--;
}
}
}
@@ -396,12 +431,18 @@ static time_t debugtime(void *unused)
#define time(x) debugtime(x)
#endif
+#define ISNEWLINE(x) (((x) == '\n') || (x) == '\r')
+
/*
* Curl_altsvc_parse() takes an incoming alt-svc response header and stores
* the data correctly in the cache.
*
* 'value' points to the header *value*. That's contents to the right of the
* header name.
+ *
+ * Currently this function rejects invalid data without returning an error.
+ * Invalid host name, port number will result in the specific alternative
+ * being rejected. Unknown protocols are skipped.
*/
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
struct altsvcinfo *asi, const char *value,
@@ -415,12 +456,11 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
char alpnbuf[MAX_ALTSVC_ALPNLEN] = "";
struct altsvc *as;
unsigned short dstport = srcport; /* the same by default */
- const char *semip;
- time_t maxage = 24 * 3600; /* default is 24 hours */
- bool persist = FALSE;
CURLcode result = getalnum(&p, alpnbuf, sizeof(alpnbuf));
- if(result)
- return result;
+ if(result) {
+ infof(data, "Excessive alt-svc header, ignoring...\n");
+ return CURLE_OK;
+ }
DEBUGASSERT(asi);
@@ -432,57 +472,20 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
return CURLE_OK;
}
- /* The 'ma' and 'persist' flags are annoyingly meant for all alternatives
- but are set after the list on the line. Scan for the semicolons and get
- those fields first! */
- semip = p;
- do {
- semip = strchr(semip, ';');
- if(semip) {
- char option[32];
- unsigned long num;
- char *end_ptr;
- bool quoted = FALSE;
- semip++; /* pass the semicolon */
- result = getalnum(&semip, option, sizeof(option));
- if(result)
- break;
- while(*semip && ISBLANK(*semip))
- semip++;
- if(*semip != '=')
- continue;
- semip++;
- while(*semip && ISBLANK(*semip))
- semip++;
- if(*semip == '\"') {
- /* quoted value */
- semip++;
- quoted = TRUE;
- }
- num = strtoul(semip, &end_ptr, 10);
- if((end_ptr != semip) && num && (num < ULONG_MAX)) {
- if(strcasecompare("ma", option))
- maxage = num;
- else if(strcasecompare("persist", option) && (num == 1))
- persist = TRUE;
- if(quoted && (*end_ptr == '\"'))
- end_ptr++;
- }
- semip = end_ptr;
- }
- } while(semip);
-
do {
if(*p == '=') {
/* [protocol]="[host][:port]" */
dstalpnid = alpn2alpnid(alpnbuf);
- if(!dstalpnid) {
- infof(data, "Unknown alt-svc protocol \"%s\", ignoring...\n", alpnbuf);
- return CURLE_OK;
- }
p++;
if(*p == '\"') {
- const char *dsthost;
+ const char *dsthost = "";
+ const char *value_ptr;
+ char option[32];
+ unsigned long num;
+ char *end_ptr;
+ bool quoted = FALSE;
+ time_t maxage = 24 * 3600; /* default is 24 hours */
+ bool persist = FALSE;
p++;
if(*p != ':') {
/* host name starts here */
@@ -490,11 +493,15 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
while(*p && (ISALNUM(*p) || (*p == '.') || (*p == '-')))
p++;
len = p - hostp;
- if(!len || (len >= MAX_ALTSVC_HOSTLEN))
- return CURLE_BAD_FUNCTION_ARGUMENT;
- memcpy(namebuf, hostp, len);
- namebuf[len] = 0;
- dsthost = namebuf;
+ if(!len || (len >= MAX_ALTSVC_HOSTLEN)) {
+ infof(data, "Excessive alt-svc host name, ignoring...\n");
+ dstalpnid = ALPN_none;
+ }
+ else {
+ memcpy(namebuf, hostp, len);
+ namebuf[len] = 0;
+ dsthost = namebuf;
+ }
}
else {
/* no destination name, use source host */
@@ -502,31 +509,85 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
}
if(*p == ':') {
/* a port number */
- char *end_ptr;
unsigned long port = strtoul(++p, &end_ptr, 10);
if(port > USHRT_MAX || end_ptr == p || *end_ptr != '\"') {
infof(data, "Unknown alt-svc port number, ignoring...\n");
- return CURLE_OK;
+ dstalpnid = ALPN_none;
}
p = end_ptr;
dstport = curlx_ultous(port);
}
if(*p++ != '\"')
- return CURLE_BAD_FUNCTION_ARGUMENT;
- as = altsvc_createid(srchost, dsthost,
- srcalpnid, dstalpnid,
- srcport, dstport);
- if(as) {
- /* The expires time also needs to take the Age: value (if any) into
- account. [See RFC 7838 section 3.1] */
- as->expires = maxage + time(NULL);
- as->persist = persist;
- Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
- asi->num++; /* one more entry */
- infof(data, "Added alt-svc: %s:%d over %s\n", dsthost, dstport,
- Curl_alpnid2str(dstalpnid));
+ break;
+ /* Handle the optional 'ma' and 'persist' flags. Unknown flags
+ are skipped. */
+ for(;;) {
+ while(ISBLANK(*p))
+ p++;
+ if(*p != ';')
+ break;
+ p++; /* pass the semicolon */
+ if(!*p || ISNEWLINE(*p))
+ break;
+ result = getalnum(&p, option, sizeof(option));
+ if(result) {
+ /* skip option if name is too long */
+ option[0] = '\0';
+ }
+ while(*p && ISBLANK(*p))
+ p++;
+ if(*p != '=')
+ return CURLE_OK;
+ p++;
+ while(*p && ISBLANK(*p))
+ p++;
+ if(!*p)
+ return CURLE_OK;
+ if(*p == '\"') {
+ /* quoted value */
+ p++;
+ quoted = TRUE;
+ }
+ value_ptr = p;
+ if(quoted) {
+ while(*p && *p != '\"')
+ p++;
+ if(!*p++)
+ return CURLE_OK;
+ }
+ else {
+ while(*p && !ISBLANK(*p) && *p!= ';' && *p != ',')
+ p++;
+ }
+ num = strtoul(value_ptr, &end_ptr, 10);
+ if((end_ptr != value_ptr) && (num < ULONG_MAX)) {
+ if(strcasecompare("ma", option))
+ maxage = num;
+ else if(strcasecompare("persist", option) && (num == 1))
+ persist = TRUE;
+ }
+ }
+ if(dstalpnid) {
+ as = altsvc_createid(srchost, dsthost,
+ srcalpnid, dstalpnid,
+ srcport, dstport);
+ if(as) {
+ /* The expires time also needs to take the Age: value (if any) into
+ account. [See RFC 7838 section 3.1] */
+ as->expires = maxage + time(NULL);
+ as->persist = persist;
+ Curl_llist_insert_next(&asi->list, asi->list.tail, as, &as->node);
+ infof(data, "Added alt-svc: %s:%d over %s\n", dsthost, dstport,
+ Curl_alpnid2str(dstalpnid));
+ }
+ }
+ else {
+ infof(data, "Unknown alt-svc protocol \"%s\", skipping...\n",
+ alpnbuf);
}
}
+ else
+ break;
/* after the double quote there can be a comma if there's another
string or a semicolon if no more */
if(*p == ',') {
@@ -534,11 +595,11 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
p++;
result = getalnum(&p, alpnbuf, sizeof(alpnbuf));
if(result)
- /* failed to parse, but since we already did at least one host we
- return OK */
- return CURLE_OK;
+ break;
}
}
+ else
+ break;
} while(*p && (*p != ';') && (*p != '\n') && (*p != '\r'));
return CURLE_OK;
@@ -553,8 +614,8 @@ bool Curl_altsvc_lookup(struct altsvcinfo *asi,
struct altsvc **dstentry,
const int versions) /* one or more bits */
{
- struct curl_llist_element *e;
- struct curl_llist_element *n;
+ struct Curl_llist_element *e;
+ struct Curl_llist_element *n;
time_t now = time(NULL);
DEBUGASSERT(asi);
DEBUGASSERT(srchost);
diff --git a/lib/altsvc.h b/lib/altsvc.h
index 99d0499af..1aeb625ab 100644
--- a/lib/altsvc.h
+++ b/lib/altsvc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,22 +46,22 @@ struct altsvc {
time_t expires;
bool persist;
int prio;
- struct curl_llist_element node;
+ struct Curl_llist_element node;
};
struct altsvcinfo {
char *filename;
- struct curl_llist list; /* list of entries */
- size_t num; /* number of alt-svc entries */
+ struct Curl_llist list; /* list of entries */
long flags; /* the publicly set bitmask */
};
const char *Curl_alpnid2str(enum alpnid id);
struct altsvcinfo *Curl_altsvc_init(void);
CURLcode Curl_altsvc_load(struct altsvcinfo *asi, const char *file);
-CURLcode Curl_altsvc_save(struct altsvcinfo *asi, const char *file);
+CURLcode Curl_altsvc_save(struct Curl_easy *data,
+ struct altsvcinfo *asi, const char *file);
CURLcode Curl_altsvc_ctrl(struct altsvcinfo *asi, const long ctrl);
-void Curl_altsvc_cleanup(struct altsvcinfo *altsvc);
+void Curl_altsvc_cleanup(struct altsvcinfo **altsvc);
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
struct altsvcinfo *altsvc, const char *value,
enum alpnid srcalpn, const char *srchost,
@@ -70,9 +70,10 @@ bool Curl_altsvc_lookup(struct altsvcinfo *asi,
enum alpnid srcalpnid, const char *srchost,
int srcport,
struct altsvc **dstentry,
- int versions); /* one or more CURLALTSVC_H* bits */
+ const int versions); /* CURLALTSVC_H* bits */
#else
/* disabled */
-#define Curl_altsvc_save(a,b)
+#define Curl_altsvc_save(a,b,c)
+#define Curl_altsvc_cleanup(x)
#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
#endif /* HEADER_CURL_ALTSVC_H */
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c
index 835cfa48f..725d6cd5c 100644
--- a/lib/asyn-ares.c
+++ b/lib/asyn-ares.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -67,8 +67,8 @@
#include "select.h"
#include "progress.h"
-# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
- (defined(WIN32) || defined(__SYMBIAN32__))
+# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
+ defined(WIN32)
# define CARES_STATICLIB
# endif
# include <ares.h>
@@ -87,7 +87,8 @@
struct ResolverResults {
int num_pending; /* number of ares_gethostbyname() requests */
- Curl_addrinfo *temp_ai; /* intermediary result while fetching c-ares parts */
+ struct Curl_addrinfo *temp_ai; /* intermediary result while fetching c-ares
+ parts */
int last_status;
struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */
};
@@ -285,7 +286,7 @@ int Curl_resolver_getsock(struct connectdata *conn,
* return number of sockets it worked on
*/
-static int waitperform(struct connectdata *conn, int timeout_ms)
+static int waitperform(struct connectdata *conn, timediff_t timeout_ms)
{
struct Curl_easy *data = conn->data;
int nfds;
@@ -352,8 +353,8 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
conn->async.os_specific;
CURLcode result = CURLE_OK;
- if(dns)
- *dns = NULL;
+ DEBUGASSERT(dns);
+ *dns = NULL;
waitperform(conn, 0);
@@ -381,19 +382,18 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
}
if(res && !res->num_pending) {
- if(dns) {
- (void)Curl_addrinfo_callback(conn, res->last_status, res->temp_ai);
- /* temp_ai ownership is moved to the connection, so we need not free-up
- them */
- res->temp_ai = NULL;
- }
+ (void)Curl_addrinfo_callback(conn, res->last_status, res->temp_ai);
+ /* temp_ai ownership is moved to the connection, so we need not free-up
+ them */
+ res->temp_ai = NULL;
+
if(!conn->async.dns) {
failf(data, "Could not resolve: %s (%s)",
conn->async.hostname, ares_strerror(conn->async.status));
result = conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY:
CURLE_COULDNT_RESOLVE_HOST;
}
- else if(dns)
+ else
*dns = conn->async.dns;
destroy_async_data(&conn->async);
@@ -408,7 +408,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
* Waits for a resolve to finish. This function should be avoided since using
* this risk getting the multi interface to "hang".
*
- * If 'entry' is non-NULL, make it point to the resolved dns entry
+ * 'entry' MUST be non-NULL.
*
* Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved,
* CURLE_OPERATION_TIMEDOUT if a time-out occurred, or other errors.
@@ -420,10 +420,9 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
struct Curl_easy *data = conn->data;
timediff_t timeout;
struct curltime now = Curl_now();
- struct Curl_dns_entry *temp_entry;
- if(entry)
- *entry = NULL; /* clear on entry */
+ DEBUGASSERT(entry);
+ *entry = NULL; /* clear on entry */
timeout = Curl_timeleft(data, &now, TRUE);
if(timeout < 0) {
@@ -438,9 +437,13 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
while(!result) {
struct timeval *tvp, tv, store;
int itimeout;
- int timeout_ms;
+ timediff_t timeout_ms;
- itimeout = (timeout > (long)INT_MAX) ? INT_MAX : (int)timeout;
+#if TIMEDIFF_T_MAX > INT_MAX
+ itimeout = (timeout > INT_MAX) ? INT_MAX : (int)timeout;
+#else
+ itimeout = (int)timeout;
+#endif
store.tv_sec = itimeout/1000;
store.tv_usec = (itimeout%1000)*1000;
@@ -451,12 +454,12 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
second is left, otherwise just use 1000ms to make sure the progress
callback gets called frequent enough */
if(!tvp->tv_sec)
- timeout_ms = (int)(tvp->tv_usec/1000);
+ timeout_ms = (timediff_t)(tvp->tv_usec/1000);
else
timeout_ms = 1000;
waitperform(conn, timeout_ms);
- result = Curl_resolver_is_resolved(conn, entry?&temp_entry:NULL);
+ result = Curl_resolver_is_resolved(conn, entry);
if(result || conn->async.done)
break;
@@ -471,7 +474,7 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
else if(timediff > timeout)
timeout = -1;
else
- timeout -= (long)timediff;
+ timeout -= timediff;
now = now2; /* for next loop */
}
if(timeout < 0)
@@ -496,9 +499,9 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
/* Connects results to the list */
static void compound_results(struct ResolverResults *res,
- Curl_addrinfo *ai)
+ struct Curl_addrinfo *ai)
{
- Curl_addrinfo *ai_tail;
+ struct Curl_addrinfo *ai_tail;
if(!ai)
return;
ai_tail = ai;
@@ -540,7 +543,7 @@ static void query_completed_cb(void *arg, /* (struct connectdata *) */
res->num_pending--;
if(CURL_ASYNC_SUCCESS == status) {
- Curl_addrinfo *ai = Curl_he2ai(hostent, conn->async.port);
+ struct Curl_addrinfo *ai = Curl_he2ai(hostent, conn->async.port);
if(ai) {
compound_results(res, ai);
}
@@ -619,33 +622,18 @@ static void query_completed_cb(void *arg, /* (struct connectdata *) */
* memory we need to free after use. That memory *MUST* be freed with
* Curl_freeaddrinfo(), nothing else.
*/
-Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
char *bufp;
struct Curl_easy *data = conn->data;
- struct in_addr in;
int family = PF_INET;
-#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
- struct in6_addr in6;
-#endif /* CURLRES_IPV6 */
*waitp = 0; /* default to synchronous response */
- /* First check if this is an IPv4 address string */
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0) {
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
- }
-
-#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
- /* Otherwise, check if this is an IPv6 address string */
- if(Curl_inet_pton (AF_INET6, hostname, &in6) > 0)
- /* This must be an IPv6 address literal. */
- return Curl_ip2addr(AF_INET6, &in6, hostname, port);
-
+#ifdef ENABLE_IPV6
switch(conn->ip_version) {
default:
#if ARES_VERSION >= 0x010601
@@ -661,7 +649,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
family = PF_INET6;
break;
}
-#endif /* CURLRES_IPV6 */
+#endif /* ENABLE_IPV6 */
bufp = strdup(hostname);
if(bufp) {
@@ -682,9 +670,9 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
/* initial status - failed */
res->last_status = ARES_ENOTFOUND;
-#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
+#ifdef ENABLE_IPV6
if(family == PF_UNSPEC) {
- if(Curl_ipv6works()) {
+ if(Curl_ipv6works(conn)) {
res->num_pending = 2;
/* areschannel is already setup in the Curl_open() function */
@@ -702,7 +690,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
}
}
else
-#endif /* CURLRES_IPV6 */
+#endif /* ENABLE_IPV6 */
{
res->num_pending = 1;
diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
index 8c552baa9..a60f4f066 100755..100644
--- a/lib/asyn-thread.c
+++ b/lib/asyn-thread.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -71,7 +71,6 @@
#include "strerror.h"
#include "url.h"
#include "multiif.h"
-#include "inet_pton.h"
#include "inet_ntop.h"
#include "curl_threads.h"
#include "connect.h"
@@ -159,7 +158,7 @@ static bool init_resolve_thread(struct connectdata *conn,
/* Data for synchronization between resolver thread and its parent */
struct thread_sync_data {
- curl_mutex_t * mtx;
+ curl_mutex_t *mtx;
int done;
char *hostname; /* hostname to resolve, Curl_async.hostname
@@ -170,7 +169,7 @@ struct thread_sync_data {
curl_socket_t sock_pair[2]; /* socket pair */
#endif
int sock_error;
- Curl_addrinfo *res;
+ struct Curl_addrinfo *res;
#ifdef HAVE_GETADDRINFO
struct addrinfo hints;
#endif
@@ -180,7 +179,7 @@ struct thread_sync_data {
struct thread_data {
curl_thread_t thread_hnd;
unsigned int poll_interval;
- time_t interval_end;
+ timediff_t interval_end;
struct thread_sync_data tsd;
};
@@ -191,7 +190,7 @@ static struct thread_sync_data *conn_thread_sync_data(struct connectdata *conn)
/* Destroy resolver thread synchronization data */
static
-void destroy_thread_sync_data(struct thread_sync_data * tsd)
+void destroy_thread_sync_data(struct thread_sync_data *tsd)
{
if(tsd->mtx) {
Curl_mutex_destroy(tsd->mtx);
@@ -217,7 +216,7 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd)
/* Initialize resolver thread synchronization data */
static
-int init_thread_sync_data(struct thread_data * td,
+int init_thread_sync_data(struct thread_data *td,
const char *hostname,
int port,
const struct addrinfo *hints)
@@ -495,11 +494,14 @@ static CURLcode resolver_error(struct connectdata *conn)
const char *host_or_proxy;
CURLcode result;
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.httpproxy) {
host_or_proxy = "proxy";
result = CURLE_COULDNT_RESOLVE_PROXY;
}
- else {
+ else
+#endif
+ {
host_or_proxy = "host";
result = CURLE_COULDNT_RESOLVE_HOST;
}
@@ -510,6 +512,9 @@ static CURLcode resolver_error(struct connectdata *conn)
return result;
}
+/*
+ * 'entry' may be NULL and then no data is returned
+ */
static CURLcode thread_wait_resolv(struct connectdata *conn,
struct Curl_dns_entry **entry,
bool report)
@@ -594,6 +599,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
struct thread_data *td = (struct thread_data*) conn->async.os_specific;
int done = 0;
+ DEBUGASSERT(entry);
*entry = NULL;
if(!td) {
@@ -619,8 +625,8 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
else {
/* poll for name lookup done with exponential backoff up to 250ms */
/* should be fine even if this converts to 32 bit */
- time_t elapsed = (time_t)Curl_timediff(Curl_now(),
- data->progress.t_startsingle);
+ timediff_t elapsed = Curl_timediff(Curl_now(),
+ data->progress.t_startsingle);
if(elapsed < 0)
elapsed = 0;
@@ -645,7 +651,7 @@ int Curl_resolver_getsock(struct connectdata *conn,
curl_socket_t *socks)
{
int ret_val = 0;
- time_t milli;
+ timediff_t milli;
timediff_t ms;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
@@ -669,7 +675,7 @@ int Curl_resolver_getsock(struct connectdata *conn,
if(ms < 3)
milli = 0;
else if(ms <= 50)
- milli = (time_t)ms/3;
+ milli = ms/3;
else if(ms <= 250)
milli = 50;
else
@@ -687,21 +693,16 @@ int Curl_resolver_getsock(struct connectdata *conn,
/*
* Curl_getaddrinfo() - for platforms without getaddrinfo
*/
-Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
- struct in_addr in;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
*waitp = 0; /* default to synchronous response */
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
-
reslv->start = Curl_now();
/* fire up a new resolver thread! */
@@ -720,38 +721,18 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
/*
* Curl_resolver_getaddrinfo() - for getaddrinfo
*/
-Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
struct addrinfo hints;
- char sbuf[12];
int pf = PF_INET;
struct Curl_easy *data = conn->data;
struct resdata *reslv = (struct resdata *)data->state.resolver;
*waitp = 0; /* default to synchronous response */
-#ifndef USE_RESOLVE_ON_IPS
- {
- struct in_addr in;
- /* First check if this is an IPv4 address string */
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
- }
-#ifdef CURLRES_IPV6
- {
- struct in6_addr in6;
- /* check if this is an IPv6 address string */
- if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
- /* This is an IPv6 address literal */
- return Curl_ip2addr(AF_INET6, &in6, hostname, port);
- }
-#endif /* CURLRES_IPV6 */
-#endif /* !USE_RESOLVE_ON_IPS */
-
#ifdef CURLRES_IPV6
/*
* Check if a limited name resolve has been requested.
@@ -768,7 +749,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
break;
}
- if((pf != PF_INET) && !Curl_ipv6works())
+ if((pf != PF_INET) && !Curl_ipv6works(conn))
/* The stack seems to be a non-IPv6 one */
pf = PF_INET;
#endif /* CURLRES_IPV6 */
@@ -778,8 +759,6 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
hints.ai_socktype = (conn->transport == TRNSPRT_TCP)?
SOCK_STREAM : SOCK_DGRAM;
- msnprintf(sbuf, sizeof(sbuf), "%d", port);
-
reslv->start = Curl_now();
/* fire up a new resolver thread! */
if(init_resolve_thread(conn, hostname, port, &hints)) {
diff --git a/lib/asyn.h b/lib/asyn.h
index 081c3fef0..bd3c3c123 100644
--- a/lib/asyn.h
+++ b/lib/asyn.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -153,10 +153,10 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
* Each resolver backend must of course make sure to return data in the
* correct format to comply with this.
*/
-Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp);
+struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp);
#ifndef CURLRES_ASYNCH
/* convert these functions if an asynch resolver isn't used */
@@ -164,7 +164,6 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
#define Curl_resolver_kill(x) Curl_nop_stmt
#define Curl_resolver_is_resolved(x,y) CURLE_COULDNT_RESOLVE_HOST
#define Curl_resolver_wait_resolv(x,y) CURLE_COULDNT_RESOLVE_HOST
-#define Curl_resolver_getsock(x,y,z) 0
#define Curl_resolver_duphandle(x,y,z) CURLE_OK
#define Curl_resolver_init(x,y) CURLE_OK
#define Curl_resolver_global_init() CURLE_OK
diff --git a/lib/base64.c b/lib/base64.c
index 643cef625..ec632e6f7 100644
--- a/lib/base64.c
+++ b/lib/base64.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,9 @@
#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \
!defined(CURL_DISABLE_LDAP) || \
+ !defined(CURL_DISABLE_SMTP) || \
+ !defined(CURL_DISABLE_POP3) || \
+ !defined(CURL_DISABLE_IMAP) || \
!defined(CURL_DISABLE_DOH) || defined(USE_SSL)
#include "urldata.h" /* for the Curl_easy definition */
diff --git a/lib/checksrc.pl b/lib/checksrc.pl
index b2cfa8355..78b9cef5b 100755
--- a/lib/checksrc.pl
+++ b/lib/checksrc.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2011 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -31,14 +31,14 @@ my $warnings = 0;
my $swarnings = 0;
my $errors = 0;
my $serrors = 0;
-my $suppressed; # whitelisted problems
+my $suppressed; # skipped problems
my $file;
my $dir=".";
my $wlist="";
my @alist;
-my $windows_os = $^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin';
+my $windows_os = $^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys';
my $verbose;
-my %whitelist;
+my %skiplist;
my %ignore;
my %ignore_set;
@@ -52,7 +52,7 @@ my %warnings_extended = (
my %warnings = (
'LONGLINE' => "Line longer than $max_column",
'TABS' => 'TAB characters not allowed',
- 'TRAILINGSPACE' => 'Trailing white space on the line',
+ 'TRAILINGSPACE' => 'Trailing whitespace on the line',
'CPPCOMMENTS' => '// comment detected',
'SPACEBEFOREPAREN' => 'space before an open parenthesis',
'SPACEAFTERPAREN' => 'space after open parenthesis',
@@ -80,14 +80,19 @@ my %warnings = (
'MULTISPACE' => 'multiple spaces used when not suitable',
'SIZEOFNOPAREN' => 'use of sizeof without parentheses',
'SNPRINTF' => 'use of snprintf',
+ 'ONELINECONDITION' => 'conditional block on the same line as the if()',
+ 'TYPEDEFSTRUCT' => 'typedefed struct',
+ 'DOBRACE' => 'A single space between do and open brace',
+ 'BRACEWHILE' => 'A single space between open brace and while',
+ 'EXCLAMATIONSPACE' => 'Whitespace after exclamation mark in expression',
);
-sub readwhitelist {
- open(W, "<$dir/checksrc.whitelist") or return;
+sub readskiplist {
+ open(W, "<$dir/checksrc.skip") or return;
my @all=<W>;
for(@all) {
$windows_os ? $_ =~ s/\r?\n$// : chomp;
- $whitelist{$_}=1;
+ $skiplist{$_}=1;
}
close(W);
}
@@ -115,10 +120,19 @@ sub readlocalfile {
}
$warnings{$1} = $warnings_extended{$1};
}
+ elsif (/^\s*disable ([A-Z]+)$/) {
+ if(!defined($warnings{$1})) {
+ print STDERR "invalid warning specified in .checksrc: \"$1\"\n";
+ next;
+ }
+ # Accept-list
+ push @alist, $1;
+ }
else {
die "Invalid format in $dir/.checksrc on line $i\n";
}
}
+ close($rcfile);
}
sub checkwarn {
@@ -131,8 +145,8 @@ sub checkwarn {
# print STDERR "Dev! there's no description for $name!\n";
#}
- # checksrc.whitelist
- if($whitelist{$line}) {
+ # checksrc.skip
+ if($skiplist{$line}) {
$nowarn = 1;
}
# !checksrc! controlled
@@ -217,7 +231,7 @@ if(!$file) {
print " -A[rule] Accept this violation, can be used multiple times\n";
print " -D[DIR] Directory to prepend file names\n";
print " -h Show help output\n";
- print " -W[file] Whitelist the given file - ignore all its flaws\n";
+ print " -W[file] Skip the given file - ignore all its flaws\n";
print " -i<n> Indent spaces. Default: 2\n";
print " -m<n> Maximum line length. Default: 79\n";
print "\nDetects and warns for these problems:\n";
@@ -227,7 +241,7 @@ if(!$file) {
exit;
}
-readwhitelist();
+readskiplist();
readlocalfile();
do {
@@ -386,7 +400,7 @@ sub scanfile {
checkwarn("TABS",
$line, length($1), $file, $l, "Contains TAB character", 1);
}
- # detect trailing white space
+ # detect trailing whitespace
if($l =~ /^(.*)[ \t]+\z/) {
checkwarn("TRAILINGSPACE",
$line, length($1), $file, $l, "Trailing whitespace");
@@ -428,7 +442,7 @@ sub scanfile {
# crude attempt to detect // comments without too many false
# positives
- if($l =~ /^([^"\*]*)[^:"]\/\//) {
+ if($l =~ /^(([^"\*]*)[^:"]|)\/\//) {
checkwarn("CPPCOMMENTS",
$line, length($1), $file, $l, "\/\/ comment");
}
@@ -457,13 +471,42 @@ sub scanfile {
}
}
- if($nostr =~ /^((.*)(if) *\()(.*)\)/) {
+ # check spaces in 'do {'
+ if($nostr =~ /^( *)do( *)\{/ && length($2) != 1) {
+ checkwarn("DOBRACE", $line, length($1) + 2, $file, $l, "one space after do before brace");
+ }
+ # check spaces in 'do {'
+ elsif($nostr =~ /^( *)\}( *)while/ && length($2) != 1) {
+ checkwarn("BRACEWHILE", $line, length($1) + 2, $file, $l, "one space between brace and while");
+ }
+ if($nostr =~ /^((.*\s)(if) *\()(.*)\)(.*)/) {
my $pos = length($1);
- if($4 =~ / = /) {
+ my $postparen = $5;
+ my $cond = $4;
+ if($cond =~ / = /) {
checkwarn("ASSIGNWITHINCONDITION",
$line, $pos+1, $file, $l,
"assignment within conditional expression");
}
+ my $temp = $cond;
+ $temp =~ s/\(//g; # remove open parens
+ my $openc = length($cond) - length($temp);
+
+ $temp = $cond;
+ $temp =~ s/\)//g; # remove close parens
+ my $closec = length($cond) - length($temp);
+ my $even = $openc == $closec;
+
+ if($l =~ / *\#/) {
+ # this is a #if, treat it differently
+ }
+ elsif($even && $postparen &&
+ ($postparen !~ /^ *$/) && ($postparen !~ /^ *[,{&|\\]+/)) {
+ print STDERR "5: '$postparen'\n";
+ checkwarn("ONELINECONDITION",
+ $line, length($l)-length($postparen), $file, $l,
+ "conditional block on the same line");
+ }
}
# check spaces after open parentheses
if($l =~ /^(.*[a-z])\( /i) {
@@ -560,7 +603,8 @@ sub scanfile {
# scan for use of banned functions
if($l =~ /^(.*\W)
- (gets|
+ (gmtime|localtime|
+ gets|
strtok|
v?sprintf|
(str|_mbs|_tcs|_wcs)n?cat|
@@ -617,10 +661,10 @@ sub scanfile {
}
# check for 'char * name'
- if(($l =~ /(^.*(char|int|long|void|curl_slist|CURL|CURLM|CURLMsg|curl_httppost) *(\*+)) (\w+)/) && ($4 ne "const")) {
- checkwarn("ASTERISKNOSPACE",
+ if(($l =~ /(^.*(char|int|long|void|CURL|CURLM|CURLMsg|[cC]url_[A-Za-z_]+|struct [a-zA-Z_]+) *(\*+)) (\w+)/) && ($4 !~ /^(const|volatile)$/)) {
+ checkwarn("ASTERISKSPACE",
$line, length($1), $file, $ol,
- "no space after declarative asterisk");
+ "space after declarative asterisk");
}
# check for 'char*'
if(($l =~ /(^.*(char|int|long|void|curl_slist|CURL|CURLM|CURLMsg|curl_httppost|sockaddr_in|FILE)\*)/)) {
@@ -675,6 +719,19 @@ sub scanfile {
"no space after semicolon");
}
+ # typedef struct ... {
+ if($nostr =~ /^(.*)typedef struct.*{/) {
+ checkwarn("TYPEDEFSTRUCT",
+ $line, length($1)+1, $file, $ol,
+ "typedef'ed struct");
+ }
+
+ if($nostr =~ /(.*)! +(\w|\()/) {
+ checkwarn("EXCLAMATIONSPACE",
+ $line, length($1)+1, $file, $ol,
+ "space after exclamation mark");
+ }
+
# check for more than one consecutive space before open brace or
# question mark. Skip lines containing strings since they make it hard
# due to artificially getting multiple spaces
@@ -717,12 +774,17 @@ sub scanfile {
my $commityear = undef;
@copyright = sort {$$b{year} cmp $$a{year}} @copyright;
+ # if the file is modified, assume commit year this year
if(`git status -s -- $file` =~ /^ [MARCU]/) {
$commityear = (localtime(time))[5] + 1900;
}
- elsif (`git rev-list --count origin/master..HEAD -- $file` !~ /^0/) {
- my $grl = `git rev-list --max-count=1 --timestamp HEAD -- $file`;
- $commityear = (localtime((split(/ /, $grl))[0]))[5] + 1900;
+ else {
+ # min-parents=1 to ignore wrong initial commit in truncated repos
+ my $grl = `git rev-list --max-count=1 --min-parents=1 --timestamp HEAD -- $file`;
+ if($grl) {
+ chomp $grl;
+ $commityear = (localtime((split(/ /, $grl))[0]))[5] + 1900;
+ }
}
if(defined($commityear) && scalar(@copyright) &&
diff --git a/lib/config-dos.h b/lib/config-dos.h
index 3e973de0b..349e75639 100644
--- a/lib/config-dos.h
+++ b/lib/config-dos.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -138,7 +138,6 @@
/* USE_OPENSSL on cmd-line */
#ifdef USE_OPENSSL
#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
- #define HAVE_OPENSSL_ENGINE_H 1
#define OPENSSL_NO_KRB5 1
#endif
@@ -152,8 +151,6 @@
#define ssize_t int
#endif
-#define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE")
-
/* Target HAVE_x section */
#if defined(DJGPP)
diff --git a/lib/config-mac.h b/lib/config-mac.h
index 3c12bdfac..14b98fe57 100644
--- a/lib/config-mac.h
+++ b/lib/config-mac.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/config-os400.h b/lib/config-os400.h
index a302828e2..7beb81faf 100644
--- a/lib/config-os400.h
+++ b/lib/config-os400.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -97,9 +97,6 @@
/* Define if you have the <crypto.h> header file. */
#undef HAVE_CRYPTO_H
-/* Define if you have the <des.h> header file. */
-#undef HAVE_DES_H
-
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H
diff --git a/lib/config-plan9.h b/lib/config-plan9.h
index 64bfbdea0..41440a14e 100644
--- a/lib/config-plan9.h
+++ b/lib/config-plan9.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -102,7 +102,6 @@
#define HAVE_BASENAME 1
#define HAVE_BOOL_T 1
#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
#define HAVE_ERRNO_H 1
#define HAVE_FCNTL 1
#define HAVE_FCNTL_H 1
@@ -139,7 +138,6 @@
#define USE_OPENSSL 1
#define HAVE_OPENSSL_CRYPTO_H 1
-#define HAVE_OPENSSL_ENGINE_H 1
#define HAVE_OPENSSL_ERR_H 1
#define HAVE_OPENSSL_PEM_H 1
#define HAVE_OPENSSL_PKCS12_H 1
diff --git a/lib/config-riscos.h b/lib/config-riscos.h
index 4af94981c..0ddf487e8 100644
--- a/lib/config-riscos.h
+++ b/lib/config-riscos.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -98,9 +98,6 @@
/* Define if you have the <crypto.h> header file. */
#undef HAVE_CRYPTO_H
-/* Define if you have the <des.h> header file. */
-#undef HAVE_DES_H
-
/* Define if you have the <errno.h> header file. */
#define HAVE_ERRNO_H
diff --git a/lib/config-symbian.h b/lib/config-symbian.h
deleted file mode 100644
index cb2e96d5d..000000000
--- a/lib/config-symbian.h
+++ /dev/null
@@ -1,802 +0,0 @@
-#ifndef HEADER_CURL_CONFIG_SYMBIAN_H
-#define HEADER_CURL_CONFIG_SYMBIAN_H
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/* ================================================================ */
-/* Hand crafted config file for Symbian */
-/* ================================================================ */
-
-/* Location of default ca bundle */
-/* #define CURL_CA_BUNDLE "/etc/pki/tls/certs/ca-bundle.crt"*/
-
-/* Location of default ca path */
-/* #undef CURL_CA_PATH */
-
-/* to disable cookies support */
-/* #undef CURL_DISABLE_COOKIES */
-
-/* to disable cryptographic authentication */
-/* #undef CURL_DISABLE_CRYPTO_AUTH */
-
-/* to disable DICT */
-/* #undef CURL_DISABLE_DICT */
-
-/* to disable FILE */
-/* #undef CURL_DISABLE_FILE */
-
-/* to disable FTP */
-/* #undef CURL_DISABLE_FTP */
-
-/* to disable HTTP */
-/* #undef CURL_DISABLE_HTTP */
-
-/* to disable LDAP */
-#define CURL_DISABLE_LDAP 1
-
-/* to disable LDAPS */
-#define CURL_DISABLE_LDAPS 1
-
-/* to disable TELNET */
-/* #undef CURL_DISABLE_TELNET */
-
-/* to disable TFTP */
-/* #undef CURL_DISABLE_TFTP */
-
-/* to disable verbose strings */
-/* #define CURL_DISABLE_VERBOSE_STRINGS 1*/
-
-/* Definition to make a library symbol externally visible. */
-/* #undef CURL_EXTERN_SYMBOL */
-
-/* Use Windows LDAP implementation */
-/* #undef USE_WIN32_LDAP */
-
-/* your Entropy Gathering Daemon socket pathname */
-/* #undef EGD_SOCKET */
-
-/* Define if you want to enable IPv6 support */
-#define ENABLE_IPV6 1
-
-/* Define if struct sockaddr_in6 has the sin6_scope_id member */
-#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
-
-/* Define to the type qualifier of arg 1 for getnameinfo. */
-#define GETNAMEINFO_QUAL_ARG1 const
-
-/* Define to the type of arg 1 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
-
-/* Define to the type of arg 2 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG2 socklen_t
-
-/* Define to the type of args 4 and 6 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG46 size_t
-
-/* Define to the type of arg 7 for getnameinfo. */
-#define GETNAMEINFO_TYPE_ARG7 int
-
-/* Define to 1 if you have the <alloca.h> header file. */
-/*#define HAVE_ALLOCA_H 1*/
-
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#define HAVE_ARPA_INET_H 1
-
-/* Define to 1 if you have the <arpa/tftp.h> header file. */
-/*#define HAVE_ARPA_TFTP_H 1*/
-
-/* Define to 1 if you have the <assert.h> header file. */
-#define HAVE_ASSERT_H 1
-
-/* Define to 1 if you have the `basename' function. */
-/*#define HAVE_BASENAME 1*/
-
-/* Define to 1 if bool is an available type. */
-/*#define HAVE_BOOL_T 1*/
-
-/* Define to 1 if you have the `closesocket' function. */
-/* #undef HAVE_CLOSESOCKET */
-
-/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
-/*#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1*/
-
-/* Define to 1 if you have the <crypto.h> header file. */
-/* #undef HAVE_CRYPTO_H */
-
-/* Define to 1 if you have the <des.h> header file. */
-/* #undef HAVE_DES_H */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-/*#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1*/
-
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define to 1 if you have the <err.h> header file. */
-#define HAVE_ERR_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the fcntl function. */
-#define HAVE_FCNTL 1
-
-/* Define to 1 if you have a working fcntl O_NONBLOCK function. */
-#define HAVE_FCNTL_O_NONBLOCK 1
-
-/* Define to 1 if you have the `fork' function. */
-/*#define HAVE_FORK 1*/
-
-/* Define to 1 if you have the `ftruncate' function. */
-#define HAVE_FTRUNCATE 1
-
-/* Define if getaddrinfo exists and works */
-#define HAVE_GETADDRINFO 1
-
-/* Define to 1 if you have the `geteuid' function. */
-#define HAVE_GETEUID 1
-
-/* Define to 1 if you have the `gethostbyaddr' function. */
-#define HAVE_GETHOSTBYADDR 1
-
-/* If you have gethostbyname */
-#define HAVE_GETHOSTBYNAME 1
-
-/* Define to 1 if you have the `gethostbyname_r' function. */
-/* #undef HAVE_GETHOSTBYNAME_R */
-
-/* gethostbyname_r() takes 3 args */
-/* #undef HAVE_GETHOSTBYNAME_R_3 */
-
-/* gethostbyname_r() takes 5 args */
-/* #undef HAVE_GETHOSTBYNAME_R_5 */
-
-/* gethostbyname_r() takes 6 args */
-/* #undef HAVE_GETHOSTBYNAME_R_6 */
-
-/* Define to 1 if you have the getnameinfo function. */
-#define HAVE_GETNAMEINFO 1
-
-/* Define to 1 if you have the `getpass_r' function. */
-/* #undef HAVE_GETPASS_R */
-
-/* Define to 1 if you have the `getppid' function. */
-#define HAVE_GETPPID 1
-
-/* Define to 1 if you have the `getprotobyname' function. */
-#define HAVE_GETPROTOBYNAME 1
-
-/* Define to 1 if you have the `getpwuid' function. */
-#define HAVE_GETPWUID 1
-
-/* Define to 1 if you have the `getrlimit' function. */
-/*#define HAVE_GETRLIMIT 1*/
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#define HAVE_GETTIMEOFDAY 1
-
-/* we have a glibc-style strerror_r() */
-/* #undef HAVE_GLIBC_STRERROR_R */
-
-/* Define to 1 if you have the `gmtime_r' function. */
-#define HAVE_GMTIME_R 1
-
-/* if you have the gssapi libraries */
-/* #undef HAVE_GSSAPI */
-
-/* Define to 1 if you have the <gssapi/gssapi_generic.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_GENERIC_H */
-
-/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_H */
-
-/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */
-
-/* if you have the GNU gssapi libraries */
-/* #undef HAVE_GSSGNU */
-
-/* if you have the Heimdal gssapi libraries */
-/* #undef HAVE_GSSHEIMDAL */
-
-/* if you have the MIT gssapi libraries */
-/* #undef HAVE_GSSMIT */
-
-/* Define to 1 if you have the `idna_strerror' function. */
-/*#define HAVE_IDNA_STRERROR 1*/
-
-/* Define to 1 if you have the `idn_free' function. */
-/*#define HAVE_IDN_FREE 1*/
-
-/* Define to 1 if you have the <idn-free.h> header file. */
-/*#define HAVE_IDN_FREE_H 1*/
-
-/* Define to 1 if you have the `inet_addr' function. */
-/*#define HAVE_INET_ADDR 1*/
-
-/* Define to 1 if you have a IPv6 capable working inet_ntop function. */
-/*#define HAVE_INET_NTOP 1*/
-
-/* Define to 1 if you have a IPv6 capable working inet_pton function. */
-/*#define HAVE_INET_PTON 1*/
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the ioctl function. */
-#define HAVE_IOCTL 1
-
-/* Define to 1 if you have a working ioctl FIONBIO function. */
-#define HAVE_IOCTL_FIONBIO 1
-
-/* Define to 1 if you have the ioctlsocket function. */
-/* #undef HAVE_IOCTLSOCKET */
-
-/* Define to 1 if you have a working ioctlsocket FIONBIO function. */
-/* #undef HAVE_IOCTLSOCKET_FIONBIO */
-
-/* Define to 1 if you have the IoctlSocket camel case function. */
-/* #undef HAVE_IOCTLSOCKET_CAMEL */
-
-/* Define to 1 if you have a working IoctlSocket camel case FIONBIO
- function. */
-/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */
-
-/* Define to 1 if you have the <io.h> header file. */
-/* #undef HAVE_IO_H */
-
-/* if you have the Kerberos4 libraries (including -ldes) */
-/* #undef HAVE_KRB4 */
-
-/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */
-/* #undef HAVE_KRB_GET_OUR_IP_FOR_REALM */
-
-/* Define to 1 if you have the <krb.h> header file. */
-/* #undef HAVE_KRB_H */
-
-/* Define to 1 if you have the lber.h header file. */
-/*#define HAVE_LBER_H 1*/
-
-/* Define to 1 if you have the ldapssl.h header file. */
-/* #undef HAVE_LDAPSSL_H */
-
-/* Define to 1 if you have the ldap.h header file. */
-/*#define HAVE_LDAP_H 1*/
-
-/* Use LDAPS implementation */
-/*#define HAVE_LDAP_SSL 1*/
-
-/* Define to 1 if you have the ldap_ssl.h header file. */
-/* #undef HAVE_LDAP_SSL_H */
-
-/* Define to 1 if you have the `ldap_url_parse' function. */
-/*#define HAVE_LDAP_URL_PARSE 1*/
-
-/* Define to 1 if you have the <libgen.h> header file. */
-/*#define HAVE_LIBGEN_H 1*/
-
-/* Define to 1 if you have the `idn' library (-lidn). */
-/*#define HAVE_LIBIDN 1*/
-
-/* Define to 1 if you have the `resolv' library (-lresolv). */
-/* #undef HAVE_LIBRESOLV */
-
-/* Define to 1 if you have the `resolve' library (-lresolve). */
-/* #undef HAVE_LIBRESOLVE */
-
-/* Define to 1 if you have the `socket' library (-lsocket). */
-/* #undef HAVE_LIBSOCKET */
-
-/* Define to 1 if you have the `ssh2' library (-lssh2). */
-/*#define HAVE_LIBSSH2 1*/
-
-/* Define to 1 if you have the <libssh2.h> header file. */
-/*#define HAVE_LIBSSH2_H 1*/
-
-/* if your compiler supports LL */
-#define HAVE_LL 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if you have the `localtime_r' function. */
-#define HAVE_LOCALTIME_R 1
-
-/* Define to 1 if the compiler supports the 'long long' data type. */
-#define HAVE_LONGLONG 1
-
-/* Define to 1 if you have the malloc.h header file. */
-/*#define HAVE_MALLOC_H 1*/
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the MSG_NOSIGNAL flag. */
-/*#define HAVE_MSG_NOSIGNAL 1*/
-
-/* Define to 1 if you have the <netdb.h> header file. */
-#define HAVE_NETDB_H 1
-
-/* Define to 1 if you have the <netinet/in.h> header file. */
-#define HAVE_NETINET_IN_H 1
-
-/* Define to 1 if you have the <netinet/tcp.h> header file. */
-/*#define HAVE_NETINET_TCP_H 1*/
-
-/* Define to 1 if you have the <net/if.h> header file. */
-#define HAVE_NET_IF_H 1
-
-/* Define to 1 if NI_WITHSCOPEID exists and works. */
-/*#define HAVE_NI_WITHSCOPEID 1*/
-
-/* we have no strerror_r() proto */
-/* #undef HAVE_NO_STRERROR_R_DECL */
-
-/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE
- */
-/* #undef HAVE_OLD_GSSMIT */
-
-/* Define to 1 if you have the <openssl/crypto.h> header file. */
-/*#define HAVE_OPENSSL_CRYPTO_H 1*/
-
-/* Define to 1 if you have the <openssl/engine.h> header file. */
-/*#define HAVE_OPENSSL_ENGINE_H 1*/
-
-/* Define to 1 if you have the <openssl/err.h> header file. */
-/*#define HAVE_OPENSSL_ERR_H 1*/
-
-/* Define to 1 if you have the <openssl/pem.h> header file. */
-/*#define HAVE_OPENSSL_PEM_H 1*/
-
-/* Define to 1 if you have the <openssl/pkcs12.h> header file. */
-/*#define HAVE_OPENSSL_PKCS12_H 1*/
-
-/* Define to 1 if you have the <openssl/rsa.h> header file. */
-/*#define HAVE_OPENSSL_RSA_H 1*/
-
-/* Define to 1 if you have the <openssl/ssl.h> header file. */
-/*#define HAVE_OPENSSL_SSL_H 1*/
-
-/* Define to 1 if you have the <openssl/x509.h> header file. */
-/*#define HAVE_OPENSSL_X509_H 1*/
-
-/* Define to 1 if you have the <pem.h> header file. */
-/* #undef HAVE_PEM_H */
-
-/* Define to 1 if you have the `perror' function. */
-#define HAVE_PERROR 1
-
-/* Define to 1 if you have the `pipe' function. */
-#define HAVE_PIPE 1
-
-/* Define to 1 if you have the `poll' function. */
-/*#define HAVE_POLL 1*/
-
-/* If you have a fine poll */
-/*#define HAVE_POLL_FINE 1*/
-
-/* Define to 1 if you have the <poll.h> header file. */
-/*#define HAVE_POLL_H 1*/
-
-/* we have a POSIX-style strerror_r() */
-#define HAVE_POSIX_STRERROR_R 1
-
-/* Define to 1 if you have the <pwd.h> header file. */
-#define HAVE_PWD_H 1
-
-/* Define to 1 if you have the `RAND_egd' function. */
-#define HAVE_RAND_EGD 1
-
-/* Define to 1 if you have the `RAND_screen' function. */
-/* #undef HAVE_RAND_SCREEN */
-
-/* Define to 1 if you have the `RAND_status' function. */
-/*#define HAVE_RAND_STATUS 1*/
-
-/* Define to 1 if you have the recv function. */
-#define HAVE_RECV 1
-
-/* Define to 1 if you have the recvfrom function. */
-#define HAVE_RECVFROM 1
-
-/* Define to 1 if you have the <rsa.h> header file. */
-/* #undef HAVE_RSA_H */
-
-/* Define to 1 if you have the select function. */
-#define HAVE_SELECT 1
-
-/* Define to 1 if you have the send function. */
-#define HAVE_SEND 1
-
-/* Define to 1 if you have the <setjmp.h> header file. */
-#define HAVE_SETJMP_H 1
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if you have the `setmode' function. */
-/* #undef HAVE_SETMODE */
-
-/* Define to 1 if you have the `setrlimit' function. */
-/*#define HAVE_SETRLIMIT 1*/
-
-/* Define to 1 if you have the setsockopt function. */
-/* #undef HAVE_SETSOCKOPT */
-
-/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */
-/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */
-
-/* Define to 1 if you have the <sgtty.h> header file. */
-/*#define HAVE_SGTTY_H 1*/
-
-/* Define to 1 if you have the `sigaction' function. */
-/*#define HAVE_SIGACTION 1*/
-
-/* Define to 1 if you have the `siginterrupt' function. */
-/*#define HAVE_SIGINTERRUPT 1*/
-
-/* Define to 1 if you have the `signal' function. */
-/*#define HAVE_SIGNAL 1*/
-
-/* Define to 1 if you have the <signal.h> header file. */
-#define HAVE_SIGNAL_H 1
-
-/* If you have sigsetjmp */
-/*#define HAVE_SIGSETJMP 1*/
-
-/* Define to 1 if sig_atomic_t is an available typedef. */
-/*#define HAVE_SIG_ATOMIC_T 1*/
-
-/* Define to 1 if sig_atomic_t is already defined as volatile. */
-/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */
-
-/* Define to 1 if you have the `socket' function. */
-#define HAVE_SOCKET 1
-
-/* Define to 1 if you have the <ssl.h> header file. */
-/* #undef HAVE_SSL_H */
-
-/* Define to 1 if you have the <stdbool.h> header file. */
-#define HAVE_STDBOOL_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdio.h> header file. */
-#define HAVE_STDIO_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the `strcmpi' function. */
-/* #undef HAVE_STRCMPI */
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror_r' function. */
-#define HAVE_STRERROR_R 1
-
-/* Define to 1 if you have the `stricmp' function. */
-/* #undef HAVE_STRICMP */
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strlcpy' function. */
-#define HAVE_STRLCPY 1
-
-/* Define to 1 if you have the `strstr' function. */
-#define HAVE_STRSTR 1
-
-/* Define to 1 if you have the `strtok_r' function. */
-#define HAVE_STRTOK_R 1
-
-/* Define to 1 if you have the `strtoll' function. */
-#define HAVE_STRTOLL 1
-
-/* if struct sockaddr_storage is defined */
-#define HAVE_STRUCT_SOCKADDR_STORAGE 1
-
-/* Define to 1 if you have the timeval struct. */
-#define HAVE_STRUCT_TIMEVAL 1
-
-/* Define to 1 if you have the <sys/filio.h> header file. */
-#define HAVE_SYS_FILIO_H 1
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#define HAVE_SYS_IOCTL_H 1
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#define HAVE_SYS_PARAM_H 1
-
-/* Define to 1 if you have the <sys/poll.h> header file. */
-/*#define HAVE_SYS_POLL_H 1*/
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#define HAVE_SYS_SELECT_H 1
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#define HAVE_SYS_SOCKET_H 1
-
-/* Define to 1 if you have the <sys/sockio.h> header file. */
-#define HAVE_SYS_SOCKIO_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <sys/utime.h> header file. */
-/* #undef HAVE_SYS_UTIME_H */
-
-/* Define to 1 if you have the <termios.h> header file. */
-/*#define HAVE_TERMIOS_H 1*/
-
-/* Define to 1 if you have the <termio.h> header file. */
-/*#define HAVE_TERMIO_H 1*/
-
-/* Define to 1 if you have the <time.h> header file. */
-#define HAVE_TIME_H 1
-
-/* Define to 1 if you have the <tld.h> header file. */
-/*#define HAVE_TLD_H 1*/
-
-/* Define to 1 if you have the `tld_strerror' function. */
-/*#define HAVE_TLD_STRERROR 1*/
-
-/* Define to 1 if you have the `uname' function. */
-#define HAVE_UNAME 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `utime' function. */
-#define HAVE_UTIME 1
-
-/* Define to 1 if you have the <utime.h> header file. */
-#define HAVE_UTIME_H 1
-
-/* Define to 1 if compiler supports C99 variadic macro style. */
-#define HAVE_VARIADIC_MACROS_C99 1
-
-/* Define to 1 if compiler supports old gcc variadic macro style. */
-/*#define HAVE_VARIADIC_MACROS_GCC 1*/
-
-/* Define to 1 if you have the winber.h header file. */
-/* #undef HAVE_WINBER_H */
-
-/* Define to 1 if you have the windows.h header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Define to 1 if you have the winldap.h header file. */
-/* #undef HAVE_WINLDAP_H */
-
-/* Define to 1 if you have the winsock2.h header file. */
-/* #undef HAVE_WINSOCK2_H */
-
-/* Define to 1 if you have the winsock.h header file. */
-/* #undef HAVE_WINSOCK_H */
-
-/* Define this symbol if your OS supports changing the contents of argv */
-/*#define HAVE_WRITABLE_ARGV 1*/
-
-/* Define to 1 if you have the ws2tcpip.h header file. */
-/* #undef HAVE_WS2TCPIP_H */
-
-/* Define to 1 if you have the <x509.h> header file. */
-/* #undef HAVE_X509_H */
-
-/* Define to 1 if you need the lber.h header file even with ldap.h */
-/* #undef NEED_LBER_H */
-
-/* Define to 1 if you need the malloc.h header file even with stdlib.h */
-/* #undef NEED_MALLOC_H */
-
-/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */
-/* #undef NEED_REENTRANT */
-
-/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */
-/* #undef NEED_THREAD_SAFE */
-
-/* cpu-machine-OS */
-#ifdef __WINS__
-#define OS "i386-pc-epoc32"
-#elif __MARM__
-#define OS "arm-unknown-epoc32"
-#else
-/* This won't happen on any current Symbian version */
-#define OS "unknown-unknown-epoc32"
-#endif
-
-/* Name of package */
-/*#define PACKAGE "curl"*/
-
-/* Define to the address where bug reports for this package should be sent. */
-/*#define PACKAGE_BUGREPORT \
- "a suitable curl mailing list => https://curl.haxx.se/mail/"*/
-
-/* Define to the full name of this package. */
-/*#define PACKAGE_NAME "curl"*/
-
-/* Define to the full name and version of this package. */
-/*#define PACKAGE_STRING "curl -"*/
-
-/* Define to the one symbol short name of this package. */
-/*#define PACKAGE_TARNAME "curl"*/
-
-/* Define to the version of this package. */
-/*#define PACKAGE_VERSION "-"*/
-
-/* a suitable file to read random data from */
-/*#define RANDOM_FILE "/dev/urandom"*/
-
-#define RECV_TYPE_ARG1 int
-#define RECV_TYPE_ARG2 void *
-#define RECV_TYPE_ARG3 size_t
-#define RECV_TYPE_ARG4 int
-#define RECV_TYPE_RETV ssize_t
-
-#define RECVFROM_TYPE_ARG1 int
-#define RECVFROM_TYPE_ARG2 void
-#define RECVFROM_TYPE_ARG3 size_t
-#define RECVFROM_TYPE_ARG4 int
-#define RECVFROM_TYPE_ARG5 struct sockaddr
-#define RECVFROM_TYPE_ARG6 size_t
-#define RECVFROM_TYPE_RETV ssize_t
-#define RECVFROM_TYPE_ARG2_IS_VOID 1
-
-#define SEND_TYPE_ARG1 int
-#define SEND_QUAL_ARG2 const
-#define SEND_TYPE_ARG2 void *
-#define SEND_TYPE_ARG3 size_t
-#define SEND_TYPE_ARG4 int
-#define SEND_TYPE_RETV ssize_t
-
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-/*#define RETSIGTYPE void*/
-
-/* Define to the type of arg 1 for `select'. */
-#define SELECT_TYPE_ARG1 int
-
-/* Define to the type of args 2, 3 and 4 for `select'. */
-#define SELECT_TYPE_ARG234 (fd_set *)
-
-/* Define to the type of arg 5 for `select'. */
-#define SELECT_TYPE_ARG5 (struct timeval *)
-
-/* The size of `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of `off_t', as computed by sizeof. */
-#define SIZEOF_OFF_T 8
-
-/* The size of `short', as computed by sizeof. */
-#define SIZEOF_SHORT 2
-
-/* The size of `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* The size of `time_t', as computed by sizeof. */
-#define SIZEOF_TIME_T 4
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Define if you want to enable c-ares support */
-/* #undef USE_ARES */
-
-/* Define to disable non-blocking sockets */
-/* #undef USE_BLOCKING_SOCKETS */
-
-/* if GnuTLS is enabled */
-/* #undef USE_GNUTLS */
-
-/* if libSSH2 is in use */
-/*#define USE_LIBSSH2 1*/
-
-/* If you want to build curl with the built-in manual */
-/*#define USE_MANUAL 1*/
-
-/* if NSS is enabled */
-/* #undef USE_NSS */
-
-/* to enable SSPI support */
-/* #undef USE_WINDOWS_SSPI */
-
-/* Define to 1 if using yaSSL in OpenSSL compatibility mode. */
-/* #undef USE_YASSLEMUL */
-
-/* Version number of package */
-/*#define VERSION "7.18.2-CVS"*/
-
-/* Define to avoid automatic inclusion of winsock.h */
-/* #undef WIN32_LEAN_AND_MEAN */
-
-/* Define to 1 if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-/* # undef _ALL_SOURCE */
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#define _FILE_OFFSET_BITS 64
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* type to use in place of in_addr_t if not defined */
-/* #undef in_addr_t */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* the signed version of size_t */
-/* #undef ssize_t */
-
-/* Enabling curl debug mode when building in Symbian debug mode would work */
-/* except that debug mode introduces new exports that must be frozen. */
-#ifdef _DEBUG
-/* #define CURLDEBUG */
-#endif
-
-/* sys/cdefs.h fails to define this for WINSCW prior to Symbian OS ver. 9.4 */
-#ifndef __LONG_LONG_SUPPORTED
-#define __LONG_LONG_SUPPORTED
-#endif
-
-/* Enable appropriate header only when zlib support is enabled */
-#ifdef HAVE_LIBZ
-#define HAVE_ZLIB_H 1
-#endif
-
-#endif /* HEADER_CURL_CONFIG_SYMBIAN_H */
diff --git a/lib/config-tpf.h b/lib/config-tpf.h
index f0c095bb0..199dfbcd5 100644
--- a/lib/config-tpf.h
+++ b/lib/config-tpf.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -115,14 +115,6 @@
/* #undef HAVE_CRYPTO_H */
#define HAVE_CRYPTO_H 1
-/* Define to 1 if you have the <des.h> header file. */
-/* #undef HAVE_DES_H */
-#define HAVE_DES_H 1
-
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-/* #undef HAVE_ENGINE_LOAD_BUILTIN_ENGINES */
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1
@@ -320,10 +312,6 @@
/* #undef HAVE_OPENSSL_CRYPTO_H */
#define HAVE_OPENSSL_CRYPTO_H 1
-/* Define to 1 if you have the <openssl/engine.h> header file. */
-/* #undef HAVE_OPENSSL_ENGINE_H */
-#define HAVE_OPENSSL_ENGINE_H 1
-
/* Define to 1 if you have the <openssl/err.h> header file. */
/* #undef HAVE_OPENSSL_ERR_H */
#define HAVE_OPENSSL_ERR_H 1
diff --git a/lib/config-vxworks.h b/lib/config-vxworks.h
index d352578e3..14bf0be46 100644
--- a/lib/config-vxworks.h
+++ b/lib/config-vxworks.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -137,15 +137,9 @@
/* Define to 1 if you have the <crypto.h> header file. */
/* #undef HAVE_CRYPTO_H */
-/* Define to 1 if you have the <des.h> header file. */
-/* #undef HAVE_DES_H */
-
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1
@@ -421,9 +415,6 @@
/* Define to 1 if you have the <openssl/crypto.h> header file. */
#define HAVE_OPENSSL_CRYPTO_H 1
-/* Define to 1 if you have the <openssl/engine.h> header file. */
-#define HAVE_OPENSSL_ENGINE_H 1
-
/* Define to 1 if you have the <openssl/err.h> header file. */
#define HAVE_OPENSSL_ERR_H 1
diff --git a/lib/config-win32.h b/lib/config-win32.h
index 90c105476..316043d81 100644
--- a/lib/config-win32.h
+++ b/lib/config-win32.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -183,7 +183,7 @@
/* #define HAVE_DOPRNT 1 */
/* Define if you have the ftruncate function. */
-#define HAVE_FTRUNCATE 1
+/* #define HAVE_FTRUNCATE 1 */
/* Define to 1 if you have the `getpeername' function. */
#define HAVE_GETPEERNAME 1
@@ -714,14 +714,24 @@ Vista
#endif
/* Define to use the Windows crypto library. */
+#if !defined(CURL_WINDOWS_APP)
#define USE_WIN32_CRYPTO
+#endif
+/* On MinGW the ADDRESS_FAMILY typedef was committed alongside LUP_SECURE,
+ so we use it to check for the presence of the typedef. */
+#include <ws2tcpip.h>
+#if !defined(__MINGW32__) || defined(LUP_SECURE)
/* Define to use Unix sockets. */
-#if defined(_MSC_VER) && (_MSC_VER >= 1500)
-/* sdkddkver.h first shipped with Platform SDK v6.0A included with VS2008 */
-#include <sdkddkver.h>
-#if defined(NTDDI_WIN10_RS4)
#define USE_UNIX_SOCKETS
+#if !defined(UNIX_PATH_MAX)
+ /* Replicating logic present in afunix.h of newer Windows 10 SDK versions */
+# define UNIX_PATH_MAX 108
+ /* !checksrc! disable TYPEDEFSTRUCT 1 */
+ typedef struct sockaddr_un {
+ ADDRESS_FAMILY sun_family;
+ char sun_path[UNIX_PATH_MAX];
+ } SOCKADDR_UN, *PSOCKADDR_UN;
#endif
#endif
@@ -735,8 +745,12 @@ Vista
#define OS "i386-pc-win32"
#elif defined(_M_X64) || defined(__x86_64__) /* x86_64 (MSVC >=2005 or gcc) */
#define OS "x86_64-pc-win32"
-#elif defined(_M_IA64) /* Itanium */
+#elif defined(_M_IA64) || defined(__ia64__) /* Itanium */
#define OS "ia64-pc-win32"
+#elif defined(_M_ARM_NT) || defined(__arm__) /* ARMv7-Thumb2 (Windows RT) */
+#define OS "thumbv7a-pc-win32"
+#elif defined(_M_ARM64) || defined(__aarch64__) /* ARM64 (Windows 10) */
+#define OS "aarch64-pc-win32"
#else
#define OS "unknown-pc-win32"
#endif
diff --git a/lib/config-win32ce.h b/lib/config-win32ce.h
index 182052290..5eb1c18f6 100644
--- a/lib/config-win32ce.h
+++ b/lib/config-win32ce.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/conncache.c b/lib/conncache.c
index 57d6061fd..c0e4d3e30 100644
--- a/lib/conncache.c
+++ b/lib/conncache.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012 - 2016, Linus Nielsen Feltzing, <linus@haxx.se>
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,27 +40,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-#ifdef CURLDEBUG
-/* the debug versions of these macros make extra certain that the lock is
- never doubly locked or unlocked */
-#define CONN_LOCK(x) if((x)->share) { \
- Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE); \
- DEBUGASSERT(!(x)->state.conncache_lock); \
- (x)->state.conncache_lock = TRUE; \
- }
-
-#define CONN_UNLOCK(x) if((x)->share) { \
- DEBUGASSERT((x)->state.conncache_lock); \
- (x)->state.conncache_lock = FALSE; \
- Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT); \
- }
-#else
-#define CONN_LOCK(x) if((x)->share) \
- Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
-#define CONN_UNLOCK(x) if((x)->share) \
- Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
-#endif
-
#define HASHKEY_SIZE 128
static void conn_llist_dtor(void *user, void *element)
@@ -70,58 +49,57 @@ static void conn_llist_dtor(void *user, void *element)
conn->bundle = NULL;
}
-static CURLcode bundle_create(struct Curl_easy *data,
- struct connectbundle **cb_ptr)
+static CURLcode bundle_create(struct connectbundle **bundlep)
{
- (void)data;
- DEBUGASSERT(*cb_ptr == NULL);
- *cb_ptr = malloc(sizeof(struct connectbundle));
- if(!*cb_ptr)
+ DEBUGASSERT(*bundlep == NULL);
+ *bundlep = malloc(sizeof(struct connectbundle));
+ if(!*bundlep)
return CURLE_OUT_OF_MEMORY;
- (*cb_ptr)->num_connections = 0;
- (*cb_ptr)->multiuse = BUNDLE_UNKNOWN;
+ (*bundlep)->num_connections = 0;
+ (*bundlep)->multiuse = BUNDLE_UNKNOWN;
- Curl_llist_init(&(*cb_ptr)->conn_list, (curl_llist_dtor) conn_llist_dtor);
+ Curl_llist_init(&(*bundlep)->conn_list, (Curl_llist_dtor) conn_llist_dtor);
return CURLE_OK;
}
-static void bundle_destroy(struct connectbundle *cb_ptr)
+static void bundle_destroy(struct connectbundle *bundle)
{
- if(!cb_ptr)
+ if(!bundle)
return;
- Curl_llist_destroy(&cb_ptr->conn_list, NULL);
+ Curl_llist_destroy(&bundle->conn_list, NULL);
- free(cb_ptr);
+ free(bundle);
}
/* Add a connection to a bundle */
-static void bundle_add_conn(struct connectbundle *cb_ptr,
+static void bundle_add_conn(struct connectbundle *bundle,
struct connectdata *conn)
{
- Curl_llist_insert_next(&cb_ptr->conn_list, cb_ptr->conn_list.tail, conn,
+ Curl_llist_insert_next(&bundle->conn_list, bundle->conn_list.tail, conn,
&conn->bundle_node);
- conn->bundle = cb_ptr;
- cb_ptr->num_connections++;
+ conn->bundle = bundle;
+ bundle->num_connections++;
}
/* Remove a connection from a bundle */
-static int bundle_remove_conn(struct connectbundle *cb_ptr,
+static int bundle_remove_conn(struct connectbundle *bundle,
struct connectdata *conn)
{
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
- curr = cb_ptr->conn_list.head;
+ curr = bundle->conn_list.head;
while(curr) {
if(curr->ptr == conn) {
- Curl_llist_remove(&cb_ptr->conn_list, curr, NULL);
- cb_ptr->num_connections--;
+ Curl_llist_remove(&bundle->conn_list, curr, NULL);
+ bundle->num_connections--;
conn->bundle = NULL;
return 1; /* we removed a handle */
}
curr = curr->next;
}
+ DEBUGASSERT(0);
return 0;
}
@@ -165,12 +143,15 @@ static void hashkey(struct connectdata *conn, char *buf,
const char *hostname;
long port = conn->remote_port;
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
hostname = conn->http_proxy.host.name;
port = conn->port;
}
- else if(conn->bits.conn_to_host)
- hostname = conn->conn_to_host.name;
+ else
+#endif
+ if(conn->bits.conn_to_host)
+ hostname = conn->conn_to_host.name;
else
hostname = conn->host.name;
@@ -182,32 +163,15 @@ static void hashkey(struct connectdata *conn, char *buf,
msnprintf(buf, len, "%ld%s", port, hostname);
}
-void Curl_conncache_unlock(struct Curl_easy *data)
-{
- CONN_UNLOCK(data);
-}
-
/* Returns number of connections currently held in the connection cache.
Locks/unlocks the cache itself!
*/
size_t Curl_conncache_size(struct Curl_easy *data)
{
size_t num;
- CONN_LOCK(data);
+ CONNCACHE_LOCK(data);
num = data->state.conn_cache->num_conn;
- CONN_UNLOCK(data);
- return num;
-}
-
-/* Returns number of connections currently held in the connections's bundle
- Locks/unlocks the cache itself!
-*/
-size_t Curl_conncache_bundle_size(struct connectdata *conn)
-{
- size_t num;
- CONN_LOCK(conn->data);
- num = conn->bundle->num_connections;
- CONN_UNLOCK(conn->data);
+ CONNCACHE_UNLOCK(data);
return num;
}
@@ -220,7 +184,7 @@ struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
const char **hostp)
{
struct connectbundle *bundle = NULL;
- CONN_LOCK(conn->data);
+ CONNCACHE_LOCK(conn->data);
if(connc) {
char key[HASHKEY_SIZE];
hashkey(conn, key, sizeof(key), hostp);
@@ -242,8 +206,8 @@ static bool conncache_add_bundle(struct conncache *connc,
static void conncache_remove_bundle(struct conncache *connc,
struct connectbundle *bundle)
{
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
if(!connc)
return;
@@ -267,8 +231,7 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
struct connectdata *conn)
{
CURLcode result = CURLE_OK;
- struct connectbundle *bundle;
- struct connectbundle *new_bundle = NULL;
+ struct connectbundle *bundle = NULL;
struct Curl_easy *data = conn->data;
/* *find_bundle() locks the connection cache */
@@ -277,20 +240,19 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
int rc;
char key[HASHKEY_SIZE];
- result = bundle_create(data, &new_bundle);
+ result = bundle_create(&bundle);
if(result) {
goto unlock;
}
hashkey(conn, key, sizeof(key), NULL);
- rc = conncache_add_bundle(data->state.conn_cache, key, new_bundle);
+ rc = conncache_add_bundle(data->state.conn_cache, key, bundle);
if(!rc) {
- bundle_destroy(new_bundle);
+ bundle_destroy(bundle);
result = CURLE_OUT_OF_MEMORY;
goto unlock;
}
- bundle = new_bundle;
}
bundle_add_conn(bundle, conn);
@@ -302,15 +264,17 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc,
conn->connection_id, connc->num_conn));
unlock:
- CONN_UNLOCK(data);
+ CONNCACHE_UNLOCK(data);
return result;
}
/*
- * Removes the connectdata object from the connection cache *and* clears the
- * ->data pointer association. Pass TRUE/FALSE in the 'lock' argument
- * depending on if the parent function already holds the lock or not.
+ * Removes the connectdata object from the connection cache, but does *not*
+ * clear the conn->data association. The transfer still owns this connection.
+ *
+ * Pass TRUE/FALSE in the 'lock' argument depending on if the parent function
+ * already holds the lock or not.
*/
void Curl_conncache_remove_conn(struct Curl_easy *data,
struct connectdata *conn, bool lock)
@@ -322,7 +286,7 @@ void Curl_conncache_remove_conn(struct Curl_easy *data,
due to a failed connection attempt, before being added to a bundle */
if(bundle) {
if(lock) {
- CONN_LOCK(data);
+ CONNCACHE_LOCK(data);
}
bundle_remove_conn(bundle, conn);
if(bundle->num_connections == 0)
@@ -333,9 +297,8 @@ void Curl_conncache_remove_conn(struct Curl_easy *data,
DEBUGF(infof(data, "The cache now contains %zu members\n",
connc->num_conn));
}
- conn->data = NULL; /* clear the association */
if(lock) {
- CONN_UNLOCK(data);
+ CONNCACHE_UNLOCK(data);
}
}
}
@@ -357,14 +320,14 @@ bool Curl_conncache_foreach(struct Curl_easy *data,
void *param,
int (*func)(struct connectdata *conn, void *param))
{
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_llist_element *curr;
+ struct Curl_hash_element *he;
if(!connc)
return FALSE;
- CONN_LOCK(data);
+ CONNCACHE_LOCK(data);
Curl_hash_start_iterate(&connc->hash, &iter);
he = Curl_hash_next_element(&iter);
@@ -382,12 +345,12 @@ bool Curl_conncache_foreach(struct Curl_easy *data,
curr = curr->next;
if(1 == func(conn, param)) {
- CONN_UNLOCK(data);
+ CONNCACHE_UNLOCK(data);
return TRUE;
}
}
}
- CONN_UNLOCK(data);
+ CONNCACHE_UNLOCK(data);
return FALSE;
}
@@ -400,15 +363,15 @@ bool Curl_conncache_foreach(struct Curl_easy *data,
static struct connectdata *
conncache_find_first_connection(struct conncache *connc)
{
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
struct connectbundle *bundle;
Curl_hash_start_iterate(&connc->hash, &iter);
he = Curl_hash_next_element(&iter);
while(he) {
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
bundle = he->ptr;
curr = bundle->conn_list.head;
@@ -428,17 +391,15 @@ conncache_find_first_connection(struct conncache *connc)
*
* Return TRUE if stored, FALSE if closed.
*/
-bool Curl_conncache_return_conn(struct connectdata *conn)
+bool Curl_conncache_return_conn(struct Curl_easy *data,
+ struct connectdata *conn)
{
- struct Curl_easy *data = conn->data;
-
/* data->multi->maxconnects can be negative, deal with it. */
size_t maxconnects =
(data->multi->maxconnects < 0) ? data->multi->num_easy * 4:
data->multi->maxconnects;
struct connectdata *conn_candidate = NULL;
- conn->data = NULL; /* no owner anymore */
conn->lastused = Curl_now(); /* it was used up until now */
if(maxconnects > 0 &&
Curl_conncache_size(data) > maxconnects) {
@@ -468,7 +429,7 @@ struct connectdata *
Curl_conncache_extract_bundle(struct Curl_easy *data,
struct connectbundle *bundle)
{
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
timediff_t highscore = -1;
timediff_t score;
struct curltime now;
@@ -516,9 +477,9 @@ struct connectdata *
Curl_conncache_extract_oldest(struct Curl_easy *data)
{
struct conncache *connc = data->state.conn_cache;
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_llist_element *curr;
+ struct Curl_hash_element *he;
timediff_t highscore =- 1;
timediff_t score;
struct curltime now;
@@ -528,7 +489,7 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
now = Curl_now();
- CONN_LOCK(data);
+ CONNCACHE_LOCK(data);
Curl_hash_start_iterate(&connc->hash, &iter);
he = Curl_hash_next_element(&iter);
@@ -541,7 +502,8 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
while(curr) {
conn = curr->ptr;
- if(!CONN_INUSE(conn) && !conn->data) {
+ if(!CONN_INUSE(conn) && !conn->data && !conn->bits.close &&
+ !conn->bits.connect_only) {
/* Set higher score for the age passed since the connection was used */
score = Curl_timediff(now, conn->lastused);
@@ -564,7 +526,7 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
connc->num_conn));
conn_candidate->data = data; /* associate! */
}
- CONN_UNLOCK(data);
+ CONNCACHE_UNLOCK(data);
return conn_candidate;
}
@@ -572,6 +534,11 @@ Curl_conncache_extract_oldest(struct Curl_easy *data)
void Curl_conncache_close_all_connections(struct conncache *connc)
{
struct connectdata *conn;
+ char buffer[READBUFFER_MIN + 1];
+ if(!connc->closure_handle)
+ return;
+ connc->closure_handle->state.buffer = buffer;
+ connc->closure_handle->set.buffer_size = READBUFFER_MIN;
conn = conncache_find_first_connection(connc);
while(conn) {
@@ -581,12 +548,14 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
sigpipe_ignore(conn->data, &pipe_st);
/* This will remove the connection from the cache */
connclose(conn, "kill all");
+ Curl_conncache_remove_conn(conn->data, conn, TRUE);
(void)Curl_disconnect(connc->closure_handle, conn, FALSE);
sigpipe_restore(&pipe_st);
conn = conncache_find_first_connection(connc);
}
+ connc->closure_handle->state.buffer = NULL;
if(connc->closure_handle) {
SIGPIPE_VARIABLE(pipe_st);
sigpipe_ignore(connc->closure_handle, &pipe_st);
@@ -602,9 +571,9 @@ void Curl_conncache_close_all_connections(struct conncache *connc)
/* Useful for debugging the connection cache */
void Curl_conncache_print(struct conncache *connc)
{
- struct curl_hash_iterator iter;
- struct curl_llist_element *curr;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_llist_element *curr;
+ struct Curl_hash_element *he;
if(!connc)
return;
diff --git a/lib/conncache.h b/lib/conncache.h
index 58f902409..c3e9ff51b 100644
--- a/lib/conncache.h
+++ b/lib/conncache.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2012 - 2014, Linus Nielsen Feltzing, <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
@@ -30,7 +30,7 @@
*/
struct conncache {
- struct curl_hash hash;
+ struct Curl_hash hash;
size_t num_conn;
long next_connection_id;
struct curltime last_cleanup;
@@ -42,10 +42,31 @@ struct conncache {
#define BUNDLE_UNKNOWN 0 /* initial value */
#define BUNDLE_MULTIPLEX 2
+#ifdef CURLDEBUG
+/* the debug versions of these macros make extra certain that the lock is
+ never doubly locked or unlocked */
+#define CONNCACHE_LOCK(x) if((x)->share) { \
+ Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE); \
+ DEBUGASSERT(!(x)->state.conncache_lock); \
+ (x)->state.conncache_lock = TRUE; \
+ }
+
+#define CONNCACHE_UNLOCK(x) if((x)->share) { \
+ DEBUGASSERT((x)->state.conncache_lock); \
+ (x)->state.conncache_lock = FALSE; \
+ Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT); \
+ }
+#else
+#define CONNCACHE_LOCK(x) if((x)->share) \
+ Curl_share_lock((x), CURL_LOCK_DATA_CONNECT, CURL_LOCK_ACCESS_SINGLE)
+#define CONNCACHE_UNLOCK(x) if((x)->share) \
+ Curl_share_unlock((x), CURL_LOCK_DATA_CONNECT)
+#endif
+
struct connectbundle {
int multiuse; /* supports multi-use */
size_t num_connections; /* Number of connections in the bundle */
- struct curl_llist conn_list; /* The connectdata members of the bundle */
+ struct Curl_llist conn_list; /* The connectdata members of the bundle */
};
/* returns 1 on error, 0 is fine */
@@ -56,12 +77,11 @@ void Curl_conncache_destroy(struct conncache *connc);
struct connectbundle *Curl_conncache_find_bundle(struct connectdata *conn,
struct conncache *connc,
const char **hostp);
-void Curl_conncache_unlock(struct Curl_easy *data);
/* returns number of connections currently held in the connection cache */
size_t Curl_conncache_size(struct Curl_easy *data);
-size_t Curl_conncache_bundle_size(struct connectdata *conn);
-bool Curl_conncache_return_conn(struct connectdata *conn);
+bool Curl_conncache_return_conn(struct Curl_easy *data,
+ struct connectdata *conn);
CURLcode Curl_conncache_add_conn(struct conncache *connc,
struct connectdata *conn) WARN_UNUSED_RESULT;
void Curl_conncache_remove_conn(struct Curl_easy *data,
diff --git a/lib/connect.c b/lib/connect.c
index 3b88a5962..5f23b79ca 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -74,7 +74,7 @@
#include "warnless.h"
#include "conncache.h"
#include "multihandle.h"
-#include "system_win32.h"
+#include "version_win32.h"
#include "quic.h"
#include "socks.h"
@@ -83,11 +83,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-#ifdef __SYMBIAN32__
-/* This isn't actually supported under Symbian OS */
-#undef SO_NOSIGPIPE
-#endif
-
static bool verifyconnect(curl_socket_t sockfd, int *error);
#if defined(__DragonFly__) || defined(HAVE_WINSOCK_H)
@@ -166,12 +161,13 @@ tcpkeepalive(struct Curl_easy *data,
static CURLcode
singleipconnect(struct connectdata *conn,
- const Curl_addrinfo *ai, /* start connecting to this */
- int sockindex); /* 0 or 1 among the temp ones */
+ const struct Curl_addrinfo *ai, /* start connecting to this */
+ int tempindex); /* 0 or 1 among the temp ones */
/*
* Curl_timeleft() returns the amount of milliseconds left allowed for the
- * transfer/connection. If the value is negative, the timeout time has already
+ * transfer/connection. If the value is 0, there's no timeout (ie there's
+ * infinite time left). If the value is negative, the timeout time has already
* elapsed.
*
* The start time is stored in progress.t_startsingle - as set with
@@ -555,13 +551,27 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
return rc;
}
-/* Used within the multi interface. Try next IP address, return TRUE if no
+/* update tempaddr[tempindex] (to the next entry), makes sure to stick
+ to the correct family */
+static struct Curl_addrinfo *ainext(struct connectdata *conn,
+ int tempindex,
+ bool next) /* use next entry? */
+{
+ struct Curl_addrinfo *ai = conn->tempaddr[tempindex];
+ if(ai && next)
+ ai = ai->ai_next;
+ while(ai && (ai->ai_family != conn->tempfamily[tempindex]))
+ ai = ai->ai_next;
+ conn->tempaddr[tempindex] = ai;
+ return ai;
+}
+
+/* Used within the multi interface. Try next IP address, returns error if no
more address exists or error */
static CURLcode trynextip(struct connectdata *conn,
int sockindex,
int tempindex)
{
- const int other = tempindex ^ 1;
CURLcode result = CURLE_COULDNT_CONNECT;
/* First clean up after the failed socket.
@@ -572,38 +582,15 @@ static CURLcode trynextip(struct connectdata *conn,
conn->tempsock[tempindex] = CURL_SOCKET_BAD;
if(sockindex == FIRSTSOCKET) {
- Curl_addrinfo *ai = NULL;
- int family = AF_UNSPEC;
-
- if(conn->tempaddr[tempindex]) {
- /* find next address in the same protocol family */
- family = conn->tempaddr[tempindex]->ai_family;
- ai = conn->tempaddr[tempindex]->ai_next;
- }
-#ifdef ENABLE_IPV6
- else if(conn->tempaddr[0]) {
- /* happy eyeballs - try the other protocol family */
- int firstfamily = conn->tempaddr[0]->ai_family;
- family = (firstfamily == AF_INET) ? AF_INET6 : AF_INET;
- ai = conn->tempaddr[0]->ai_next;
- }
-#endif
+ struct Curl_addrinfo *ai = conn->tempaddr[tempindex];
while(ai) {
- if(conn->tempaddr[other]) {
- /* we can safely skip addresses of the other protocol family */
- while(ai && ai->ai_family != family)
- ai = ai->ai_next;
- }
-
if(ai) {
result = singleipconnect(conn, ai, tempindex);
if(result == CURLE_COULDNT_CONNECT) {
- ai = ai->ai_next;
+ ai = ainext(conn, tempindex, TRUE);
continue;
}
-
- conn->tempaddr[tempindex] = ai;
}
break;
}
@@ -688,116 +675,141 @@ bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
connection */
void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
{
- if(conn->transport != TRNSPRT_TCP)
- /* there's no TCP connection! */
- return;
-
+ if(conn->transport == TRNSPRT_TCP) {
#if defined(HAVE_GETPEERNAME) || defined(HAVE_GETSOCKNAME)
- if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
- struct Curl_easy *data = conn->data;
- char buffer[STRERROR_LEN];
- struct Curl_sockaddr_storage ssrem;
- struct Curl_sockaddr_storage ssloc;
- curl_socklen_t plen;
- curl_socklen_t slen;
+ if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
+ struct Curl_easy *data = conn->data;
+ char buffer[STRERROR_LEN];
+ struct Curl_sockaddr_storage ssrem;
+ struct Curl_sockaddr_storage ssloc;
+ curl_socklen_t plen;
+ curl_socklen_t slen;
#ifdef HAVE_GETPEERNAME
- plen = sizeof(struct Curl_sockaddr_storage);
- if(getpeername(sockfd, (struct sockaddr*) &ssrem, &plen)) {
- int error = SOCKERRNO;
- failf(data, "getpeername() failed with errno %d: %s",
- error, Curl_strerror(error, buffer, sizeof(buffer)));
- return;
- }
+ plen = sizeof(struct Curl_sockaddr_storage);
+ if(getpeername(sockfd, (struct sockaddr*) &ssrem, &plen)) {
+ int error = SOCKERRNO;
+ failf(data, "getpeername() failed with errno %d: %s",
+ error, Curl_strerror(error, buffer, sizeof(buffer)));
+ return;
+ }
#endif
#ifdef HAVE_GETSOCKNAME
- slen = sizeof(struct Curl_sockaddr_storage);
- memset(&ssloc, 0, sizeof(ssloc));
- if(getsockname(sockfd, (struct sockaddr*) &ssloc, &slen)) {
- int error = SOCKERRNO;
- failf(data, "getsockname() failed with errno %d: %s",
- error, Curl_strerror(error, buffer, sizeof(buffer)));
- return;
- }
+ slen = sizeof(struct Curl_sockaddr_storage);
+ memset(&ssloc, 0, sizeof(ssloc));
+ if(getsockname(sockfd, (struct sockaddr*) &ssloc, &slen)) {
+ int error = SOCKERRNO;
+ failf(data, "getsockname() failed with errno %d: %s",
+ error, Curl_strerror(error, buffer, sizeof(buffer)));
+ return;
+ }
#endif
#ifdef HAVE_GETPEERNAME
- if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
- conn->primary_ip, &conn->primary_port)) {
- failf(data, "ssrem inet_ntop() failed with errno %d: %s",
- errno, Curl_strerror(errno, buffer, sizeof(buffer)));
- return;
- }
- memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
+ if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
+ conn->primary_ip, &conn->primary_port)) {
+ failf(data, "ssrem inet_ntop() failed with errno %d: %s",
+ errno, Curl_strerror(errno, buffer, sizeof(buffer)));
+ return;
+ }
+ memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
#endif
#ifdef HAVE_GETSOCKNAME
- if(!Curl_addr2string((struct sockaddr*)&ssloc, slen,
- conn->local_ip, &conn->local_port)) {
- failf(data, "ssloc inet_ntop() failed with errno %d: %s",
- errno, Curl_strerror(errno, buffer, sizeof(buffer)));
- return;
- }
+ if(!Curl_addr2string((struct sockaddr*)&ssloc, slen,
+ conn->local_ip, &conn->local_port)) {
+ failf(data, "ssloc inet_ntop() failed with errno %d: %s",
+ errno, Curl_strerror(errno, buffer, sizeof(buffer)));
+ return;
+ }
#endif
- }
+ }
#else /* !HAVE_GETSOCKNAME && !HAVE_GETPEERNAME */
- (void)sockfd; /* unused */
+ (void)sockfd; /* unused */
#endif
+ } /* end of TCP-only section */
/* persist connection info in session handle */
Curl_persistconninfo(conn);
}
-/* after a TCP connection to the proxy has been verified, this function does
- the next magic step.
+/* After a TCP connection to the proxy has been verified, this function does
+ the next magic steps. If 'done' isn't set TRUE, it is not done yet and
+ must be called again.
Note: this function's sub-functions call failf()
*/
-static CURLcode connected_proxy(struct connectdata *conn, int sockindex)
+static CURLcode connect_SOCKS(struct connectdata *conn, int sockindex,
+ bool *done)
{
CURLcode result = CURLE_OK;
-
- if(conn->bits.socksproxy) {
#ifndef CURL_DISABLE_PROXY
+ CURLproxycode pxresult = CURLPX_OK;
+ if(conn->bits.socksproxy) {
/* for the secondary socket (FTP), use the "connect to host"
* but ignore the "connect to port" (use the secondary port)
*/
- const char * const host = conn->bits.httpproxy ?
- conn->http_proxy.host.name :
- conn->bits.conn_to_host ?
- conn->conn_to_host.name :
- sockindex == SECONDARYSOCKET ?
- conn->secondaryhostname : conn->host.name;
- const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
- sockindex == SECONDARYSOCKET ? conn->secondary_port :
- conn->bits.conn_to_port ? conn->conn_to_port :
- conn->remote_port;
- conn->bits.socksproxy_connecting = TRUE;
+ const char * const host =
+ conn->bits.httpproxy ?
+ conn->http_proxy.host.name :
+ conn->bits.conn_to_host ?
+ conn->conn_to_host.name :
+ sockindex == SECONDARYSOCKET ?
+ conn->secondaryhostname : conn->host.name;
+ const int port =
+ conn->bits.httpproxy ? (int)conn->http_proxy.port :
+ sockindex == SECONDARYSOCKET ? conn->secondary_port :
+ conn->bits.conn_to_port ? conn->conn_to_port :
+ conn->remote_port;
switch(conn->socks_proxy.proxytype) {
case CURLPROXY_SOCKS5:
case CURLPROXY_SOCKS5_HOSTNAME:
- result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
- host, port, sockindex, conn);
+ pxresult = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
+ host, port, sockindex, conn, done);
break;
case CURLPROXY_SOCKS4:
case CURLPROXY_SOCKS4A:
- result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
- conn);
+ pxresult = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
+ conn, done);
break;
default:
failf(conn->data, "unknown proxytype option given");
result = CURLE_COULDNT_CONNECT;
} /* switch proxytype */
- conn->bits.socksproxy_connecting = FALSE;
+ if(pxresult) {
+ result = CURLE_PROXY;
+ conn->data->info.pxcode = pxresult;
+ }
+ }
+ else
#else
- (void)sockindex;
+ (void)conn;
+ (void)sockindex;
#endif /* CURL_DISABLE_PROXY */
- }
+ *done = TRUE; /* no SOCKS proxy, so consider us connected */
return result;
}
/*
+ * post_SOCKS() is called after a successful connect to the peer, which
+ * *could* be a SOCKS proxy
+ */
+static void post_SOCKS(struct connectdata *conn,
+ int sockindex,
+ bool *connected)
+{
+ conn->bits.tcpconnect[sockindex] = TRUE;
+
+ *connected = TRUE;
+ if(sockindex == FIRSTSOCKET)
+ Curl_pgrsTime(conn->data, TIMER_CONNECT); /* connect done */
+ Curl_updateconninfo(conn, conn->sock[sockindex]);
+ Curl_verboseconnect(conn);
+ conn->data->info.numconnects++; /* to track the number of connections made */
+}
+
+/*
* Curl_is_connected() checks if the socket has connected.
*/
@@ -810,8 +822,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
timediff_t allow;
int error = 0;
struct curltime now;
- int rc;
- int i;
+ int rc = 0;
+ unsigned int i;
DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
@@ -834,51 +846,62 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OPERATION_TIMEDOUT;
}
+ if(SOCKS_STATE(conn->cnnct.state)) {
+ /* still doing SOCKS */
+ result = connect_SOCKS(conn, sockindex, connected);
+ if(!result && *connected)
+ post_SOCKS(conn, sockindex, connected);
+ return result;
+ }
+
for(i = 0; i<2; i++) {
const int other = i ^ 1;
if(conn->tempsock[i] == CURL_SOCKET_BAD)
continue;
-
+ error = 0;
#ifdef ENABLE_QUIC
if(conn->transport == TRNSPRT_QUIC) {
result = Curl_quic_is_connected(conn, i, connected);
- if(result) {
- error = SOCKERRNO;
- goto error;
- }
- if(*connected) {
+ if(!result && *connected) {
/* use this socket from now on */
conn->sock[sockindex] = conn->tempsock[i];
conn->ip_addr = conn->tempaddr[i];
conn->tempsock[i] = CURL_SOCKET_BAD;
+ post_SOCKS(conn, sockindex, connected);
connkeep(conn, "HTTP/3 default");
+ return CURLE_OK;
}
- return result;
+ if(result)
+ error = SOCKERRNO;
}
+ else
#endif
-
+ {
#ifdef mpeix
- /* Call this function once now, and ignore the results. We do this to
- "clear" the error state on the socket so that we can later read it
- reliably. This is reported necessary on the MPE/iX operating system. */
- (void)verifyconnect(conn->tempsock[i], NULL);
+ /* Call this function once now, and ignore the results. We do this to
+ "clear" the error state on the socket so that we can later read it
+ reliably. This is reported necessary on the MPE/iX operating
+ system. */
+ (void)verifyconnect(conn->tempsock[i], NULL);
#endif
- /* check socket for connect */
- rc = SOCKET_WRITABLE(conn->tempsock[i], 0);
+ /* check socket for connect */
+ rc = SOCKET_WRITABLE(conn->tempsock[i], 0);
+ }
if(rc == 0) { /* no connection yet */
- error = 0;
- if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
+ if(Curl_timediff(now, conn->connecttime) >=
+ conn->timeoutms_per_addr[i]) {
infof(data, "After %" CURL_FORMAT_TIMEDIFF_T
- "ms connect time, move on!\n", conn->timeoutms_per_addr);
+ "ms connect time, move on!\n", conn->timeoutms_per_addr[i]);
error = ETIMEDOUT;
}
/* should we try another protocol family? */
- if(i == 0 && conn->tempaddr[1] == NULL &&
+ if(i == 0 && !conn->bits.parallel_connect &&
(Curl_timediff(now, conn->connecttime) >=
data->set.happy_eyeballs_timeout)) {
+ conn->bits.parallel_connect = TRUE; /* starting now */
trynextip(conn, sockindex, 1);
}
}
@@ -900,29 +923,21 @@ CURLcode Curl_is_connected(struct connectdata *conn,
conn->tempsock[other] = CURL_SOCKET_BAD;
}
- /* see if we need to do any proxy magic first once we connected */
- result = connected_proxy(conn, sockindex);
- if(result)
+ /* see if we need to kick off any SOCKS proxy magic once we
+ connected */
+ result = connect_SOCKS(conn, sockindex, connected);
+ if(result || !*connected)
return result;
- conn->bits.tcpconnect[sockindex] = TRUE;
-
- *connected = TRUE;
- if(sockindex == FIRSTSOCKET)
- Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
- Curl_updateconninfo(conn, conn->sock[sockindex]);
- Curl_verboseconnect(conn);
+ post_SOCKS(conn, sockindex, connected);
return CURLE_OK;
}
- infof(data, "Connection failed\n");
}
- else if(rc & CURL_CSELECT_ERR)
+ else if(rc & CURL_CSELECT_ERR) {
(void)verifyconnect(conn->tempsock[i], &error);
+ }
-#ifdef ENABLE_QUIC
- error:
-#endif
/*
* The connection failed here, we should attempt to connect to the "next
* address" for the given host. But first remember the latest error.
@@ -932,16 +947,19 @@ CURLcode Curl_is_connected(struct connectdata *conn,
SET_SOCKERRNO(error);
if(conn->tempaddr[i]) {
CURLcode status;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
char ipaddress[MAX_IPADR_LEN];
char buffer[STRERROR_LEN];
- Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
+ Curl_printable_address(conn->tempaddr[i], ipaddress,
+ sizeof(ipaddress));
infof(data, "connect to %s port %ld failed: %s\n",
ipaddress, conn->port,
Curl_strerror(error, buffer, sizeof(buffer)));
+#endif
- conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
+ conn->timeoutms_per_addr[i] = conn->tempaddr[i]->ai_next == NULL ?
allow : allow / 2;
-
+ ainext(conn, i, TRUE);
status = trynextip(conn, sockindex, i);
if((status != CURLE_COULDNT_CONNECT) ||
conn->tempsock[other] == CURL_SOCKET_BAD)
@@ -951,25 +969,28 @@ CURLcode Curl_is_connected(struct connectdata *conn,
}
}
- if(result) {
+ if(result &&
+ (conn->tempsock[0] == CURL_SOCKET_BAD) &&
+ (conn->tempsock[1] == CURL_SOCKET_BAD)) {
/* no more addresses to try */
const char *hostname;
char buffer[STRERROR_LEN];
- /* if the first address family runs out of addresses to try before
- the happy eyeball timeout, go ahead and try the next family now */
- if(conn->tempaddr[1] == NULL) {
- result = trynextip(conn, sockindex, 1);
- if(!result)
- return result;
- }
+ /* if the first address family runs out of addresses to try before the
+ happy eyeball timeout, go ahead and try the next family now */
+ result = trynextip(conn, sockindex, 1);
+ if(!result)
+ return result;
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.socksproxy)
hostname = conn->socks_proxy.host.name;
else if(conn->bits.httpproxy)
hostname = conn->http_proxy.host.name;
- else if(conn->bits.conn_to_host)
- hostname = conn->conn_to_host.name;
+ else
+#endif
+ if(conn->bits.conn_to_host)
+ hostname = conn->conn_to_host.name;
else
hostname = conn->host.name;
@@ -977,6 +998,9 @@ CURLcode Curl_is_connected(struct connectdata *conn,
hostname, conn->port,
Curl_strerror(error, buffer, sizeof(buffer)));
+ Curl_quic_disconnect(conn, 0);
+ Curl_quic_disconnect(conn, 1);
+
#ifdef WSAETIMEDOUT
if(WSAETIMEDOUT == data->state.os_errno)
result = CURLE_OPERATION_TIMEDOUT;
@@ -985,6 +1009,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
result = CURLE_OPERATION_TIMEDOUT;
#endif
}
+ else
+ result = CURLE_OK; /* still trying */
return result;
}
@@ -992,14 +1018,12 @@ CURLcode Curl_is_connected(struct connectdata *conn,
static void tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
{
#if defined(TCP_NODELAY)
-#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
- struct Curl_easy *data = conn->data;
-#endif
curl_socklen_t onoff = (curl_socklen_t) 1;
int level = IPPROTO_TCP;
+#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ struct Curl_easy *data = conn->data;
char buffer[STRERROR_LEN];
-
-#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+#else
(void) conn;
#endif
@@ -1007,8 +1031,6 @@ static void tcpnodelay(struct connectdata *conn, curl_socket_t sockfd)
sizeof(onoff)) < 0)
infof(data, "Could not set TCP_NODELAY: %s\n",
Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
- else
- infof(data, "TCP_NODELAY set\n");
#else
(void)conn;
(void)sockfd;
@@ -1062,8 +1084,8 @@ void Curl_sndbufset(curl_socket_t sockfd)
static int detectOsState = DETECT_OS_NONE;
if(detectOsState == DETECT_OS_NONE) {
- if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT,
- VERSION_GREATER_THAN_EQUAL))
+ if(curlx_verify_windows_version(6, 0, PLATFORM_WINNT,
+ VERSION_GREATER_THAN_EQUAL))
detectOsState = DETECT_OS_VISTA_OR_LATER;
else
detectOsState = DETECT_OS_PREVISTA;
@@ -1090,8 +1112,8 @@ void Curl_sndbufset(curl_socket_t sockfd)
* having connected.
*/
static CURLcode singleipconnect(struct connectdata *conn,
- const Curl_addrinfo *ai,
- int sockindex)
+ const struct Curl_addrinfo *ai,
+ int tempindex)
{
struct Curl_sockaddr_ex addr;
int rc = -1;
@@ -1107,15 +1129,12 @@ static CURLcode singleipconnect(struct connectdata *conn,
int optval = 1;
#endif
char buffer[STRERROR_LEN];
- curl_socket_t *sockp = &conn->tempsock[sockindex];
+ curl_socket_t *sockp = &conn->tempsock[tempindex];
*sockp = CURL_SOCKET_BAD;
result = Curl_socket(conn, ai, &addr, &sockfd);
if(result)
- /* Failed to create the socket, but still return OK since we signal the
- lack of socket as well. This allows the parent function to keep looping
- over alternative addresses/socket families etc. */
- return CURLE_OK;
+ return result;
/* store remote address and port used in this connection attempt */
if(!Curl_addr2string((struct sockaddr*)&addr.sa_addr, addr.addrlen,
@@ -1183,8 +1202,10 @@ static CURLcode singleipconnect(struct connectdata *conn,
(void)curlx_nonblock(sockfd, TRUE);
conn->connecttime = Curl_now();
- if(conn->num_addr > 1)
- Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);
+ if(conn->num_addr > 1) {
+ Curl_expire(data, conn->timeoutms_per_addr[0], EXPIRE_DNS_PER_NAME);
+ Curl_expire(data, conn->timeoutms_per_addr[1], EXPIRE_DNS_PER_NAME2);
+ }
/* Connect TCP and QUIC sockets */
if(!isconnected && (conn->transport != TRNSPRT_UDP)) {
@@ -1216,8 +1237,6 @@ static CURLcode singleipconnect(struct connectdata *conn,
if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT,
(void *)&optval, sizeof(optval)) < 0)
infof(data, "Failed to enable TCP Fast Open on fd %d\n", sockfd);
- else
- infof(data, "TCP_FASTOPEN_CONNECT set\n");
rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
#elif defined(MSG_FASTOPEN) /* old Linux */
@@ -1237,7 +1256,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
else if(conn->transport == TRNSPRT_QUIC) {
/* pass in 'sockfd' separately since it hasn't been put into the
tempsock array at this point */
- result = Curl_quic_connect(conn, sockfd, sockindex,
+ result = Curl_quic_connect(conn, sockfd, tempindex,
&addr.sa_addr, addr.addrlen);
if(result)
error = SOCKERRNO;
@@ -1293,10 +1312,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
const struct Curl_dns_entry *remotehost)
{
struct Curl_easy *data = conn->data;
- struct curltime before = Curl_now();
CURLcode result = CURLE_COULDNT_CONNECT;
-
- timediff_t timeout_ms = Curl_timeleft(data, &before, TRUE);
+ int i;
+ timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* a precaution, no need to continue if time already is up */
@@ -1305,30 +1323,37 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
}
conn->num_addr = Curl_num_addresses(remotehost->addr);
- conn->tempaddr[0] = remotehost->addr;
- conn->tempaddr[1] = NULL;
- conn->tempsock[0] = CURL_SOCKET_BAD;
- conn->tempsock[1] = CURL_SOCKET_BAD;
+ conn->tempaddr[0] = conn->tempaddr[1] = remotehost->addr;
+ conn->tempsock[0] = conn->tempsock[1] = CURL_SOCKET_BAD;
/* Max time for the next connection attempt */
- conn->timeoutms_per_addr =
+ conn->timeoutms_per_addr[0] =
conn->tempaddr[0]->ai_next == NULL ? timeout_ms : timeout_ms / 2;
-
- /* start connecting to first IP */
- while(conn->tempaddr[0]) {
- result = singleipconnect(conn, conn->tempaddr[0], 0);
- if(!result)
- break;
- conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
+ conn->timeoutms_per_addr[1] =
+ conn->tempaddr[1]->ai_next == NULL ? timeout_ms : timeout_ms / 2;
+
+ conn->tempfamily[0] = conn->tempaddr[0]?
+ conn->tempaddr[0]->ai_family:0;
+ conn->tempfamily[1] = conn->tempfamily[0] == AF_INET6 ?
+ AF_INET : AF_INET6;
+ ainext(conn, 1, FALSE); /* assigns conn->tempaddr[1] accordingly */
+
+ DEBUGF(infof(data, "family0 == %s, family1 == %s\n",
+ conn->tempfamily[0] == AF_INET ? "v4" : "v6",
+ conn->tempfamily[1] == AF_INET ? "v4" : "v6"));
+
+ /* get through the list in family order in case of quick failures */
+ for(i = 0; (i < 2) && result; i++) {
+ while(conn->tempaddr[i]) {
+ result = singleipconnect(conn, conn->tempaddr[i], i);
+ if(!result)
+ break;
+ ainext(conn, i, TRUE);
+ }
}
-
- if(conn->tempsock[0] == CURL_SOCKET_BAD) {
- if(!result)
- result = CURLE_COULDNT_CONNECT;
+ if(result)
return result;
- }
- data->info.numconnects++; /* to track the number of connections made */
Curl_expire(conn->data, data->set.happy_eyeballs_timeout,
EXPIRE_HAPPY_EYEBALLS);
@@ -1336,15 +1361,15 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
}
struct connfind {
- struct connectdata *tofind;
- bool found;
+ long id_tofind;
+ struct connectdata *found;
};
static int conn_is_conn(struct connectdata *conn, void *param)
{
struct connfind *f = (struct connfind *)param;
- if(conn == f->tofind) {
- f->found = TRUE;
+ if(conn->connection_id == f->id_tofind) {
+ f->found = conn;
return 1;
}
return 0;
@@ -1366,21 +1391,22 @@ curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
* - that is associated with a multi handle, and whose connection
* was detached with CURLOPT_CONNECT_ONLY
*/
- if(data->state.lastconnect && (data->multi_easy || data->multi)) {
- struct connectdata *c = data->state.lastconnect;
+ if((data->state.lastconnect_id != -1) && (data->multi_easy || data->multi)) {
+ struct connectdata *c;
struct connfind find;
- find.tofind = data->state.lastconnect;
- find.found = FALSE;
+ find.id_tofind = data->state.lastconnect_id;
+ find.found = NULL;
Curl_conncache_foreach(data, data->multi_easy?
&data->multi_easy->conn_cache:
&data->multi->conn_cache, &find, conn_is_conn);
if(!find.found) {
- data->state.lastconnect = NULL;
+ data->state.lastconnect_id = -1;
return CURL_SOCKET_BAD;
}
+ c = find.found;
if(connp) {
/* only store this if the caller cares for it */
*connp = c;
@@ -1388,8 +1414,7 @@ curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
}
return c->sock[FIRSTSOCKET];
}
- else
- return CURL_SOCKET_BAD;
+ return CURL_SOCKET_BAD;
}
/*
@@ -1428,12 +1453,11 @@ int Curl_closesocket(struct connectdata *conn,
curl_socket_t sock)
{
if(conn && conn->fclosesocket) {
- if((sock == conn->sock[SECONDARYSOCKET]) &&
- conn->sock_accepted[SECONDARYSOCKET])
+ if((sock == conn->sock[SECONDARYSOCKET]) && conn->bits.sock_accepted)
/* if this socket matches the second socket, and that was created with
accept, then we MUST NOT call the callback but clear the accepted
status */
- conn->sock_accepted[SECONDARYSOCKET] = FALSE;
+ conn->bits.sock_accepted = FALSE;
else {
int rc;
Curl_multi_closed(conn->data, sock);
@@ -1463,7 +1487,7 @@ int Curl_closesocket(struct connectdata *conn,
*
*/
CURLcode Curl_socket(struct connectdata *conn,
- const Curl_addrinfo *ai,
+ const struct Curl_addrinfo *ai,
struct Curl_sockaddr_ex *addr,
curl_socket_t *sockfd)
{
@@ -1545,6 +1569,7 @@ void Curl_conncontrol(struct connectdata *conn,
/* close if a connection, or a stream that isn't multiplexed */
bool closeit = (ctrl == CONNCTRL_CONNECTION) ||
((ctrl == CONNCTRL_STREAM) && !(conn->handler->flags & PROTOPT_STREAM));
+ DEBUGASSERT(conn);
if((ctrl == CONNCTRL_STREAM) &&
(conn->handler->flags & PROTOPT_STREAM))
DEBUGF(infof(conn->data, "Kill stream: %s\n", reason));
@@ -1560,6 +1585,7 @@ void Curl_conncontrol(struct connectdata *conn,
bool Curl_conn_data_pending(struct connectdata *conn, int sockindex)
{
int readable;
+ DEBUGASSERT(conn);
if(Curl_ssl_data_pending(conn, sockindex) ||
Curl_recv_has_postponed_data(conn, sockindex))
diff --git a/lib/connect.h b/lib/connect.h
index b23085a98..6fd9ea878 100644
--- a/lib/connect.h
+++ b/lib/connect.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -105,7 +105,7 @@ struct Curl_sockaddr_ex {
*
*/
CURLcode Curl_socket(struct connectdata *conn,
- const Curl_addrinfo *ai,
+ const struct Curl_addrinfo *ai,
struct Curl_sockaddr_ex *addr,
curl_socket_t *sockfd);
diff --git a/lib/content_encoding.c b/lib/content_encoding.c
index 6d4753788..a6dce4880 100644
--- a/lib/content_encoding.c
+++ b/lib/content_encoding.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,16 +28,16 @@
#ifdef HAVE_ZLIB_H
#include <zlib.h>
-#ifdef __SYMBIAN32__
-/* zlib pollutes the namespace with this definition */
-#undef WIN32
-#endif
#endif
#ifdef HAVE_BROTLI
#include <brotli/decode.h>
#endif
+#ifdef HAVE_ZSTD
+#include <zstd.h>
+#endif
+
#include "sendf.h"
#include "http.h"
#include "content_encoding.h"
@@ -81,11 +81,11 @@ typedef enum {
} zlibInitState;
/* Writer parameters. */
-typedef struct {
+struct zlib_params {
zlibInitState zlib_init; /* zlib init state */
uInt trailerlen; /* Remaining trailer byte count. */
z_stream z; /* State structure for zlib. */
-} zlib_params;
+};
static voidpf
@@ -133,7 +133,8 @@ exit_zlib(struct connectdata *conn,
return result;
}
-static CURLcode process_trailer(struct connectdata *conn, zlib_params *zp)
+static CURLcode process_trailer(struct connectdata *conn,
+ struct zlib_params *zp)
{
z_stream *z = &zp->z;
CURLcode result = CURLE_OK;
@@ -157,9 +158,10 @@ static CURLcode process_trailer(struct connectdata *conn, zlib_params *zp)
}
static CURLcode inflate_stream(struct connectdata *conn,
- contenc_writer *writer, zlibInitState started)
+ struct contenc_writer *writer,
+ zlibInitState started)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
uInt nread = z->avail_in;
Bytef *orig_in = z->next_in;
@@ -259,9 +261,9 @@ static CURLcode inflate_stream(struct connectdata *conn,
/* Deflate handler. */
static CURLcode deflate_init_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
if(!writer->downstream)
@@ -278,10 +280,10 @@ static CURLcode deflate_init_writer(struct connectdata *conn,
}
static CURLcode deflate_unencode_write(struct connectdata *conn,
- contenc_writer *writer,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
/* Set the compressed input when this function is called */
@@ -296,29 +298,29 @@ static CURLcode deflate_unencode_write(struct connectdata *conn,
}
static void deflate_close_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
exit_zlib(conn, z, &zp->zlib_init, CURLE_OK);
}
-static const content_encoding deflate_encoding = {
+static const struct content_encoding deflate_encoding = {
"deflate",
NULL,
deflate_init_writer,
deflate_unencode_write,
deflate_close_writer,
- sizeof(zlib_params)
+ sizeof(struct zlib_params)
};
/* Gzip handler. */
static CURLcode gzip_init_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
if(!writer->downstream)
@@ -432,10 +434,10 @@ static enum {
#endif
static CURLcode gzip_unencode_write(struct connectdata *conn,
- contenc_writer *writer,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
if(zp->zlib_init == ZLIB_INIT_GZIP) {
@@ -560,33 +562,31 @@ static CURLcode gzip_unencode_write(struct connectdata *conn,
}
static void gzip_close_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
- zlib_params *zp = (zlib_params *) &writer->params;
+ struct zlib_params *zp = (struct zlib_params *) &writer->params;
z_stream *z = &zp->z; /* zlib state structure */
exit_zlib(conn, z, &zp->zlib_init, CURLE_OK);
}
-static const content_encoding gzip_encoding = {
+static const struct content_encoding gzip_encoding = {
"gzip",
"x-gzip",
gzip_init_writer,
gzip_unencode_write,
gzip_close_writer,
- sizeof(zlib_params)
+ sizeof(struct zlib_params)
};
#endif /* HAVE_LIBZ */
#ifdef HAVE_BROTLI
-
/* Writer parameters. */
-typedef struct {
+struct brotli_params {
BrotliDecoderState *br; /* State structure for brotli. */
-} brotli_params;
-
+};
static CURLcode brotli_map_error(BrotliDecoderErrorCode be)
{
@@ -627,10 +627,9 @@ static CURLcode brotli_map_error(BrotliDecoderErrorCode be)
}
static CURLcode brotli_init_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
- brotli_params *bp = (brotli_params *) &writer->params;
-
+ struct brotli_params *bp = (struct brotli_params *) &writer->params;
(void) conn;
if(!writer->downstream)
@@ -641,10 +640,10 @@ static CURLcode brotli_init_writer(struct connectdata *conn,
}
static CURLcode brotli_unencode_write(struct connectdata *conn,
- contenc_writer *writer,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
- brotli_params *bp = (brotli_params *) &writer->params;
+ struct brotli_params *bp = (struct brotli_params *) &writer->params;
const uint8_t *src = (const uint8_t *) buf;
char *decomp;
uint8_t *dst;
@@ -689,10 +688,9 @@ static CURLcode brotli_unencode_write(struct connectdata *conn,
}
static void brotli_close_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
- brotli_params *bp = (brotli_params *) &writer->params;
-
+ struct brotli_params *bp = (struct brotli_params *) &writer->params;
(void) conn;
if(bp->br) {
@@ -701,40 +699,129 @@ static void brotli_close_writer(struct connectdata *conn,
}
}
-static const content_encoding brotli_encoding = {
+static const struct content_encoding brotli_encoding = {
"br",
NULL,
brotli_init_writer,
brotli_unencode_write,
brotli_close_writer,
- sizeof(brotli_params)
+ sizeof(struct brotli_params)
+};
+#endif
+
+
+#ifdef HAVE_ZSTD
+/* Writer parameters. */
+struct zstd_params {
+ ZSTD_DStream *zds; /* State structure for zstd. */
+ void *decomp;
+};
+
+static CURLcode zstd_init_writer(struct connectdata *conn,
+ struct contenc_writer *writer)
+{
+ struct zstd_params *zp = (struct zstd_params *)&writer->params;
+ (void)conn;
+
+ if(!writer->downstream)
+ return CURLE_WRITE_ERROR;
+
+ zp->zds = ZSTD_createDStream();
+ zp->decomp = NULL;
+ return zp->zds ? CURLE_OK : CURLE_OUT_OF_MEMORY;
+}
+
+static CURLcode zstd_unencode_write(struct connectdata *conn,
+ struct contenc_writer *writer,
+ const char *buf, size_t nbytes)
+{
+ CURLcode result = CURLE_OK;
+ struct zstd_params *zp = (struct zstd_params *)&writer->params;
+ ZSTD_inBuffer in;
+ ZSTD_outBuffer out;
+ size_t errorCode;
+
+ if(!zp->decomp) {
+ zp->decomp = malloc(DSIZ);
+ if(!zp->decomp)
+ return CURLE_OUT_OF_MEMORY;
+ }
+ in.pos = 0;
+ in.src = buf;
+ in.size = nbytes;
+
+ for(;;) {
+ out.pos = 0;
+ out.dst = zp->decomp;
+ out.size = DSIZ;
+
+ errorCode = ZSTD_decompressStream(zp->zds, &out, &in);
+ if(ZSTD_isError(errorCode)) {
+ return CURLE_BAD_CONTENT_ENCODING;
+ }
+ if(out.pos > 0) {
+ result = Curl_unencode_write(conn, writer->downstream,
+ zp->decomp, out.pos);
+ if(result)
+ break;
+ }
+ if((in.pos == nbytes) && (out.pos < out.size))
+ break;
+ }
+
+ return result;
+}
+
+static void zstd_close_writer(struct connectdata *conn,
+ struct contenc_writer *writer)
+{
+ struct zstd_params *zp = (struct zstd_params *)&writer->params;
+ (void)conn;
+
+ if(zp->decomp) {
+ free(zp->decomp);
+ zp->decomp = NULL;
+ }
+ if(zp->zds) {
+ ZSTD_freeDStream(zp->zds);
+ zp->zds = NULL;
+ }
+}
+
+static const struct content_encoding zstd_encoding = {
+ "zstd",
+ NULL,
+ zstd_init_writer,
+ zstd_unencode_write,
+ zstd_close_writer,
+ sizeof(struct zstd_params)
};
#endif
/* Identity handler. */
static CURLcode identity_init_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
(void) conn;
return writer->downstream? CURLE_OK: CURLE_WRITE_ERROR;
}
static CURLcode identity_unencode_write(struct connectdata *conn,
- contenc_writer *writer,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
return Curl_unencode_write(conn, writer->downstream, buf, nbytes);
}
static void identity_close_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
(void) conn;
(void) writer;
}
-static const content_encoding identity_encoding = {
+static const struct content_encoding identity_encoding = {
"identity",
"none",
identity_init_writer,
@@ -745,7 +832,7 @@ static const content_encoding identity_encoding = {
/* supported content encodings table. */
-static const content_encoding * const encodings[] = {
+static const struct content_encoding * const encodings[] = {
&identity_encoding,
#ifdef HAVE_LIBZ
&deflate_encoding,
@@ -754,6 +841,9 @@ static const content_encoding * const encodings[] = {
#ifdef HAVE_BROTLI
&brotli_encoding,
#endif
+#ifdef HAVE_ZSTD
+ &zstd_encoding,
+#endif
NULL
};
@@ -762,8 +852,8 @@ static const content_encoding * const encodings[] = {
char *Curl_all_content_encodings(void)
{
size_t len = 0;
- const content_encoding * const *cep;
- const content_encoding *ce;
+ const struct content_encoding * const *cep;
+ const struct content_encoding *ce;
char *ace;
for(cep = encodings; *cep; cep++) {
@@ -796,14 +886,14 @@ char *Curl_all_content_encodings(void)
/* Real client writer: no downstream. */
static CURLcode client_init_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
(void) conn;
return writer->downstream? CURLE_WRITE_ERROR: CURLE_OK;
}
static CURLcode client_unencode_write(struct connectdata *conn,
- contenc_writer *writer,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
struct Curl_easy *data = conn->data;
@@ -818,13 +908,13 @@ static CURLcode client_unencode_write(struct connectdata *conn,
}
static void client_close_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
(void) conn;
(void) writer;
}
-static const content_encoding client_encoding = {
+static const struct content_encoding client_encoding = {
NULL,
NULL,
client_init_writer,
@@ -836,14 +926,14 @@ static const content_encoding client_encoding = {
/* Deferred error dummy writer. */
static CURLcode error_init_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
(void) conn;
return writer->downstream? CURLE_OK: CURLE_WRITE_ERROR;
}
static CURLcode error_unencode_write(struct connectdata *conn,
- contenc_writer *writer,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
char *all = Curl_all_content_encodings();
@@ -861,13 +951,13 @@ static CURLcode error_unencode_write(struct connectdata *conn,
}
static void error_close_writer(struct connectdata *conn,
- contenc_writer *writer)
+ struct contenc_writer *writer)
{
(void) conn;
(void) writer;
}
-static const content_encoding error_encoding = {
+static const struct content_encoding error_encoding = {
NULL,
NULL,
error_init_writer,
@@ -877,12 +967,13 @@ static const content_encoding error_encoding = {
};
/* Create an unencoding writer stage using the given handler. */
-static contenc_writer *new_unencoding_writer(struct connectdata *conn,
- const content_encoding *handler,
- contenc_writer *downstream)
+static struct contenc_writer *
+new_unencoding_writer(struct connectdata *conn,
+ const struct content_encoding *handler,
+ struct contenc_writer *downstream)
{
- size_t sz = offsetof(contenc_writer, params) + handler->paramsize;
- contenc_writer *writer = (contenc_writer *) calloc(1, sz);
+ size_t sz = offsetof(struct contenc_writer, params) + handler->paramsize;
+ struct contenc_writer *writer = (struct contenc_writer *)calloc(1, sz);
if(writer) {
writer->handler = handler;
@@ -897,7 +988,8 @@ static contenc_writer *new_unencoding_writer(struct connectdata *conn,
}
/* Write data using an unencoding writer stack. */
-CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
+CURLcode Curl_unencode_write(struct connectdata *conn,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
if(!nbytes)
@@ -910,7 +1002,7 @@ void Curl_unencode_cleanup(struct connectdata *conn)
{
struct Curl_easy *data = conn->data;
struct SingleRequest *k = &data->req;
- contenc_writer *writer = k->writer_stack;
+ struct contenc_writer *writer = k->writer_stack;
while(writer) {
k->writer_stack = writer->downstream;
@@ -921,12 +1013,13 @@ void Curl_unencode_cleanup(struct connectdata *conn)
}
/* Find the content encoding by name. */
-static const content_encoding *find_encoding(const char *name, size_t len)
+static const struct content_encoding *find_encoding(const char *name,
+ size_t len)
{
- const content_encoding * const *cep;
+ const struct content_encoding * const *cep;
for(cep = encodings; *cep; cep++) {
- const content_encoding *ce = *cep;
+ const struct content_encoding *ce = *cep;
if((strncasecompare(name, ce->name, len) && !ce->name[len]) ||
(ce->alias && strncasecompare(name, ce->alias, len) && !ce->alias[len]))
return ce;
@@ -962,8 +1055,8 @@ CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
Curl_httpchunk_init(conn); /* init our chunky engine. */
}
else if(namelen) {
- const content_encoding *encoding = find_encoding(name, namelen);
- contenc_writer *writer;
+ const struct content_encoding *encoding = find_encoding(name, namelen);
+ struct contenc_writer *writer;
if(!k->writer_stack) {
k->writer_stack = new_unencoding_writer(conn, &client_encoding, NULL);
@@ -997,7 +1090,8 @@ CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
return CURLE_NOT_BUILT_IN;
}
-CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
+CURLcode Curl_unencode_write(struct connectdata *conn,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes)
{
(void) conn;
diff --git a/lib/content_encoding.h b/lib/content_encoding.h
index 4cd52be62..bdd3f1c8c 100644
--- a/lib/content_encoding.h
+++ b/lib/content_encoding.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,31 +23,31 @@
***************************************************************************/
#include "curl_setup.h"
-/* Decoding writer. */
-typedef struct contenc_writer_s contenc_writer;
-typedef struct content_encoding_s content_encoding;
-
-struct contenc_writer_s {
- const content_encoding *handler; /* Encoding handler. */
- contenc_writer *downstream; /* Downstream writer. */
+struct contenc_writer {
+ const struct content_encoding *handler; /* Encoding handler. */
+ struct contenc_writer *downstream; /* Downstream writer. */
void *params; /* Encoding-specific storage (variable length). */
};
/* Content encoding writer. */
-struct content_encoding_s {
+struct content_encoding {
const char *name; /* Encoding name. */
const char *alias; /* Encoding name alias. */
- CURLcode (*init_writer)(struct connectdata *conn, contenc_writer *writer);
- CURLcode (*unencode_write)(struct connectdata *conn, contenc_writer *writer,
+ CURLcode (*init_writer)(struct connectdata *conn,
+ struct contenc_writer *writer);
+ CURLcode (*unencode_write)(struct connectdata *conn,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes);
- void (*close_writer)(struct connectdata *conn, contenc_writer *writer);
+ void (*close_writer)(struct connectdata *conn,
+ struct contenc_writer *writer);
size_t paramsize;
};
CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
const char *enclist, int maybechunked);
-CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
+CURLcode Curl_unencode_write(struct connectdata *conn,
+ struct contenc_writer *writer,
const char *buf, size_t nbytes);
void Curl_unencode_cleanup(struct connectdata *conn);
char *Curl_all_content_encodings(void);
diff --git a/lib/cookie.c b/lib/cookie.c
index f56bd85a9..cb7d94b10 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -96,6 +96,9 @@ Example set of cookies:
#include "curl_get_line.h"
#include "curl_memrchr.h"
#include "inet_pton.h"
+#include "parsedate.h"
+#include "rand.h"
+#include "rename.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -242,18 +245,17 @@ pathmatched:
*/
static const char *get_top_domain(const char * const domain, size_t *outlen)
{
- size_t len;
+ size_t len = 0;
const char *first = NULL, *last;
- if(!domain)
- return NULL;
-
- len = strlen(domain);
- last = memrchr(domain, '.', len);
- if(last) {
- first = memrchr(domain, '.', (last - domain));
- if(first)
- len -= (++first - domain);
+ if(domain) {
+ len = strlen(domain);
+ last = memrchr(domain, '.', len);
+ if(last) {
+ first = memrchr(domain, '.', (last - domain));
+ if(first)
+ len -= (++first - domain);
+ }
}
if(outlen)
@@ -536,9 +538,9 @@ Curl_cookie_add(struct Curl_easy *data,
* only test for names where that can possibly be true.
*/
if(nlen > 3 && name[0] == '_' && name[1] == '_') {
- if(strncasecompare("__Secure-", name, 9))
+ if(!strncmp("__Secure-", name, 9))
co->prefix |= COOKIE_PREFIX__SECURE;
- else if(strncasecompare("__Host-", name, 7))
+ else if(!strncmp("__Host-", name, 7))
co->prefix |= COOKIE_PREFIX__HOST;
}
@@ -715,7 +717,7 @@ Curl_cookie_add(struct Curl_easy *data,
else if(co->expirestr) {
/* Note that if the date couldn't get parsed for whatever reason,
the cookie will be treated as a session cookie */
- co->expires = curl_getdate(co->expirestr, NULL);
+ co->expires = Curl_getdate_capped(co->expirestr);
/* Session cookies have expires set to 0 so if we get that back
from the date parser let's add a second to make it a
@@ -753,7 +755,7 @@ Curl_cookie_add(struct Curl_easy *data,
co->path = malloc(pathlen + 1); /* one extra for the zero byte */
if(co->path) {
memcpy(co->path, path, pathlen);
- co->path[pathlen] = 0; /* zero terminate */
+ co->path[pathlen] = 0; /* null-terminate */
co->spath = sanitize_cookie_path(co->path);
if(!co->spath)
badcookie = TRUE; /* out of memory bad */
@@ -1045,7 +1047,7 @@ Curl_cookie_add(struct Curl_easy *data,
*clist = *co; /* then store all the new data */
- free(co); /* free the newly alloced memory */
+ free(co); /* free the newly allocated memory */
co = clist; /* point to the previous struct instead */
/* We have replaced a cookie, now skip the rest of the list but
@@ -1500,11 +1502,14 @@ static char *get_netscape_format(const struct Cookie *co)
*
* The function returns non-zero on write failure.
*/
-static int cookie_output(struct CookieInfo *c, const char *dumphere)
+static int cookie_output(struct Curl_easy *data,
+ struct CookieInfo *c, const char *filename)
{
struct Cookie *co;
- FILE *out;
+ FILE *out = NULL;
bool use_stdout = FALSE;
+ char *tempstore = NULL;
+ bool error = false;
if(!c)
/* no cookie engine alive */
@@ -1513,16 +1518,24 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
/* at first, remove expired cookies */
remove_expired(c);
- if(!strcmp("-", dumphere)) {
+ if(!strcmp("-", filename)) {
/* use stdout */
out = stdout;
use_stdout = TRUE;
}
else {
- out = fopen(dumphere, FOPEN_WRITETEXT);
- if(!out) {
- return 1; /* failure */
- }
+ unsigned char randsuffix[9];
+
+ if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
+ return 2;
+
+ tempstore = aprintf("%s.%s.tmp", filename, randsuffix);
+ if(!tempstore)
+ return 1;
+
+ out = fopen(tempstore, FOPEN_WRITETEXT);
+ if(!out)
+ goto error;
}
fputs("# Netscape HTTP Cookie File\n"
@@ -1537,9 +1550,7 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
array = calloc(1, sizeof(struct Cookie *) * c->numcookies);
if(!array) {
- if(!use_stdout)
- fclose(out);
- return 1;
+ goto error;
}
/* only sort the cookies with a domain property */
@@ -1558,9 +1569,7 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
if(format_ptr == NULL) {
fprintf(out, "#\n# Fatal libcurl error\n");
free(array);
- if(!use_stdout)
- fclose(out);
- return 1;
+ goto error;
}
fprintf(out, "%s\n", format_ptr);
free(format_ptr);
@@ -1568,10 +1577,24 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
free(array);
}
- if(!use_stdout)
+
+ if(!use_stdout) {
fclose(out);
+ out = NULL;
+ if(Curl_rename(tempstore, filename)) {
+ unlink(tempstore);
+ goto error;
+ }
+ }
- return 0;
+ goto cleanup;
+error:
+ error = true;
+cleanup:
+ if(out && !use_stdout)
+ fclose(out);
+ free(tempstore);
+ return error ? 1 : 0;
}
static struct curl_slist *cookie_list(struct Curl_easy *data)
@@ -1630,7 +1653,7 @@ void Curl_flush_cookies(struct Curl_easy *data, bool cleanup)
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
/* if we have a destination file for all the cookies to get dumped to */
- if(cookie_output(data->cookies, data->set.str[STRING_COOKIEJAR]))
+ if(cookie_output(data, data->cookies, data->set.str[STRING_COOKIEJAR]))
infof(data, "WARNING: failed to save cookies in %s\n",
data->set.str[STRING_COOKIEJAR]);
}
diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c
index 16c4779c1..947d0d375 100644
--- a/lib/curl_addrinfo.c
+++ b/lib/curl_addrinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -50,10 +50,6 @@
# define in_addr_t unsigned long
#endif
-#if defined(WIN32) && defined(USE_UNIX_SOCKETS)
-#include <afunix.h>
-#endif
-
#include <stddef.h>
#include "curl_addrinfo.h"
@@ -82,16 +78,13 @@
#endif
void
-Curl_freeaddrinfo(Curl_addrinfo *cahead)
+Curl_freeaddrinfo(struct Curl_addrinfo *cahead)
{
- Curl_addrinfo *vqualifier canext;
- Curl_addrinfo *ca;
+ struct Curl_addrinfo *vqualifier canext;
+ struct Curl_addrinfo *ca;
- for(ca = cahead; ca != NULL; ca = canext) {
- free(ca->ai_addr);
- free(ca->ai_canonname);
+ for(ca = cahead; ca; ca = canext) {
canext = ca->ai_next;
-
free(ca);
}
}
@@ -116,13 +109,13 @@ int
Curl_getaddrinfo_ex(const char *nodename,
const char *servname,
const struct addrinfo *hints,
- Curl_addrinfo **result)
+ struct Curl_addrinfo **result)
{
const struct addrinfo *ai;
struct addrinfo *aihead;
- Curl_addrinfo *cafirst = NULL;
- Curl_addrinfo *calast = NULL;
- Curl_addrinfo *ca;
+ struct Curl_addrinfo *cafirst = NULL;
+ struct Curl_addrinfo *calast = NULL;
+ struct Curl_addrinfo *ca;
size_t ss_size;
int error;
@@ -135,7 +128,7 @@ Curl_getaddrinfo_ex(const char *nodename,
/* traverse the addrinfo list */
for(ai = aihead; ai != NULL; ai = ai->ai_next) {
-
+ size_t namelen = ai->ai_canonname ? strlen(ai->ai_canonname) + 1 : 0;
/* ignore elements with unsupported address family, */
/* settle family-specific sockaddr structure size. */
if(ai->ai_family == AF_INET)
@@ -155,7 +148,7 @@ Curl_getaddrinfo_ex(const char *nodename,
if((size_t)ai->ai_addrlen < ss_size)
continue;
- ca = malloc(sizeof(Curl_addrinfo));
+ ca = malloc(sizeof(struct Curl_addrinfo) + ss_size + namelen);
if(!ca) {
error = EAI_MEMORY;
break;
@@ -173,22 +166,12 @@ Curl_getaddrinfo_ex(const char *nodename,
ca->ai_canonname = NULL;
ca->ai_next = NULL;
- ca->ai_addr = malloc(ss_size);
- if(!ca->ai_addr) {
- error = EAI_MEMORY;
- free(ca);
- break;
- }
+ ca->ai_addr = (void *)((char *)ca + sizeof(struct Curl_addrinfo));
memcpy(ca->ai_addr, ai->ai_addr, ss_size);
- if(ai->ai_canonname != NULL) {
- ca->ai_canonname = strdup(ai->ai_canonname);
- if(!ca->ai_canonname) {
- error = EAI_MEMORY;
- free(ca->ai_addr);
- free(ca);
- break;
- }
+ if(namelen) {
+ ca->ai_canonname = (void *)((char *)ca->ai_addr + ss_size);
+ memcpy(ca->ai_canonname, ai->ai_canonname, namelen);
}
/* if the return list is empty, this becomes the first element */
@@ -256,7 +239,6 @@ Curl_getaddrinfo_ex(const char *nodename,
* struct sockaddr *ai_addr;
* struct Curl_addrinfo *ai_next;
* };
- * typedef struct Curl_addrinfo Curl_addrinfo;
*
* hostent defined in <netdb.h>
*
@@ -273,12 +255,12 @@ Curl_getaddrinfo_ex(const char *nodename,
* #define h_addr h_addr_list[0]
*/
-Curl_addrinfo *
+struct Curl_addrinfo *
Curl_he2ai(const struct hostent *he, int port)
{
- Curl_addrinfo *ai;
- Curl_addrinfo *prevai = NULL;
- Curl_addrinfo *firstai = NULL;
+ struct Curl_addrinfo *ai;
+ struct Curl_addrinfo *prevai = NULL;
+ struct Curl_addrinfo *firstai = NULL;
struct sockaddr_in *addr;
#ifdef ENABLE_IPV6
struct sockaddr_in6 *addr6;
@@ -294,8 +276,8 @@ Curl_he2ai(const struct hostent *he, int port)
DEBUGASSERT((he->h_name != NULL) && (he->h_addr_list != NULL));
for(i = 0; (curr = he->h_addr_list[i]) != NULL; i++) {
-
size_t ss_size;
+ size_t namelen = strlen(he->h_name) + 1; /* include zero termination */
#ifdef ENABLE_IPV6
if(he->h_addrtype == AF_INET6)
ss_size = sizeof(struct sockaddr_in6);
@@ -303,24 +285,17 @@ Curl_he2ai(const struct hostent *he, int port)
#endif
ss_size = sizeof(struct sockaddr_in);
- ai = calloc(1, sizeof(Curl_addrinfo));
+ /* allocate memory to told the struct, the address and the name */
+ ai = calloc(1, sizeof(struct Curl_addrinfo) + ss_size + namelen);
if(!ai) {
result = CURLE_OUT_OF_MEMORY;
break;
}
- ai->ai_canonname = strdup(he->h_name);
- if(!ai->ai_canonname) {
- result = CURLE_OUT_OF_MEMORY;
- free(ai);
- break;
- }
- ai->ai_addr = calloc(1, ss_size);
- if(!ai->ai_addr) {
- result = CURLE_OUT_OF_MEMORY;
- free(ai->ai_canonname);
- free(ai);
- break;
- }
+ /* put the address after the struct */
+ ai->ai_addr = (void *)((char *)ai + sizeof(struct Curl_addrinfo));
+ /* then put the name after the address */
+ ai->ai_canonname = (char *)ai->ai_addr + ss_size;
+ memcpy(ai->ai_canonname, he->h_name, namelen);
if(!firstai)
/* store the pointer we want to return from this function */
@@ -393,10 +368,10 @@ struct namebuff {
* given address/host
*/
-Curl_addrinfo *
+struct Curl_addrinfo *
Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port)
{
- Curl_addrinfo *ai;
+ struct Curl_addrinfo *ai;
#if defined(__VMS) && \
defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64)
@@ -469,7 +444,7 @@ Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port)
* Given an IPv4 or IPv6 dotted string address, this converts it to a proper
* allocated Curl_addrinfo struct and returns it.
*/
-Curl_addrinfo *Curl_str2addr(char *address, int port)
+struct Curl_addrinfo *Curl_str2addr(char *address, int port)
{
struct in_addr in;
if(Curl_inet_pton(AF_INET, address, &in) > 0)
@@ -492,22 +467,19 @@ Curl_addrinfo *Curl_str2addr(char *address, int port)
* struct initialized with this path.
* Set '*longpath' to TRUE if the error is a too long path.
*/
-Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract)
+struct Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath,
+ bool abstract)
{
- Curl_addrinfo *ai;
+ struct Curl_addrinfo *ai;
struct sockaddr_un *sa_un;
size_t path_len;
*longpath = FALSE;
- ai = calloc(1, sizeof(Curl_addrinfo));
+ ai = calloc(1, sizeof(struct Curl_addrinfo) + sizeof(struct sockaddr_un));
if(!ai)
return NULL;
- ai->ai_addr = calloc(1, sizeof(struct sockaddr_un));
- if(!ai->ai_addr) {
- free(ai);
- return NULL;
- }
+ ai->ai_addr = (void *)((char *)ai + sizeof(struct Curl_addrinfo));
sa_un = (void *) ai->ai_addr;
sa_un->sun_family = AF_UNIX;
@@ -515,7 +487,6 @@ Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract)
/* sun_path must be able to store the NUL-terminated path */
path_len = strlen(path) + 1;
if(path_len > sizeof(sa_un->sun_path)) {
- free(ai->ai_addr);
free(ai);
*longpath = TRUE;
return NULL;
@@ -598,9 +569,9 @@ curl_dbg_getaddrinfo(const char *hostname,
* Work-arounds the sin6_port is always zero bug on iOS 9.3.2 and Mac OS X
* 10.11.5.
*/
-void Curl_addrinfo_set_port(Curl_addrinfo *addrinfo, int port)
+void Curl_addrinfo_set_port(struct Curl_addrinfo *addrinfo, int port)
{
- Curl_addrinfo *ca;
+ struct Curl_addrinfo *ca;
struct sockaddr_in *addr;
#ifdef ENABLE_IPV6
struct sockaddr_in6 *addr6;
diff --git a/lib/curl_addrinfo.h b/lib/curl_addrinfo.h
index 205e121ea..a0cade614 100644
--- a/lib/curl_addrinfo.h
+++ b/lib/curl_addrinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,7 +40,6 @@
# include <stdlib.h>
#endif
-
/*
* Curl_addrinfo is our internal struct definition that we use to allow
* consistent internal handling of this data. We use this even when the
@@ -58,29 +57,29 @@ struct Curl_addrinfo {
struct sockaddr *ai_addr;
struct Curl_addrinfo *ai_next;
};
-typedef struct Curl_addrinfo Curl_addrinfo;
void
-Curl_freeaddrinfo(Curl_addrinfo *cahead);
+Curl_freeaddrinfo(struct Curl_addrinfo *cahead);
#ifdef HAVE_GETADDRINFO
int
Curl_getaddrinfo_ex(const char *nodename,
const char *servname,
const struct addrinfo *hints,
- Curl_addrinfo **result);
+ struct Curl_addrinfo **result);
#endif
-Curl_addrinfo *
+struct Curl_addrinfo *
Curl_he2ai(const struct hostent *he, int port);
-Curl_addrinfo *
+struct Curl_addrinfo *
Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port);
-Curl_addrinfo *Curl_str2addr(char *dotted, int port);
+struct Curl_addrinfo *Curl_str2addr(char *dotted, int port);
#ifdef USE_UNIX_SOCKETS
-Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath, bool abstract);
+struct Curl_addrinfo *Curl_unix2addr(const char *path, bool *longpath,
+ bool abstract);
#endif
#if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO) && \
@@ -98,7 +97,7 @@ curl_dbg_getaddrinfo(const char *hostname, const char *service,
#ifdef HAVE_GETADDRINFO
#ifdef USE_RESOLVE_ON_IPS
-void Curl_addrinfo_set_port(Curl_addrinfo *addrinfo, int port);
+void Curl_addrinfo_set_port(struct Curl_addrinfo *addrinfo, int port);
#else
#define Curl_addrinfo_set_port(x,y)
#endif
diff --git a/lib/curl_base64.h b/lib/curl_base64.h
index 7e9fc2606..cfb6ee75b 100644
--- a/lib/curl_base64.h
+++ b/lib/curl_base64.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_config.h b/lib/curl_config.h
index d3bc43e2e..2476fc286 100644
--- a/lib/curl_config.h
+++ b/lib/curl_config.h
@@ -34,6 +34,9 @@
/* to disable FTP */
#define CURL_DISABLE_FTP 1
+/* to disable curl_easy_options */
+/* #undef CURL_DISABLE_GETOPTIONS */
+
/* to disable Gopher */
#define CURL_DISABLE_GOPHER 1
@@ -58,6 +61,9 @@
/* disable mime API */
/* #undef CURL_DISABLE_MIME */
+/* to disable MQTT */
+/* #undef CURL_DISABLE_MQTT */
+
/* disable netrc parsing */
/* #undef CURL_DISABLE_NETRC */
@@ -88,6 +94,9 @@
/* to disable SMTP */
#define CURL_DISABLE_SMTP 1
+/* to disable socketpair support */
+/* #undef CURL_DISABLE_SOCKETPAIR */
+
/* to disable TELNET */
#define CURL_DISABLE_TELNET 1
@@ -299,16 +308,6 @@
/* Define to 1 if you have a working gmtime_r function. */
#define HAVE_GMTIME_R 1
-/* Define to 1 if you have the `gnutls_alpn_set_protocols' function. */
-/* #undef HAVE_GNUTLS_ALPN_SET_PROTOCOLS */
-
-/* Define to 1 if you have the `gnutls_certificate_set_x509_key_file2'
- function. */
-/* #undef HAVE_GNUTLS_CERTIFICATE_SET_X509_KEY_FILE2 */
-
-/* Define to 1 if you have the `gnutls_ocsp_req_init' function. */
-/* #undef HAVE_GNUTLS_OCSP_REQ_INIT */
-
/* if you have the function gnutls_srp_verifier */
/* #undef HAVE_GNUTLS_SRP */
@@ -436,9 +435,15 @@
/* Define to 1 if you have the `ssl' library (-lssl). */
#define HAVE_LIBSSL 1
+/* Define to 1 if you have the `wolfssh' library (-lwolfssh). */
+/* #undef HAVE_LIBWOLFSSH */
+
/* if zlib is available */
#define HAVE_LIBZ 1
+/* Define to 1 if you have the `zstd' library (-lzstd). */
+/* #undef HAVE_LIBZSTD */
+
/* Define to 1 if you have the <linux/tcp.h> header file. */
#define HAVE_LINUX_TCP_H 1
@@ -500,6 +505,9 @@
*/
/* #undef HAVE_OLD_GSSMIT */
+/* Define to 1 if using OpenSSL 3 or later. */
+/* #undef HAVE_OPENSSL3 */
+
/* Define to 1 if you have the <openssl/crypto.h> header file. */
#define HAVE_OPENSSL_CRYPTO_H 1
@@ -554,6 +562,9 @@
/* Define to 1 if you have the <pwd.h> header file. */
#define HAVE_PWD_H 1
+/* Define to 1 if you have the `quiche_conn_set_qlog_fd' function. */
+/* #undef HAVE_QUICHE_CONN_SET_QLOG_FD */
+
/* Define to 1 if you have the <quiche.h> header file. */
/* #undef HAVE_QUICHE_H */
@@ -629,8 +640,8 @@
/* Define to 1 if you have the `SSLv2_client_method' function. */
/* #undef HAVE_SSLV2_CLIENT_METHOD */
-/* Define to 1 if you have the `SSL_get_esni_status' function. */
-/* #undef HAVE_SSL_GET_ESNI_STATUS */
+/* Define to 1 if you have the `SSL_get_ech_status' function. */
+/* #undef HAVE_SSL_GET_ECH_STATUS */
/* Define to 1 if you have the <ssl.h> header file. */
/* #undef HAVE_SSL_H */
@@ -692,6 +703,9 @@
/* Define to 1 if you have the timeval struct. */
#define HAVE_STRUCT_TIMEVAL 1
+/* Define to 1 if suseconds_t is an available type. */
+#define HAVE_SUSECONDS_T 1
+
/* Define to 1 if you have the <sys/filio.h> header file. */
/* #undef HAVE_SYS_FILIO_H */
@@ -788,9 +802,15 @@
/* Define to 1 if you have the winsock.h header file. */
/* #undef HAVE_WINSOCK_H */
+/* Define to 1 if you have the <wolfssh/ssh.h> header file. */
+/* #undef HAVE_WOLFSSH_SSH_H */
+
/* Define to 1 if you have the `wolfSSLv3_client_method' function. */
/* #undef HAVE_WOLFSSLV3_CLIENT_METHOD */
+/* if you have wolfSSL_DES_ecb_encrypt */
+/* #undef HAVE_WOLFSSL_DES_ECB_ENCRYPT */
+
/* Define to 1 if you have the `wolfSSL_get_peer_certificate' function. */
/* #undef HAVE_WOLFSSL_GET_PEER_CERTIFICATE */
@@ -812,6 +832,12 @@
/* if you have the zlib.h header file */
#define HAVE_ZLIB_H 1
+/* if libzstd is in use */
+/* #undef HAVE_ZSTD */
+
+/* Define to 1 if you have the <zstd.h> header file. */
+/* #undef HAVE_ZSTD_H */
+
/* Define to the sub-directory where libtool stores uninstalled libraries. */
#define LT_OBJDIR ".libs/"
@@ -938,8 +964,11 @@
/* Define to enable c-ares support */
/* #undef USE_ARES */
-/* if ESNI support is available */
-/* #undef USE_ESNI */
+/* if BearSSL is enabled */
+/* #undef USE_BEARSSL */
+
+/* if ECH support is available */
+/* #undef USE_ECH */
/* if GnuTLS is enabled */
/* #undef USE_GNUTLS */
@@ -980,6 +1009,9 @@
/* if ngtcp2 is in use */
/* #undef USE_NGTCP2 */
+/* if ngtcp2_crypto_gnutls is in use */
+/* #undef USE_NGTCP2_CRYPTO_GNUTLS */
+
/* if ngtcp2_crypto_openssl is in use */
/* #undef USE_NGTCP2_CRYPTO_OPENSSL */
@@ -1030,6 +1062,9 @@
/* to enable SSPI support */
/* #undef USE_WINDOWS_SSPI */
+/* if wolfSSH is in use */
+/* #undef USE_WOLFSSH */
+
/* if wolfSSL is enabled */
/* #undef USE_WOLFSSL */
diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake
index e0793a7ee..eca3734b0 100644
--- a/lib/curl_config.h.cmake
+++ b/lib/curl_config.h.cmake
@@ -1,3 +1,24 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
/* lib/curl_config.h.in. Generated somehow by cmake. */
/* when building libcurl itself */
@@ -42,6 +63,9 @@
/* to disable LDAPS */
#cmakedefine CURL_DISABLE_LDAPS 1
+/* to disable MQTT */
+#cmakedefine CURL_DISABLE_MQTT 1
+
/* to disable POP3 */
#cmakedefine CURL_DISABLE_POP3 1
@@ -73,6 +97,9 @@
#define CURL_EXTERN_SYMBOL
#endif
+/* Allow SMB to work on Windows */
+#cmakedefine USE_WIN32_CRYPTO
+
/* Use Windows LDAP implementation */
#cmakedefine USE_WIN32_LDAP 1
@@ -142,15 +169,9 @@
/* Define to 1 if you have the <crypto.h> header file. */
#cmakedefine HAVE_CRYPTO_H 1
-/* Define to 1 if you have the <des.h> header file. */
-#cmakedefine HAVE_DES_H 1
-
/* Define to 1 if you have the <dlfcn.h> header file. */
#cmakedefine HAVE_DLFCN_H 1
-/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
-#cmakedefine HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
-
/* Define to 1 if you have the <errno.h> header file. */
#cmakedefine HAVE_ERRNO_H 1
@@ -407,12 +428,18 @@
/* Define to 1 if you have the <libssh2.h> header file. */
#cmakedefine HAVE_LIBSSH2_H 1
+/* Define to 1 if you have the <libssh/libssh.h> header file. */
+#cmakedefine HAVE_LIBSSH_LIBSSH_H 1
+
/* if zlib is available */
#cmakedefine HAVE_LIBZ 1
/* if brotli is available */
#cmakedefine HAVE_BROTLI 1
+/* if zstd is available */
+#cmakedefine HAVE_ZSTD 1
+
/* if your compiler supports LL */
#cmakedefine HAVE_LL 1
@@ -455,9 +482,6 @@
/* Define to 1 if you have the <openssl/crypto.h> header file. */
#cmakedefine HAVE_OPENSSL_CRYPTO_H 1
-/* Define to 1 if you have the <openssl/engine.h> header file. */
-#cmakedefine HAVE_OPENSSL_ENGINE_H 1
-
/* Define to 1 if you have the <openssl/err.h> header file. */
#cmakedefine HAVE_OPENSSL_ERR_H 1
@@ -939,15 +963,21 @@ ${SIZEOF_TIME_T_CODE}
/* if GnuTLS is enabled */
#cmakedefine USE_GNUTLS 1
-/* if PolarSSL is enabled */
-#cmakedefine USE_POLARSSL 1
-
/* if Secure Transport is enabled */
#cmakedefine USE_SECTRANSP 1
/* if mbedTLS is enabled */
#cmakedefine USE_MBEDTLS 1
+/* if BearSSL is enabled */
+#cmakedefine USE_BEARSSL 1
+
+/* if WolfSSL is enabled */
+#cmakedefine USE_WOLFSSL 1
+
+/* if libSSH is in use */
+#cmakedefine USE_LIBSSH 1
+
/* if libSSH2 is in use */
#cmakedefine USE_LIBSSH2 1
@@ -957,6 +987,9 @@ ${SIZEOF_TIME_T_CODE}
/* if NSS is enabled */
#cmakedefine USE_NSS 1
+/* if you have the PK11_CreateManagedGenericObject function */
+#cmakedefine HAVE_PK11_CREATEMANAGEDGENERICOBJECT 1
+
/* if you want to use OpenLDAP code instead of legacy ldap implementation */
#cmakedefine USE_OPENLDAP 1
@@ -966,9 +999,24 @@ ${SIZEOF_TIME_T_CODE}
/* to enable NGHTTP2 */
#cmakedefine USE_NGHTTP2 1
+/* to enable NGTCP2 */
+#cmakedefine USE_NGTCP2 1
+
+/* to enable NGHTTP3 */
+#cmakedefine USE_NGHTTP3 1
+
+/* to enable quiche */
+#cmakedefine USE_QUICHE 1
+
+/* Define to 1 if you have the quiche_conn_set_qlog_fd function. */
+#cmakedefine HAVE_QUICHE_CONN_SET_QLOG_FD 1
+
/* if Unix domain sockets are enabled */
#cmakedefine USE_UNIX_SOCKETS
+/* to enable alt-svc */
+#cmakedefine USE_ALTSVC 1
+
/* Define to 1 if you are building a Windows target with large file support. */
#cmakedefine USE_WIN32_LARGE_FILES 1
diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in
index 32a87bd29..ab8651a51 100644
--- a/lib/curl_config.h.in
+++ b/lib/curl_config.h.in
@@ -33,6 +33,9 @@
/* to disable FTP */
#undef CURL_DISABLE_FTP
+/* to disable curl_easy_options */
+#undef CURL_DISABLE_GETOPTIONS
+
/* to disable Gopher */
#undef CURL_DISABLE_GOPHER
@@ -57,6 +60,9 @@
/* disable mime API */
#undef CURL_DISABLE_MIME
+/* to disable MQTT */
+#undef CURL_DISABLE_MQTT
+
/* disable netrc parsing */
#undef CURL_DISABLE_NETRC
@@ -87,6 +93,9 @@
/* to disable SMTP */
#undef CURL_DISABLE_SMTP
+/* to disable socketpair support */
+#undef CURL_DISABLE_SOCKETPAIR
+
/* to disable TELNET */
#undef CURL_DISABLE_TELNET
@@ -298,16 +307,6 @@
/* Define to 1 if you have a working gmtime_r function. */
#undef HAVE_GMTIME_R
-/* Define to 1 if you have the `gnutls_alpn_set_protocols' function. */
-#undef HAVE_GNUTLS_ALPN_SET_PROTOCOLS
-
-/* Define to 1 if you have the `gnutls_certificate_set_x509_key_file2'
- function. */
-#undef HAVE_GNUTLS_CERTIFICATE_SET_X509_KEY_FILE2
-
-/* Define to 1 if you have the `gnutls_ocsp_req_init' function. */
-#undef HAVE_GNUTLS_OCSP_REQ_INIT
-
/* if you have the function gnutls_srp_verifier */
#undef HAVE_GNUTLS_SRP
@@ -435,9 +434,15 @@
/* Define to 1 if you have the `ssl' library (-lssl). */
#undef HAVE_LIBSSL
+/* Define to 1 if you have the `wolfssh' library (-lwolfssh). */
+#undef HAVE_LIBWOLFSSH
+
/* if zlib is available */
#undef HAVE_LIBZ
+/* Define to 1 if you have the `zstd' library (-lzstd). */
+#undef HAVE_LIBZSTD
+
/* Define to 1 if you have the <linux/tcp.h> header file. */
#undef HAVE_LINUX_TCP_H
@@ -499,6 +504,9 @@
*/
#undef HAVE_OLD_GSSMIT
+/* Define to 1 if using OpenSSL 3 or later. */
+#undef HAVE_OPENSSL3
+
/* Define to 1 if you have the <openssl/crypto.h> header file. */
#undef HAVE_OPENSSL_CRYPTO_H
@@ -553,6 +561,9 @@
/* Define to 1 if you have the <pwd.h> header file. */
#undef HAVE_PWD_H
+/* Define to 1 if you have the `quiche_conn_set_qlog_fd' function. */
+#undef HAVE_QUICHE_CONN_SET_QLOG_FD
+
/* Define to 1 if you have the <quiche.h> header file. */
#undef HAVE_QUICHE_H
@@ -628,8 +639,8 @@
/* Define to 1 if you have the `SSLv2_client_method' function. */
#undef HAVE_SSLV2_CLIENT_METHOD
-/* Define to 1 if you have the `SSL_get_esni_status' function. */
-#undef HAVE_SSL_GET_ESNI_STATUS
+/* Define to 1 if you have the `SSL_get_ech_status' function. */
+#undef HAVE_SSL_GET_ECH_STATUS
/* Define to 1 if you have the <ssl.h> header file. */
#undef HAVE_SSL_H
@@ -691,6 +702,9 @@
/* Define to 1 if you have the timeval struct. */
#undef HAVE_STRUCT_TIMEVAL
+/* Define to 1 if suseconds_t is an available type. */
+#undef HAVE_SUSECONDS_T
+
/* Define to 1 if you have the <sys/filio.h> header file. */
#undef HAVE_SYS_FILIO_H
@@ -787,9 +801,15 @@
/* Define to 1 if you have the winsock.h header file. */
#undef HAVE_WINSOCK_H
+/* Define to 1 if you have the <wolfssh/ssh.h> header file. */
+#undef HAVE_WOLFSSH_SSH_H
+
/* Define to 1 if you have the `wolfSSLv3_client_method' function. */
#undef HAVE_WOLFSSLV3_CLIENT_METHOD
+/* if you have wolfSSL_DES_ecb_encrypt */
+#undef HAVE_WOLFSSL_DES_ECB_ENCRYPT
+
/* Define to 1 if you have the `wolfSSL_get_peer_certificate' function. */
#undef HAVE_WOLFSSL_GET_PEER_CERTIFICATE
@@ -811,6 +831,12 @@
/* if you have the zlib.h header file */
#undef HAVE_ZLIB_H
+/* if libzstd is in use */
+#undef HAVE_ZSTD
+
+/* Define to 1 if you have the <zstd.h> header file. */
+#undef HAVE_ZSTD_H
+
/* Define to the sub-directory where libtool stores uninstalled libraries. */
#undef LT_OBJDIR
@@ -955,8 +981,11 @@
/* Define to enable c-ares support */
#undef USE_ARES
-/* if ESNI support is available */
-#undef USE_ESNI
+/* if BearSSL is enabled */
+#undef USE_BEARSSL
+
+/* if ECH support is available */
+#undef USE_ECH
/* if GnuTLS is enabled */
#undef USE_GNUTLS
@@ -997,6 +1026,9 @@
/* if ngtcp2 is in use */
#undef USE_NGTCP2
+/* if ngtcp2_crypto_gnutls is in use */
+#undef USE_NGTCP2_CRYPTO_GNUTLS
+
/* if ngtcp2_crypto_openssl is in use */
#undef USE_NGTCP2_CRYPTO_OPENSSL
@@ -1047,6 +1079,9 @@
/* to enable SSPI support */
#undef USE_WINDOWS_SSPI
+/* if wolfSSH is in use */
+#undef USE_WOLFSSH
+
/* if wolfSSL is enabled */
#undef USE_WOLFSSL
diff --git a/lib/curl_des.c b/lib/curl_des.c
index b123a00f0..39c0f35ee 100644
--- a/lib/curl_des.c
+++ b/lib/curl_des.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2015 - 2019, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_des.h b/lib/curl_des.h
index 129060ff7..a42eeb53f 100644
--- a/lib/curl_des.h
+++ b/lib/curl_des.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2015 - 2019, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_endian.c b/lib/curl_endian.c
index b7563b3de..a774d136e 100644
--- a/lib/curl_endian.c
+++ b/lib/curl_endian.c
@@ -81,6 +81,7 @@ unsigned short Curl_read16_be(const unsigned char *buf)
((unsigned short)buf[1]));
}
+#if (CURL_SIZEOF_CURL_OFF_T > 4)
/*
* write32_le()
*
@@ -100,7 +101,6 @@ static void write32_le(const int value, unsigned char *buffer)
buffer[3] = (char)((value & 0xFF000000) >> 24);
}
-#if (CURL_SIZEOF_CURL_OFF_T > 4)
/*
* Curl_write64_le()
*
diff --git a/lib/curl_fnmatch.h b/lib/curl_fnmatch.h
index 69ffe392f..34fccae48 100644
--- a/lib/curl_fnmatch.h
+++ b/lib/curl_fnmatch.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_get_line.c b/lib/curl_get_line.c
index c4194851a..3c77be9a9 100644
--- a/lib/curl_get_line.c
+++ b/lib/curl_get_line.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +22,8 @@
#include "curl_setup.h"
+#if !defined(CURL_DISABLE_COOKIES) && !defined(CURL_DISABLE_ALTSVC)
+
#include "curl_get_line.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -53,3 +55,5 @@ char *Curl_get_line(char *buf, int len, FILE *input)
}
return NULL;
}
+
+#endif /* if not disabled */
diff --git a/lib/curl_gethostname.c b/lib/curl_gethostname.c
index 8337c72e8..5f1c9998f 100644
--- a/lib/curl_gethostname.c
+++ b/lib/curl_gethostname.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@
* For libcurl static library release builds no overriding takes place.
*/
-int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen)
+int Curl_gethostname(char * const name, GETHOSTNAME_TYPE_ARG2 namelen)
{
#ifndef HAVE_GETHOSTNAME
diff --git a/lib/curl_gethostname.h b/lib/curl_gethostname.h
index 07517c535..2d78bc54d 100644
--- a/lib/curl_gethostname.h
+++ b/lib/curl_gethostname.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,6 @@
#define HOSTNAME_MAX 1024
/* This returns the local machine's un-qualified hostname */
-int Curl_gethostname(char *name, GETHOSTNAME_TYPE_ARG2 namelen);
+int Curl_gethostname(char * const name, GETHOSTNAME_TYPE_ARG2 namelen);
#endif /* HEADER_CURL_GETHOSTNAME_H */
diff --git a/lib/curl_hmac.h b/lib/curl_hmac.h
index 756dc9e4c..9b70c8468 100644
--- a/lib/curl_hmac.h
+++ b/lib/curl_hmac.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,6 +24,8 @@
#ifndef CURL_DISABLE_CRYPTO_AUTH
+#define HMAC_MD5_LENGTH 16
+
typedef void (* HMAC_hinit_func)(void *context);
typedef void (* HMAC_hupdate_func)(void *context,
const unsigned char *data,
@@ -32,35 +34,38 @@ typedef void (* HMAC_hfinal_func)(unsigned char *result, void *context);
/* Per-hash function HMAC parameters. */
-
-typedef struct {
- HMAC_hinit_func hmac_hinit; /* Initialize context procedure. */
+struct HMAC_params {
+ HMAC_hinit_func
+ hmac_hinit; /* Initialize context procedure. */
HMAC_hupdate_func hmac_hupdate; /* Update context with data. */
HMAC_hfinal_func hmac_hfinal; /* Get final result procedure. */
unsigned int hmac_ctxtsize; /* Context structure size. */
unsigned int hmac_maxkeylen; /* Maximum key length (bytes). */
unsigned int hmac_resultlen; /* Result length (bytes). */
-} HMAC_params;
+};
/* HMAC computation context. */
-
-typedef struct {
- const HMAC_params *hmac_hash; /* Hash function definition. */
+struct HMAC_context {
+ const struct HMAC_params *hmac_hash; /* Hash function definition. */
void *hmac_hashctxt1; /* Hash function context 1. */
void *hmac_hashctxt2; /* Hash function context 2. */
-} HMAC_context;
+};
/* Prototypes. */
-
-HMAC_context * Curl_HMAC_init(const HMAC_params *hashparams,
- const unsigned char *key,
- unsigned int keylen);
-int Curl_HMAC_update(HMAC_context *context,
+struct HMAC_context *Curl_HMAC_init(const struct HMAC_params *hashparams,
+ const unsigned char *key,
+ unsigned int keylen);
+int Curl_HMAC_update(struct HMAC_context *context,
const unsigned char *data,
unsigned int len);
-int Curl_HMAC_final(HMAC_context *context, unsigned char *result);
+int Curl_HMAC_final(struct HMAC_context *context, unsigned char *result);
+
+CURLcode Curl_hmacit(const struct HMAC_params *hashparams,
+ const unsigned char *key, const size_t keylen,
+ const unsigned char *data, const size_t datalen,
+ unsigned char *output);
#endif
diff --git a/lib/curl_sec.h b/lib/curl_krb5.h
index 7bdde269b..ae9b7e0d3 100644
--- a/lib/curl_sec.h
+++ b/lib/curl_krb5.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_SECURITY_H
-#define HEADER_CURL_SECURITY_H
+#ifndef HEADER_CURL_KRB5_H
+#define HEADER_CURL_KRB5_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,8 +44,8 @@ int Curl_sec_read_msg(struct connectdata *conn, char *,
void Curl_sec_end(struct connectdata *);
CURLcode Curl_sec_login(struct connectdata *);
int Curl_sec_request_prot(struct connectdata *conn, const char *level);
-
-extern struct Curl_sec_client_mech Curl_krb5_client_mech;
+#else
+#define Curl_sec_end(x)
#endif
-#endif /* HEADER_CURL_SECURITY_H */
+#endif /* HEADER_CURL_KRB5_H */
diff --git a/lib/curl_ldap.h b/lib/curl_ldap.h
index 94c002948..912e13107 100644
--- a/lib/curl_ldap.h
+++ b/lib/curl_ldap.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_md4.h b/lib/curl_md4.h
index 82df708ce..c7bb20981 100644
--- a/lib/curl_md4.h
+++ b/lib/curl_md4.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,8 @@
#define MD4_DIGEST_LENGTH 16
-void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);
+void Curl_md4it(unsigned char *output, const unsigned char *input,
+ const size_t len);
#endif /* !defined(CURL_DISABLE_CRYPTO_AUTH) */
diff --git a/lib/curl_md5.h b/lib/curl_md5.h
index aaf25f61b..e06c68edf 100644
--- a/lib/curl_md5.h
+++ b/lib/curl_md5.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -33,30 +33,30 @@ typedef void (* Curl_MD5_update_func)(void *context,
unsigned int len);
typedef void (* Curl_MD5_final_func)(unsigned char *result, void *context);
-typedef struct {
+struct MD5_params {
Curl_MD5_init_func md5_init_func; /* Initialize context procedure */
Curl_MD5_update_func md5_update_func; /* Update context with data */
Curl_MD5_final_func md5_final_func; /* Get final result procedure */
unsigned int md5_ctxtsize; /* Context structure size */
unsigned int md5_resultlen; /* Result length (bytes) */
-} MD5_params;
+};
-typedef struct {
- const MD5_params *md5_hash; /* Hash function definition */
+struct MD5_context {
+ const struct MD5_params *md5_hash; /* Hash function definition */
void *md5_hashctx; /* Hash function context */
-} MD5_context;
+};
-extern const MD5_params Curl_DIGEST_MD5[1];
-extern const HMAC_params Curl_HMAC_MD5[1];
+extern const struct MD5_params Curl_DIGEST_MD5[1];
+extern const struct HMAC_params Curl_HMAC_MD5[1];
-void Curl_md5it(unsigned char *output,
- const unsigned char *input);
+void Curl_md5it(unsigned char *output, const unsigned char *input,
+ const size_t len);
-MD5_context * Curl_MD5_init(const MD5_params *md5params);
-CURLcode Curl_MD5_update(MD5_context *context,
+struct MD5_context *Curl_MD5_init(const struct MD5_params *md5params);
+CURLcode Curl_MD5_update(struct MD5_context *context,
const unsigned char *data,
unsigned int len);
-CURLcode Curl_MD5_final(MD5_context *context, unsigned char *result);
+CURLcode Curl_MD5_final(struct MD5_context *context, unsigned char *result);
#endif
diff --git a/lib/curl_memrchr.h b/lib/curl_memrchr.h
index 747509c45..90a8a07cc 100644
--- a/lib/curl_memrchr.h
+++ b/lib/curl_memrchr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_multibyte.c b/lib/curl_multibyte.c
index e48334faf..2c8925b53 100644
--- a/lib/curl_multibyte.c
+++ b/lib/curl_multibyte.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -20,24 +20,21 @@
*
***************************************************************************/
-#include "curl_setup.h"
-
-#include <curl/curl.h>
+/*
+ * This file is 'mem-include-scan' clean. See test 1132.
+ */
-#if defined(USE_WIN32_IDN) || ((defined(USE_WINDOWS_SSPI) || \
- defined(USE_WIN32_LDAP)) && defined(UNICODE))
+#include "curl_setup.h"
- /*
- * MultiByte conversions using Windows kernel32 library.
- */
+#if defined(WIN32)
#include "curl_multibyte.h"
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
+/*
+ * MultiByte conversions using Windows kernel32 library.
+ */
-wchar_t *Curl_convert_UTF8_to_wchar(const char *str_utf8)
+wchar_t *curlx_convert_UTF8_to_wchar(const char *str_utf8)
{
wchar_t *str_w = NULL;
@@ -59,7 +56,7 @@ wchar_t *Curl_convert_UTF8_to_wchar(const char *str_utf8)
return str_w;
}
-char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w)
+char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w)
{
char *str_utf8 = NULL;
@@ -81,4 +78,76 @@ char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w)
return str_utf8;
}
-#endif /* USE_WIN32_IDN || ((USE_WINDOWS_SSPI || USE_WIN32_LDAP) && UNICODE) */
+#endif /* WIN32 */
+
+#if defined(USE_WIN32_LARGE_FILES) || defined(USE_WIN32_SMALL_FILES)
+
+FILE *curlx_win32_fopen(const char *filename, const char *mode)
+{
+#ifdef _UNICODE
+ FILE *result = NULL;
+ wchar_t *filename_w = curlx_convert_UTF8_to_wchar(filename);
+ wchar_t *mode_w = curlx_convert_UTF8_to_wchar(mode);
+ if(filename_w && mode_w)
+ result = _wfopen(filename_w, mode_w);
+ free(filename_w);
+ free(mode_w);
+ if(result)
+ return result;
+#endif
+
+ return (fopen)(filename, mode);
+}
+
+int curlx_win32_stat(const char *path, struct_stat *buffer)
+{
+ int result = -1;
+#ifdef _UNICODE
+ wchar_t *path_w = curlx_convert_UTF8_to_wchar(path);
+#endif /* _UNICODE */
+
+#if defined(USE_WIN32_SMALL_FILES)
+#if defined(_UNICODE)
+ if(path_w)
+ result = _wstat(path_w, buffer);
+ else
+#endif /* _UNICODE */
+ result = _stat(path, buffer);
+#else /* USE_WIN32_SMALL_FILES */
+#if defined(_UNICODE)
+ if(path_w)
+ result = _wstati64(path_w, buffer);
+ else
+#endif /* _UNICODE */
+ result = _stati64(path, buffer);
+#endif /* USE_WIN32_SMALL_FILES */
+
+#ifdef _UNICODE
+ free(path_w);
+#endif
+
+ return result;
+}
+
+int curlx_win32_access(const char *path, int mode)
+{
+ int result = -1;
+#ifdef _UNICODE
+ wchar_t *path_w = curlx_convert_UTF8_to_wchar(path);
+#endif /* _UNICODE */
+
+#if defined(_UNICODE)
+ if(path_w)
+ result = _waccess(path_w, mode);
+ else
+#endif /* _UNICODE */
+ result = _access(path, mode);
+
+#ifdef _UNICODE
+ free(path_w);
+#endif
+
+ return result;
+}
+
+#endif /* USE_WIN32_LARGE_FILES || USE_WIN32_SMALL_FILES */
diff --git a/lib/curl_multibyte.h b/lib/curl_multibyte.h
index 615f5c086..5f8c05afc 100644
--- a/lib/curl_multibyte.h
+++ b/lib/curl_multibyte.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,46 +23,46 @@
***************************************************************************/
#include "curl_setup.h"
-#if defined(USE_WIN32_IDN) || ((defined(USE_WINDOWS_SSPI) || \
- defined(USE_WIN32_LDAP)) && defined(UNICODE))
+#if defined(WIN32)
/*
* MultiByte conversions using Windows kernel32 library.
*/
-wchar_t *Curl_convert_UTF8_to_wchar(const char *str_utf8);
-char *Curl_convert_wchar_to_UTF8(const wchar_t *str_w);
+wchar_t *curlx_convert_UTF8_to_wchar(const char *str_utf8);
+char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w);
-#endif /* USE_WIN32_IDN || ((USE_WINDOWS_SSPI || USE_WIN32_LDAP) && UNICODE) */
-
-
-#if defined(USE_WIN32_IDN) || defined(USE_WINDOWS_SSPI) || \
- defined(USE_WIN32_LDAP)
+#endif /* WIN32 */
/*
- * Macros Curl_convert_UTF8_to_tchar(), Curl_convert_tchar_to_UTF8()
- * and Curl_unicodefree() main purpose is to minimize the number of
+ * Macros curlx_convert_UTF8_to_tchar(), curlx_convert_tchar_to_UTF8()
+ * and curlx_unicodefree() main purpose is to minimize the number of
* preprocessor conditional directives needed by code using these
* to differentiate UNICODE from non-UNICODE builds.
*
- * When building with UNICODE defined, this two macros
- * Curl_convert_UTF8_to_tchar() and Curl_convert_tchar_to_UTF8()
+ * When building with UNICODE defined, these two macros
+ * curlx_convert_UTF8_to_tchar() and curlx_convert_tchar_to_UTF8()
* return a pointer to a newly allocated memory area holding result.
* When the result is no longer needed, allocated memory is intended
- * to be free'ed with Curl_unicodefree().
+ * to be free'ed with curlx_unicodefree().
*
* When building without UNICODE defined, this macros
- * Curl_convert_UTF8_to_tchar() and Curl_convert_tchar_to_UTF8()
- * return the pointer received as argument. Curl_unicodefree() does
+ * curlx_convert_UTF8_to_tchar() and curlx_convert_tchar_to_UTF8()
+ * return the pointer received as argument. curlx_unicodefree() does
* no actual free'ing of this pointer it is simply set to NULL.
*/
-#ifdef UNICODE
+#if defined(UNICODE) && defined(WIN32)
-#define Curl_convert_UTF8_to_tchar(ptr) Curl_convert_UTF8_to_wchar((ptr))
-#define Curl_convert_tchar_to_UTF8(ptr) Curl_convert_wchar_to_UTF8((ptr))
-#define Curl_unicodefree(ptr) \
- do {if((ptr)) {free((ptr)); (ptr) = NULL;}} WHILE_FALSE
+#define curlx_convert_UTF8_to_tchar(ptr) curlx_convert_UTF8_to_wchar((ptr))
+#define curlx_convert_tchar_to_UTF8(ptr) curlx_convert_wchar_to_UTF8((ptr))
+#define curlx_unicodefree(ptr) \
+ do { \
+ if(ptr) { \
+ (free)(ptr); \
+ (ptr) = NULL; \
+ } \
+ } while(0)
typedef union {
unsigned short *tchar_ptr;
@@ -73,10 +73,10 @@ typedef union {
#else
-#define Curl_convert_UTF8_to_tchar(ptr) (ptr)
-#define Curl_convert_tchar_to_UTF8(ptr) (ptr)
-#define Curl_unicodefree(ptr) \
- do {(ptr) = NULL;} WHILE_FALSE
+#define curlx_convert_UTF8_to_tchar(ptr) (ptr)
+#define curlx_convert_tchar_to_UTF8(ptr) (ptr)
+#define curlx_unicodefree(ptr) \
+ do {(ptr) = NULL;} while(0)
typedef union {
char *tchar_ptr;
@@ -85,8 +85,6 @@ typedef union {
const unsigned char *const_tbyte_ptr;
} xcharp_u;
-#endif /* UNICODE */
-
-#endif /* USE_WIN32_IDN || USE_WINDOWS_SSPI || USE_WIN32_LDAP */
+#endif /* UNICODE && WIN32 */
#endif /* HEADER_CURL_MULTIBYTE_H */
diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
index 19f9b61d8..defae772b 100644
--- a/lib/curl_ntlm_core.c
+++ b/lib/curl_ntlm_core.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,7 +22,7 @@
#include "curl_setup.h"
-#if defined(USE_NTLM)
+#if defined(USE_CURL_NTLM_CORE)
/*
* NTLM details:
@@ -50,15 +50,18 @@
in NTLM type-3 messages.
*/
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
+#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
-#ifdef USE_OPENSSL
+#ifdef USE_WOLFSSL
+#include <wolfssl/options.h>
+#endif
# include <openssl/des.h>
# include <openssl/md5.h>
# include <openssl/ssl.h>
# include <openssl/rand.h>
-# if (OPENSSL_VERSION_NUMBER < 0x00907001L)
+# if (defined(OPENSSL_VERSION_NUMBER) && \
+ (OPENSSL_VERSION_NUMBER < 0x00907001L)) && !defined(USE_WOLFSSL)
# define DES_key_schedule des_key_schedule
# define DES_cblock des_cblock
# define DES_set_odd_parity des_set_odd_parity
@@ -78,14 +81,12 @@
#elif defined(USE_GNUTLS)
# include <gcrypt.h>
-# define MD5_DIGEST_LENGTH 16
#elif defined(USE_NSS)
# include <nss.h>
# include <pk11pub.h>
# include <hasht.h>
-# define MD5_DIGEST_LENGTH MD5_LENGTH
#elif defined(USE_MBEDTLS)
@@ -120,7 +121,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-#define NTLM_HMAC_MD5_LEN (16)
#define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00"
#define NTLMv2_BLOB_LEN (44 -16 + ntlm->target_info_len + 4)
@@ -139,7 +139,7 @@ static void extend_key_56_to_64(const unsigned char *key_56, char *key)
key[7] = (unsigned char) ((key_56[6] << 1) & 0xFF);
}
-#ifdef USE_OPENSSL
+#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
/*
* Turns a 56 bit key into the 64 bit, odd parity key and sets the key. The
* key schedule ks is also set.
@@ -343,7 +343,7 @@ static bool encrypt_des(const unsigned char *in, unsigned char *out,
/* Acquire the crypto provider */
if(!CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT))
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
return FALSE;
/* Setup the key blob structure */
@@ -388,7 +388,7 @@ void Curl_ntlm_core_lm_resp(const unsigned char *keys,
const unsigned char *plaintext,
unsigned char *results)
{
-#ifdef USE_OPENSSL
+#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
DES_key_schedule ks;
setup_des_key(keys, DESKEY(ks));
@@ -463,7 +463,7 @@ CURLcode Curl_ntlm_core_mk_lm_hash(struct Curl_easy *data,
{
/* Create LanManager hashed password. */
-#ifdef USE_OPENSSL
+#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
DES_key_schedule ks;
setup_des_key(pw, DESKEY(ks));
@@ -567,25 +567,6 @@ CURLcode Curl_ntlm_core_mk_nt_hash(struct Curl_easy *data,
#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
-/* This returns the HMAC MD5 digest */
-static CURLcode hmac_md5(const unsigned char *key, unsigned int keylen,
- const unsigned char *data, unsigned int datalen,
- unsigned char *output)
-{
- HMAC_context *ctxt = Curl_HMAC_init(Curl_HMAC_MD5, key, keylen);
-
- if(!ctxt)
- return CURLE_OUT_OF_MEMORY;
-
- /* Update the digest with the given challenge */
- Curl_HMAC_update(ctxt, data, datalen);
-
- /* Finalise the digest */
- Curl_HMAC_final(ctxt, output);
-
- return CURLE_OK;
-}
-
/* This creates the NTLMv2 hash by using NTLM hash as the key and Unicode
* (uppercase UserName + Domain) as the data
*/
@@ -615,8 +596,8 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_hash(const char *user, size_t userlen,
ascii_uppercase_to_unicode_le(identity, user, userlen);
ascii_to_unicode_le(identity + (userlen << 1), domain, domlen);
- result = hmac_md5(ntlmhash, 16, identity, curlx_uztoui(identity_len),
- ntlmv2hash);
+ result = Curl_hmacit(Curl_HMAC_MD5, ntlmhash, 16, identity, identity_len,
+ ntlmv2hash);
free(identity);
return result;
@@ -662,7 +643,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
unsigned int len = 0;
unsigned char *ptr = NULL;
- unsigned char hmac_output[NTLM_HMAC_MD5_LEN];
+ unsigned char hmac_output[HMAC_MD5_LENGTH];
curl_off_t tw;
CURLcode result = CURLE_OK;
@@ -681,7 +662,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
tw = ((curl_off_t)time(NULL) + CURL_OFF_T_C(11644473600)) * 10000000;
/* Calculate the response len */
- len = NTLM_HMAC_MD5_LEN + NTLMv2_BLOB_LEN;
+ len = HMAC_MD5_LENGTH + NTLMv2_BLOB_LEN;
/* Allocate the response */
ptr = calloc(1, len);
@@ -689,7 +670,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
return CURLE_OUT_OF_MEMORY;
/* Create the BLOB structure */
- msnprintf((char *)ptr + NTLM_HMAC_MD5_LEN, NTLMv2_BLOB_LEN,
+ msnprintf((char *)ptr + HMAC_MD5_LENGTH, NTLMv2_BLOB_LEN,
"%c%c%c%c" /* NTLMv2_BLOB_SIGNATURE */
"%c%c%c%c", /* Reserved = 0 */
NTLMv2_BLOB_SIGNATURE[0], NTLMv2_BLOB_SIGNATURE[1],
@@ -702,7 +683,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
/* Concatenate the Type 2 challenge with the BLOB and do HMAC MD5 */
memcpy(ptr + 8, &ntlm->nonce[0], 8);
- result = hmac_md5(ntlmv2hash, NTLM_HMAC_MD5_LEN, ptr + 8,
+ result = Curl_hmacit(Curl_HMAC_MD5, ntlmv2hash, HMAC_MD5_LENGTH, ptr + 8,
NTLMv2_BLOB_LEN + 8, hmac_output);
if(result) {
free(ptr);
@@ -710,7 +691,7 @@ CURLcode Curl_ntlm_core_mk_ntlmv2_resp(unsigned char *ntlmv2hash,
}
/* Concatenate the HMAC MD5 output with the BLOB */
- memcpy(ptr, hmac_output, NTLM_HMAC_MD5_LEN);
+ memcpy(ptr, hmac_output, HMAC_MD5_LENGTH);
/* Return the response */
*ntresp = ptr;
@@ -745,7 +726,8 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
memcpy(&data[0], challenge_server, 8);
memcpy(&data[8], challenge_client, 8);
- result = hmac_md5(ntlmv2hash, 16, &data[0], 16, hmac_output);
+ result = Curl_hmacit(Curl_HMAC_MD5, ntlmv2hash, 16, &data[0], 16,
+ hmac_output);
if(result)
return result;
@@ -760,6 +742,4 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
#endif /* USE_NTRESPONSES */
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* USE_NTLM */
+#endif /* USE_CURL_NTLM_CORE */
diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h
index 3b4b8053c..6d391c4cb 100644
--- a/lib/curl_ntlm_core.h
+++ b/lib/curl_ntlm_core.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,20 +24,22 @@
#include "curl_setup.h"
-#if defined(USE_NTLM)
+#if defined(USE_CURL_NTLM_CORE)
/* If NSS is the first available SSL backend (see order in curl_ntlm_core.c)
then it must be initialized to be used by NTLM. */
#if !defined(USE_OPENSSL) && \
+ !defined(USE_WOLFSSL) && \
!defined(USE_GNUTLS_NETTLE) && \
!defined(USE_GNUTLS) && \
defined(USE_NSS)
#define NTLM_NEEDS_NSS_INIT
#endif
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
-#ifdef USE_OPENSSL
+#if defined(USE_OPENSSL) || defined(USE_WOLFSSL)
+#ifdef USE_WOLFSSL
+# include <wolfssl/options.h>
+#endif
# include <openssl/ssl.h>
#endif
@@ -46,9 +48,9 @@
#define USE_NTRESPONSES
/* Define USE_NTLM2SESSION in order to make the type-3 message include the
- NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and a
- Crypto engine that we have curl_ssl_md5sum() for. */
-#if defined(USE_NTRESPONSES) && !defined(USE_WIN32_CRYPTO)
+ NTLM2Session response message, requires USE_NTRESPONSES defined to 1 and
+ MD5 support */
+#if defined(USE_NTRESPONSES) && !defined(CURL_DISABLE_CRYPTO_AUTH)
#define USE_NTLM2SESSION
#endif
@@ -98,8 +100,6 @@ CURLcode Curl_ntlm_core_mk_lmv2_resp(unsigned char *ntlmv2hash,
#endif /* USE_NTRESPONSES */
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* USE_NTLM */
+#endif /* USE_CURL_NTLM_CORE */
#endif /* HEADER_CURL_NTLM_CORE_H */
diff --git a/lib/curl_ntlm_wb.c b/lib/curl_ntlm_wb.c
index 80266e2a4..17a92f8ca 100644
--- a/lib/curl_ntlm_wb.c
+++ b/lib/curl_ntlm_wb.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -76,22 +76,22 @@
# define sclose_nolog(x) close((x))
#endif
-void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
+static void ntlm_wb_cleanup(struct ntlmdata *ntlm)
{
- if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD) {
- sclose(conn->ntlm_auth_hlpr_socket);
- conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ if(ntlm->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD) {
+ sclose(ntlm->ntlm_auth_hlpr_socket);
+ ntlm->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
}
- if(conn->ntlm_auth_hlpr_pid) {
+ if(ntlm->ntlm_auth_hlpr_pid) {
int i;
for(i = 0; i < 4; i++) {
- pid_t ret = waitpid(conn->ntlm_auth_hlpr_pid, NULL, WNOHANG);
- if(ret == conn->ntlm_auth_hlpr_pid || errno == ECHILD)
+ pid_t ret = waitpid(ntlm->ntlm_auth_hlpr_pid, NULL, WNOHANG);
+ if(ret == ntlm->ntlm_auth_hlpr_pid || errno == ECHILD)
break;
switch(i) {
case 0:
- kill(conn->ntlm_auth_hlpr_pid, SIGTERM);
+ kill(ntlm->ntlm_auth_hlpr_pid, SIGTERM);
break;
case 1:
/* Give the process another moment to shut down cleanly before
@@ -99,22 +99,21 @@ void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
Curl_wait_ms(1);
break;
case 2:
- kill(conn->ntlm_auth_hlpr_pid, SIGKILL);
+ kill(ntlm->ntlm_auth_hlpr_pid, SIGKILL);
break;
case 3:
break;
}
}
- conn->ntlm_auth_hlpr_pid = 0;
+ ntlm->ntlm_auth_hlpr_pid = 0;
}
- free(conn->challenge_header);
- conn->challenge_header = NULL;
- free(conn->response_header);
- conn->response_header = NULL;
+ Curl_safefree(ntlm->challenge);
+ Curl_safefree(ntlm->response);
}
-static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
+static CURLcode ntlm_wb_init(struct Curl_easy *data, struct ntlmdata *ntlm,
+ const char *userp)
{
curl_socket_t sockfds[2];
pid_t child_pid;
@@ -128,9 +127,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
#endif
char buffer[STRERROR_LEN];
+#if defined(CURL_DISABLE_VERBOSE_STRINGS)
+ (void) data;
+#endif
+
/* Return if communication with ntlm_auth already set up */
- if(conn->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD ||
- conn->ntlm_auth_hlpr_pid)
+ if(ntlm->ntlm_auth_hlpr_socket != CURL_SOCKET_BAD ||
+ ntlm->ntlm_auth_hlpr_pid)
return CURLE_OK;
username = userp;
@@ -181,13 +184,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
ntlm_auth = NTLM_WB_FILE;
if(access(ntlm_auth, X_OK) != 0) {
- failf(conn->data, "Could not access ntlm_auth: %s errno %d: %s",
+ failf(data, "Could not access ntlm_auth: %s errno %d: %s",
ntlm_auth, errno, Curl_strerror(errno, buffer, sizeof(buffer)));
goto done;
}
- if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) {
- failf(conn->data, "Could not open socket pair. errno %d: %s",
+ if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) {
+ failf(data, "Could not open socket pair. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
goto done;
}
@@ -196,7 +199,7 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
if(child_pid == -1) {
sclose(sockfds[0]);
sclose(sockfds[1]);
- failf(conn->data, "Could not fork. errno %d: %s",
+ failf(data, "Could not fork. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
goto done;
}
@@ -208,13 +211,13 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
/* Don't use sclose in the child since it fools the socket leak detector */
sclose_nolog(sockfds[0]);
if(dup2(sockfds[1], STDIN_FILENO) == -1) {
- failf(conn->data, "Could not redirect child stdin. errno %d: %s",
+ failf(data, "Could not redirect child stdin. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
exit(1);
}
if(dup2(sockfds[1], STDOUT_FILENO) == -1) {
- failf(conn->data, "Could not redirect child stdout. errno %d: %s",
+ failf(data, "Could not redirect child stdout. errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
exit(1);
}
@@ -234,14 +237,14 @@ static CURLcode ntlm_wb_init(struct connectdata *conn, const char *userp)
NULL);
sclose_nolog(sockfds[1]);
- failf(conn->data, "Could not execl(). errno %d: %s",
+ failf(data, "Could not execl(). errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
exit(1);
}
sclose(sockfds[1]);
- conn->ntlm_auth_hlpr_socket = sockfds[0];
- conn->ntlm_auth_hlpr_pid = child_pid;
+ ntlm->ntlm_auth_hlpr_socket = sockfds[0];
+ ntlm->ntlm_auth_hlpr_pid = child_pid;
free(domain);
free(ntlm_auth_alloc);
return CURLE_OK;
@@ -255,17 +258,17 @@ done:
/* if larger than this, something is seriously wrong */
#define MAX_NTLM_WB_RESPONSE 100000
-static CURLcode ntlm_wb_response(struct connectdata *conn,
+static CURLcode ntlm_wb_response(struct Curl_easy *data, struct ntlmdata *ntlm,
const char *input, curlntlm state)
{
- char *buf = malloc(NTLM_BUFSIZE);
size_t len_in = strlen(input), len_out = 0;
-
- if(!buf)
- return CURLE_OUT_OF_MEMORY;
+ struct dynbuf b;
+ char *ptr = NULL;
+ unsigned char *buf = (unsigned char *)data->state.buffer;
+ Curl_dyn_init(&b, MAX_NTLM_WB_RESPONSE);
while(len_in > 0) {
- ssize_t written = swrite(conn->ntlm_auth_hlpr_socket, input, len_in);
+ ssize_t written = swrite(ntlm->ntlm_auth_hlpr_socket, input, len_in);
if(written == -1) {
/* Interrupted by a signal, retry it */
if(errno == EINTR)
@@ -278,10 +281,8 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
}
/* Read one line */
while(1) {
- ssize_t size;
- char *newbuf;
-
- size = sread(conn->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE);
+ ssize_t size =
+ sread(ntlm->ntlm_auth_hlpr_socket, buf, data->set.buffer_size);
if(size == -1) {
if(errno == EINTR)
continue;
@@ -290,48 +291,41 @@ static CURLcode ntlm_wb_response(struct connectdata *conn,
else if(size == 0)
goto done;
- len_out += size;
- if(buf[len_out - 1] == '\n') {
- buf[len_out - 1] = '\0';
- break;
- }
+ if(Curl_dyn_addn(&b, buf, size))
+ goto done;
- if(len_out > MAX_NTLM_WB_RESPONSE) {
- failf(conn->data, "too large ntlm_wb response!");
- free(buf);
- return CURLE_OUT_OF_MEMORY;
+ len_out = Curl_dyn_len(&b);
+ ptr = Curl_dyn_ptr(&b);
+ if(len_out && ptr[len_out - 1] == '\n') {
+ ptr[len_out - 1] = '\0';
+ break; /* done! */
}
-
- newbuf = Curl_saferealloc(buf, len_out + NTLM_BUFSIZE);
- if(!newbuf)
- return CURLE_OUT_OF_MEMORY;
-
- buf = newbuf;
+ /* loop */
}
/* Samba/winbind installed but not configured */
if(state == NTLMSTATE_TYPE1 &&
len_out == 3 &&
- buf[0] == 'P' && buf[1] == 'W')
+ ptr[0] == 'P' && ptr[1] == 'W')
goto done;
/* invalid response */
if(len_out < 4)
goto done;
if(state == NTLMSTATE_TYPE1 &&
- (buf[0]!='Y' || buf[1]!='R' || buf[2]!=' '))
+ (ptr[0]!='Y' || ptr[1]!='R' || ptr[2]!=' '))
goto done;
if(state == NTLMSTATE_TYPE2 &&
- (buf[0]!='K' || buf[1]!='K' || buf[2]!=' ') &&
- (buf[0]!='A' || buf[1]!='F' || buf[2]!=' '))
+ (ptr[0]!='K' || ptr[1]!='K' || ptr[2]!=' ') &&
+ (ptr[0]!='A' || ptr[1]!='F' || ptr[2]!=' '))
goto done;
- conn->response_header = aprintf("NTLM %.*s", len_out - 4, buf + 3);
- free(buf);
- if(!conn->response_header)
+ ntlm->response = strdup(ptr + 3);
+ Curl_dyn_free(&b);
+ if(!ntlm->response)
return CURLE_OUT_OF_MEMORY;
return CURLE_OK;
done:
- free(buf);
+ Curl_dyn_free(&b);
return CURLE_REMOTE_ACCESS_DENIED;
}
@@ -339,6 +333,7 @@ CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
bool proxy,
const char *header)
{
+ struct ntlmdata *ntlm = proxy ? &conn->proxyntlm : &conn->ntlm;
curlntlm *state = proxy ? &conn->proxy_ntlm_state : &conn->http_ntlm_state;
if(!checkprefix("NTLM", header))
@@ -349,8 +344,8 @@ CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
header++;
if(*header) {
- conn->challenge_header = strdup(header);
- if(!conn->challenge_header)
+ ntlm->challenge = strdup(header);
+ if(!ntlm->challenge)
return CURLE_OUT_OF_MEMORY;
*state = NTLMSTATE_TYPE2; /* We got a type-2 message */
@@ -381,32 +376,38 @@ CURLcode Curl_input_ntlm_wb(struct connectdata *conn,
* This is for creating ntlm header output by delegating challenge/response
* to Samba's winbind daemon helper ntlm_auth.
*/
-CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
- bool proxy)
+CURLcode Curl_output_ntlm_wb(struct connectdata *conn, bool proxy)
{
/* point to the address of the pointer that holds the string to send to the
server, which is for a plain host or for a HTTP proxy */
char **allocuserpwd;
/* point to the name and password for this */
const char *userp;
+ struct ntlmdata *ntlm;
curlntlm *state;
struct auth *authp;
+ struct Curl_easy *data = conn->data;
CURLcode res = CURLE_OK;
- char *input;
DEBUGASSERT(conn);
DEBUGASSERT(conn->data);
if(proxy) {
- allocuserpwd = &conn->allocptr.proxyuserpwd;
+#ifndef CURL_DISABLE_PROXY
+ allocuserpwd = &data->state.aptr.proxyuserpwd;
userp = conn->http_proxy.user;
+ ntlm = &conn->proxyntlm;
state = &conn->proxy_ntlm_state;
authp = &conn->data->state.authproxy;
+#else
+ return CURLE_NOT_BUILT_IN;
+#endif
}
else {
- allocuserpwd = &conn->allocptr.userpwd;
+ allocuserpwd = &data->state.aptr.userpwd;
userp = conn->user;
+ ntlm = &conn->ntlm;
state = &conn->http_ntlm_state;
authp = &conn->data->state.authhost;
}
@@ -432,38 +433,36 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
* request handling process.
*/
/* Create communication with ntlm_auth */
- res = ntlm_wb_init(conn, userp);
+ res = ntlm_wb_init(conn->data, ntlm, userp);
if(res)
return res;
- res = ntlm_wb_response(conn, "YR\n", *state);
+ res = ntlm_wb_response(conn->data, ntlm, "YR\n", *state);
if(res)
return res;
free(*allocuserpwd);
- *allocuserpwd = aprintf("%sAuthorization: %s\r\n",
+ *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
proxy ? "Proxy-" : "",
- conn->response_header);
+ ntlm->response);
DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd));
- free(conn->response_header);
+ Curl_safefree(ntlm->response);
if(!*allocuserpwd)
return CURLE_OUT_OF_MEMORY;
- conn->response_header = NULL;
break;
- case NTLMSTATE_TYPE2:
- input = aprintf("TT %s\n", conn->challenge_header);
+ case NTLMSTATE_TYPE2: {
+ char *input = aprintf("TT %s\n", ntlm->challenge);
if(!input)
return CURLE_OUT_OF_MEMORY;
- res = ntlm_wb_response(conn, input, *state);
+ res = ntlm_wb_response(conn->data, ntlm, input, *state);
free(input);
- input = NULL;
if(res)
return res;
free(*allocuserpwd);
- *allocuserpwd = aprintf("%sAuthorization: %s\r\n",
+ *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
proxy ? "Proxy-" : "",
- conn->response_header);
+ ntlm->response);
DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
*state = NTLMSTATE_TYPE3; /* we sent a type-3 */
authp->done = TRUE;
@@ -471,7 +470,7 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
if(!*allocuserpwd)
return CURLE_OUT_OF_MEMORY;
break;
-
+ }
case NTLMSTATE_TYPE3:
/* connection is already authenticated,
* don't send a header in future requests */
@@ -486,4 +485,10 @@ CURLcode Curl_output_ntlm_wb(struct connectdata *conn,
return CURLE_OK;
}
+void Curl_http_auth_cleanup_ntlm_wb(struct connectdata *conn)
+{
+ ntlm_wb_cleanup(&conn->ntlm);
+ ntlm_wb_cleanup(&conn->proxyntlm);
+}
+
#endif /* !CURL_DISABLE_HTTP && USE_NTLM && NTLM_WB_ENABLED */
diff --git a/lib/curl_path.c b/lib/curl_path.c
index f42963463..7b3fb27ab 100644
--- a/lib/curl_path.c
+++ b/lib/curl_path.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,7 +42,7 @@ CURLcode Curl_getworkingpath(struct connectdata *conn,
size_t working_path_len;
CURLcode result =
Curl_urldecode(data, data->state.up.path, 0, &working_path,
- &working_path_len, FALSE);
+ &working_path_len, REJECT_ZERO);
if(result)
return result;
@@ -168,7 +168,7 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir)
*cpp = cp + i + strspn(cp + i, WHITESPACE);
}
else {
- /* Read to end of filename - either to white space or terminator */
+ /* Read to end of filename - either to whitespace or terminator */
end = strpbrk(cp, WHITESPACE);
if(end == NULL)
end = strchr(cp, '\0');
@@ -184,7 +184,7 @@ CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir)
(*path)[pathLength] = '\0';
cp += 3;
}
- /* Copy path name up until first "white space" */
+ /* Copy path name up until first "whitespace" */
memcpy(&(*path)[pathLength], cp, (int)(end - cp));
pathLength += (int)(end - cp);
(*path)[pathLength] = '\0';
diff --git a/lib/curl_printf.h b/lib/curl_printf.h
index 0d37b8e57..9d2de7ba8 100644
--- a/lib/curl_printf.h
+++ b/lib/curl_printf.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c
index df8f2b1d9..32f11130a 100644
--- a/lib/curl_rtmp.c
+++ b/lib/curl_rtmp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
*
* This software is licensed as described in the file COPYING, which
@@ -79,6 +79,7 @@ const struct Curl_handler Curl_handler_rtmp = {
ZERO_NULL, /* connection_check */
PORT_RTMP, /* defport */
CURLPROTO_RTMP, /* protocol */
+ CURLPROTO_RTMP, /* family */
PROTOPT_NONE /* flags*/
};
@@ -100,6 +101,7 @@ const struct Curl_handler Curl_handler_rtmpt = {
ZERO_NULL, /* connection_check */
PORT_RTMPT, /* defport */
CURLPROTO_RTMPT, /* protocol */
+ CURLPROTO_RTMPT, /* family */
PROTOPT_NONE /* flags*/
};
@@ -121,6 +123,7 @@ const struct Curl_handler Curl_handler_rtmpe = {
ZERO_NULL, /* connection_check */
PORT_RTMP, /* defport */
CURLPROTO_RTMPE, /* protocol */
+ CURLPROTO_RTMPE, /* family */
PROTOPT_NONE /* flags*/
};
@@ -142,6 +145,7 @@ const struct Curl_handler Curl_handler_rtmpte = {
ZERO_NULL, /* connection_check */
PORT_RTMPT, /* defport */
CURLPROTO_RTMPTE, /* protocol */
+ CURLPROTO_RTMPTE, /* family */
PROTOPT_NONE /* flags*/
};
@@ -163,6 +167,7 @@ const struct Curl_handler Curl_handler_rtmps = {
ZERO_NULL, /* connection_check */
PORT_RTMPS, /* defport */
CURLPROTO_RTMPS, /* protocol */
+ CURLPROTO_RTMP, /* family */
PROTOPT_NONE /* flags*/
};
@@ -184,6 +189,7 @@ const struct Curl_handler Curl_handler_rtmpts = {
ZERO_NULL, /* connection_check */
PORT_RTMPS, /* defport */
CURLPROTO_RTMPTS, /* protocol */
+ CURLPROTO_RTMPT, /* family */
PROTOPT_NONE /* flags*/
};
diff --git a/lib/curl_rtmp.h b/lib/curl_rtmp.h
index 3306e2200..86a01382d 100644
--- a/lib/curl_rtmp.h
+++ b/lib/curl_rtmp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
+ * Copyright (C) 2010 - 2019, Howard Chu, <hyc@highlandsun.com>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_sasl.c b/lib/curl_sasl.c
index 0aa1f5bb7..83fe896e3 100644
--- a/lib/curl_sasl.c
+++ b/lib/curl_sasl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -264,14 +264,20 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
size_t len = 0;
saslstate state1 = SASL_STOP;
saslstate state2 = SASL_FINAL;
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+#else
+ const char * const hostname = conn->host.name;
+ const long int port = conn->remote_port;
+#endif
#if defined(USE_KERBEROS5) || defined(USE_NTLM)
const char *service = data->set.str[STRING_SERVICE_NAME] ?
data->set.str[STRING_SERVICE_NAME] :
sasl->params->service;
#endif
+ const char *oauth_bearer = data->set.str[STRING_BEARER];
sasl->force_ir = force_ir; /* Latch for future use */
sasl->authused = 0; /* No mechanism used yet */
@@ -341,7 +347,7 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
}
else
#endif
- if((enabledmechs & SASL_MECH_OAUTHBEARER) && conn->oauth_bearer) {
+ if((enabledmechs & SASL_MECH_OAUTHBEARER) && oauth_bearer) {
mech = SASL_MECH_STRING_OAUTHBEARER;
state1 = SASL_OAUTH2;
state2 = SASL_OAUTH2_RESP;
@@ -351,17 +357,17 @@ CURLcode Curl_sasl_start(struct SASL *sasl, struct connectdata *conn,
result = Curl_auth_create_oauth_bearer_message(data, conn->user,
hostname,
port,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
}
- else if((enabledmechs & SASL_MECH_XOAUTH2) && conn->oauth_bearer) {
+ else if((enabledmechs & SASL_MECH_XOAUTH2) && oauth_bearer) {
mech = SASL_MECH_STRING_XOAUTH2;
state1 = SASL_OAUTH2;
sasl->authused = SASL_MECH_XOAUTH2;
if(force_ir || data->set.sasl_ir)
result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
}
else if(enabledmechs & SASL_MECH_PLAIN) {
@@ -416,21 +422,27 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
struct Curl_easy *data = conn->data;
saslstate newstate = SASL_FINAL;
char *resp = NULL;
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+#else
+ const char * const hostname = conn->host.name;
+ const long int port = conn->remote_port;
+#endif
#if !defined(CURL_DISABLE_CRYPTO_AUTH)
char *chlg = NULL;
size_t chlglen = 0;
#endif
-#if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \
- defined(USE_NTLM)
+#if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \
+ defined(USE_NTLM)
const char *service = data->set.str[STRING_SERVICE_NAME] ?
- data->set.str[STRING_SERVICE_NAME] :
- sasl->params->service;
+ data->set.str[STRING_SERVICE_NAME] :
+ sasl->params->service;
char *serverdata;
#endif
size_t len = 0;
+ const char *oauth_bearer = data->set.str[STRING_BEARER];
*progress = SASL_INPROGRESS;
@@ -558,7 +570,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
result = Curl_auth_create_oauth_bearer_message(data, conn->user,
hostname,
port,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
/* Failures maybe sent by the server as continuations for OAUTHBEARER */
@@ -566,7 +578,7 @@ CURLcode Curl_sasl_continue(struct SASL *sasl, struct connectdata *conn,
}
else
result = Curl_auth_create_xoauth_bearer_message(data, conn->user,
- conn->oauth_bearer,
+ oauth_bearer,
&resp, &len);
break;
diff --git a/lib/curl_setup.h b/lib/curl_setup.h
index 13af8cdec..3872dbb65 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,11 +27,18 @@
#endif
/*
+ * Disable Visual Studio warnings:
+ * 4127 "conditional expression is constant"
+ */
+#ifdef _MSC_VER
+#pragma warning(disable:4127)
+#endif
+
+/*
* Define WIN32 when build target is Win32 API
*/
-#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \
- !defined(__SYMBIAN32__)
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
#define WIN32
#endif
@@ -80,10 +87,6 @@
# include "config-amigaos.h"
#endif
-#ifdef __SYMBIAN32__
-# include "config-symbian.h"
-#endif
-
#ifdef __OS400__
# include "config-os400.h"
#endif
@@ -223,64 +226,20 @@
#endif
/*
- * Use getaddrinfo to resolve the IPv4 address literal. If the current network
- * interface doesn't support IPv4, but supports IPv6, NAT64, and DNS64,
- * performing this task will result in a synthesized IPv6 address.
- */
-#ifdef __APPLE__
-#define USE_RESOLVE_ON_IPS 1
-#endif
-
-/*
- * Include header files for windows builds before redefining anything.
- * Use this preprocessor block only to include or exclude windows.h,
- * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs
- * to any other further and independent block. Under Cygwin things work
- * just as under linux (e.g. <sys/socket.h>) and the winsock headers should
- * never be included when __CYGWIN__ is defined. configure script takes
- * care of this, not defining HAVE_WINDOWS_H, HAVE_WINSOCK_H, HAVE_WINSOCK2_H,
- * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined.
+ * Windows setup file includes some system headers.
*/
#ifdef HAVE_WINDOWS_H
-# if defined(UNICODE) && !defined(_UNICODE)
-# define _UNICODE
-# endif
-# if defined(_UNICODE) && !defined(UNICODE)
-# define UNICODE
-# endif
-# include <winerror.h>
-# include <windows.h>
-# ifdef HAVE_WINSOCK2_H
-# include <winsock2.h>
-# ifdef HAVE_WS2TCPIP_H
-# include <ws2tcpip.h>
-# endif
-# else
-# ifdef HAVE_WINSOCK_H
-# include <winsock.h>
-# endif
-# endif
-# include <tchar.h>
-# ifdef UNICODE
- typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str);
-# endif
+# include "setup-win32.h"
#endif
/*
- * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else
- * define USE_WINSOCK to 1 if we have and use WINSOCK API, else
- * undefine USE_WINSOCK.
+ * Use getaddrinfo to resolve the IPv4 address literal. If the current network
+ * interface doesn't support IPv4, but supports IPv6, NAT64, and DNS64,
+ * performing this task will result in a synthesized IPv6 address.
*/
-
-#undef USE_WINSOCK
-
-#ifdef HAVE_WINSOCK2_H
-# define USE_WINSOCK 2
-#else
-# ifdef HAVE_WINSOCK_H
-# define USE_WINSOCK 1
-# endif
+#ifdef __APPLE__
+#define USE_RESOLVE_ON_IPS 1
#endif
#ifdef USE_LWIPSOCK
@@ -367,9 +326,14 @@
# undef fstat
# define fstat(fdes,stp) _fstati64(fdes, stp)
# undef stat
-# define stat(fname,stp) _stati64(fname, stp)
+# define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stati64
# define LSEEK_ERROR (__int64)-1
+# define fopen(fname,mode) curlx_win32_fopen(fname, mode)
+# define access(fname,mode) curlx_win32_access(fname, mode)
+ int curlx_win32_stat(const char *path, struct_stat *buffer);
+ FILE *curlx_win32_fopen(const char *filename, const char *mode);
+ int curlx_win32_access(const char *path, int mode);
#endif
/*
@@ -384,8 +348,13 @@
# undef lseek
# define lseek(fdes,offset,whence) _lseek(fdes, (long)offset, whence)
# define fstat(fdes,stp) _fstat(fdes, stp)
-# define stat(fname,stp) _stat(fname, stp)
+# define stat(fname,stp) curlx_win32_stat(fname, stp)
# define struct_stat struct _stat
+# define fopen(fname,mode) curlx_win32_fopen(fname, mode)
+# define access(fname,mode) curlx_win32_access(fname, mode)
+ int curlx_win32_stat(const char *path, struct_stat *buffer);
+ FILE *curlx_win32_fopen(const char *filename, const char *mode);
+ int curlx_win32_access(const char *path, int mode);
# endif
# define LSEEK_ERROR (long)-1
#endif
@@ -563,6 +532,12 @@
* Mutually exclusive CURLRES_* definitions.
*/
+#if defined(ENABLE_IPV6) && defined(HAVE_GETADDRINFO)
+# define CURLRES_IPV6
+#else
+# define CURLRES_IPV4
+#endif
+
#ifdef USE_ARES
# define CURLRES_ASYNCH
# define CURLRES_ARES
@@ -577,23 +552,9 @@
# define CURLRES_SYNCH
#endif
-#ifdef ENABLE_IPV6
-# define CURLRES_IPV6
-#else
-# define CURLRES_IPV4
-#endif
-
/* ---------------------------------------------------------------- */
/*
- * When using WINSOCK, TELNET protocol requires WINSOCK2 API.
- */
-
-#if defined(USE_WINSOCK) && (USE_WINSOCK != 2)
-# define CURL_DISABLE_TELNET 1
-#endif
-
-/*
* msvc 6.0 does not have struct sockaddr_storage and
* does not define IPPROTO_ESP in winsock2.h. But both
* are available if PSDK is properly installed.
@@ -644,7 +605,8 @@ int netware_init(void);
#if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_NSS) || \
defined(USE_MBEDTLS) || \
defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \
- defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK)
+ defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK) || \
+ defined(USE_BEARSSL)
#define USE_SSL /* SSL support has been enabled */
#endif
@@ -662,12 +624,12 @@ int netware_init(void);
/* Single point where USE_NTLM definition might be defined */
#if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH)
-#if defined(USE_OPENSSL) || defined(USE_WINDOWS_SSPI) || \
- defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \
- defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
- defined(USE_MBEDTLS)
+#if defined(USE_OPENSSL) || defined(USE_MBEDTLS) || \
+ defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \
+ defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
+ (defined(USE_WOLFSSL) && defined(HAVE_WOLFSSL_DES_ECB_ENCRYPT))
-#define USE_NTLM
+#define USE_CURL_NTLM_CORE
# if defined(USE_MBEDTLS)
/* Get definition of MBEDTLS_MD4_C */
@@ -675,6 +637,10 @@ int netware_init(void);
# endif
#endif
+
+#if defined(USE_CURL_NTLM_CORE) || defined(USE_WINDOWS_SSPI)
+#define USE_NTLM
+#endif
#endif
#ifdef CURL_WANTS_CA_BUNDLE_ENV
@@ -713,7 +679,7 @@ int netware_init(void);
*/
#ifndef Curl_nop_stmt
-# define Curl_nop_stmt do { } WHILE_FALSE
+# define Curl_nop_stmt do { } while(0)
#endif
/*
@@ -726,7 +692,7 @@ int netware_init(void);
defined(HAVE_WINSOCK_H) || \
defined(HAVE_WINSOCK2_H) || \
defined(HAVE_WS2TCPIP_H)
-# error "Winsock and lwIP TCP/IP stack definitions shall not coexist!"
+# error "WinSock and lwIP TCP/IP stack definitions shall not coexist!"
# endif
#endif
diff --git a/lib/curl_setup_once.h b/lib/curl_setup_once.h
index 413ccea91..e7c00deab 100644
--- a/lib/curl_setup_once.h
+++ b/lib/curl_setup_once.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -330,27 +330,6 @@ struct timeval {
#include "curl_ctype.h"
/*
- * Macro WHILE_FALSE may be used to build single-iteration do-while loops,
- * avoiding compiler warnings. Mostly intended for other macro definitions.
- */
-
-#define WHILE_FALSE while(0)
-
-#if defined(_MSC_VER) && !defined(__POCC__)
-# undef WHILE_FALSE
-# if (_MSC_VER < 1500)
-# define WHILE_FALSE while(1, 0)
-# else
-# define WHILE_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-while(0) \
-__pragma(warning(pop))
-# endif
-#endif
-
-
-/*
* Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
*/
@@ -387,7 +366,7 @@ typedef int sig_atomic_t;
#ifdef DEBUGBUILD
#define DEBUGF(x) x
#else
-#define DEBUGF(x) do { } WHILE_FALSE
+#define DEBUGF(x) do { } while(0)
#endif
@@ -395,10 +374,11 @@ typedef int sig_atomic_t;
* Macro used to include assertion code only in debug builds.
*/
+#undef DEBUGASSERT
#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
#define DEBUGASSERT(x) assert(x)
#else
-#define DEBUGASSERT(x) do { } WHILE_FALSE
+#define DEBUGASSERT(x) do { } while(0)
#endif
@@ -501,6 +481,8 @@ typedef int sig_atomic_t;
#ifdef __VMS
#define argv_item_t __char_ptr32
+#elif defined(_UNICODE)
+#define argv_item_t wchar_t *
#else
#define argv_item_t char *
#endif
diff --git a/lib/curl_sha256.h b/lib/curl_sha256.h
index 6db4b04db..35d286ceb 100644
--- a/lib/curl_sha256.h
+++ b/lib/curl_sha256.h
@@ -7,7 +7,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2017, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,8 +25,10 @@
#ifndef CURL_DISABLE_CRYPTO_AUTH
-void Curl_sha256it(unsigned char *outbuffer,
- const unsigned char *input);
+#define SHA256_DIGEST_LENGTH 32
+
+void Curl_sha256it(unsigned char *outbuffer, const unsigned char *input,
+ const size_t len);
#endif
diff --git a/lib/curl_sspi.c b/lib/curl_sspi.c
index 1d0de4ed3..512ce2411 100644
--- a/lib/curl_sspi.c
+++ b/lib/curl_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
#include "curl_sspi.h"
#include "curl_multibyte.h"
#include "system_win32.h"
+#include "version_win32.h"
#include "warnless.h"
/* The last #include files should be: */
@@ -82,7 +83,7 @@ CURLcode Curl_sspi_global_init(void)
* have both these DLLs (security.dll forwards calls to secur32.dll) */
/* Load SSPI dll into the address space of the calling process */
- if(Curl_verify_windows_version(4, 0, PLATFORM_WINNT, VERSION_EQUAL))
+ if(curlx_verify_windows_version(4, 0, PLATFORM_WINNT, VERSION_EQUAL))
s_hSecDll = Curl_load_library(TEXT("security.dll"));
else
s_hSecDll = Curl_load_library(TEXT("secur32.dll"));
@@ -151,7 +152,7 @@ CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp,
/* Initialize the identity */
memset(identity, 0, sizeof(*identity));
- useranddomain.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)userp);
+ useranddomain.tchar_ptr = curlx_convert_UTF8_to_tchar((char *)userp);
if(!useranddomain.tchar_ptr)
return CURLE_OUT_OF_MEMORY;
@@ -173,7 +174,7 @@ CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp,
/* Setup the identity's user and length */
dup_user.tchar_ptr = _tcsdup(user.tchar_ptr);
if(!dup_user.tchar_ptr) {
- Curl_unicodefree(useranddomain.tchar_ptr);
+ curlx_unicodefree(useranddomain.tchar_ptr);
return CURLE_OUT_OF_MEMORY;
}
identity->User = dup_user.tbyte_ptr;
@@ -183,7 +184,7 @@ CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp,
/* Setup the identity's domain and length */
dup_domain.tchar_ptr = malloc(sizeof(TCHAR) * (domlen + 1));
if(!dup_domain.tchar_ptr) {
- Curl_unicodefree(useranddomain.tchar_ptr);
+ curlx_unicodefree(useranddomain.tchar_ptr);
return CURLE_OUT_OF_MEMORY;
}
_tcsncpy(dup_domain.tchar_ptr, domain.tchar_ptr, domlen);
@@ -192,22 +193,22 @@ CURLcode Curl_create_sspi_identity(const char *userp, const char *passwdp,
identity->DomainLength = curlx_uztoul(domlen);
dup_domain.tchar_ptr = NULL;
- Curl_unicodefree(useranddomain.tchar_ptr);
+ curlx_unicodefree(useranddomain.tchar_ptr);
/* Setup the identity's password and length */
- passwd.tchar_ptr = Curl_convert_UTF8_to_tchar((char *)passwdp);
+ passwd.tchar_ptr = curlx_convert_UTF8_to_tchar((char *)passwdp);
if(!passwd.tchar_ptr)
return CURLE_OUT_OF_MEMORY;
dup_passwd.tchar_ptr = _tcsdup(passwd.tchar_ptr);
if(!dup_passwd.tchar_ptr) {
- Curl_unicodefree(passwd.tchar_ptr);
+ curlx_unicodefree(passwd.tchar_ptr);
return CURLE_OUT_OF_MEMORY;
}
identity->Password = dup_passwd.tbyte_ptr;
identity->PasswordLength = curlx_uztoul(_tcslen(dup_passwd.tchar_ptr));
dup_passwd.tchar_ptr = NULL;
- Curl_unicodefree(passwd.tchar_ptr);
+ curlx_unicodefree(passwd.tchar_ptr);
/* Setup the identity's flags */
identity->Flags = SECFLAG_WINNT_AUTH_IDENTITY;
diff --git a/lib/curl_sspi.h b/lib/curl_sspi.h
index 2bbf9477b..c09026ebb 100644
--- a/lib/curl_sspi.h
+++ b/lib/curl_sspi.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curl_threads.c b/lib/curl_threads.c
index 8e5937aa0..6f3815e71 100644
--- a/lib/curl_threads.c
+++ b/lib/curl_threads.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -41,14 +41,14 @@
#if defined(USE_THREADS_POSIX)
-struct curl_actual_call {
+struct Curl_actual_call {
unsigned int (*func)(void *);
void *arg;
};
static void *curl_thread_create_thunk(void *arg)
{
- struct curl_actual_call * ac = arg;
+ struct Curl_actual_call *ac = arg;
unsigned int (*func)(void *) = ac->func;
void *real_arg = ac->arg;
@@ -62,7 +62,7 @@ static void *curl_thread_create_thunk(void *arg)
curl_thread_t Curl_thread_create(unsigned int (*func) (void *), void *arg)
{
curl_thread_t t = malloc(sizeof(pthread_t));
- struct curl_actual_call *ac = malloc(sizeof(struct curl_actual_call));
+ struct Curl_actual_call *ac = malloc(sizeof(struct Curl_actual_call));
if(!(ac && t))
goto err;
diff --git a/lib/curl_threads.h b/lib/curl_threads.h
index 2a93644c5..65d1a790c 100644
--- a/lib/curl_threads.h
+++ b/lib/curl_threads.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/curlx.h b/lib/curlx.h
index 3e9b516f8..98e51bf56 100644
--- a/lib/curlx.h
+++ b/lib/curlx.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -53,6 +53,19 @@
curlx_uztosi()
*/
+#include "curl_multibyte.h"
+/* "curl_multibyte.h" provides these functions and macros:
+
+ curlx_convert_UTF8_to_wchar()
+ curlx_convert_wchar_to_UTF8()
+ curlx_convert_UTF8_to_tchar()
+ curlx_convert_tchar_to_UTF8()
+ curlx_unicodefree()
+*/
+
+#include "version_win32.h"
+/* "version_win32.h" provides curlx_verify_windows_version() */
+
/* Now setup curlx_ * names for the functions that are to become curlx_ and
be removed from a future libcurl official API:
curlx_getenv
diff --git a/lib/dict.c b/lib/dict.c
index 208a2336f..8dd4a90f7 100644
--- a/lib/dict.c
+++ b/lib/dict.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,6 +46,8 @@
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#include "urldata.h"
@@ -55,6 +57,7 @@
#include "escape.h"
#include "progress.h"
#include "dict.h"
+#include "curl_printf.h"
#include "strcase.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -88,7 +91,8 @@ const struct Curl_handler Curl_handler_dict = {
ZERO_NULL, /* connection_check */
PORT_DICT, /* defport */
CURLPROTO_DICT, /* protocol */
- PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
+ CURLPROTO_DICT, /* family */
+ PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
};
static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
@@ -97,7 +101,8 @@ static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
char *dictp;
size_t len;
- CURLcode result = Curl_urldecode(data, inputbuff, 0, &newp, &len, FALSE);
+ CURLcode result = Curl_urldecode(data, inputbuff, 0, &newp, &len,
+ REJECT_NADA);
if(!newp || result)
return NULL;
@@ -123,6 +128,52 @@ static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
return dictp;
}
+/* sendf() sends formatted data to the server */
+static CURLcode sendf(curl_socket_t sockfd, struct connectdata *conn,
+ const char *fmt, ...)
+{
+ struct Curl_easy *data = conn->data;
+ ssize_t bytes_written;
+ size_t write_len;
+ CURLcode result = CURLE_OK;
+ char *s;
+ char *sptr;
+ va_list ap;
+ va_start(ap, fmt);
+ s = vaprintf(fmt, ap); /* returns an allocated string */
+ va_end(ap);
+ if(!s)
+ return CURLE_OUT_OF_MEMORY; /* failure */
+
+ bytes_written = 0;
+ write_len = strlen(s);
+ sptr = s;
+
+ for(;;) {
+ /* Write the buffer to the socket */
+ result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written);
+
+ if(result)
+ break;
+
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written);
+
+ if((size_t)bytes_written != write_len) {
+ /* if not all was written at once, we must advance the pointer, decrease
+ the size left and try again! */
+ write_len -= bytes_written;
+ sptr += bytes_written;
+ }
+ else
+ break;
+ }
+
+ free(s); /* free the output string */
+
+ return result;
+}
+
static CURLcode dict_do(struct connectdata *conn, bool *done)
{
char *word;
@@ -180,18 +231,16 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(!eword)
return CURLE_OUT_OF_MEMORY;
- result = Curl_sendf(sockfd, conn,
- "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
- "MATCH "
- "%s " /* database */
- "%s " /* strategy */
- "%s\r\n" /* word */
- "QUIT\r\n",
-
- database,
- strategy,
- eword
- );
+ result = sendf(sockfd, conn,
+ "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
+ "MATCH "
+ "%s " /* database */
+ "%s " /* strategy */
+ "%s\r\n" /* word */
+ "QUIT\r\n",
+ database,
+ strategy,
+ eword);
free(eword);
@@ -230,14 +279,14 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(!eword)
return CURLE_OUT_OF_MEMORY;
- result = Curl_sendf(sockfd, conn,
- "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
- "DEFINE "
- "%s " /* database */
- "%s\r\n" /* word */
- "QUIT\r\n",
- database,
- eword);
+ result = sendf(sockfd, conn,
+ "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
+ "DEFINE "
+ "%s " /* database */
+ "%s\r\n" /* word */
+ "QUIT\r\n",
+ database,
+ eword);
free(eword);
@@ -258,10 +307,10 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
if(ppath[i] == ':')
ppath[i] = ' ';
}
- result = Curl_sendf(sockfd, conn,
- "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
- "%s\r\n"
- "QUIT\r\n", ppath);
+ result = sendf(sockfd, conn,
+ "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
+ "%s\r\n"
+ "QUIT\r\n", ppath);
if(result) {
failf(data, "Failed sending DICT request");
return result;
diff --git a/lib/dict.h b/lib/dict.h
index 12c0f3394..38a55ac0d 100644
--- a/lib/dict.h
+++ b/lib/dict.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/doh.c b/lib/doh.c
index d1795789e..e8b080110 100644
--- a/lib/doh.c
+++ b/lib/doh.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,13 +35,13 @@
#include "curl_base64.h"
#include "connect.h"
#include "strdup.h"
+#include "dynbuf.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
#define DNS_CLASS_IN 0x01
-#define DOH_MAX_RESPONSE_SIZE 3000 /* bytes */
#ifndef CURL_DISABLE_VERBOSE_STRINGS
static const char * const errors[]={
@@ -57,12 +57,13 @@ static const char * const errors[]={
"Unexpected TYPE",
"Unexpected CLASS",
"No content",
- "Bad ID"
+ "Bad ID",
+ "Name too long"
};
static const char *doh_strerror(DOHcode code)
{
- if((code >= DOH_OK) && (code <= DOH_DNS_BAD_ID))
+ if((code >= DOH_OK) && (code <= DOH_DNS_NAME_TOO_LONG))
return errors[code];
return "bad error code";
}
@@ -86,12 +87,36 @@ UNITTEST DOHcode doh_encode(const char *host,
unsigned char *orig = dnsp;
const char *hostp = host;
- /* The expected output length does not depend on the number of dots within
- * the host name. It will always be two more than the length of the host
- * name, one for the size and one trailing null. In case there are dots,
- * each dot adds one size but removes the need to store the dot, net zero.
+ /* The expected output length is 16 bytes more than the length of
+ * the QNAME-encoding of the host name.
+ *
+ * A valid DNS name may not contain a zero-length label, except at
+ * the end. For this reason, a name beginning with a dot, or
+ * containing a sequence of two or more consecutive dots, is invalid
+ * and cannot be encoded as a QNAME.
+ *
+ * If the host name ends with a trailing dot, the corresponding
+ * QNAME-encoding is one byte longer than the host name. If (as is
+ * also valid) the hostname is shortened by the omission of the
+ * trailing dot, then its QNAME-encoding will be two bytes longer
+ * than the host name.
+ *
+ * Each [ label, dot ] pair is encoded as [ length, label ],
+ * preserving overall length. A final [ label ] without a dot is
+ * also encoded as [ length, label ], increasing overall length
+ * by one. The encoding is completed by appending a zero byte,
+ * representing the zero-length root label, again increasing
+ * the overall length by one.
*/
- const size_t expected_len = 12 + ( 1 + hostlen + 1) + 4;
+
+ size_t expected_len;
+ DEBUGASSERT(hostlen);
+ expected_len = 12 + 1 + hostlen + 4;
+ if(host[hostlen-1]!='.')
+ expected_len++;
+
+ if(expected_len > (256 + 16)) /* RFCs 1034, 1035 */
+ return DOH_DNS_NAME_TOO_LONG;
if(len < expected_len)
return DOH_TOO_SMALL_BUFFER;
@@ -109,31 +134,30 @@ UNITTEST DOHcode doh_encode(const char *host,
*dnsp++ = '\0';
*dnsp++ = '\0'; /* ARCOUNT */
- /* store a QNAME */
- do {
- char *dot = strchr(hostp, '.');
+ /* encode each label and store it in the QNAME */
+ while(*hostp) {
size_t labellen;
- bool found = false;
- if(dot) {
- found = true;
+ char *dot = strchr(hostp, '.');
+ if(dot)
labellen = dot - hostp;
- }
else
labellen = strlen(hostp);
- if(labellen > 63) {
- /* too long label, error out */
+ if((labellen > 63) || (!labellen)) {
+ /* label is too long or too short, error out */
*olen = 0;
return DOH_DNS_BAD_LABEL;
}
+ /* label is non-empty, process it */
*dnsp++ = (unsigned char)labellen;
memcpy(dnsp, hostp, labellen);
dnsp += labellen;
- hostp += labellen + 1;
- if(!found) {
- *dnsp++ = 0; /* terminating zero */
- break;
- }
- } while(1);
+ hostp += labellen;
+ /* advance past dot, but only if there is one */
+ if(dot)
+ hostp++;
+ } /* next label */
+
+ *dnsp++ = 0; /* append zero-length label for root */
/* There are assigned TYPE codes beyond 255: use range [1..65535] */
*dnsp++ = (unsigned char)(255 & (dnstype>>8)); /* upper 8 bit TYPE */
@@ -144,30 +168,21 @@ UNITTEST DOHcode doh_encode(const char *host,
*olen = dnsp - orig;
- /* verify that our assumption of length is valid, since
- * this has lead to buffer overflows in this function */
+ /* verify that our estimation of length is valid, since
+ * this has led to buffer overflows in this function */
DEBUGASSERT(*olen == expected_len);
return DOH_OK;
}
static size_t
-doh_write_cb(void *contents, size_t size, size_t nmemb, void *userp)
+doh_write_cb(const void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
- struct dohresponse *mem = (struct dohresponse *)userp;
+ struct dynbuf *mem = (struct dynbuf *)userp;
- if((mem->size + realsize) > DOH_MAX_RESPONSE_SIZE)
- /* suspiciously much for us */
+ if(Curl_dyn_addn(mem, contents, realsize))
return 0;
- mem->memory = Curl_saferealloc(mem->memory, mem->size + realsize);
- if(!mem->memory)
- /* out of memory! */
- return 0;
-
- memcpy(&(mem->memory[mem->size]), contents, realsize);
- mem->size += realsize;
-
return realsize;
}
@@ -195,7 +210,7 @@ do { \
result = curl_easy_setopt(doh, x, y); \
if(result) \
goto error; \
-} WHILE_FALSE
+} while(0)
static CURLcode dohprobe(struct Curl_easy *data,
struct dnsprobe *p, DNStype dnstype,
@@ -215,10 +230,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
}
p->dnstype = dnstype;
- p->serverdoh.memory = NULL;
- /* the memory will be grown as needed by realloc in the doh_write_cb
- function */
- p->serverdoh.size = 0;
+ Curl_dyn_init(&p->serverdoh, DYN_DOH_RESPONSE);
/* Note: this is code for sending the DoH request with GET but there's still
no logic that actually enables this. We should either add that ability or
@@ -249,7 +261,7 @@ static CURLcode dohprobe(struct Curl_easy *data,
if(!result) {
/* pass in the struct pointer via a local variable to please coverity and
the gcc typecheck helpers */
- struct dohresponse *resp = &p->serverdoh;
+ struct dynbuf *resp = &p->serverdoh;
ERROR_CHECK_SETOPT(CURLOPT_URL, url);
ERROR_CHECK_SETOPT(CURLOPT_WRITEFUNCTION, doh_write_cb);
ERROR_CHECK_SETOPT(CURLOPT_WRITEDATA, resp);
@@ -280,38 +292,45 @@ static CURLcode dohprobe(struct Curl_easy *data,
ERROR_CHECK_SETOPT(CURLOPT_SSL_FALSESTART, 1L);
if(data->set.ssl.primary.verifyhost)
ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYHOST, 2L);
+#ifndef CURL_DISABLE_PROXY
if(data->set.proxy_ssl.primary.verifyhost)
ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_VERIFYHOST, 2L);
- if(data->set.ssl.primary.verifypeer)
- ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYPEER, 1L);
if(data->set.proxy_ssl.primary.verifypeer)
ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_VERIFYPEER, 1L);
+ if(data->set.str[STRING_SSL_CAFILE_PROXY]) {
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAINFO,
+ data->set.str[STRING_SSL_CAFILE_PROXY]);
+ }
+ if(data->set.str[STRING_SSL_CRLFILE_PROXY]) {
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_CRLFILE,
+ data->set.str[STRING_SSL_CRLFILE_PROXY]);
+ }
+ if(data->set.proxy_ssl.no_revoke)
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
+ else if(data->set.proxy_ssl.revoke_best_effort)
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_OPTIONS,
+ CURLSSLOPT_REVOKE_BEST_EFFORT);
+ if(data->set.str[STRING_SSL_CAPATH_PROXY]) {
+ ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAPATH,
+ data->set.str[STRING_SSL_CAPATH_PROXY]);
+ }
+#endif
+ if(data->set.ssl.primary.verifypeer)
+ ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYPEER, 1L);
if(data->set.ssl.primary.verifystatus)
ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYSTATUS, 1L);
if(data->set.str[STRING_SSL_CAFILE_ORIG]) {
ERROR_CHECK_SETOPT(CURLOPT_CAINFO,
data->set.str[STRING_SSL_CAFILE_ORIG]);
}
- if(data->set.str[STRING_SSL_CAFILE_PROXY]) {
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAINFO,
- data->set.str[STRING_SSL_CAFILE_PROXY]);
- }
if(data->set.str[STRING_SSL_CAPATH_ORIG]) {
ERROR_CHECK_SETOPT(CURLOPT_CAPATH,
data->set.str[STRING_SSL_CAPATH_ORIG]);
}
- if(data->set.str[STRING_SSL_CAPATH_PROXY]) {
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_CAPATH,
- data->set.str[STRING_SSL_CAPATH_PROXY]);
- }
if(data->set.str[STRING_SSL_CRLFILE_ORIG]) {
ERROR_CHECK_SETOPT(CURLOPT_CRLFILE,
data->set.str[STRING_SSL_CRLFILE_ORIG]);
}
- if(data->set.str[STRING_SSL_CRLFILE_PROXY]) {
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_CRLFILE,
- data->set.str[STRING_SSL_CRLFILE_PROXY]);
- }
if(data->set.ssl.certinfo)
ERROR_CHECK_SETOPT(CURLOPT_CERTINFO, 1L);
if(data->set.str[STRING_SSL_RANDOM_FILE]) {
@@ -324,12 +343,16 @@ static CURLcode dohprobe(struct Curl_easy *data,
}
if(data->set.ssl.no_revoke)
ERROR_CHECK_SETOPT(CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
- if(data->set.proxy_ssl.no_revoke)
- ERROR_CHECK_SETOPT(CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
+ else if(data->set.ssl.revoke_best_effort)
+ ERROR_CHECK_SETOPT(CURLOPT_SSL_OPTIONS, CURLSSLOPT_REVOKE_BEST_EFFORT);
if(data->set.ssl.fsslctx)
ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_FUNCTION, data->set.ssl.fsslctx);
if(data->set.ssl.fsslctxp)
ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_DATA, data->set.ssl.fsslctxp);
+ if(data->set.str[STRING_SSL_EC_CURVES]) {
+ ERROR_CHECK_SETOPT(CURLOPT_SSL_EC_CURVES,
+ data->set.str[STRING_SSL_EC_CURVES]);
+ }
doh->set.fmultidone = Curl_doh_done;
doh->set.dohfor = data; /* identify for which transfer this is done */
@@ -355,13 +378,14 @@ static CURLcode dohprobe(struct Curl_easy *data,
* 'Curl_addrinfo *' with the address information.
*/
-Curl_addrinfo *Curl_doh(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_doh(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
struct Curl_easy *data = conn->data;
CURLcode result = CURLE_OK;
+ int slot;
*waitp = TRUE; /* this never returns synchronously */
(void)conn;
(void)hostname;
@@ -370,6 +394,7 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
/* start clean, consider allocating this struct on demand */
memset(&data->req.doh, 0, sizeof(struct dohdata));
+ conn->bits.doh = TRUE;
data->req.doh.host = hostname;
data->req.doh.port = port;
data->req.doh.headers =
@@ -380,8 +405,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
if(conn->ip_version != CURL_IPRESOLVE_V6) {
/* create IPv4 DOH request */
- result = dohprobe(data, &data->req.doh.probe[0], DNS_TYPE_A,
- hostname, data->set.str[STRING_DOH],
+ result = dohprobe(data, &data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V4],
+ DNS_TYPE_A, hostname, data->set.str[STRING_DOH],
data->multi, data->req.doh.headers);
if(result)
goto error;
@@ -390,8 +415,8 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
if(conn->ip_version != CURL_IPRESOLVE_V4) {
/* create IPv6 DOH request */
- result = dohprobe(data, &data->req.doh.probe[1], DNS_TYPE_AAAA,
- hostname, data->set.str[STRING_DOH],
+ result = dohprobe(data, &data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V6],
+ DNS_TYPE_AAAA, hostname, data->set.str[STRING_DOH],
data->multi, data->req.doh.headers);
if(result)
goto error;
@@ -402,12 +427,13 @@ Curl_addrinfo *Curl_doh(struct connectdata *conn,
error:
curl_slist_free_all(data->req.doh.headers);
data->req.doh.headers = NULL;
- Curl_close(&data->req.doh.probe[0].easy);
- Curl_close(&data->req.doh.probe[1].easy);
+ for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+ Curl_close(&data->req.doh.probe[slot].easy);
+ }
return NULL;
}
-static DOHcode skipqname(unsigned char *doh, size_t dohlen,
+static DOHcode skipqname(const unsigned char *doh, size_t dohlen,
unsigned int *indexp)
{
unsigned char length;
@@ -431,12 +457,12 @@ static DOHcode skipqname(unsigned char *doh, size_t dohlen,
return DOH_OK;
}
-static unsigned short get16bit(unsigned char *doh, int index)
+static unsigned short get16bit(const unsigned char *doh, int index)
{
return (unsigned short)((doh[index] << 8) | doh[index + 1]);
}
-static unsigned int get32bit(unsigned char *doh, int index)
+static unsigned int get32bit(const unsigned char *doh, int index)
{
/* make clang and gcc optimize this to bswap by incrementing
the pointer first. */
@@ -448,7 +474,7 @@ static unsigned int get32bit(unsigned char *doh, int index)
return ( (unsigned)doh[0] << 24) | (doh[1] << 16) |(doh[2] << 8) | doh[3];
}
-static DOHcode store_a(unsigned char *doh, int index, struct dohentry *d)
+static DOHcode store_a(const unsigned char *doh, int index, struct dohentry *d)
{
/* silently ignore addresses over the limit */
if(d->numaddr < DOH_MAX_ADDR) {
@@ -460,7 +486,9 @@ static DOHcode store_a(unsigned char *doh, int index, struct dohentry *d)
return DOH_OK;
}
-static DOHcode store_aaaa(unsigned char *doh, int index, struct dohentry *d)
+static DOHcode store_aaaa(const unsigned char *doh,
+ int index,
+ struct dohentry *d)
{
/* silently ignore addresses over the limit */
if(d->numaddr < DOH_MAX_ADDR) {
@@ -472,38 +500,12 @@ static DOHcode store_aaaa(unsigned char *doh, int index, struct dohentry *d)
return DOH_OK;
}
-static DOHcode cnameappend(struct cnamestore *c,
- unsigned char *src,
- size_t len)
-{
- if(!c->alloc) {
- c->allocsize = len + 1;
- c->alloc = malloc(c->allocsize);
- if(!c->alloc)
- return DOH_OUT_OF_MEM;
- }
- else if(c->allocsize < (c->allocsize + len + 1)) {
- char *ptr;
- c->allocsize += len + 1;
- ptr = realloc(c->alloc, c->allocsize);
- if(!ptr) {
- free(c->alloc);
- return DOH_OUT_OF_MEM;
- }
- c->alloc = ptr;
- }
- memcpy(&c->alloc[c->len], src, len);
- c->len += len;
- c->alloc[c->len] = 0; /* keep it zero terminated */
- return DOH_OK;
-}
-
-static DOHcode store_cname(unsigned char *doh,
+static DOHcode store_cname(const unsigned char *doh,
size_t dohlen,
unsigned int index,
struct dohentry *d)
{
- struct cnamestore *c;
+ struct dynbuf *c;
unsigned int loop = 128; /* a valid DNS name can never loop this much */
unsigned char length;
@@ -521,7 +523,7 @@ static DOHcode store_cname(unsigned char *doh,
if((index + 1) >= dohlen)
return DOH_DNS_OUT_OF_RANGE;
- /* move to the the new index */
+ /* move to the new index */
newpos = (length & 0x3f) << 8 | doh[index + 1];
index = newpos;
continue;
@@ -532,18 +534,15 @@ static DOHcode store_cname(unsigned char *doh,
index++;
if(length) {
- DOHcode rc;
- if(c->len) {
- rc = cnameappend(c, (unsigned char *)".", 1);
- if(rc)
- return rc;
+ if(Curl_dyn_len(c)) {
+ if(Curl_dyn_add(c, "."))
+ return DOH_OUT_OF_MEM;
}
if((index + length) > dohlen)
return DOH_DNS_BAD_LABEL;
- rc = cnameappend(c, &doh[index], length);
- if(rc)
- return rc;
+ if(Curl_dyn_addn(c, &doh[index], length))
+ return DOH_OUT_OF_MEM;
index += length;
}
} while(length && --loop);
@@ -553,7 +552,7 @@ static DOHcode store_cname(unsigned char *doh,
return DOH_OK;
}
-static DOHcode rdata(unsigned char *doh,
+static DOHcode rdata(const unsigned char *doh,
size_t dohlen,
unsigned short rdlength,
unsigned short type,
@@ -586,6 +585,9 @@ static DOHcode rdata(unsigned char *doh,
if(rc)
return rc;
break;
+ case DNS_TYPE_DNAME:
+ /* explicit for clarity; just skip; rely on synthesized CNAME */
+ break;
default:
/* unsupported type, just skip it */
break;
@@ -593,14 +595,17 @@ static DOHcode rdata(unsigned char *doh,
return DOH_OK;
}
-static void init_dohentry(struct dohentry *de)
+UNITTEST void de_init(struct dohentry *de)
{
+ int i;
memset(de, 0, sizeof(*de));
de->ttl = INT_MAX;
+ for(i = 0; i < DOH_MAX_CNAME; i++)
+ Curl_dyn_init(&de->cname[i], DYN_DOH_CNAME);
}
-UNITTEST DOHcode doh_decode(unsigned char *doh,
+UNITTEST DOHcode doh_decode(const unsigned char *doh,
size_t dohlen,
DNStype dnstype,
struct dohentry *d)
@@ -647,8 +652,10 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
return DOH_DNS_OUT_OF_RANGE;
type = get16bit(doh, index);
- if((type != DNS_TYPE_CNAME) && (type != dnstype))
- /* Not the same type as was asked for nor CNAME */
+ if((type != DNS_TYPE_CNAME) /* may be synthesized from DNAME */
+ && (type != DNS_TYPE_DNAME) /* if present, accept and ignore */
+ && (type != dnstype))
+ /* Not the same type as was asked for nor CNAME nor DNAME */
return DOH_DNS_UNEXPECTED_TYPE;
index += 2;
@@ -738,12 +745,12 @@ UNITTEST DOHcode doh_decode(unsigned char *doh,
#ifndef CURL_DISABLE_VERBOSE_STRINGS
static void showdoh(struct Curl_easy *data,
- struct dohentry *d)
+ const struct dohentry *d)
{
int i;
infof(data, "TTL: %u seconds\n", d->ttl);
for(i = 0; i < d->numaddr; i++) {
- struct dohaddr *a = &d->addr[i];
+ const struct dohaddr *a = &d->addr[i];
if(a->type == DNS_TYPE_A) {
infof(data, "DOH A: %u.%u.%u.%u\n",
a->ip.v4[0], a->ip.v4[1],
@@ -769,7 +776,7 @@ static void showdoh(struct Curl_easy *data,
}
}
for(i = 0; i < d->numcname; i++) {
- infof(data, "CNAME: %s\n", d->cname[i].alloc);
+ infof(data, "CNAME: %s\n", Curl_dyn_ptr(&d->cname[i]));
}
}
#else
@@ -789,18 +796,19 @@ static void showdoh(struct Curl_easy *data,
* must be an associated call later to Curl_freeaddrinfo().
*/
-static Curl_addrinfo *
+static struct Curl_addrinfo *
doh2ai(const struct dohentry *de, const char *hostname, int port)
{
- Curl_addrinfo *ai;
- Curl_addrinfo *prevai = NULL;
- Curl_addrinfo *firstai = NULL;
+ struct Curl_addrinfo *ai;
+ struct Curl_addrinfo *prevai = NULL;
+ struct Curl_addrinfo *firstai = NULL;
struct sockaddr_in *addr;
#ifdef ENABLE_IPV6
struct sockaddr_in6 *addr6;
#endif
CURLcode result = CURLE_OK;
int i;
+ size_t hostlen = strlen(hostname) + 1; /* include zero terminator */
if(!de)
/* no input == no output! */
@@ -823,24 +831,14 @@ doh2ai(const struct dohentry *de, const char *hostname, int port)
addrtype = AF_INET;
}
- ai = calloc(1, sizeof(Curl_addrinfo));
+ ai = calloc(1, sizeof(struct Curl_addrinfo) + ss_size + hostlen);
if(!ai) {
result = CURLE_OUT_OF_MEMORY;
break;
}
- ai->ai_canonname = strdup(hostname);
- if(!ai->ai_canonname) {
- result = CURLE_OUT_OF_MEMORY;
- free(ai);
- break;
- }
- ai->ai_addr = calloc(1, ss_size);
- if(!ai->ai_addr) {
- result = CURLE_OUT_OF_MEMORY;
- free(ai->ai_canonname);
- free(ai);
- break;
- }
+ ai->ai_addr = (void *)((char *)ai + sizeof(struct Curl_addrinfo));
+ ai->ai_canonname = (void *)((char *)ai->ai_addr + ss_size);
+ memcpy(ai->ai_canonname, hostname, hostlen);
if(!firstai)
/* store the pointer we want to return from this function */
@@ -865,7 +863,7 @@ doh2ai(const struct dohentry *de, const char *hostname, int port)
addr = (void *)ai->ai_addr; /* storage area for this info */
DEBUGASSERT(sizeof(struct in_addr) == sizeof(de->addr[i].ip.v4));
memcpy(&addr->sin_addr, &de->addr[i].ip.v4, sizeof(struct in_addr));
- addr->sin_family = (CURL_SA_FAMILY_T)addrtype;
+ addr->sin_family = addrtype;
addr->sin_port = htons((unsigned short)port);
break;
@@ -874,7 +872,7 @@ doh2ai(const struct dohentry *de, const char *hostname, int port)
addr6 = (void *)ai->ai_addr; /* storage area for this info */
DEBUGASSERT(sizeof(struct in6_addr) == sizeof(de->addr[i].ip.v6));
memcpy(&addr6->sin6_addr, &de->addr[i].ip.v6, sizeof(struct in6_addr));
- addr6->sin6_family = (CURL_SA_FAMILY_T)addrtype;
+ addr6->sin6_family = addrtype;
addr6->sin6_port = htons((unsigned short)port);
break;
#endif
@@ -902,53 +900,54 @@ UNITTEST void de_cleanup(struct dohentry *d)
{
int i = 0;
for(i = 0; i < d->numcname; i++) {
- free(d->cname[i].alloc);
+ Curl_dyn_free(&d->cname[i]);
}
}
CURLcode Curl_doh_is_resolved(struct connectdata *conn,
struct Curl_dns_entry **dnsp)
{
+ CURLcode result;
struct Curl_easy *data = conn->data;
*dnsp = NULL; /* defaults to no response */
- if(!data->req.doh.probe[0].easy && !data->req.doh.probe[1].easy) {
+ if(!data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V4].easy &&
+ !data->req.doh.probe[DOH_PROBE_SLOT_IPADDR_V6].easy) {
failf(data, "Could not DOH-resolve: %s", conn->async.hostname);
return conn->bits.proxy?CURLE_COULDNT_RESOLVE_PROXY:
CURLE_COULDNT_RESOLVE_HOST;
}
else if(!data->req.doh.pending) {
- DOHcode rc;
- DOHcode rc2;
+ DOHcode rc[DOH_PROBE_SLOTS] = {
+ DOH_OK, DOH_OK
+ };
struct dohentry de;
+ int slot;
/* remove DOH handles from multi handle and close them */
- curl_multi_remove_handle(data->multi, data->req.doh.probe[0].easy);
- Curl_close(&data->req.doh.probe[0].easy);
- curl_multi_remove_handle(data->multi, data->req.doh.probe[1].easy);
- Curl_close(&data->req.doh.probe[1].easy);
- /* parse the responses, create the struct and return it! */
- init_dohentry(&de);
- rc = doh_decode(data->req.doh.probe[0].serverdoh.memory,
- data->req.doh.probe[0].serverdoh.size,
- data->req.doh.probe[0].dnstype,
- &de);
- Curl_safefree(data->req.doh.probe[0].serverdoh.memory);
- if(rc) {
- infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc),
- type2name(data->req.doh.probe[0].dnstype),
- data->req.doh.host);
+ for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+ curl_multi_remove_handle(data->multi, data->req.doh.probe[slot].easy);
+ Curl_close(&data->req.doh.probe[slot].easy);
}
- rc2 = doh_decode(data->req.doh.probe[1].serverdoh.memory,
- data->req.doh.probe[1].serverdoh.size,
- data->req.doh.probe[1].dnstype,
- &de);
- Curl_safefree(data->req.doh.probe[1].serverdoh.memory);
- if(rc2) {
- infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc2),
- type2name(data->req.doh.probe[1].dnstype),
- data->req.doh.host);
- }
- if(!rc || !rc2) {
+ /* parse the responses, create the struct and return it! */
+ de_init(&de);
+ for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+ struct dnsprobe *p = &data->req.doh.probe[slot];
+ if(!p->dnstype)
+ continue;
+ rc[slot] = doh_decode(Curl_dyn_uptr(&p->serverdoh),
+ Curl_dyn_len(&p->serverdoh),
+ p->dnstype,
+ &de);
+ Curl_dyn_free(&p->serverdoh);
+ if(rc[slot]) {
+ infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc[slot]),
+ type2name(p->dnstype), data->req.doh.host);
+ }
+ } /* next slot */
+
+ result = CURLE_COULDNT_RESOLVE_HOST; /* until we know better */
+ if(!rc[DOH_PROBE_SLOT_IPADDR_V4] || !rc[DOH_PROBE_SLOT_IPADDR_V6]) {
+ /* we have an address, of one kind or other */
struct Curl_dns_entry *dns;
struct Curl_addrinfo *ai;
@@ -970,21 +969,26 @@ CURLcode Curl_doh_is_resolved(struct connectdata *conn,
if(data->share)
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
- de_cleanup(&de);
- if(!dns)
+ if(!dns) {
/* returned failure, bail out nicely */
Curl_freeaddrinfo(ai);
+ }
else {
conn->async.dns = dns;
*dnsp = dns;
- return CURLE_OK;
+ result = CURLE_OK; /* address resolution OK */
}
- }
+ } /* address processing done */
+
+ /* Now process any build-specific attributes retrieved from DNS */
+
+ /* All done */
de_cleanup(&de);
+ return result;
- return CURLE_COULDNT_RESOLVE_HOST;
- }
+ } /* !data->req.doh.pending */
+ /* else wait for pending DOH transactions to complete */
return CURLE_OK;
}
diff --git a/lib/doh.h b/lib/doh.h
index f522d3308..bbd4c1a65 100644
--- a/lib/doh.h
+++ b/lib/doh.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,10 +32,10 @@
* and returns a 'Curl_addrinfo *' with the address information.
*/
-Curl_addrinfo *Curl_doh(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp);
+struct Curl_addrinfo *Curl_doh(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp);
CURLcode Curl_doh_is_resolved(struct connectdata *conn,
struct Curl_dns_entry **dns);
@@ -55,25 +55,21 @@ typedef enum {
DOH_DNS_UNEXPECTED_TYPE, /* 9 */
DOH_DNS_UNEXPECTED_CLASS, /* 10 */
DOH_NO_CONTENT, /* 11 */
- DOH_DNS_BAD_ID /* 12 */
+ DOH_DNS_BAD_ID, /* 12 */
+ DOH_DNS_NAME_TOO_LONG /* 13 */
} DOHcode;
typedef enum {
DNS_TYPE_A = 1,
DNS_TYPE_NS = 2,
DNS_TYPE_CNAME = 5,
- DNS_TYPE_AAAA = 28
+ DNS_TYPE_AAAA = 28,
+ DNS_TYPE_DNAME = 39 /* RFC6672 */
} DNStype;
#define DOH_MAX_ADDR 24
#define DOH_MAX_CNAME 4
-struct cnamestore {
- size_t len; /* length of cname */
- char *alloc; /* allocated pointer */
- size_t allocsize; /* allocated size */
-};
-
struct dohaddr {
int type;
union {
@@ -83,11 +79,11 @@ struct dohaddr {
};
struct dohentry {
- unsigned int ttl;
- int numaddr;
+ struct dynbuf cname[DOH_MAX_CNAME];
struct dohaddr addr[DOH_MAX_ADDR];
+ int numaddr;
+ unsigned int ttl;
int numcname;
- struct cnamestore cname[DOH_MAX_CNAME];
};
@@ -97,10 +93,11 @@ DOHcode doh_encode(const char *host,
unsigned char *dnsp, /* buffer */
size_t len, /* buffer size */
size_t *olen); /* output length */
-DOHcode doh_decode(unsigned char *doh,
+DOHcode doh_decode(const unsigned char *doh,
size_t dohlen,
DNStype dnstype,
struct dohentry *d);
+void de_init(struct dohentry *d);
void de_cleanup(struct dohentry *d);
#endif
diff --git a/lib/dotdot.c b/lib/dotdot.c
index 2c6177aea..ce9a05214 100644
--- a/lib/dotdot.c
+++ b/lib/dotdot.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,7 +39,7 @@
* Curl_dedotdotify()
* @unittest: 1395
*
- * This function gets a zero-terminated path with dot and dotdot sequences
+ * This function gets a null-terminated path with dot and dotdot sequences
* passed in and strips them off according to the rules in RFC 3986 section
* 5.2.4.
*
@@ -62,7 +62,7 @@ char *Curl_dedotdotify(const char *input)
if(!out)
return NULL; /* out of memory */
- *out = 0; /* zero terminates, for inputs like "./" */
+ *out = 0; /* null-terminates, for inputs like "./" */
/* get a cloned copy of the input */
clone = strdup(input);
@@ -129,7 +129,7 @@ char *Curl_dedotdotify(const char *input)
if(*outptr == '/')
break;
}
- *outptr = 0; /* zero-terminate where it stops */
+ *outptr = 0; /* null-terminate where it stops */
}
else if(!strcmp("/..", clone)) {
clone[2]='/';
@@ -141,7 +141,7 @@ char *Curl_dedotdotify(const char *input)
if(*outptr == '/')
break;
}
- *outptr = 0; /* zero-terminate where it stops */
+ *outptr = 0; /* null-terminate where it stops */
}
/* D. if the input buffer consists only of "." or "..", then remove
diff --git a/lib/dotdot.h b/lib/dotdot.h
index 125af4367..f70b1db3f 100644
--- a/lib/dotdot.h
+++ b/lib/dotdot.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/dynbuf.c b/lib/dynbuf.c
new file mode 100644
index 000000000..b2465b888
--- /dev/null
+++ b/lib/dynbuf.c
@@ -0,0 +1,255 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#include "dynbuf.h"
+#include "curl_printf.h"
+#ifdef BUILDING_LIBCURL
+#include "curl_memory.h"
+#endif
+#include "memdebug.h"
+
+#define MIN_FIRST_ALLOC 32
+
+#define DYNINIT 0xbee51da /* random pattern */
+
+/*
+ * Init a dynbuf struct.
+ */
+void Curl_dyn_init(struct dynbuf *s, size_t toobig)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(toobig);
+ s->bufr = NULL;
+ s->leng = 0;
+ s->allc = 0;
+ s->toobig = toobig;
+#ifdef DEBUGBUILD
+ s->init = DYNINIT;
+#endif
+}
+
+/*
+ * free the buffer and re-init the necessary fields. It doesn't touch the
+ * 'init' field and thus this buffer can be reused to add data to again.
+ */
+void Curl_dyn_free(struct dynbuf *s)
+{
+ DEBUGASSERT(s);
+ Curl_safefree(s->bufr);
+ s->leng = s->allc = 0;
+}
+
+/*
+ * Store/append an chunk of memory to the dynbuf.
+ */
+static CURLcode dyn_nappend(struct dynbuf *s,
+ const unsigned char *mem, size_t len)
+{
+ size_t indx = s->leng;
+ size_t a = s->allc;
+ size_t fit = len + indx + 1; /* new string + old string + zero byte */
+
+ /* try to detect if there's rubbish in the struct */
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(s->toobig);
+ DEBUGASSERT(indx < s->toobig);
+ DEBUGASSERT(!s->leng || s->bufr);
+
+ if(fit > s->toobig) {
+ Curl_dyn_free(s);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ else if(!a) {
+ DEBUGASSERT(!indx);
+ /* first invoke */
+ if(fit < MIN_FIRST_ALLOC)
+ a = MIN_FIRST_ALLOC;
+ else
+ a = fit;
+ }
+ else {
+ while(a < fit)
+ a *= 2;
+ }
+
+ if(a != s->allc) {
+ /* this logic is not using Curl_saferealloc() to make the tool not have to
+ include that as well when it uses this code */
+ void *p = realloc(s->bufr, a);
+ if(!p) {
+ Curl_safefree(s->bufr);
+ s->leng = s->allc = 0;
+ return CURLE_OUT_OF_MEMORY;
+ }
+ s->bufr = p;
+ s->allc = a;
+ }
+
+ if(len)
+ memcpy(&s->bufr[indx], mem, len);
+ s->leng = indx + len;
+ s->bufr[s->leng] = 0;
+ return CURLE_OK;
+}
+
+/*
+ * Clears the string, keeps the allocation. This can also be called on a
+ * buffer that already was freed.
+ */
+void Curl_dyn_reset(struct dynbuf *s)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ if(s->leng)
+ s->bufr[0] = 0;
+ s->leng = 0;
+}
+
+#ifdef USE_NGTCP2
+/*
+ * Specify the size of the tail to keep (number of bytes from the end of the
+ * buffer). The rest will be dropped.
+ */
+CURLcode Curl_dyn_tail(struct dynbuf *s, size_t trail)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ if(trail > s->leng)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ else if(trail == s->leng)
+ return CURLE_OK;
+ else if(!trail) {
+ Curl_dyn_reset(s);
+ }
+ else {
+ memmove(&s->bufr[0], &s->bufr[s->leng - trail], trail);
+ s->leng = trail;
+ s->bufr[s->leng] = 0;
+ }
+ return CURLE_OK;
+
+}
+#endif
+
+/*
+ * Appends a buffer with length.
+ */
+CURLcode Curl_dyn_addn(struct dynbuf *s, const void *mem, size_t len)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ return dyn_nappend(s, mem, len);
+}
+
+/*
+ * Append a null-terminated string at the end.
+ */
+CURLcode Curl_dyn_add(struct dynbuf *s, const char *str)
+{
+ size_t n = strlen(str);
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ return dyn_nappend(s, (unsigned char *)str, n);
+}
+
+/*
+ * Append a string vprintf()-style
+ */
+CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap)
+{
+#ifdef BUILDING_LIBCURL
+ int rc;
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ rc = Curl_dyn_vprintf(s, fmt, ap);
+
+ if(!rc)
+ return CURLE_OK;
+#else
+ char *str;
+ str = vaprintf(fmt, ap); /* this allocs a new string to append */
+
+ if(str) {
+ CURLcode result = dyn_nappend(s, (unsigned char *)str, strlen(str));
+ free(str);
+ return result;
+ }
+ /* If we failed, we cleanup the whole buffer and return error */
+ Curl_dyn_free(s);
+#endif
+ return CURLE_OUT_OF_MEMORY;
+}
+
+/*
+ * Append a string printf()-style
+ */
+CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...)
+{
+ CURLcode result;
+ va_list ap;
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ va_start(ap, fmt);
+ result = Curl_dyn_vaddf(s, fmt, ap);
+ va_end(ap);
+ return result;
+}
+
+/*
+ * Returns a pointer to the buffer.
+ */
+char *Curl_dyn_ptr(const struct dynbuf *s)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ return s->bufr;
+}
+
+/*
+ * Returns an unsigned pointer to the buffer.
+ */
+unsigned char *Curl_dyn_uptr(const struct dynbuf *s)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ return (unsigned char *)s->bufr;
+}
+
+/*
+ * Returns the length of the buffer.
+ */
+size_t Curl_dyn_len(const struct dynbuf *s)
+{
+ DEBUGASSERT(s);
+ DEBUGASSERT(s->init == DYNINIT);
+ DEBUGASSERT(!s->leng || s->bufr);
+ return s->leng;
+}
diff --git a/lib/dynbuf.h b/lib/dynbuf.h
new file mode 100644
index 000000000..39b859570
--- /dev/null
+++ b/lib/dynbuf.h
@@ -0,0 +1,88 @@
+#ifndef HEADER_CURL_DYNBUF_H
+#define HEADER_CURL_DYNBUF_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#ifndef BUILDING_LIBCURL
+/* this renames the functions so that the tool code can use the same code
+ without getting symbol collisions */
+#define Curl_dyn_init(a,b) curlx_dyn_init(a,b)
+#define Curl_dyn_add(a,b) curlx_dyn_add(a,b)
+#define Curl_dyn_addn(a,b,c) curlx_dyn_addn(a,b,c)
+#define Curl_dyn_addf curlx_dyn_addf
+#define Curl_dyn_vaddf curlx_dyn_vaddf
+#define Curl_dyn_free(a) curlx_dyn_free(a)
+#define Curl_dyn_ptr(a) curlx_dyn_ptr(a)
+#define Curl_dyn_uptr(a) curlx_dyn_uptr(a)
+#define Curl_dyn_len(a) curlx_dyn_len(a)
+#define Curl_dyn_reset(a) curlx_dyn_reset(a)
+#define Curl_dyn_tail(a,b) curlx_dyn_tail(a,b)
+#define curlx_dynbuf dynbuf /* for the struct name */
+#endif
+
+struct dynbuf {
+ char *bufr; /* point to a null-terminated allocated buffer */
+ size_t leng; /* number of bytes *EXCLUDING* the zero terminator */
+ size_t allc; /* size of the current allocation */
+ size_t toobig; /* size limit for the buffer */
+#ifdef DEBUGBUILD
+ int init; /* detect API usage mistakes */
+#endif
+};
+
+void Curl_dyn_init(struct dynbuf *s, size_t toobig);
+void Curl_dyn_free(struct dynbuf *s);
+CURLcode Curl_dyn_addn(struct dynbuf *s, const void *mem, size_t len)
+ WARN_UNUSED_RESULT;
+CURLcode Curl_dyn_add(struct dynbuf *s, const char *str)
+ WARN_UNUSED_RESULT;
+CURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...)
+ WARN_UNUSED_RESULT;
+CURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap)
+ WARN_UNUSED_RESULT;
+void Curl_dyn_reset(struct dynbuf *s);
+CURLcode Curl_dyn_tail(struct dynbuf *s, size_t trail);
+char *Curl_dyn_ptr(const struct dynbuf *s);
+unsigned char *Curl_dyn_uptr(const struct dynbuf *s);
+size_t Curl_dyn_len(const struct dynbuf *s);
+
+/* returns 0 on success, -1 on error */
+/* The implementation of this function exists in mprintf.c */
+int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save);
+
+/* Dynamic buffer max sizes */
+#define DYN_DOH_RESPONSE 3000
+#define DYN_DOH_CNAME 256
+#define DYN_PAUSE_BUFFER (64 * 1024 * 1024)
+#define DYN_HAXPROXY 2048
+#define DYN_HTTP_REQUEST (128*1024)
+#define DYN_H2_HEADERS (128*1024)
+#define DYN_H2_TRAILERS (128*1024)
+#define DYN_APRINTF 8000000
+#define DYN_RTSP_REQ_HEADER (64*1024)
+#define DYN_TRAILERS (64*1024)
+#define DYN_PROXY_CONNECT_HEADERS 16384
+#define DYN_QLOG_NAME 1024
+#define DYN_H1_TRAILER 4096
+#define DYN_PINGPPONG_CMD (64*1024)
+#define DYN_IMAP_CMD (64*1024)
+#endif
diff --git a/lib/easy.c b/lib/easy.c
index 001648d49..60e2befd7 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,18 +72,19 @@
#include "warnless.h"
#include "multiif.h"
#include "sigpipe.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "setopt.h"
#include "http_digest.h"
#include "system_win32.h"
+#include "http2.h"
+#include "dynbuf.h"
+#include "altsvc.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
-void Curl_version_init(void);
-
/* true globals -- for curl_global_init() and curl_global_cleanup() */
static unsigned int initialized;
static long init_flags;
@@ -105,7 +106,6 @@ static long init_flags;
# pragma warning(disable:4232) /* MSVC extension, dllimport identity */
#endif
-#ifndef __SYMBIAN32__
/*
* If a memory-using function (like curl_getenv) is used before
* curl_global_init() is called, we need to have these pointers set already.
@@ -118,17 +118,6 @@ curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc;
#if defined(WIN32) && defined(UNICODE)
curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
#endif
-#else
-/*
- * Symbian OS doesn't support initialization to code in writable static data.
- * Initialization will occur in the curl_global_init() call.
- */
-curl_malloc_callback Curl_cmalloc;
-curl_free_callback Curl_cfree;
-curl_realloc_callback Curl_crealloc;
-curl_strdup_callback Curl_cstrdup;
-curl_calloc_callback Curl_ccalloc;
-#endif
#if defined(_MSC_VER) && defined(_DLL) && !defined(__POCC__)
# pragma warning(default:4232) /* MSVC extension, dllimport identity */
@@ -157,20 +146,20 @@ static CURLcode global_init(long flags, bool memoryfuncs)
if(!Curl_ssl_init()) {
DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
#ifdef WIN32
if(Curl_win32_init(flags)) {
DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
#endif
#ifdef __AMIGA__
if(!Curl_amiga_init()) {
DEBUGF(fprintf(stderr, "Error: Curl_amiga_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
#endif
@@ -182,25 +171,29 @@ static CURLcode global_init(long flags, bool memoryfuncs)
if(Curl_resolver_global_init()) {
DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
- return CURLE_FAILED_INIT;
+ goto fail;
}
- (void)Curl_ipv6works();
-
#if defined(USE_SSH)
if(Curl_ssh_init()) {
- return CURLE_FAILED_INIT;
+ goto fail;
}
#endif
- if(flags & CURL_GLOBAL_ACK_EINTR)
- Curl_ack_eintr = 1;
+#ifdef USE_WOLFSSH
+ if(WS_SUCCESS != wolfSSH_Init()) {
+ DEBUGF(fprintf(stderr, "Error: wolfSSH_Init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
+#endif
init_flags = flags;
- Curl_version_init();
-
return CURLE_OK;
+
+ fail:
+ initialized--; /* undo the increase */
+ return CURLE_FAILED_INIT;
}
@@ -268,6 +261,10 @@ void curl_global_cleanup(void)
Curl_ssh_cleanup();
+#ifdef USE_WOLFSSH
+ (void)wolfSSH_Cleanup();
+#endif
+
init_flags = 0;
}
@@ -502,7 +499,7 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
before = Curl_now();
/* wait for activity or timeout */
- pollrc = Curl_poll(fds, numfds, (int)ev->ms);
+ pollrc = Curl_poll(fds, numfds, ev->ms);
after = Curl_now();
@@ -673,6 +670,7 @@ static CURLcode easy_perform(struct Curl_easy *data, bool events)
mcode = curl_multi_add_handle(multi, data);
if(mcode) {
curl_multi_cleanup(multi);
+ data->multi_easy = NULL;
if(mcode == CURLM_OUT_OF_MEMORY)
return CURLE_OUT_OF_MEMORY;
return CURLE_FAILED_INIT;
@@ -680,10 +678,6 @@ static CURLcode easy_perform(struct Curl_easy *data, bool events)
sigpipe_ignore(data, &pipe_st);
- /* assign this after curl_multi_add_handle() since that function checks for
- it and rejects this handle otherwise */
- data->multi = multi;
-
/* run the transfer */
result = events ? easy_events(multi) : easy_transfer(multi);
@@ -759,6 +753,7 @@ static CURLcode dupset(struct Curl_easy *dst, struct Curl_easy *src)
{
CURLcode result = CURLE_OK;
enum dupstring i;
+ enum dupblob j;
/* Copy src->set into dst->set first, then deal with the strings
afterwards */
@@ -775,6 +770,16 @@ static CURLcode dupset(struct Curl_easy *dst, struct Curl_easy *src)
return result;
}
+ /* clear all blob pointers first */
+ memset(dst->set.blobs, 0, BLOB_LAST * sizeof(struct curl_blob *));
+ /* duplicate all blobs */
+ for(j = (enum dupblob)0; j < BLOB_LAST; j++) {
+ result = Curl_setblobopt(&dst->set.blobs[j], src->set.blobs[j]);
+ /* Curl_setstropt return CURLE_BAD_FUNCTION_ARGUMENT with blob */
+ if(result)
+ return result;
+ }
+
/* duplicate memory areas pointed to */
i = STRING_COPYPOSTFIELDS;
if(src->set.postfieldsize && src->set.str[i]) {
@@ -813,23 +818,16 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
* the likeliness of us forgetting to init a buffer here in the future.
*/
outcurl->set.buffer_size = data->set.buffer_size;
- outcurl->state.buffer = malloc(outcurl->set.buffer_size + 1);
- if(!outcurl->state.buffer)
- goto fail;
-
- outcurl->state.headerbuff = malloc(HEADERSIZE);
- if(!outcurl->state.headerbuff)
- goto fail;
- outcurl->state.headersize = HEADERSIZE;
/* copy all userdefined values */
if(dupset(outcurl, data))
goto fail;
+ Curl_dyn_init(&outcurl->state.headerb, CURL_MAX_HTTP_HEADER);
+
/* the connection cache is setup on demand */
outcurl->state.conn_cache = NULL;
-
- outcurl->state.lastconnect = NULL;
+ outcurl->state.lastconnect_id = -1;
outcurl->progress.flags = data->progress.flags;
outcurl->progress.callback = data->progress.callback;
@@ -874,12 +872,43 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
goto fail;
}
+#ifdef USE_ALTSVC
+ if(data->asi) {
+ outcurl->asi = Curl_altsvc_init();
+ if(!outcurl->asi)
+ goto fail;
+ if(outcurl->set.str[STRING_ALTSVC])
+ (void)Curl_altsvc_load(outcurl->asi, outcurl->set.str[STRING_ALTSVC]);
+ }
+#endif
/* Clone the resolver handle, if present, for the new handle */
if(Curl_resolver_duphandle(outcurl,
&outcurl->state.resolver,
data->state.resolver))
goto fail;
+#ifdef USE_ARES
+ {
+ CURLcode rc;
+
+ rc = Curl_set_dns_servers(outcurl, data->set.str[STRING_DNS_SERVERS]);
+ if(rc && rc != CURLE_NOT_BUILT_IN)
+ goto fail;
+
+ rc = Curl_set_dns_interface(outcurl, data->set.str[STRING_DNS_INTERFACE]);
+ if(rc && rc != CURLE_NOT_BUILT_IN)
+ goto fail;
+
+ rc = Curl_set_dns_local_ip4(outcurl, data->set.str[STRING_DNS_LOCAL_IP4]);
+ if(rc && rc != CURLE_NOT_BUILT_IN)
+ goto fail;
+
+ rc = Curl_set_dns_local_ip6(outcurl, data->set.str[STRING_DNS_LOCAL_IP6]);
+ if(rc && rc != CURLE_NOT_BUILT_IN)
+ goto fail;
+ }
+#endif /* USE_ARES */
+
Curl_convert_setup(outcurl);
Curl_initinfo(outcurl);
@@ -896,9 +925,10 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
curl_slist_free_all(outcurl->change.cookielist);
outcurl->change.cookielist = NULL;
Curl_safefree(outcurl->state.buffer);
- Curl_safefree(outcurl->state.headerbuff);
+ Curl_dyn_free(&outcurl->state.headerb);
Curl_safefree(outcurl->change.url);
Curl_safefree(outcurl->change.referer);
+ Curl_altsvc_cleanup(&outcurl->asi);
Curl_freeset(outcurl);
free(outcurl);
}
@@ -912,8 +942,6 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
*/
void curl_easy_reset(struct Curl_easy *data)
{
- long old_buffer_size = data->set.buffer_size;
-
Curl_free_request_state(data);
/* zero out UserDefined data: */
@@ -929,6 +957,7 @@ void curl_easy_reset(struct Curl_easy *data)
data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */
+ data->state.retrycount = 0; /* reset the retry counter */
/* zero out authentication data: */
memset(&data->state.authhost, 0, sizeof(struct auth));
@@ -937,18 +966,6 @@ void curl_easy_reset(struct Curl_easy *data)
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
Curl_http_auth_cleanup_digest(data);
#endif
-
- /* resize receive buffer */
- if(old_buffer_size != data->set.buffer_size) {
- char *newbuff = realloc(data->state.buffer, data->set.buffer_size + 1);
- if(!newbuff) {
- DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
- /* nothing we can do here except use the old size */
- data->set.buffer_size = old_buffer_size;
- }
- else
- data->state.buffer = newbuff;
- }
}
/*
@@ -966,56 +983,82 @@ void curl_easy_reset(struct Curl_easy *data)
*/
CURLcode curl_easy_pause(struct Curl_easy *data, int action)
{
- struct SingleRequest *k = &data->req;
+ struct SingleRequest *k;
CURLcode result = CURLE_OK;
+ int oldstate;
+ int newstate;
- /* first switch off both pause bits */
- int newstate = k->keepon &~ (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE);
+ if(!GOOD_EASY_HANDLE(data) || !data->conn)
+ /* crazy input, don't continue */
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ k = &data->req;
+ oldstate = k->keepon & (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE);
- /* set the new desired pause bits */
- newstate |= ((action & CURLPAUSE_RECV)?KEEP_RECV_PAUSE:0) |
+ /* first switch off both pause bits then set the new pause bits */
+ newstate = (k->keepon &~ (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE)) |
+ ((action & CURLPAUSE_RECV)?KEEP_RECV_PAUSE:0) |
((action & CURLPAUSE_SEND)?KEEP_SEND_PAUSE:0);
+ if((newstate & (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE)) == oldstate) {
+ /* Not changing any pause state, return */
+ DEBUGF(infof(data, "pause: no change, early return\n"));
+ return CURLE_OK;
+ }
+
+ /* Unpause parts in active mime tree. */
+ if((k->keepon & ~newstate & KEEP_SEND_PAUSE) &&
+ (data->mstate == CURLM_STATE_PERFORM ||
+ data->mstate == CURLM_STATE_TOOFAST) &&
+ data->state.fread_func == (curl_read_callback) Curl_mime_read) {
+ Curl_mime_unpause(data->state.in);
+ }
+
/* put it back in the keepon */
k->keepon = newstate;
- if(!(newstate & KEEP_RECV_PAUSE) && data->state.tempcount) {
- /* there are buffers for sending that can be delivered as the receive
- pausing is lifted! */
- unsigned int i;
- unsigned int count = data->state.tempcount;
- struct tempbuf writebuf[3]; /* there can only be three */
- struct connectdata *conn = data->conn;
- struct Curl_easy *saved_data = NULL;
-
- /* copy the structs to allow for immediate re-pausing */
- for(i = 0; i < data->state.tempcount; i++) {
- writebuf[i] = data->state.tempwrite[i];
- data->state.tempwrite[i].buf = NULL;
- }
- data->state.tempcount = 0;
+ if(!(newstate & KEEP_RECV_PAUSE)) {
+ Curl_http2_stream_pause(data, FALSE);
+
+ if(data->state.tempcount) {
+ /* there are buffers for sending that can be delivered as the receive
+ pausing is lifted! */
+ unsigned int i;
+ unsigned int count = data->state.tempcount;
+ struct tempbuf writebuf[3]; /* there can only be three */
+ struct connectdata *conn = data->conn;
+ struct Curl_easy *saved_data = NULL;
+
+ /* copy the structs to allow for immediate re-pausing */
+ for(i = 0; i < data->state.tempcount; i++) {
+ writebuf[i] = data->state.tempwrite[i];
+ Curl_dyn_init(&data->state.tempwrite[i].b, DYN_PAUSE_BUFFER);
+ }
+ data->state.tempcount = 0;
- /* set the connection's current owner */
- if(conn->data != data) {
- saved_data = conn->data;
- conn->data = data;
- }
+ /* set the connection's current owner */
+ if(conn->data != data) {
+ saved_data = conn->data;
+ conn->data = data;
+ }
- for(i = 0; i < count; i++) {
- /* even if one function returns error, this loops through and frees all
- buffers */
- if(!result)
- result = Curl_client_write(conn, writebuf[i].type, writebuf[i].buf,
- writebuf[i].len);
- free(writebuf[i].buf);
- }
+ for(i = 0; i < count; i++) {
+ /* even if one function returns error, this loops through and frees
+ all buffers */
+ if(!result)
+ result = Curl_client_write(conn, writebuf[i].type,
+ Curl_dyn_ptr(&writebuf[i].b),
+ Curl_dyn_len(&writebuf[i].b));
+ Curl_dyn_free(&writebuf[i].b);
+ }
- /* recover previous owner of the connection */
- if(saved_data)
- conn->data = saved_data;
+ /* recover previous owner of the connection */
+ if(saved_data)
+ conn->data = saved_data;
- if(result)
- return result;
+ if(result)
+ return result;
+ }
}
/* if there's no error and we're not pausing both directions, we want
@@ -1023,13 +1066,19 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
if((newstate & (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) {
Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
+
+ if(!data->state.tempcount)
+ /* if not pausing again, force a recv/send check of this connection as
+ the data might've been read off the socket already */
+ data->conn->cselect_bits = CURL_CSELECT_IN | CURL_CSELECT_OUT;
if(data->multi)
Curl_update_timer(data->multi);
}
- /* This transfer may have been moved in or out of the bundle, update
- the corresponding socket callback, if used */
- Curl_updatesocket(data);
+ if(!data->state.done)
+ /* This transfer may have been moved in or out of the bundle, update the
+ corresponding socket callback, if used */
+ Curl_updatesocket(data);
return result;
}
diff --git a/lib/easygetopt.c b/lib/easygetopt.c
new file mode 100644
index 000000000..cac8378e7
--- /dev/null
+++ b/lib/easygetopt.c
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ | |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * ___|___/|_| ______|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+#include "strcase.h"
+#include "easyoptions.h"
+
+#ifndef CURL_DISABLE_GETOPTIONS
+
+/* Lookups easy options at runtime */
+static struct curl_easyoption *lookup(const char *name, CURLoption id)
+{
+ DEBUGASSERT(name || id);
+ DEBUGASSERT(!Curl_easyopts_check());
+ if(name || id) {
+ struct curl_easyoption *o = &Curl_easyopts[0];
+ do {
+ if(name) {
+ if(strcasecompare(o->name, name))
+ return o;
+ }
+ else {
+ if((o->id == id) && !(o->flags & CURLOT_FLAG_ALIAS))
+ /* don't match alias options */
+ return o;
+ }
+ o++;
+ } while(o->name);
+ }
+ return NULL;
+}
+
+const struct curl_easyoption *curl_easy_option_by_name(const char *name)
+{
+ /* when name is used, the id argument is ignored */
+ return lookup(name, CURLOPT_LASTENTRY);
+}
+
+const struct curl_easyoption *curl_easy_option_by_id(CURLoption id)
+{
+ return lookup(NULL, id);
+}
+
+/* Iterates over available options */
+const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev)
+{
+ if(prev && prev->name) {
+ prev++;
+ if(prev->name)
+ return prev;
+ }
+ else if(!prev)
+ return &Curl_easyopts[0];
+ return NULL;
+}
+
+#else
+const struct curl_easyoption *curl_easy_option_by_name(const char *name)
+{
+ (void)name;
+ return NULL;
+}
+
+const struct curl_easyoption *curl_easy_option_by_id (CURLoption id)
+{
+ (void)id;
+ return NULL;
+}
+
+const struct curl_easyoption *
+curl_easy_option_next(const struct curl_easyoption *prev)
+{
+ (void)prev;
+ return NULL;
+}
+#endif
diff --git a/lib/easyif.h b/lib/easyif.h
index 6ba7e549d..eda0d62e5 100644
--- a/lib/easyif.h
+++ b/lib/easyif.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/easyoptions.c b/lib/easyoptions.c
new file mode 100644
index 000000000..0ab6a3fc6
--- /dev/null
+++ b/lib/easyoptions.c
@@ -0,0 +1,347 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ | |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * ___|___/|_| ______|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* This source code is generated by optiontable.pl - DO NOT EDIT BY HAND */
+
+#include "curl_setup.h"
+#include "easyoptions.h"
+
+/* all easy setopt options listed in alphabetical order */
+struct curl_easyoption Curl_easyopts[] = {
+ {"ABSTRACT_UNIX_SOCKET", CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOT_STRING, 0},
+ {"ACCEPTTIMEOUT_MS", CURLOPT_ACCEPTTIMEOUT_MS, CURLOT_LONG, 0},
+ {"ACCEPT_ENCODING", CURLOPT_ACCEPT_ENCODING, CURLOT_STRING, 0},
+ {"ADDRESS_SCOPE", CURLOPT_ADDRESS_SCOPE, CURLOT_LONG, 0},
+ {"ALTSVC", CURLOPT_ALTSVC, CURLOT_STRING, 0},
+ {"ALTSVC_CTRL", CURLOPT_ALTSVC_CTRL, CURLOT_LONG, 0},
+ {"APPEND", CURLOPT_APPEND, CURLOT_LONG, 0},
+ {"AUTOREFERER", CURLOPT_AUTOREFERER, CURLOT_LONG, 0},
+ {"BUFFERSIZE", CURLOPT_BUFFERSIZE, CURLOT_LONG, 0},
+ {"CAINFO", CURLOPT_CAINFO, CURLOT_STRING, 0},
+ {"CAPATH", CURLOPT_CAPATH, CURLOT_STRING, 0},
+ {"CERTINFO", CURLOPT_CERTINFO, CURLOT_LONG, 0},
+ {"CHUNK_BGN_FUNCTION", CURLOPT_CHUNK_BGN_FUNCTION, CURLOT_FUNCTION, 0},
+ {"CHUNK_DATA", CURLOPT_CHUNK_DATA, CURLOT_CBPTR, 0},
+ {"CHUNK_END_FUNCTION", CURLOPT_CHUNK_END_FUNCTION, CURLOT_FUNCTION, 0},
+ {"CLOSESOCKETDATA", CURLOPT_CLOSESOCKETDATA, CURLOT_CBPTR, 0},
+ {"CLOSESOCKETFUNCTION", CURLOPT_CLOSESOCKETFUNCTION, CURLOT_FUNCTION, 0},
+ {"CONNECTTIMEOUT", CURLOPT_CONNECTTIMEOUT, CURLOT_LONG, 0},
+ {"CONNECTTIMEOUT_MS", CURLOPT_CONNECTTIMEOUT_MS, CURLOT_LONG, 0},
+ {"CONNECT_ONLY", CURLOPT_CONNECT_ONLY, CURLOT_LONG, 0},
+ {"CONNECT_TO", CURLOPT_CONNECT_TO, CURLOT_SLIST, 0},
+ {"CONV_FROM_NETWORK_FUNCTION", CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"CONV_FROM_UTF8_FUNCTION", CURLOPT_CONV_FROM_UTF8_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"CONV_TO_NETWORK_FUNCTION", CURLOPT_CONV_TO_NETWORK_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"COOKIE", CURLOPT_COOKIE, CURLOT_STRING, 0},
+ {"COOKIEFILE", CURLOPT_COOKIEFILE, CURLOT_STRING, 0},
+ {"COOKIEJAR", CURLOPT_COOKIEJAR, CURLOT_STRING, 0},
+ {"COOKIELIST", CURLOPT_COOKIELIST, CURLOT_STRING, 0},
+ {"COOKIESESSION", CURLOPT_COOKIESESSION, CURLOT_LONG, 0},
+ {"COPYPOSTFIELDS", CURLOPT_COPYPOSTFIELDS, CURLOT_OBJECT, 0},
+ {"CRLF", CURLOPT_CRLF, CURLOT_LONG, 0},
+ {"CRLFILE", CURLOPT_CRLFILE, CURLOT_STRING, 0},
+ {"CURLU", CURLOPT_CURLU, CURLOT_OBJECT, 0},
+ {"CUSTOMREQUEST", CURLOPT_CUSTOMREQUEST, CURLOT_STRING, 0},
+ {"DEBUGDATA", CURLOPT_DEBUGDATA, CURLOT_CBPTR, 0},
+ {"DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION, CURLOT_FUNCTION, 0},
+ {"DEFAULT_PROTOCOL", CURLOPT_DEFAULT_PROTOCOL, CURLOT_STRING, 0},
+ {"DIRLISTONLY", CURLOPT_DIRLISTONLY, CURLOT_LONG, 0},
+ {"DISALLOW_USERNAME_IN_URL", CURLOPT_DISALLOW_USERNAME_IN_URL,
+ CURLOT_LONG, 0},
+ {"DNS_CACHE_TIMEOUT", CURLOPT_DNS_CACHE_TIMEOUT, CURLOT_LONG, 0},
+ {"DNS_INTERFACE", CURLOPT_DNS_INTERFACE, CURLOT_STRING, 0},
+ {"DNS_LOCAL_IP4", CURLOPT_DNS_LOCAL_IP4, CURLOT_STRING, 0},
+ {"DNS_LOCAL_IP6", CURLOPT_DNS_LOCAL_IP6, CURLOT_STRING, 0},
+ {"DNS_SERVERS", CURLOPT_DNS_SERVERS, CURLOT_STRING, 0},
+ {"DNS_SHUFFLE_ADDRESSES", CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOT_LONG, 0},
+ {"DNS_USE_GLOBAL_CACHE", CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOT_LONG, 0},
+ {"DOH_URL", CURLOPT_DOH_URL, CURLOT_STRING, 0},
+ {"EGDSOCKET", CURLOPT_EGDSOCKET, CURLOT_STRING, 0},
+ {"ENCODING", CURLOPT_ACCEPT_ENCODING, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"ERRORBUFFER", CURLOPT_ERRORBUFFER, CURLOT_OBJECT, 0},
+ {"EXPECT_100_TIMEOUT_MS", CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOT_LONG, 0},
+ {"FAILONERROR", CURLOPT_FAILONERROR, CURLOT_LONG, 0},
+ {"FILE", CURLOPT_WRITEDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"FILETIME", CURLOPT_FILETIME, CURLOT_LONG, 0},
+ {"FNMATCH_DATA", CURLOPT_FNMATCH_DATA, CURLOT_CBPTR, 0},
+ {"FNMATCH_FUNCTION", CURLOPT_FNMATCH_FUNCTION, CURLOT_FUNCTION, 0},
+ {"FOLLOWLOCATION", CURLOPT_FOLLOWLOCATION, CURLOT_LONG, 0},
+ {"FORBID_REUSE", CURLOPT_FORBID_REUSE, CURLOT_LONG, 0},
+ {"FRESH_CONNECT", CURLOPT_FRESH_CONNECT, CURLOT_LONG, 0},
+ {"FTPAPPEND", CURLOPT_APPEND, CURLOT_LONG, CURLOT_FLAG_ALIAS},
+ {"FTPLISTONLY", CURLOPT_DIRLISTONLY, CURLOT_LONG, CURLOT_FLAG_ALIAS},
+ {"FTPPORT", CURLOPT_FTPPORT, CURLOT_STRING, 0},
+ {"FTPSSLAUTH", CURLOPT_FTPSSLAUTH, CURLOT_VALUES, 0},
+ {"FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT, CURLOT_STRING, 0},
+ {"FTP_ALTERNATIVE_TO_USER", CURLOPT_FTP_ALTERNATIVE_TO_USER,
+ CURLOT_STRING, 0},
+ {"FTP_CREATE_MISSING_DIRS", CURLOPT_FTP_CREATE_MISSING_DIRS,
+ CURLOT_LONG, 0},
+ {"FTP_FILEMETHOD", CURLOPT_FTP_FILEMETHOD, CURLOT_VALUES, 0},
+ {"FTP_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOT_LONG, 0},
+ {"FTP_SKIP_PASV_IP", CURLOPT_FTP_SKIP_PASV_IP, CURLOT_LONG, 0},
+ {"FTP_SSL", CURLOPT_USE_SSL, CURLOT_VALUES, CURLOT_FLAG_ALIAS},
+ {"FTP_SSL_CCC", CURLOPT_FTP_SSL_CCC, CURLOT_LONG, 0},
+ {"FTP_USE_EPRT", CURLOPT_FTP_USE_EPRT, CURLOT_LONG, 0},
+ {"FTP_USE_EPSV", CURLOPT_FTP_USE_EPSV, CURLOT_LONG, 0},
+ {"FTP_USE_PRET", CURLOPT_FTP_USE_PRET, CURLOT_LONG, 0},
+ {"GSSAPI_DELEGATION", CURLOPT_GSSAPI_DELEGATION, CURLOT_VALUES, 0},
+ {"HAPPY_EYEBALLS_TIMEOUT_MS", CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
+ CURLOT_LONG, 0},
+ {"HAPROXYPROTOCOL", CURLOPT_HAPROXYPROTOCOL, CURLOT_LONG, 0},
+ {"HEADER", CURLOPT_HEADER, CURLOT_LONG, 0},
+ {"HEADERDATA", CURLOPT_HEADERDATA, CURLOT_CBPTR, 0},
+ {"HEADERFUNCTION", CURLOPT_HEADERFUNCTION, CURLOT_FUNCTION, 0},
+ {"HEADEROPT", CURLOPT_HEADEROPT, CURLOT_VALUES, 0},
+ {"HTTP09_ALLOWED", CURLOPT_HTTP09_ALLOWED, CURLOT_LONG, 0},
+ {"HTTP200ALIASES", CURLOPT_HTTP200ALIASES, CURLOT_SLIST, 0},
+ {"HTTPAUTH", CURLOPT_HTTPAUTH, CURLOT_VALUES, 0},
+ {"HTTPGET", CURLOPT_HTTPGET, CURLOT_LONG, 0},
+ {"HTTPHEADER", CURLOPT_HTTPHEADER, CURLOT_SLIST, 0},
+ {"HTTPPOST", CURLOPT_HTTPPOST, CURLOT_OBJECT, 0},
+ {"HTTPPROXYTUNNEL", CURLOPT_HTTPPROXYTUNNEL, CURLOT_LONG, 0},
+ {"HTTP_CONTENT_DECODING", CURLOPT_HTTP_CONTENT_DECODING, CURLOT_LONG, 0},
+ {"HTTP_TRANSFER_DECODING", CURLOPT_HTTP_TRANSFER_DECODING, CURLOT_LONG, 0},
+ {"HTTP_VERSION", CURLOPT_HTTP_VERSION, CURLOT_VALUES, 0},
+ {"IGNORE_CONTENT_LENGTH", CURLOPT_IGNORE_CONTENT_LENGTH, CURLOT_LONG, 0},
+ {"INFILE", CURLOPT_READDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"INFILESIZE", CURLOPT_INFILESIZE, CURLOT_LONG, 0},
+ {"INFILESIZE_LARGE", CURLOPT_INFILESIZE_LARGE, CURLOT_OFF_T, 0},
+ {"INTERFACE", CURLOPT_INTERFACE, CURLOT_STRING, 0},
+ {"INTERLEAVEDATA", CURLOPT_INTERLEAVEDATA, CURLOT_CBPTR, 0},
+ {"INTERLEAVEFUNCTION", CURLOPT_INTERLEAVEFUNCTION, CURLOT_FUNCTION, 0},
+ {"IOCTLDATA", CURLOPT_IOCTLDATA, CURLOT_CBPTR, 0},
+ {"IOCTLFUNCTION", CURLOPT_IOCTLFUNCTION, CURLOT_FUNCTION, 0},
+ {"IPRESOLVE", CURLOPT_IPRESOLVE, CURLOT_VALUES, 0},
+ {"ISSUERCERT", CURLOPT_ISSUERCERT, CURLOT_STRING, 0},
+ {"ISSUERCERT_BLOB", CURLOPT_ISSUERCERT_BLOB, CURLOT_BLOB, 0},
+ {"KEEP_SENDING_ON_ERROR", CURLOPT_KEEP_SENDING_ON_ERROR, CURLOT_LONG, 0},
+ {"KEYPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, 0},
+ {"KRB4LEVEL", CURLOPT_KRBLEVEL, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"KRBLEVEL", CURLOPT_KRBLEVEL, CURLOT_STRING, 0},
+ {"LOCALPORT", CURLOPT_LOCALPORT, CURLOT_LONG, 0},
+ {"LOCALPORTRANGE", CURLOPT_LOCALPORTRANGE, CURLOT_LONG, 0},
+ {"LOGIN_OPTIONS", CURLOPT_LOGIN_OPTIONS, CURLOT_STRING, 0},
+ {"LOW_SPEED_LIMIT", CURLOPT_LOW_SPEED_LIMIT, CURLOT_LONG, 0},
+ {"LOW_SPEED_TIME", CURLOPT_LOW_SPEED_TIME, CURLOT_LONG, 0},
+ {"MAIL_AUTH", CURLOPT_MAIL_AUTH, CURLOT_STRING, 0},
+ {"MAIL_FROM", CURLOPT_MAIL_FROM, CURLOT_STRING, 0},
+ {"MAIL_RCPT", CURLOPT_MAIL_RCPT, CURLOT_SLIST, 0},
+ {"MAIL_RCPT_ALLLOWFAILS", CURLOPT_MAIL_RCPT_ALLLOWFAILS, CURLOT_LONG, 0},
+ {"MAXAGE_CONN", CURLOPT_MAXAGE_CONN, CURLOT_LONG, 0},
+ {"MAXCONNECTS", CURLOPT_MAXCONNECTS, CURLOT_LONG, 0},
+ {"MAXFILESIZE", CURLOPT_MAXFILESIZE, CURLOT_LONG, 0},
+ {"MAXFILESIZE_LARGE", CURLOPT_MAXFILESIZE_LARGE, CURLOT_OFF_T, 0},
+ {"MAXREDIRS", CURLOPT_MAXREDIRS, CURLOT_LONG, 0},
+ {"MAX_RECV_SPEED_LARGE", CURLOPT_MAX_RECV_SPEED_LARGE, CURLOT_OFF_T, 0},
+ {"MAX_SEND_SPEED_LARGE", CURLOPT_MAX_SEND_SPEED_LARGE, CURLOT_OFF_T, 0},
+ {"MIMEPOST", CURLOPT_MIMEPOST, CURLOT_OBJECT, 0},
+ {"NETRC", CURLOPT_NETRC, CURLOT_VALUES, 0},
+ {"NETRC_FILE", CURLOPT_NETRC_FILE, CURLOT_STRING, 0},
+ {"NEW_DIRECTORY_PERMS", CURLOPT_NEW_DIRECTORY_PERMS, CURLOT_LONG, 0},
+ {"NEW_FILE_PERMS", CURLOPT_NEW_FILE_PERMS, CURLOT_LONG, 0},
+ {"NOBODY", CURLOPT_NOBODY, CURLOT_LONG, 0},
+ {"NOPROGRESS", CURLOPT_NOPROGRESS, CURLOT_LONG, 0},
+ {"NOPROXY", CURLOPT_NOPROXY, CURLOT_STRING, 0},
+ {"NOSIGNAL", CURLOPT_NOSIGNAL, CURLOT_LONG, 0},
+ {"OPENSOCKETDATA", CURLOPT_OPENSOCKETDATA, CURLOT_CBPTR, 0},
+ {"OPENSOCKETFUNCTION", CURLOPT_OPENSOCKETFUNCTION, CURLOT_FUNCTION, 0},
+ {"PASSWORD", CURLOPT_PASSWORD, CURLOT_STRING, 0},
+ {"PATH_AS_IS", CURLOPT_PATH_AS_IS, CURLOT_LONG, 0},
+ {"PINNEDPUBLICKEY", CURLOPT_PINNEDPUBLICKEY, CURLOT_STRING, 0},
+ {"PIPEWAIT", CURLOPT_PIPEWAIT, CURLOT_LONG, 0},
+ {"PORT", CURLOPT_PORT, CURLOT_LONG, 0},
+ {"POST", CURLOPT_POST, CURLOT_LONG, 0},
+ {"POST301", CURLOPT_POSTREDIR, CURLOT_VALUES, CURLOT_FLAG_ALIAS},
+ {"POSTFIELDS", CURLOPT_POSTFIELDS, CURLOT_OBJECT, 0},
+ {"POSTFIELDSIZE", CURLOPT_POSTFIELDSIZE, CURLOT_LONG, 0},
+ {"POSTFIELDSIZE_LARGE", CURLOPT_POSTFIELDSIZE_LARGE, CURLOT_OFF_T, 0},
+ {"POSTQUOTE", CURLOPT_POSTQUOTE, CURLOT_SLIST, 0},
+ {"POSTREDIR", CURLOPT_POSTREDIR, CURLOT_VALUES, 0},
+ {"PREQUOTE", CURLOPT_PREQUOTE, CURLOT_SLIST, 0},
+ {"PRE_PROXY", CURLOPT_PRE_PROXY, CURLOT_STRING, 0},
+ {"PRIVATE", CURLOPT_PRIVATE, CURLOT_OBJECT, 0},
+ {"PROGRESSDATA", CURLOPT_XFERINFODATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"PROGRESSFUNCTION", CURLOPT_PROGRESSFUNCTION, CURLOT_FUNCTION, 0},
+ {"PROTOCOLS", CURLOPT_PROTOCOLS, CURLOT_LONG, 0},
+ {"PROXY", CURLOPT_PROXY, CURLOT_STRING, 0},
+ {"PROXYAUTH", CURLOPT_PROXYAUTH, CURLOT_VALUES, 0},
+ {"PROXYHEADER", CURLOPT_PROXYHEADER, CURLOT_SLIST, 0},
+ {"PROXYPASSWORD", CURLOPT_PROXYPASSWORD, CURLOT_STRING, 0},
+ {"PROXYPORT", CURLOPT_PROXYPORT, CURLOT_LONG, 0},
+ {"PROXYTYPE", CURLOPT_PROXYTYPE, CURLOT_VALUES, 0},
+ {"PROXYUSERNAME", CURLOPT_PROXYUSERNAME, CURLOT_STRING, 0},
+ {"PROXYUSERPWD", CURLOPT_PROXYUSERPWD, CURLOT_STRING, 0},
+ {"PROXY_CAINFO", CURLOPT_PROXY_CAINFO, CURLOT_STRING, 0},
+ {"PROXY_CAPATH", CURLOPT_PROXY_CAPATH, CURLOT_STRING, 0},
+ {"PROXY_CRLFILE", CURLOPT_PROXY_CRLFILE, CURLOT_STRING, 0},
+ {"PROXY_ISSUERCERT", CURLOPT_PROXY_ISSUERCERT, CURLOT_STRING, 0},
+ {"PROXY_ISSUERCERT_BLOB", CURLOPT_PROXY_ISSUERCERT_BLOB, CURLOT_BLOB, 0},
+ {"PROXY_KEYPASSWD", CURLOPT_PROXY_KEYPASSWD, CURLOT_STRING, 0},
+ {"PROXY_PINNEDPUBLICKEY", CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOT_STRING, 0},
+ {"PROXY_SERVICE_NAME", CURLOPT_PROXY_SERVICE_NAME, CURLOT_STRING, 0},
+ {"PROXY_SSLCERT", CURLOPT_PROXY_SSLCERT, CURLOT_STRING, 0},
+ {"PROXY_SSLCERTTYPE", CURLOPT_PROXY_SSLCERTTYPE, CURLOT_STRING, 0},
+ {"PROXY_SSLCERT_BLOB", CURLOPT_PROXY_SSLCERT_BLOB, CURLOT_BLOB, 0},
+ {"PROXY_SSLKEY", CURLOPT_PROXY_SSLKEY, CURLOT_STRING, 0},
+ {"PROXY_SSLKEYTYPE", CURLOPT_PROXY_SSLKEYTYPE, CURLOT_STRING, 0},
+ {"PROXY_SSLKEY_BLOB", CURLOPT_PROXY_SSLKEY_BLOB, CURLOT_BLOB, 0},
+ {"PROXY_SSLVERSION", CURLOPT_PROXY_SSLVERSION, CURLOT_VALUES, 0},
+ {"PROXY_SSL_CIPHER_LIST", CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOT_STRING, 0},
+ {"PROXY_SSL_OPTIONS", CURLOPT_PROXY_SSL_OPTIONS, CURLOT_LONG, 0},
+ {"PROXY_SSL_VERIFYHOST", CURLOPT_PROXY_SSL_VERIFYHOST, CURLOT_LONG, 0},
+ {"PROXY_SSL_VERIFYPEER", CURLOPT_PROXY_SSL_VERIFYPEER, CURLOT_LONG, 0},
+ {"PROXY_TLS13_CIPHERS", CURLOPT_PROXY_TLS13_CIPHERS, CURLOT_STRING, 0},
+ {"PROXY_TLSAUTH_PASSWORD", CURLOPT_PROXY_TLSAUTH_PASSWORD,
+ CURLOT_STRING, 0},
+ {"PROXY_TLSAUTH_TYPE", CURLOPT_PROXY_TLSAUTH_TYPE, CURLOT_STRING, 0},
+ {"PROXY_TLSAUTH_USERNAME", CURLOPT_PROXY_TLSAUTH_USERNAME,
+ CURLOT_STRING, 0},
+ {"PROXY_TRANSFER_MODE", CURLOPT_PROXY_TRANSFER_MODE, CURLOT_LONG, 0},
+ {"PUT", CURLOPT_PUT, CURLOT_LONG, 0},
+ {"QUOTE", CURLOPT_QUOTE, CURLOT_SLIST, 0},
+ {"RANDOM_FILE", CURLOPT_RANDOM_FILE, CURLOT_STRING, 0},
+ {"RANGE", CURLOPT_RANGE, CURLOT_STRING, 0},
+ {"READDATA", CURLOPT_READDATA, CURLOT_CBPTR, 0},
+ {"READFUNCTION", CURLOPT_READFUNCTION, CURLOT_FUNCTION, 0},
+ {"REDIR_PROTOCOLS", CURLOPT_REDIR_PROTOCOLS, CURLOT_LONG, 0},
+ {"REFERER", CURLOPT_REFERER, CURLOT_STRING, 0},
+ {"REQUEST_TARGET", CURLOPT_REQUEST_TARGET, CURLOT_STRING, 0},
+ {"RESOLVE", CURLOPT_RESOLVE, CURLOT_SLIST, 0},
+ {"RESOLVER_START_DATA", CURLOPT_RESOLVER_START_DATA, CURLOT_CBPTR, 0},
+ {"RESOLVER_START_FUNCTION", CURLOPT_RESOLVER_START_FUNCTION,
+ CURLOT_FUNCTION, 0},
+ {"RESUME_FROM", CURLOPT_RESUME_FROM, CURLOT_LONG, 0},
+ {"RESUME_FROM_LARGE", CURLOPT_RESUME_FROM_LARGE, CURLOT_OFF_T, 0},
+ {"RTSPHEADER", CURLOPT_HTTPHEADER, CURLOT_SLIST, CURLOT_FLAG_ALIAS},
+ {"RTSP_CLIENT_CSEQ", CURLOPT_RTSP_CLIENT_CSEQ, CURLOT_LONG, 0},
+ {"RTSP_REQUEST", CURLOPT_RTSP_REQUEST, CURLOT_VALUES, 0},
+ {"RTSP_SERVER_CSEQ", CURLOPT_RTSP_SERVER_CSEQ, CURLOT_LONG, 0},
+ {"RTSP_SESSION_ID", CURLOPT_RTSP_SESSION_ID, CURLOT_STRING, 0},
+ {"RTSP_STREAM_URI", CURLOPT_RTSP_STREAM_URI, CURLOT_STRING, 0},
+ {"RTSP_TRANSPORT", CURLOPT_RTSP_TRANSPORT, CURLOT_STRING, 0},
+ {"SASL_AUTHZID", CURLOPT_SASL_AUTHZID, CURLOT_STRING, 0},
+ {"SASL_IR", CURLOPT_SASL_IR, CURLOT_LONG, 0},
+ {"SEEKDATA", CURLOPT_SEEKDATA, CURLOT_CBPTR, 0},
+ {"SEEKFUNCTION", CURLOPT_SEEKFUNCTION, CURLOT_FUNCTION, 0},
+ {"SERVER_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT,
+ CURLOT_LONG, CURLOT_FLAG_ALIAS},
+ {"SERVICE_NAME", CURLOPT_SERVICE_NAME, CURLOT_STRING, 0},
+ {"SHARE", CURLOPT_SHARE, CURLOT_OBJECT, 0},
+ {"SOCKOPTDATA", CURLOPT_SOCKOPTDATA, CURLOT_CBPTR, 0},
+ {"SOCKOPTFUNCTION", CURLOPT_SOCKOPTFUNCTION, CURLOT_FUNCTION, 0},
+ {"SOCKS5_AUTH", CURLOPT_SOCKS5_AUTH, CURLOT_LONG, 0},
+ {"SOCKS5_GSSAPI_NEC", CURLOPT_SOCKS5_GSSAPI_NEC, CURLOT_LONG, 0},
+ {"SOCKS5_GSSAPI_SERVICE", CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOT_STRING, 0},
+ {"SSH_AUTH_TYPES", CURLOPT_SSH_AUTH_TYPES, CURLOT_VALUES, 0},
+ {"SSH_COMPRESSION", CURLOPT_SSH_COMPRESSION, CURLOT_LONG, 0},
+ {"SSH_HOST_PUBLIC_KEY_MD5", CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+ CURLOT_STRING, 0},
+ {"SSH_KEYDATA", CURLOPT_SSH_KEYDATA, CURLOT_CBPTR, 0},
+ {"SSH_KEYFUNCTION", CURLOPT_SSH_KEYFUNCTION, CURLOT_FUNCTION, 0},
+ {"SSH_KNOWNHOSTS", CURLOPT_SSH_KNOWNHOSTS, CURLOT_STRING, 0},
+ {"SSH_PRIVATE_KEYFILE", CURLOPT_SSH_PRIVATE_KEYFILE, CURLOT_STRING, 0},
+ {"SSH_PUBLIC_KEYFILE", CURLOPT_SSH_PUBLIC_KEYFILE, CURLOT_STRING, 0},
+ {"SSLCERT", CURLOPT_SSLCERT, CURLOT_STRING, 0},
+ {"SSLCERTPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"SSLCERTTYPE", CURLOPT_SSLCERTTYPE, CURLOT_STRING, 0},
+ {"SSLCERT_BLOB", CURLOPT_SSLCERT_BLOB, CURLOT_BLOB, 0},
+ {"SSLENGINE", CURLOPT_SSLENGINE, CURLOT_STRING, 0},
+ {"SSLENGINE_DEFAULT", CURLOPT_SSLENGINE_DEFAULT, CURLOT_LONG, 0},
+ {"SSLKEY", CURLOPT_SSLKEY, CURLOT_STRING, 0},
+ {"SSLKEYPASSWD", CURLOPT_KEYPASSWD, CURLOT_STRING, CURLOT_FLAG_ALIAS},
+ {"SSLKEYTYPE", CURLOPT_SSLKEYTYPE, CURLOT_STRING, 0},
+ {"SSLKEY_BLOB", CURLOPT_SSLKEY_BLOB, CURLOT_BLOB, 0},
+ {"SSLVERSION", CURLOPT_SSLVERSION, CURLOT_VALUES, 0},
+ {"SSL_CIPHER_LIST", CURLOPT_SSL_CIPHER_LIST, CURLOT_STRING, 0},
+ {"SSL_CTX_DATA", CURLOPT_SSL_CTX_DATA, CURLOT_CBPTR, 0},
+ {"SSL_CTX_FUNCTION", CURLOPT_SSL_CTX_FUNCTION, CURLOT_FUNCTION, 0},
+ {"SSL_EC_CURVES", CURLOPT_SSL_EC_CURVES, CURLOT_STRING, 0},
+ {"SSL_ENABLE_ALPN", CURLOPT_SSL_ENABLE_ALPN, CURLOT_LONG, 0},
+ {"SSL_ENABLE_NPN", CURLOPT_SSL_ENABLE_NPN, CURLOT_LONG, 0},
+ {"SSL_FALSESTART", CURLOPT_SSL_FALSESTART, CURLOT_LONG, 0},
+ {"SSL_OPTIONS", CURLOPT_SSL_OPTIONS, CURLOT_VALUES, 0},
+ {"SSL_SESSIONID_CACHE", CURLOPT_SSL_SESSIONID_CACHE, CURLOT_LONG, 0},
+ {"SSL_VERIFYHOST", CURLOPT_SSL_VERIFYHOST, CURLOT_LONG, 0},
+ {"SSL_VERIFYPEER", CURLOPT_SSL_VERIFYPEER, CURLOT_LONG, 0},
+ {"SSL_VERIFYSTATUS", CURLOPT_SSL_VERIFYSTATUS, CURLOT_LONG, 0},
+ {"STDERR", CURLOPT_STDERR, CURLOT_OBJECT, 0},
+ {"STREAM_DEPENDS", CURLOPT_STREAM_DEPENDS, CURLOT_OBJECT, 0},
+ {"STREAM_DEPENDS_E", CURLOPT_STREAM_DEPENDS_E, CURLOT_OBJECT, 0},
+ {"STREAM_WEIGHT", CURLOPT_STREAM_WEIGHT, CURLOT_LONG, 0},
+ {"SUPPRESS_CONNECT_HEADERS", CURLOPT_SUPPRESS_CONNECT_HEADERS,
+ CURLOT_LONG, 0},
+ {"TCP_FASTOPEN", CURLOPT_TCP_FASTOPEN, CURLOT_LONG, 0},
+ {"TCP_KEEPALIVE", CURLOPT_TCP_KEEPALIVE, CURLOT_LONG, 0},
+ {"TCP_KEEPIDLE", CURLOPT_TCP_KEEPIDLE, CURLOT_LONG, 0},
+ {"TCP_KEEPINTVL", CURLOPT_TCP_KEEPINTVL, CURLOT_LONG, 0},
+ {"TCP_NODELAY", CURLOPT_TCP_NODELAY, CURLOT_LONG, 0},
+ {"TELNETOPTIONS", CURLOPT_TELNETOPTIONS, CURLOT_SLIST, 0},
+ {"TFTP_BLKSIZE", CURLOPT_TFTP_BLKSIZE, CURLOT_LONG, 0},
+ {"TFTP_NO_OPTIONS", CURLOPT_TFTP_NO_OPTIONS, CURLOT_LONG, 0},
+ {"TIMECONDITION", CURLOPT_TIMECONDITION, CURLOT_VALUES, 0},
+ {"TIMEOUT", CURLOPT_TIMEOUT, CURLOT_LONG, 0},
+ {"TIMEOUT_MS", CURLOPT_TIMEOUT_MS, CURLOT_LONG, 0},
+ {"TIMEVALUE", CURLOPT_TIMEVALUE, CURLOT_LONG, 0},
+ {"TIMEVALUE_LARGE", CURLOPT_TIMEVALUE_LARGE, CURLOT_OFF_T, 0},
+ {"TLS13_CIPHERS", CURLOPT_TLS13_CIPHERS, CURLOT_STRING, 0},
+ {"TLSAUTH_PASSWORD", CURLOPT_TLSAUTH_PASSWORD, CURLOT_STRING, 0},
+ {"TLSAUTH_TYPE", CURLOPT_TLSAUTH_TYPE, CURLOT_STRING, 0},
+ {"TLSAUTH_USERNAME", CURLOPT_TLSAUTH_USERNAME, CURLOT_STRING, 0},
+ {"TRAILERDATA", CURLOPT_TRAILERDATA, CURLOT_CBPTR, 0},
+ {"TRAILERFUNCTION", CURLOPT_TRAILERFUNCTION, CURLOT_FUNCTION, 0},
+ {"TRANSFERTEXT", CURLOPT_TRANSFERTEXT, CURLOT_LONG, 0},
+ {"TRANSFER_ENCODING", CURLOPT_TRANSFER_ENCODING, CURLOT_LONG, 0},
+ {"UNIX_SOCKET_PATH", CURLOPT_UNIX_SOCKET_PATH, CURLOT_STRING, 0},
+ {"UNRESTRICTED_AUTH", CURLOPT_UNRESTRICTED_AUTH, CURLOT_LONG, 0},
+ {"UPKEEP_INTERVAL_MS", CURLOPT_UPKEEP_INTERVAL_MS, CURLOT_LONG, 0},
+ {"UPLOAD", CURLOPT_UPLOAD, CURLOT_LONG, 0},
+ {"UPLOAD_BUFFERSIZE", CURLOPT_UPLOAD_BUFFERSIZE, CURLOT_LONG, 0},
+ {"URL", CURLOPT_URL, CURLOT_STRING, 0},
+ {"USERAGENT", CURLOPT_USERAGENT, CURLOT_STRING, 0},
+ {"USERNAME", CURLOPT_USERNAME, CURLOT_STRING, 0},
+ {"USERPWD", CURLOPT_USERPWD, CURLOT_STRING, 0},
+ {"USE_SSL", CURLOPT_USE_SSL, CURLOT_VALUES, 0},
+ {"VERBOSE", CURLOPT_VERBOSE, CURLOT_LONG, 0},
+ {"WILDCARDMATCH", CURLOPT_WILDCARDMATCH, CURLOT_LONG, 0},
+ {"WRITEDATA", CURLOPT_WRITEDATA, CURLOT_CBPTR, 0},
+ {"WRITEFUNCTION", CURLOPT_WRITEFUNCTION, CURLOT_FUNCTION, 0},
+ {"WRITEHEADER", CURLOPT_HEADERDATA, CURLOT_CBPTR, CURLOT_FLAG_ALIAS},
+ {"XFERINFODATA", CURLOPT_XFERINFODATA, CURLOT_CBPTR, 0},
+ {"XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION, CURLOT_FUNCTION, 0},
+ {"XOAUTH2_BEARER", CURLOPT_XOAUTH2_BEARER, CURLOT_STRING, 0},
+ {NULL, CURLOPT_LASTENTRY, 0, 0} /* end of table */
+};
+
+#ifdef DEBUGBUILD
+/*
+ * Curl_easyopts_check() is a debug-only function that returns non-zero
+ * if this source file is not in sync with the options listed in curl/curl.h
+ */
+int Curl_easyopts_check(void)
+{
+ return (CURLOPT_LASTENTRY != (298 + 1));
+}
+#endif
diff --git a/lib/easyoptions.h b/lib/easyoptions.h
new file mode 100644
index 000000000..cd8b4100d
--- /dev/null
+++ b/lib/easyoptions.h
@@ -0,0 +1,35 @@
+#ifndef HEADER_CURL_EASYOPTIONS_H
+#define HEADER_CURL_EASYOPTIONS_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* should probably go into the public header */
+
+#include <curl/curl.h>
+
+/* generated table with all easy options */
+extern struct curl_easyoption Curl_easyopts[];
+
+#ifdef DEBUGBUILD
+int Curl_easyopts_check(void);
+#endif
+#endif
diff --git a/lib/escape.c b/lib/escape.c
index 7121db31c..2bea145f4 100644
--- a/lib/escape.c
+++ b/lib/escape.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -79,82 +79,83 @@ char *curl_unescape(const char *string, int length)
char *curl_easy_escape(struct Curl_easy *data, const char *string,
int inlength)
{
- size_t alloc;
- char *ns;
- char *testing_ptr = NULL;
- size_t newlen;
- size_t strindex = 0;
size_t length;
CURLcode result;
+ struct dynbuf d;
if(inlength < 0)
return NULL;
- alloc = (inlength?(size_t)inlength:strlen(string)) + 1;
- newlen = alloc;
+ Curl_dyn_init(&d, CURL_MAX_INPUT_LENGTH);
- ns = malloc(alloc);
- if(!ns)
- return NULL;
+ length = (inlength?(size_t)inlength:strlen(string));
+ if(!length)
+ return strdup("");
- length = alloc-1;
while(length--) {
unsigned char in = *string; /* we need to treat the characters unsigned */
- if(Curl_isunreserved(in))
- /* just copy this */
- ns[strindex++] = in;
+ if(Curl_isunreserved(in)) {
+ /* append this */
+ if(Curl_dyn_addn(&d, &in, 1))
+ return NULL;
+ }
else {
/* encode it */
- newlen += 2; /* the size grows with two, since this'll become a %XX */
- if(newlen > alloc) {
- alloc *= 2;
- testing_ptr = Curl_saferealloc(ns, alloc);
- if(!testing_ptr)
- return NULL;
- ns = testing_ptr;
- }
-
+ char encoded[4];
result = Curl_convert_to_network(data, (char *)&in, 1);
if(result) {
/* Curl_convert_to_network calls failf if unsuccessful */
- free(ns);
+ Curl_dyn_free(&d);
return NULL;
}
- msnprintf(&ns[strindex], 4, "%%%02X", in);
-
- strindex += 3;
+ msnprintf(encoded, sizeof(encoded), "%%%02X", in);
+ if(Curl_dyn_add(&d, encoded))
+ return NULL;
}
string++;
}
- ns[strindex] = 0; /* terminate it */
- return ns;
+
+ return Curl_dyn_ptr(&d);
}
/*
* Curl_urldecode() URL decodes the given string.
*
- * Optionally detects control characters (byte codes lower than 32) in the
- * data and rejects such data.
- *
* Returns a pointer to a malloced string in *ostring with length given in
* *olen. If length == 0, the length is assumed to be strlen(string).
*
* 'data' can be set to NULL but then this function can't convert network
* data to host for non-ascii.
+ *
+ * ctrl options:
+ * - REJECT_NADA: accept everything
+ * - REJECT_CTRL: rejects control characters (byte codes lower than 32) in
+ * the data
+ * - REJECT_ZERO: rejects decoded zero bytes
+ *
+ * The values for the enum starts at 2, to make the assert detect legacy
+ * invokes that used TRUE/FALSE (0 and 1).
*/
+
CURLcode Curl_urldecode(struct Curl_easy *data,
const char *string, size_t length,
char **ostring, size_t *olen,
- bool reject_ctrl)
+ enum urlreject ctrl)
{
- size_t alloc = (length?length:strlen(string)) + 1;
- char *ns = malloc(alloc);
+ size_t alloc;
+ char *ns;
size_t strindex = 0;
unsigned long hex;
CURLcode result = CURLE_OK;
+ DEBUGASSERT(string);
+ DEBUGASSERT(ctrl >= REJECT_NADA); /* crash on TRUE/FALSE */
+
+ alloc = (length?length:strlen(string)) + 1;
+ ns = malloc(alloc);
+
if(!ns)
return CURLE_OUT_OF_MEMORY;
@@ -186,7 +187,8 @@ CURLcode Curl_urldecode(struct Curl_easy *data,
alloc -= 2;
}
- if(reject_ctrl && (in < 0x20)) {
+ if(((ctrl == REJECT_CTRL) && (in < 0x20)) ||
+ ((ctrl == REJECT_ZERO) && (in == 0))) {
free(ns);
return CURLE_URL_MALFORMAT;
}
@@ -220,7 +222,7 @@ char *curl_easy_unescape(struct Curl_easy *data, const char *string,
size_t inputlen = length;
size_t outputlen;
CURLcode res = Curl_urldecode(data, string, inputlen, &str, &outputlen,
- FALSE);
+ REJECT_NADA);
if(res)
return NULL;
diff --git a/lib/escape.h b/lib/escape.h
index d8bbe5cb0..586db7e67 100644
--- a/lib/escape.h
+++ b/lib/escape.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,9 +25,16 @@
* allocated string or NULL if an error occurred. */
bool Curl_isunreserved(unsigned char in);
+
+enum urlreject {
+ REJECT_NADA = 2,
+ REJECT_CTRL,
+ REJECT_ZERO
+};
+
CURLcode Curl_urldecode(struct Curl_easy *data,
const char *string, size_t length,
char **ostring, size_t *olen,
- bool reject_crlf);
+ enum urlreject ctrl);
#endif /* HEADER_CURL_ESCAPE_H */
diff --git a/lib/file.c b/lib/file.c
index d349cd924..1872dfef0 100644
--- a/lib/file.c
+++ b/lib/file.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -67,8 +67,7 @@
#include "curl_memory.h"
#include "memdebug.h"
-#if defined(WIN32) || defined(MSDOS) || defined(__EMX__) || \
- defined(__SYMBIAN32__)
+#if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
#define DOS_FILESYSTEM 1
#endif
@@ -112,6 +111,7 @@ const struct Curl_handler Curl_handler_file = {
ZERO_NULL, /* connection_check */
0, /* defport */
CURLPROTO_FILE, /* protocol */
+ CURLPROTO_FILE, /* family */
PROTOPT_NONETWORK | PROTOPT_NOURLQUERY /* flags */
};
@@ -144,7 +144,7 @@ static CURLcode file_connect(struct connectdata *conn, bool *done)
size_t real_path_len;
CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &real_path,
- &real_path_len, FALSE);
+ &real_path_len, REJECT_ZERO);
if(result)
return result;
diff --git a/lib/file.h b/lib/file.h
index 20828ad4a..f6b74a7f7 100644
--- a/lib/file.h
+++ b/lib/file.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/fileinfo.h b/lib/fileinfo.h
index f4d8f3b90..fdbad8bf2 100644
--- a/lib/fileinfo.h
+++ b/lib/fileinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,7 +27,7 @@
struct fileinfo {
struct curl_fileinfo info;
- struct curl_llist_element list;
+ struct Curl_llist_element list;
};
struct fileinfo *Curl_fileinfo_alloc(void);
diff --git a/lib/firefox-db2pem.sh b/lib/firefox-db2pem.sh
index 454893244..ee820261e 100644
--- a/lib/firefox-db2pem.sh
+++ b/lib/firefox-db2pem.sh
@@ -6,7 +6,7 @@
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
-# * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
diff --git a/lib/formdata.c b/lib/formdata.c
index 429d479da..1cab2c5c2 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -123,11 +123,11 @@ AddHttpPost(char *name, size_t namelength,
* parent_form_info is NULL.
*
***************************************************************************/
-static FormInfo * AddFormInfo(char *value,
- char *contenttype,
- FormInfo *parent_form_info)
+static struct FormInfo *AddFormInfo(char *value,
+ char *contenttype,
+ struct FormInfo *parent_form_info)
{
- FormInfo *form_info;
+ struct FormInfo *form_info;
form_info = calloc(1, sizeof(struct FormInfo));
if(form_info) {
if(value)
@@ -204,7 +204,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
struct curl_httppost **last_post,
va_list params)
{
- FormInfo *first_form, *current_form, *form = NULL;
+ struct FormInfo *first_form, *current_form, *form = NULL;
CURLFORMcode return_value = CURL_FORMADD_OK;
const char *prevtype = NULL;
struct curl_httppost *post = NULL;
@@ -521,7 +521,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
if(CURL_FORMADD_OK != return_value) {
/* On error, free allocated fields for all nodes of the FormInfo linked
list without deallocating nodes. List nodes are deallocated later on */
- FormInfo *ptr;
+ struct FormInfo *ptr;
for(ptr = first_form; ptr != NULL; ptr = ptr->more) {
if(ptr->name_alloc) {
Curl_safefree(ptr->name);
@@ -602,7 +602,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
/* Note that there's small risk that form->name is NULL here if the
app passed in a bad combo, so we better check for that first. */
if(form->name) {
- /* copy name (without strdup; possibly not nul-terminated) */
+ /* copy name (without strdup; possibly not null-terminated) */
form->name = Curl_memdup(form->name, form->namelength?
form->namelength:
strlen(form->name) + 1);
@@ -650,7 +650,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
/* On error, free allocated fields for nodes of the FormInfo linked
list which are not already owned by the httppost linked list
without deallocating nodes. List nodes are deallocated later on */
- FormInfo *ptr;
+ struct FormInfo *ptr;
for(ptr = form; ptr != NULL; ptr = ptr->more) {
if(ptr->name_alloc) {
Curl_safefree(ptr->name);
@@ -676,7 +676,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
fields given that these have either been deallocated or are owned
now by the httppost linked list */
while(first_form) {
- FormInfo *ptr = first_form->more;
+ struct FormInfo *ptr = first_form->more;
free(first_form);
first_form = ptr;
}
@@ -728,14 +728,10 @@ int curl_formget(struct curl_httppost *form, void *arg,
if(!nread)
break;
- switch(nread) {
- default:
- if(append(arg, buffer, nread) != nread)
- result = CURLE_READ_ERROR;
- break;
- case CURL_READFUNC_ABORT:
- case CURL_READFUNC_PAUSE:
- break;
+ if(nread > sizeof(buffer) || append(arg, buffer, nread) != nread) {
+ result = CURLE_READ_ERROR;
+ if(nread == CURL_READFUNC_ABORT)
+ result = CURLE_ABORTED_BY_CALLBACK;
}
}
@@ -775,7 +771,7 @@ void curl_formfree(struct curl_httppost *form)
}
-/* Set mime part name, taking care of non nul-terminated name string. */
+/* Set mime part name, taking care of non null-terminated name string. */
static CURLcode setname(curl_mimepart *part, const char *name, size_t len)
{
char *zname;
diff --git a/lib/formdata.h b/lib/formdata.h
index cb20805f5..3766d38f2 100644
--- a/lib/formdata.h
+++ b/lib/formdata.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,7 +27,7 @@
#ifndef CURL_DISABLE_MIME
/* used by FormAdd for temporary storage */
-typedef struct FormInfo {
+struct FormInfo {
char *name;
bool name_alloc;
size_t namelength;
@@ -45,7 +45,7 @@ typedef struct FormInfo {
char *userp; /* pointer for the read callback */
struct curl_slist *contentheader;
struct FormInfo *more;
-} FormInfo;
+};
CURLcode Curl_getformdata(struct Curl_easy *data,
curl_mimepart *,
diff --git a/lib/ftp.c b/lib/ftp.c
index 8072a33d5..11031da6f 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,12 +55,11 @@
#include "transfer.h"
#include "escape.h"
#include "http.h" /* for HTTP proxy tunnel stuff */
-#include "socks.h"
#include "ftp.h"
#include "fileinfo.h"
#include "ftplistparser.h"
#include "curl_range.h"
-#include "curl_sec.h"
+#include "curl_krb5.h"
#include "strtoofft.h"
#include "strcase.h"
#include "vtls/vtls.h"
@@ -78,6 +77,7 @@
#include "warnless.h"
#include "http_proxy.h"
#include "non-ascii.h"
+#include "socks.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -113,7 +113,7 @@ static CURLcode ftp_parse_url_path(struct connectdata *conn);
static CURLcode ftp_regular_transfer(struct connectdata *conn, bool *done);
#ifndef CURL_DISABLE_VERBOSE_STRINGS
static void ftp_pasv_verbose(struct connectdata *conn,
- Curl_addrinfo *ai,
+ struct Curl_addrinfo *ai,
char *newhost, /* ascii version */
int port);
#endif
@@ -136,15 +136,11 @@ static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks);
static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks);
static CURLcode ftp_doing(struct connectdata *conn,
bool *dophase_done);
-static CURLcode ftp_setup_connection(struct connectdata * conn);
-
+static CURLcode ftp_setup_connection(struct connectdata *conn);
static CURLcode init_wc_data(struct connectdata *conn);
static CURLcode wc_statemach(struct connectdata *conn);
-
static void wc_data_dtor(void *ptr);
-
static CURLcode ftp_state_retr(struct connectdata *conn, curl_off_t filesize);
-
static CURLcode ftp_readresp(curl_socket_t sockfd,
struct pingpong *pp,
int *ftpcode,
@@ -152,12 +148,6 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
static CURLcode ftp_dophase_done(struct connectdata *conn,
bool connected);
-/* easy-to-use macro: */
-#define PPSENDF(x,y,z) result = Curl_pp_sendf(x,y,z); \
- if(result) \
- return result
-
-
/*
* FTP protocol handler.
*/
@@ -180,6 +170,7 @@ const struct Curl_handler Curl_handler_ftp = {
ZERO_NULL, /* connection_check */
PORT_FTP, /* defport */
CURLPROTO_FTP, /* protocol */
+ CURLPROTO_FTP, /* family */
PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD |
PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP |
PROTOPT_WILDCARD /* flags */
@@ -209,6 +200,7 @@ const struct Curl_handler Curl_handler_ftps = {
ZERO_NULL, /* connection_check */
PORT_FTPS, /* defport */
CURLPROTO_FTPS, /* protocol */
+ CURLPROTO_FTP, /* family */
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD /* flags */
};
@@ -221,6 +213,9 @@ static void close_secondarysocket(struct connectdata *conn)
conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD;
}
conn->bits.tcpconnect[SECONDARYSOCKET] = FALSE;
+#ifndef CURL_DISABLE_PROXY
+ conn->bits.proxy_ssl_connected[SECONDARYSOCKET] = FALSE;
+#endif
}
/*
@@ -253,18 +248,6 @@ static void freedirs(struct ftp_conn *ftpc)
Curl_safefree(ftpc->newhost);
}
-/* Returns non-zero if the given string contains CR (\r) or LF (\n),
- which are not allowed within RFC 959 <string>.
- Note: The input string is in the client's encoding which might
- not be ASCII, so escape sequences \r & \n must be used instead
- of hex values 0x0d & 0x0a.
-*/
-static bool isBadFtpString(const char *string)
-{
- return ((NULL != strchr(string, '\r')) ||
- (NULL != strchr(string, '\n'))) ? TRUE : FALSE;
-}
-
/***********************************************************************
*
* AcceptServerConnect()
@@ -303,7 +286,7 @@ static CURLcode AcceptServerConnect(struct connectdata *conn)
conn->sock[SECONDARYSOCKET] = s;
(void)curlx_nonblock(s, TRUE); /* enable non-blocking */
- conn->sock_accepted[SECONDARYSOCKET] = TRUE;
+ conn->bits.sock_accepted = TRUE;
if(data->set.fsockopt) {
int error = 0;
@@ -346,7 +329,7 @@ static timediff_t ftp_timeleft_accept(struct Curl_easy *data)
now = Curl_now();
/* check if the generic timeout possibly is set shorter */
- other = Curl_timeleft(data, &now, FALSE);
+ other = Curl_timeleft(data, &now, FALSE);
if(other && (other < timeout_ms))
/* note that this also works fine for when other happens to be negative
due to it already having elapsed */
@@ -398,7 +381,7 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
if(pp->cache_size && pp->cache && pp->cache[0] > '3') {
/* Data connection could not be established, let's return */
infof(data, "There is negative response in cache while serv connect\n");
- Curl_GetFTPResponse(&nread, conn, &ftpcode);
+ (void)Curl_GetFTPResponse(&nread, conn, &ftpcode);
return CURLE_FTP_ACCEPT_FAILED;
}
@@ -420,7 +403,7 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
}
else if(result & CURL_CSELECT_IN) {
infof(data, "Ctrl conn has data while waiting for data conn\n");
- Curl_GetFTPResponse(&nread, conn, &ftpcode);
+ (void)Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(ftpcode/100 > 3)
return CURLE_FTP_ACCEPT_FAILED;
@@ -644,8 +627,8 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
while(!*ftpcode && !result) {
/* check and reset timeout value every lap */
- time_t timeout = Curl_pp_state_timeout(pp, FALSE);
- time_t interval_ms;
+ timediff_t timeout = Curl_pp_state_timeout(pp, FALSE);
+ timediff_t interval_ms;
if(timeout <= 0) {
failf(data, "FTP response timeout");
@@ -784,26 +767,22 @@ static void _state(struct connectdata *conn,
static CURLcode ftp_state_user(struct connectdata *conn)
{
- CURLcode result;
- struct FTP *ftp = conn->data->req.protop;
- /* send USER */
- PPSENDF(&conn->proto.ftpc.pp, "USER %s", ftp->user?ftp->user:"");
-
- state(conn, FTP_USER);
- conn->data->state.ftp_trying_alternative = FALSE;
-
- return CURLE_OK;
+ CURLcode result = Curl_pp_sendf(&conn->proto.ftpc.pp, "USER %s",
+ conn->user?conn->user:"");
+ if(!result) {
+ state(conn, FTP_USER);
+ conn->data->state.ftp_trying_alternative = FALSE;
+ }
+ return result;
}
static CURLcode ftp_state_pwd(struct connectdata *conn)
{
- CURLcode result;
-
- /* send PWD to discover our entry point */
- PPSENDF(&conn->proto.ftpc.pp, "%s", "PWD");
- state(conn, FTP_PWD);
+ CURLcode result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", "PWD");
+ if(!result)
+ state(conn, FTP_PWD);
- return CURLE_OK;
+ return result;
}
/* For the FTP "protocol connect" and "doing" phases only */
@@ -823,8 +802,12 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
* handle ordinary commands.
*/
+ if(SOCKS_STATE(conn->cnnct.state))
+ return Curl_SOCKS_getsock(conn, socks, SECONDARYSOCKET);
+
if(FTP_STOP == ftpc->state) {
int bits = GETSOCK_READSOCK(0);
+ bool any = FALSE;
/* if stopped and still in this state, then we're also waiting for a
connect on the secondary connection */
@@ -839,10 +822,11 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
socks[s] = conn->tempsock[i];
bits |= GETSOCK_WRITESOCK(s++);
+ any = TRUE;
}
}
}
- else {
+ if(!any) {
socks[1] = conn->sock[SECONDARYSOCKET];
bits |= GETSOCK_WRITESOCK(1) | GETSOCK_READSOCK(1);
}
@@ -886,16 +870,19 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
where we ended up after login: */
ftpc->cwdcount = 0; /* we count this as the first path, then we add one
for all upcoming ones in the ftp->dirs[] array */
- PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->entrypath);
- state(conn, FTP_CWD);
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s", ftpc->entrypath);
+ if(!result)
+ state(conn, FTP_CWD);
}
else {
if(ftpc->dirdepth) {
ftpc->cwdcount = 1;
/* issue the first CWD, the rest is sent when the CWD responses are
received... */
- PPSENDF(&conn->proto.ftpc.pp, "CWD %s", ftpc->dirs[ftpc->cwdcount -1]);
- state(conn, FTP_CWD);
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s",
+ ftpc->dirs[ftpc->cwdcount -1]);
+ if(!result)
+ state(conn, FTP_CWD);
}
else {
/* No CWD necessary */
@@ -920,10 +907,10 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct Curl_easy *data = conn->data;
curl_socket_t portsock = CURL_SOCKET_BAD;
- char myhost[256] = "";
+ char myhost[MAX_IPADR_LEN + 1] = "";
struct Curl_sockaddr_storage ss;
- Curl_addrinfo *res, *ai;
+ struct Curl_addrinfo *res, *ai;
curl_socklen_t sslen;
char hbuf[NI_MAXHOST];
struct sockaddr *sa = (struct sockaddr *)&ss;
@@ -931,9 +918,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
#ifdef ENABLE_IPV6
struct sockaddr_in6 * const sa6 = (void *)sa;
#endif
- char tmp[1024];
static const char mode[][5] = { "EPRT", "PORT" };
- int rc;
+ enum resolve_t rc;
int error;
char *host = NULL;
char *string_ftpport = data->set.str[STRING_FTPPORT];
@@ -1049,6 +1035,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
} /* data->set.ftpport */
if(!host) {
+ const char *r;
/* not an interface and not a host name, get default by extracting
the IP from the control connection */
sslen = sizeof(ss);
@@ -1061,13 +1048,15 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
switch(sa->sa_family) {
#ifdef ENABLE_IPV6
case AF_INET6:
- Curl_inet_ntop(sa->sa_family, &sa6->sin6_addr, hbuf, sizeof(hbuf));
+ r = Curl_inet_ntop(sa->sa_family, &sa6->sin6_addr, hbuf, sizeof(hbuf));
break;
#endif
default:
- Curl_inet_ntop(sa->sa_family, &sa4->sin_addr, hbuf, sizeof(hbuf));
+ r = Curl_inet_ntop(sa->sa_family, &sa4->sin_addr, hbuf, sizeof(hbuf));
break;
}
+ if(!r)
+ return CURLE_FTP_PORT_FAILED;
host = hbuf; /* use this host name */
possibly_non_local = FALSE; /* we know it is local now */
}
@@ -1246,8 +1235,10 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
break;
}
if(PORT == fcmd) {
+ /* large enough for [IP address],[num],[num] */
+ char target[sizeof(myhost) + 20];
char *source = myhost;
- char *dest = tmp;
+ char *dest = target;
/* translate x.x.x.x to x,x,x,x */
while(source && *source) {
@@ -1261,7 +1252,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
*dest = 0;
msnprintf(dest, 20, ",%d,%d", (int)(port>>8), (int)(port&0xff));
- result = Curl_pp_sendf(&ftpc->pp, "%s %s", mode[fcmd], tmp);
+ result = Curl_pp_sendf(&ftpc->pp, "%s %s", mode[fcmd], target);
if(result) {
failf(data, "Failure sending PORT command: %s",
curl_easy_strerror(result));
@@ -1302,7 +1293,7 @@ static CURLcode ftp_state_use_pasv(struct connectdata *conn)
struct ftp_conn *ftpc = &conn->proto.ftpc;
CURLcode result = CURLE_OK;
/*
- Here's the excecutive summary on what to do:
+ Here's the executive summary on what to do:
PASV is RFC959, expect:
227 Entering Passive Mode (a1,a2,a3,a4,p1,p2)
@@ -1327,12 +1318,12 @@ static CURLcode ftp_state_use_pasv(struct connectdata *conn)
modeoff = conn->bits.ftp_use_epsv?0:1;
- PPSENDF(&ftpc->pp, "%s", mode[modeoff]);
-
- ftpc->count1 = modeoff;
- state(conn, FTP_PASV);
- infof(conn->data, "Connect data stream passively\n");
-
+ result = Curl_pp_sendf(&ftpc->pp, "%s", mode[modeoff]);
+ if(!result) {
+ ftpc->count1 = modeoff;
+ state(conn, FTP_PASV);
+ infof(conn->data, "Connect data stream passively\n");
+ }
return result;
}
@@ -1365,23 +1356,23 @@ static CURLcode ftp_state_prepare_transfer(struct connectdata *conn)
if(data->set.ftp_use_pret) {
/* The user has requested that we send a PRET command
to prepare the server for the upcoming PASV */
- if(!conn->proto.ftpc.file) {
- PPSENDF(&conn->proto.ftpc.pp, "PRET %s",
- data->set.str[STRING_CUSTOMREQUEST]?
- data->set.str[STRING_CUSTOMREQUEST]:
- (data->set.ftp_list_only?"NLST":"LIST"));
- }
- else if(data->set.upload) {
- PPSENDF(&conn->proto.ftpc.pp, "PRET STOR %s", conn->proto.ftpc.file);
- }
- else {
- PPSENDF(&conn->proto.ftpc.pp, "PRET RETR %s", conn->proto.ftpc.file);
- }
- state(conn, FTP_PRET);
+ struct ftp_conn *ftpc = &conn->proto.ftpc;
+ if(!conn->proto.ftpc.file)
+ result = Curl_pp_sendf(&ftpc->pp, "PRET %s",
+ data->set.str[STRING_CUSTOMREQUEST]?
+ data->set.str[STRING_CUSTOMREQUEST]:
+ (data->set.ftp_list_only?"NLST":"LIST"));
+ else if(data->set.upload)
+ result = Curl_pp_sendf(&ftpc->pp, "PRET STOR %s",
+ conn->proto.ftpc.file);
+ else
+ result = Curl_pp_sendf(&ftpc->pp, "PRET RETR %s",
+ conn->proto.ftpc.file);
+ if(!result)
+ state(conn, FTP_PRET);
}
- else {
+ else
result = ftp_state_use_pasv(conn);
- }
}
return result;
}
@@ -1397,9 +1388,9 @@ static CURLcode ftp_state_rest(struct connectdata *conn)
/* Determine if server can respond to REST command and therefore
whether it supports range */
- PPSENDF(&conn->proto.ftpc.pp, "REST %d", 0);
-
- state(conn, FTP_REST);
+ result = Curl_pp_sendf(&ftpc->pp, "REST %d", 0);
+ if(!result)
+ state(conn, FTP_REST);
}
else
result = ftp_state_prepare_transfer(conn);
@@ -1417,9 +1408,9 @@ static CURLcode ftp_state_size(struct connectdata *conn)
/* if a "head"-like request is being made (on a file) */
/* we know ftpc->file is a valid pointer to a file name */
- PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
-
- state(conn, FTP_SIZE);
+ result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_SIZE);
}
else
result = ftp_state_rest(conn);
@@ -1453,7 +1444,7 @@ static CURLcode ftp_state_list(struct connectdata *conn)
/* url-decode before evaluation: e.g. paths starting/ending with %2f */
const char *slashPos = NULL;
char *rawPath = NULL;
- result = Curl_urldecode(data, ftp->path, 0, &rawPath, NULL, TRUE);
+ result = Curl_urldecode(data, ftp->path, 0, &rawPath, NULL, REJECT_CTRL);
if(result)
return result;
@@ -1486,10 +1477,8 @@ static CURLcode ftp_state_list(struct connectdata *conn)
result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", cmd);
free(cmd);
- if(result)
- return result;
-
- state(conn, FTP_LIST);
+ if(!result)
+ state(conn, FTP_LIST);
return result;
}
@@ -1550,9 +1539,10 @@ static CURLcode ftp_state_mdtm(struct connectdata *conn)
/* we have requested to get the modified-time of the file, this is a white
spot as the MDTM is not mentioned in RFC959 */
- PPSENDF(&ftpc->pp, "MDTM %s", ftpc->file);
+ result = Curl_pp_sendf(&ftpc->pp, "MDTM %s", ftpc->file);
- state(conn, FTP_MDTM);
+ if(!result)
+ state(conn, FTP_MDTM);
}
else
result = ftp_state_type(conn);
@@ -1588,8 +1578,9 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
if(data->state.resume_from < 0) {
/* Got no given size to start from, figure it out */
- PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
- state(conn, FTP_STOR_SIZE);
+ result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_STOR_SIZE);
return result;
}
@@ -1651,10 +1642,10 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
/* we've passed, proceed as normal */
} /* resume_from */
- PPSENDF(&ftpc->pp, data->set.ftp_append?"APPE %s":"STOR %s",
- ftpc->file);
-
- state(conn, FTP_STOR);
+ result = Curl_pp_sendf(&ftpc->pp, data->set.ftp_append?"APPE %s":"STOR %s",
+ ftpc->file);
+ if(!result)
+ state(conn, FTP_STOR);
return result;
}
@@ -1712,7 +1703,9 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
else
ftpc->count2 = 0; /* failure means cancel operation */
- PPSENDF(&ftpc->pp, "%s", cmd);
+ result = Curl_pp_sendf(&ftpc->pp, "%s", cmd);
+ if(result)
+ return result;
state(conn, instate);
quote = TRUE;
}
@@ -1741,12 +1734,14 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
the server terminates it, otherwise the client stops if the
received byte count exceeds the reported file size. Set option
CURLOPT_IGNORE_CONTENT_LENGTH to 1 to enable this behavior.*/
- PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
- state(conn, FTP_RETR);
+ result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR);
}
else {
- PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
- state(conn, FTP_RETR_SIZE);
+ result = Curl_pp_sendf(&ftpc->pp, "SIZE %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR_SIZE);
}
}
}
@@ -1768,7 +1763,11 @@ static CURLcode ftp_epsv_disable(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
- if(conn->bits.ipv6 && !(conn->bits.tunnel_proxy || conn->bits.socksproxy)) {
+ if(conn->bits.ipv6
+#ifndef CURL_DISABLE_PROXY
+ && !(conn->bits.tunnel_proxy || conn->bits.socksproxy)
+#endif
+ ) {
/* We can't disable EPSV when doing IPv6, so this is instead a fail */
failf(conn->data, "Failed EPSV attempt, exiting\n");
return CURLE_WEIRD_SERVER_REPLY;
@@ -1779,10 +1778,12 @@ static CURLcode ftp_epsv_disable(struct connectdata *conn)
conn->bits.ftp_use_epsv = FALSE;
conn->data->state.errorbuf = FALSE; /* allow error message to get
rewritten */
- PPSENDF(&conn->proto.ftpc.pp, "%s", "PASV");
- conn->proto.ftpc.count1++;
- /* remain in/go to the FTP_PASV state */
- state(conn, FTP_PASV);
+ result = Curl_pp_sendf(&conn->proto.ftpc.pp, "%s", "PASV");
+ if(!result) {
+ conn->proto.ftpc.count1++;
+ /* remain in/go to the FTP_PASV state */
+ state(conn, FTP_PASV);
+ }
return result;
}
@@ -1793,9 +1794,10 @@ static char *control_address(struct connectdata *conn)
If a proxy tunnel is used, returns the original host name instead, because
the effective control connection address is the proxy address,
not the ftp host. */
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.tunnel_proxy || conn->bits.socksproxy)
return conn->host.name;
-
+#endif
return conn->ip_addr_str;
}
@@ -1806,7 +1808,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
CURLcode result;
struct Curl_easy *data = conn->data;
struct Curl_dns_entry *addr = NULL;
- int rc;
+ enum resolve_t rc;
unsigned short connectport; /* the local port connect() should use! */
char *str = &data->state.buffer[4]; /* start on the first letter */
@@ -1860,8 +1862,8 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
else if((ftpc->count1 == 1) &&
(ftpcode == 227)) {
/* positive PASV response */
- unsigned int ip[4];
- unsigned int port[2];
+ unsigned int ip[4] = {0, 0, 0, 0};
+ unsigned int port[2] = {0, 0};
/*
* Scan for a sequence of six comma-separated numbers and use them as
@@ -1912,6 +1914,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
return CURLE_FTP_WEIRD_PASV_REPLY;
}
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.proxy) {
/*
* This connection uses a proxy and we need to connect to the proxy again
@@ -1934,7 +1937,9 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
return CURLE_COULDNT_RESOLVE_PROXY;
}
}
- else {
+ else
+#endif
+ {
/* normal, direct, ftp connection */
rc = Curl_resolv(conn, ftpc->newhost, ftpc->newport, FALSE, &addr);
if(rc == CURLRESOLV_PENDING)
@@ -2039,13 +2044,11 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
&year, &month, &day, &hour, &minute, &second)) {
/* we have a time, reformat it */
char timebuf[24];
- time_t secs = time(NULL);
-
msnprintf(timebuf, sizeof(timebuf),
"%04d%02d%02d %02d:%02d:%02d GMT",
year, month, day, hour, minute, second);
/* now, convert this into a time() value: */
- data->info.filetime = curl_getdate(timebuf, &secs);
+ data->info.filetime = Curl_getdate_capped(timebuf);
}
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2087,7 +2090,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
break;
case 550: /* "No such file or directory" */
failf(data, "Given file does not exist");
- result = CURLE_FTP_COULDNT_RETR_FILE;
+ result = CURLE_REMOTE_FILE_NOT_FOUND;
break;
}
@@ -2224,15 +2227,16 @@ static CURLcode ftp_state_retr(struct connectdata *conn,
infof(data, "Instructs server to resume from offset %"
CURL_FORMAT_CURL_OFF_T "\n", data->state.resume_from);
- PPSENDF(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T,
- data->state.resume_from);
-
- state(conn, FTP_RETR_REST);
+ result = Curl_pp_sendf(&ftpc->pp, "REST %" CURL_FORMAT_CURL_OFF_T,
+ data->state.resume_from);
+ if(!result)
+ state(conn, FTP_RETR_REST);
}
else {
/* no resume */
- PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
- state(conn, FTP_RETR);
+ result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR);
}
return result;
@@ -2267,6 +2271,10 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
(void)curlx_strtoofft(fdigit, NULL, 0, &filesize);
}
+ else if(ftpcode == 550) { /* "No such file or directory" */
+ failf(data, "The file does not exist");
+ return CURLE_REMOTE_FILE_NOT_FOUND;
+ }
if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
@@ -2321,8 +2329,9 @@ static CURLcode ftp_state_rest_resp(struct connectdata *conn,
result = CURLE_FTP_COULDNT_USE_REST;
}
else {
- PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
- state(conn, FTP_RETR);
+ result = Curl_pp_sendf(&ftpc->pp, "RETR %s", ftpc->file);
+ if(!result)
+ state(conn, FTP_RETR);
}
break;
}
@@ -2499,7 +2508,7 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
- if(conn->ssl[FIRSTSOCKET].use) {
+ if(conn->bits.ftp_use_control_ssl) {
/* PBSZ = PROTECTION BUFFER SIZE.
The 'draft-murray-auth-ftp-ssl' (draft 12, page 7) says:
@@ -2514,8 +2523,9 @@ static CURLcode ftp_state_loggedin(struct connectdata *conn)
parameter of '0' to indicate that no buffering is taking place
and the data connection should not be encapsulated.
*/
- PPSENDF(&conn->proto.ftpc.pp, "PBSZ %d", 0);
- state(conn, FTP_PBSZ);
+ result = Curl_pp_sendf(&conn->proto.ftpc.pp, "PBSZ %d", 0);
+ if(!result)
+ state(conn, FTP_PBSZ);
}
else {
result = ftp_state_pwd(conn);
@@ -2530,7 +2540,6 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
{
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
- struct FTP *ftp = data->req.protop;
struct ftp_conn *ftpc = &conn->proto.ftpc;
(void)instate; /* no use for this yet */
@@ -2538,8 +2547,9 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
if((ftpcode == 331) && (ftpc->state == FTP_USER)) {
/* 331 Password required for ...
(the server requires to send the user's password too) */
- PPSENDF(&ftpc->pp, "PASS %s", ftp->passwd?ftp->passwd:"");
- state(conn, FTP_PASS);
+ result = Curl_pp_sendf(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:"");
+ if(!result)
+ state(conn, FTP_PASS);
}
else if(ftpcode/100 == 2) {
/* 230 User ... logged in.
@@ -2548,8 +2558,10 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
}
else if(ftpcode == 332) {
if(data->set.str[STRING_FTP_ACCOUNT]) {
- PPSENDF(&ftpc->pp, "ACCT %s", data->set.str[STRING_FTP_ACCOUNT]);
- state(conn, FTP_ACCT);
+ result = Curl_pp_sendf(&ftpc->pp, "ACCT %s",
+ data->set.str[STRING_FTP_ACCOUNT]);
+ if(!result)
+ state(conn, FTP_ACCT);
}
else {
failf(data, "ACCT requested but none available");
@@ -2565,11 +2577,13 @@ static CURLcode ftp_state_user_resp(struct connectdata *conn,
if(conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER] &&
!conn->data->state.ftp_trying_alternative) {
/* Ok, USER failed. Let's try the supplied command. */
- PPSENDF(&conn->proto.ftpc.pp, "%s",
- conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]);
- conn->data->state.ftp_trying_alternative = TRUE;
- state(conn, FTP_USER);
- result = CURLE_OK;
+ result =
+ Curl_pp_sendf(&ftpc->pp, "%s",
+ conn->data->set.str[STRING_FTP_ALTERNATIVE_TO_USER]);
+ if(!result) {
+ conn->data->state.ftp_trying_alternative = TRUE;
+ state(conn, FTP_USER);
+ }
}
else {
failf(data, "Access denied: %03d", ftpcode);
@@ -2645,11 +2659,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
}
#endif
- if(data->set.use_ssl &&
- (!conn->ssl[FIRSTSOCKET].use ||
- (conn->bits.proxy_ssl_connected[FIRSTSOCKET] &&
- !conn->proxy_ssl[FIRSTSOCKET].use))) {
- /* We don't have a SSL/TLS connection yet, but FTPS is
+ if(data->set.use_ssl && !conn->bits.ftp_use_control_ssl) {
+ /* We don't have a SSL/TLS control connection yet, but FTPS is
requested. Try a FTPS connection now */
ftpc->count3 = 0;
@@ -2668,15 +2679,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
(int)data->set.ftpsslauth);
return CURLE_UNKNOWN_OPTION; /* we don't know what to do */
}
- PPSENDF(&ftpc->pp, "AUTH %s", ftpauth[ftpc->count1]);
- state(conn, FTP_AUTH);
+ result = Curl_pp_sendf(&ftpc->pp, "AUTH %s", ftpauth[ftpc->count1]);
+ if(!result)
+ state(conn, FTP_AUTH);
}
- else {
+ else
result = ftp_state_user(conn);
- if(result)
- return result;
- }
-
break;
case FTP_AUTH:
@@ -2694,6 +2702,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
result = Curl_ssl_connect(conn, FIRSTSOCKET);
if(!result) {
conn->bits.ftp_use_data_ssl = FALSE; /* clear-text data */
+ conn->bits.ftp_use_control_ssl = TRUE; /* SSL on control */
result = ftp_state_user(conn);
}
}
@@ -2711,9 +2720,6 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
/* ignore the failure and continue */
result = ftp_state_user(conn);
}
-
- if(result)
- return result;
break;
case FTP_USER:
@@ -2726,10 +2732,11 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
break;
case FTP_PBSZ:
- PPSENDF(&ftpc->pp, "PROT %c",
- data->set.use_ssl == CURLUSESSL_CONTROL ? 'C' : 'P');
- state(conn, FTP_PROT);
-
+ result =
+ Curl_pp_sendf(&ftpc->pp, "PROT %c",
+ data->set.use_ssl == CURLUSESSL_CONTROL ? 'C' : 'P');
+ if(!result)
+ state(conn, FTP_PROT);
break;
case FTP_PROT:
@@ -2746,14 +2753,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if(data->set.ftp_ccc) {
/* CCC - Clear Command Channel
*/
- PPSENDF(&ftpc->pp, "%s", "CCC");
- state(conn, FTP_CCC);
+ result = Curl_pp_sendf(&ftpc->pp, "%s", "CCC");
+ if(!result)
+ state(conn, FTP_CCC);
}
- else {
+ else
result = ftp_state_pwd(conn);
- if(result)
- return result;
- }
break;
case FTP_CCC:
@@ -2761,16 +2766,12 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
/* First shut down the SSL layer (note: this call will block) */
result = Curl_ssl_shutdown(conn, FIRSTSOCKET);
- if(result) {
+ if(result)
failf(conn->data, "Failed to clear the command channel (CCC)");
- return result;
- }
}
-
- /* Then continue as normal */
- result = ftp_state_pwd(conn);
- if(result)
- return result;
+ if(!result)
+ /* Then continue as normal */
+ result = ftp_state_pwd(conn);
break;
case FTP_PWD:
@@ -2820,7 +2821,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
store++;
ptr++;
}
- *store = '\0'; /* zero terminate */
+ *store = '\0'; /* null-terminate */
}
if(entry_extracted) {
/* If the path name does not look like an absolute path (i.e.: it
@@ -2836,7 +2837,6 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
systems. */
if(!ftpc->server_os && dir[0] != '/') {
-
result = Curl_pp_sendf(&ftpc->pp, "%s", "SYST");
if(result) {
free(dir);
@@ -2884,7 +2884,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
ptr++;
for(store = os; *ptr && *ptr != ' ';)
*store++ = *ptr++;
- *store = '\0'; /* zero terminate */
+ *store = '\0'; /* null-terminate */
/* Check for special servers here. */
@@ -2932,12 +2932,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if((ftpcode >= 400) && !ftpc->count2) {
/* failure response code, and not allowed to fail */
failf(conn->data, "QUOT command failed with %03d", ftpcode);
- return CURLE_QUOTE_ERROR;
+ result = CURLE_QUOTE_ERROR;
}
- result = ftp_state_quote(conn, FALSE, ftpc->state);
- if(result)
- return result;
-
+ else
+ result = ftp_state_quote(conn, FALSE, ftpc->state);
break;
case FTP_CWD:
@@ -2947,29 +2945,28 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
ftpc->cwdcount && !ftpc->count2) {
/* try making it */
ftpc->count2++; /* counter to prevent CWD-MKD loops */
- PPSENDF(&ftpc->pp, "MKD %s", ftpc->dirs[ftpc->cwdcount - 1]);
- state(conn, FTP_MKD);
+ result = Curl_pp_sendf(&ftpc->pp, "MKD %s",
+ ftpc->dirs[ftpc->cwdcount - 1]);
+ if(!result)
+ state(conn, FTP_MKD);
}
else {
/* return failure */
failf(data, "Server denied you to change to the given directory");
ftpc->cwdfail = TRUE; /* don't remember this path as we failed
to enter it */
- return CURLE_REMOTE_ACCESS_DENIED;
+ result = CURLE_REMOTE_ACCESS_DENIED;
}
}
else {
/* success */
ftpc->count2 = 0;
- if(++ftpc->cwdcount <= ftpc->dirdepth) {
+ if(++ftpc->cwdcount <= ftpc->dirdepth)
/* send next CWD */
- PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
- }
- else {
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s",
+ ftpc->dirs[ftpc->cwdcount - 1]);
+ else
result = ftp_state_mdtm(conn);
- if(result)
- return result;
- }
}
break;
@@ -2977,11 +2974,14 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
if((ftpcode/100 != 2) && !ftpc->count3--) {
/* failure to MKD the dir */
failf(data, "Failed to MKD dir: %03d", ftpcode);
- return CURLE_REMOTE_ACCESS_DENIED;
+ result = CURLE_REMOTE_ACCESS_DENIED;
+ }
+ else {
+ state(conn, FTP_CWD);
+ /* send CWD */
+ result = Curl_pp_sendf(&ftpc->pp, "CWD %s",
+ ftpc->dirs[ftpc->cwdcount - 1]);
}
- state(conn, FTP_CWD);
- /* send CWD */
- PPSENDF(&ftpc->pp, "CWD %s", ftpc->dirs[ftpc->cwdcount - 1]);
break;
case FTP_MDTM:
@@ -3084,7 +3084,7 @@ static CURLcode ftp_block_statemach(struct connectdata *conn)
*
*/
static CURLcode ftp_connect(struct connectdata *conn,
- bool *done) /* see description above */
+ bool *done) /* see description above */
{
CURLcode result;
struct ftp_conn *ftpc = &conn->proto.ftpc;
@@ -3105,8 +3105,10 @@ static CURLcode ftp_connect(struct connectdata *conn,
result = Curl_ssl_connect(conn, FIRSTSOCKET);
if(result)
return result;
+ conn->bits.ftp_use_control_ssl = TRUE;
}
+ Curl_pp_setup(pp); /* once per transfer */
Curl_pp_init(pp); /* init the generic pingpong data */
/* When we connect, we start in the state where we await the 220
@@ -3187,7 +3189,8 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
if(!result)
/* get the url-decoded "raw" path */
- result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
+ result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen,
+ REJECT_CTRL);
if(result) {
/* We can limp along anyway (and should try to since we may already be in
* the error path) */
@@ -3261,7 +3264,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
* data has been transferred. This happens when doing through NATs etc that
* abandon old silent connections.
*/
- long old_time = pp->response_time;
+ timediff_t old_time = pp->response_time;
pp->response_time = 60*1000; /* give it only a minute for now */
pp->response = Curl_now(); /* timeout relative now */
@@ -3289,9 +3292,18 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
if(!ftpc->dont_check) {
/* 226 Transfer complete, 250 Requested file action okay, completed. */
- if((ftpcode != 226) && (ftpcode != 250)) {
+ switch(ftpcode) {
+ case 226:
+ case 250:
+ break;
+ case 552:
+ failf(data, "Exceeded storage allocation");
+ result = CURLE_REMOTE_DISK_FULL;
+ break;
+ default:
failf(data, "server did not report OK, got %d", ftpcode);
result = CURLE_PARTIAL_FILE;
+ break;
}
}
}
@@ -3360,17 +3372,17 @@ static
CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
{
struct curl_slist *item;
- ssize_t nread;
- int ftpcode;
- CURLcode result;
struct ftp_conn *ftpc = &conn->proto.ftpc;
struct pingpong *pp = &ftpc->pp;
item = quote;
while(item) {
if(item->data) {
+ ssize_t nread;
char *cmd = item->data;
bool acceptfail = FALSE;
+ CURLcode result;
+ int ftpcode = 0;
/* if a command starts with an asterisk, which a legal FTP command never
can, the command will be allowed to fail without it causing any
@@ -3382,11 +3394,11 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
acceptfail = TRUE;
}
- PPSENDF(&conn->proto.ftpc.pp, "%s", cmd);
-
- pp->response = Curl_now(); /* timeout relative now */
-
- result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
+ result = Curl_pp_sendf(&ftpc->pp, "%s", cmd);
+ if(!result) {
+ pp->response = Curl_now(); /* timeout relative now */
+ result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
+ }
if(result)
return result;
@@ -3434,12 +3446,14 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
return ftp_state_type_resp(conn, 200, newstate);
}
- PPSENDF(&ftpc->pp, "TYPE %c", want);
- state(conn, newstate);
+ result = Curl_pp_sendf(&ftpc->pp, "TYPE %c", want);
+ if(!result) {
+ state(conn, newstate);
- /* keep track of our current transfer type */
- ftpc->transfertype = want;
- return CURLE_OK;
+ /* keep track of our current transfer type */
+ ftpc->transfertype = want;
+ }
+ return result;
}
/***************************************************************************
@@ -3454,7 +3468,7 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
#ifndef CURL_DISABLE_VERBOSE_STRINGS
static void
ftp_pasv_verbose(struct connectdata *conn,
- Curl_addrinfo *ai,
+ struct Curl_addrinfo *ai,
char *newhost, /* ascii version */
int port)
{
@@ -3512,6 +3526,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
}
}
+#ifndef CURL_DISABLE_PROXY
result = Curl_proxy_connect(conn, SECONDARYSOCKET);
if(result)
return result;
@@ -3522,7 +3537,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
Curl_connect_ongoing(conn))
return result;
-
+#endif
if(ftpc->state) {
/* already in a state so skip the initial commands.
@@ -3938,64 +3953,6 @@ static CURLcode ftp_do(struct connectdata *conn, bool *done)
return result;
}
-
-CURLcode Curl_ftpsend(struct connectdata *conn, const char *cmd)
-{
- ssize_t bytes_written;
-#define SBUF_SIZE 1024
- char s[SBUF_SIZE];
- size_t write_len;
- char *sptr = s;
- CURLcode result = CURLE_OK;
-#ifdef HAVE_GSSAPI
- enum protection_level data_sec = conn->data_prot;
-#endif
-
- if(!cmd)
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- write_len = strlen(cmd);
- if(!write_len || write_len > (sizeof(s) -3))
- return CURLE_BAD_FUNCTION_ARGUMENT;
-
- memcpy(&s, cmd, write_len);
- strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */
- write_len += 2;
- bytes_written = 0;
-
- result = Curl_convert_to_network(conn->data, s, write_len);
- /* Curl_convert_to_network calls failf if unsuccessful */
- if(result)
- return result;
-
- for(;;) {
-#ifdef HAVE_GSSAPI
- conn->data_prot = PROT_CMD;
-#endif
- result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len,
- &bytes_written);
-#ifdef HAVE_GSSAPI
- DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
- conn->data_prot = data_sec;
-#endif
-
- if(result)
- break;
-
- if(conn->data->set.verbose)
- Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written);
-
- if(bytes_written != (ssize_t)write_len) {
- write_len -= bytes_written;
- sptr += bytes_written;
- }
- else
- break;
- }
-
- return result;
-}
-
/***********************************************************************
*
* ftp_quit()
@@ -4059,22 +4016,14 @@ static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection)
if(data->state.most_recent_ftp_entrypath == ftpc->entrypath) {
data->state.most_recent_ftp_entrypath = NULL;
}
- free(ftpc->entrypath);
- ftpc->entrypath = NULL;
+ Curl_safefree(ftpc->entrypath);
}
freedirs(ftpc);
- free(ftpc->prevpath);
- ftpc->prevpath = NULL;
- free(ftpc->server_os);
- ftpc->server_os = NULL;
-
+ Curl_safefree(ftpc->prevpath);
+ Curl_safefree(ftpc->server_os);
Curl_pp_disconnect(pp);
-
-#ifdef HAVE_GSSAPI
Curl_sec_end(conn);
-#endif
-
return CURLE_OK;
}
@@ -4102,7 +4051,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
ftpc->cwdfail = FALSE;
/* url-decode ftp path before further evaluation */
- result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, TRUE);
+ result = Curl_urldecode(data, ftp->path, 0, &rawPath, &pathLen, REJECT_CTRL);
if(result)
return result;
@@ -4349,7 +4298,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
char command;
*type = 0; /* it was in the middle of the hostname */
command = Curl_raw_toupper(type[6]);
- conn->bits.type_set = TRUE;
switch(command) {
case 'A': /* ASCII mode */
@@ -4371,18 +4319,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
/* get some initial data into the ftp struct */
ftp->transfer = FTPTRANSFER_BODY;
ftp->downloadsize = 0;
-
- /* No need to duplicate user+password, the connectdata struct won't change
- during a session, but we re-init them here since on subsequent inits
- since the conn struct may have changed or been replaced.
- */
- ftp->user = conn->user;
- ftp->passwd = conn->passwd;
- if(isBadFtpString(ftp->user))
- return CURLE_URL_MALFORMAT;
- if(isBadFtpString(ftp->passwd))
- return CURLE_URL_MALFORMAT;
-
conn->proto.ftpc.known_filesize = -1; /* unknown size for now */
return CURLE_OK;
diff --git a/lib/ftp.h b/lib/ftp.h
index 2c88d568c..dbbdeb7cc 100644
--- a/lib/ftp.h
+++ b/lib/ftp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,7 +31,6 @@ extern const struct Curl_handler Curl_handler_ftp;
extern const struct Curl_handler Curl_handler_ftps;
#endif
-CURLcode Curl_ftpsend(struct connectdata *, const char *cmd);
CURLcode Curl_GetFTPResponse(ssize_t *nread, struct connectdata *conn,
int *ftpcode);
#endif /* CURL_DISABLE_FTP */
@@ -102,8 +101,6 @@ typedef enum {
perhaps the Curl_easy is changed between the times the connection is
used. */
struct FTP {
- char *user; /* user name string */
- char *passwd; /* password string */
char *path; /* points to the urlpieces struct field */
char *pathalloc; /* if non-NULL a pointer to an allocated path */
@@ -152,7 +149,6 @@ struct ftp_conn {
connection to */
char *newhost; /* this is the pair to connect the DATA... */
unsigned short newport; /* connection to */
-
};
#define DEFAULT_ACCEPT_TIMEOUT 60000 /* milliseconds == one minute */
diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c
index f399a4c27..c7b84a9ff 100644
--- a/lib/ftplistparser.c
+++ b/lib/ftplistparser.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -274,7 +274,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata *conn,
curl_fnmatch_callback compare;
struct WildcardData *wc = &conn->data->wildcard;
struct ftp_wc *ftpwc = wc->protdata;
- struct curl_llist *llist = &wc->filelist;
+ struct Curl_llist *llist = &wc->filelist;
struct ftp_parselist_data *parser = ftpwc->parser;
bool add = TRUE;
struct curl_fileinfo *finfo = &infop->info;
@@ -418,8 +418,8 @@ size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb,
finfo->b_data[parser->item_length - 1] = 0;
if(strncmp("total ", finfo->b_data, 6) == 0) {
char *endptr = finfo->b_data + 6;
- /* here we can deal with directory size, pass the leading white
- spaces and then the digits */
+ /* here we can deal with directory size, pass the leading
+ whitespace and then the digits */
while(ISSPACE(*endptr))
endptr++;
while(ISDIGIT(*endptr))
diff --git a/lib/ftplistparser.h b/lib/ftplistparser.h
index 8128887c0..b34ae9b63 100644
--- a/lib/ftplistparser.h
+++ b/lib/ftplistparser.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/getenv.c b/lib/getenv.c
index e444a6a3a..9385b8f67 100644
--- a/lib/getenv.c
+++ b/lib/getenv.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,25 +27,48 @@
#include "memdebug.h"
-static
-char *GetEnv(const char *variable)
+static char *GetEnv(const char *variable)
{
#if defined(_WIN32_WCE) || defined(CURL_WINDOWS_APP)
(void)variable;
return NULL;
-#else
-#ifdef WIN32
- char env[4096];
- char *temp = getenv(variable);
- env[0] = '\0';
- if(temp != NULL)
- ExpandEnvironmentStringsA(temp, env, sizeof(env));
- return (env[0] != '\0')?strdup(env):NULL;
+#elif defined(WIN32)
+ /* This uses Windows API instead of C runtime getenv() to get the environment
+ variable since some changes aren't always visible to the latter. #4774 */
+ char *buf = NULL;
+ char *tmp;
+ DWORD bufsize;
+ DWORD rc = 1;
+ const DWORD max = 32768; /* max env var size from MSCRT source */
+
+ for(;;) {
+ tmp = realloc(buf, rc);
+ if(!tmp) {
+ free(buf);
+ return NULL;
+ }
+
+ buf = tmp;
+ bufsize = rc;
+
+ /* It's possible for rc to be 0 if the variable was found but empty.
+ Since getenv doesn't make that distinction we ignore it as well. */
+ rc = GetEnvironmentVariableA(variable, buf, bufsize);
+ if(!rc || rc == bufsize || rc > max) {
+ free(buf);
+ return NULL;
+ }
+
+ /* if rc < bufsize then rc is bytes written not including null */
+ if(rc < bufsize)
+ return buf;
+
+ /* else rc is bytes needed, try again */
+ }
#else
char *env = getenv(variable);
return (env && env[0])?strdup(env):NULL;
#endif
-#endif
}
char *curl_getenv(const char *v)
diff --git a/lib/getinfo.c b/lib/getinfo.c
index 2b8f2303e..49e79e476 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -78,6 +78,7 @@ CURLcode Curl_initinfo(struct Curl_easy *data)
info->conn_local_ip[0] = '\0';
info->conn_primary_port = 0;
info->conn_local_port = 0;
+ info->retry_after = 0;
info->conn_scheme = 0;
info->conn_protocol = 0;
@@ -95,6 +96,34 @@ static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info,
case CURLINFO_EFFECTIVE_URL:
*param_charp = data->change.url?data->change.url:(char *)"";
break;
+ case CURLINFO_EFFECTIVE_METHOD: {
+ const char *m = data->set.str[STRING_CUSTOMREQUEST];
+ if(!m) {
+ if(data->set.opt_no_body)
+ m = "HEAD";
+ else {
+ switch(data->state.httpreq) {
+ case HTTPREQ_POST:
+ case HTTPREQ_POST_FORM:
+ case HTTPREQ_POST_MIME:
+ m = "POST";
+ break;
+ case HTTPREQ_PUT:
+ m = "PUT";
+ break;
+ default: /* this should never happen */
+ case HTTPREQ_GET:
+ m = "GET";
+ break;
+ case HTTPREQ_HEAD:
+ m = "HEAD";
+ break;
+ }
+ }
+ }
+ *param_charp = m;
+ }
+ break;
case CURLINFO_CONTENT_TYPE:
*param_charp = data->info.contenttype;
break;
@@ -147,6 +176,33 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
long *to_long;
} lptr;
+#ifdef DEBUGBUILD
+ char *timestr = getenv("CURL_TIME");
+ if(timestr) {
+ unsigned long val = strtol(timestr, NULL, 10);
+ switch(info) {
+ case CURLINFO_LOCAL_PORT:
+ *param_longp = (long)val;
+ return CURLE_OK;
+ default:
+ break;
+ }
+ }
+ /* use another variable for this to allow different values */
+ timestr = getenv("CURL_DEBUG_SIZE");
+ if(timestr) {
+ unsigned long val = strtol(timestr, NULL, 10);
+ switch(info) {
+ case CURLINFO_HEADER_SIZE:
+ case CURLINFO_REQUEST_SIZE:
+ *param_longp = (long)val;
+ return CURLE_OK;
+ default:
+ break;
+ }
+ }
+#endif
+
switch(info) {
case CURLINFO_RESPONSE_CODE:
*param_longp = data->info.httpcode;
@@ -171,9 +227,11 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
case CURLINFO_SSL_VERIFYRESULT:
*param_longp = data->set.ssl.certverifyresult;
break;
+#ifndef CURL_DISABLE_PROXY
case CURLINFO_PROXY_SSL_VERIFYRESULT:
*param_longp = data->set.proxy_ssl.certverifyresult;
break;
+#endif
case CURLINFO_REDIRECT_COUNT:
*param_longp = data->set.followlocation;
break;
@@ -211,9 +269,15 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
/* Return the local port of the most recent (primary) connection */
*param_longp = data->info.conn_local_port;
break;
+ case CURLINFO_PROXY_ERROR:
+ *param_longp = (long)data->info.pxcode;
+ break;
case CURLINFO_CONDITION_UNMET:
- /* return if the condition prevented the document to get transferred */
- *param_longp = data->info.timecond ? 1L : 0L;
+ if(data->info.httpcode == 304)
+ *param_longp = 1L;
+ else
+ /* return if the condition prevented the document to get transferred */
+ *param_longp = data->info.timecond ? 1L : 0L;
break;
case CURLINFO_RTSP_CLIENT_CSEQ:
*param_longp = data->state.rtsp_next_client_CSeq;
@@ -258,6 +322,27 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
curl_off_t *param_offt)
{
+#ifdef DEBUGBUILD
+ char *timestr = getenv("CURL_TIME");
+ if(timestr) {
+ unsigned long val = strtol(timestr, NULL, 10);
+ switch(info) {
+ case CURLINFO_TOTAL_TIME_T:
+ case CURLINFO_NAMELOOKUP_TIME_T:
+ case CURLINFO_CONNECT_TIME_T:
+ case CURLINFO_APPCONNECT_TIME_T:
+ case CURLINFO_PRETRANSFER_TIME_T:
+ case CURLINFO_STARTTRANSFER_TIME_T:
+ case CURLINFO_REDIRECT_TIME_T:
+ case CURLINFO_SPEED_DOWNLOAD_T:
+ case CURLINFO_SPEED_UPLOAD_T:
+ *param_offt = (curl_off_t)val;
+ return CURLE_OK;
+ default:
+ break;
+ }
+ }
+#endif
switch(info) {
case CURLINFO_FILETIME_T:
*param_offt = (curl_off_t)data->info.filetime;
@@ -269,7 +354,7 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
*param_offt = data->progress.downloaded;
break;
case CURLINFO_SPEED_DOWNLOAD_T:
- *param_offt = data->progress.dlspeed;
+ *param_offt = data->progress.dlspeed;
break;
case CURLINFO_SPEED_UPLOAD_T:
*param_offt = data->progress.ulspeed;
@@ -282,7 +367,7 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
*param_offt = (data->progress.flags & PGRS_UL_SIZE_KNOWN)?
data->progress.size_ul:-1;
break;
- case CURLINFO_TOTAL_TIME_T:
+ case CURLINFO_TOTAL_TIME_T:
*param_offt = data->progress.timespent;
break;
case CURLINFO_NAMELOOKUP_TIME_T:
@@ -316,6 +401,27 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
static CURLcode getinfo_double(struct Curl_easy *data, CURLINFO info,
double *param_doublep)
{
+#ifdef DEBUGBUILD
+ char *timestr = getenv("CURL_TIME");
+ if(timestr) {
+ unsigned long val = strtol(timestr, NULL, 10);
+ switch(info) {
+ case CURLINFO_TOTAL_TIME:
+ case CURLINFO_NAMELOOKUP_TIME:
+ case CURLINFO_CONNECT_TIME:
+ case CURLINFO_APPCONNECT_TIME:
+ case CURLINFO_PRETRANSFER_TIME:
+ case CURLINFO_STARTTRANSFER_TIME:
+ case CURLINFO_REDIRECT_TIME:
+ case CURLINFO_SPEED_DOWNLOAD:
+ case CURLINFO_SPEED_UPLOAD:
+ *param_doublep = (double)val;
+ return CURLE_OK;
+ default:
+ break;
+ }
+ }
+#endif
switch(info) {
case CURLINFO_TOTAL_TIME:
*param_doublep = DOUBLE_SECS(data->progress.timespent);
@@ -336,13 +442,13 @@ static CURLcode getinfo_double(struct Curl_easy *data, CURLINFO info,
*param_doublep = DOUBLE_SECS(data->progress.t_starttransfer);
break;
case CURLINFO_SIZE_UPLOAD:
- *param_doublep = (double)data->progress.uploaded;
+ *param_doublep = (double)data->progress.uploaded;
break;
case CURLINFO_SIZE_DOWNLOAD:
*param_doublep = (double)data->progress.downloaded;
break;
case CURLINFO_SPEED_DOWNLOAD:
- *param_doublep = (double)data->progress.dlspeed;
+ *param_doublep = (double)data->progress.dlspeed;
break;
case CURLINFO_SPEED_UPLOAD:
*param_doublep = (double)data->progress.ulspeed;
diff --git a/lib/getinfo.h b/lib/getinfo.h
index aecf717f7..8d2af4266 100644
--- a/lib/getinfo.h
+++ b/lib/getinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/gopher.c b/lib/gopher.c
index b296c62d1..ce7413133 100644
--- a/lib/gopher.c
+++ b/lib/gopher.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
#include <curl/curl.h>
#include "transfer.h"
#include "sendf.h"
+#include "connect.h"
#include "progress.h"
#include "gopher.h"
#include "select.h"
@@ -70,6 +71,7 @@ const struct Curl_handler Curl_handler_gopher = {
ZERO_NULL, /* connection_check */
PORT_GOPHER, /* defport */
CURLPROTO_GOPHER, /* protocol */
+ CURLPROTO_GOPHER, /* family */
PROTOPT_NONE /* flags */
};
@@ -83,8 +85,10 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
char *query = data->state.up.query;
char *sel = NULL;
char *sel_org = NULL;
+ timediff_t timeout_ms;
ssize_t amount, k;
size_t len;
+ int what;
*done = TRUE; /* unconditionally */
@@ -113,7 +117,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
newp += 2;
/* ... and finally unescape */
- result = Curl_urldecode(data, newp, 0, &sel, &len, FALSE);
+ result = Curl_urldecode(data, newp, 0, &sel, &len, REJECT_ZERO);
free(gopherpath);
if(result)
return result;
@@ -139,27 +143,35 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
else
break;
+ timeout_ms = Curl_timeleft(conn->data, NULL, FALSE);
+ if(timeout_ms < 0) {
+ result = CURLE_OPERATION_TIMEDOUT;
+ break;
+ }
+ if(!timeout_ms)
+ timeout_ms = TIMEDIFF_T_MAX;
+
/* Don't busyloop. The entire loop thing is a work-around as it causes a
BLOCKING behavior which is a NO-NO. This function should rather be
split up in a do and a doing piece where the pieces that aren't
possible to send now will be sent in the doing function repeatedly
until the entire request is sent.
-
- Wait a while for the socket to be writable. Note that this doesn't
- acknowledge the timeout.
*/
- if(SOCKET_WRITABLE(sockfd, 100) < 0) {
+ what = SOCKET_WRITABLE(sockfd, timeout_ms);
+ if(what < 0) {
result = CURLE_SEND_ERROR;
break;
}
+ else if(!what) {
+ result = CURLE_OPERATION_TIMEDOUT;
+ break;
+ }
}
free(sel_org);
if(!result)
- /* We can use Curl_sendf to send the terminal \r\n relatively safely and
- save allocing another string/doing another _write loop. */
- result = Curl_sendf(sockfd, conn, "\r\n");
+ result = Curl_write(conn, sockfd, "\r\n", 2, &amount);
if(result) {
failf(data, "Failed sending Gopher request");
return result;
diff --git a/lib/gopher.h b/lib/gopher.h
index 501c990a8..dec2557fc 100644
--- a/lib/gopher.h
+++ b/lib/gopher.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/hash.c b/lib/hash.c
index 421d68f76..8c1f6cd0a 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,8 +34,8 @@
static void
hash_element_dtor(void *user, void *element)
{
- struct curl_hash *h = (struct curl_hash *) user;
- struct curl_hash_element *e = (struct curl_hash_element *) element;
+ struct Curl_hash *h = (struct Curl_hash *) user;
+ struct Curl_hash_element *e = (struct Curl_hash_element *) element;
if(e->ptr) {
h->dtor(e->ptr);
@@ -54,11 +54,11 @@ hash_element_dtor(void *user, void *element)
* @unittest: 1603
*/
int
-Curl_hash_init(struct curl_hash *h,
+Curl_hash_init(struct Curl_hash *h,
int slots,
hash_function hfunc,
comp_function comparator,
- curl_hash_dtor dtor)
+ Curl_hash_dtor dtor)
{
if(!slots || !hfunc || !comparator ||!dtor) {
return 1; /* failure */
@@ -70,22 +70,22 @@ Curl_hash_init(struct curl_hash *h,
h->size = 0;
h->slots = slots;
- h->table = malloc(slots * sizeof(struct curl_llist));
+ h->table = malloc(slots * sizeof(struct Curl_llist));
if(h->table) {
int i;
for(i = 0; i < slots; ++i)
- Curl_llist_init(&h->table[i], (curl_llist_dtor) hash_element_dtor);
+ Curl_llist_init(&h->table[i], (Curl_llist_dtor) hash_element_dtor);
return 0; /* fine */
}
h->slots = 0;
return 1; /* failure */
}
-static struct curl_hash_element *
+static struct Curl_hash_element *
mk_hash_element(const void *key, size_t key_len, const void *p)
{
/* allocate the struct plus memory after it to store the key */
- struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element) +
+ struct Curl_hash_element *he = malloc(sizeof(struct Curl_hash_element) +
key_len);
if(he) {
/* copy the key */
@@ -106,14 +106,14 @@ mk_hash_element(const void *key, size_t key_len, const void *p)
* @unittest: 1603
*/
void *
-Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
+Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p)
{
- struct curl_hash_element *he;
- struct curl_llist_element *le;
- struct curl_llist *l = FETCH_LIST(h, key, key_len);
+ struct Curl_hash_element *he;
+ struct Curl_llist_element *le;
+ struct Curl_llist *l = FETCH_LIST(h, key, key_len);
for(le = l->head; le; le = le->next) {
- he = (struct curl_hash_element *) le->ptr;
+ he = (struct Curl_hash_element *) le->ptr;
if(h->comp_func(he->key, he->key_len, key, key_len)) {
Curl_llist_remove(l, le, (void *)h);
--h->size;
@@ -136,13 +136,13 @@ Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
*
* @unittest: 1603
*/
-int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
+int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len)
{
- struct curl_llist_element *le;
- struct curl_llist *l = FETCH_LIST(h, key, key_len);
+ struct Curl_llist_element *le;
+ struct Curl_llist *l = FETCH_LIST(h, key, key_len);
for(le = l->head; le; le = le->next) {
- struct curl_hash_element *he = le->ptr;
+ struct Curl_hash_element *he = le->ptr;
if(h->comp_func(he->key, he->key_len, key, key_len)) {
Curl_llist_remove(l, le, (void *) h);
--h->size;
@@ -157,15 +157,15 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
* @unittest: 1603
*/
void *
-Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
+Curl_hash_pick(struct Curl_hash *h, void *key, size_t key_len)
{
- struct curl_llist_element *le;
- struct curl_llist *l;
+ struct Curl_llist_element *le;
+ struct Curl_llist *l;
if(h) {
l = FETCH_LIST(h, key, key_len);
for(le = l->head; le; le = le->next) {
- struct curl_hash_element *he = le->ptr;
+ struct Curl_hash_element *he = le->ptr;
if(h->comp_func(he->key, he->key_len, key, key_len)) {
return he->ptr;
}
@@ -177,17 +177,17 @@ Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
#if defined(DEBUGBUILD) && defined(AGGRESIVE_TEST)
void
-Curl_hash_apply(curl_hash *h, void *user,
+Curl_hash_apply(Curl_hash *h, void *user,
void (*cb)(void *user, void *ptr))
{
- struct curl_llist_element *le;
+ struct Curl_llist_element *le;
int i;
for(i = 0; i < h->slots; ++i) {
for(le = (h->table[i])->head;
le;
le = le->next) {
- curl_hash_element *el = le->ptr;
+ Curl_hash_element *el = le->ptr;
cb(user, el->ptr);
}
}
@@ -202,7 +202,7 @@ Curl_hash_apply(curl_hash *h, void *user,
* @unittest: 1603
*/
void
-Curl_hash_destroy(struct curl_hash *h)
+Curl_hash_destroy(struct Curl_hash *h)
{
int i;
@@ -220,19 +220,19 @@ Curl_hash_destroy(struct curl_hash *h)
* @unittest: 1602
*/
void
-Curl_hash_clean(struct curl_hash *h)
+Curl_hash_clean(struct Curl_hash *h)
{
Curl_hash_clean_with_criterium(h, NULL, NULL);
}
/* Cleans all entries that pass the comp function criteria. */
void
-Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
+Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user,
int (*comp)(void *, void *))
{
- struct curl_llist_element *le;
- struct curl_llist_element *lnext;
- struct curl_llist *list;
+ struct Curl_llist_element *le;
+ struct Curl_llist_element *lnext;
+ struct Curl_llist *list;
int i;
if(!h)
@@ -242,7 +242,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
list = &h->table[i];
le = list->head; /* get first list entry */
while(le) {
- struct curl_hash_element *he = le->ptr;
+ struct Curl_hash_element *he = le->ptr;
lnext = le->next;
/* ask the callback function if we shall remove this entry or not */
if(comp == NULL || comp(user, he->ptr)) {
@@ -277,18 +277,18 @@ size_t Curl_str_key_compare(void *k1, size_t key1_len,
return 0;
}
-void Curl_hash_start_iterate(struct curl_hash *hash,
- struct curl_hash_iterator *iter)
+void Curl_hash_start_iterate(struct Curl_hash *hash,
+ struct Curl_hash_iterator *iter)
{
iter->hash = hash;
iter->slot_index = 0;
iter->current_element = NULL;
}
-struct curl_hash_element *
-Curl_hash_next_element(struct curl_hash_iterator *iter)
+struct Curl_hash_element *
+Curl_hash_next_element(struct Curl_hash_iterator *iter)
{
- struct curl_hash *h = iter->hash;
+ struct Curl_hash *h = iter->hash;
/* Get the next element in the current list, if any */
if(iter->current_element)
@@ -307,7 +307,7 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
}
if(iter->current_element) {
- struct curl_hash_element *he = iter->current_element->ptr;
+ struct Curl_hash_element *he = iter->current_element->ptr;
return he;
}
iter->current_element = NULL;
@@ -315,11 +315,11 @@ Curl_hash_next_element(struct curl_hash_iterator *iter)
}
#if 0 /* useful function for debugging hashes and their contents */
-void Curl_hash_print(struct curl_hash *h,
+void Curl_hash_print(struct Curl_hash *h,
void (*func)(void *))
{
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
int last_index = -1;
if(!h)
diff --git a/lib/hash.h b/lib/hash.h
index 558d0f47c..eb5104b85 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -41,59 +41,59 @@ typedef size_t (*comp_function) (void *key1,
void *key2,
size_t key2_len);
-typedef void (*curl_hash_dtor)(void *);
+typedef void (*Curl_hash_dtor)(void *);
-struct curl_hash {
- struct curl_llist *table;
+struct Curl_hash {
+ struct Curl_llist *table;
/* Hash function to be used for this hash table */
hash_function hash_func;
/* Comparator function to compare keys */
comp_function comp_func;
- curl_hash_dtor dtor;
+ Curl_hash_dtor dtor;
int slots;
size_t size;
};
-struct curl_hash_element {
- struct curl_llist_element list;
+struct Curl_hash_element {
+ struct Curl_llist_element list;
void *ptr;
size_t key_len;
char key[1]; /* allocated memory following the struct */
};
-struct curl_hash_iterator {
- struct curl_hash *hash;
+struct Curl_hash_iterator {
+ struct Curl_hash *hash;
int slot_index;
- struct curl_llist_element *current_element;
+ struct Curl_llist_element *current_element;
};
-int Curl_hash_init(struct curl_hash *h,
+int Curl_hash_init(struct Curl_hash *h,
int slots,
hash_function hfunc,
comp_function comparator,
- curl_hash_dtor dtor);
+ Curl_hash_dtor dtor);
-void *Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p);
-int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len);
-void *Curl_hash_pick(struct curl_hash *, void *key, size_t key_len);
-void Curl_hash_apply(struct curl_hash *h, void *user,
+void *Curl_hash_add(struct Curl_hash *h, void *key, size_t key_len, void *p);
+int Curl_hash_delete(struct Curl_hash *h, void *key, size_t key_len);
+void *Curl_hash_pick(struct Curl_hash *, void *key, size_t key_len);
+void Curl_hash_apply(struct Curl_hash *h, void *user,
void (*cb)(void *user, void *ptr));
#define Curl_hash_count(h) ((h)->size)
-void Curl_hash_destroy(struct curl_hash *h);
-void Curl_hash_clean(struct curl_hash *h);
-void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
+void Curl_hash_destroy(struct Curl_hash *h);
+void Curl_hash_clean(struct Curl_hash *h);
+void Curl_hash_clean_with_criterium(struct Curl_hash *h, void *user,
int (*comp)(void *, void *));
size_t Curl_hash_str(void *key, size_t key_length, size_t slots_num);
size_t Curl_str_key_compare(void *k1, size_t key1_len, void *k2,
size_t key2_len);
-void Curl_hash_start_iterate(struct curl_hash *hash,
- struct curl_hash_iterator *iter);
-struct curl_hash_element *
-Curl_hash_next_element(struct curl_hash_iterator *iter);
+void Curl_hash_start_iterate(struct Curl_hash *hash,
+ struct Curl_hash_iterator *iter);
+struct Curl_hash_element *
+Curl_hash_next_element(struct Curl_hash_iterator *iter);
-void Curl_hash_print(struct curl_hash *h,
+void Curl_hash_print(struct Curl_hash *h,
void (*func)(void *));
diff --git a/lib/hmac.c b/lib/hmac.c
index bf49ebec5..e4fea8a50 100644
--- a/lib/hmac.c
+++ b/lib/hmac.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,6 +30,7 @@
#include "curl_hmac.h"
#include "curl_memory.h"
+#include "warnless.h"
/* The last #include file should be: */
#include "memdebug.h"
@@ -47,13 +48,13 @@ static const unsigned char hmac_opad = 0x5C;
-HMAC_context *
-Curl_HMAC_init(const HMAC_params * hashparams,
+struct HMAC_context *
+Curl_HMAC_init(const struct HMAC_params *hashparams,
const unsigned char *key,
unsigned int keylen)
{
size_t i;
- HMAC_context *ctxt;
+ struct HMAC_context *ctxt;
unsigned char *hkey;
unsigned char b;
@@ -100,7 +101,7 @@ Curl_HMAC_init(const HMAC_params * hashparams,
return ctxt;
}
-int Curl_HMAC_update(HMAC_context * ctxt,
+int Curl_HMAC_update(struct HMAC_context *ctxt,
const unsigned char *data,
unsigned int len)
{
@@ -110,9 +111,9 @@ int Curl_HMAC_update(HMAC_context * ctxt,
}
-int Curl_HMAC_final(HMAC_context *ctxt, unsigned char *result)
+int Curl_HMAC_final(struct HMAC_context *ctxt, unsigned char *result)
{
- const HMAC_params * hashparams = ctxt->hmac_hash;
+ const struct HMAC_params *hashparams = ctxt->hmac_hash;
/* Do not get result if called with a null parameter: only release
storage. */
@@ -129,4 +130,41 @@ int Curl_HMAC_final(HMAC_context *ctxt, unsigned char *result)
return 0;
}
+/*
+ * Curl_hmacit()
+ *
+ * This is used to generate a HMAC hash, for the specified input data, given
+ * the specified hash function and key.
+ *
+ * Parameters:
+ *
+ * hashparams [in] - The hash function (Curl_HMAC_MD5).
+ * key [in] - The key to use.
+ * keylen [in] - The length of the key.
+ * data [in] - The data to encrypt.
+ * datalen [in] - The length of the data.
+ * output [in/out] - The output buffer.
+ *
+ * Returns CURLE_OK on success.
+ */
+CURLcode Curl_hmacit(const struct HMAC_params *hashparams,
+ const unsigned char *key, const size_t keylen,
+ const unsigned char *data, const size_t datalen,
+ unsigned char *output)
+{
+ struct HMAC_context *ctxt =
+ Curl_HMAC_init(hashparams, key, curlx_uztoui(keylen));
+
+ if(!ctxt)
+ return CURLE_OUT_OF_MEMORY;
+
+ /* Update the digest with the given challenge */
+ Curl_HMAC_update(ctxt, data, curlx_uztoui(datalen));
+
+ /* Finalise the digest */
+ Curl_HMAC_final(ctxt, output);
+
+ return CURLE_OK;
+}
+
#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/lib/hostasyn.c b/lib/hostasyn.c
index 99d872b35..ed9190f4c 100644
--- a/lib/hostasyn.c
+++ b/lib/hostasyn.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -117,10 +117,10 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn,
* name resolve layers (selected at build-time). They all take this same set
* of arguments
*/
-Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
return Curl_resolver_getaddrinfo(conn, hostname, port, waitp);
}
diff --git a/lib/hostcheck.h b/lib/hostcheck.h
index f562df9ae..9c180856a 100644
--- a/lib/hostcheck.h
+++ b/lib/hostcheck.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/hostip.c b/lib/hostip.c
index d4e8f9366..57c8bd3d8 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,6 +59,7 @@
#include "strerror.h"
#include "url.h"
#include "inet_ntop.h"
+#include "inet_pton.h"
#include "multiif.h"
#include "doh.h"
#include "warnless.h"
@@ -119,7 +120,7 @@ static void freednsentry(void *freethis);
/*
* Return # of addresses in a Curl_addrinfo struct
*/
-int Curl_num_addresses(const Curl_addrinfo *addr)
+int Curl_num_addresses(const struct Curl_addrinfo *addr)
{
int i = 0;
while(addr) {
@@ -130,39 +131,36 @@ int Curl_num_addresses(const Curl_addrinfo *addr)
}
/*
- * Curl_printable_address() returns a printable version of the 1st address
+ * Curl_printable_address() stores a printable version of the 1st address
* given in the 'ai' argument. The result will be stored in the buf that is
* bufsize bytes big.
*
- * If the conversion fails, it returns NULL.
+ * If the conversion fails, the target buffer is empty.
*/
-const char *
-Curl_printable_address(const Curl_addrinfo *ai, char *buf, size_t bufsize)
+void Curl_printable_address(const struct Curl_addrinfo *ai, char *buf,
+ size_t bufsize)
{
- const struct sockaddr_in *sa4;
- const struct in_addr *ipaddr4;
-#ifdef ENABLE_IPV6
- const struct sockaddr_in6 *sa6;
- const struct in6_addr *ipaddr6;
-#endif
+ DEBUGASSERT(bufsize);
+ buf[0] = 0;
switch(ai->ai_family) {
- case AF_INET:
- sa4 = (const void *)ai->ai_addr;
- ipaddr4 = &sa4->sin_addr;
- return Curl_inet_ntop(ai->ai_family, (const void *)ipaddr4, buf,
- bufsize);
+ case AF_INET: {
+ const struct sockaddr_in *sa4 = (const void *)ai->ai_addr;
+ const struct in_addr *ipaddr4 = &sa4->sin_addr;
+ (void)Curl_inet_ntop(ai->ai_family, (const void *)ipaddr4, buf, bufsize);
+ break;
+ }
#ifdef ENABLE_IPV6
- case AF_INET6:
- sa6 = (const void *)ai->ai_addr;
- ipaddr6 = &sa6->sin6_addr;
- return Curl_inet_ntop(ai->ai_family, (const void *)ipaddr6, buf,
- bufsize);
+ case AF_INET6: {
+ const struct sockaddr_in6 *sa6 = (const void *)ai->ai_addr;
+ const struct in6_addr *ipaddr6 = &sa6->sin6_addr;
+ (void)Curl_inet_ntop(ai->ai_family, (const void *)ipaddr6, buf, bufsize);
+ break;
+ }
#endif
- default:
- break;
+ default:
+ break;
}
- return NULL;
}
/*
@@ -208,7 +206,7 @@ hostcache_timestamp_remove(void *datap, void *hc)
* Prune the DNS cache. This assumes that a lock has already been taken.
*/
static void
-hostcache_prune(struct curl_hash *hostcache, long cache_timeout, time_t now)
+hostcache_prune(struct Curl_hash *hostcache, long cache_timeout, time_t now)
{
struct hostcache_prune_data user;
@@ -336,7 +334,7 @@ Curl_fetch_addr(struct connectdata *conn,
#ifndef CURL_DISABLE_SHUFFLE_DNS
UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
- Curl_addrinfo **addr);
+ struct Curl_addrinfo **addr);
/*
* Curl_shuffle_addr() shuffles the order of addresses in a 'Curl_addrinfo'
* struct by re-linking its linked list.
@@ -350,13 +348,13 @@ UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
* @unittest: 1608
*/
UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
- Curl_addrinfo **addr)
+ struct Curl_addrinfo **addr)
{
CURLcode result = CURLE_OK;
const int num_addrs = Curl_num_addresses(*addr);
if(num_addrs > 1) {
- Curl_addrinfo **nodes;
+ struct Curl_addrinfo **nodes;
infof(data, "Shuffling %i addresses", num_addrs);
nodes = malloc(num_addrs*sizeof(*nodes));
@@ -375,7 +373,7 @@ UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
if(rnd) {
/* Fisher-Yates shuffle */
if(Curl_rand(data, (unsigned char *)rnd, rnd_size) == CURLE_OK) {
- Curl_addrinfo *swap_tmp;
+ struct Curl_addrinfo *swap_tmp;
for(i = num_addrs - 1; i > 0; i--) {
swap_tmp = nodes[rnd[i] % (i + 1)];
nodes[rnd[i] % (i + 1)] = nodes[i];
@@ -414,7 +412,7 @@ UNITTEST CURLcode Curl_shuffle_addr(struct Curl_easy *data,
*/
struct Curl_dns_entry *
Curl_cache_addr(struct Curl_easy *data,
- Curl_addrinfo *addr,
+ struct Curl_addrinfo *addr,
const char *hostname,
int port)
{
@@ -482,18 +480,19 @@ Curl_cache_addr(struct Curl_easy *data,
* CURLRESOLV_PENDING (1) = waiting for response, no pointer
*/
-int Curl_resolv(struct connectdata *conn,
- const char *hostname,
- int port,
- bool allowDOH,
- struct Curl_dns_entry **entry)
+enum resolve_t Curl_resolv(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ bool allowDOH,
+ struct Curl_dns_entry **entry)
{
struct Curl_dns_entry *dns = NULL;
struct Curl_easy *data = conn->data;
CURLcode result;
- int rc = CURLRESOLV_ERROR; /* default to failure */
+ enum resolve_t rc = CURLRESOLV_ERROR; /* default to failure */
*entry = NULL;
+ conn->bits.doh = FALSE; /* default is not */
if(data->share)
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
@@ -512,13 +511,13 @@ int Curl_resolv(struct connectdata *conn,
if(!dns) {
/* The entry was not in the cache. Resolve it to IP address */
- Curl_addrinfo *addr;
+ struct Curl_addrinfo *addr = NULL;
int respwait = 0;
-
- /* Check what IP specifics the app has requested and if we can provide it.
- * If not, bail out. */
- if(!Curl_ipvalid(conn))
- return CURLRESOLV_ERROR;
+ struct in_addr in;
+#ifndef USE_RESOLVE_ON_IPS
+ const
+#endif
+ bool ipnum = FALSE;
/* notify the resolver start callback */
if(data->set.resolver_start) {
@@ -531,20 +530,59 @@ int Curl_resolv(struct connectdata *conn,
return CURLRESOLV_ERROR;
}
- if(allowDOH && data->set.doh) {
- addr = Curl_doh(conn, hostname, port, &respwait);
+#ifndef USE_RESOLVE_ON_IPS
+ /* First check if this is an IPv4 address string */
+ if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
+ /* This is a dotted IP address 123.123.123.123-style */
+ addr = Curl_ip2addr(AF_INET, &in, hostname, port);
+#ifdef ENABLE_IPV6
+ if(!addr) {
+ struct in6_addr in6;
+ /* check if this is an IPv6 address string */
+ if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
+ /* This is an IPv6 address literal */
+ addr = Curl_ip2addr(AF_INET6, &in6, hostname, port);
}
+#endif /* ENABLE_IPV6 */
+
+#else /* if USE_RESOLVE_ON_IPS */
+ /* First check if this is an IPv4 address string */
+ if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
+ /* This is a dotted IP address 123.123.123.123-style */
+ ipnum = TRUE;
+#ifdef ENABLE_IPV6
else {
- /* If Curl_getaddrinfo() returns NULL, 'respwait' might be set to a
- non-zero value indicating that we need to wait for the response to the
- resolve call */
- addr = Curl_getaddrinfo(conn,
+ struct in6_addr in6;
+ /* check if this is an IPv6 address string */
+ if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0)
+ /* This is an IPv6 address literal */
+ ipnum = TRUE;
+ }
+#endif /* ENABLE_IPV6 */
+
+#endif /* !USE_RESOLVE_ON_IPS */
+
+ if(!addr) {
+ /* Check what IP specifics the app has requested and if we can provide
+ * it. If not, bail out. */
+ if(!Curl_ipvalid(conn))
+ return CURLRESOLV_ERROR;
+
+ if(allowDOH && data->set.doh && !ipnum) {
+ addr = Curl_doh(conn, hostname, port, &respwait);
+ }
+ else {
+ /* If Curl_getaddrinfo() returns NULL, 'respwait' might be set to a
+ non-zero value indicating that we need to wait for the response to
+ the resolve call */
+ addr = Curl_getaddrinfo(conn,
#ifdef DEBUGBUILD
- (data->set.str[STRING_DEVICE]
- && !strcmp(data->set.str[STRING_DEVICE],
- "LocalHost"))?"localhost":
+ (data->set.str[STRING_DEVICE]
+ && !strcmp(data->set.str[STRING_DEVICE],
+ "LocalHost"))?"localhost":
#endif
- hostname, port, &respwait);
+ hostname, port, &respwait);
+ }
}
if(!addr) {
if(respwait) {
@@ -620,11 +658,11 @@ RETSIGTYPE alarmfunc(int sig)
* CURLRESOLV_PENDING (1) = waiting for response, no pointer
*/
-int Curl_resolv_timeout(struct connectdata *conn,
- const char *hostname,
- int port,
- struct Curl_dns_entry **entry,
- timediff_t timeoutms)
+enum resolve_t Curl_resolv_timeout(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ struct Curl_dns_entry **entry,
+ timediff_t timeoutms)
{
#ifdef USE_ALARM_TIMEOUT
#ifdef HAVE_SIGACTION
@@ -640,7 +678,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
volatile unsigned int prev_alarm = 0;
struct Curl_easy *data = conn->data;
#endif /* USE_ALARM_TIMEOUT */
- int rc;
+ enum resolve_t rc;
*entry = NULL;
@@ -805,7 +843,7 @@ static void freednsentry(void *freethis)
/*
* Curl_mk_dnscache() inits a new DNS cache and returns success/failure.
*/
-int Curl_mk_dnscache(struct curl_hash *hash)
+int Curl_mk_dnscache(struct Curl_hash *hash)
{
return Curl_hash_init(hash, 7, Curl_hash_str, Curl_str_key_compare,
freednsentry);
@@ -819,7 +857,7 @@ int Curl_mk_dnscache(struct curl_hash *hash)
*/
void Curl_hostcache_clean(struct Curl_easy *data,
- struct curl_hash *hash)
+ struct Curl_hash *hash)
{
if(data && data->share)
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
@@ -868,7 +906,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
}
else {
struct Curl_dns_entry *dns;
- Curl_addrinfo *head = NULL, *tail = NULL;
+ struct Curl_addrinfo *head = NULL, *tail = NULL;
size_t entry_len;
char address[64];
#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
@@ -902,7 +940,7 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
while(*end_ptr) {
size_t alen;
- Curl_addrinfo *ai;
+ struct Curl_addrinfo *ai;
addr_begin = end_ptr + 1;
addr_end = strchr(addr_begin, ',');
@@ -1021,7 +1059,11 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
CURLcode Curl_resolv_check(struct connectdata *conn,
struct Curl_dns_entry **dns)
{
- if(conn->data->set.doh)
+#if defined(CURL_DISABLE_DOH) && !defined(CURLRES_ASYNCH)
+ (void)dns;
+#endif
+
+ if(conn->bits.doh)
return Curl_doh_is_resolved(conn, dns);
return Curl_resolver_is_resolved(conn, dns);
}
@@ -1030,7 +1072,7 @@ int Curl_resolv_getsock(struct connectdata *conn,
curl_socket_t *socks)
{
#ifdef CURLRES_ASYNCH
- if(conn->data->set.doh)
+ if(conn->bits.doh)
/* nothing to wait for during DOH resolve, those handles have their own
sockets */
return GETSOCK_BLANK;
@@ -1059,10 +1101,12 @@ CURLcode Curl_once_resolved(struct connectdata *conn,
result = Curl_setup_conn(conn, protocol_done);
- if(result)
- /* We're not allowed to return failure with memory left allocated
- in the connectdata struct, free those here */
- Curl_disconnect(conn->data, conn, TRUE); /* close the connection */
-
+ if(result) {
+ struct Curl_easy *data = conn->data;
+ DEBUGASSERT(data);
+ Curl_detach_connnection(data);
+ Curl_conncache_remove_conn(data, conn, TRUE);
+ Curl_disconnect(data, conn, TRUE);
+ }
return result;
}
diff --git a/lib/hostip.h b/lib/hostip.h
index e0597ea96..fb782d563 100644
--- a/lib/hostip.h
+++ b/lib/hostip.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,12 +59,12 @@ struct connectdata;
* Global DNS cache is general badness. Do not use. This will be removed in
* a future version. Use the share interface instead!
*
- * Returns a struct curl_hash pointer on success, NULL on failure.
+ * Returns a struct Curl_hash pointer on success, NULL on failure.
*/
-struct curl_hash *Curl_global_host_cache_init(void);
+struct Curl_hash *Curl_global_host_cache_init(void);
struct Curl_dns_entry {
- Curl_addrinfo *addr;
+ struct Curl_addrinfo *addr;
/* timestamp == 0 -- CURLOPT_RESOLVE entry, doesn't timeout */
time_t timestamp;
/* use-counter, use Curl_resolv_unlock to release reference */
@@ -79,26 +79,29 @@ struct Curl_dns_entry {
* use, or we'll leak memory!
*/
/* return codes */
-#define CURLRESOLV_TIMEDOUT -2
-#define CURLRESOLV_ERROR -1
-#define CURLRESOLV_RESOLVED 0
-#define CURLRESOLV_PENDING 1
-int Curl_resolv(struct connectdata *conn,
- const char *hostname,
- int port,
- bool allowDOH,
- struct Curl_dns_entry **dnsentry);
-int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
- int port, struct Curl_dns_entry **dnsentry,
- timediff_t timeoutms);
+enum resolve_t {
+ CURLRESOLV_TIMEDOUT = -2,
+ CURLRESOLV_ERROR = -1,
+ CURLRESOLV_RESOLVED = 0,
+ CURLRESOLV_PENDING = 1
+};
+enum resolve_t Curl_resolv(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ bool allowDOH,
+ struct Curl_dns_entry **dnsentry);
+enum resolve_t Curl_resolv_timeout(struct connectdata *conn,
+ const char *hostname, int port,
+ struct Curl_dns_entry **dnsentry,
+ timediff_t timeoutms);
#ifdef CURLRES_IPV6
/*
* Curl_ipv6works() returns TRUE if IPv6 seems to work.
*/
-bool Curl_ipv6works(void);
+bool Curl_ipv6works(struct connectdata *conn);
#else
-#define Curl_ipv6works() FALSE
+#define Curl_ipv6works(x) FALSE
#endif
/*
@@ -114,10 +117,10 @@ bool Curl_ipvalid(struct connectdata *conn);
* name resolve layers (selected at build-time). They all take this same set
* of arguments
*/
-Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp);
+struct Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp);
/* unlock a previously resolved dns entry */
@@ -125,13 +128,13 @@ void Curl_resolv_unlock(struct Curl_easy *data,
struct Curl_dns_entry *dns);
/* init a new dns cache and return success */
-int Curl_mk_dnscache(struct curl_hash *hash);
+int Curl_mk_dnscache(struct Curl_hash *hash);
/* prune old entries from the DNS cache */
void Curl_hostcache_prune(struct Curl_easy *data);
/* Return # of addresses in a Curl_addrinfo struct */
-int Curl_num_addresses(const Curl_addrinfo *addr);
+int Curl_num_addresses(const struct Curl_addrinfo *addr);
#if defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO)
int curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa,
@@ -143,7 +146,7 @@ int curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa,
#endif
/* IPv4 threadsafe resolve function used for synch and asynch builds */
-Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname, int port);
+struct Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname, int port);
CURLcode Curl_once_resolved(struct connectdata *conn, bool *protocol_connect);
@@ -155,15 +158,15 @@ CURLcode Curl_once_resolved(struct connectdata *conn, bool *protocol_connect);
*/
CURLcode Curl_addrinfo_callback(struct connectdata *conn,
int status,
- Curl_addrinfo *ai);
+ struct Curl_addrinfo *ai);
/*
* Curl_printable_address() returns a printable version of the 1st address
* given in the 'ip' argument. The result will be stored in the buf that is
* bufsize bytes big.
*/
-const char *Curl_printable_address(const Curl_addrinfo *ip,
- char *buf, size_t bufsize);
+void Curl_printable_address(const struct Curl_addrinfo *ip,
+ char *buf, size_t bufsize);
/*
* Curl_fetch_addr() fetches a 'Curl_dns_entry' already in the DNS cache.
@@ -184,7 +187,7 @@ Curl_fetch_addr(struct connectdata *conn,
* Returns the Curl_dns_entry entry pointer or NULL if the storage failed.
*/
struct Curl_dns_entry *
-Curl_cache_addr(struct Curl_easy *data, Curl_addrinfo *addr,
+Curl_cache_addr(struct Curl_easy *data, struct Curl_addrinfo *addr,
const char *hostname, int port);
#ifndef INADDR_NONE
@@ -231,7 +234,7 @@ CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data,
/*
* Clean off entries from the cache
*/
-void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash);
+void Curl_hostcache_clean(struct Curl_easy *data, struct Curl_hash *hash);
/*
* Populate the cache with specified entries from CURLOPT_RESOLVE.
diff --git a/lib/hostip4.c b/lib/hostip4.c
index e6ba710d8..eae941674 100644
--- a/lib/hostip4.c
+++ b/lib/hostip4.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -52,7 +52,6 @@
#include "share.h"
#include "strerror.h"
#include "url.h"
-#include "inet_pton.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -89,12 +88,12 @@ bool Curl_ipvalid(struct connectdata *conn)
* flavours have thread-safe versions of the plain gethostbyname() etc.
*
*/
-Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
- Curl_addrinfo *ai = NULL;
+ struct Curl_addrinfo *ai = NULL;
#ifdef CURL_DISABLE_VERBOSE_STRINGS
(void)conn;
@@ -120,36 +119,30 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
* implying that only threadsafe code and function calls may be used.
*
*/
-Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
- int port)
+struct Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
+ int port)
{
#if !defined(HAVE_GETADDRINFO_THREADSAFE) && defined(HAVE_GETHOSTBYNAME_R_3)
int res;
#endif
- Curl_addrinfo *ai = NULL;
+ struct Curl_addrinfo *ai = NULL;
struct hostent *h = NULL;
- struct in_addr in;
struct hostent *buf = NULL;
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
- return Curl_ip2addr(AF_INET, &in, hostname, port);
-
#if defined(HAVE_GETADDRINFO_THREADSAFE)
- else {
- struct addrinfo hints;
- char sbuf[12];
- char *sbufptr = NULL;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_INET;
- hints.ai_socktype = SOCK_STREAM;
- if(port) {
- msnprintf(sbuf, sizeof(sbuf), "%d", port);
- sbufptr = sbuf;
- }
+ struct addrinfo hints;
+ char sbuf[12];
+ char *sbufptr = NULL;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_INET;
+ hints.ai_socktype = SOCK_STREAM;
+ if(port) {
+ msnprintf(sbuf, sizeof(sbuf), "%d", port);
+ sbufptr = sbuf;
+ }
- (void)Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &ai);
+ (void)Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &ai);
#elif defined(HAVE_GETHOSTBYNAME_R)
/*
@@ -157,144 +150,141 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
* Since there are three different versions of it, the following code is
* somewhat #ifdef-ridden.
*/
- else {
- int h_errnop;
-
- buf = calloc(1, CURL_HOSTENT_SIZE);
- if(!buf)
- return NULL; /* major failure */
- /*
- * The clearing of the buffer is a workaround for a gethostbyname_r bug in
- * qnx nto and it is also _required_ for some of these functions on some
- * platforms.
- */
+ int h_errnop;
+
+ buf = calloc(1, CURL_HOSTENT_SIZE);
+ if(!buf)
+ return NULL; /* major failure */
+ /*
+ * The clearing of the buffer is a workaround for a gethostbyname_r bug in
+ * qnx nto and it is also _required_ for some of these functions on some
+ * platforms.
+ */
#if defined(HAVE_GETHOSTBYNAME_R_5)
- /* Solaris, IRIX and more */
- h = gethostbyname_r(hostname,
- (struct hostent *)buf,
- (char *)buf + sizeof(struct hostent),
- CURL_HOSTENT_SIZE - sizeof(struct hostent),
- &h_errnop);
-
- /* If the buffer is too small, it returns NULL and sets errno to
- * ERANGE. The errno is thread safe if this is compiled with
- * -D_REENTRANT as then the 'errno' variable is a macro defined to get
- * used properly for threads.
- */
+ /* Solaris, IRIX and more */
+ h = gethostbyname_r(hostname,
+ (struct hostent *)buf,
+ (char *)buf + sizeof(struct hostent),
+ CURL_HOSTENT_SIZE - sizeof(struct hostent),
+ &h_errnop);
+
+ /* If the buffer is too small, it returns NULL and sets errno to
+ * ERANGE. The errno is thread safe if this is compiled with
+ * -D_REENTRANT as then the 'errno' variable is a macro defined to get
+ * used properly for threads.
+ */
- if(h) {
- ;
- }
- else
+ if(h) {
+ ;
+ }
+ else
#elif defined(HAVE_GETHOSTBYNAME_R_6)
- /* Linux */
-
- (void)gethostbyname_r(hostname,
- (struct hostent *)buf,
- (char *)buf + sizeof(struct hostent),
- CURL_HOSTENT_SIZE - sizeof(struct hostent),
- &h, /* DIFFERENCE */
- &h_errnop);
- /* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a
- * sudden this function returns EAGAIN if the given buffer size is too
- * small. Previous versions are known to return ERANGE for the same
- * problem.
- *
- * This wouldn't be such a big problem if older versions wouldn't
- * sometimes return EAGAIN on a common failure case. Alas, we can't
- * assume that EAGAIN *or* ERANGE means ERANGE for any given version of
- * glibc.
- *
- * For now, we do that and thus we may call the function repeatedly and
- * fail for older glibc versions that return EAGAIN, until we run out of
- * buffer size (step_size grows beyond CURL_HOSTENT_SIZE).
- *
- * If anyone has a better fix, please tell us!
- *
- * -------------------------------------------------------------------
- *
- * On October 23rd 2003, Dan C dug up more details on the mysteries of
- * gethostbyname_r() in glibc:
- *
- * In glibc 2.2.5 the interface is different (this has also been
- * discovered in glibc 2.1.1-6 as shipped by Redhat 6). What I can't
- * explain, is that tests performed on glibc 2.2.4-34 and 2.2.4-32
- * (shipped/upgraded by Redhat 7.2) don't show this behavior!
- *
- * In this "buggy" version, the return code is -1 on error and 'errno'
- * is set to the ERANGE or EAGAIN code. Note that 'errno' is not a
- * thread-safe variable.
- */
+ /* Linux */
+
+ (void)gethostbyname_r(hostname,
+ (struct hostent *)buf,
+ (char *)buf + sizeof(struct hostent),
+ CURL_HOSTENT_SIZE - sizeof(struct hostent),
+ &h, /* DIFFERENCE */
+ &h_errnop);
+ /* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a
+ * sudden this function returns EAGAIN if the given buffer size is too
+ * small. Previous versions are known to return ERANGE for the same
+ * problem.
+ *
+ * This wouldn't be such a big problem if older versions wouldn't
+ * sometimes return EAGAIN on a common failure case. Alas, we can't
+ * assume that EAGAIN *or* ERANGE means ERANGE for any given version of
+ * glibc.
+ *
+ * For now, we do that and thus we may call the function repeatedly and
+ * fail for older glibc versions that return EAGAIN, until we run out of
+ * buffer size (step_size grows beyond CURL_HOSTENT_SIZE).
+ *
+ * If anyone has a better fix, please tell us!
+ *
+ * -------------------------------------------------------------------
+ *
+ * On October 23rd 2003, Dan C dug up more details on the mysteries of
+ * gethostbyname_r() in glibc:
+ *
+ * In glibc 2.2.5 the interface is different (this has also been
+ * discovered in glibc 2.1.1-6 as shipped by Redhat 6). What I can't
+ * explain, is that tests performed on glibc 2.2.4-34 and 2.2.4-32
+ * (shipped/upgraded by Redhat 7.2) don't show this behavior!
+ *
+ * In this "buggy" version, the return code is -1 on error and 'errno'
+ * is set to the ERANGE or EAGAIN code. Note that 'errno' is not a
+ * thread-safe variable.
+ */
- if(!h) /* failure */
+ if(!h) /* failure */
#elif defined(HAVE_GETHOSTBYNAME_R_3)
- /* AIX, Digital Unix/Tru64, HPUX 10, more? */
-
- /* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
- * the plain fact that it does not return unique full buffers on each
- * call, but instead several of the pointers in the hostent structs will
- * point to the same actual data! This have the unfortunate down-side that
- * our caching system breaks down horribly. Luckily for us though, AIX 4.3
- * and more recent versions have a "completely thread-safe"[*] libc where
- * all the data is stored in thread-specific memory areas making calls to
- * the plain old gethostbyname() work fine even for multi-threaded
- * programs.
- *
- * This AIX 4.3 or later detection is all made in the configure script.
- *
- * Troels Walsted Hansen helped us work this out on March 3rd, 2003.
- *
- * [*] = much later we've found out that it isn't at all "completely
- * thread-safe", but at least the gethostbyname() function is.
+ /* AIX, Digital Unix/Tru64, HPUX 10, more? */
+
+ /* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
+ * the plain fact that it does not return unique full buffers on each
+ * call, but instead several of the pointers in the hostent structs will
+ * point to the same actual data! This have the unfortunate down-side that
+ * our caching system breaks down horribly. Luckily for us though, AIX 4.3
+ * and more recent versions have a "completely thread-safe"[*] libc where
+ * all the data is stored in thread-specific memory areas making calls to
+ * the plain old gethostbyname() work fine even for multi-threaded
+ * programs.
+ *
+ * This AIX 4.3 or later detection is all made in the configure script.
+ *
+ * Troels Walsted Hansen helped us work this out on March 3rd, 2003.
+ *
+ * [*] = much later we've found out that it isn't at all "completely
+ * thread-safe", but at least the gethostbyname() function is.
+ */
+
+ if(CURL_HOSTENT_SIZE >=
+ (sizeof(struct hostent) + sizeof(struct hostent_data))) {
+
+ /* August 22nd, 2000: Albert Chin-A-Young brought an updated version
+ * that should work! September 20: Richard Prescott worked on the buffer
+ * size dilemma.
*/
- if(CURL_HOSTENT_SIZE >=
- (sizeof(struct hostent) + sizeof(struct hostent_data))) {
-
- /* August 22nd, 2000: Albert Chin-A-Young brought an updated version
- * that should work! September 20: Richard Prescott worked on the buffer
- * size dilemma.
- */
-
- res = gethostbyname_r(hostname,
- (struct hostent *)buf,
- (struct hostent_data *)((char *)buf +
- sizeof(struct hostent)));
- h_errnop = SOCKERRNO; /* we don't deal with this, but set it anyway */
- }
- else
- res = -1; /* failure, too smallish buffer size */
-
- if(!res) { /* success */
-
- h = buf; /* result expected in h */
-
- /* This is the worst kind of the different gethostbyname_r() interfaces.
- * Since we don't know how big buffer this particular lookup required,
- * we can't realloc down the huge alloc without doing closer analysis of
- * the returned data. Thus, we always use CURL_HOSTENT_SIZE for every
- * name lookup. Fixing this would require an extra malloc() and then
- * calling Curl_addrinfo_copy() that subsequent realloc()s down the new
- * memory area to the actually used amount.
- */
- }
- else
+ res = gethostbyname_r(hostname,
+ (struct hostent *)buf,
+ (struct hostent_data *)((char *)buf +
+ sizeof(struct hostent)));
+ h_errnop = SOCKERRNO; /* we don't deal with this, but set it anyway */
+ }
+ else
+ res = -1; /* failure, too smallish buffer size */
+
+ if(!res) { /* success */
+
+ h = buf; /* result expected in h */
+
+ /* This is the worst kind of the different gethostbyname_r() interfaces.
+ * Since we don't know how big buffer this particular lookup required,
+ * we can't realloc down the huge alloc without doing closer analysis of
+ * the returned data. Thus, we always use CURL_HOSTENT_SIZE for every
+ * name lookup. Fixing this would require an extra malloc() and then
+ * calling Curl_addrinfo_copy() that subsequent realloc()s down the new
+ * memory area to the actually used amount.
+ */
+ }
+ else
#endif /* HAVE_...BYNAME_R_5 || HAVE_...BYNAME_R_6 || HAVE_...BYNAME_R_3 */
- {
- h = NULL; /* set return code to NULL */
- free(buf);
- }
+ {
+ h = NULL; /* set return code to NULL */
+ free(buf);
+ }
#else /* HAVE_GETADDRINFO_THREADSAFE || HAVE_GETHOSTBYNAME_R */
- /*
- * Here is code for platforms that don't have a thread safe
- * getaddrinfo() nor gethostbyname_r() function or for which
- * gethostbyname() is the preferred one.
- */
- else {
- h = gethostbyname((void *)hostname);
+ /*
+ * Here is code for platforms that don't have a thread safe
+ * getaddrinfo() nor gethostbyname_r() function or for which
+ * gethostbyname() is the preferred one.
+ */
+ h = gethostbyname((void *)hostname);
#endif /* HAVE_GETADDRINFO_THREADSAFE || HAVE_GETHOSTBYNAME_R */
- }
if(h) {
ai = Curl_he2ai(h, port);
diff --git a/lib/hostip6.c b/lib/hostip6.c
index e0e0c58df..11215758d 100644
--- a/lib/hostip6.c
+++ b/lib/hostip6.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -62,13 +62,19 @@
/*
* Curl_ipv6works() returns TRUE if IPv6 seems to work.
*/
-bool Curl_ipv6works(void)
+bool Curl_ipv6works(struct connectdata *conn)
{
- /* the nature of most system is that IPv6 status doesn't come and go
- during a program's lifetime so we only probe the first time and then we
- have the info kept for fast re-use */
- static int ipv6_works = -1;
- if(-1 == ipv6_works) {
+ if(conn) {
+ /* the nature of most system is that IPv6 status doesn't come and go
+ during a program's lifetime so we only probe the first time and then we
+ have the info kept for fast re-use */
+ DEBUGASSERT(conn);
+ DEBUGASSERT(conn->data);
+ DEBUGASSERT(conn->data->multi);
+ return conn->data->multi->ipv6_works;
+ }
+ else {
+ int ipv6_works = -1;
/* probe to see if we have a working IPv6 stack */
curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
if(s == CURL_SOCKET_BAD)
@@ -78,8 +84,8 @@ bool Curl_ipv6works(void)
ipv6_works = 1;
Curl_closesocket(NULL, s);
}
+ return (ipv6_works>0)?TRUE:FALSE;
}
- return (ipv6_works>0)?TRUE:FALSE;
}
/*
@@ -89,7 +95,7 @@ bool Curl_ipv6works(void)
bool Curl_ipvalid(struct connectdata *conn)
{
if(conn->ip_version == CURL_IPRESOLVE_V6)
- return Curl_ipv6works();
+ return Curl_ipv6works(conn);
return TRUE;
}
@@ -97,20 +103,16 @@ bool Curl_ipvalid(struct connectdata *conn)
#if defined(CURLRES_SYNCH)
#ifdef DEBUG_ADDRINFO
-static void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai)
+static void dump_addrinfo(struct connectdata *conn,
+ const struct Curl_addrinfo *ai)
{
printf("dump_addrinfo:\n");
for(; ai; ai = ai->ai_next) {
char buf[INET6_ADDRSTRLEN];
printf(" fam %2d, CNAME %s, ",
ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>");
- if(Curl_printable_address(ai, buf, sizeof(buf)))
- printf("%s\n", buf);
- else {
- char buffer[STRERROR_LEN];
- printf("failed; %s\n",
- Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
- }
+ Curl_printable_address(ai, buf, sizeof(buf));
+ printf("%s\n", buf);
}
}
#else
@@ -126,13 +128,13 @@ static void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai)
* memory we need to free after use. That memory *MUST* be freed with
* Curl_freeaddrinfo(), nothing else.
*/
-Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
- const char *hostname,
- int port,
- int *waitp)
+struct Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
+ const char *hostname,
+ int port,
+ int *waitp)
{
struct addrinfo hints;
- Curl_addrinfo *res;
+ struct Curl_addrinfo *res;
int error;
char sbuf[12];
char *sbufptr = NULL;
@@ -159,7 +161,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
break;
}
- if((pf != PF_INET) && !Curl_ipv6works())
+ if((pf != PF_INET) && !Curl_ipv6works(conn))
/* The stack seems to be a non-IPv6 one */
pf = PF_INET;
diff --git a/lib/hostsyn.c b/lib/hostsyn.c
index 3de6746f5..9e31008d2 100644
--- a/lib/hostsyn.c
+++ b/lib/hostsyn.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/http.c b/lib/http.c
index 4631a7f36..e0be17d9b 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -125,7 +125,9 @@ const struct Curl_handler Curl_handler_http = {
ZERO_NULL, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTP, /* protocol */
- PROTOPT_CREDSPERREQUEST /* flags */
+ CURLPROTO_HTTP, /* family */
+ PROTOPT_CREDSPERREQUEST | /* flags */
+ PROTOPT_USERPWDCTRL
};
#ifdef USE_SSL
@@ -150,7 +152,9 @@ const struct Curl_handler Curl_handler_https = {
ZERO_NULL, /* connection_check */
PORT_HTTPS, /* defport */
CURLPROTO_HTTPS, /* protocol */
- PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN_NPN /* flags */
+ CURLPROTO_HTTP, /* family */
+ PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN_NPN | /* flags */
+ PROTOPT_USERPWDCTRL
};
#endif
@@ -268,7 +272,7 @@ char *Curl_copy_header_value(const char *header)
return NULL;
memcpy(value, start, len);
- value[len] = 0; /* zero terminate */
+ value[len] = 0; /* null-terminate */
return value;
}
@@ -292,17 +296,21 @@ static CURLcode http_output_basic(struct connectdata *conn, bool proxy)
char *out;
if(proxy) {
- userp = &conn->allocptr.proxyuserpwd;
+#ifndef CURL_DISABLE_PROXY
+ userp = &data->state.aptr.proxyuserpwd;
user = conn->http_proxy.user;
pwd = conn->http_proxy.passwd;
+#else
+ return CURLE_NOT_BUILT_IN;
+#endif
}
else {
- userp = &conn->allocptr.userpwd;
+ userp = &data->state.aptr.userpwd;
user = conn->user;
pwd = conn->passwd;
}
- out = aprintf("%s:%s", user, pwd);
+ out = aprintf("%s:%s", user, pwd ? pwd : "");
if(!out)
return CURLE_OUT_OF_MEMORY;
@@ -340,11 +348,12 @@ static CURLcode http_output_bearer(struct connectdata *conn)
{
char **userp;
CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
- userp = &conn->allocptr.userpwd;
+ userp = &data->state.aptr.userpwd;
free(*userp);
*userp = aprintf("Authorization: Bearer %s\r\n",
- conn->oauth_bearer);
+ conn->data->set.str[STRING_BEARER]);
if(!*userp) {
result = CURLE_OUT_OF_MEMORY;
@@ -427,7 +436,7 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
skip this rewinding stuff */
return CURLE_OK;
- switch(data->set.httpreq) {
+ switch(data->state.httpreq) {
case HTTPREQ_GET:
case HTTPREQ_HEAD:
return CURLE_OK;
@@ -448,7 +457,7 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
}
else {
/* figure out how much data we are expected to send */
- switch(data->set.httpreq) {
+ switch(data->state.httpreq) {
case HTTPREQ_POST:
case HTTPREQ_PUT:
if(data->state.infilesize != -1)
@@ -555,7 +564,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
CURLcode result = CURLE_OK;
unsigned long authmask = ~0ul;
- if(!conn->oauth_bearer)
+ if(!data->set.str[STRING_BEARER])
authmask &= (unsigned long)~CURLAUTH_BEARER;
if(100 <= data->req.httpcode && 199 >= data->req.httpcode)
@@ -565,7 +574,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
if(data->state.authproblem)
return data->set.http_fail_on_error?CURLE_HTTP_RETURNED_ERROR:CURLE_OK;
- if((conn->bits.user_passwd || conn->oauth_bearer) &&
+ if((conn->bits.user_passwd || data->set.str[STRING_BEARER]) &&
((data->req.httpcode == 401) ||
(conn->bits.authneg && data->req.httpcode < 300))) {
pickhost = pickoneauth(&data->state.authhost, authmask);
@@ -578,6 +587,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
conn->data->set.httpversion = CURL_HTTP_VERSION_1_1;
}
}
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.proxy_user_passwd &&
((data->req.httpcode == 407) ||
(conn->bits.authneg && data->req.httpcode < 300))) {
@@ -586,10 +596,11 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
if(!pickproxy)
data->state.authproblem = TRUE;
}
+#endif
if(pickhost || pickproxy) {
- if((data->set.httpreq != HTTPREQ_GET) &&
- (data->set.httpreq != HTTPREQ_HEAD) &&
+ if((data->state.httpreq != HTTPREQ_GET) &&
+ (data->state.httpreq != HTTPREQ_HEAD) &&
!conn->bits.rewindaftersend) {
result = http_perhapsrewind(conn);
if(result)
@@ -610,8 +621,8 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
authentication is not "done" yet and
no authentication seems to be required and
we didn't try HEAD or GET */
- if((data->set.httpreq != HTTPREQ_GET) &&
- (data->set.httpreq != HTTPREQ_HEAD)) {
+ if((data->state.httpreq != HTTPREQ_GET) &&
+ (data->state.httpreq != HTTPREQ_HEAD)) {
data->req.newurl = strdup(data->change.url); /* clone URL */
if(!data->req.newurl)
return CURLE_OUT_OF_MEMORY;
@@ -641,9 +652,7 @@ output_auth_headers(struct connectdata *conn,
{
const char *auth = NULL;
CURLcode result = CURLE_OK;
-#if !defined(CURL_DISABLE_VERBOSE_STRINGS) || defined(USE_SPNEGO)
struct Curl_easy *data = conn->data;
-#endif
#ifdef CURL_DISABLE_CRYPTO_AUTH
(void)request;
@@ -691,10 +700,13 @@ output_auth_headers(struct connectdata *conn,
#endif
if(authstatus->picked == CURLAUTH_BASIC) {
/* Basic */
- if((proxy && conn->bits.proxy_user_passwd &&
- !Curl_checkProxyheaders(conn, "Proxy-authorization")) ||
- (!proxy && conn->bits.user_passwd &&
- !Curl_checkheaders(conn, "Authorization"))) {
+ if(
+#ifndef CURL_DISABLE_PROXY
+ (proxy && conn->bits.proxy_user_passwd &&
+ !Curl_checkProxyheaders(conn, "Proxy-authorization")) ||
+#endif
+ (!proxy && conn->bits.user_passwd &&
+ !Curl_checkheaders(conn, "Authorization"))) {
auth = "Basic";
result = http_output_basic(conn, proxy);
if(result)
@@ -707,7 +719,7 @@ output_auth_headers(struct connectdata *conn,
}
if(authstatus->picked == CURLAUTH_BEARER) {
/* Bearer */
- if((!proxy && conn->oauth_bearer &&
+ if((!proxy && data->set.str[STRING_BEARER] &&
!Curl_checkheaders(conn, "Authorization:"))) {
auth = "Bearer";
result = http_output_bearer(conn);
@@ -721,10 +733,15 @@ output_auth_headers(struct connectdata *conn,
}
if(auth) {
+#ifndef CURL_DISABLE_PROXY
infof(data, "%s auth using %s with user '%s'\n",
proxy ? "Proxy" : "Server", auth,
proxy ? (conn->http_proxy.user ? conn->http_proxy.user : "") :
- (conn->user ? conn->user : ""));
+ (conn->user ? conn->user : ""));
+#else
+ infof(data, "Server auth using %s with user '%s'\n",
+ auth, conn->user ? conn->user : "");
+#endif
authstatus->multipass = (!authstatus->done) ? TRUE : FALSE;
}
else
@@ -764,8 +781,11 @@ Curl_http_output_auth(struct connectdata *conn,
authhost = &data->state.authhost;
authproxy = &data->state.authproxy;
- if((conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
- conn->bits.user_passwd || conn->oauth_bearer)
+ if(
+#ifndef CURL_DISABLE_PROXY
+ (conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
+#endif
+ conn->bits.user_passwd || data->set.str[STRING_BEARER])
/* continue please */;
else {
authhost->done = TRUE;
@@ -1069,8 +1089,10 @@ static int http_should_fail(struct connectdata *conn)
*/
if((httpcode == 401) && !conn->bits.user_passwd)
return TRUE;
+#ifndef CURL_DISABLE_PROXY
if((httpcode == 407) && !conn->bits.proxy_user_passwd)
return TRUE;
+#endif
return data->state.authproblem;
}
@@ -1127,49 +1149,20 @@ static size_t readmoredata(char *buffer,
return fullsize;
}
-/* ------------------------------------------------------------------------- */
-/* add_buffer functions */
-
-/*
- * Curl_add_buffer_init() sets up and returns a fine buffer struct
- */
-Curl_send_buffer *Curl_add_buffer_init(void)
-{
- return calloc(1, sizeof(Curl_send_buffer));
-}
-
-/*
- * Curl_add_buffer_free() frees all associated resources.
- */
-void Curl_add_buffer_free(Curl_send_buffer **inp)
-{
- Curl_send_buffer *in;
- if(!inp)
- return;
- in = *inp;
- if(in) { /* deal with NULL input */
- free(in->buffer);
- free(in);
- }
- *inp = NULL;
-}
-
/*
- * Curl_add_buffer_send() sends a header buffer and frees all associated
+ * Curl_buffer_send() sends a header buffer and frees all associated
* memory. Body data may be appended to the header data if desired.
*
* Returns CURLcode
*/
-CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
- struct connectdata *conn,
-
- /* add the number of sent bytes to this
- counter */
- curl_off_t *bytes_written,
-
- /* how much of the buffer contains body data */
- size_t included_body_bytes,
- int socketindex)
+CURLcode Curl_buffer_send(struct dynbuf *in,
+ struct connectdata *conn,
+ /* add the number of sent bytes to this
+ counter */
+ curl_off_t *bytes_written,
+ /* how much of the buffer contains body data */
+ size_t included_body_bytes,
+ int socketindex)
{
ssize_t amount;
CURLcode result;
@@ -1180,7 +1173,6 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
size_t sendsize;
curl_socket_t sockfd;
size_t headersize;
- Curl_send_buffer *in = *inp;
DEBUGASSERT(socketindex <= SECONDARYSOCKET);
@@ -1189,8 +1181,8 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
/* The looping below is required since we use non-blocking sockets, but due
to the circumstances we will just loop and try again and again etc */
- ptr = in->buffer;
- size = in->size_used;
+ ptr = Curl_dyn_ptr(in);
+ size = Curl_dyn_len(in);
headersize = size - included_body_bytes; /* the initial part that isn't body
is header */
@@ -1201,12 +1193,15 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
/* Curl_convert_to_network calls failf if unsuccessful */
if(result) {
/* conversion failed, free memory and return to the caller */
- Curl_add_buffer_free(inp);
+ Curl_dyn_free(in);
return result;
}
- if((conn->handler->flags & PROTOPT_SSL ||
- conn->http_proxy.proxytype == CURLPROXY_HTTPS)
+ if((conn->handler->flags & PROTOPT_SSL
+#ifndef CURL_DISABLE_PROXY
+ || conn->http_proxy.proxytype == CURLPROXY_HTTPS
+#endif
+ )
&& conn->httpversion != 20) {
/* We never send more than CURL_MAX_WRITE_SIZE bytes in one single chunk
when we speak HTTPS, as if only a fraction of it is sent now, this data
@@ -1225,14 +1220,27 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
result = Curl_get_upload_buffer(data);
if(result) {
/* malloc failed, free memory and return to the caller */
- Curl_add_buffer_free(&in);
+ Curl_dyn_free(in);
return result;
}
memcpy(data->state.ulbuf, ptr, sendsize);
ptr = data->state.ulbuf;
}
- else
+ else {
+#ifdef CURLDEBUG
+ /* Allow debug builds override this logic to force short initial sends */
+ char *p = getenv("CURL_SMALLREQSEND");
+ if(p) {
+ size_t altsize = (size_t)strtoul(p, NULL, 10);
+ if(altsize)
+ sendsize = CURLMIN(size, altsize);
+ else
+ sendsize = size;
+ }
+ else
+#endif
sendsize = size;
+ }
result = Curl_write(conn, sockfd, ptr, sendsize, &amount);
@@ -1275,7 +1283,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
size -= amount;
- ptr = in->buffer + amount;
+ ptr = Curl_dyn_ptr(in) + amount;
/* backup the currently set pointers */
http->backup.fread_func = data->state.fread_func;
@@ -1289,7 +1297,7 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
http->postdata = ptr;
http->postsize = (curl_off_t)size;
- http->send_buffer = in;
+ http->send_buffer = *in; /* copy the whole struct */
http->sending = HTTPSEND_REQUEST;
return CURLE_OK;
@@ -1309,92 +1317,11 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
return CURLE_SEND_ERROR;
}
}
- Curl_add_buffer_free(&in);
+ Curl_dyn_free(in);
return result;
}
-
-/*
- * add_bufferf() add the formatted input to the buffer.
- */
-CURLcode Curl_add_bufferf(Curl_send_buffer **inp, const char *fmt, ...)
-{
- char *s;
- va_list ap;
- Curl_send_buffer *in = *inp;
- va_start(ap, fmt);
- s = vaprintf(fmt, ap); /* this allocs a new string to append */
- va_end(ap);
-
- if(s) {
- CURLcode result = Curl_add_buffer(inp, s, strlen(s));
- free(s);
- return result;
- }
- /* If we failed, we cleanup the whole buffer and return error */
- free(in->buffer);
- free(in);
- *inp = NULL;
- return CURLE_OUT_OF_MEMORY;
-}
-
-/*
- * Curl_add_buffer() appends a memory chunk to the existing buffer
- */
-CURLcode Curl_add_buffer(Curl_send_buffer **inp, const void *inptr,
- size_t size)
-{
- char *new_rb;
- Curl_send_buffer *in = *inp;
-
- if(~size < in->size_used) {
- /* If resulting used size of send buffer would wrap size_t, cleanup
- the whole buffer and return error. Otherwise the required buffer
- size will fit into a single allocatable memory chunk */
- Curl_safefree(in->buffer);
- free(in);
- *inp = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
-
- if(!in->buffer ||
- ((in->size_used + size) > (in->size_max - 1))) {
- /* If current buffer size isn't enough to hold the result, use a
- buffer size that doubles the required size. If this new size
- would wrap size_t, then just use the largest possible one */
- size_t new_size;
-
- if((size > (size_t)-1 / 2) || (in->size_used > (size_t)-1 / 2) ||
- (~(size * 2) < (in->size_used * 2)))
- new_size = (size_t)-1;
- else
- new_size = (in->size_used + size) * 2;
-
- if(in->buffer)
- /* we have a buffer, enlarge the existing one */
- new_rb = Curl_saferealloc(in->buffer, new_size);
- else
- /* create a new buffer */
- new_rb = malloc(new_size);
-
- if(!new_rb) {
- /* If we failed, we cleanup the whole buffer and return error */
- free(in);
- *inp = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
-
- in->buffer = new_rb;
- in->size_max = new_size;
- }
- memcpy(&in->buffer[in->size_used], inptr, size);
-
- in->size_used += size;
-
- return CURLE_OK;
-}
-
/* end of the add_buffer functions */
/* ------------------------------------------------------------------------- */
@@ -1428,7 +1355,7 @@ Curl_compareheader(const char *headerline, /* line to check */
/* pass the header */
start = &headerline[hlen];
- /* pass all white spaces */
+ /* pass all whitespace */
while(*start && ISSPACE(*start))
start++;
@@ -1467,6 +1394,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
function to make the re-use checks properly be able to check this bit. */
connkeep(conn, "HTTP default");
+#ifndef CURL_DISABLE_PROXY
/* the CONNECT procedure might not have been completed */
result = Curl_proxy_connect(conn, FIRSTSOCKET);
if(result)
@@ -1483,7 +1411,6 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
/* nothing else to do except wait right now - we're not done here. */
return CURLE_OK;
-#ifndef CURL_DISABLE_PROXY
if(conn->data->set.haproxyprotocol) {
/* add HAProxy PROXY protocol header */
result = add_haproxy_protocol_header(conn);
@@ -1519,7 +1446,7 @@ static int http_getsock_do(struct connectdata *conn,
static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
{
char proxy_header[128];
- Curl_send_buffer *req_buffer;
+ struct dynbuf req;
CURLcode result;
char tcp_version[5];
@@ -1540,19 +1467,14 @@ static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
conn->data->info.conn_local_port,
conn->data->info.conn_primary_port);
- req_buffer = Curl_add_buffer_init();
- if(!req_buffer)
- return CURLE_OUT_OF_MEMORY;
+ Curl_dyn_init(&req, DYN_HAXPROXY);
- result = Curl_add_bufferf(&req_buffer, proxy_header);
+ result = Curl_dyn_add(&req, proxy_header);
if(result)
return result;
- result = Curl_add_buffer_send(&req_buffer,
- conn,
- &conn->data->info.request_size,
- 0,
- FIRSTSOCKET);
+ result = Curl_buffer_send(&req, conn, &conn->data->info.request_size,
+ 0, FIRSTSOCKET);
return result;
}
@@ -1613,13 +1535,11 @@ CURLcode Curl_http_done(struct connectdata *conn,
if(!http)
return CURLE_OK;
- if(http->send_buffer) {
- Curl_add_buffer_free(&http->send_buffer);
- }
-
- Curl_http2_done(conn, premature);
-
+ Curl_dyn_free(&http->send_buffer);
+ Curl_http2_done(data, premature);
+ Curl_quic_done(data, premature);
Curl_mime_cleanpart(&http->form);
+ Curl_dyn_reset(&data->state.headerb);
if(status)
return status;
@@ -1685,12 +1605,12 @@ static const char *get_http_string(const struct Curl_easy *data,
/* check and possibly add an Expect: header */
static CURLcode expect100(struct Curl_easy *data,
struct connectdata *conn,
- Curl_send_buffer *req_buffer)
+ struct dynbuf *req)
{
CURLcode result = CURLE_OK;
data->state.expect100header = FALSE; /* default to false unless it is set
to TRUE below */
- if(use_http_1_1plus(data, conn) &&
+ if(!data->state.disableexpect && use_http_1_1plus(data, conn) &&
(conn->httpversion < 20)) {
/* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
Expect: 100-continue to the headers which actually speeds up post
@@ -1701,8 +1621,7 @@ static CURLcode expect100(struct Curl_easy *data,
Curl_compareheader(ptr, "Expect:", "100-continue");
}
else {
- result = Curl_add_bufferf(&req_buffer,
- "Expect: 100-continue\r\n");
+ result = Curl_dyn_add(req, "Expect: 100-continue\r\n");
if(!result)
data->state.expect100header = TRUE;
}
@@ -1721,7 +1640,7 @@ enum proxy_use {
will return an error code if one of the headers is
not formatted correctly */
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
- Curl_send_buffer **buffer,
+ struct dynbuf *b,
struct Curl_easy *handle)
{
char *ptr = NULL;
@@ -1747,8 +1666,10 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
/* only add correctly formatted trailers */
ptr = strchr(trailers->data, ':');
if(ptr && *(ptr + 1) == ' ') {
- result = Curl_add_bufferf(buffer, "%s%s", trailers->data,
- endofline_native);
+ result = Curl_dyn_add(b, trailers->data);
+ if(result)
+ return result;
+ result = Curl_dyn_add(b, endofline_native);
if(result)
return result;
}
@@ -1756,14 +1677,13 @@ CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
infof(handle, "Malformatted trailing header ! Skipping trailer.");
trailers = trailers->next;
}
- result = Curl_add_buffer(buffer, endofline_network,
- strlen(endofline_network));
+ result = Curl_dyn_add(b, endofline_network);
return result;
}
CURLcode Curl_add_custom_headers(struct connectdata *conn,
bool is_connect,
- Curl_send_buffer *req_buffer)
+ struct dynbuf *req)
{
char *ptr;
struct curl_slist *h[2];
@@ -1772,6 +1692,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
struct Curl_easy *data = conn->data;
int i;
+#ifndef CURL_DISABLE_PROXY
enum proxy_use proxy;
if(is_connect)
@@ -1798,6 +1719,10 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
h[0] = data->set.headers;
break;
}
+#else
+ (void)is_connect;
+ h[0] = data->set.headers;
+#endif
/* loop through one or two lists */
for(i = 0; i < numlists; i++) {
@@ -1825,7 +1750,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
/* copy the source */
semicolonp = strdup(headers->data);
if(!semicolonp) {
- Curl_add_buffer_free(&req_buffer);
+ Curl_dyn_free(req);
return CURLE_OUT_OF_MEMORY;
}
/* put a colon where the semicolon is */
@@ -1849,16 +1774,16 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
CURLcode result = CURLE_OK;
char *compare = semicolonp ? semicolonp : headers->data;
- if(conn->allocptr.host &&
+ if(data->state.aptr.host &&
/* a Host: header was sent already, don't pass on any custom Host:
header as that will produce *two* in the same request! */
checkprefix("Host:", compare))
;
- else if(data->set.httpreq == HTTPREQ_POST_FORM &&
+ else if(data->state.httpreq == HTTPREQ_POST_FORM &&
/* this header (extended by formdata.c) is sent later */
checkprefix("Content-Type:", compare))
;
- else if(data->set.httpreq == HTTPREQ_POST_MIME &&
+ else if(data->state.httpreq == HTTPREQ_POST_MIME &&
/* this header is sent later */
checkprefix("Content-Type:", compare))
;
@@ -1867,7 +1792,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
we will force length zero then */
checkprefix("Content-Length:", compare))
;
- else if(conn->allocptr.te &&
+ else if(data->state.aptr.te &&
/* when asking for Transfer-Encoding, don't pass on a custom
Connection: */
checkprefix("Connection:", compare))
@@ -1886,7 +1811,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
!strcasecompare(data->state.first_host, conn->host.name)))
;
else {
- result = Curl_add_bufferf(&req_buffer, "%s\r\n", compare);
+ result = Curl_dyn_addf(req, "%s\r\n", compare);
}
if(semicolonp)
free(semicolonp);
@@ -1903,7 +1828,7 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
#ifndef CURL_DISABLE_PARSEDATE
CURLcode Curl_add_timecondition(const struct connectdata *conn,
- Curl_send_buffer *req_buffer)
+ struct dynbuf *req)
{
struct Curl_easy *data = conn->data;
const struct tm *tm;
@@ -1962,17 +1887,17 @@ CURLcode Curl_add_timecondition(const struct connectdata *conn,
tm->tm_min,
tm->tm_sec);
- result = Curl_add_buffer(&req_buffer, datestr, strlen(datestr));
+ result = Curl_dyn_add(req, datestr);
return result;
}
#else
/* disabled */
CURLcode Curl_add_timecondition(const struct connectdata *conn,
- Curl_send_buffer *req_buffer)
+ struct dynbuf *req)
{
(void)conn;
- (void)req_buffer;
+ (void)req;
return CURLE_OK;
}
#endif
@@ -1995,13 +1920,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
const char *te = ""; /* transfer-encoding */
const char *ptr;
const char *request;
- Curl_HttpReq httpreq = data->set.httpreq;
+ Curl_HttpReq httpreq = data->state.httpreq;
#if !defined(CURL_DISABLE_COOKIES)
char *addcookies = NULL;
#endif
curl_off_t included_body = 0;
const char *httpstring;
- Curl_send_buffer *req_buffer;
+ struct dynbuf req;
curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */
char *altused = NULL;
@@ -2029,13 +1954,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
#ifdef USE_NGHTTP2
if(conn->data->set.httpversion ==
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
/* We don't support HTTP/2 proxies yet. Also it's debatable
whether or not this setting should apply to HTTP/2 proxies. */
infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
break;
}
-
+#endif
DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
conn->httpversion = 20;
@@ -2090,9 +2016,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
case HTTPREQ_PUT:
request = "PUT";
break;
- case HTTPREQ_OPTIONS:
- request = "OPTIONS";
- break;
default: /* this should never happen */
case HTTPREQ_GET:
request = "GET";
@@ -2109,8 +2032,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
with the user-agent string specified, we erase the previously made string
here. */
if(Curl_checkheaders(conn, "User-Agent")) {
- free(conn->allocptr.uagent);
- conn->allocptr.uagent = NULL;
+ free(data->state.aptr.uagent);
+ data->state.aptr.uagent = NULL;
}
/* setup the authentication headers */
@@ -2138,14 +2061,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
else
conn->bits.authneg = FALSE;
- Curl_safefree(conn->allocptr.ref);
+ Curl_safefree(data->state.aptr.ref);
if(data->change.referer && !Curl_checkheaders(conn, "Referer")) {
- conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
- if(!conn->allocptr.ref)
+ data->state.aptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
+ if(!data->state.aptr.ref)
return CURLE_OUT_OF_MEMORY;
}
else
- conn->allocptr.ref = NULL;
+ data->state.aptr.ref = NULL;
#if !defined(CURL_DISABLE_COOKIES)
if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(conn, "Cookie"))
@@ -2154,15 +2077,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(!Curl_checkheaders(conn, "Accept-Encoding") &&
data->set.str[STRING_ENCODING]) {
- Curl_safefree(conn->allocptr.accept_encoding);
- conn->allocptr.accept_encoding =
+ Curl_safefree(data->state.aptr.accept_encoding);
+ data->state.aptr.accept_encoding =
aprintf("Accept-Encoding: %s\r\n", data->set.str[STRING_ENCODING]);
- if(!conn->allocptr.accept_encoding)
+ if(!data->state.aptr.accept_encoding)
return CURLE_OUT_OF_MEMORY;
}
else {
- Curl_safefree(conn->allocptr.accept_encoding);
- conn->allocptr.accept_encoding = NULL;
+ Curl_safefree(data->state.aptr.accept_encoding);
+ data->state.aptr.accept_encoding = NULL;
}
#ifdef HAVE_LIBZ
@@ -2178,7 +2101,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
char *cptr = Curl_checkheaders(conn, "Connection");
#define TE_HEADER "TE: gzip\r\n"
- Curl_safefree(conn->allocptr.te);
+ Curl_safefree(data->state.aptr.te);
if(cptr) {
cptr = Curl_copy_header_value(cptr);
@@ -2187,11 +2110,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
/* Create the (updated) Connection: header */
- conn->allocptr.te = aprintf("Connection: %s%sTE\r\n" TE_HEADER,
+ data->state.aptr.te = aprintf("Connection: %s%sTE\r\n" TE_HEADER,
cptr ? cptr : "", (cptr && *cptr) ? ", ":"");
free(cptr);
- if(!conn->allocptr.te)
+ if(!data->state.aptr.te)
return CURLE_OUT_OF_MEMORY;
}
#endif
@@ -2274,7 +2197,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
te = "Transfer-Encoding: chunked\r\n";
}
- Curl_safefree(conn->allocptr.host);
+ Curl_safefree(data->state.aptr.host);
ptr = Curl_checkheaders(conn, "Host");
if(ptr && (!data->state.this_is_a_follow ||
@@ -2309,19 +2232,19 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(colon)
*colon = 0; /* The host must not include an embedded port number */
}
- Curl_safefree(conn->allocptr.cookiehost);
- conn->allocptr.cookiehost = cookiehost;
+ Curl_safefree(data->state.aptr.cookiehost);
+ data->state.aptr.cookiehost = cookiehost;
}
#endif
if(strcmp("Host:", ptr)) {
- conn->allocptr.host = aprintf("Host:%s\r\n", &ptr[5]);
- if(!conn->allocptr.host)
+ data->state.aptr.host = aprintf("Host:%s\r\n", &ptr[5]);
+ if(!data->state.aptr.host)
return CURLE_OUT_OF_MEMORY;
}
else
/* when clearing the header */
- conn->allocptr.host = NULL;
+ data->state.aptr.host = NULL;
}
else {
/* When building Host: headers, we must put the host name within
@@ -2333,18 +2256,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
(conn->remote_port == PORT_HTTP)) )
/* if(HTTPS on port 443) OR (HTTP on port 80) then don't include
the port number in the host string */
- conn->allocptr.host = aprintf("Host: %s%s%s\r\n",
+ data->state.aptr.host = aprintf("Host: %s%s%s\r\n",
conn->bits.ipv6_ip?"[":"",
host,
conn->bits.ipv6_ip?"]":"");
else
- conn->allocptr.host = aprintf("Host: %s%s%s:%d\r\n",
+ data->state.aptr.host = aprintf("Host: %s%s%s:%d\r\n",
conn->bits.ipv6_ip?"[":"",
host,
conn->bits.ipv6_ip?"]":"",
conn->remote_port);
- if(!conn->allocptr.host)
+ if(!data->state.aptr.host)
/* without Host: we can't make a nice request */
return CURLE_OUT_OF_MEMORY;
}
@@ -2389,7 +2312,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
return CURLE_OUT_OF_MEMORY;
}
}
- /* Extract the the URL to use in the request. Store in STRING_TEMP_URL for
+ /* Extract the URL to use in the request. Store in STRING_TEMP_URL for
clean-up reasons if the function returns before the free() further
down. */
uc = curl_url_get(h, CURLUPART_URL, &data->set.str[STRING_TEMP_URL], 0);
@@ -2425,7 +2348,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
data->set.prefer_ascii ? 'a' : 'i');
}
}
- if(conn->bits.user_passwd && !conn->bits.userpwd_in_url)
+ if(conn->bits.user_passwd)
paste_ftp_userpwd = TRUE;
}
}
@@ -2515,21 +2438,21 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(((httpreq == HTTPREQ_GET) || (httpreq == HTTPREQ_HEAD)) &&
!Curl_checkheaders(conn, "Range")) {
/* if a line like this was already allocated, free the previous one */
- free(conn->allocptr.rangeline);
- conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n",
+ free(data->state.aptr.rangeline);
+ data->state.aptr.rangeline = aprintf("Range: bytes=%s\r\n",
data->state.range);
}
else if((httpreq == HTTPREQ_POST || httpreq == HTTPREQ_PUT) &&
!Curl_checkheaders(conn, "Content-Range")) {
/* if a line like this was already allocated, free the previous one */
- free(conn->allocptr.rangeline);
+ free(data->state.aptr.rangeline);
if(data->set.set_resume_from < 0) {
/* Upload resume was asked for, but we don't know the size of the
remote part so we tell the server (and act accordingly) that we
upload the whole file (again) */
- conn->allocptr.rangeline =
+ data->state.aptr.rangeline =
aprintf("Content-Range: bytes 0-%" CURL_FORMAT_CURL_OFF_T
"/%" CURL_FORMAT_CURL_OFF_T "\r\n",
data->state.infilesize - 1, data->state.infilesize);
@@ -2539,7 +2462,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* This is because "resume" was selected */
curl_off_t total_expected_size =
data->state.resume_from + data->state.infilesize;
- conn->allocptr.rangeline =
+ data->state.aptr.rangeline =
aprintf("Content-Range: bytes %s%" CURL_FORMAT_CURL_OFF_T
"/%" CURL_FORMAT_CURL_OFF_T "\r\n",
data->state.range, total_expected_size-1,
@@ -2548,11 +2471,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
else {
/* Range was selected and then we just pass the incoming range and
append total size */
- conn->allocptr.rangeline =
+ data->state.aptr.rangeline =
aprintf("Content-Range: bytes %s/%" CURL_FORMAT_CURL_OFF_T "\r\n",
data->state.range, data->state.infilesize);
}
- if(!conn->allocptr.rangeline)
+ if(!data->state.aptr.rangeline)
return CURLE_OUT_OF_MEMORY;
}
}
@@ -2560,14 +2483,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
httpstring = get_http_string(data, conn);
/* initialize a dynamic send-buffer */
- req_buffer = Curl_add_buffer_init();
-
- if(!req_buffer)
- return CURLE_OUT_OF_MEMORY;
+ Curl_dyn_init(&req, DYN_HTTP_REQUEST);
/* add the main request stuff */
/* GET/HEAD/POST/PUT */
- result = Curl_add_bufferf(&req_buffer, "%s ", request);
+ result = Curl_dyn_addf(&req, "%s ", request);
if(result)
return result;
@@ -2580,21 +2500,20 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* url */
if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
char *url = data->set.str[STRING_TEMP_URL];
- result = Curl_add_buffer(&req_buffer, url, strlen(url));
+ result = Curl_dyn_add(&req, url);
Curl_safefree(data->set.str[STRING_TEMP_URL]);
}
else
#endif
if(paste_ftp_userpwd)
- result = Curl_add_bufferf(&req_buffer, "ftp://%s:%s@%s",
- conn->user, conn->passwd,
- path + sizeof("ftp://") - 1);
+ result = Curl_dyn_addf(&req, "ftp://%s:%s@%s", conn->user, conn->passwd,
+ path + sizeof("ftp://") - 1);
else {
- result = Curl_add_buffer(&req_buffer, path, strlen(path));
+ result = Curl_dyn_add(&req, path);
if(result)
return result;
if(query)
- result = Curl_add_bufferf(&req_buffer, "?%s", query);
+ result = Curl_dyn_addf(&req, "?%s", query);
}
if(result)
return result;
@@ -2603,59 +2522,65 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(conn->bits.altused && !Curl_checkheaders(conn, "Alt-Used")) {
altused = aprintf("Alt-Used: %s:%d\r\n",
conn->conn_to_host.name, conn->conn_to_port);
- if(!altused)
+ if(!altused) {
+ Curl_dyn_free(&req);
return CURLE_OUT_OF_MEMORY;
+ }
}
#endif
result =
- Curl_add_bufferf(&req_buffer,
- "%s" /* ftp typecode (;type=x) */
- " HTTP/%s\r\n" /* HTTP version */
- "%s" /* host */
- "%s" /* proxyuserpwd */
- "%s" /* userpwd */
- "%s" /* range */
- "%s" /* user agent */
- "%s" /* accept */
- "%s" /* TE: */
- "%s" /* accept-encoding */
- "%s" /* referer */
- "%s" /* Proxy-Connection */
- "%s" /* transfer-encoding */
- "%s",/* Alt-Used */
-
- ftp_typecode,
- httpstring,
- (conn->allocptr.host?conn->allocptr.host:""),
- conn->allocptr.proxyuserpwd?
- conn->allocptr.proxyuserpwd:"",
- conn->allocptr.userpwd?conn->allocptr.userpwd:"",
- (data->state.use_range && conn->allocptr.rangeline)?
- conn->allocptr.rangeline:"",
- (data->set.str[STRING_USERAGENT] &&
- *data->set.str[STRING_USERAGENT] &&
- conn->allocptr.uagent)?
- conn->allocptr.uagent:"",
- http->p_accept?http->p_accept:"",
- conn->allocptr.te?conn->allocptr.te:"",
- (data->set.str[STRING_ENCODING] &&
- *data->set.str[STRING_ENCODING] &&
- conn->allocptr.accept_encoding)?
- conn->allocptr.accept_encoding:"",
- (data->change.referer && conn->allocptr.ref)?
- conn->allocptr.ref:"" /* Referer: <data> */,
- (conn->bits.httpproxy &&
- !conn->bits.tunnel_proxy &&
- !Curl_checkProxyheaders(conn, "Proxy-Connection"))?
- "Proxy-Connection: Keep-Alive\r\n":"",
- te,
- altused ? altused : ""
+ Curl_dyn_addf(&req,
+ "%s" /* ftp typecode (;type=x) */
+ " HTTP/%s\r\n" /* HTTP version */
+ "%s" /* host */
+ "%s" /* proxyuserpwd */
+ "%s" /* userpwd */
+ "%s" /* range */
+ "%s" /* user agent */
+ "%s" /* accept */
+ "%s" /* TE: */
+ "%s" /* accept-encoding */
+ "%s" /* referer */
+ "%s" /* Proxy-Connection */
+ "%s" /* transfer-encoding */
+ "%s",/* Alt-Used */
+
+ ftp_typecode,
+ httpstring,
+ (data->state.aptr.host?data->state.aptr.host:""),
+ data->state.aptr.proxyuserpwd?
+ data->state.aptr.proxyuserpwd:"",
+ data->state.aptr.userpwd?data->state.aptr.userpwd:"",
+ (data->state.use_range && data->state.aptr.rangeline)?
+ data->state.aptr.rangeline:"",
+ (data->set.str[STRING_USERAGENT] &&
+ *data->set.str[STRING_USERAGENT] &&
+ data->state.aptr.uagent)?
+ data->state.aptr.uagent:"",
+ http->p_accept?http->p_accept:"",
+ data->state.aptr.te?data->state.aptr.te:"",
+ (data->set.str[STRING_ENCODING] &&
+ *data->set.str[STRING_ENCODING] &&
+ data->state.aptr.accept_encoding)?
+ data->state.aptr.accept_encoding:"",
+ (data->change.referer && data->state.aptr.ref)?
+ data->state.aptr.ref:"" /* Referer: <data> */,
+#ifndef CURL_DISABLE_PROXY
+ (conn->bits.httpproxy &&
+ !conn->bits.tunnel_proxy &&
+ !Curl_checkProxyheaders(conn, "Proxy-Connection"))?
+ "Proxy-Connection: Keep-Alive\r\n":"",
+#else
+ "",
+#endif
+ te,
+ altused ? altused : ""
);
/* clear userpwd and proxyuserpwd to avoid re-using old credentials
* from re-used connections */
- Curl_safefree(conn->allocptr.userpwd);
- Curl_safefree(conn->allocptr.proxyuserpwd);
+ Curl_safefree(data->state.aptr.userpwd);
+ Curl_safefree(data->state.aptr.proxyuserpwd);
free(altused);
if(result)
@@ -2666,7 +2591,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
(data->set.httpversion == CURL_HTTP_VERSION_2)) {
/* append HTTP2 upgrade magic stuff to the HTTP request if it isn't done
over SSL */
- result = Curl_http2_request_upgrade(req_buffer, conn);
+ result = Curl_http2_request_upgrade(&req, conn);
if(result)
return result;
}
@@ -2679,8 +2604,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(data->cookies && data->state.cookie_engine) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
co = Curl_cookie_getlist(data->cookies,
- conn->allocptr.cookiehost?
- conn->allocptr.cookiehost:host,
+ data->state.aptr.cookiehost?
+ data->state.aptr.cookiehost:host,
data->state.up.path,
(conn->handler->protocol&CURLPROTO_HTTPS)?
TRUE:FALSE);
@@ -2692,13 +2617,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
while(co) {
if(co->value) {
if(0 == count) {
- result = Curl_add_bufferf(&req_buffer, "Cookie: ");
+ result = Curl_dyn_add(&req, "Cookie: ");
if(result)
break;
}
- result = Curl_add_bufferf(&req_buffer,
- "%s%s=%s", count?"; ":"",
- co->name, co->value);
+ result = Curl_dyn_addf(&req, "%s%s=%s", count?"; ":"",
+ co->name, co->value);
if(result)
break;
count++;
@@ -2709,26 +2633,25 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
if(addcookies && !result) {
if(!count)
- result = Curl_add_bufferf(&req_buffer, "Cookie: ");
+ result = Curl_dyn_add(&req, "Cookie: ");
if(!result) {
- result = Curl_add_bufferf(&req_buffer, "%s%s", count?"; ":"",
- addcookies);
+ result = Curl_dyn_addf(&req, "%s%s", count?"; ":"", addcookies);
count++;
}
}
if(count && !result)
- result = Curl_add_buffer(&req_buffer, "\r\n", 2);
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
}
#endif
- result = Curl_add_timecondition(conn, req_buffer);
+ result = Curl_add_timecondition(conn, &req);
if(result)
return result;
- result = Curl_add_custom_headers(conn, FALSE, req_buffer);
+ result = Curl_add_custom_headers(conn, FALSE, &req);
if(result)
return result;
@@ -2751,20 +2674,20 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if((postsize != -1) && !data->req.upload_chunky &&
(conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length"))) {
/* only add Content-Length if not uploading chunked */
- result = Curl_add_bufferf(&req_buffer,
- "Content-Length: %" CURL_FORMAT_CURL_OFF_T
- "\r\n", postsize);
+ result = Curl_dyn_addf(&req, "Content-Length: %" CURL_FORMAT_CURL_OFF_T
+ "\r\n", postsize);
if(result)
return result;
}
if(postsize != 0) {
- result = expect100(data, conn, req_buffer);
+ result = expect100(data, conn, &req);
if(result)
return result;
}
- result = Curl_add_buffer(&req_buffer, "\r\n", 2); /* end of headers */
+ /* end of headers */
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
@@ -2772,8 +2695,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
Curl_pgrsSetUploadSize(data, postsize);
/* this sends the buffer and frees all the buffer resources */
- result = Curl_add_buffer_send(&req_buffer, conn,
- &data->info.request_size, 0, FIRSTSOCKET);
+ result = Curl_buffer_send(&req, conn, &data->info.request_size, 0,
+ FIRSTSOCKET);
if(result)
failf(data, "Failed sending PUT request");
else
@@ -2789,12 +2712,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* This is form posting using mime data. */
if(conn->bits.authneg) {
/* nothing to post! */
- result = Curl_add_bufferf(&req_buffer, "Content-Length: 0\r\n\r\n");
+ result = Curl_dyn_add(&req, "Content-Length: 0\r\n\r\n");
if(result)
return result;
- result = Curl_add_buffer_send(&req_buffer, conn,
- &data->info.request_size, 0, FIRSTSOCKET);
+ result = Curl_buffer_send(&req, conn, &data->info.request_size, 0,
+ FIRSTSOCKET);
if(result)
failf(data, "Failed sending POST request");
else
@@ -2812,9 +2735,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
(conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length"))) {
/* we allow replacing this header if not during auth negotiation,
although it isn't very wise to actually set your own */
- result = Curl_add_bufferf(&req_buffer,
- "Content-Length: %" CURL_FORMAT_CURL_OFF_T
- "\r\n", postsize);
+ result = Curl_dyn_addf(&req,
+ "Content-Length: %" CURL_FORMAT_CURL_OFF_T
+ "\r\n", postsize);
if(result)
return result;
}
@@ -2825,7 +2748,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
struct curl_slist *hdr;
for(hdr = http->sendit->curlheaders; hdr; hdr = hdr->next) {
- result = Curl_add_bufferf(&req_buffer, "%s\r\n", hdr->data);
+ result = Curl_dyn_addf(&req, "%s\r\n", hdr->data);
if(result)
return result;
}
@@ -2842,7 +2765,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
Curl_compareheader(ptr, "Expect:", "100-continue");
}
else if(postsize > EXPECT_100_THRESHOLD || postsize < 0) {
- result = expect100(data, conn, req_buffer);
+ result = expect100(data, conn, &req);
if(result)
return result;
}
@@ -2850,7 +2773,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
data->state.expect100header = FALSE;
/* make the request end in a true CRLF */
- result = Curl_add_buffer(&req_buffer, "\r\n", 2);
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
@@ -2863,8 +2786,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
http->sending = HTTPSEND_BODY;
/* this sends the buffer and frees all the buffer resources */
- result = Curl_add_buffer_send(&req_buffer, conn,
- &data->info.request_size, 0, FIRSTSOCKET);
+ result = Curl_buffer_send(&req, conn, &data->info.request_size, 0,
+ FIRSTSOCKET);
if(result)
failf(data, "Failed sending POST request");
else
@@ -2892,17 +2815,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
(conn->bits.authneg || !Curl_checkheaders(conn, "Content-Length"))) {
/* we allow replacing this header if not during auth negotiation,
although it isn't very wise to actually set your own */
- result = Curl_add_bufferf(&req_buffer,
- "Content-Length: %" CURL_FORMAT_CURL_OFF_T
- "\r\n", postsize);
+ result = Curl_dyn_addf(&req, "Content-Length: %" CURL_FORMAT_CURL_OFF_T
+ "\r\n", postsize);
if(result)
return result;
}
if(!Curl_checkheaders(conn, "Content-Type")) {
- result = Curl_add_bufferf(&req_buffer,
- "Content-Type: application/"
- "x-www-form-urlencoded\r\n");
+ result = Curl_dyn_add(&req, "Content-Type: application/"
+ "x-www-form-urlencoded\r\n");
if(result)
return result;
}
@@ -2917,7 +2838,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
Curl_compareheader(ptr, "Expect:", "100-continue");
}
else if(postsize > EXPECT_100_THRESHOLD || postsize < 0) {
- result = expect100(data, conn, req_buffer);
+ result = expect100(data, conn, &req);
if(result)
return result;
}
@@ -2938,31 +2859,32 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
is no magic limit but only set to prevent really huge POSTs to
get the data duplicated with malloc() and family. */
- result = Curl_add_buffer(&req_buffer, "\r\n", 2); /* end of headers! */
+ /* end of headers! */
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
if(!data->req.upload_chunky) {
/* We're not sending it 'chunked', append it to the request
already now to reduce the number if send() calls */
- result = Curl_add_buffer(&req_buffer, data->set.postfields,
- (size_t)postsize);
+ result = Curl_dyn_addn(&req, data->set.postfields,
+ (size_t)postsize);
included_body = postsize;
}
else {
if(postsize) {
/* Append the POST data chunky-style */
- result = Curl_add_bufferf(&req_buffer, "%x\r\n", (int)postsize);
+ result = Curl_dyn_addf(&req, "%x\r\n", (int)postsize);
if(!result) {
- result = Curl_add_buffer(&req_buffer, data->set.postfields,
- (size_t)postsize);
+ result = Curl_dyn_addn(&req, data->set.postfields,
+ (size_t)postsize);
if(!result)
- result = Curl_add_buffer(&req_buffer, "\r\n", 2);
+ result = Curl_dyn_add(&req, "\r\n");
included_body = postsize + 2;
}
}
if(!result)
- result = Curl_add_buffer(&req_buffer, "\x30\x0d\x0a\x0d\x0a", 5);
+ result = Curl_dyn_add(&req, "\x30\x0d\x0a\x0d\x0a");
/* 0 CR LF CR LF */
included_body += 5;
}
@@ -2984,21 +2906,22 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* set the upload size to the progress meter */
Curl_pgrsSetUploadSize(data, http->postsize);
- result = Curl_add_buffer(&req_buffer, "\r\n", 2); /* end of headers! */
+ /* end of headers! */
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
}
}
else {
- result = Curl_add_buffer(&req_buffer, "\r\n", 2); /* end of headers! */
+ /* end of headers! */
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
if(data->req.upload_chunky && conn->bits.authneg) {
/* Chunky upload is selected and we're negotiating auth still, send
end-of-data only */
- result = Curl_add_buffer(&req_buffer,
- "\x30\x0d\x0a\x0d\x0a", 5);
+ result = Curl_dyn_add(&req, (char *)"\x30\x0d\x0a\x0d\x0a");
/* 0 CR LF CR LF */
if(result)
return result;
@@ -3018,8 +2941,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
}
/* issue the request */
- result = Curl_add_buffer_send(&req_buffer, conn, &data->info.request_size,
- (size_t)included_body, FIRSTSOCKET);
+ result = Curl_buffer_send(&req, conn, &data->info.request_size,
+ (size_t)included_body, FIRSTSOCKET);
if(result)
failf(data, "Failed sending HTTP POST request");
@@ -3029,13 +2952,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
break;
default:
- result = Curl_add_buffer(&req_buffer, "\r\n", 2);
+ result = Curl_dyn_add(&req, "\r\n");
if(result)
return result;
/* issue the request */
- result = Curl_add_buffer_send(&req_buffer, conn,
- &data->info.request_size, 0, FIRSTSOCKET);
+ result = Curl_buffer_send(&req, conn, &data->info.request_size, 0,
+ FIRSTSOCKET);
if(result)
failf(data, "Failed sending HTTP request");
@@ -3045,6 +2968,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
}
if(result)
return result;
+ if(!postsize && (http->sending != HTTPSEND_REQUEST))
+ data->req.upload_done = TRUE;
if(data->req.writebytecount) {
/* if a request-body has been sent off, we make sure this progress is noted
@@ -3178,55 +3103,10 @@ checkprotoprefix(struct Curl_easy *data, struct connectdata *conn,
return checkhttpprefix(data, s, len);
}
-/*
- * header_append() copies a chunk of data to the end of the already received
- * header. We make sure that the full string fit in the allocated header
- * buffer, or else we enlarge it.
- */
-static CURLcode header_append(struct Curl_easy *data,
- struct SingleRequest *k,
- size_t length)
-{
- /* length is at most the size of a full read buffer, for which the upper
- bound is CURL_MAX_READ_SIZE. There is thus no chance of overflow in this
- calculation. */
- size_t newsize = k->hbuflen + length;
- if(newsize > CURL_MAX_HTTP_HEADER) {
- /* The reason to have a max limit for this is to avoid the risk of a bad
- server feeding libcurl with a never-ending header that will cause
- reallocs infinitely */
- failf(data, "Rejected %zu bytes header (max is %d)!", newsize,
- CURL_MAX_HTTP_HEADER);
- return CURLE_OUT_OF_MEMORY;
- }
- if(newsize >= data->state.headersize) {
- /* We enlarge the header buffer as it is too small */
- char *newbuff;
- size_t hbufp_index;
-
- newsize = CURLMAX((k->hbuflen + length) * 3 / 2, data->state.headersize*2);
- hbufp_index = k->hbufp - data->state.headerbuff;
- newbuff = realloc(data->state.headerbuff, newsize);
- if(!newbuff) {
- failf(data, "Failed to alloc memory for big header!");
- return CURLE_OUT_OF_MEMORY;
- }
- data->state.headersize = newsize;
- data->state.headerbuff = newbuff;
- k->hbufp = data->state.headerbuff + hbufp_index;
- }
- memcpy(k->hbufp, k->str_start, length);
- k->hbufp += length;
- k->hbuflen += length;
- *k->hbufp = 0;
-
- return CURLE_OK;
-}
-
static void print_http_error(struct Curl_easy *data)
{
struct SingleRequest *k = &data->req;
- char *beg = k->p;
+ char *beg = Curl_dyn_ptr(&data->state.headerb);
/* make sure that data->req.p points to the HTTP status line */
if(!strncmp(beg, "HTTP", 4)) {
@@ -3264,14 +3144,17 @@ static void print_http_error(struct Curl_easy *data)
* Read any HTTP header lines from the server and pass them to the client app.
*/
CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
- struct connectdata *conn,
- ssize_t *nread,
- bool *stop_reading)
+ struct connectdata *conn,
+ ssize_t *nread,
+ bool *stop_reading)
{
CURLcode result;
struct SingleRequest *k = &data->req;
ssize_t onread = *nread;
char *ostr = k->str;
+ char *headp;
+ char *str_start;
+ char *end_ptr;
/* header line within buffer loop */
do {
@@ -3280,22 +3163,25 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
int writetype;
/* str_start is start of line within buf */
- k->str_start = k->str;
+ str_start = k->str;
/* data is in network encoding so use 0x0a instead of '\n' */
- k->end_ptr = memchr(k->str_start, 0x0a, *nread);
+ end_ptr = memchr(str_start, 0x0a, *nread);
- if(!k->end_ptr) {
+ if(!end_ptr) {
/* Not a complete header line within buffer, append the data to
the end of the headerbuff. */
- result = header_append(data, k, *nread);
+ result = Curl_dyn_addn(&data->state.headerb, str_start, *nread);
if(result)
return result;
if(!k->headerline) {
/* check if this looks like a protocol header */
- statusline st = checkprotoprefix(data, conn, data->state.headerbuff,
- k->hbuflen);
+ statusline st =
+ checkprotoprefix(data, conn,
+ Curl_dyn_ptr(&data->state.headerb),
+ Curl_dyn_len(&data->state.headerb));
+
if(st == STATUS_BAD) {
/* this is not the beginning of a protocol first header line */
k->header = FALSE;
@@ -3313,28 +3199,26 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
/* decrease the size of the remaining (supposed) header line */
- rest_length = (k->end_ptr - k->str) + 1;
+ rest_length = (end_ptr - k->str) + 1;
*nread -= (ssize_t)rest_length;
- k->str = k->end_ptr + 1; /* move past new line */
+ k->str = end_ptr + 1; /* move past new line */
- full_length = k->str - k->str_start;
+ full_length = k->str - str_start;
- result = header_append(data, k, full_length);
+ result = Curl_dyn_addn(&data->state.headerb, str_start, full_length);
if(result)
return result;
- k->end_ptr = k->hbufp;
- k->p = data->state.headerbuff;
-
/****
- * We now have a FULL header line that p points to
+ * We now have a FULL header line in 'headerb'.
*****/
if(!k->headerline) {
/* the first read header */
- statusline st = checkprotoprefix(data, conn, data->state.headerbuff,
- k->hbuflen);
+ statusline st = checkprotoprefix(data, conn,
+ Curl_dyn_ptr(&data->state.headerb),
+ Curl_dyn_len(&data->state.headerb));
if(st == STATUS_BAD) {
streamclose(conn, "bad HTTP: No end-of-message indicator");
/* this is not the beginning of a protocol first header line */
@@ -3357,26 +3241,27 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
- /* headers are in network encoding so
- use 0x0a and 0x0d instead of '\n' and '\r' */
- if((0x0a == *k->p) || (0x0d == *k->p)) {
+ /* headers are in network encoding so use 0x0a and 0x0d instead of '\n'
+ and '\r' */
+ headp = Curl_dyn_ptr(&data->state.headerb);
+ if((0x0a == *headp) || (0x0d == *headp)) {
size_t headerlen;
/* Zero-length header line means end of headers! */
#ifdef CURL_DOES_CONVERSIONS
- if(0x0d == *k->p) {
- *k->p = '\r'; /* replace with CR in host encoding */
- k->p++; /* pass the CR byte */
+ if(0x0d == *headp) {
+ *headp = '\r'; /* replace with CR in host encoding */
+ headp++; /* pass the CR byte */
}
- if(0x0a == *k->p) {
- *k->p = '\n'; /* replace with LF in host encoding */
- k->p++; /* pass the LF byte */
+ if(0x0a == *headp) {
+ *headp = '\n'; /* replace with LF in host encoding */
+ headp++; /* pass the LF byte */
}
#else
- if('\r' == *k->p)
- k->p++; /* pass the \r byte */
- if('\n' == *k->p)
- k->p++; /* pass the \n byte */
+ if('\r' == *headp)
+ headp++; /* pass the \r byte */
+ if('\n' == *headp)
+ headp++; /* pass the \n byte */
#endif /* CURL_DOES_CONVERSIONS */
if(100 <= k->httpcode && 199 >= k->httpcode) {
@@ -3437,7 +3322,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if((k->size == -1) && !k->chunk && !conn->bits.close &&
(conn->httpversion == 11) &&
!(conn->handler->protocol & CURLPROTO_RTSP) &&
- data->set.httpreq != HTTPREQ_HEAD) {
+ data->state.httpreq != HTTPREQ_HEAD) {
/* On HTTP 1.1, when connection is not to get closed, but no
Content-Length nor Transfer-Encoding chunked have been
received, according to RFC2616 section 4.4 point 5, we
@@ -3495,10 +3380,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(data->set.include_header)
writetype |= CLIENTWRITE_BODY;
- headerlen = k->p - data->state.headerbuff;
-
+ headerlen = Curl_dyn_len(&data->state.headerb);
result = Curl_client_write(conn, writetype,
- data->state.headerbuff,
+ Curl_dyn_ptr(&data->state.headerb),
headerlen);
if(result)
return result;
@@ -3533,7 +3417,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* continue sending even if it gets discarded
*/
- switch(data->set.httpreq) {
+ switch(data->state.httpreq) {
case HTTPREQ_PUT:
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
@@ -3544,7 +3428,16 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
*/
Curl_expire_done(data, EXPIRE_100_TIMEOUT);
if(!k->upload_done) {
- if(data->set.http_keep_sending_on_error) {
+ if((k->httpcode == 417) && data->state.expect100header) {
+ /* 417 Expectation Failed - try again without the Expect
+ header */
+ infof(data, "Got 417 while waiting for a 100\n");
+ data->state.disableexpect = TRUE;
+ DEBUGASSERT(!data->req.newurl);
+ data->req.newurl = strdup(conn->data->change.url);
+ Curl_done_sending(conn, k);
+ }
+ else if(data->set.http_keep_sending_on_error) {
infof(data, "HTTP error before end of send, keep sending\n");
if(k->exp100 > EXP100_SEND_DATA) {
k->exp100 = EXP100_SEND_DATA;
@@ -3642,14 +3535,12 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
if(data->set.verbose)
Curl_debug(data, CURLINFO_HEADER_IN,
- k->str_start, headerlen);
+ str_start, headerlen);
break; /* exit header line loop */
}
- /* We continue reading headers, so reset the line-based
- header parsing variables hbufp && hbuflen */
- k->hbufp = data->state.headerbuff;
- k->hbuflen = 0;
+ /* We continue reading headers, reset the line-based header */
+ Curl_dyn_reset(&data->state.headerb);
continue;
}
@@ -3668,12 +3559,11 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
#define SCRATCHSIZE 21
CURLcode res;
char scratch[SCRATCHSIZE + 1]; /* "HTTP/major.minor 123" */
- /* We can't really convert this yet because we
- don't know if it's the 1st header line or the body.
- So we do a partial conversion into a scratch area,
- leaving the data at k->p as-is.
+ /* We can't really convert this yet because we don't know if it's the
+ 1st header line or the body. So we do a partial conversion into a
+ scratch area, leaving the data at 'headp' as-is.
*/
- strncpy(&scratch[0], k->p, SCRATCHSIZE);
+ strncpy(&scratch[0], headp, SCRATCHSIZE);
scratch[SCRATCHSIZE] = 0; /* null terminate */
res = Curl_convert_from_network(data,
&scratch[0],
@@ -3682,7 +3572,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
/* Curl_convert_from_network calls failf if unsuccessful */
return res;
#else
-#define HEADER1 k->p /* no conversion needed, just use k->p */
+#define HEADER1 headp /* no conversion needed, just use headp */
#endif /* CURL_DOES_CONVERSIONS */
if(conn->handler->protocol & PROTO_FAMILY_HTTP) {
@@ -3733,7 +3623,11 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
compare header line against list of aliases
*/
if(!nc) {
- if(checkhttpprefix(data, k->p, k->hbuflen) == STATUS_DONE) {
+ statusline check =
+ checkhttpprefix(data,
+ Curl_dyn_ptr(&data->state.headerb),
+ Curl_dyn_len(&data->state.headerb));
+ if(check == STATUS_DONE) {
nc = 1;
k->httpcode = 200;
conn->httpversion = 10;
@@ -3779,15 +3673,18 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* depending on how authentication is working. Other codes
* are definitely errors, so give up here.
*/
- if(data->state.resume_from && data->set.httpreq == HTTPREQ_GET &&
+ if(data->state.resume_from && data->state.httpreq == HTTPREQ_GET &&
k->httpcode == 416) {
/* "Requested Range Not Satisfiable", just proceed and
pretend this is no error */
k->ignorebody = TRUE; /* Avoid appending error msg to good data. */
}
else if(data->set.http_fail_on_error && (k->httpcode >= 400) &&
- ((k->httpcode != 401) || !conn->bits.user_passwd) &&
- ((k->httpcode != 407) || !conn->bits.proxy_user_passwd) ) {
+ ((k->httpcode != 401) || !conn->bits.user_passwd)
+#ifndef CURL_DISABLE_PROXY
+ && ((k->httpcode != 407) || !conn->bits.proxy_user_passwd)
+#endif
+ ) {
/* serious error, go home! */
print_http_error(data);
return CURLE_HTTP_RETURNED_ERROR;
@@ -3803,9 +3700,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
else if(conn->httpversion == 20 ||
(k->upgr101 == UPGR101_REQUESTED && k->httpcode == 101)) {
DEBUGF(infof(data, "HTTP/2 found, allow multiplexing\n"));
-
- /* HTTP/2 cannot blacklist multiplexing since it is a core
- functionality of the protocol */
+ /* HTTP/2 cannot avoid multiplexing since it is a core functionality
+ of the protocol */
conn->bundle->multiuse = BUNDLE_MULTIPLEX;
}
else if(conn->httpversion >= 11 &&
@@ -3845,16 +3741,16 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
- result = Curl_convert_from_network(data, k->p, strlen(k->p));
+ result = Curl_convert_from_network(data, headp, strlen(headp));
/* Curl_convert_from_network calls failf if unsuccessful */
if(result)
return result;
/* Check for Content-Length: header lines to get size */
if(!k->http_bodyless &&
- !data->set.ignorecl && checkprefix("Content-Length:", k->p)) {
+ !data->set.ignorecl && checkprefix("Content-Length:", headp)) {
curl_off_t contentlength;
- CURLofft offt = curlx_strtoofft(k->p + 15, NULL, 10, &contentlength);
+ CURLofft offt = curlx_strtoofft(headp + 15, NULL, 10, &contentlength);
if(offt == CURL_OFFT_OK) {
if(data->set.max_filesize &&
@@ -3885,8 +3781,8 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
}
/* check for Content-Type: header lines to get the MIME-type */
- else if(checkprefix("Content-Type:", k->p)) {
- char *contenttype = Curl_copy_header_value(k->p);
+ else if(checkprefix("Content-Type:", headp)) {
+ char *contenttype = Curl_copy_header_value(headp);
if(!contenttype)
return CURLE_OUT_OF_MEMORY;
if(!*contenttype)
@@ -3897,10 +3793,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
data->info.contenttype = contenttype;
}
}
+#ifndef CURL_DISABLE_PROXY
else if((conn->httpversion == 10) &&
conn->bits.httpproxy &&
- Curl_compareheader(k->p,
- "Proxy-Connection:", "keep-alive")) {
+ Curl_compareheader(headp, "Proxy-Connection:", "keep-alive")) {
/*
* When a HTTP/1.0 reply comes when using a proxy, the
* 'Proxy-Connection: keep-alive' line tells us the
@@ -3912,8 +3808,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
else if((conn->httpversion == 11) &&
conn->bits.httpproxy &&
- Curl_compareheader(k->p,
- "Proxy-Connection:", "close")) {
+ Curl_compareheader(headp, "Proxy-Connection:", "close")) {
/*
* We get a HTTP/1.1 response from a proxy and it says it'll
* close down after this transfer.
@@ -3921,8 +3816,9 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
connclose(conn, "Proxy-Connection: asked to close after done");
infof(data, "HTTP/1.1 proxy connection set close!\n");
}
+#endif
else if((conn->httpversion == 10) &&
- Curl_compareheader(k->p, "Connection:", "keep-alive")) {
+ Curl_compareheader(headp, "Connection:", "keep-alive")) {
/*
* A HTTP/1.0 reply with the 'Connection: keep-alive' line
* tells us the connection will be kept alive for our
@@ -3932,7 +3828,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
connkeep(conn, "Connection keep-alive");
infof(data, "HTTP/1.0 connection set to keep alive!\n");
}
- else if(Curl_compareheader(k->p, "Connection:", "close")) {
+ else if(Curl_compareheader(headp, "Connection:", "close")) {
/*
* [RFC 2616, section 8.1.2.1]
* "Connection: close" is HTTP/1.1 language and means that
@@ -3941,7 +3837,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
*/
streamclose(conn, "Connection: close used");
}
- else if(!k->http_bodyless && checkprefix("Transfer-Encoding:", k->p)) {
+ else if(!k->http_bodyless && checkprefix("Transfer-Encoding:", headp)) {
/* One or more encodings. We check for chunked and/or a compression
algorithm. */
/*
@@ -3953,11 +3849,11 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* of chunks, and a chunk-data set to zero signals the
* end-of-chunks. */
- result = Curl_build_unencoding_stack(conn, k->p + 18, TRUE);
+ result = Curl_build_unencoding_stack(conn, headp + 18, TRUE);
if(result)
return result;
}
- else if(!k->http_bodyless && checkprefix("Content-Encoding:", k->p) &&
+ else if(!k->http_bodyless && checkprefix("Content-Encoding:", headp) &&
data->set.str[STRING_ENCODING]) {
/*
* Process Content-Encoding. Look for the values: identity,
@@ -3966,24 +3862,24 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
* 2616). zlib cannot handle compress. However, errors are
* handled further down when the response body is processed
*/
- result = Curl_build_unencoding_stack(conn, k->p + 17, FALSE);
+ result = Curl_build_unencoding_stack(conn, headp + 17, FALSE);
if(result)
return result;
}
- else if(checkprefix("Retry-After:", k->p)) {
+ else if(checkprefix("Retry-After:", headp)) {
/* Retry-After = HTTP-date / delay-seconds */
curl_off_t retry_after = 0; /* zero for unknown or "now" */
- time_t date = curl_getdate(&k->p[12], NULL);
+ time_t date = Curl_getdate_capped(&headp[12]);
if(-1 == date) {
/* not a date, try it as a decimal number */
- (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after);
+ (void)curlx_strtoofft(&headp[12], NULL, 10, &retry_after);
}
else
/* convert date to number of seconds into the future */
retry_after = date - time(NULL);
data->info.retry_after = retry_after; /* store it */
}
- else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) {
+ else if(!k->http_bodyless && checkprefix("Content-Range:", headp)) {
/* Content-Range: bytes [num]-
Content-Range: bytes: [num]-
Content-Range: [num]-
@@ -3995,7 +3891,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
The forth means the requested range was unsatisfied.
*/
- char *ptr = k->p + 14;
+ char *ptr = headp + 14;
/* Move forward until first digit or asterisk */
while(*ptr && !ISDIGIT(*ptr) && *ptr != '*')
@@ -4014,36 +3910,34 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
#if !defined(CURL_DISABLE_COOKIES)
else if(data->cookies && data->state.cookie_engine &&
- checkprefix("Set-Cookie:", k->p)) {
+ checkprefix("Set-Cookie:", headp)) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE,
CURL_LOCK_ACCESS_SINGLE);
Curl_cookie_add(data,
- data->cookies, TRUE, FALSE, k->p + 11,
+ data->cookies, TRUE, FALSE, headp + 11,
/* If there is a custom-set Host: name, use it
here, or else use real peer host name. */
- conn->allocptr.cookiehost?
- conn->allocptr.cookiehost:conn->host.name,
+ data->state.aptr.cookiehost?
+ data->state.aptr.cookiehost:conn->host.name,
data->state.up.path,
(conn->handler->protocol&CURLPROTO_HTTPS)?
TRUE:FALSE);
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
}
#endif
- else if(!k->http_bodyless && checkprefix("Last-Modified:", k->p) &&
+ else if(!k->http_bodyless && checkprefix("Last-Modified:", headp) &&
(data->set.timecondition || data->set.get_filetime) ) {
- time_t secs = time(NULL);
- k->timeofdoc = curl_getdate(k->p + strlen("Last-Modified:"),
- &secs);
+ k->timeofdoc = Curl_getdate_capped(headp + strlen("Last-Modified:"));
if(data->set.get_filetime)
data->info.filetime = k->timeofdoc;
}
- else if((checkprefix("WWW-Authenticate:", k->p) &&
+ else if((checkprefix("WWW-Authenticate:", headp) &&
(401 == k->httpcode)) ||
- (checkprefix("Proxy-authenticate:", k->p) &&
+ (checkprefix("Proxy-authenticate:", headp) &&
(407 == k->httpcode))) {
bool proxy = (k->httpcode == 407) ? TRUE : FALSE;
- char *auth = Curl_copy_header_value(k->p);
+ char *auth = Curl_copy_header_value(headp);
if(!auth)
return CURLE_OUT_OF_MEMORY;
@@ -4055,11 +3949,11 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
return result;
}
#ifdef USE_SPNEGO
- else if(checkprefix("Persistent-Auth", k->p)) {
+ else if(checkprefix("Persistent-Auth", headp)) {
struct negotiatedata *negdata = &conn->negotiate;
struct auth *authp = &data->state.authhost;
if(authp->picked == CURLAUTH_NEGOTIATE) {
- char *persistentauth = Curl_copy_header_value(k->p);
+ char *persistentauth = Curl_copy_header_value(headp);
if(!persistentauth)
return CURLE_OUT_OF_MEMORY;
negdata->noauthpersist = checkprefix("false", persistentauth)?
@@ -4072,10 +3966,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
#endif
else if((k->httpcode >= 300 && k->httpcode < 400) &&
- checkprefix("Location:", k->p) &&
+ checkprefix("Location:", headp) &&
!data->req.location) {
/* this is the URL that the server advises us to use instead */
- char *location = Curl_copy_header_value(k->p);
+ char *location = Curl_copy_header_value(headp);
if(!location)
return CURLE_OUT_OF_MEMORY;
if(!*location)
@@ -4100,7 +3994,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
#ifdef USE_ALTSVC
/* If enabled, the header is incoming and this is over HTTPS */
- else if(data->asi && checkprefix("Alt-Svc:", k->p) &&
+ else if(data->asi && checkprefix("Alt-Svc:", headp) &&
((conn->handler->flags & PROTOPT_SSL) ||
#ifdef CURLDEBUG
/* allow debug builds to circumvent the HTTPS restriction */
@@ -4112,7 +4006,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
/* the ALPN of the current request */
enum alpnid id = (conn->httpversion == 20) ? ALPN_h2 : ALPN_h1;
result = Curl_altsvc_parse(data, data->asi,
- &k->p[ strlen("Alt-Svc:") ],
+ &headp[ strlen("Alt-Svc:") ],
id, conn->host.name,
curlx_uitous(conn->remote_port));
if(result)
@@ -4120,7 +4014,7 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
}
#endif
else if(conn->handler->protocol & CURLPROTO_RTSP) {
- result = Curl_rtsp_parseheader(conn, k->p);
+ result = Curl_rtsp_parseheader(conn, headp);
if(result)
return result;
}
@@ -4134,18 +4028,18 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
writetype |= CLIENTWRITE_BODY;
if(data->set.verbose)
- Curl_debug(data, CURLINFO_HEADER_IN, k->p, (size_t)k->hbuflen);
+ Curl_debug(data, CURLINFO_HEADER_IN, headp,
+ Curl_dyn_len(&data->state.headerb));
- result = Curl_client_write(conn, writetype, k->p, k->hbuflen);
+ result = Curl_client_write(conn, writetype, headp,
+ Curl_dyn_len(&data->state.headerb));
if(result)
return result;
- data->info.header_size += (long)k->hbuflen;
- data->req.headerbytecount += (long)k->hbuflen;
+ data->info.header_size += Curl_dyn_len(&data->state.headerb);
+ data->req.headerbytecount += Curl_dyn_len(&data->state.headerb);
- /* reset hbufp pointer && hbuflen */
- k->hbufp = data->state.headerbuff;
- k->hbuflen = 0;
+ Curl_dyn_reset(&data->state.headerb);
}
while(*k->str); /* header line within buffer */
diff --git a/lib/http.h b/lib/http.h
index a3a275702..9ea3eb283 100644
--- a/lib/http.h
+++ b/lib/http.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,38 +44,19 @@ char *Curl_copy_header_value(const char *header);
char *Curl_checkProxyheaders(const struct connectdata *conn,
const char *thisheader);
-/* ------------------------------------------------------------------------- */
-/*
- * The add_buffer series of functions are used to build one large memory chunk
- * from repeated function invokes. Used so that the entire HTTP request can
- * be sent in one go.
- */
-struct Curl_send_buffer {
- char *buffer;
- size_t size_max;
- size_t size_used;
-};
-typedef struct Curl_send_buffer Curl_send_buffer;
-
-Curl_send_buffer *Curl_add_buffer_init(void);
-void Curl_add_buffer_free(Curl_send_buffer **inp);
-CURLcode Curl_add_bufferf(Curl_send_buffer **inp, const char *fmt, ...)
- WARN_UNUSED_RESULT;
-CURLcode Curl_add_buffer(Curl_send_buffer **inp, const void *inptr,
- size_t size) WARN_UNUSED_RESULT;
-CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
- struct connectdata *conn,
- curl_off_t *bytes_written,
- size_t included_body_bytes,
- int socketindex);
+CURLcode Curl_buffer_send(struct dynbuf *in,
+ struct connectdata *conn,
+ curl_off_t *bytes_written,
+ size_t included_body_bytes,
+ int socketindex);
CURLcode Curl_add_timecondition(const struct connectdata *conn,
- Curl_send_buffer *buf);
+ struct dynbuf *buf);
CURLcode Curl_add_custom_headers(struct connectdata *conn,
bool is_connect,
- Curl_send_buffer *req_buffer);
+ struct dynbuf *req_buffer);
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
- Curl_send_buffer **buffer,
+ struct dynbuf *buf,
struct Curl_easy *handle);
/* protocol-specific functions set up to be called by the main engine */
@@ -116,7 +97,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn);
*
*/
#ifndef EXPECT_100_THRESHOLD
-#define EXPECT_100_THRESHOLD 1024
+#define EXPECT_100_THRESHOLD (1024*1024)
#endif
#endif /* CURL_DISABLE_HTTP */
@@ -154,9 +135,9 @@ struct HTTP {
} sending;
#ifndef CURL_DISABLE_HTTP
- Curl_send_buffer *send_buffer; /* used if the request couldn't be sent in
- one chunk, points to an allocated
- send_buffer struct */
+ struct dynbuf send_buffer; /* used if the request couldn't be sent in one
+ chunk, points to an allocated send_buffer
+ struct */
#endif
#ifdef USE_NGHTTP2
/*********** for HTTP/2 we store stream-local data here *************/
@@ -164,10 +145,10 @@ struct HTTP {
bool bodystarted;
/* We store non-final and final response headers here, per-stream */
- Curl_send_buffer *header_recvbuf;
+ struct dynbuf header_recvbuf;
size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into
upper layer */
- Curl_send_buffer *trailer_recvbuf;
+ struct dynbuf trailer_recvbuf;
int status_code; /* HTTP status code */
const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
size_t pauselen; /* the number of bytes left in data */
@@ -193,12 +174,15 @@ struct HTTP {
#ifdef ENABLE_QUIC
/*********** for HTTP/3 we store stream-local data here *************/
int64_t stream3_id; /* stream we are interested in */
+ bool firstheader; /* FALSE until headers arrive */
bool firstbody; /* FALSE until body arrives */
bool h3req; /* FALSE until request is issued */
bool upload_done;
#endif
#ifdef USE_NGHTTP3
+ size_t unacked_window;
struct h3out *h3out; /* per-stream buffers for upload */
+ struct dynbuf overflow; /* excess data received during a single Curl_read */
#endif
};
diff --git a/lib/http2.c b/lib/http2.c
index 6315fc401..925d9828b 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,6 +36,7 @@
#include "connect.h"
#include "strtoofft.h"
#include "strdup.h"
+#include "dynbuf.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -43,19 +44,11 @@
#define H2_BUFSIZE 32768
-#if (NGHTTP2_VERSION_NUM < 0x010000)
+#if (NGHTTP2_VERSION_NUM < 0x010c00)
#error too old nghttp2 version, upgrade!
#endif
-#if (NGHTTP2_VERSION_NUM > 0x010800)
-#define NGHTTP2_HAS_HTTP2_STRERROR 1
-#endif
-
-#if (NGHTTP2_VERSION_NUM >= 0x010900)
-/* nghttp2_session_callbacks_set_error_callback is present in nghttp2 1.9.0 or
- later */
-#define NGHTTP2_HAS_ERROR_CALLBACK 1
-#else
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define nghttp2_session_callbacks_set_error_callback(x,y)
#endif
@@ -63,12 +56,12 @@
#define NGHTTP2_HAS_SET_LOCAL_WINDOW_SIZE 1
#endif
-#define HTTP2_HUGE_WINDOW_SIZE (1 << 30)
+#define HTTP2_HUGE_WINDOW_SIZE (32 * 1024 * 1024) /* 32 MB */
#ifdef DEBUG_HTTP2
#define H2BUGF(x) x
#else
-#define H2BUGF(x) do { } WHILE_FALSE
+#define H2BUGF(x) do { } while(0)
#endif
@@ -132,8 +125,7 @@ static int http2_getsock(struct connectdata *conn,
static void http2_stream_free(struct HTTP *http)
{
if(http) {
- Curl_add_buffer_free(&http->header_recvbuf);
- Curl_add_buffer_free(&http->trailer_recvbuf);
+ Curl_dyn_free(&http->header_recvbuf);
for(; http->push_headers_used > 0; --http->push_headers_used) {
free(http->push_headers[http->push_headers_used - 1]);
}
@@ -266,16 +258,14 @@ static unsigned int http2_conncheck(struct connectdata *check,
void Curl_http2_setup_req(struct Curl_easy *data)
{
struct HTTP *http = data->req.protop;
-
- http->nread_header_recvbuf = 0;
http->bodystarted = FALSE;
http->status_code = -1;
http->pausedata = NULL;
http->pauselen = 0;
http->closed = FALSE;
http->close_handled = FALSE;
- http->mem = data->state.buffer;
- http->len = data->set.buffer_size;
+ http->mem = NULL;
+ http->len = 0;
http->memlen = 0;
}
@@ -310,6 +300,7 @@ static const struct Curl_handler Curl_handler_http2 = {
http2_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTP, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_STREAM /* flags */
};
@@ -331,6 +322,7 @@ static const struct Curl_handler Curl_handler_http2_ssl = {
http2_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
};
@@ -341,36 +333,7 @@ static const struct Curl_handler Curl_handler_http2_ssl = {
int Curl_http2_ver(char *p, size_t len)
{
nghttp2_info *h2 = nghttp2_version(0);
- return msnprintf(p, len, " nghttp2/%s", h2->version_str);
-}
-
-/* HTTP/2 error code to name based on the Error Code Registry.
-https://tools.ietf.org/html/rfc7540#page-77
-nghttp2_error_code enums are identical.
-*/
-static const char *http2_strerror(uint32_t err)
-{
-#ifndef NGHTTP2_HAS_HTTP2_STRERROR
- const char *str[] = {
- "NO_ERROR", /* 0x0 */
- "PROTOCOL_ERROR", /* 0x1 */
- "INTERNAL_ERROR", /* 0x2 */
- "FLOW_CONTROL_ERROR", /* 0x3 */
- "SETTINGS_TIMEOUT", /* 0x4 */
- "STREAM_CLOSED", /* 0x5 */
- "FRAME_SIZE_ERROR", /* 0x6 */
- "REFUSED_STREAM", /* 0x7 */
- "CANCEL", /* 0x8 */
- "COMPRESSION_ERROR", /* 0x9 */
- "CONNECT_ERROR", /* 0xA */
- "ENHANCE_YOUR_CALM", /* 0xB */
- "INADEQUATE_SECURITY", /* 0xC */
- "HTTP_1_1_REQUIRED" /* 0xD */
- };
- return (err < sizeof(str) / sizeof(str[0])) ? str[err] : "unknown";
-#else
- return nghttp2_http2_strerror(err);
-#endif
+ return msnprintf(p, len, "nghttp2/%s", h2->version_str);
}
/*
@@ -500,26 +463,60 @@ static struct Curl_easy *duphandle(struct Curl_easy *data)
}
else {
second->req.protop = http;
- http->header_recvbuf = Curl_add_buffer_init();
- if(!http->header_recvbuf) {
- free(http);
- (void)Curl_close(&second);
- }
- else {
- Curl_http2_setup_req(second);
- second->state.stream_weight = data->state.stream_weight;
- }
+ Curl_dyn_init(&http->header_recvbuf, DYN_H2_HEADERS);
+ Curl_http2_setup_req(second);
+ second->state.stream_weight = data->state.stream_weight;
}
}
return second;
}
+static int set_transfer_url(struct Curl_easy *data,
+ struct curl_pushheaders *hp)
+{
+ const char *v;
+ CURLU *u = curl_url();
+ CURLUcode uc;
+ char *url;
+
+ v = curl_pushheader_byname(hp, ":scheme");
+ if(v) {
+ uc = curl_url_set(u, CURLUPART_SCHEME, v, 0);
+ if(uc)
+ return 1;
+ }
+
+ v = curl_pushheader_byname(hp, ":authority");
+ if(v) {
+ uc = curl_url_set(u, CURLUPART_HOST, v, 0);
+ if(uc)
+ return 2;
+ }
+
+ v = curl_pushheader_byname(hp, ":path");
+ if(v) {
+ uc = curl_url_set(u, CURLUPART_PATH, v, 0);
+ if(uc)
+ return 3;
+ }
+
+ uc = curl_url_get(u, CURLUPART_URL, &url, 0);
+ if(uc)
+ return 4;
+ curl_url_cleanup(u);
+
+ if(data->change.url_alloc)
+ free(data->change.url);
+ data->change.url_alloc = TRUE;
+ data->change.url = url;
+ return 0;
+}
static int push_promise(struct Curl_easy *data,
struct connectdata *conn,
const nghttp2_push_promise *frame)
{
- int rv;
+ int rv; /* one of the CURL_PUSH_* defines */
H2BUGF(infof(data, "PUSH_PROMISE received, stream %u!\n",
frame->promised_stream_id));
if(data->multi->push_cb) {
@@ -533,7 +530,7 @@ static int push_promise(struct Curl_easy *data,
struct Curl_easy *newhandle = duphandle(data);
if(!newhandle) {
infof(data, "failed to duplicate handle\n");
- rv = 1; /* FAIL HARD */
+ rv = CURL_PUSH_DENY; /* FAIL HARD */
goto fail;
}
@@ -546,7 +543,13 @@ static int push_promise(struct Curl_easy *data,
if(!stream) {
failf(data, "Internal NULL stream!\n");
(void)Curl_close(&newhandle);
- rv = 1;
+ rv = CURL_PUSH_DENY;
+ goto fail;
+ }
+
+ rv = set_transfer_url(newhandle, &heads);
+ if(rv) {
+ rv = CURL_PUSH_DENY;
goto fail;
}
@@ -564,6 +567,7 @@ static int push_promise(struct Curl_easy *data,
stream->push_headers_used = 0;
if(rv) {
+ DEBUGASSERT((rv > CURL_PUSH_OK) && (rv <= CURL_PUSH_ERROROUT));
/* denied, kill off the new handle again */
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
@@ -584,7 +588,7 @@ static int push_promise(struct Curl_easy *data,
http2_stream_free(newhandle->req.protop);
newhandle->req.protop = NULL;
Curl_close(&newhandle);
- rv = 1;
+ rv = CURL_PUSH_DENY;
goto fail;
}
@@ -596,12 +600,13 @@ static int push_promise(struct Curl_easy *data,
infof(data, "failed to set user_data for stream %d\n",
frame->promised_stream_id);
DEBUGASSERT(0);
+ rv = CURL_PUSH_DENY;
goto fail;
}
}
else {
H2BUGF(infof(data, "Got PUSH_PROMISE, ignore it!\n"));
- rv = 1;
+ rv = CURL_PUSH_DENY;
}
fail:
return rv;
@@ -705,15 +710,17 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
stream->status_code = -1;
}
- result = Curl_add_buffer(&stream->header_recvbuf, "\r\n", 2);
+ result = Curl_dyn_add(&stream->header_recvbuf, "\r\n");
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
- left = stream->header_recvbuf->size_used - stream->nread_header_recvbuf;
+ left = Curl_dyn_len(&stream->header_recvbuf) -
+ stream->nread_header_recvbuf;
ncopy = CURLMIN(stream->len, left);
memcpy(&stream->mem[stream->memlen],
- stream->header_recvbuf->buffer + stream->nread_header_recvbuf,
+ Curl_dyn_ptr(&stream->header_recvbuf) +
+ stream->nread_header_recvbuf,
ncopy);
stream->nread_header_recvbuf += ncopy;
@@ -736,11 +743,16 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
case NGHTTP2_PUSH_PROMISE:
rv = push_promise(data_s, conn, &frame->push_promise);
if(rv) { /* deny! */
- rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
+ int h2;
+ DEBUGASSERT((rv > CURL_PUSH_OK) && (rv <= CURL_PUSH_ERROROUT));
+ h2 = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
frame->push_promise.promised_stream_id,
NGHTTP2_CANCEL);
- if(nghttp2_is_fatal(rv)) {
- return rv;
+ if(nghttp2_is_fatal(h2))
+ return NGHTTP2_ERR_CALLBACK_FAILURE;
+ else if(rv == CURL_PUSH_ERROROUT) {
+ DEBUGF(infof(data_s, "Fail the parent stream (too)\n"));
+ return NGHTTP2_ERR_CALLBACK_FAILURE;
}
}
break;
@@ -838,7 +850,7 @@ static int on_stream_close(nghttp2_session *session, int32_t stream_id,
return 0;
}
H2BUGF(infof(data_s, "on_stream_close(), %s (err %d), stream %u\n",
- http2_strerror(error_code), error_code, stream_id));
+ nghttp2_http2_strerror(error_code), error_code, stream_id));
stream = data_s->req.protop;
if(!stream)
return NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -889,12 +901,6 @@ static int on_begin_headers(nghttp2_session *session,
return 0;
}
- if(!stream->trailer_recvbuf) {
- stream->trailer_recvbuf = Curl_add_buffer_init();
- if(!stream->trailer_recvbuf) {
- return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
- }
- }
return 0;
}
@@ -1010,26 +1016,12 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
}
if(stream->bodystarted) {
- /* This is trailer fields. */
- /* 4 is for ": " and "\r\n". */
- uint32_t n = (uint32_t)(namelen + valuelen + 4);
-
+ /* This is a trailer */
H2BUGF(infof(data_s, "h2 trailer: %.*s: %.*s\n", namelen, name, valuelen,
value));
-
- result = Curl_add_buffer(&stream->trailer_recvbuf, &n, sizeof(n));
- if(result)
- return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->trailer_recvbuf, name, namelen);
- if(result)
- return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->trailer_recvbuf, ": ", 2);
- if(result)
- return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->trailer_recvbuf, value, valuelen);
- if(result)
- return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->trailer_recvbuf, "\r\n\0", 3);
+ result = Curl_dyn_addf(&stream->trailer_recvbuf,
+ "%.*s: %.*s\r\n", namelen, name,
+ valuelen, value);
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -1044,14 +1036,14 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
stream->status_code = decode_status_code(value, valuelen);
DEBUGASSERT(stream->status_code != -1);
- result = Curl_add_buffer(&stream->header_recvbuf, "HTTP/2 ", 7);
+ result = Curl_dyn_add(&stream->header_recvbuf, "HTTP/2 ");
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->header_recvbuf, value, valuelen);
+ result = Curl_dyn_addn(&stream->header_recvbuf, value, valuelen);
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
/* the space character after the status code is mandatory */
- result = Curl_add_buffer(&stream->header_recvbuf, " \r\n", 3);
+ result = Curl_dyn_add(&stream->header_recvbuf, " \r\n");
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
/* if we receive data for another handle, wake that up */
@@ -1066,16 +1058,16 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
/* nghttp2 guarantees that namelen > 0, and :status was already
received, and this is not pseudo-header field . */
/* convert to a HTTP1-style header */
- result = Curl_add_buffer(&stream->header_recvbuf, name, namelen);
+ result = Curl_dyn_addn(&stream->header_recvbuf, name, namelen);
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->header_recvbuf, ": ", 2);
+ result = Curl_dyn_add(&stream->header_recvbuf, ": ");
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->header_recvbuf, value, valuelen);
+ result = Curl_dyn_addn(&stream->header_recvbuf, value, valuelen);
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
- result = Curl_add_buffer(&stream->header_recvbuf, "\r\n", 2);
+ result = Curl_dyn_add(&stream->header_recvbuf, "\r\n");
if(result)
return NGHTTP2_ERR_CALLBACK_FAILURE;
/* if we receive data for another handle, wake that up */
@@ -1138,8 +1130,7 @@ static ssize_t data_source_read_callback(nghttp2_session *session,
return nread;
}
-#if defined(NGHTTP2_HAS_ERROR_CALLBACK) && \
- !defined(CURL_DISABLE_VERBOSE_STRINGS)
+#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
static int error_callback(nghttp2_session *session,
const char *msg,
size_t len,
@@ -1156,9 +1147,10 @@ static void populate_settings(struct connectdata *conn,
struct http_conn *httpc)
{
nghttp2_settings_entry *iv = httpc->local_settings;
+ DEBUGASSERT(conn->data);
iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
- iv[0].value = (uint32_t)Curl_multi_max_concurrent_streams(conn->data->multi);
+ iv[0].value = Curl_multi_max_concurrent_streams(conn->data->multi);
iv[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
iv[1].value = HTTP2_HUGE_WINDOW_SIZE;
@@ -1169,28 +1161,26 @@ static void populate_settings(struct connectdata *conn,
httpc->local_settings_num = 3;
}
-void Curl_http2_done(struct connectdata *conn, bool premature)
+void Curl_http2_done(struct Curl_easy *data, bool premature)
{
- struct Curl_easy *data = conn->data;
struct HTTP *http = data->req.protop;
- struct http_conn *httpc = &conn->proto.httpc;
+ struct http_conn *httpc = &data->conn->proto.httpc;
/* there might be allocated resources done before this got the 'h2' pointer
setup */
- if(http->header_recvbuf) {
- Curl_add_buffer_free(&http->header_recvbuf);
- Curl_add_buffer_free(&http->trailer_recvbuf);
- if(http->push_headers) {
- /* if they weren't used and then freed before */
- for(; http->push_headers_used > 0; --http->push_headers_used) {
- free(http->push_headers[http->push_headers_used - 1]);
- }
- free(http->push_headers);
- http->push_headers = NULL;
+ Curl_dyn_free(&http->header_recvbuf);
+ Curl_dyn_free(&http->trailer_recvbuf);
+ if(http->push_headers) {
+ /* if they weren't used and then freed before */
+ for(; http->push_headers_used > 0; --http->push_headers_used) {
+ free(http->push_headers[http->push_headers_used - 1]);
}
+ free(http->push_headers);
+ http->push_headers = NULL;
}
- if(!httpc->h2) /* not HTTP/2 ? */
+ if(!(data->conn->handler->protocol&PROTO_FAMILY_HTTP) ||
+ !httpc->h2) /* not HTTP/2 ? */
return;
if(premature) {
@@ -1258,9 +1248,7 @@ static CURLcode http2_init(struct connectdata *conn)
/* nghttp2_on_header_callback */
nghttp2_session_callbacks_set_on_header_callback(callbacks, on_header);
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
nghttp2_session_callbacks_set_error_callback(callbacks, error_callback);
-#endif
/* The nghttp2 session is not yet setup, do it */
rc = nghttp2_session_client_new(&conn->proto.httpc.h2, callbacks, conn);
@@ -1278,7 +1266,7 @@ static CURLcode http2_init(struct connectdata *conn)
/*
* Append headers to ask for a HTTP1.1 to HTTP2 upgrade.
*/
-CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
+CURLcode Curl_http2_request_upgrade(struct dynbuf *req,
struct connectdata *conn)
{
CURLcode result;
@@ -1295,9 +1283,9 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN,
httpc->local_settings,
httpc->local_settings_num);
- if(!binlen) {
+ if(binlen <= 0) {
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
- Curl_add_buffer_free(&req);
+ Curl_dyn_free(req);
return CURLE_FAILED_INIT;
}
conn->proto.httpc.binlen = binlen;
@@ -1305,15 +1293,15 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
result = Curl_base64url_encode(conn->data, (const char *)binsettings, binlen,
&base64, &blen);
if(result) {
- Curl_add_buffer_free(&req);
+ Curl_dyn_free(req);
return result;
}
- result = Curl_add_bufferf(&req,
- "Connection: Upgrade, HTTP2-Settings\r\n"
- "Upgrade: %s\r\n"
- "HTTP2-Settings: %s\r\n",
- NGHTTP2_CLEARTEXT_PROTO_VERSION_ID, base64);
+ result = Curl_dyn_addf(req,
+ "Connection: Upgrade, HTTP2-Settings\r\n"
+ "Upgrade: %s\r\n"
+ "HTTP2-Settings: %s\r\n",
+ NGHTTP2_CLEARTEXT_PROTO_VERSION_ID, base64);
free(base64);
k->upgr101 = UPGR101_REQUESTED;
@@ -1378,6 +1366,14 @@ static int h2_process_pending_input(struct connectdata *conn,
return -1;
}
+ if(nghttp2_session_check_request_allowed(httpc->h2) == 0) {
+ /* No more requests are allowed in the current session, so
+ the connection may not be reused. This is set when a
+ GOAWAY frame has been received or when the limit of stream
+ identifiers has been reached. */
+ connclose(conn, "http/2: No new requests allowed");
+ }
+
if(should_close_session(httpc)) {
H2BUGF(infof(data,
"h2_process_pending_input: nothing to do in this session\n"));
@@ -1390,7 +1386,6 @@ static int h2_process_pending_input(struct connectdata *conn,
}
return -1;
}
-
return 0;
}
@@ -1407,10 +1402,11 @@ CURLcode Curl_http2_done_sending(struct connectdata *conn)
struct HTTP *stream = conn->data->req.protop;
+ struct http_conn *httpc = &conn->proto.httpc;
+ nghttp2_session *h2 = httpc->h2;
+
if(stream->upload_left) {
/* If the stream still thinks there's data left to upload. */
- struct http_conn *httpc = &conn->proto.httpc;
- nghttp2_session *h2 = httpc->h2;
stream->upload_left = 0; /* DONE! */
@@ -1420,6 +1416,23 @@ CURLcode Curl_http2_done_sending(struct connectdata *conn)
(void)h2_process_pending_input(conn, httpc, &result);
}
+
+ /* If nghttp2 still has pending frames unsent */
+ if(nghttp2_session_want_write(h2)) {
+ struct Curl_easy *data = conn->data;
+ struct SingleRequest *k = &data->req;
+ int rv;
+
+ H2BUGF(infof(data, "HTTP/2 still wants to send data (easy %p)\n", data));
+
+ /* re-set KEEP_SEND to make sure we are called again */
+ k->keepon |= KEEP_SEND;
+
+ /* and attempt to send the pending frames */
+ rv = h2_session_send(data, h2);
+ if(rv != 0)
+ result = CURLE_SEND_ERROR;
+ }
}
return result;
}
@@ -1428,8 +1441,6 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
struct Curl_easy *data,
struct HTTP *stream, CURLcode *err)
{
- char *trailer_pos, *trailer_end;
- CURLcode result;
struct http_conn *httpc = &conn->proto.httpc;
if(httpc->pause_stream_id == stream->stream_id) {
@@ -1458,7 +1469,7 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
}
else if(httpc->error_code != NGHTTP2_NO_ERROR) {
failf(data, "HTTP/2 stream %d was not closed cleanly: %s (err %u)",
- stream->stream_id, http2_strerror(httpc->error_code),
+ stream->stream_id, nghttp2_http2_strerror(httpc->error_code),
httpc->error_code);
*err = CURLE_HTTP2_STREAM;
return -1;
@@ -1472,23 +1483,29 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
return -1;
}
- if(stream->trailer_recvbuf && stream->trailer_recvbuf->buffer) {
- trailer_pos = stream->trailer_recvbuf->buffer;
- trailer_end = trailer_pos + stream->trailer_recvbuf->size_used;
+ if(Curl_dyn_len(&stream->trailer_recvbuf)) {
+ char *trailp = Curl_dyn_ptr(&stream->trailer_recvbuf);
+ char *lf;
- for(; trailer_pos < trailer_end;) {
- uint32_t n;
- memcpy(&n, trailer_pos, sizeof(n));
- trailer_pos += sizeof(n);
-
- result = Curl_client_write(conn, CLIENTWRITE_HEADER, trailer_pos, n);
+ do {
+ size_t len = 0;
+ CURLcode result;
+ /* each trailer line ends with a newline */
+ lf = strchr(trailp, '\n');
+ if(!lf)
+ break;
+ len = lf + 1 - trailp;
+
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_IN, trailp, len);
+ /* pass the trailers one by one to the callback */
+ result = Curl_client_write(conn, CLIENTWRITE_HEADER, trailp, len);
if(result) {
*err = result;
return -1;
}
-
- trailer_pos += n + 1;
- }
+ trailp = ++lf;
+ } while(lf);
}
stream->close_handled = TRUE;
@@ -1549,8 +1566,6 @@ static int h2_session_send(struct Curl_easy *data,
static ssize_t http2_recv(struct connectdata *conn, int sockindex,
char *mem, size_t len, CURLcode *err)
{
- CURLcode result = CURLE_OK;
- ssize_t rv;
ssize_t nread;
struct http_conn *httpc = &conn->proto.httpc;
struct Curl_easy *data = conn->data;
@@ -1581,13 +1596,13 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
*/
if(stream->bodystarted &&
- stream->nread_header_recvbuf < stream->header_recvbuf->size_used) {
- /* If there is body data pending for this stream to return, do that */
+ stream->nread_header_recvbuf < Curl_dyn_len(&stream->header_recvbuf)) {
+ /* If there is header data pending for this stream to return, do that */
size_t left =
- stream->header_recvbuf->size_used - stream->nread_header_recvbuf;
+ Curl_dyn_len(&stream->header_recvbuf) - stream->nread_header_recvbuf;
size_t ncopy = CURLMIN(len, left);
- memcpy(mem, stream->header_recvbuf->buffer + stream->nread_header_recvbuf,
- ncopy);
+ memcpy(mem, Curl_dyn_ptr(&stream->header_recvbuf) +
+ stream->nread_header_recvbuf, ncopy);
stream->nread_header_recvbuf += ncopy;
H2BUGF(infof(data, "http2_recv: Got %d bytes from header_recvbuf\n",
@@ -1595,8 +1610,12 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
return ncopy;
}
- H2BUGF(infof(data, "http2_recv: easy %p (stream %u)\n",
- data, stream->stream_id));
+ H2BUGF(infof(data, "http2_recv: easy %p (stream %u) win %u/%u\n",
+ data, stream->stream_id,
+ nghttp2_session_get_local_window_size(httpc->h2),
+ nghttp2_session_get_stream_local_window_size(httpc->h2,
+ stream->stream_id)
+ ));
if((data->state.drain) && stream->memlen) {
H2BUGF(infof(data, "http2_recv: DRAIN %zu bytes stream %u!! (%p => %p)\n",
@@ -1613,8 +1632,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
/* We have paused nghttp2, but we have no pause data (see
on_data_chunk_recv). */
httpc->pause_stream_id = 0;
- if(h2_process_pending_input(conn, httpc, &result) != 0) {
- *err = result;
+ if(h2_process_pending_input(conn, httpc, err) != 0) {
return -1;
}
}
@@ -1627,7 +1645,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
stream->pausedata += nread;
stream->pauselen -= nread;
- infof(data, "%zd data bytes written\n", nread);
if(stream->pauselen == 0) {
H2BUGF(infof(data, "Unpaused by stream %u\n", stream->stream_id));
DEBUGASSERT(httpc->pause_stream_id == stream->stream_id);
@@ -1643,8 +1660,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
frames, then we have to call it again with 0-length data.
Without this, on_stream_close callback will not be called,
and stream could be hanged. */
- if(h2_process_pending_input(conn, httpc, &result) != 0) {
- *err = result;
+ if(h2_process_pending_input(conn, httpc, err) != 0) {
return -1;
}
}
@@ -1670,7 +1686,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
return -1;
}
else {
- char *inbuf;
/* remember where to store incoming data for this stream and how big the
buffer is */
stream->mem = mem;
@@ -1679,16 +1694,15 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
if(httpc->inbuflen == 0) {
nread = ((Curl_recv *)httpc->recv_underlying)(
- conn, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, &result);
+ conn, FIRSTSOCKET, httpc->inbuf, H2_BUFSIZE, err);
if(nread == -1) {
- if(result != CURLE_AGAIN)
+ if(*err != CURLE_AGAIN)
failf(data, "Failed receiving HTTP2 data");
else if(stream->closed)
/* received when the stream was already closed! */
return http2_handle_stream_close(conn, data, stream, err);
- *err = result;
return -1;
}
@@ -1701,47 +1715,18 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
H2BUGF(infof(data, "nread=%zd\n", nread));
httpc->inbuflen = nread;
- inbuf = httpc->inbuf;
+
+ DEBUGASSERT(httpc->nread_inbuf == 0);
}
else {
nread = httpc->inbuflen - httpc->nread_inbuf;
- inbuf = httpc->inbuf + httpc->nread_inbuf;
-
+ (void)nread; /* silence warning, used in debug */
H2BUGF(infof(data, "Use data left in connection buffer, nread=%zd\n",
nread));
}
- rv = nghttp2_session_mem_recv(httpc->h2, (const uint8_t *)inbuf, nread);
- if(nghttp2_is_fatal((int)rv)) {
- failf(data, "nghttp2_session_mem_recv() returned %zd:%s\n",
- rv, nghttp2_strerror((int)rv));
- *err = CURLE_RECV_ERROR;
+ if(h2_process_pending_input(conn, httpc, err) != 0)
return -1;
- }
- H2BUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", rv));
- if(nread == rv) {
- H2BUGF(infof(data, "All data in connection buffer processed\n"));
- httpc->inbuflen = 0;
- httpc->nread_inbuf = 0;
- }
- else {
- httpc->nread_inbuf += rv;
- H2BUGF(infof(data, "%zu bytes left in connection buffer\n",
- httpc->inbuflen - httpc->nread_inbuf));
- }
- /* Always send pending frames in nghttp2 session, because
- nghttp2_session_mem_recv() may queue new frame */
- rv = h2_session_send(data, httpc->h2);
- if(rv != 0) {
- *err = CURLE_SEND_ERROR;
- return -1;
- }
-
- if(should_close_session(httpc)) {
- H2BUGF(infof(data, "http2_recv: nothing to do in this session\n"));
- *err = CURLE_HTTP2;
- return -1;
- }
}
if(stream->memlen) {
ssize_t retlen = stream->memlen;
@@ -1764,8 +1749,6 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
return retlen;
}
- /* If this stream is closed, return 0 to signal the http routine to close
- the connection */
if(stream->closed)
return 0;
*err = CURLE_AGAIN;
@@ -2095,7 +2078,10 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
h2_pri_spec(conn->data, &pri_spec);
- switch(conn->data->set.httpreq) {
+ H2BUGF(infof(conn->data, "http2_send request allowed %d (easy handle %p)\n",
+ nghttp2_session_check_request_allowed(h2), (void *)conn->data));
+
+ switch(conn->data->state.httpreq) {
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
case HTTPREQ_POST_MIME:
@@ -2119,7 +2105,9 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
Curl_safefree(nva);
if(stream_id < 0) {
- H2BUGF(infof(conn->data, "http2_send() send error\n"));
+ H2BUGF(infof(conn->data,
+ "http2_send() nghttp2_submit_request error (%s)%d\n",
+ nghttp2_strerror(stream_id), stream_id));
*err = CURLE_SEND_ERROR;
return -1;
}
@@ -2129,10 +2117,13 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
stream->stream_id = stream_id;
/* this does not call h2_session_send() since there can not have been any
- * priority upodate since the nghttp2_submit_request() call above */
+ * priority update since the nghttp2_submit_request() call above */
rv = nghttp2_session_send(h2);
-
if(rv != 0) {
+ H2BUGF(infof(conn->data,
+ "http2_send() nghttp2_session_send error (%s)%d\n",
+ nghttp2_strerror(rv), rv));
+
*err = CURLE_SEND_ERROR;
return -1;
}
@@ -2166,13 +2157,12 @@ CURLcode Curl_http2_setup(struct connectdata *conn)
struct http_conn *httpc = &conn->proto.httpc;
struct HTTP *stream = conn->data->req.protop;
+ DEBUGASSERT(conn->data->state.buffer);
+
stream->stream_id = -1;
- if(!stream->header_recvbuf) {
- stream->header_recvbuf = Curl_add_buffer_init();
- if(!stream->header_recvbuf)
- return CURLE_OUT_OF_MEMORY;
- }
+ Curl_dyn_init(&stream->header_recvbuf, DYN_H2_HEADERS);
+ Curl_dyn_init(&stream->trailer_recvbuf, DYN_H2_TRAILERS);
if((conn->handler == &Curl_handler_http2_ssl) ||
(conn->handler == &Curl_handler_http2))
@@ -2185,7 +2175,7 @@ CURLcode Curl_http2_setup(struct connectdata *conn)
result = http2_init(conn);
if(result) {
- Curl_add_buffer_free(&stream->header_recvbuf);
+ Curl_dyn_free(&stream->header_recvbuf);
return result;
}
@@ -2193,6 +2183,8 @@ CURLcode Curl_http2_setup(struct connectdata *conn)
stream->upload_left = 0;
stream->upload_mem = NULL;
stream->upload_len = 0;
+ stream->mem = conn->data->state.buffer;
+ stream->len = conn->data->set.buffer_size;
httpc->inbuflen = 0;
httpc->nread_inbuf = 0;
@@ -2216,7 +2208,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
CURLcode result;
struct http_conn *httpc = &conn->proto.httpc;
int rv;
- ssize_t nproc;
struct Curl_easy *data = conn->data;
struct HTTP *stream = conn->data->req.protop;
@@ -2265,7 +2256,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
}
}
-#ifdef NGHTTP2_HAS_SET_LOCAL_WINDOW_SIZE
rv = nghttp2_session_set_local_window_size(httpc->h2, NGHTTP2_FLAG_NONE, 0,
HTTP2_HUGE_WINDOW_SIZE);
if(rv != 0) {
@@ -2273,7 +2263,6 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
nghttp2_strerror(rv), rv);
return CURLE_HTTP2;
}
-#endif
/* we are going to copy mem to httpc->inbuf. This is required since
mem is part of buffer pointed by stream->mem, and callbacks
@@ -2292,42 +2281,59 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
if(nread)
memcpy(httpc->inbuf, mem, nread);
+
httpc->inbuflen = nread;
- nproc = nghttp2_session_mem_recv(httpc->h2, (const uint8_t *)httpc->inbuf,
- httpc->inbuflen);
+ DEBUGASSERT(httpc->nread_inbuf == 0);
- if(nghttp2_is_fatal((int)nproc)) {
- failf(data, "nghttp2_session_mem_recv() failed: %s(%d)",
- nghttp2_strerror((int)nproc), (int)nproc);
+ if(-1 == h2_process_pending_input(conn, httpc, &result))
return CURLE_HTTP2;
- }
- H2BUGF(infof(data, "nghttp2_session_mem_recv() returns %zd\n", nproc));
+ return CURLE_OK;
+}
- if((ssize_t)nread == nproc) {
- httpc->inbuflen = 0;
- httpc->nread_inbuf = 0;
- }
+CURLcode Curl_http2_stream_pause(struct Curl_easy *data, bool pause)
+{
+ DEBUGASSERT(data);
+ DEBUGASSERT(data->conn);
+ /* if it isn't HTTP/2, we're done */
+ if(!data->conn->proto.httpc.h2)
+ return CURLE_OK;
+#ifdef NGHTTP2_HAS_SET_LOCAL_WINDOW_SIZE
else {
- httpc->nread_inbuf += nproc;
- }
+ struct HTTP *stream = data->req.protop;
+ struct http_conn *httpc = &data->conn->proto.httpc;
+ uint32_t window = !pause * HTTP2_HUGE_WINDOW_SIZE;
+ int rv = nghttp2_session_set_local_window_size(httpc->h2,
+ NGHTTP2_FLAG_NONE,
+ stream->stream_id,
+ window);
+ if(rv) {
+ failf(data, "nghttp2_session_set_local_window_size() failed: %s(%d)",
+ nghttp2_strerror(rv), rv);
+ return CURLE_HTTP2;
+ }
- /* Try to send some frames since we may read SETTINGS already. */
- rv = h2_session_send(data, httpc->h2);
+ /* make sure the window update gets sent */
+ rv = h2_session_send(data, httpc->h2);
+ if(rv)
+ return CURLE_SEND_ERROR;
- if(rv != 0) {
- failf(data, "nghttp2_session_send() failed: %s(%d)",
- nghttp2_strerror(rv), rv);
- return CURLE_HTTP2;
- }
+ DEBUGF(infof(data, "Set HTTP/2 window size to %u for stream %u\n",
+ window, stream->stream_id));
- if(should_close_session(httpc)) {
- H2BUGF(infof(data,
- "nghttp2_session_send(): nothing to do in this session\n"));
- return CURLE_HTTP2;
+#ifdef DEBUGBUILD
+ {
+ /* read out the stream local window again */
+ uint32_t window2 =
+ nghttp2_session_get_stream_local_window_size(httpc->h2,
+ stream->stream_id);
+ DEBUGF(infof(data, "HTTP/2 window size is now %u for stream %u\n",
+ window2, stream->stream_id));
+ }
+#endif
}
-
+#endif
return CURLE_OK;
}
diff --git a/lib/http2.h b/lib/http2.h
index 93058ccb3..e82b21280 100644
--- a/lib/http2.h
+++ b/lib/http2.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,7 +42,7 @@ const char *Curl_http2_strerror(uint32_t err);
CURLcode Curl_http2_init(struct connectdata *conn);
void Curl_http2_init_state(struct UrlState *state);
void Curl_http2_init_userset(struct UserDefined *set);
-CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
+CURLcode Curl_http2_request_upgrade(struct dynbuf *req,
struct connectdata *conn);
CURLcode Curl_http2_setup(struct connectdata *conn);
CURLcode Curl_http2_switched(struct connectdata *conn,
@@ -50,7 +50,7 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
/* called from http_setup_conn */
void Curl_http2_setup_conn(struct connectdata *conn);
void Curl_http2_setup_req(struct Curl_easy *data);
-void Curl_http2_done(struct connectdata *conn, bool premature);
+void Curl_http2_done(struct Curl_easy *data, bool premature);
CURLcode Curl_http2_done_sending(struct connectdata *conn);
CURLcode Curl_http2_add_child(struct Curl_easy *parent,
struct Curl_easy *child,
@@ -58,6 +58,7 @@ CURLcode Curl_http2_add_child(struct Curl_easy *parent,
void Curl_http2_remove_child(struct Curl_easy *parent,
struct Curl_easy *child);
void Curl_http2_cleanup_dependencies(struct Curl_easy *data);
+CURLcode Curl_http2_stream_pause(struct Curl_easy *data, bool pause);
/* returns true if the HTTP/2 stream error was HTTP_1_1_REQUIRED */
bool Curl_h2_http_1_1_error(struct connectdata *conn);
@@ -74,6 +75,7 @@ bool Curl_h2_http_1_1_error(struct connectdata *conn);
#define Curl_http2_add_child(x, y, z)
#define Curl_http2_remove_child(x, y)
#define Curl_http2_cleanup_dependencies(x)
+#define Curl_http2_stream_pause(x, y)
#define Curl_h2_http_1_1_error(x) 0
#endif
diff --git a/lib/http_chunks.c b/lib/http_chunks.c
index b6ffa4185..767f806c8 100644
--- a/lib/http_chunks.c
+++ b/lib/http_chunks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
#include "urldata.h" /* it includes http_chunks.h */
#include "sendf.h" /* for the client write stuff */
-
+#include "dynbuf.h"
#include "content_encoding.h"
#include "http.h"
#include "non-ascii.h" /* for Curl_convert_to_network prototype */
@@ -93,6 +93,7 @@ void Curl_httpchunk_init(struct connectdata *conn)
chunk->hexindex = 0; /* start at 0 */
chunk->dataleft = 0; /* no data left yet! */
chunk->state = CHUNK_HEX; /* we get hex first! */
+ Curl_dyn_init(&conn->trailer, DYN_H1_TRAILER);
}
/*
@@ -177,7 +178,6 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
/* we're now expecting data to come, unless size was zero! */
if(0 == ch->datasize) {
ch->state = CHUNK_TRAILER; /* now check for trailers */
- conn->trlPos = 0;
}
else
ch->state = CHUNK_DATA;
@@ -229,32 +229,33 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
case CHUNK_TRAILER:
if((*datap == 0x0d) || (*datap == 0x0a)) {
+ char *tr = Curl_dyn_ptr(&conn->trailer);
/* this is the end of a trailer, but if the trailer was zero bytes
there was no trailer and we move on */
- if(conn->trlPos) {
- /* we allocate trailer with 3 bytes extra room to fit this */
- conn->trailer[conn->trlPos++] = 0x0d;
- conn->trailer[conn->trlPos++] = 0x0a;
- conn->trailer[conn->trlPos] = 0;
+ if(tr) {
+ size_t trlen;
+ result = Curl_dyn_add(&conn->trailer, (char *)"\x0d\x0a");
+ if(result)
+ return CHUNKE_OUT_OF_MEMORY;
+ tr = Curl_dyn_ptr(&conn->trailer);
+ trlen = Curl_dyn_len(&conn->trailer);
/* Convert to host encoding before calling Curl_client_write */
- result = Curl_convert_from_network(conn->data, conn->trailer,
- conn->trlPos);
+ result = Curl_convert_from_network(conn->data, tr, trlen);
if(result)
/* Curl_convert_from_network calls failf if unsuccessful */
/* Treat it as a bad chunk */
return CHUNKE_BAD_CHUNK;
if(!data->set.http_te_skip) {
- result = Curl_client_write(conn, CLIENTWRITE_HEADER,
- conn->trailer, conn->trlPos);
+ result = Curl_client_write(conn, CLIENTWRITE_HEADER, tr, trlen);
if(result) {
*extrap = result;
return CHUNKE_PASSTHRU_ERROR;
}
}
- conn->trlPos = 0;
+ Curl_dyn_reset(&conn->trailer);
ch->state = CHUNK_TRAILER_CR;
if(*datap == 0x0a)
/* already on the LF */
@@ -267,25 +268,9 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
}
}
else {
- /* conn->trailer is assumed to be freed in url.c on a
- connection basis */
- if(conn->trlPos >= conn->trlMax) {
- /* we always allocate three extra bytes, just because when the full
- header has been received we append CRLF\0 */
- char *ptr;
- if(conn->trlMax) {
- conn->trlMax *= 2;
- ptr = realloc(conn->trailer, conn->trlMax + 3);
- }
- else {
- conn->trlMax = 128;
- ptr = malloc(conn->trlMax + 3);
- }
- if(!ptr)
- return CHUNKE_OUT_OF_MEMORY;
- conn->trailer = ptr;
- }
- conn->trailer[conn->trlPos++]=*datap;
+ result = Curl_dyn_addn(&conn->trailer, datap, 1);
+ if(result)
+ return CHUNKE_OUT_OF_MEMORY;
}
datap++;
length--;
diff --git a/lib/http_digest.c b/lib/http_digest.c
index 9616c30ed..b06dc0d82 100644
--- a/lib/http_digest.c
+++ b/lib/http_digest.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -94,15 +94,19 @@ CURLcode Curl_output_digest(struct connectdata *conn,
struct auth *authp;
if(proxy) {
+#ifdef CURL_DISABLE_PROXY
+ return CURLE_NOT_BUILT_IN;
+#else
digest = &data->state.proxydigest;
- allocuserpwd = &conn->allocptr.proxyuserpwd;
+ allocuserpwd = &data->state.aptr.proxyuserpwd;
userp = conn->http_proxy.user;
passwdp = conn->http_proxy.passwd;
authp = &data->state.authproxy;
+#endif
}
else {
digest = &data->state.digest;
- allocuserpwd = &conn->allocptr.userpwd;
+ allocuserpwd = &data->state.aptr.userpwd;
userp = conn->user;
passwdp = conn->passwd;
authp = &data->state.authhost;
diff --git a/lib/http_digest.h b/lib/http_digest.h
index 73410ae88..96e39a7dc 100644
--- a/lib/http_digest.h
+++ b/lib/http_digest.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/http_negotiate.c b/lib/http_negotiate.c
index 8e1f3bf68..0a19ec2af 100644
--- a/lib/http_negotiate.c
+++ b/lib/http_negotiate.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -52,6 +52,7 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
curlnegotiate state;
if(proxy) {
+#ifndef CURL_DISABLE_PROXY
userp = conn->http_proxy.user;
passwdp = conn->http_proxy.passwd;
service = data->set.str[STRING_PROXY_SERVICE_NAME] ?
@@ -59,6 +60,9 @@ CURLcode Curl_input_negotiate(struct connectdata *conn, bool proxy,
host = conn->http_proxy.host.name;
neg_ctx = &conn->proxyneg;
state = conn->proxy_negotiate_state;
+#else
+ return CURLE_NOT_BUILT_IN;
+#endif
}
else {
userp = conn->user;
@@ -119,7 +123,8 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
struct auth *authp = proxy ? &conn->data->state.authproxy :
&conn->data->state.authhost;
curlnegotiate *state = proxy ? &conn->proxy_negotiate_state :
- &conn->http_negotiate_state;
+ &conn->http_negotiate_state;
+ struct Curl_easy *data = conn->data;
char *base64 = NULL;
size_t len = 0;
char *userp;
@@ -164,15 +169,15 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
return result;
userp = aprintf("%sAuthorization: Negotiate %s\r\n", proxy ? "Proxy-" : "",
- base64);
+ base64);
if(proxy) {
- Curl_safefree(conn->allocptr.proxyuserpwd);
- conn->allocptr.proxyuserpwd = userp;
+ Curl_safefree(data->state.aptr.proxyuserpwd);
+ data->state.aptr.proxyuserpwd = userp;
}
else {
- Curl_safefree(conn->allocptr.userpwd);
- conn->allocptr.userpwd = userp;
+ Curl_safefree(data->state.aptr.userpwd);
+ data->state.aptr.userpwd = userp;
}
free(base64);
diff --git a/lib/http_negotiate.h b/lib/http_negotiate.h
index 4f0ac1686..a737f6f78 100644
--- a/lib/http_negotiate.h
+++ b/lib/http_negotiate.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -33,6 +33,8 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy);
void Curl_http_auth_cleanup_negotiate(struct connectdata *conn);
-#endif /* !CURL_DISABLE_HTTP && USE_SPNEGO */
+#else /* !CURL_DISABLE_HTTP && USE_SPNEGO */
+#define Curl_http_auth_cleanup_negotiate(x)
+#endif
#endif /* HEADER_CURL_HTTP_NEGOTIATE_H */
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c
index e4a4fe05d..cab543c75 100644
--- a/lib/http_ntlm.c
+++ b/lib/http_ntlm.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,9 +44,7 @@
/* SSL backend-specific #if branches in this file must be kept in the order
documented in curl_ntlm_core. */
-#if defined(NTLM_NEEDS_NSS_INIT)
-#include "vtls/nssg.h"
-#elif defined(USE_WINDOWS_SSPI)
+#if defined(USE_WINDOWS_SSPI)
#include "curl_sspi.h"
#endif
@@ -133,17 +131,15 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
struct ntlmdata *ntlm;
curlntlm *state;
struct auth *authp;
+ struct Curl_easy *data = conn->data;
- DEBUGASSERT(conn);
- DEBUGASSERT(conn->data);
-#if defined(NTLM_NEEDS_NSS_INIT)
- if(CURLE_OK != Curl_nss_force_init(conn->data))
- return CURLE_OUT_OF_MEMORY;
-#endif
+ DEBUGASSERT(conn);
+ DEBUGASSERT(data);
if(proxy) {
- allocuserpwd = &conn->allocptr.proxyuserpwd;
+#ifndef CURL_DISABLE_PROXY
+ allocuserpwd = &data->state.aptr.proxyuserpwd;
userp = conn->http_proxy.user;
passwdp = conn->http_proxy.passwd;
service = conn->data->set.str[STRING_PROXY_SERVICE_NAME] ?
@@ -152,9 +148,12 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy)
ntlm = &conn->proxyntlm;
state = &conn->proxy_ntlm_state;
authp = &conn->data->state.authproxy;
+#else
+ return CURLE_NOT_BUILT_IN;
+#endif
}
else {
- allocuserpwd = &conn->allocptr.userpwd;
+ allocuserpwd = &data->state.aptr.userpwd;
userp = conn->user;
passwdp = conn->passwd;
service = conn->data->set.str[STRING_SERVICE_NAME] ?
diff --git a/lib/http_ntlm.h b/lib/http_ntlm.h
index 003714dbd..3ebdf979e 100644
--- a/lib/http_ntlm.h
+++ b/lib/http_ntlm.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,6 +35,8 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy);
void Curl_http_auth_cleanup_ntlm(struct connectdata *conn);
-#endif /* !CURL_DISABLE_HTTP && USE_NTLM */
+#else /* !CURL_DISABLE_HTTP && USE_NTLM */
+#define Curl_http_auth_cleanup_ntlm(x)
+#endif
#endif /* HEADER_CURL_HTTP_NTLM_H */
diff --git a/lib/http_proxy.c b/lib/http_proxy.c
index f095455a5..7c34d2064 100644
--- a/lib/http_proxy.c
+++ b/lib/http_proxy.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -58,8 +58,9 @@ static CURLcode https_proxy_connect(struct connectdata *conn, int sockindex)
Curl_ssl_connect_nonblocking(conn, sockindex,
&conn->bits.proxy_ssl_connected[sockindex]);
if(result)
- conn->bits.close = TRUE; /* a failed connection is marked for closure to
- prevent (bad) re-use or similar */
+ /* a failed connection is marked for closure to prevent (bad) re-use or
+ similar */
+ connclose(conn, "TLS handshake failed");
}
return result;
#else
@@ -71,6 +72,7 @@ static CURLcode https_proxy_connect(struct connectdata *conn, int sockindex)
CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)
{
+ struct Curl_easy *data = conn->data;
if(conn->http_proxy.proxytype == CURLPROXY_HTTPS) {
const CURLcode result = https_proxy_connect(conn, sockindex);
if(result)
@@ -126,7 +128,7 @@ CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)
conn->data->req.protop = prot_save;
if(CURLE_OK != result)
return result;
- Curl_safefree(conn->allocptr.proxyuserpwd);
+ Curl_safefree(data->state.aptr.proxyuserpwd);
#else
return CURLE_NOT_BUILT_IN;
#endif
@@ -157,15 +159,15 @@ static CURLcode connect_init(struct connectdata *conn, bool reinit)
return CURLE_OUT_OF_MEMORY;
infof(conn->data, "allocate connect buffer!\n");
conn->connect_state = s;
+ Curl_dyn_init(&s->rcvbuf, DYN_PROXY_CONNECT_HEADERS);
}
else {
DEBUGASSERT(conn->connect_state);
s = conn->connect_state;
+ Curl_dyn_reset(&s->rcvbuf);
}
s->tunnel_state = TUNNEL_INIT;
s->keepon = TRUE;
- s->line_start = s->connect_buffer;
- s->ptr = s->line_start;
s->cl = 0;
s->close_connection = FALSE;
return CURLE_OK;
@@ -175,6 +177,7 @@ static void connect_done(struct connectdata *conn)
{
struct http_connect_state *s = conn->connect_state;
s->tunnel_state = TUNNEL_COMPLETE;
+ Curl_dyn_free(&s->rcvbuf);
infof(conn->data, "CONNECT phase completed!\n");
}
@@ -189,6 +192,8 @@ static CURLcode CONNECT(struct connectdata *conn,
CURLcode result;
curl_socket_t tunnelsocket = conn->sock[sockindex];
struct http_connect_state *s = conn->connect_state;
+ char *linep;
+ size_t perline;
#define SELECT_OK 0
#define SELECT_ERROR 1
@@ -203,7 +208,7 @@ static CURLcode CONNECT(struct connectdata *conn,
if(TUNNEL_INIT == s->tunnel_state) {
/* BEGIN CONNECT PHASE */
char *host_port;
- Curl_send_buffer *req_buffer;
+ struct dynbuf req;
infof(data, "Establish HTTP proxy tunnel to %s:%d\n",
hostname, remote_port);
@@ -214,17 +219,12 @@ static CURLcode CONNECT(struct connectdata *conn,
free(data->req.newurl);
data->req.newurl = NULL;
- /* initialize a dynamic send-buffer */
- req_buffer = Curl_add_buffer_init();
-
- if(!req_buffer)
- return CURLE_OUT_OF_MEMORY;
-
host_port = aprintf("%s:%d", hostname, remote_port);
- if(!host_port) {
- Curl_add_buffer_free(&req_buffer);
+ if(!host_port)
return CURLE_OUT_OF_MEMORY;
- }
+
+ /* initialize a dynamic send-buffer */
+ Curl_dyn_init(&req, DYN_HTTP_REQUEST);
/* Setup the proxy-authorization header, if any */
result = Curl_http_output_auth(conn, "CONNECT", host_port, TRUE);
@@ -235,8 +235,8 @@ static CURLcode CONNECT(struct connectdata *conn,
char *host = NULL;
const char *proxyconn = "";
const char *useragent = "";
- const char *http = (conn->http_proxy.proxytype == CURLPROXY_HTTP_1_0) ?
- "1.0" : "1.1";
+ const char *httpv =
+ (conn->http_proxy.proxytype == CURLPROXY_HTTP_1_0) ? "1.0" : "1.1";
bool ipv6_ip = conn->bits.ipv6_ip;
char *hostheader;
@@ -247,7 +247,7 @@ static CURLcode CONNECT(struct connectdata *conn,
aprintf("%s%s%s:%d", ipv6_ip?"[":"", hostname, ipv6_ip?"]":"",
remote_port);
if(!hostheader) {
- Curl_add_buffer_free(&req_buffer);
+ Curl_dyn_free(&req);
return CURLE_OUT_OF_MEMORY;
}
@@ -255,7 +255,7 @@ static CURLcode CONNECT(struct connectdata *conn,
host = aprintf("Host: %s\r\n", hostheader);
if(!host) {
free(hostheader);
- Curl_add_buffer_free(&req_buffer);
+ Curl_dyn_free(&req);
return CURLE_OUT_OF_MEMORY;
}
}
@@ -264,52 +264,49 @@ static CURLcode CONNECT(struct connectdata *conn,
if(!Curl_checkProxyheaders(conn, "User-Agent") &&
data->set.str[STRING_USERAGENT])
- useragent = conn->allocptr.uagent;
+ useragent = data->state.aptr.uagent;
result =
- Curl_add_bufferf(&req_buffer,
- "CONNECT %s HTTP/%s\r\n"
- "%s" /* Host: */
- "%s" /* Proxy-Authorization */
- "%s" /* User-Agent */
- "%s", /* Proxy-Connection */
- hostheader,
- http,
- host?host:"",
- conn->allocptr.proxyuserpwd?
- conn->allocptr.proxyuserpwd:"",
- useragent,
- proxyconn);
+ Curl_dyn_addf(&req,
+ "CONNECT %s HTTP/%s\r\n"
+ "%s" /* Host: */
+ "%s" /* Proxy-Authorization */
+ "%s" /* User-Agent */
+ "%s", /* Proxy-Connection */
+ hostheader,
+ httpv,
+ host?host:"",
+ data->state.aptr.proxyuserpwd?
+ data->state.aptr.proxyuserpwd:"",
+ useragent,
+ proxyconn);
if(host)
free(host);
free(hostheader);
if(!result)
- result = Curl_add_custom_headers(conn, TRUE, req_buffer);
+ result = Curl_add_custom_headers(conn, TRUE, &req);
if(!result)
/* CRLF terminate the request */
- result = Curl_add_bufferf(&req_buffer, "\r\n");
+ result = Curl_dyn_add(&req, "\r\n");
if(!result) {
/* Send the connect request to the proxy */
/* BLOCKING */
- result =
- Curl_add_buffer_send(&req_buffer, conn,
- &data->info.request_size, 0, sockindex);
+ result = Curl_buffer_send(&req, conn, &data->info.request_size, 0,
+ sockindex);
}
- req_buffer = NULL;
if(result)
failf(data, "Failed sending CONNECT to proxy");
}
- Curl_add_buffer_free(&req_buffer);
+ Curl_dyn_free(&req);
if(result)
return result;
s->tunnel_state = TUNNEL_CONNECT;
- s->perline = 0;
} /* END CONNECT PHASE */
check = Curl_timeleft(data, NULL, TRUE);
@@ -329,16 +326,11 @@ static CURLcode CONNECT(struct connectdata *conn,
while(s->keepon) {
ssize_t gotbytes;
-
- /* make sure we have space to read more data */
- if(s->ptr >= &s->connect_buffer[CONNECT_BUFFER_SIZE]) {
- failf(data, "CONNECT response too large!");
- return CURLE_RECV_ERROR;
- }
+ char byte;
/* Read one byte at a time to avoid a race condition. Wait at most one
second before looping to ensure continuous pgrsUpdates. */
- result = Curl_read(conn, tunnelsocket, s->ptr, 1, &gotbytes);
+ result = Curl_read(conn, tunnelsocket, &byte, 1, &gotbytes);
if(result == CURLE_AGAIN)
/* socket buffer drained, return */
return CURLE_OK;
@@ -365,11 +357,9 @@ static CURLcode CONNECT(struct connectdata *conn,
break;
}
-
if(s->keepon > TRUE) {
/* This means we are currently ignoring a response-body */
- s->ptr = s->connect_buffer;
if(s->cl) {
/* A Content-Length based body: simply count down the counter
and make sure to break out of the loop when we're done! */
@@ -389,7 +379,7 @@ static CURLcode CONNECT(struct connectdata *conn,
/* now parse the chunked piece of data so that we can
properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, s->ptr, 1, &tookcareof, &extra);
+ r = Curl_httpchunk_read(conn, &byte, 1, &tookcareof, &extra);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
infof(data, "chunk reading DONE\n");
@@ -401,25 +391,27 @@ static CURLcode CONNECT(struct connectdata *conn,
continue;
}
- s->perline++; /* amount of bytes in this line so far */
+ if(Curl_dyn_addn(&s->rcvbuf, &byte, 1)) {
+ failf(data, "CONNECT response too large!");
+ return CURLE_RECV_ERROR;
+ }
/* if this is not the end of a header line then continue */
- if(*s->ptr != 0x0a) {
- s->ptr++;
+ if(byte != 0x0a)
continue;
- }
+
+ linep = Curl_dyn_ptr(&s->rcvbuf);
+ perline = Curl_dyn_len(&s->rcvbuf); /* amount of bytes in this line */
/* convert from the network encoding */
- result = Curl_convert_from_network(data, s->line_start,
- (size_t)s->perline);
+ result = Curl_convert_from_network(data, linep, perline);
/* Curl_convert_from_network calls failf if unsuccessful */
if(result)
return result;
/* output debug if that is requested */
if(data->set.verbose)
- Curl_debug(data, CURLINFO_HEADER_IN,
- s->line_start, (size_t)s->perline);
+ Curl_debug(data, CURLINFO_HEADER_IN, linep, perline);
if(!data->set.suppress_connect_headers) {
/* send the header to the callback */
@@ -427,23 +419,21 @@ static CURLcode CONNECT(struct connectdata *conn,
if(data->set.include_header)
writetype |= CLIENTWRITE_BODY;
- result = Curl_client_write(conn, writetype,
- s->line_start, s->perline);
+ result = Curl_client_write(conn, writetype, linep, perline);
if(result)
return result;
}
- data->info.header_size += (long)s->perline;
- data->req.headerbytecount += (long)s->perline;
+ data->info.header_size += (long)perline;
/* Newlines are CRLF, so the CR is ignored as the line isn't
really terminated until the LF comes. Treat a following CR
as end-of-headers as well.*/
- if(('\r' == s->line_start[0]) ||
- ('\n' == s->line_start[0])) {
+ if(('\r' == linep[0]) ||
+ ('\n' == linep[0])) {
/* end of response-headers from the proxy */
- s->ptr = s->connect_buffer;
+
if((407 == k->httpcode) && !data->state.authproblem) {
/* If we get a 407 response code with content length
when we have no auth problem, we must ignore the
@@ -460,21 +450,18 @@ static CURLcode CONNECT(struct connectdata *conn,
infof(data, "Ignore chunked response-body\n");
- /* We set ignorebody true here since the chunked
- decoder function will acknowledge that. Pay
- attention so that this is cleared again when this
- function returns! */
+ /* We set ignorebody true here since the chunked decoder
+ function will acknowledge that. Pay attention so that this is
+ cleared again when this function returns! */
k->ignorebody = TRUE;
- if(s->line_start[1] == '\n') {
- /* this can only be a LF if the letter at index 0
- was a CR */
- s->line_start++;
- }
+ if(linep[1] == '\n')
+ /* this can only be a LF if the letter at index 0 was a CR */
+ linep++;
- /* now parse the chunked piece of data so that we can
- properly tell when the stream ends */
- r = Curl_httpchunk_read(conn, s->line_start + 1, 1, &gotbytes,
+ /* now parse the chunked piece of data so that we can properly
+ tell when the stream ends */
+ r = Curl_httpchunk_read(conn, linep + 1, 1, &gotbytes,
&extra);
if(r == CHUNKE_STOP) {
/* we're done reading chunks! */
@@ -499,14 +486,13 @@ static CURLcode CONNECT(struct connectdata *conn,
continue;
}
- s->line_start[s->perline] = 0; /* zero terminate the buffer */
- if((checkprefix("WWW-Authenticate:", s->line_start) &&
+ if((checkprefix("WWW-Authenticate:", linep) &&
(401 == k->httpcode)) ||
- (checkprefix("Proxy-authenticate:", s->line_start) &&
+ (checkprefix("Proxy-authenticate:", linep) &&
(407 == k->httpcode))) {
bool proxy = (k->httpcode == 407) ? TRUE : FALSE;
- char *auth = Curl_copy_header_value(s->line_start);
+ char *auth = Curl_copy_header_value(linep);
if(!auth)
return CURLE_OUT_OF_MEMORY;
@@ -517,7 +503,7 @@ static CURLcode CONNECT(struct connectdata *conn,
if(result)
return result;
}
- else if(checkprefix("Content-Length:", s->line_start)) {
+ else if(checkprefix("Content-Length:", linep)) {
if(k->httpcode/100 == 2) {
/* A client MUST ignore any Content-Length or Transfer-Encoding
header fields received in a successful response to CONNECT.
@@ -526,13 +512,13 @@ static CURLcode CONNECT(struct connectdata *conn,
k->httpcode);
}
else {
- (void)curlx_strtoofft(s->line_start +
+ (void)curlx_strtoofft(linep +
strlen("Content-Length:"), NULL, 10, &s->cl);
}
}
- else if(Curl_compareheader(s->line_start, "Connection:", "close"))
+ else if(Curl_compareheader(linep, "Connection:", "close"))
s->close_connection = TRUE;
- else if(checkprefix("Transfer-Encoding:", s->line_start)) {
+ else if(checkprefix("Transfer-Encoding:", linep)) {
if(k->httpcode/100 == 2) {
/* A client MUST ignore any Content-Length or Transfer-Encoding
header fields received in a successful response to CONNECT.
@@ -540,7 +526,7 @@ static CURLcode CONNECT(struct connectdata *conn,
infof(data, "Ignoring Transfer-Encoding in "
"CONNECT %03d response\n", k->httpcode);
}
- else if(Curl_compareheader(s->line_start,
+ else if(Curl_compareheader(linep,
"Transfer-Encoding:", "chunked")) {
infof(data, "CONNECT responded chunked\n");
s->chunked_encoding = TRUE;
@@ -548,19 +534,16 @@ static CURLcode CONNECT(struct connectdata *conn,
Curl_httpchunk_init(conn);
}
}
- else if(Curl_compareheader(s->line_start,
- "Proxy-Connection:", "close"))
+ else if(Curl_compareheader(linep, "Proxy-Connection:", "close"))
s->close_connection = TRUE;
- else if(2 == sscanf(s->line_start, "HTTP/1.%d %d",
+ else if(2 == sscanf(linep, "HTTP/1.%d %d",
&subversion,
&k->httpcode)) {
/* store the HTTP code from the proxy */
data->info.httpproxycode = k->httpcode;
}
- s->perline = 0; /* line starts over here */
- s->ptr = s->connect_buffer;
- s->line_start = s->ptr;
+ Curl_dyn_reset(&s->rcvbuf);
} /* while there's buffer left and loop is requested */
if(Curl_pgrsUpdate(conn))
@@ -621,6 +604,7 @@ static CURLcode CONNECT(struct connectdata *conn,
if(conn->bits.proxy_connect_closed)
/* this is not an error, just part of the connection negotiation */
return CURLE_OK;
+ Curl_dyn_free(&s->rcvbuf);
failf(data, "Received HTTP code %d from proxy after CONNECT",
data->req.httpcode);
return CURLE_RECV_ERROR;
@@ -631,8 +615,8 @@ static CURLcode CONNECT(struct connectdata *conn,
/* If a proxy-authorization header was used for the proxy, then we should
make sure that it isn't accidentally used for the document request
after we've connected. So let's free and clear it here. */
- Curl_safefree(conn->allocptr.proxyuserpwd);
- conn->allocptr.proxyuserpwd = NULL;
+ Curl_safefree(data->state.aptr.proxyuserpwd);
+ data->state.aptr.proxyuserpwd = NULL;
data->state.authproxy.done = TRUE;
data->state.authproxy.multipass = FALSE;
@@ -642,6 +626,7 @@ static CURLcode CONNECT(struct connectdata *conn,
data->req.ignorebody = FALSE; /* put it (back) to non-ignore state */
conn->bits.rewindaftersend = FALSE; /* make sure this isn't set for the
document request */
+ Curl_dyn_free(&s->rcvbuf);
return CURLE_OK;
}
diff --git a/lib/http_proxy.h b/lib/http_proxy.h
index e19fa859a..29988a696 100644
--- a/lib/http_proxy.h
+++ b/lib/http_proxy.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,5 +47,6 @@ bool Curl_connect_ongoing(struct connectdata *conn);
#endif
void Curl_connect_free(struct Curl_easy *data);
+void Curl_connect_done(struct Curl_easy *data);
#endif /* HEADER_CURL_HTTP_PROXY_H */
diff --git a/lib/idn_win32.c b/lib/idn_win32.c
index 8dc300b36..2f5850dd0 100644
--- a/lib/idn_win32.c
+++ b/lib/idn_win32.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,13 +72,13 @@ bool curl_win32_idn_to_ascii(const char *in, char **out)
{
bool success = FALSE;
- wchar_t *in_w = Curl_convert_UTF8_to_wchar(in);
+ wchar_t *in_w = curlx_convert_UTF8_to_wchar(in);
if(in_w) {
wchar_t punycode[IDN_MAX_LENGTH];
int chars = IdnToAscii(0, in_w, -1, punycode, IDN_MAX_LENGTH);
free(in_w);
if(chars) {
- *out = Curl_convert_wchar_to_UTF8(punycode);
+ *out = curlx_convert_wchar_to_UTF8(punycode);
if(*out)
success = TRUE;
}
@@ -91,7 +91,7 @@ bool curl_win32_ascii_to_idn(const char *in, char **out)
{
bool success = FALSE;
- wchar_t *in_w = Curl_convert_UTF8_to_wchar(in);
+ wchar_t *in_w = curlx_convert_UTF8_to_wchar(in);
if(in_w) {
size_t in_len = wcslen(in_w) + 1;
wchar_t unicode[IDN_MAX_LENGTH];
@@ -99,7 +99,7 @@ bool curl_win32_ascii_to_idn(const char *in, char **out)
unicode, IDN_MAX_LENGTH);
free(in_w);
if(chars) {
- *out = Curl_convert_wchar_to_UTF8(unicode);
+ *out = curlx_convert_wchar_to_UTF8(unicode);
if(*out)
success = TRUE;
}
diff --git a/lib/if2ip.c b/lib/if2ip.c
index d003de678..39388692e 100644
--- a/lib/if2ip.c
+++ b/lib/if2ip.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -118,7 +118,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
if(iface->ifa_addr->sa_family == af) {
if(strcasecompare(iface->ifa_name, interf)) {
void *addr;
- char *ip;
+ const char *ip;
char scope[12] = "";
char ipstr[64];
#ifdef ENABLE_IPV6
@@ -129,11 +129,11 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
unsigned int ifscope = Curl_ipv6_scope(iface->ifa_addr);
if(ifscope != remote_scope) {
- /* We are interested only in interface addresses whose
- scope matches the remote address we want to
- connect to: global for global, link-local for
- link-local, etc... */
- if(res == IF2IP_NOT_FOUND) res = IF2IP_AF_NOT_SUPPORTED;
+ /* We are interested only in interface addresses whose scope
+ matches the remote address we want to connect to: global
+ for global, link-local for link-local, etc... */
+ if(res == IF2IP_NOT_FOUND)
+ res = IF2IP_AF_NOT_SUPPORTED;
continue;
}
@@ -153,15 +153,15 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
}
if(scopeid)
- msnprintf(scope, sizeof(scope), "%%%u", scopeid);
+ msnprintf(scope, sizeof(scope), "%%%u", scopeid);
#endif
}
else
#endif
addr =
- &((struct sockaddr_in *)(void *)iface->ifa_addr)->sin_addr;
+ &((struct sockaddr_in *)(void *)iface->ifa_addr)->sin_addr;
res = IF2IP_FOUND;
- ip = (char *) Curl_inet_ntop(af, addr, ipstr, sizeof(ipstr));
+ ip = Curl_inet_ntop(af, addr, ipstr, sizeof(ipstr));
msnprintf(buf, buf_size, "%s%s", ip, scope);
break;
}
@@ -190,6 +190,7 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
struct sockaddr_in *s;
curl_socket_t dummy;
size_t len;
+ const char *r;
(void)remote_scope;
(void)local_scope_id;
@@ -219,9 +220,11 @@ if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope,
s = (struct sockaddr_in *)(void *)&req.ifr_addr;
memcpy(&in, &s->sin_addr, sizeof(in));
- Curl_inet_ntop(s->sin_family, &in, buf, buf_size);
+ r = Curl_inet_ntop(s->sin_family, &in, buf, buf_size);
sclose(dummy);
+ if(!r)
+ return IF2IP_NOT_FOUND;
return IF2IP_FOUND;
}
diff --git a/lib/imap.c b/lib/imap.c
index 66172bddc..46367be10 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -132,6 +132,7 @@ const struct Curl_handler Curl_handler_imap = {
ZERO_NULL, /* connection_check */
PORT_IMAP, /* defport */
CURLPROTO_IMAP, /* protocol */
+ CURLPROTO_IMAP, /* family */
PROTOPT_CLOSEACTION| /* flags */
PROTOPT_URLOPTIONS
};
@@ -159,6 +160,7 @@ const struct Curl_handler Curl_handler_imaps = {
ZERO_NULL, /* connection_check */
PORT_IMAPS, /* defport */
CURLPROTO_IMAPS, /* protocol */
+ CURLPROTO_IMAP, /* family */
PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */
PROTOPT_URLOPTIONS
};
@@ -187,7 +189,7 @@ static void imap_to_imaps(struct connectdata *conn)
conn->handler = &Curl_handler_imaps;
/* Set the connection's upgraded to TLS flag */
- conn->tls_upgraded = TRUE;
+ conn->bits.tls_upgraded = TRUE;
}
#else
#define imap_to_imaps(x) Curl_nop_stmt
@@ -1176,6 +1178,9 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
else {
/* IMAP download */
data->req.maxdownload = size;
+ /* force a recv/send check of this connection, as the data might've been
+ read off the socket already */
+ data->conn->cselect_bits = CURL_CSELECT_IN;
Curl_setup_transfer(data, FIRSTSOCKET, size, FALSE, -1);
}
}
@@ -1424,7 +1429,9 @@ static CURLcode imap_connect(struct connectdata *conn, bool *done)
imapc->preftype = IMAP_TYPE_ANY;
Curl_sasl_init(&imapc->sasl, &saslimap);
+ Curl_dyn_init(&imapc->dyn, DYN_IMAP_CMD);
/* Initialise the pingpong layer */
+ Curl_pp_setup(pp);
Curl_pp_init(pp);
/* Parse the URL options */
@@ -1626,6 +1633,7 @@ static CURLcode imap_disconnect(struct connectdata *conn, bool dead_connection)
/* Disconnect from the server */
Curl_pp_disconnect(&imapc->pp);
+ Curl_dyn_free(&imapc->dyn);
/* Cleanup the SASL module */
Curl_sasl_cleanup(conn, imapc->sasl.authused);
@@ -1710,7 +1718,7 @@ static CURLcode imap_setup_connection(struct connectdata *conn)
return result;
/* Clear the TLS upgraded flag */
- conn->tls_upgraded = FALSE;
+ conn->bits.tls_upgraded = FALSE;
return CURLE_OK;
}
@@ -1727,30 +1735,25 @@ static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...)
{
CURLcode result = CURLE_OK;
struct imap_conn *imapc = &conn->proto.imapc;
- char *taggedfmt;
- va_list ap;
DEBUGASSERT(fmt);
- /* Calculate the next command ID wrapping at 3 digits */
- imapc->cmdid = (imapc->cmdid + 1) % 1000;
-
/* Calculate the tag based on the connection ID and command ID */
msnprintf(imapc->resptag, sizeof(imapc->resptag), "%c%03d",
- 'A' + curlx_sltosi(conn->connection_id % 26), imapc->cmdid);
-
- /* Prefix the format with the tag */
- taggedfmt = aprintf("%s %s", imapc->resptag, fmt);
- if(!taggedfmt)
- return CURLE_OUT_OF_MEMORY;
+ 'A' + curlx_sltosi(conn->connection_id % 26),
+ (++imapc->cmdid)%1000);
- /* Send the data with the tag */
- va_start(ap, fmt);
- result = Curl_pp_vsendf(&imapc->pp, taggedfmt, ap);
- va_end(ap);
-
- free(taggedfmt);
+ /* start with a blank buffer */
+ Curl_dyn_reset(&imapc->dyn);
+ /* append tag + space + fmt */
+ result = Curl_dyn_addf(&imapc->dyn, "%s %s", imapc->resptag, fmt);
+ if(!result) {
+ va_list ap;
+ va_start(ap, fmt);
+ result = Curl_pp_vsendf(&imapc->pp, Curl_dyn_ptr(&imapc->dyn), ap);
+ va_end(ap);
+ }
return result;
}
@@ -1957,7 +1960,7 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
end--;
result = Curl_urldecode(data, begin, end - begin, &imap->mailbox, NULL,
- TRUE);
+ REJECT_CTRL);
if(result)
return result;
}
@@ -1979,7 +1982,8 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
return CURLE_URL_MALFORMAT;
/* Decode the name parameter */
- result = Curl_urldecode(data, begin, ptr - begin, &name, NULL, TRUE);
+ result = Curl_urldecode(data, begin, ptr - begin, &name, NULL,
+ REJECT_CTRL);
if(result)
return result;
@@ -1989,7 +1993,8 @@ static CURLcode imap_parse_url_path(struct connectdata *conn)
ptr++;
/* Decode the value parameter */
- result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen, TRUE);
+ result = Curl_urldecode(data, begin, ptr - begin, &value, &valuelen,
+ REJECT_CTRL);
if(result) {
free(name);
return result;
@@ -2077,7 +2082,7 @@ static CURLcode imap_parse_custom_request(struct connectdata *conn)
if(custom) {
/* URL decode the custom request */
- result = Curl_urldecode(data, custom, 0, &imap->custom, NULL, TRUE);
+ result = Curl_urldecode(data, custom, 0, &imap->custom, NULL, REJECT_CTRL);
/* Extract the parameters if specified */
if(!result) {
diff --git a/lib/imap.h b/lib/imap.h
index 0efcfd293..8f373d284 100644
--- a/lib/imap.h
+++ b/lib/imap.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -75,13 +75,14 @@ struct imap_conn {
bool preauth; /* Is this connection PREAUTH? */
struct SASL sasl; /* SASL-related parameters */
unsigned int preftype; /* Preferred authentication type */
- int cmdid; /* Last used command ID */
+ unsigned int cmdid; /* Last used command ID */
char resptag[5]; /* Response tag to wait for */
bool tls_supported; /* StartTLS capability supported by server */
bool login_disabled; /* LOGIN command disabled by server */
bool ir_supported; /* Initial response supported by server */
char *mailbox; /* The last selected mailbox */
char *mailbox_uidvalidity; /* UIDVALIDITY parsed from select response */
+ struct dynbuf dyn; /* for the IMAP commands */
};
extern const struct Curl_handler Curl_handler_imap;
diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c
index 855981c66..9a5af7f42 100644
--- a/lib/inet_ntop.c
+++ b/lib/inet_ntop.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 1996-2001 Internet Software Consortium.
+ * Copyright (C) 1996-2019 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
diff --git a/lib/inet_ntop.h b/lib/inet_ntop.h
index d150bb693..9d3f237f3 100644
--- a/lib/inet_ntop.h
+++ b/lib/inet_ntop.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/inet_pton.c b/lib/inet_pton.c
index 0d65ae0ec..4923cae24 100644
--- a/lib/inet_pton.c
+++ b/lib/inet_pton.c
@@ -1,6 +1,6 @@
/* This is from the BIND 4.9.4 release, modified to compile by itself */
-/* Copyright (c) 1996 by Internet Software Consortium.
+/* Copyright (c) 1996 - 2020 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -112,7 +112,7 @@ inet_pton4(const char *src, unsigned char *dst)
if(val > 255)
return (0);
*tp = (unsigned char)val;
- if(! saw_digit) {
+ if(!saw_digit) {
if(++octets > 4)
return (0);
saw_digit = 1;
diff --git a/lib/inet_pton.h b/lib/inet_pton.h
index 0209b9b7b..e695af9c6 100644
--- a/lib/inet_pton.h
+++ b/lib/inet_pton.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/krb5.c b/lib/krb5.c
index 5a47d481b..ad6daeaa9 100644
--- a/lib/krb5.c
+++ b/lib/krb5.c
@@ -2,7 +2,7 @@
*
* Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
- * Copyright (c) 2004 - 2017 Daniel Stenberg
+ * Copyright (c) 2004 - 2020 Daniel Stenberg
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -45,14 +45,74 @@
#include "ftp.h"
#include "curl_gssapi.h"
#include "sendf.h"
-#include "curl_sec.h"
+#include "curl_krb5.h"
#include "warnless.h"
+#include "non-ascii.h"
+#include "strcase.h"
+#include "strdup.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
+static CURLcode ftpsend(struct connectdata *conn, const char *cmd)
+{
+ ssize_t bytes_written;
+#define SBUF_SIZE 1024
+ char s[SBUF_SIZE];
+ size_t write_len;
+ char *sptr = s;
+ CURLcode result = CURLE_OK;
+#ifdef HAVE_GSSAPI
+ enum protection_level data_sec = conn->data_prot;
+#endif
+
+ if(!cmd)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ write_len = strlen(cmd);
+ if(!write_len || write_len > (sizeof(s) -3))
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ memcpy(&s, cmd, write_len);
+ strcpy(&s[write_len], "\r\n"); /* append a trailing CRLF */
+ write_len += 2;
+ bytes_written = 0;
+
+ result = Curl_convert_to_network(conn->data, s, write_len);
+ /* Curl_convert_to_network calls failf if unsuccessful */
+ if(result)
+ return result;
+
+ for(;;) {
+#ifdef HAVE_GSSAPI
+ conn->data_prot = PROT_CMD;
+#endif
+ result = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len,
+ &bytes_written);
+#ifdef HAVE_GSSAPI
+ DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
+ conn->data_prot = data_sec;
+#endif
+
+ if(result)
+ break;
+
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written);
+
+ if(bytes_written != (ssize_t)write_len) {
+ write_len -= bytes_written;
+ sptr += bytes_written;
+ }
+ else
+ break;
+ }
+
+ return result;
+}
+
static int
krb5_init(void *app_data)
{
@@ -183,7 +243,7 @@ krb5_auth(void *app_data, struct connectdata *conn)
for(;;) {
/* this really shouldn't be repeated here, but can't help it */
if(service == srv_host) {
- result = Curl_ftpsend(conn, "AUTH GSSAPI");
+ result = ftpsend(conn, "AUTH GSSAPI");
if(result)
return -2;
@@ -260,7 +320,7 @@ krb5_auth(void *app_data, struct connectdata *conn)
cmd = aprintf("ADAT %s", p);
if(cmd)
- result = Curl_ftpsend(conn, cmd);
+ result = ftpsend(conn, cmd);
else
result = CURLE_OUT_OF_MEMORY;
@@ -326,16 +386,524 @@ static void krb5_end(void *app_data)
}
}
-struct Curl_sec_client_mech Curl_krb5_client_mech = {
- "GSSAPI",
- sizeof(gss_ctx_id_t),
- krb5_init,
- krb5_auth,
- krb5_end,
- krb5_check_prot,
- krb5_overhead,
- krb5_encode,
- krb5_decode
+static struct Curl_sec_client_mech Curl_krb5_client_mech = {
+ "GSSAPI",
+ sizeof(gss_ctx_id_t),
+ krb5_init,
+ krb5_auth,
+ krb5_end,
+ krb5_check_prot,
+ krb5_overhead,
+ krb5_encode,
+ krb5_decode
+};
+
+static const struct {
+ enum protection_level level;
+ const char *name;
+} level_names[] = {
+ { PROT_CLEAR, "clear" },
+ { PROT_SAFE, "safe" },
+ { PROT_CONFIDENTIAL, "confidential" },
+ { PROT_PRIVATE, "private" }
};
+static enum protection_level
+name_to_level(const char *name)
+{
+ int i;
+ for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++)
+ if(checkprefix(name, level_names[i].name))
+ return level_names[i].level;
+ return PROT_NONE;
+}
+
+/* Convert a protocol |level| to its char representation.
+ We take an int to catch programming mistakes. */
+static char level_to_char(int level)
+{
+ switch(level) {
+ case PROT_CLEAR:
+ return 'C';
+ case PROT_SAFE:
+ return 'S';
+ case PROT_CONFIDENTIAL:
+ return 'E';
+ case PROT_PRIVATE:
+ return 'P';
+ case PROT_CMD:
+ /* Fall through */
+ default:
+ /* Those 2 cases should not be reached! */
+ break;
+ }
+ DEBUGASSERT(0);
+ /* Default to the most secure alternative. */
+ return 'P';
+}
+
+/* Send an FTP command defined by |message| and the optional arguments. The
+ function returns the ftp_code. If an error occurs, -1 is returned. */
+static int ftp_send_command(struct connectdata *conn, const char *message, ...)
+{
+ int ftp_code;
+ ssize_t nread = 0;
+ va_list args;
+ char print_buffer[50];
+
+ va_start(args, message);
+ mvsnprintf(print_buffer, sizeof(print_buffer), message, args);
+ va_end(args);
+
+ if(ftpsend(conn, print_buffer)) {
+ ftp_code = -1;
+ }
+ else {
+ if(Curl_GetFTPResponse(&nread, conn, &ftp_code))
+ ftp_code = -1;
+ }
+
+ (void)nread; /* Unused */
+ return ftp_code;
+}
+
+/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode
+ saying whether an error occurred or CURLE_OK if |len| was read. */
+static CURLcode
+socket_read(curl_socket_t fd, void *to, size_t len)
+{
+ char *to_p = to;
+ CURLcode result;
+ ssize_t nread = 0;
+
+ while(len > 0) {
+ result = Curl_read_plain(fd, to_p, len, &nread);
+ if(!result) {
+ len -= nread;
+ to_p += nread;
+ }
+ else {
+ if(result == CURLE_AGAIN)
+ continue;
+ return result;
+ }
+ }
+ return CURLE_OK;
+}
+
+
+/* Write |len| bytes from the buffer |to| to the socket |fd|. Return a
+ CURLcode saying whether an error occurred or CURLE_OK if |len| was
+ written. */
+static CURLcode
+socket_write(struct connectdata *conn, curl_socket_t fd, const void *to,
+ size_t len)
+{
+ const char *to_p = to;
+ CURLcode result;
+ ssize_t written;
+
+ while(len > 0) {
+ result = Curl_write_plain(conn, fd, to_p, len, &written);
+ if(!result) {
+ len -= written;
+ to_p += written;
+ }
+ else {
+ if(result == CURLE_AGAIN)
+ continue;
+ return result;
+ }
+ }
+ return CURLE_OK;
+}
+
+static CURLcode read_data(struct connectdata *conn,
+ curl_socket_t fd,
+ struct krb5buffer *buf)
+{
+ int len;
+ CURLcode result;
+
+ result = socket_read(fd, &len, sizeof(len));
+ if(result)
+ return result;
+
+ if(len) {
+ /* only realloc if there was a length */
+ len = ntohl(len);
+ buf->data = Curl_saferealloc(buf->data, len);
+ }
+ if(!len || !buf->data)
+ return CURLE_OUT_OF_MEMORY;
+
+ result = socket_read(fd, buf->data, len);
+ if(result)
+ return result;
+ buf->size = conn->mech->decode(conn->app_data, buf->data, len,
+ conn->data_prot, conn);
+ buf->index = 0;
+ return CURLE_OK;
+}
+
+static size_t
+buffer_read(struct krb5buffer *buf, void *data, size_t len)
+{
+ if(buf->size - buf->index < len)
+ len = buf->size - buf->index;
+ memcpy(data, (char *)buf->data + buf->index, len);
+ buf->index += len;
+ return len;
+}
+
+/* Matches Curl_recv signature */
+static ssize_t sec_recv(struct connectdata *conn, int sockindex,
+ char *buffer, size_t len, CURLcode *err)
+{
+ size_t bytes_read;
+ size_t total_read = 0;
+ curl_socket_t fd = conn->sock[sockindex];
+
+ *err = CURLE_OK;
+
+ /* Handle clear text response. */
+ if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
+ return sread(fd, buffer, len);
+
+ if(conn->in_buffer.eof_flag) {
+ conn->in_buffer.eof_flag = 0;
+ return 0;
+ }
+
+ bytes_read = buffer_read(&conn->in_buffer, buffer, len);
+ len -= bytes_read;
+ total_read += bytes_read;
+ buffer += bytes_read;
+
+ while(len > 0) {
+ if(read_data(conn, fd, &conn->in_buffer))
+ return -1;
+ if(conn->in_buffer.size == 0) {
+ if(bytes_read > 0)
+ conn->in_buffer.eof_flag = 1;
+ return bytes_read;
+ }
+ bytes_read = buffer_read(&conn->in_buffer, buffer, len);
+ len -= bytes_read;
+ total_read += bytes_read;
+ buffer += bytes_read;
+ }
+ return total_read;
+}
+
+/* Send |length| bytes from |from| to the |fd| socket taking care of encoding
+ and negotiating with the server. |from| can be NULL. */
+static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
+ const char *from, int length)
+{
+ int bytes, htonl_bytes; /* 32-bit integers for htonl */
+ char *buffer = NULL;
+ char *cmd_buffer;
+ size_t cmd_size = 0;
+ CURLcode error;
+ enum protection_level prot_level = conn->data_prot;
+ bool iscmd = (prot_level == PROT_CMD)?TRUE:FALSE;
+
+ DEBUGASSERT(prot_level > PROT_NONE && prot_level < PROT_LAST);
+
+ if(iscmd) {
+ if(!strncmp(from, "PASS ", 5) || !strncmp(from, "ACCT ", 5))
+ prot_level = PROT_PRIVATE;
+ else
+ prot_level = conn->command_prot;
+ }
+ bytes = conn->mech->encode(conn->app_data, from, length, prot_level,
+ (void **)&buffer);
+ if(!buffer || bytes <= 0)
+ return; /* error */
+
+ if(iscmd) {
+ error = Curl_base64_encode(conn->data, buffer, curlx_sitouz(bytes),
+ &cmd_buffer, &cmd_size);
+ if(error) {
+ free(buffer);
+ return; /* error */
+ }
+ if(cmd_size > 0) {
+ static const char *enc = "ENC ";
+ static const char *mic = "MIC ";
+ if(prot_level == PROT_PRIVATE)
+ socket_write(conn, fd, enc, 4);
+ else
+ socket_write(conn, fd, mic, 4);
+
+ socket_write(conn, fd, cmd_buffer, cmd_size);
+ socket_write(conn, fd, "\r\n", 2);
+ infof(conn->data, "Send: %s%s\n", prot_level == PROT_PRIVATE?enc:mic,
+ cmd_buffer);
+ free(cmd_buffer);
+ }
+ }
+ else {
+ htonl_bytes = htonl(bytes);
+ socket_write(conn, fd, &htonl_bytes, sizeof(htonl_bytes));
+ socket_write(conn, fd, buffer, curlx_sitouz(bytes));
+ }
+ free(buffer);
+}
+
+static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd,
+ const char *buffer, size_t length)
+{
+ ssize_t tx = 0, len = conn->buffer_size;
+
+ len -= conn->mech->overhead(conn->app_data, conn->data_prot,
+ curlx_sztosi(len));
+ if(len <= 0)
+ len = length;
+ while(length) {
+ if(length < (size_t)len)
+ len = length;
+
+ do_sec_send(conn, fd, buffer, curlx_sztosi(len));
+ length -= len;
+ buffer += len;
+ tx += len;
+ }
+ return tx;
+}
+
+/* Matches Curl_send signature */
+static ssize_t sec_send(struct connectdata *conn, int sockindex,
+ const void *buffer, size_t len, CURLcode *err)
+{
+ curl_socket_t fd = conn->sock[sockindex];
+ *err = CURLE_OK;
+ return sec_write(conn, fd, buffer, len);
+}
+
+int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
+ enum protection_level level)
+{
+ /* decoded_len should be size_t or ssize_t but conn->mech->decode returns an
+ int */
+ int decoded_len;
+ char *buf;
+ int ret_code = 0;
+ size_t decoded_sz = 0;
+ CURLcode error;
+
+ if(!conn->mech)
+ /* not inititalized, return error */
+ return -1;
+
+ DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
+
+ error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz);
+ if(error || decoded_sz == 0)
+ return -1;
+
+ if(decoded_sz > (size_t)INT_MAX) {
+ free(buf);
+ return -1;
+ }
+ decoded_len = curlx_uztosi(decoded_sz);
+
+ decoded_len = conn->mech->decode(conn->app_data, buf, decoded_len,
+ level, conn);
+ if(decoded_len <= 0) {
+ free(buf);
+ return -1;
+ }
+
+ if(conn->data->set.verbose) {
+ buf[decoded_len] = '\n';
+ Curl_debug(conn->data, CURLINFO_HEADER_IN, buf, decoded_len + 1);
+ }
+
+ buf[decoded_len] = '\0';
+ if(decoded_len <= 3)
+ /* suspiciously short */
+ return 0;
+
+ if(buf[3] != '-')
+ /* safe to ignore return code */
+ (void)sscanf(buf, "%d", &ret_code);
+
+ if(buf[decoded_len - 1] == '\n')
+ buf[decoded_len - 1] = '\0';
+ strcpy(buffer, buf);
+ free(buf);
+ return ret_code;
+}
+
+static int sec_set_protection_level(struct connectdata *conn)
+{
+ int code;
+ enum protection_level level = conn->request_data_prot;
+
+ DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
+
+ if(!conn->sec_complete) {
+ infof(conn->data, "Trying to change the protection level after the"
+ " completion of the data exchange.\n");
+ return -1;
+ }
+
+ /* Bail out if we try to set up the same level */
+ if(conn->data_prot == level)
+ return 0;
+
+ if(level) {
+ char *pbsz;
+ static unsigned int buffer_size = 1 << 20; /* 1048576 */
+
+ code = ftp_send_command(conn, "PBSZ %u", buffer_size);
+ if(code < 0)
+ return -1;
+
+ if(code/100 != 2) {
+ failf(conn->data, "Failed to set the protection's buffer size.");
+ return -1;
+ }
+ conn->buffer_size = buffer_size;
+
+ pbsz = strstr(conn->data->state.buffer, "PBSZ=");
+ if(pbsz) {
+ /* ignore return code, use default value if it fails */
+ (void)sscanf(pbsz, "PBSZ=%u", &buffer_size);
+ if(buffer_size < conn->buffer_size)
+ conn->buffer_size = buffer_size;
+ }
+ }
+
+ /* Now try to negiociate the protection level. */
+ code = ftp_send_command(conn, "PROT %c", level_to_char(level));
+
+ if(code < 0)
+ return -1;
+
+ if(code/100 != 2) {
+ failf(conn->data, "Failed to set the protection level.");
+ return -1;
+ }
+
+ conn->data_prot = level;
+ if(level == PROT_PRIVATE)
+ conn->command_prot = level;
+
+ return 0;
+}
+
+int
+Curl_sec_request_prot(struct connectdata *conn, const char *level)
+{
+ enum protection_level l = name_to_level(level);
+ if(l == PROT_NONE)
+ return -1;
+ DEBUGASSERT(l > PROT_NONE && l < PROT_LAST);
+ conn->request_data_prot = l;
+ return 0;
+}
+
+static CURLcode choose_mech(struct connectdata *conn)
+{
+ int ret;
+ struct Curl_easy *data = conn->data;
+ void *tmp_allocation;
+ const struct Curl_sec_client_mech *mech = &Curl_krb5_client_mech;
+
+ tmp_allocation = realloc(conn->app_data, mech->size);
+ if(tmp_allocation == NULL) {
+ failf(data, "Failed realloc of size %zu", mech->size);
+ mech = NULL;
+ return CURLE_OUT_OF_MEMORY;
+ }
+ conn->app_data = tmp_allocation;
+
+ if(mech->init) {
+ ret = mech->init(conn->app_data);
+ if(ret) {
+ infof(data, "Failed initialization for %s. Skipping it.\n",
+ mech->name);
+ return CURLE_FAILED_INIT;
+ }
+ }
+
+ infof(data, "Trying mechanism %s...\n", mech->name);
+ ret = ftp_send_command(conn, "AUTH %s", mech->name);
+ if(ret < 0)
+ return CURLE_COULDNT_CONNECT;
+
+ if(ret/100 != 3) {
+ switch(ret) {
+ case 504:
+ infof(data, "Mechanism %s is not supported by the server (server "
+ "returned ftp code: 504).\n", mech->name);
+ break;
+ case 534:
+ infof(data, "Mechanism %s was rejected by the server (server returned "
+ "ftp code: 534).\n", mech->name);
+ break;
+ default:
+ if(ret/100 == 5) {
+ infof(data, "server does not support the security extensions\n");
+ return CURLE_USE_SSL_FAILED;
+ }
+ break;
+ }
+ return CURLE_LOGIN_DENIED;
+ }
+
+ /* Authenticate */
+ ret = mech->auth(conn->app_data, conn);
+
+ if(ret != AUTH_CONTINUE) {
+ if(ret != AUTH_OK) {
+ /* Mechanism has dumped the error to stderr, don't error here. */
+ return CURLE_USE_SSL_FAILED;
+ }
+ DEBUGASSERT(ret == AUTH_OK);
+
+ conn->mech = mech;
+ conn->sec_complete = 1;
+ conn->recv[FIRSTSOCKET] = sec_recv;
+ conn->send[FIRSTSOCKET] = sec_send;
+ conn->recv[SECONDARYSOCKET] = sec_recv;
+ conn->send[SECONDARYSOCKET] = sec_send;
+ conn->command_prot = PROT_SAFE;
+ /* Set the requested protection level */
+ /* BLOCKING */
+ (void)sec_set_protection_level(conn);
+ }
+
+ return CURLE_OK;
+}
+
+CURLcode
+Curl_sec_login(struct connectdata *conn)
+{
+ return choose_mech(conn);
+}
+
+
+void
+Curl_sec_end(struct connectdata *conn)
+{
+ if(conn->mech != NULL && conn->mech->end)
+ conn->mech->end(conn->app_data);
+ free(conn->app_data);
+ conn->app_data = NULL;
+ if(conn->in_buffer.data) {
+ free(conn->in_buffer.data);
+ conn->in_buffer.data = NULL;
+ conn->in_buffer.size = 0;
+ conn->in_buffer.index = 0;
+ conn->in_buffer.eof_flag = 0;
+ }
+ conn->sec_complete = 0;
+ conn->data_prot = PROT_CLEAR;
+ conn->mech = NULL;
+}
+
#endif /* HAVE_GSSAPI && !CURL_DISABLE_FTP */
diff --git a/lib/ldap.c b/lib/ldap.c
index af3d61c57..8d1ee6445 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -75,7 +75,7 @@
/* Use our own implementation. */
-typedef struct {
+struct ldap_urldesc {
char *lud_host;
int lud_port;
#if defined(USE_WIN32_LDAP)
@@ -95,10 +95,10 @@ typedef struct {
size_t lud_attrs_dups; /* how many were dup'ed, this field is not in the
"real" struct so can only be used in code
without HAVE_LDAP_URL_PARSE defined */
-} CURL_LDAPURLDesc;
+};
#undef LDAPURLDesc
-#define LDAPURLDesc CURL_LDAPURLDesc
+#define LDAPURLDesc struct ldap_urldesc
static int _ldap_url_parse(const struct connectdata *conn,
LDAPURLDesc **ludp);
@@ -112,7 +112,7 @@ static void _ldap_free_urldesc(LDAPURLDesc *ludp);
#define LDAP_TRACE(x) do { \
_ldap_trace("%u: ", __LINE__); \
_ldap_trace x; \
- } WHILE_FALSE
+ } while(0)
static void _ldap_trace(const char *fmt, ...);
#else
@@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_ldap = {
ZERO_NULL, /* connection_check */
PORT_LDAP, /* defport */
CURLPROTO_LDAP, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_NONE /* flags */
};
@@ -176,6 +177,7 @@ const struct Curl_handler Curl_handler_ldaps = {
ZERO_NULL, /* connection_check */
PORT_LDAPS, /* defport */
CURLPROTO_LDAPS, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_SSL /* flags */
};
#endif
@@ -239,13 +241,13 @@ static int ldap_win_bind(struct connectdata *conn, LDAP *server,
PTCHAR inpass = NULL;
if(user && passwd && (conn->data->set.httpauth & CURLAUTH_BASIC)) {
- inuser = Curl_convert_UTF8_to_tchar((char *) user);
- inpass = Curl_convert_UTF8_to_tchar((char *) passwd);
+ inuser = curlx_convert_UTF8_to_tchar((char *) user);
+ inpass = curlx_convert_UTF8_to_tchar((char *) passwd);
rc = ldap_simple_bind_s(server, inuser, inpass);
- Curl_unicodefree(inuser);
- Curl_unicodefree(inpass);
+ curlx_unicodefree(inuser);
+ curlx_unicodefree(inpass);
}
#if defined(USE_WINDOWS_SSPI)
else {
@@ -257,6 +259,13 @@ static int ldap_win_bind(struct connectdata *conn, LDAP *server,
}
#endif /* #if defined(USE_WIN32_LDAP) */
+#if defined(USE_WIN32_LDAP)
+#define FREE_ON_WINLDAP(x) curlx_unicodefree(x)
+#else
+#define FREE_ON_WINLDAP(x)
+#endif
+
+
static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
{
CURLcode result = CURLE_OK;
@@ -306,7 +315,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
ldap_ssl ? "encrypted" : "cleartext");
#if defined(USE_WIN32_LDAP)
- host = Curl_convert_UTF8_to_tchar(conn->host.name);
+ host = curlx_convert_UTF8_to_tchar(conn->host.name);
if(!host) {
result = CURLE_OUT_OF_MEMORY;
@@ -463,9 +472,6 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
#ifdef USE_WIN32_LDAP
ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
-#endif
-
-#ifdef USE_WIN32_LDAP
rc = ldap_win_bind(conn, server, user, passwd);
#else
rc = ldap_simple_bind_s(server, user, passwd);
@@ -507,7 +513,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
#if defined(USE_WIN32_LDAP)
TCHAR *attribute;
#else
- char *attribute; /*! suspicious that this isn't 'const' */
+ char *attribute;
#endif
int i;
@@ -517,7 +523,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
size_t name_len;
#if defined(USE_WIN32_LDAP)
TCHAR *dn = ldap_get_dn(server, entryIterator);
- name = Curl_convert_tchar_to_UTF8(dn);
+ name = curlx_convert_tchar_to_UTF8(dn);
if(!name) {
ldap_memfree(dn);
@@ -532,30 +538,22 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4);
if(result) {
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
-
goto quit;
}
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *) name,
name_len);
if(result) {
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
-
goto quit;
}
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
if(result) {
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
goto quit;
@@ -563,9 +561,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
dlsize += name_len + 5;
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(name);
-#endif
+ FREE_ON_WINLDAP(name);
ldap_memfree(dn);
}
@@ -576,7 +572,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
BerValue **vals;
size_t attr_len;
#if defined(USE_WIN32_LDAP)
- char *attr = Curl_convert_tchar_to_UTF8(attribute);
+ char *attr = curlx_convert_tchar_to_UTF8(attribute);
if(!attr) {
if(ber)
ber_free(ber, 0);
@@ -596,9 +592,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -610,9 +604,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
(char *) attr, attr_len);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -623,9 +615,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -645,9 +635,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
&val_b64_sz);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -661,9 +649,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
free(val_b64);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -679,9 +665,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
vals[i]->bv_len);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -695,9 +679,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
if(result) {
ldap_value_free_len(vals);
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -713,9 +695,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
/* Free the attribute as we are done with it */
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(attr);
-#endif
+ FREE_ON_WINLDAP(attr);
ldap_memfree(attribute);
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
@@ -745,9 +725,7 @@ quit:
ldapssl_client_deinit();
#endif /* HAVE_LDAP_SSL && CURL_HAS_NOVELL_LDAPSDK */
-#if defined(USE_WIN32_LDAP)
- Curl_unicodefree(host);
-#endif
+ FREE_ON_WINLDAP(host);
/* no data to transfer */
Curl_setup_transfer(data, -1, -1, FALSE, -1);
@@ -883,7 +861,7 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
LDAP_TRACE(("DN '%s'\n", dn));
/* Unescape the DN */
- result = Curl_urldecode(conn->data, dn, 0, &unescaped, NULL, FALSE);
+ result = Curl_urldecode(conn->data, dn, 0, &unescaped, NULL, REJECT_ZERO);
if(result) {
rc = LDAP_NO_MEMORY;
@@ -892,10 +870,10 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
#if defined(USE_WIN32_LDAP)
/* Convert the unescaped string to a tchar */
- ludp->lud_dn = Curl_convert_UTF8_to_tchar(unescaped);
+ ludp->lud_dn = curlx_convert_UTF8_to_tchar(unescaped);
/* Free the unescaped string as we are done with it */
- Curl_unicodefree(unescaped);
+ curlx_unicodefree(unescaped);
if(!ludp->lud_dn) {
rc = LDAP_NO_MEMORY;
@@ -949,7 +927,7 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
/* Unescape the attribute */
result = Curl_urldecode(conn->data, attributes[i], 0, &unescaped, NULL,
- FALSE);
+ REJECT_ZERO);
if(result) {
free(attributes);
@@ -960,10 +938,10 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
#if defined(USE_WIN32_LDAP)
/* Convert the unescaped string to a tchar */
- ludp->lud_attrs[i] = Curl_convert_UTF8_to_tchar(unescaped);
+ ludp->lud_attrs[i] = curlx_convert_UTF8_to_tchar(unescaped);
/* Free the unescaped string as we are done with it */
- Curl_unicodefree(unescaped);
+ curlx_unicodefree(unescaped);
if(!ludp->lud_attrs[i]) {
free(attributes);
@@ -1018,7 +996,8 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
LDAP_TRACE(("filter '%s'\n", filter));
/* Unescape the filter */
- result = Curl_urldecode(conn->data, filter, 0, &unescaped, NULL, FALSE);
+ result = Curl_urldecode(conn->data, filter, 0, &unescaped, NULL,
+ REJECT_ZERO);
if(result) {
rc = LDAP_NO_MEMORY;
@@ -1027,10 +1006,10 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp)
#if defined(USE_WIN32_LDAP)
/* Convert the unescaped string to a tchar */
- ludp->lud_filter = Curl_convert_UTF8_to_tchar(unescaped);
+ ludp->lud_filter = curlx_convert_UTF8_to_tchar(unescaped);
/* Free the unescaped string as we are done with it */
- Curl_unicodefree(unescaped);
+ curlx_unicodefree(unescaped);
if(!ludp->lud_filter) {
rc = LDAP_NO_MEMORY;
diff --git a/lib/libcurl.plist b/lib/libcurl.plist
index 55c2ed494..eab1efe31 100644
--- a/lib/libcurl.plist
+++ b/lib/libcurl.plist
@@ -15,7 +15,7 @@
<string>se.haxx.curl.libcurl</string>
<key>CFBundleVersion</key>
- <string>7.67.0</string>
+ <string>7.73.0</string>
<key>CFBundleName</key>
<string>libcurl</string>
@@ -27,9 +27,9 @@
<string>????</string>
<key>CFBundleShortVersionString</key>
- <string>libcurl 7.67.0</string>
+ <string>libcurl 7.73.0</string>
<key>CFBundleGetInfoString</key>
- <string>libcurl.plist 7.67.0</string>
+ <string>libcurl.plist 7.73.0</string>
</dict>
</plist>
diff --git a/lib/llist.c b/lib/llist.c
index f8769c2af..0a2baa08e 100644
--- a/lib/llist.c
+++ b/lib/llist.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,7 +34,7 @@
* @unittest: 1300
*/
void
-Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
+Curl_llist_init(struct Curl_llist *l, Curl_llist_dtor dtor)
{
l->size = 0;
l->dtor = dtor;
@@ -54,9 +54,9 @@ Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
* @unittest: 1300
*/
void
-Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
+Curl_llist_insert_next(struct Curl_llist *list, struct Curl_llist_element *e,
const void *p,
- struct curl_llist_element *ne)
+ struct Curl_llist_element *ne)
{
ne->ptr = (void *) p;
if(list->size == 0) {
@@ -90,7 +90,7 @@ Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
* @unittest: 1300
*/
void
-Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
+Curl_llist_remove(struct Curl_llist *list, struct Curl_llist_element *e,
void *user)
{
void *ptr;
@@ -131,7 +131,7 @@ Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
}
void
-Curl_llist_destroy(struct curl_llist *list, void *user)
+Curl_llist_destroy(struct Curl_llist *list, void *user)
{
if(list) {
while(list->size > 0)
@@ -140,58 +140,7 @@ Curl_llist_destroy(struct curl_llist *list, void *user)
}
size_t
-Curl_llist_count(struct curl_llist *list)
+Curl_llist_count(struct Curl_llist *list)
{
return list->size;
}
-
-/*
- * @unittest: 1300
- */
-void Curl_llist_move(struct curl_llist *list, struct curl_llist_element *e,
- struct curl_llist *to_list,
- struct curl_llist_element *to_e)
-{
- /* Remove element from list */
- if(e == NULL || list->size == 0)
- return;
-
- if(e == list->head) {
- list->head = e->next;
-
- if(list->head == NULL)
- list->tail = NULL;
- else
- e->next->prev = NULL;
- }
- else {
- e->prev->next = e->next;
- if(!e->next)
- list->tail = e->prev;
- else
- e->next->prev = e->prev;
- }
-
- --list->size;
-
- /* Add element to to_list after to_e */
- if(to_list->size == 0) {
- to_list->head = e;
- to_list->head->prev = NULL;
- to_list->head->next = NULL;
- to_list->tail = e;
- }
- else {
- e->next = to_e->next;
- e->prev = to_e;
- if(to_e->next) {
- to_e->next->prev = e;
- }
- else {
- to_list->tail = e;
- }
- to_e->next = e;
- }
-
- ++to_list->size;
-}
diff --git a/lib/llist.h b/lib/llist.h
index b9d4c89a9..91cfda1bc 100644
--- a/lib/llist.h
+++ b/lib/llist.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,29 +25,26 @@
#include "curl_setup.h"
#include <stddef.h>
-typedef void (*curl_llist_dtor)(void *, void *);
+typedef void (*Curl_llist_dtor)(void *, void *);
-struct curl_llist_element {
+struct Curl_llist_element {
void *ptr;
- struct curl_llist_element *prev;
- struct curl_llist_element *next;
+ struct Curl_llist_element *prev;
+ struct Curl_llist_element *next;
};
-struct curl_llist {
- struct curl_llist_element *head;
- struct curl_llist_element *tail;
- curl_llist_dtor dtor;
+struct Curl_llist {
+ struct Curl_llist_element *head;
+ struct Curl_llist_element *tail;
+ Curl_llist_dtor dtor;
size_t size;
};
-void Curl_llist_init(struct curl_llist *, curl_llist_dtor);
-void Curl_llist_insert_next(struct curl_llist *, struct curl_llist_element *,
- const void *, struct curl_llist_element *node);
-void Curl_llist_remove(struct curl_llist *, struct curl_llist_element *,
+void Curl_llist_init(struct Curl_llist *, Curl_llist_dtor);
+void Curl_llist_insert_next(struct Curl_llist *, struct Curl_llist_element *,
+ const void *, struct Curl_llist_element *node);
+void Curl_llist_remove(struct Curl_llist *, struct Curl_llist_element *,
void *);
-size_t Curl_llist_count(struct curl_llist *);
-void Curl_llist_destroy(struct curl_llist *, void *);
-void Curl_llist_move(struct curl_llist *, struct curl_llist_element *,
- struct curl_llist *, struct curl_llist_element *);
-
+size_t Curl_llist_count(struct Curl_llist *);
+void Curl_llist_destroy(struct Curl_llist *, void *);
#endif /* HEADER_CURL_LLIST_H */
diff --git a/lib/makefile.amiga b/lib/makefile.amiga
index 673b147c1..29df65438 100644
--- a/lib/makefile.amiga
+++ b/lib/makefile.amiga
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
# libcurl Makefile for AmigaOS ...
#
diff --git a/lib/makefile.dj b/lib/makefile.dj
index 941f8ce68..6ea79e4be 100644
--- a/lib/makefile.dj
+++ b/lib/makefile.dj
@@ -6,7 +6,7 @@
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2003 - 2008, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2003 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2003 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/lib/md4.c b/lib/md4.c
index bbf897508..67119cda5 100644
--- a/lib/md4.c
+++ b/lib/md4.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -29,10 +29,20 @@
#ifdef USE_OPENSSL
#include <openssl/opensslconf.h>
+#if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3)
+/* OpenSSL 3.0.0 marks the MD4 functions as deprecated */
+#define OPENSSL_NO_MD4
#endif
+#endif /* USE_OPENSSL */
+
#ifdef USE_MBEDTLS
#include <mbedtls/config.h>
+#include <mbedtls/version.h>
+
+#if(MBEDTLS_VERSION_NUMBER >= 0x02070000)
+ #define HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS
#endif
+#endif /* USE_MBEDTLS */
#if defined(USE_GNUTLS_NETTLE)
@@ -65,10 +75,11 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
#include <gcrypt.h>
#include "curl_memory.h"
+
/* The last #include file should be: */
#include "memdebug.h"
-typedef struct gcry_md_hd_t MD4_CTX;
+typedef gcry_md_hd_t MD4_CTX;
static void MD4_Init(MD4_CTX *ctx)
{
@@ -82,52 +93,43 @@ static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
- memcpy(result, gcry_md_read(ctx, 0), MD4_DIGEST_LENGTH);
- gcry_md_close(ctx);
+ memcpy(result, gcry_md_read(*ctx, 0), MD4_DIGEST_LENGTH);
+ gcry_md_close(*ctx);
}
#elif defined(USE_OPENSSL) && !defined(OPENSSL_NO_MD4)
/* When OpenSSL is available we use the MD4-functions from OpenSSL */
#include <openssl/md4.h>
-#elif defined(USE_SECTRANSP)
+#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \
+ (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040) && \
+ defined(__MAC_OS_X_VERSION_MIN_ALLOWED) && \
+ (__MAC_OS_X_VERSION_MIN_ALLOWED < 101500)) || \
+ (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
+ (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000))
#include <CommonCrypto/CommonDigest.h>
#include "curl_memory.h"
+
/* The last #include file should be: */
#include "memdebug.h"
-typedef struct {
- void *data;
- unsigned long size;
-} MD4_CTX;
+typedef CC_MD4_CTX MD4_CTX;
static void MD4_Init(MD4_CTX *ctx)
{
- ctx->data = NULL;
- ctx->size = 0;
+ (void)CC_MD4_Init(ctx);
}
static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
- if(ctx->data == NULL) {
- ctx->data = malloc(size);
- if(ctx->data != NULL) {
- memcpy(ctx->data, data, size);
- ctx->size = size;
- }
- }
+ (void)CC_MD4_Update(ctx, data, (CC_LONG)size);
}
static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
- if(ctx->data != NULL) {
- (void)CC_MD4(ctx->data, (CC_LONG) ctx->size, result);
-
- Curl_safefree(ctx->data);
- ctx->size = 0;
- }
+ (void)CC_MD4_Final(result, ctx);
}
#elif defined(USE_WIN32_CRYPTO)
@@ -135,13 +137,15 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
#include <wincrypt.h>
#include "curl_memory.h"
- /* The last #include file should be: */
+
+/* The last #include file should be: */
#include "memdebug.h"
-typedef struct {
+struct md4_ctx {
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
-} MD4_CTX;
+};
+typedef struct md4_ctx MD4_CTX;
static void MD4_Init(MD4_CTX *ctx)
{
@@ -149,14 +153,14 @@ static void MD4_Init(MD4_CTX *ctx)
ctx->hHash = 0;
if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFYCONTEXT)) {
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
CryptCreateHash(ctx->hCryptProv, CALG_MD4, 0, 0, &ctx->hHash);
}
}
static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
- CryptHashData(ctx->hHash, data, (unsigned int) size, 0);
+ CryptHashData(ctx->hHash, (BYTE *)data, (unsigned int) size, 0);
}
static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
@@ -179,13 +183,15 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
#include <mbedtls/md4.h>
#include "curl_memory.h"
+
/* The last #include file should be: */
#include "memdebug.h"
-typedef struct {
+struct md4_ctx {
void *data;
unsigned long size;
-} MD4_CTX;
+};
+typedef struct md4_ctx MD4_CTX;
static void MD4_Init(MD4_CTX *ctx)
{
@@ -207,7 +213,11 @@ static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
if(ctx->data != NULL) {
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
mbedtls_md4(ctx->data, ctx->size, result);
+#else
+ (void) mbedtls_md4_ret(ctx->data, ctx->size, result);
+#endif
Curl_safefree(ctx->data);
ctx->size = 0;
@@ -260,12 +270,13 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
/* Any 32-bit or wider unsigned integer data type will do */
typedef unsigned int MD4_u32plus;
-typedef struct {
+struct md4_ctx {
MD4_u32plus lo, hi;
MD4_u32plus a, b, c, d;
unsigned char buffer[64];
MD4_u32plus block[16];
-} MD4_CTX;
+};
+typedef struct md4_ctx MD4_CTX;
static void MD4_Init(MD4_CTX *ctx);
static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size);
@@ -505,9 +516,11 @@ static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
#endif /* CRYPTO LIBS */
-void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
+void Curl_md4it(unsigned char *output, const unsigned char *input,
+ const size_t len)
{
MD4_CTX ctx;
+
MD4_Init(&ctx);
MD4_Update(&ctx, input, curlx_uztoui(len));
MD4_Final(output, &ctx);
diff --git a/lib/md5.c b/lib/md5.c
index 2b81ca455..d21625f6b 100644
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,6 +30,14 @@
#include "curl_hmac.h"
#include "warnless.h"
+#ifdef USE_MBEDTLS
+#include <mbedtls/version.h>
+
+#if(MBEDTLS_VERSION_NUMBER >= 0x02070000)
+ #define HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS
+#endif
+#endif /* USE_MBEDTLS */
+
#if defined(USE_GNUTLS_NETTLE)
#include <nettle/md5.h>
@@ -51,7 +59,7 @@ static void MD5_Update(MD5_CTX *ctx,
md5_update(ctx, inputLen, input);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
md5_digest(ctx, 16, digest);
}
@@ -77,7 +85,7 @@ static void MD5_Update(MD5_CTX *ctx,
gcry_md_write(*ctx, input, inputLen);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
memcpy(digest, gcry_md_read(*ctx, 0), 16);
gcry_md_close(*ctx);
@@ -90,8 +98,50 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
/* The last #include file should be: */
#include "memdebug.h"
+#elif defined(USE_MBEDTLS)
+
+#include <mbedtls/md5.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef mbedtls_md5_context MD5_CTX;
+
+static void MD5_Init(MD5_CTX *ctx)
+{
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md5_starts(ctx);
+#else
+ (void) mbedtls_md5_starts_ret(ctx);
+#endif
+}
+
+static void MD5_Update(MD5_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md5_update(ctx, data, length);
+#else
+ (void) mbedtls_md5_update_ret(ctx, data, length);
+#endif
+}
+
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
+{
+#if !defined(HAS_MBEDTLS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_md5_finish(ctx, digest);
+#else
+ (void) mbedtls_md5_finish_ret(ctx, digest);
+#endif
+}
+
#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \
- (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \
+ (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040) && \
+ defined(__MAC_OS_X_VERSION_MIN_ALLOWED) && \
+ (__MAC_OS_X_VERSION_MIN_ALLOWED < 101500)) || \
(defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
(__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000))
@@ -119,27 +169,28 @@ static void MD5_Update(MD5_CTX *ctx,
CC_MD5_Update(ctx, input, inputLen);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
CC_MD5_Final(digest, ctx);
}
-#elif defined(WIN32) && !defined(CURL_WINDOWS_APP)
+#elif defined(USE_WIN32_CRYPTO)
#include <wincrypt.h>
#include "curl_memory.h"
/* The last #include file should be: */
#include "memdebug.h"
-typedef struct {
+struct md5_ctx {
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
-} MD5_CTX;
+};
+typedef struct md5_ctx MD5_CTX;
static void MD5_Init(MD5_CTX *ctx)
{
- if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
- PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash);
}
}
@@ -151,7 +202,7 @@ static void MD5_Update(MD5_CTX *ctx,
CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0);
}
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
+static void MD5_Final(unsigned char *digest, MD5_CTX *ctx)
{
unsigned long length = 0;
CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
@@ -164,7 +215,9 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
}
#else
+
/* When no other crypto library is available we use this code segment */
+
/*
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
* MD5 Message-Digest Algorithm (RFC 1321).
@@ -211,12 +264,13 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
/* Any 32-bit or wider unsigned integer data type will do */
typedef unsigned int MD5_u32plus;
-typedef struct {
+struct md5_ctx {
MD5_u32plus lo, hi;
MD5_u32plus a, b, c, d;
unsigned char buffer[64];
MD5_u32plus block[16];
-} MD5_CTX;
+};
+typedef struct md5_ctx MD5_CTX;
static void MD5_Init(MD5_CTX *ctx);
static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
@@ -478,7 +532,7 @@ static void MD5_Final(unsigned char *result, MD5_CTX *ctx)
#endif /* CRYPTO LIBS */
-const HMAC_params Curl_HMAC_MD5[] = {
+const struct HMAC_params Curl_HMAC_MD5[] = {
{
/* Hash initialization function. */
CURLX_FUNCTION_CAST(HMAC_hinit_func, MD5_Init),
@@ -495,7 +549,7 @@ const HMAC_params Curl_HMAC_MD5[] = {
}
};
-const MD5_params Curl_DIGEST_MD5[] = {
+const struct MD5_params Curl_DIGEST_MD5[] = {
{
/* Digest initialization function */
CURLX_FUNCTION_CAST(Curl_MD5_init_func, MD5_Init),
@@ -513,18 +567,19 @@ const MD5_params Curl_DIGEST_MD5[] = {
/*
* @unittest: 1601
*/
-void Curl_md5it(unsigned char *outbuffer, /* 16 bytes */
- const unsigned char *input)
+void Curl_md5it(unsigned char *outbuffer, const unsigned char *input,
+ const size_t len)
{
MD5_CTX ctx;
+
MD5_Init(&ctx);
- MD5_Update(&ctx, input, curlx_uztoui(strlen((char *)input)));
+ MD5_Update(&ctx, input, curlx_uztoui(len));
MD5_Final(outbuffer, &ctx);
}
-MD5_context *Curl_MD5_init(const MD5_params *md5params)
+struct MD5_context *Curl_MD5_init(const struct MD5_params *md5params)
{
- MD5_context *ctxt;
+ struct MD5_context *ctxt;
/* Create MD5 context */
ctxt = malloc(sizeof(*ctxt));
@@ -546,7 +601,7 @@ MD5_context *Curl_MD5_init(const MD5_params *md5params)
return ctxt;
}
-CURLcode Curl_MD5_update(MD5_context *context,
+CURLcode Curl_MD5_update(struct MD5_context *context,
const unsigned char *data,
unsigned int len)
{
@@ -555,7 +610,7 @@ CURLcode Curl_MD5_update(MD5_context *context,
return CURLE_OK;
}
-CURLcode Curl_MD5_final(MD5_context *context, unsigned char *result)
+CURLcode Curl_MD5_final(struct MD5_context *context, unsigned char *result)
{
(*context->md5_hash->md5_final_func)(result, context->md5_hashctx);
diff --git a/lib/memdebug.c b/lib/memdebug.c
index ede60094b..6c5608474 100644
--- a/lib/memdebug.c
+++ b/lib/memdebug.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,52 +35,6 @@
#include "curl_memory.h"
#include "memdebug.h"
-/*
- * Until 2011-08-17 libcurl's Memory Tracking feature also performed
- * automatic malloc and free filling operations using 0xA5 and 0x13
- * values. Our own preinitialization of dynamically allocated memory
- * might be useful when not using third party memory debuggers, but
- * on the other hand this would fool memory debuggers into thinking
- * that all dynamically allocated memory is properly initialized.
- *
- * As a default setting, libcurl's Memory Tracking feature no longer
- * performs preinitialization of dynamically allocated memory on its
- * own. If you know what you are doing, and really want to retain old
- * behavior, you can achieve this compiling with preprocessor symbols
- * CURL_MT_MALLOC_FILL and CURL_MT_FREE_FILL defined with appropriate
- * values.
- */
-
-#ifdef CURL_MT_MALLOC_FILL
-# if (CURL_MT_MALLOC_FILL < 0) || (CURL_MT_MALLOC_FILL > 0xff)
-# error "invalid CURL_MT_MALLOC_FILL or out of range"
-# endif
-#endif
-
-#ifdef CURL_MT_FREE_FILL
-# if (CURL_MT_FREE_FILL < 0) || (CURL_MT_FREE_FILL > 0xff)
-# error "invalid CURL_MT_FREE_FILL or out of range"
-# endif
-#endif
-
-#if defined(CURL_MT_MALLOC_FILL) && defined(CURL_MT_FREE_FILL)
-# if (CURL_MT_MALLOC_FILL == CURL_MT_FREE_FILL)
-# error "CURL_MT_MALLOC_FILL same as CURL_MT_FREE_FILL"
-# endif
-#endif
-
-#ifdef CURL_MT_MALLOC_FILL
-# define mt_malloc_fill(buf,len) memset((buf), CURL_MT_MALLOC_FILL, (len))
-#else
-# define mt_malloc_fill(buf,len) Curl_nop_stmt
-#endif
-
-#ifdef CURL_MT_FREE_FILL
-# define mt_free_fill(buf,len) memset((buf), CURL_MT_FREE_FILL, (len))
-#else
-# define mt_free_fill(buf,len) Curl_nop_stmt
-#endif
-
struct memdebug {
size_t size;
union {
@@ -173,8 +127,6 @@ void *curl_dbg_malloc(size_t wantedsize, int line, const char *source)
mem = (Curl_cmalloc)(size);
if(mem) {
- /* fill memory with junk */
- mt_malloc_fill(mem->mem, wantedsize);
mem->size = wantedsize;
}
@@ -321,14 +273,11 @@ void curl_dbg_free(void *ptr, int line, const char *source)
# pragma warning(pop)
#endif
- /* destroy */
- mt_free_fill(mem->mem, mem->size);
-
/* free for real */
(Curl_cfree)(mem);
}
- if(source)
+ if(source && ptr)
curl_dbg_log("MEM %s:%d free(%p)\n", source, line, (void *)ptr);
}
@@ -456,6 +405,16 @@ FILE *curl_dbg_fopen(const char *file, const char *mode,
return res;
}
+FILE *curl_dbg_fdopen(int filedes, const char *mode,
+ int line, const char *source)
+{
+ FILE *res = fdopen(filedes, mode);
+ if(source)
+ curl_dbg_log("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n",
+ source, line, filedes, mode, (void *)res);
+ return res;
+}
+
int curl_dbg_fclose(FILE *file, int line, const char *source)
{
int res;
diff --git a/lib/memdebug.h b/lib/memdebug.h
index 5236f60fa..4edafdfb5 100644
--- a/lib/memdebug.h
+++ b/lib/memdebug.h
@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -79,6 +79,9 @@ CURL_EXTERN RECV_TYPE_RETV curl_dbg_recv(RECV_TYPE_ARG1 sockfd,
/* FILE functions */
CURL_EXTERN FILE *curl_dbg_fopen(const char *file, const char *mode, int line,
const char *source);
+CURL_EXTERN FILE *curl_dbg_fdopen(int filedes, const char *mode,
+ int line, const char *source);
+
CURL_EXTERN int curl_dbg_fclose(FILE *file, int line, const char *source);
#ifndef MEMDEBUG_NODEFINES
@@ -169,6 +172,6 @@ CURL_EXTERN int curl_dbg_fclose(FILE *file, int line, const char *source);
*/
#define Curl_safefree(ptr) \
- do { free((ptr)); (ptr) = NULL;} WHILE_FALSE
+ do { free((ptr)); (ptr) = NULL;} while(0)
#endif /* HEADER_CURL_MEMDEBUG_H */
diff --git a/lib/mime.c b/lib/mime.c
index 081e51e50..6a9b64a2d 100644
--- a/lib/mime.c
+++ b/lib/mime.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,7 @@
#include "mime.h"
#include "non-ascii.h"
+#include "warnless.h"
#include "urldata.h"
#include "sendf.h"
@@ -52,6 +53,10 @@
#define READ_ERROR ((size_t) -1)
+#define STOP_FILLING ((size_t) -2)
+
+static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
+ void *instream, bool *hasread);
/* Encoders. */
static size_t encoder_nop_read(char *buffer, size_t size, bool ateof,
@@ -66,7 +71,7 @@ static size_t encoder_qp_read(char *buffer, size_t size, bool ateof,
curl_mimepart *part);
static curl_off_t encoder_qp_size(curl_mimepart *part);
-static const mime_encoder encoders[] = {
+static const struct mime_encoder encoders[] = {
{"binary", encoder_nop_read, encoder_nop_size},
{"8bit", encoder_nop_read, encoder_nop_size},
{"7bit", encoder_7bit_read, encoder_nop_size},
@@ -264,7 +269,8 @@ static char *Curl_basename(char *path)
/* Set readback state. */
-static void mimesetstate(mime_state *state, enum mimestate tok, void *ptr)
+static void mimesetstate(struct mime_state *state,
+ enum mimestate tok, void *ptr)
{
state->state = tok;
state->ptr = ptr;
@@ -337,7 +343,7 @@ static char *strippath(const char *fullfile)
}
/* Initialize data encoder state. */
-static void cleanup_encoder_state(mime_encoder_state *p)
+static void cleanup_encoder_state(struct mime_encoder_state *p)
{
p->pos = 0;
p->bufbeg = 0;
@@ -347,17 +353,22 @@ static void cleanup_encoder_state(mime_encoder_state *p)
/* Dummy encoder. This is used for 8bit and binary content encodings. */
static size_t encoder_nop_read(char *buffer, size_t size, bool ateof,
- curl_mimepart *part)
+ struct curl_mimepart *part)
{
- mime_encoder_state *st = &part->encstate;
+ struct mime_encoder_state *st = &part->encstate;
size_t insize = st->bufend - st->bufbeg;
(void) ateof;
+ if(!size)
+ return STOP_FILLING;
+
if(size > insize)
size = insize;
+
if(size)
- memcpy(buffer, st->buf, size);
+ memcpy(buffer, st->buf + st->bufbeg, size);
+
st->bufbeg += size;
return size;
}
@@ -372,11 +383,14 @@ static curl_off_t encoder_nop_size(curl_mimepart *part)
static size_t encoder_7bit_read(char *buffer, size_t size, bool ateof,
curl_mimepart *part)
{
- mime_encoder_state *st = &part->encstate;
+ struct mime_encoder_state *st = &part->encstate;
size_t cursize = st->bufend - st->bufbeg;
(void) ateof;
+ if(!size)
+ return STOP_FILLING;
+
if(size > cursize)
size = cursize;
@@ -395,7 +409,7 @@ static size_t encoder_7bit_read(char *buffer, size_t size, bool ateof,
static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
curl_mimepart *part)
{
- mime_encoder_state *st = &part->encstate;
+ struct mime_encoder_state *st = &part->encstate;
size_t cursize = 0;
int i;
char *ptr = buffer;
@@ -404,8 +418,11 @@ static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
/* Line full ? */
if(st->pos > MAX_ENCODED_LINE_LENGTH - 4) {
/* Yes, we need 2 characters for CRLF. */
- if(size < 2)
+ if(size < 2) {
+ if(!cursize)
+ return STOP_FILLING;
break;
+ }
*ptr++ = '\r';
*ptr++ = '\n';
st->pos = 0;
@@ -414,7 +431,12 @@ static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
}
/* Be sure there is enough space and input data for a base64 group. */
- if(size < 4 || st->bufend - st->bufbeg < 3)
+ if(size < 4) {
+ if(!cursize)
+ return STOP_FILLING;
+ break;
+ }
+ if(st->bufend - st->bufbeg < 3)
break;
/* Encode three bytes as four characters. */
@@ -431,25 +453,31 @@ static size_t encoder_base64_read(char *buffer, size_t size, bool ateof,
}
/* If at eof, we have to flush the buffered data. */
- if(ateof && size >= 4) {
- /* Buffered data size can only be 0, 1 or 2. */
- ptr[2] = ptr[3] = '=';
- i = 0;
- switch(st->bufend - st->bufbeg) {
- case 2:
- i = (st->buf[st->bufbeg + 1] & 0xFF) << 8;
- /* FALLTHROUGH */
- case 1:
- i |= (st->buf[st->bufbeg] & 0xFF) << 16;
- ptr[0] = base64[(i >> 18) & 0x3F];
- ptr[1] = base64[(i >> 12) & 0x3F];
- if(++st->bufbeg != st->bufend) {
- ptr[2] = base64[(i >> 6) & 0x3F];
- st->bufbeg++;
+ if(ateof) {
+ if(size < 4) {
+ if(!cursize)
+ return STOP_FILLING;
+ }
+ else {
+ /* Buffered data size can only be 0, 1 or 2. */
+ ptr[2] = ptr[3] = '=';
+ i = 0;
+ switch(st->bufend - st->bufbeg) {
+ case 2:
+ i = (st->buf[st->bufbeg + 1] & 0xFF) << 8;
+ /* FALLTHROUGH */
+ case 1:
+ i |= (st->buf[st->bufbeg] & 0xFF) << 16;
+ ptr[0] = base64[(i >> 18) & 0x3F];
+ ptr[1] = base64[(i >> 12) & 0x3F];
+ if(++st->bufbeg != st->bufend) {
+ ptr[2] = base64[(i >> 6) & 0x3F];
+ st->bufbeg++;
+ }
+ cursize += 4;
+ st->pos += 4;
+ break;
}
- cursize += 4;
- st->pos += 4;
- break;
}
}
@@ -485,7 +513,7 @@ static curl_off_t encoder_base64_size(curl_mimepart *part)
* Check if a CRLF or end of data is in input buffer at current position + n.
* Return -1 if more data needed, 1 if CRLF or end of data, else 0.
*/
-static int qp_lookahead_eol(mime_encoder_state *st, int ateof, size_t n)
+static int qp_lookahead_eol(struct mime_encoder_state *st, int ateof, size_t n)
{
n += st->bufbeg;
if(n >= st->bufend && ateof)
@@ -502,7 +530,7 @@ static int qp_lookahead_eol(mime_encoder_state *st, int ateof, size_t n)
static size_t encoder_qp_read(char *buffer, size_t size, bool ateof,
curl_mimepart *part)
{
- mime_encoder_state *st = &part->encstate;
+ struct mime_encoder_state *st = &part->encstate;
char *ptr = buffer;
size_t cursize = 0;
int softlinebreak;
@@ -567,7 +595,6 @@ static size_t encoder_qp_read(char *buffer, size_t size, bool ateof,
switch(qp_lookahead_eol(st, ateof, consumed)) {
case -1: /* Need more data. */
return cursize;
- break;
case 0: /* Not followed by a CRLF. */
softlinebreak = 1;
break;
@@ -581,8 +608,11 @@ static size_t encoder_qp_read(char *buffer, size_t size, bool ateof,
}
/* If the output buffer would overflow, do not store. */
- if(len > size)
+ if(len > size) {
+ if(!cursize)
+ return STOP_FILLING;
break;
+ }
/* Append to output buffer. */
memcpy(ptr, buf, len);
@@ -612,16 +642,18 @@ static size_t mime_mem_read(char *buffer, size_t size, size_t nitems,
void *instream)
{
curl_mimepart *part = (curl_mimepart *) instream;
- size_t sz = (size_t) part->datasize - part->state.offset;
+ size_t sz = curlx_sotouz(part->datasize - part->state.offset);
(void) size; /* Always 1.*/
+ if(!nitems)
+ return STOP_FILLING;
+
if(sz > nitems)
sz = nitems;
if(sz)
- memcpy(buffer, (char *) &part->data[part->state.offset], sz);
+ memcpy(buffer, part->data + curlx_sotouz(part->state.offset), sz);
- part->state.offset += sz;
return sz;
}
@@ -641,7 +673,7 @@ static int mime_mem_seek(void *instream, curl_off_t offset, int whence)
if(offset < 0 || offset > part->datasize)
return CURL_SEEKFUNC_FAIL;
- part->state.offset = (size_t) offset;
+ part->state.offset = offset;
return CURL_SEEKFUNC_OK;
}
@@ -653,7 +685,7 @@ static void mime_mem_free(void *ptr)
/* Named file callbacks. */
/* Argument is a pointer to the mime part. */
-static int mime_open_file(curl_mimepart * part)
+static int mime_open_file(curl_mimepart *part)
{
/* Open a MIMEKIND_FILE part. */
@@ -668,6 +700,9 @@ static size_t mime_file_read(char *buffer, size_t size, size_t nitems,
{
curl_mimepart *part = (curl_mimepart *) instream;
+ if(!nitems)
+ return STOP_FILLING;
+
if(mime_open_file(part))
return READ_ERROR;
@@ -705,21 +740,22 @@ static void mime_file_free(void *ptr)
/* Argument is a pointer to the mime structure. */
/* Readback a byte string segment. */
-static size_t readback_bytes(mime_state *state,
+static size_t readback_bytes(struct mime_state *state,
char *buffer, size_t bufsize,
const char *bytes, size_t numbytes,
const char *trail)
{
size_t sz;
+ size_t offset = curlx_sotouz(state->offset);
- if(numbytes > state->offset) {
- sz = numbytes - state->offset;
- bytes += state->offset;
+ if(numbytes > offset) {
+ sz = numbytes - offset;
+ bytes += offset;
}
else {
size_t tsz = strlen(trail);
- sz = state->offset - numbytes;
+ sz = offset - numbytes;
if(sz >= tsz)
return 0;
bytes = trail + sz;
@@ -736,25 +772,79 @@ static size_t readback_bytes(mime_state *state,
/* Read a non-encoded part content. */
static size_t read_part_content(curl_mimepart *part,
- char *buffer, size_t bufsize)
+ char *buffer, size_t bufsize, bool *hasread)
{
size_t sz = 0;
- if(part->readfunc)
- sz = part->readfunc(buffer, 1, bufsize, part->arg);
+ switch(part->lastreadstatus) {
+ case 0:
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ case READ_ERROR:
+ return part->lastreadstatus;
+ default:
+ break;
+ }
+
+ /* If we can determine we are at end of part data, spare a read. */
+ if(part->datasize != (curl_off_t) -1 &&
+ part->state.offset >= part->datasize) {
+ /* sz is already zero. */
+ }
+ else {
+ switch(part->kind) {
+ case MIMEKIND_MULTIPART:
+ /*
+ * Cannot be processed as other kinds since read function requires
+ * an additional parameter and is highly recursive.
+ */
+ sz = mime_subparts_read(buffer, 1, bufsize, part->arg, hasread);
+ break;
+ case MIMEKIND_FILE:
+ if(part->fp && feof(part->fp))
+ break; /* At EOF. */
+ /* FALLTHROUGH */
+ default:
+ if(part->readfunc) {
+ if(!(part->flags & MIME_FAST_READ)) {
+ if(*hasread)
+ return STOP_FILLING;
+ *hasread = TRUE;
+ }
+ sz = part->readfunc(buffer, 1, bufsize, part->arg);
+ }
+ break;
+ }
+ }
+
+ switch(sz) {
+ case STOP_FILLING:
+ break;
+ case 0:
+ case CURL_READFUNC_ABORT:
+ case CURL_READFUNC_PAUSE:
+ case READ_ERROR:
+ part->lastreadstatus = sz;
+ break;
+ default:
+ part->state.offset += sz;
+ part->lastreadstatus = sz;
+ break;
+ }
+
return sz;
}
/* Read and encode part content. */
-static size_t read_encoded_part_content(curl_mimepart *part,
- char *buffer, size_t bufsize)
+static size_t read_encoded_part_content(curl_mimepart *part, char *buffer,
+ size_t bufsize, bool *hasread)
{
- mime_encoder_state *st = &part->encstate;
+ struct mime_encoder_state *st = &part->encstate;
size_t cursize = 0;
size_t sz;
bool ateof = FALSE;
- while(bufsize) {
+ for(;;) {
if(st->bufbeg < st->bufend || ateof) {
/* Encode buffered data. */
sz = part->encoder->encodefunc(buffer, bufsize, ateof, part);
@@ -763,9 +853,8 @@ static size_t read_encoded_part_content(curl_mimepart *part,
if(ateof)
return cursize;
break;
- case CURL_READFUNC_ABORT:
- case CURL_READFUNC_PAUSE:
case READ_ERROR:
+ case STOP_FILLING:
return cursize? cursize: sz;
default:
cursize += sz;
@@ -787,7 +876,7 @@ static size_t read_encoded_part_content(curl_mimepart *part,
if(st->bufend >= sizeof(st->buf))
return cursize? cursize: READ_ERROR; /* Buffer full. */
sz = read_part_content(part, st->buf + st->bufend,
- sizeof(st->buf) - st->bufend);
+ sizeof(st->buf) - st->bufend, hasread);
switch(sz) {
case 0:
ateof = TRUE;
@@ -795,6 +884,7 @@ static size_t read_encoded_part_content(curl_mimepart *part,
case CURL_READFUNC_ABORT:
case CURL_READFUNC_PAUSE:
case READ_ERROR:
+ case STOP_FILLING:
return cursize? cursize: sz;
default:
st->bufend += sz;
@@ -802,12 +892,12 @@ static size_t read_encoded_part_content(curl_mimepart *part,
}
}
- return cursize;
+ /* NOTREACHED */
}
/* Readback a mime part. */
static size_t readback_part(curl_mimepart *part,
- char *buffer, size_t bufsize)
+ char *buffer, size_t bufsize, bool *hasread)
{
size_t cursize = 0;
#ifdef CURL_DOES_CONVERSIONS
@@ -866,9 +956,9 @@ static size_t readback_part(curl_mimepart *part,
break;
case MIMESTATE_CONTENT:
if(part->encoder)
- sz = read_encoded_part_content(part, buffer, bufsize);
+ sz = read_encoded_part_content(part, buffer, bufsize, hasread);
else
- sz = read_part_content(part, buffer, bufsize);
+ sz = read_part_content(part, buffer, bufsize, hasread);
switch(sz) {
case 0:
mimesetstate(&part->state, MIMESTATE_END, NULL);
@@ -881,6 +971,7 @@ static size_t readback_part(curl_mimepart *part,
case CURL_READFUNC_ABORT:
case CURL_READFUNC_PAUSE:
case READ_ERROR:
+ case STOP_FILLING:
return cursize? cursize: sz;
}
break;
@@ -909,9 +1000,9 @@ static size_t readback_part(curl_mimepart *part,
return cursize;
}
-/* Readback from mime. */
+/* Readback from mime. Warning: not a read callback function. */
static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
- void *instream)
+ void *instream, bool *hasread)
{
curl_mime *mime = (curl_mime *) instream;
size_t cursize = 0;
@@ -932,7 +1023,7 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
#endif
mimesetstate(&mime->state, MIMESTATE_BOUNDARY1, mime->firstpart);
/* The first boundary always follows the header termination empty line,
- so is always preceded by a CRLK. We can then spare 2 characters
+ so is always preceded by a CRLF. We can then spare 2 characters
by skipping the leading CRLF in boundary. */
mime->state.offset += 2;
break;
@@ -962,11 +1053,12 @@ static size_t mime_subparts_read(char *buffer, size_t size, size_t nitems,
mimesetstate(&mime->state, MIMESTATE_END, NULL);
break;
}
- sz = readback_part(part, buffer, nitems);
+ sz = readback_part(part, buffer, nitems, hasread);
switch(sz) {
case CURL_READFUNC_ABORT:
case CURL_READFUNC_PAUSE:
case READ_ERROR:
+ case STOP_FILLING:
return cursize? cursize: sz;
case 0:
#ifdef CURL_DOES_CONVERSIONS
@@ -1031,6 +1123,7 @@ static int mime_part_rewind(curl_mimepart *part)
if(res == CURL_SEEKFUNC_OK)
mimesetstate(&part->state, targetstate, NULL);
+ part->lastreadstatus = 1; /* Successful read status. */
return res;
}
@@ -1073,6 +1166,8 @@ static void cleanup_part_content(curl_mimepart *part)
part->datasize = (curl_off_t) 0; /* No size yet. */
cleanup_encoder_state(&part->encstate);
part->kind = MIMEKIND_NONE;
+ part->flags &= ~MIME_FAST_READ;
+ part->lastreadstatus = 1; /* Successful read status. */
}
static void mime_subparts_free(void *ptr)
@@ -1238,6 +1333,7 @@ void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy)
{
memset((char *) part, 0, sizeof(*part));
part->easy = easy;
+ part->lastreadstatus = 1; /* Successful read status. */
mimesetstate(&part->state, MIMESTATE_BEGIN, NULL);
}
@@ -1323,11 +1419,12 @@ CURLcode curl_mime_data(curl_mimepart *part,
if(datasize)
memcpy(part->data, data, datasize);
- part->data[datasize] = '\0'; /* Set a nul terminator as sentinel. */
+ part->data[datasize] = '\0'; /* Set a null terminator as sentinel. */
part->readfunc = mime_mem_read;
part->seekfunc = mime_mem_seek;
part->freefunc = mime_mem_free;
+ part->flags |= MIME_FAST_READ;
part->kind = MIMEKIND_DATA;
}
@@ -1405,7 +1502,7 @@ CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype)
CURLcode curl_mime_encoder(curl_mimepart *part, const char *encoding)
{
CURLcode result = CURLE_BAD_FUNCTION_ARGUMENT;
- const mime_encoder *mep;
+ const struct mime_encoder *mep;
if(!part)
return result;
@@ -1502,7 +1599,7 @@ CURLcode Curl_mime_set_subparts(curl_mimepart *part,
}
subparts->parent = part;
- part->readfunc = mime_subparts_read;
+ /* Subparts are processed internally: no read callback. */
part->seekfunc = mime_subparts_seek;
part->freefunc = take_ownership? mime_subparts_free: mime_subparts_unbind;
part->arg = subparts;
@@ -1524,9 +1621,23 @@ CURLcode curl_mime_subparts(curl_mimepart *part, curl_mime *subparts)
size_t Curl_mime_read(char *buffer, size_t size, size_t nitems, void *instream)
{
curl_mimepart *part = (curl_mimepart *) instream;
+ size_t ret;
+ bool hasread;
(void) size; /* Always 1. */
- return readback_part(part, buffer, nitems);
+
+ do {
+ hasread = FALSE;
+ ret = readback_part(part, buffer, nitems, &hasread);
+ /*
+ * If this is not possible to get some data without calling more than
+ * one read callback (probably because a content encoder is not able to
+ * deliver a new bunch for the few data accumulated so far), force another
+ * read until we get enough data or a special exit code.
+ */
+ } while(ret == STOP_FILLING);
+
+ return ret;
}
/* Rewind mime stream. */
@@ -1667,6 +1778,23 @@ const char *Curl_mime_contenttype(const char *filename)
return NULL;
}
+static bool content_type_match(const char *contenttype, const char *target)
+{
+ size_t len = strlen(target);
+
+ if(contenttype && strncasecompare(contenttype, target, len))
+ switch(contenttype[len]) {
+ case '\0':
+ case '\t':
+ case '\r':
+ case '\n':
+ case ' ':
+ case ';':
+ return TRUE;
+ }
+ return FALSE;
+}
+
CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
const char *contenttype,
const char *disposition,
@@ -1718,7 +1846,7 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
boundary = mime->boundary;
}
else if(contenttype && !customct &&
- strcasecompare(contenttype, "text/plain"))
+ content_type_match(contenttype, "text/plain"))
if(strategy == MIMESTRATEGY_MAIL || !part->filename)
contenttype = NULL;
@@ -1794,7 +1922,7 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
curl_mimepart *subpart;
disposition = NULL;
- if(strcasecompare(contenttype, "multipart/form-data"))
+ if(content_type_match(contenttype, "multipart/form-data"))
disposition = "form-data";
for(subpart = mime->firstpart; subpart; subpart = subpart->nextpart) {
ret = Curl_mime_prepare_headers(subpart, NULL, disposition, strategy);
@@ -1805,6 +1933,26 @@ CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
return ret;
}
+/* Recursively reset paused status in the given part. */
+void Curl_mime_unpause(curl_mimepart *part)
+{
+ if(part) {
+ if(part->lastreadstatus == CURL_READFUNC_PAUSE)
+ part->lastreadstatus = 1; /* Successful read status. */
+ if(part->kind == MIMEKIND_MULTIPART) {
+ curl_mime *mime = (curl_mime *) part->arg;
+
+ if(mime) {
+ curl_mimepart *subpart;
+
+ for(subpart = mime->firstpart; subpart; subpart = subpart->nextpart)
+ Curl_mime_unpause(subpart);
+ }
+ }
+ }
+}
+
+
#else /* !CURL_DISABLE_HTTP || !CURL_DISABLE_SMTP || !CURL_DISABLE_IMAP */
/* Mime not compiled in: define stubs for externally-referenced functions. */
diff --git a/lib/mime.h b/lib/mime.h
index 3241fdc1f..50b7ea6b0 100644
--- a/lib/mime.h
+++ b/lib/mime.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,7 @@
/* Part flags. */
#define MIME_USERHEADERS_OWNER (1 << 0)
#define MIME_BODY_ONLY (1 << 1)
+#define MIME_FAST_READ (1 << 2)
#define FILE_CONTENTTYPE_DEFAULT "application/octet-stream"
#define MULTIPART_CONTENTTYPE_DEFAULT "multipart/mixed"
@@ -68,43 +69,43 @@ enum mimestrategy {
};
/* Content transfer encoder. */
-typedef struct {
+struct mime_encoder {
const char * name; /* Encoding name. */
size_t (*encodefunc)(char *buffer, size_t size, bool ateof,
curl_mimepart *part); /* Encoded read. */
curl_off_t (*sizefunc)(curl_mimepart *part); /* Encoded size. */
-} mime_encoder;
+};
/* Content transfer encoder state. */
-typedef struct {
+struct mime_encoder_state {
size_t pos; /* Position on output line. */
size_t bufbeg; /* Next data index in input buffer. */
size_t bufend; /* First unused byte index in input buffer. */
char buf[ENCODING_BUFFER_SIZE]; /* Input buffer. */
-} mime_encoder_state;
+};
/* Mime readback state. */
-typedef struct {
+struct mime_state {
enum mimestate state; /* Current state token. */
void *ptr; /* State-dependent pointer. */
- size_t offset; /* State-dependent offset. */
-} mime_state;
+ curl_off_t offset; /* State-dependent offset. */
+};
/* minimum buffer size for the boundary string */
#define MIME_BOUNDARY_LEN (24 + MIME_RAND_BOUNDARY_CHARS + 1)
/* A mime multipart. */
-struct curl_mime_s {
+struct curl_mime {
struct Curl_easy *easy; /* The associated easy handle. */
curl_mimepart *parent; /* Parent part. */
curl_mimepart *firstpart; /* First part. */
curl_mimepart *lastpart; /* Last part. */
char boundary[MIME_BOUNDARY_LEN]; /* The part boundary. */
- mime_state state; /* Current readback state. */
+ struct mime_state state; /* Current readback state. */
};
/* A mime part. */
-struct curl_mimepart_s {
+struct curl_mimepart {
struct Curl_easy *easy; /* The associated easy handle. */
curl_mime *parent; /* Parent mime structure. */
curl_mimepart *nextpart; /* Forward linked list. */
@@ -122,9 +123,10 @@ struct curl_mimepart_s {
char *name; /* Data name. */
curl_off_t datasize; /* Expected data size. */
unsigned int flags; /* Flags. */
- mime_state state; /* Current readback state. */
- const mime_encoder *encoder; /* Content data encoder. */
- mime_encoder_state encstate; /* Data encoder state. */
+ struct mime_state state; /* Current readback state. */
+ const struct mime_encoder *encoder; /* Content data encoder. */
+ struct mime_encoder_state encstate; /* Data encoder state. */
+ size_t lastreadstatus; /* Last read callback returned status. */
};
CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
@@ -133,20 +135,23 @@ CURLcode Curl_mime_add_header(struct curl_slist **slp, const char *fmt, ...);
!defined(CURL_DISABLE_SMTP) || !defined(CURL_DISABLE_IMAP)
/* Prototypes. */
-void Curl_mime_initpart(curl_mimepart *part, struct Curl_easy *easy);
-void Curl_mime_cleanpart(curl_mimepart *part);
-CURLcode Curl_mime_duppart(curl_mimepart *dst, const curl_mimepart *src);
-CURLcode Curl_mime_set_subparts(curl_mimepart *part,
- curl_mime *subparts, int take_ownership);
-CURLcode Curl_mime_prepare_headers(curl_mimepart *part,
+void Curl_mime_initpart(struct curl_mimepart *part, struct Curl_easy *easy);
+void Curl_mime_cleanpart(struct curl_mimepart *part);
+CURLcode Curl_mime_duppart(struct curl_mimepart *dst,
+ const curl_mimepart *src);
+CURLcode Curl_mime_set_subparts(struct curl_mimepart *part,
+ struct curl_mime *subparts,
+ int take_ownership);
+CURLcode Curl_mime_prepare_headers(struct curl_mimepart *part,
const char *contenttype,
const char *disposition,
enum mimestrategy strategy);
-curl_off_t Curl_mime_size(curl_mimepart *part);
+curl_off_t Curl_mime_size(struct curl_mimepart *part);
size_t Curl_mime_read(char *buffer, size_t size, size_t nitems,
void *instream);
-CURLcode Curl_mime_rewind(curl_mimepart *part);
+CURLcode Curl_mime_rewind(struct curl_mimepart *part);
const char *Curl_mime_contenttype(const char *filename);
+void Curl_mime_unpause(struct curl_mimepart *part);
#else
/* if disabled */
@@ -158,6 +163,7 @@ const char *Curl_mime_contenttype(const char *filename);
#define Curl_mime_size(x) (curl_off_t) -1
#define Curl_mime_read NULL
#define Curl_mime_rewind(x) ((void)x, CURLE_NOT_BUILT_IN)
+#define Curl_mime_unpause(x)
#endif
diff --git a/lib/mk-ca-bundle.pl b/lib/mk-ca-bundle.pl
index 33977f322..b9c7ed257 100755
--- a/lib/mk-ca-bundle.pl
+++ b/lib/mk-ca-bundle.pl
@@ -6,7 +6,7 @@
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
-# * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
@@ -38,6 +38,7 @@ use warnings;
use vars qw($opt_b $opt_d $opt_f $opt_h $opt_i $opt_k $opt_l $opt_m $opt_n $opt_p $opt_q $opt_s $opt_t $opt_u $opt_v $opt_w);
use List::Util;
use Text::Wrap;
+use Time::Local;
my $MOD_SHA = "Digest::SHA";
eval "require $MOD_SHA";
if ($@) {
@@ -62,7 +63,7 @@ $opt_d = 'release';
# If the OpenSSL commandline is not in search path you can configure it here!
my $openssl = 'openssl';
-my $version = '1.27';
+my $version = '1.28';
$opt_w = 76; # default base64 encoded lines length
@@ -421,6 +422,8 @@ my $certnum = 0;
my $skipnum = 0;
my $start_of_cert = 0;
my @precert;
+my $cka_value;
+my $valid = 1;
open(TXT,"$txt") or die "Couldn't open $txt: $!\n";
while (<TXT>) {
@@ -435,6 +438,7 @@ while (<TXT>) {
}
elsif(/^# (Issuer|Serial Number|Subject|Not Valid Before|Not Valid After |Fingerprint \(MD5\)|Fingerprint \(SHA1\)):/) {
push @precert, $_;
+ $valid = 1;
next;
}
elsif(/^#|^\s*$/) {
@@ -443,6 +447,49 @@ while (<TXT>) {
}
chomp;
+ # Example:
+ # CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL
+ # \062\060\060\066\061\067\060\060\060\060\060\060\132
+ # END
+
+ if (/^CKA_NSS_SERVER_DISTRUST_AFTER (CK_BBOOL CK_FALSE|MULTILINE_OCTAL)/) {
+ if($1 eq "MULTILINE_OCTAL") {
+ my @timestamp;
+ while (<TXT>) {
+ last if (/^END/);
+ chomp;
+ my @octets = split(/\\/);
+ shift @octets;
+ for (@octets) {
+ push @timestamp, chr(oct);
+ }
+ }
+ # A trailing Z in the timestamp signifies UTC
+ if($timestamp[12] ne "Z") {
+ report "distrust date stamp is not using UTC";
+ }
+ # Example date: 200617000000Z
+ # Means 2020-06-17 00:00:00 UTC
+ my $distrustat =
+ timegm($timestamp[10] . $timestamp[11], # second
+ $timestamp[8] . $timestamp[9], # minute
+ $timestamp[6] . $timestamp[7], # hour
+ $timestamp[4] . $timestamp[5], # day
+ ($timestamp[2] . $timestamp[3]) - 1, # month
+ "20" . $timestamp[0] . $timestamp[1]); # year
+ if(time >= $distrustat) {
+ # not trusted anymore
+ $skipnum++;
+ report "Skipping: $caname is not trusted anymore" if ($opt_v);
+ $valid = 0;
+ }
+ else {
+ # still trusted
+ }
+ }
+ next;
+ }
+
# this is a match for the start of a certificate
if (/^CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE/) {
$start_of_cert = 1
@@ -452,21 +499,18 @@ while (<TXT>) {
}
my %trust_purposes_by_level;
if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) {
- my $data;
+ $cka_value="";
while (<TXT>) {
last if (/^END/);
chomp;
my @octets = split(/\\/);
shift @octets;
for (@octets) {
- $data .= chr(oct);
+ $cka_value .= chr(oct);
}
}
- # scan forwards until the trust part
- while (<TXT>) {
- last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/);
- chomp;
- }
+ }
+ if(/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/ && $valid) {
# now scan the trust part to determine how we should trust this cert
while (<TXT>) {
last if (/^#/);
@@ -485,6 +529,13 @@ while (<TXT>) {
$skipnum ++;
report "Skipping: $caname" if ($opt_v);
} else {
+ my $data = $cka_value;
+ $cka_value = "";
+
+ if(!length($data)) {
+ # if empty, skip
+ next;
+ }
my $encoded = MIME::Base64::encode_base64($data, '');
$encoded =~ s/(.{1,${opt_w}})/$1\n/g;
my $pem = "-----BEGIN CERTIFICATE-----\n"
diff --git a/lib/mk-ca-bundle.vbs b/lib/mk-ca-bundle.vbs
index 8da279268..34871711d 100755
--- a/lib/mk-ca-bundle.vbs
+++ b/lib/mk-ca-bundle.vbs
@@ -5,7 +5,7 @@
'* | (__| |_| | _ <| |___
'* \___|\___/|_| \_\_____|
'*
-'* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+'* Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
'*
'* This software is licensed as described in the file COPYING, which
'* you should have received as part of this distribution. The terms
diff --git a/lib/mprintf.c b/lib/mprintf.c
index e19093678..6aceadc96 100644
--- a/lib/mprintf.c
+++ b/lib/mprintf.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1999 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1999 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,6 +36,7 @@
*/
#include "curl_setup.h"
+#include "dynbuf.h"
#include <curl/mprintf.h>
#include "curl_memory.h"
@@ -98,13 +99,13 @@ static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
/* Upper-case digits. */
static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-#define OUTCHAR(x) \
- do{ \
+#define OUTCHAR(x) \
+ do { \
if(stream((unsigned char)(x), (FILE *)data) != -1) \
- done++; \
- else \
- return done; /* return immediately on failure */ \
- } WHILE_FALSE
+ done++; \
+ else \
+ return done; /* return immediately on failure */ \
+ } while(0)
/* Data type to read from the arglist */
typedef enum {
@@ -145,7 +146,7 @@ enum {
FLAGS_FLOATG = 1<<19 /* %g or %G */
};
-typedef struct {
+struct va_stack {
FormatType type;
int flags;
long width; /* width OR width parameter number */
@@ -159,7 +160,7 @@ typedef struct {
} num;
double dnum;
} data;
-} va_stack_t;
+};
struct nsprintf {
char *buffer;
@@ -168,23 +169,23 @@ struct nsprintf {
};
struct asprintf {
- char *buffer; /* allocated buffer */
- size_t len; /* length of string */
- size_t alloc; /* length of alloc */
- int fail; /* (!= 0) if an alloc has failed and thus
- the output is not the complete data */
+ struct dynbuf *b;
+ bool fail; /* if an alloc has failed and thus the output is not the complete
+ data */
};
static long dprintf_DollarString(char *input, char **end)
{
int number = 0;
while(ISDIGIT(*input)) {
- number *= 10;
- number += *input-'0';
+ if(number < MAX_PARAMETERS) {
+ number *= 10;
+ number += *input - '0';
+ }
input++;
}
- if(number && ('$'==*input++)) {
- *end = input;
+ if(number <= MAX_PARAMETERS && ('$' == *input)) {
+ *end = ++input;
return number;
}
return 0;
@@ -224,8 +225,8 @@ static bool dprintf_IsQualifierNoDollar(const char *fmt)
*
******************************************************************/
-static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
- va_list arglist)
+static int dprintf_Pass1(const char *format, struct va_stack *vto,
+ char **endpos, va_list arglist)
{
char *fmt = (char *)format;
int param_num = 0;
@@ -378,6 +379,8 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
if(width > max_param)
max_param = width;
break;
+ case '\0':
+ fmt--;
default:
break;
}
@@ -459,6 +462,9 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
/* we have the width specified from a parameter, so we make that
parameter's info setup properly */
long k = width - 1;
+ if((k < 0) || (k >= MAX_PARAMETERS))
+ /* out of allowed range */
+ return 1;
vto[i].width = k;
vto[k].type = FORMAT_WIDTH;
vto[k].flags = FLAGS_NEW;
@@ -470,6 +476,9 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
/* we have the precision specified from a parameter, so we make that
parameter's info setup properly */
long k = precision - 1;
+ if((k < 0) || (k >= MAX_PARAMETERS))
+ /* out of allowed range */
+ return 1;
vto[i].precision = k;
vto[k].type = FORMAT_WIDTH;
vto[k].flags = FLAGS_NEW;
@@ -477,7 +486,7 @@ static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
vto[k].width = 0;
vto[k].precision = 0;
}
- *endpos++ = fmt + 1; /* end of this sequence */
+ *endpos++ = fmt + ((*fmt == '\0') ? 0 : 1); /* end of this sequence */
}
}
@@ -571,13 +580,11 @@ static int dprintf_formatf(
long param; /* current parameter to read */
long param_num = 0; /* parameter counter */
- va_stack_t vto[MAX_PARAMETERS];
+ struct va_stack vto[MAX_PARAMETERS];
char *endpos[MAX_PARAMETERS];
char **end;
-
char work[BUFFSIZE];
-
- va_stack_t *p;
+ struct va_stack *p;
/* 'workend' points to the final buffer byte position, but with an extra
byte as margin to avoid the (false?) warning Coverity gives us
@@ -757,7 +764,7 @@ static int dprintf_formatf(
if(prec > 0) {
width -= prec;
- while(prec-- > 0)
+ while(prec-- > 0 && w >= work)
*w-- = '0';
}
@@ -871,7 +878,7 @@ static int dprintf_formatf(
OUTCHAR(' ');
for(point = strnil; *point != '\0'; ++point)
OUTCHAR(*point);
- if(! (p->flags & FLAGS_LEFT))
+ if(!(p->flags & FLAGS_LEFT))
while(width-- > 0)
OUTCHAR(' ');
}
@@ -921,6 +928,8 @@ static int dprintf_formatf(
precision */
size_t maxprec = sizeof(work) - 2;
double val = p->data.dnum;
+ if(width > 0 && prec <= width)
+ maxprec -= width;
while(val >= 10.0) {
val /= 10;
maxprec--;
@@ -928,6 +937,8 @@ static int dprintf_formatf(
if(prec > (long)maxprec)
prec = (long)maxprec-1;
+ if(prec < 0)
+ prec = 0;
/* RECURSIVE USAGE */
len = curl_msnprintf(fptr, left, ".%ld", prec);
fptr += len;
@@ -1031,88 +1042,61 @@ static int alloc_addbyter(int output, FILE *data)
struct asprintf *infop = (struct asprintf *)data;
unsigned char outc = (unsigned char)output;
- if(!infop->buffer) {
- infop->buffer = malloc(32);
- if(!infop->buffer) {
- infop->fail = 1;
- return -1; /* fail */
- }
- infop->alloc = 32;
- infop->len = 0;
- }
- else if(infop->len + 1 >= infop->alloc) {
- char *newptr = NULL;
- size_t newsize = infop->alloc*2;
-
- /* detect wrap-around or other overflow problems */
- if(newsize > infop->alloc)
- newptr = realloc(infop->buffer, newsize);
-
- if(!newptr) {
- infop->fail = 1;
- return -1; /* fail */
- }
- infop->buffer = newptr;
- infop->alloc = newsize;
+ if(Curl_dyn_addn(infop->b, &outc, 1)) {
+ infop->fail = 1;
+ return -1; /* fail */
}
-
- infop->buffer[ infop->len ] = outc;
-
- infop->len++;
-
return outc; /* fputc() returns like this on success */
}
-char *curl_maprintf(const char *format, ...)
+extern int Curl_dyn_vprintf(struct dynbuf *dyn,
+ const char *format, va_list ap_save);
+
+/* appends the formatted string, returns 0 on success, 1 on error */
+int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save)
{
- va_list ap_save; /* argument pointer */
int retcode;
struct asprintf info;
-
- info.buffer = NULL;
- info.len = 0;
- info.alloc = 0;
+ info.b = dyn;
info.fail = 0;
- va_start(ap_save, format);
retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
- va_end(ap_save);
if((-1 == retcode) || info.fail) {
- if(info.alloc)
- free(info.buffer);
- return NULL;
- }
- if(info.alloc) {
- info.buffer[info.len] = 0; /* we terminate this with a zero byte */
- return info.buffer;
+ Curl_dyn_free(info.b);
+ return 1;
}
- return strdup("");
+ return 0;
}
char *curl_mvaprintf(const char *format, va_list ap_save)
{
int retcode;
struct asprintf info;
-
- info.buffer = NULL;
- info.len = 0;
- info.alloc = 0;
+ struct dynbuf dyn;
+ info.b = &dyn;
+ Curl_dyn_init(info.b, DYN_APRINTF);
info.fail = 0;
retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
if((-1 == retcode) || info.fail) {
- if(info.alloc)
- free(info.buffer);
+ Curl_dyn_free(info.b);
return NULL;
}
-
- if(info.alloc) {
- info.buffer[info.len] = 0; /* we terminate this with a zero byte */
- return info.buffer;
- }
+ if(Curl_dyn_len(info.b))
+ return Curl_dyn_ptr(info.b);
return strdup("");
}
+char *curl_maprintf(const char *format, ...)
+{
+ va_list ap_save;
+ char *s;
+ va_start(ap_save, format);
+ s = curl_mvaprintf(format, ap_save);
+ va_end(ap_save);
+ return s;
+}
+
static int storebuffer(int output, FILE *data)
{
char **buffer = (char **)data;
diff --git a/lib/mqtt.c b/lib/mqtt.c
new file mode 100644
index 000000000..c0e9a2b75
--- /dev/null
+++ b/lib/mqtt.c
@@ -0,0 +1,629 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019, Björn Stenberg, <bjorn@haxx.se>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifndef CURL_DISABLE_MQTT
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "transfer.h"
+#include "sendf.h"
+#include "progress.h"
+#include "mqtt.h"
+#include "select.h"
+#include "strdup.h"
+#include "url.h"
+#include "escape.h"
+#include "warnless.h"
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "multiif.h"
+#include "rand.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+#define MQTT_MSG_CONNECT 0x10
+#define MQTT_MSG_CONNACK 0x20
+#define MQTT_MSG_PUBLISH 0x30
+#define MQTT_MSG_SUBSCRIBE 0x82
+#define MQTT_MSG_SUBACK 0x90
+#define MQTT_MSG_DISCONNECT 0xe0
+
+#define MQTT_CONNACK_LEN 2
+#define MQTT_SUBACK_LEN 3
+#define MQTT_CLIENTID_LEN 12 /* "curl0123abcd" */
+
+/*
+ * Forward declarations.
+ */
+
+static CURLcode mqtt_do(struct connectdata *conn, bool *done);
+static CURLcode mqtt_doing(struct connectdata *conn, bool *done);
+static int mqtt_getsock(struct connectdata *conn, curl_socket_t *sock);
+static CURLcode mqtt_setup_conn(struct connectdata *conn);
+
+/*
+ * MQTT protocol handler.
+ */
+
+const struct Curl_handler Curl_handler_mqtt = {
+ "MQTT", /* scheme */
+ mqtt_setup_conn, /* setup_connection */
+ mqtt_do, /* do_it */
+ ZERO_NULL, /* done */
+ ZERO_NULL, /* do_more */
+ ZERO_NULL, /* connect_it */
+ ZERO_NULL, /* connecting */
+ mqtt_doing, /* doing */
+ ZERO_NULL, /* proto_getsock */
+ mqtt_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ ZERO_NULL, /* perform_getsock */
+ ZERO_NULL, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
+ PORT_MQTT, /* defport */
+ CURLPROTO_MQTT, /* protocol */
+ CURLPROTO_MQTT, /* family */
+ PROTOPT_NONE /* flags */
+};
+
+static CURLcode mqtt_setup_conn(struct connectdata *conn)
+{
+ /* allocate the HTTP-specific struct for the Curl_easy, only to survive
+ during this request */
+ struct MQTT *mq;
+ struct Curl_easy *data = conn->data;
+ DEBUGASSERT(data->req.protop == NULL);
+
+ mq = calloc(1, sizeof(struct MQTT));
+ if(!mq)
+ return CURLE_OUT_OF_MEMORY;
+ data->req.protop = mq;
+ return CURLE_OK;
+}
+
+static CURLcode mqtt_send(struct connectdata *conn,
+ char *buf, size_t len)
+{
+ CURLcode result = CURLE_OK;
+ curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
+ struct Curl_easy *data = conn->data;
+ struct MQTT *mq = data->req.protop;
+ ssize_t n;
+ result = Curl_write(conn, sockfd, buf, len, &n);
+ if(!result && data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_OUT, buf, (size_t)n);
+ if(len != (size_t)n) {
+ size_t nsend = len - n;
+ char *sendleftovers = Curl_memdup(&buf[n], nsend);
+ if(!sendleftovers)
+ return CURLE_OUT_OF_MEMORY;
+ mq->sendleftovers = sendleftovers;
+ mq->nsend = nsend;
+ }
+ return result;
+}
+
+/* Generic function called by the multi interface to figure out what socket(s)
+ to wait for and for what actions during the DOING and PROTOCONNECT
+ states */
+static int mqtt_getsock(struct connectdata *conn,
+ curl_socket_t *sock)
+{
+ sock[0] = conn->sock[FIRSTSOCKET];
+ return GETSOCK_READSOCK(FIRSTSOCKET);
+}
+
+static CURLcode mqtt_connect(struct connectdata *conn)
+{
+ CURLcode result = CURLE_OK;
+ const size_t client_id_offset = 14;
+ const size_t packetlen = client_id_offset + MQTT_CLIENTID_LEN;
+ char client_id[MQTT_CLIENTID_LEN + 1] = "curl";
+ const size_t clen = strlen("curl");
+ char packet[32] = {
+ MQTT_MSG_CONNECT, /* packet type */
+ 0x00, /* remaining length */
+ 0x00, 0x04, /* protocol length */
+ 'M','Q','T','T', /* protocol name */
+ 0x04, /* protocol level */
+ 0x02, /* CONNECT flag: CleanSession */
+ 0x00, 0x3c, /* keep-alive 0 = disabled */
+ 0x00, 0x00 /* payload1 length */
+ };
+ packet[1] = (packetlen - 2) & 0x7f;
+ packet[client_id_offset - 1] = MQTT_CLIENTID_LEN;
+
+ result = Curl_rand_hex(conn->data, (unsigned char *)&client_id[clen],
+ MQTT_CLIENTID_LEN - clen + 1);
+ memcpy(&packet[client_id_offset], client_id, MQTT_CLIENTID_LEN);
+ infof(conn->data, "Using client id '%s'\n", client_id);
+ if(!result)
+ result = mqtt_send(conn, packet, packetlen);
+ return result;
+}
+
+static CURLcode mqtt_disconnect(struct connectdata *conn)
+{
+ CURLcode result = CURLE_OK;
+ result = mqtt_send(conn, (char *)"\xe0\x00", 2);
+ return result;
+}
+
+static CURLcode mqtt_verify_connack(struct connectdata *conn)
+{
+ CURLcode result;
+ curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
+ unsigned char readbuf[MQTT_CONNACK_LEN];
+ ssize_t nread;
+ struct Curl_easy *data = conn->data;
+
+ result = Curl_read(conn, sockfd, (char *)readbuf, MQTT_CONNACK_LEN, &nread);
+ if(result)
+ goto fail;
+
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_IN, (char *)readbuf, (size_t)nread);
+
+ /* fixme */
+ if(nread < MQTT_CONNACK_LEN) {
+ result = CURLE_WEIRD_SERVER_REPLY;
+ goto fail;
+ }
+
+ /* verify CONNACK */
+ if(readbuf[0] != 0x00 || readbuf[1] != 0x00) {
+ failf(data, "Expected %02x%02x but got %02x%02x",
+ 0x00, 0x00, readbuf[0], readbuf[1]);
+ result = CURLE_WEIRD_SERVER_REPLY;
+ }
+
+fail:
+ return result;
+}
+
+static CURLcode mqtt_get_topic(struct connectdata *conn,
+ char **topic, size_t *topiclen)
+{
+ CURLcode result = CURLE_OK;
+ char *path = conn->data->state.up.path;
+
+ if(strlen(path) > 1) {
+ result = Curl_urldecode(conn->data, path + 1, 0, topic, topiclen,
+ REJECT_NADA);
+ }
+ else {
+ failf(conn->data, "Error: No topic specified.");
+ result = CURLE_URL_MALFORMAT;
+ }
+ return result;
+}
+
+
+static int mqtt_encode_len(char *buf, size_t len)
+{
+ unsigned char encoded;
+ int i;
+
+ for(i = 0; (len > 0) && (i<4); i++) {
+ encoded = len % 0x80;
+ len /= 0x80;
+ if(len)
+ encoded |= 0x80;
+ buf[i] = encoded;
+ }
+
+ return i;
+}
+
+static CURLcode mqtt_subscribe(struct connectdata *conn)
+{
+ CURLcode result = CURLE_OK;
+ char *topic = NULL;
+ size_t topiclen;
+ unsigned char *packet = NULL;
+ size_t packetlen;
+ char encodedsize[4];
+ size_t n;
+
+ result = mqtt_get_topic(conn, &topic, &topiclen);
+ if(result)
+ goto fail;
+
+ conn->proto.mqtt.packetid++;
+
+ packetlen = topiclen + 5; /* packetid + topic (has a two byte length field)
+ + 2 bytes topic length + QoS byte */
+ n = mqtt_encode_len((char *)encodedsize, packetlen);
+ packetlen += n + 1; /* add one for the control packet type byte */
+
+ packet = malloc(packetlen);
+ if(!packet) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+
+ packet[0] = MQTT_MSG_SUBSCRIBE;
+ memcpy(&packet[1], encodedsize, n);
+ packet[1 + n] = (conn->proto.mqtt.packetid >> 8) & 0xff;
+ packet[2 + n] = conn->proto.mqtt.packetid & 0xff;
+ packet[3 + n] = (topiclen >> 8) & 0xff;
+ packet[4 + n ] = topiclen & 0xff;
+ memcpy(&packet[5 + n], topic, topiclen);
+ packet[5 + n + topiclen] = 0; /* QoS zero */
+
+ result = mqtt_send(conn, (char *)packet, packetlen);
+
+fail:
+ free(topic);
+ free(packet);
+ return result;
+}
+
+/*
+ * Called when the first byte was already read.
+ */
+static CURLcode mqtt_verify_suback(struct connectdata *conn)
+{
+ CURLcode result;
+ curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
+ unsigned char readbuf[MQTT_SUBACK_LEN];
+ ssize_t nread;
+ struct mqtt_conn *mqtt = &conn->proto.mqtt;
+
+ result = Curl_read(conn, sockfd, (char *)readbuf, MQTT_SUBACK_LEN, &nread);
+ if(result)
+ goto fail;
+
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_HEADER_IN, (char *)readbuf, (size_t)nread);
+
+ /* fixme */
+ if(nread < MQTT_SUBACK_LEN) {
+ result = CURLE_WEIRD_SERVER_REPLY;
+ goto fail;
+ }
+
+ /* verify SUBACK */
+ if(readbuf[0] != ((mqtt->packetid >> 8) & 0xff) ||
+ readbuf[1] != (mqtt->packetid & 0xff) ||
+ readbuf[2] != 0x00)
+ result = CURLE_WEIRD_SERVER_REPLY;
+
+fail:
+ return result;
+}
+
+static CURLcode mqtt_publish(struct connectdata *conn)
+{
+ CURLcode result;
+ char *payload = conn->data->set.postfields;
+ size_t payloadlen = (size_t)conn->data->set.postfieldsize;
+ char *topic = NULL;
+ size_t topiclen;
+ unsigned char *pkt = NULL;
+ size_t i = 0;
+ size_t remaininglength;
+ size_t encodelen;
+ char encodedbytes[4];
+
+ result = mqtt_get_topic(conn, &topic, &topiclen);
+ if(result)
+ goto fail;
+
+ remaininglength = payloadlen + 2 + topiclen;
+ encodelen = mqtt_encode_len(encodedbytes, remaininglength);
+
+ /* add the control byte and the encoded remaining length */
+ pkt = malloc(remaininglength + 1 + encodelen);
+ if(!pkt) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+
+ /* assemble packet */
+ pkt[i++] = MQTT_MSG_PUBLISH;
+ memcpy(&pkt[i], encodedbytes, encodelen);
+ i += encodelen;
+ pkt[i++] = (topiclen >> 8) & 0xff;
+ pkt[i++] = (topiclen & 0xff);
+ memcpy(&pkt[i], topic, topiclen);
+ i += topiclen;
+ memcpy(&pkt[i], payload, payloadlen);
+ i += payloadlen;
+ result = mqtt_send(conn, (char *)pkt, i);
+
+fail:
+ free(pkt);
+ free(topic);
+ return result;
+}
+
+static size_t mqtt_decode_len(unsigned char *buf,
+ size_t buflen, size_t *lenbytes)
+{
+ size_t len = 0;
+ size_t mult = 1;
+ size_t i;
+ unsigned char encoded = 128;
+
+ for(i = 0; (i < buflen) && (encoded & 128); i++) {
+ encoded = buf[i];
+ len += (encoded & 127) * mult;
+ mult *= 128;
+ }
+
+ if(lenbytes)
+ *lenbytes = i;
+
+ return len;
+}
+
+#ifdef CURLDEBUG
+static const char *statenames[]={
+ "MQTT_FIRST",
+ "MQTT_REMAINING_LENGTH",
+ "MQTT_CONNACK",
+ "MQTT_SUBACK",
+ "MQTT_SUBACK_COMING",
+ "MQTT_PUBWAIT",
+ "MQTT_PUB_REMAIN",
+
+ "NOT A STATE"
+};
+#endif
+
+/* The only way to change state */
+static void mqstate(struct connectdata *conn,
+ enum mqttstate state,
+ enum mqttstate nextstate) /* used if state == FIRST */
+{
+ struct mqtt_conn *mqtt = &conn->proto.mqtt;
+#ifdef CURLDEBUG
+ infof(conn->data, "%s (from %s) (next is %s)\n",
+ statenames[state],
+ statenames[mqtt->state],
+ (state == MQTT_FIRST)? statenames[nextstate] : "");
+#endif
+ mqtt->state = state;
+ if(state == MQTT_FIRST)
+ mqtt->nextstate = nextstate;
+}
+
+
+/* for the publish packet */
+#define MQTT_HEADER_LEN 5 /* max 5 bytes */
+
+static CURLcode mqtt_read_publish(struct connectdata *conn,
+ bool *done)
+{
+ CURLcode result = CURLE_OK;
+ curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
+ ssize_t nread;
+ struct Curl_easy *data = conn->data;
+ unsigned char *pkt = (unsigned char *)data->state.buffer;
+ size_t remlen;
+ struct mqtt_conn *mqtt = &conn->proto.mqtt;
+ struct MQTT *mq = data->req.protop;
+ unsigned char packet;
+
+ switch(mqtt->state) {
+ MQTT_SUBACK_COMING:
+ case MQTT_SUBACK_COMING:
+ result = mqtt_verify_suback(conn);
+ if(result)
+ break;
+
+ mqstate(conn, MQTT_FIRST, MQTT_PUBWAIT);
+ break;
+
+ case MQTT_SUBACK:
+ case MQTT_PUBWAIT:
+ /* we are expecting PUBLISH or SUBACK */
+ packet = mq->firstbyte & 0xf0;
+ if(packet == MQTT_MSG_PUBLISH)
+ mqstate(conn, MQTT_PUB_REMAIN, MQTT_NOSTATE);
+ else if(packet == MQTT_MSG_SUBACK) {
+ mqstate(conn, MQTT_SUBACK_COMING, MQTT_NOSTATE);
+ goto MQTT_SUBACK_COMING;
+ }
+ else if(packet == MQTT_MSG_DISCONNECT) {
+ infof(data, "Got DISCONNECT\n");
+ *done = TRUE;
+ goto end;
+ }
+ else {
+ result = CURLE_WEIRD_SERVER_REPLY;
+ goto end;
+ }
+
+ /* -- switched state -- */
+ remlen = mq->remaining_length;
+ infof(data, "Remaining length: %zd bytes\n", remlen);
+ Curl_pgrsSetDownloadSize(data, remlen);
+ data->req.bytecount = 0;
+ data->req.size = remlen;
+ mq->npacket = remlen; /* get this many bytes */
+ /* FALLTHROUGH */
+ case MQTT_PUB_REMAIN: {
+ /* read rest of packet, but no more. Cap to buffer size */
+ struct SingleRequest *k = &data->req;
+ size_t rest = mq->npacket;
+ if(rest > (size_t)data->set.buffer_size)
+ rest = (size_t)data->set.buffer_size;
+ result = Curl_read(conn, sockfd, (char *)pkt, rest, &nread);
+ if(result) {
+ if(CURLE_AGAIN == result) {
+ infof(data, "EEEE AAAAGAIN\n");
+ }
+ goto end;
+ }
+ if(!nread) {
+ infof(data, "server disconnected\n");
+ result = CURLE_PARTIAL_FILE;
+ goto end;
+ }
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_DATA_IN, (char *)pkt, (size_t)nread);
+
+ mq->npacket -= nread;
+ k->bytecount += nread;
+ Curl_pgrsSetDownloadCounter(data, k->bytecount);
+
+ /* if QoS is set, message contains packet id */
+
+ result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)pkt, nread);
+ if(result)
+ goto end;
+
+ if(!mq->npacket)
+ /* no more PUBLISH payload, back to subscribe wait state */
+ mqstate(conn, MQTT_FIRST, MQTT_PUBWAIT);
+ break;
+ }
+ default:
+ DEBUGASSERT(NULL); /* illegal state */
+ result = CURLE_WEIRD_SERVER_REPLY;
+ goto end;
+ }
+ end:
+ return result;
+}
+
+static CURLcode mqtt_do(struct connectdata *conn, bool *done)
+{
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
+
+ *done = FALSE; /* unconditionally */
+
+ result = mqtt_connect(conn);
+ if(result) {
+ failf(data, "Error %d sending MQTT CONN request", result);
+ return result;
+ }
+ mqstate(conn, MQTT_FIRST, MQTT_CONNACK);
+ return CURLE_OK;
+}
+
+static CURLcode mqtt_doing(struct connectdata *conn, bool *done)
+{
+ CURLcode result = CURLE_OK;
+ struct mqtt_conn *mqtt = &conn->proto.mqtt;
+ struct Curl_easy *data = conn->data;
+ struct MQTT *mq = data->req.protop;
+ ssize_t nread;
+ curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
+ unsigned char *pkt = (unsigned char *)data->state.buffer;
+ unsigned char byte;
+
+ *done = FALSE;
+
+ if(mq->nsend) {
+ /* send the remainder of an outgoing packet */
+ char *ptr = mq->sendleftovers;
+ result = mqtt_send(conn, mq->sendleftovers, mq->nsend);
+ free(ptr);
+ if(result)
+ return result;
+ }
+
+ infof(data, "mqtt_doing: state [%d]\n", (int) mqtt->state);
+ switch(mqtt->state) {
+ case MQTT_FIRST:
+ /* Read the initial byte only */
+ result = Curl_read(conn, sockfd, (char *)&mq->firstbyte, 1, &nread);
+ if(result)
+ break;
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_IN, (char *)&mq->firstbyte, 1);
+ /* remember the first byte */
+ mq->npacket = 0;
+ mqstate(conn, MQTT_REMAINING_LENGTH, MQTT_NOSTATE);
+ /* FALLTHROUGH */
+ case MQTT_REMAINING_LENGTH:
+ do {
+ result = Curl_read(conn, sockfd, (char *)&byte, 1, &nread);
+ if(result)
+ break;
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_IN, (char *)&byte, 1);
+ pkt[mq->npacket++] = byte;
+ } while((byte & 0x80) && (mq->npacket < 4));
+ if(result)
+ break;
+ mq->remaining_length = mqtt_decode_len(&pkt[0], mq->npacket, NULL);
+ mq->npacket = 0;
+ if(mq->remaining_length) {
+ mqstate(conn, mqtt->nextstate, MQTT_NOSTATE);
+ break;
+ }
+ mqstate(conn, MQTT_FIRST, MQTT_FIRST);
+
+ if(mq->firstbyte == MQTT_MSG_DISCONNECT) {
+ infof(data, "Got DISCONNECT\n");
+ *done = TRUE;
+ }
+ break;
+ case MQTT_CONNACK:
+ result = mqtt_verify_connack(conn);
+ if(result)
+ break;
+
+ if(conn->data->state.httpreq == HTTPREQ_POST) {
+ result = mqtt_publish(conn);
+ if(!result) {
+ result = mqtt_disconnect(conn);
+ *done = TRUE;
+ }
+ mqtt->nextstate = MQTT_FIRST;
+ }
+ else {
+ result = mqtt_subscribe(conn);
+ if(!result) {
+ mqstate(conn, MQTT_FIRST, MQTT_SUBACK);
+ }
+ }
+ break;
+
+ case MQTT_SUBACK:
+ case MQTT_PUBWAIT:
+ case MQTT_PUB_REMAIN:
+ result = mqtt_read_publish(conn, done);
+ break;
+
+ default:
+ failf(conn->data, "State not handled yet");
+ *done = TRUE;
+ break;
+ }
+
+ if(result == CURLE_AGAIN)
+ result = CURLE_OK;
+ return result;
+}
+
+#endif /* CURL_DISABLE_MQTT */
diff --git a/lib/mqtt.h b/lib/mqtt.h
new file mode 100644
index 000000000..37c044135
--- /dev/null
+++ b/lib/mqtt.h
@@ -0,0 +1,59 @@
+#ifndef HEADER_CURL_MQTT_H
+#define HEADER_CURL_MQTT_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019 - 2020, Björn Stenberg, <bjorn@haxx.se>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#ifndef CURL_DISABLE_MQTT
+extern const struct Curl_handler Curl_handler_mqtt;
+#endif
+
+enum mqttstate {
+ MQTT_FIRST, /* 0 */
+ MQTT_REMAINING_LENGTH, /* 1 */
+ MQTT_CONNACK, /* 2 */
+ MQTT_SUBACK, /* 3 */
+ MQTT_SUBACK_COMING, /* 4 - the SUBACK remainder */
+ MQTT_PUBWAIT, /* 5 - wait for publish */
+ MQTT_PUB_REMAIN, /* 6 - wait for the remainder of the publish */
+
+ MQTT_NOSTATE /* 7 - never used an actual state */
+};
+
+struct mqtt_conn {
+ enum mqttstate state;
+ enum mqttstate nextstate; /* switch to this after remaining length is
+ done */
+ unsigned int packetid;
+};
+
+/* protocol-specific transfer-related data */
+struct MQTT {
+ char *sendleftovers;
+ size_t nsend; /* size of sendleftovers */
+
+ /* when receiving */
+ size_t npacket; /* byte counter */
+ unsigned char firstbyte;
+ size_t remaining_length;
+};
+
+#endif /* HEADER_CURL_MQTT_H */
diff --git a/lib/multi.c b/lib/multi.c
index 6dfe8842e..4cc7c5ae6 100755..100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,6 +46,8 @@
#include "connect.h"
#include "http_proxy.h"
#include "http2.h"
+#include "socketpair.h"
+#include "socks.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -77,7 +79,6 @@ static CURLMcode add_next_timeout(struct curltime now,
static CURLMcode multi_timeout(struct Curl_multi *multi,
long *timeout_ms);
static void process_pending_handles(struct Curl_multi *multi);
-static void detach_connnection(struct Curl_easy *data);
#ifdef DEBUGBUILD
static const char * const statename[]={
@@ -110,7 +111,7 @@ static void Curl_init_completed(struct Curl_easy *data)
/* Important: reset the conn pointer so that we don't point to memory
that could be freed anytime */
- detach_connnection(data);
+ Curl_detach_connnection(data);
Curl_expire_clear(data); /* stop all timers */
}
@@ -167,9 +168,11 @@ static void mstate(struct Curl_easy *data, CURLMstate state
}
#endif
- if(state == CURLM_STATE_COMPLETED)
+ if(state == CURLM_STATE_COMPLETED) {
/* changing to COMPLETED means there's one less easy handle 'alive' */
+ DEBUGASSERT(data->multi->num_alive > 0);
data->multi->num_alive--;
+ }
/* if this state has an init-function, run it */
if(finit[state])
@@ -187,7 +190,7 @@ static void mstate(struct Curl_easy *data, CURLMstate state
*/
struct Curl_sh_entry {
- struct curl_hash transfers; /* hash of transfers using this socket */
+ struct Curl_hash transfers; /* hash of transfers using this socket */
unsigned int action; /* what combined action READ/WRITE this socket waits
for */
void *socketp; /* settable by users with curl_multi_assign() */
@@ -201,7 +204,7 @@ struct Curl_sh_entry {
#define SH_WRITE 2
/* look up a given socket in the socket hash, skip invalid sockets */
-static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh,
+static struct Curl_sh_entry *sh_getentry(struct Curl_hash *sh,
curl_socket_t s)
{
if(s != CURL_SOCKET_BAD) {
@@ -235,7 +238,7 @@ static void trhash_dtor(void *nada)
/* make sure this socket is present in the hash for this handle */
-static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
+static struct Curl_sh_entry *sh_addentry(struct Curl_hash *sh,
curl_socket_t s)
{
struct Curl_sh_entry *there = sh_getentry(sh, s);
@@ -259,6 +262,7 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
/* make/add new hash entry */
if(!Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) {
+ Curl_hash_destroy(&check->transfers);
free(check);
return NULL; /* major failure */
}
@@ -269,7 +273,7 @@ static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
/* delete the given socket + handle from the hash */
static void sh_delentry(struct Curl_sh_entry *entry,
- struct curl_hash *sh, curl_socket_t s)
+ struct Curl_hash *sh, curl_socket_t s)
{
Curl_hash_destroy(&entry->transfers);
@@ -321,7 +325,7 @@ static size_t hash_fd(void *key, size_t key_length, size_t slots_num)
* per call."
*
*/
-static int sh_init(struct curl_hash *hash, int hashsize)
+static int sh_init(struct Curl_hash *hash, int hashsize)
{
return Curl_hash_init(hash, hashsize, hash_fd, fd_key_compare,
sh_freeentry);
@@ -367,6 +371,29 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
/* -1 means it not set by user, use the default value */
multi->maxconnects = -1;
+ multi->max_concurrent_streams = 100;
+ multi->ipv6_works = Curl_ipv6works(NULL);
+
+#ifdef USE_WINSOCK
+ multi->wsa_event = WSACreateEvent();
+ if(multi->wsa_event == WSA_INVALID_EVENT)
+ goto error;
+#else
+#ifdef ENABLE_WAKEUP
+ if(Curl_socketpair(AF_UNIX, SOCK_STREAM, 0, multi->wakeup_pair) < 0) {
+ multi->wakeup_pair[0] = CURL_SOCKET_BAD;
+ multi->wakeup_pair[1] = CURL_SOCKET_BAD;
+ }
+ else if(curlx_nonblock(multi->wakeup_pair[0], TRUE) < 0 ||
+ curlx_nonblock(multi->wakeup_pair[1], TRUE) < 0) {
+ sclose(multi->wakeup_pair[0]);
+ sclose(multi->wakeup_pair[1]);
+ multi->wakeup_pair[0] = CURL_SOCKET_BAD;
+ multi->wakeup_pair[1] = CURL_SOCKET_BAD;
+ }
+#endif
+#endif
+
return multi;
error:
@@ -434,6 +461,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
data->state.conn_cache = &data->share->conn_cache;
else
data->state.conn_cache = &multi->conn_cache;
+ data->state.lastconnect_id = -1;
#ifdef USE_LIBPSL
/* Do the same for PSL. */
@@ -486,6 +514,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
easy handle is added */
memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
+ CONNCACHE_LOCK(data);
/* The closure handle only ever has default timeouts set. To improve the
state somewhat we clone the timeouts from each added handle so that the
closure handle always has the same timeouts as the most recently added
@@ -495,6 +524,7 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
data->set.server_response_timeout;
data->state.conn_cache->closure_handle->set.no_signal =
data->set.no_signal;
+ CONNCACHE_UNLOCK(data);
Curl_update_timer(multi);
return CURLM_OK;
@@ -531,6 +561,8 @@ static CURLcode multi_done(struct Curl_easy *data,
/* Stop if multi_done() has already been called */
return CURLE_OK;
+ conn->data = data; /* ensure the connection uses this transfer now */
+
/* Stop the resolver and free its own resources (but not dns_entry yet). */
Curl_resolver_kill(conn);
@@ -567,15 +599,20 @@ static CURLcode multi_done(struct Curl_easy *data,
process_pending_handles(data->multi); /* connection / multiplex */
- detach_connnection(data);
+ CONNCACHE_LOCK(data);
+ Curl_detach_connnection(data);
if(CONN_INUSE(conn)) {
/* Stop if still used. */
+ /* conn->data must not remain pointing to this transfer since it is going
+ away! Find another to own it! */
+ conn->data = conn->easyq.head->ptr;
+ CONNCACHE_UNLOCK(data);
DEBUGF(infof(data, "Connection still in use %zu, "
"no more multi_done now!\n",
conn->easyq.size));
return CURLE_OK;
}
-
+ conn->data = NULL; /* the connection now has no owner */
data->state.done = TRUE; /* called just now! */
if(conn->dns_entry) {
@@ -588,7 +625,7 @@ static CURLcode multi_done(struct Curl_easy *data,
/* if the transfer was completed in a paused state there can be buffered
data left to free */
for(i = 0; i < data->state.tempcount; i++) {
- free(data->state.tempwrite[i].buf);
+ Curl_dyn_free(&data->state.tempwrite[i].b);
}
data->state.tempcount = 0;
@@ -618,7 +655,11 @@ static CURLcode multi_done(struct Curl_easy *data,
#endif
) || conn->bits.close
|| (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
- CURLcode res2 = Curl_disconnect(data, conn, premature);
+ CURLcode res2;
+ connclose(conn, "disconnecting");
+ Curl_conncache_remove_conn(data, conn, FALSE);
+ CONNCACHE_UNLOCK(data);
+ res2 = Curl_disconnect(data, conn, premature);
/* If we had an error already, make sure we return that one. But
if we got a new error, return that. */
@@ -627,36 +668,61 @@ static CURLcode multi_done(struct Curl_easy *data,
}
else {
char buffer[256];
+ const char *host =
+#ifndef CURL_DISABLE_PROXY
+ conn->bits.socksproxy ?
+ conn->socks_proxy.host.dispname :
+ conn->bits.httpproxy ? conn->http_proxy.host.dispname :
+#endif
+ conn->bits.conn_to_host ? conn->conn_to_host.dispname :
+ conn->host.dispname;
/* create string before returning the connection */
msnprintf(buffer, sizeof(buffer),
"Connection #%ld to host %s left intact",
- conn->connection_id,
- conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
- conn->bits.httpproxy ? conn->http_proxy.host.dispname :
- conn->bits.conn_to_host ? conn->conn_to_host.dispname :
- conn->host.dispname);
-
+ conn->connection_id, host);
/* the connection is no longer in use by this transfer */
- if(Curl_conncache_return_conn(conn)) {
+ CONNCACHE_UNLOCK(data);
+ if(Curl_conncache_return_conn(data, conn)) {
/* remember the most recently used connection */
- data->state.lastconnect = conn;
+ data->state.lastconnect_id = conn->connection_id;
infof(data, "%s\n", buffer);
}
else
- data->state.lastconnect = NULL;
+ data->state.lastconnect_id = -1;
}
+ Curl_safefree(data->state.buffer);
Curl_free_request_state(data);
return result;
}
+static int close_connect_only(struct connectdata *conn, void *param)
+{
+ struct Curl_easy *data = param;
+
+ if(data->state.lastconnect_id != conn->connection_id)
+ return 0;
+
+ if(conn->data != data)
+ return 1;
+ conn->data = NULL;
+
+ if(!conn->bits.connect_only)
+ return 1;
+
+ connclose(conn, "Removing connect-only easy handle");
+ conn->bits.connect_only = FALSE;
+
+ return 1;
+}
+
CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
struct Curl_easy *data)
{
struct Curl_easy *easy = data;
bool premature;
bool easy_owns_conn;
- struct curl_llist_element *e;
+ struct Curl_llist_element *e;
/* First, make some basic checks that the CURLM handle is a good handle */
if(!GOOD_MULTI_HANDLE(multi))
@@ -670,6 +736,10 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
if(!data->multi)
return CURLM_OK; /* it is already removed so let's say it is fine! */
+ /* Prevent users from trying to remove an easy handle from the wrong multi */
+ if(data->multi != multi)
+ return CURLM_BAD_EASY_HANDLE;
+
if(multi->in_callback)
return CURLM_RECURSIVE_API_CALL;
@@ -695,19 +765,14 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
easy_owns_conn = TRUE;
}
- /* The timer must be shut down before data->multi is set to NULL,
- else the timenode will remain in the splay tree after
- curl_easy_cleanup is called. */
- Curl_expire_clear(data);
-
if(data->conn) {
/* we must call multi_done() here (if we still own the connection) so that
we don't leave a half-baked one around */
if(easy_owns_conn) {
- /* multi_done() clears the conn->data field to lose the association
- between the easy handle and the connection
+ /* multi_done() clears the association between the easy handle and the
+ connection.
Note that this ignores the return code simply because there's
nothing really useful to do with it anyway! */
@@ -715,6 +780,11 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
}
}
+ /* The timer must be shut down before data->multi is set to NULL, else the
+ timenode will remain in the splay tree after curl_easy_cleanup is
+ called. Do it after multi_done() in case that sets another time! */
+ Curl_expire_clear(data);
+
if(data->connect_queue.ptr)
/* the handle was in the pending list waiting for an available connection,
so go ahead and remove it */
@@ -733,10 +803,6 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
multi_done() as that may actually call Curl_expire that uses this */
Curl_llist_destroy(&data->state.timeoutlist, NULL);
- /* as this was using a shared connection cache we clear the pointer to that
- since we're not part of that multi handle anymore */
- data->state.conn_cache = NULL;
-
/* change state without using multistate(), only to make singlesocket() do
what we want */
data->mstate = CURLM_STATE_COMPLETED;
@@ -744,9 +810,12 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
vanish with this handle */
/* Remove the association between the connection and the handle */
- if(data->conn) {
- data->conn->data = NULL;
- detach_connnection(data);
+ Curl_detach_connnection(data);
+
+ if(data->state.lastconnect_id != -1) {
+ /* Mark any connect-only connection for closure */
+ Curl_conncache_foreach(data, data->state.conn_cache,
+ data, &close_connect_only);
}
#ifdef USE_LIBPSL
@@ -755,6 +824,10 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
data->psl = NULL;
#endif
+ /* as this was using a shared connection cache we clear the pointer to that
+ since we're not part of that multi handle anymore */
+ data->state.conn_cache = NULL;
+
data->multi = NULL; /* clear the association to this multi handle */
/* make sure there's no pending message in the queue sent from this easy
@@ -796,9 +869,13 @@ bool Curl_multiplex_wanted(const struct Curl_multi *multi)
return (multi && (multi->multiplexing));
}
-/* This is the only function that should clear data->conn. This will
- occasionally be called with the pointer already cleared. */
-static void detach_connnection(struct Curl_easy *data)
+/*
+ * Curl_detach_connnection() removes the given transfer from the connection.
+ *
+ * This is the only function that should clear data->conn. This will
+ * occasionally be called with the data->conn pointer already cleared.
+ */
+void Curl_detach_connnection(struct Curl_easy *data)
{
struct connectdata *conn = data->conn;
if(conn)
@@ -806,7 +883,11 @@ static void detach_connnection(struct Curl_easy *data)
data->conn = NULL;
}
-/* This is the only function that should assign data->conn */
+/*
+ * Curl_attach_connnection() attaches this transfer to this connection.
+ *
+ * This is the only function that should assign data->conn
+ */
void Curl_attach_connnection(struct Curl_easy *data,
struct connectdata *conn)
{
@@ -825,9 +906,14 @@ static int waitconnect_getsock(struct connectdata *conn,
int rc = 0;
#ifdef USE_SSL
+#ifndef CURL_DISABLE_PROXY
if(CONNECT_FIRSTSOCKET_PROXY_SSL())
return Curl_ssl_getsock(conn, sock);
#endif
+#endif
+
+ if(SOCKS_STATE(conn->cnnct.state))
+ return Curl_SOCKS_getsock(conn, sock, FIRSTSOCKET);
for(i = 0; i<2; i++) {
if(conn->tempsock[i] != CURL_SOCKET_BAD) {
@@ -905,19 +991,6 @@ static int multi_getsock(struct Curl_easy *data,
switch(data->mstate) {
default:
-#if 0 /* switch back on these cases to get the compiler to check for all enums
- to be present */
- case CURLM_STATE_TOOFAST: /* returns 0, so will not select. */
- case CURLM_STATE_COMPLETED:
- case CURLM_STATE_MSGSENT:
- case CURLM_STATE_INIT:
- case CURLM_STATE_CONNECT:
- case CURLM_STATE_WAITDO:
- case CURLM_STATE_DONE:
- case CURLM_STATE_LAST:
- /* this will get called with CURLM_STATE_COMPLETED when a handle is
- removed */
-#endif
return 0;
case CURLM_STATE_WAITRESOLVE:
@@ -1005,7 +1078,8 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
unsigned int extra_nfds,
int timeout_ms,
int *ret,
- bool extrawait) /* when no socket, wait */
+ bool extrawait, /* when no socket, wait */
+ bool use_wakeup)
{
struct Curl_easy *data;
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
@@ -1013,11 +1087,17 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
unsigned int i;
unsigned int nfds = 0;
unsigned int curlfds;
- bool ufds_malloc = FALSE;
long timeout_internal;
int retcode = 0;
+#ifndef USE_WINSOCK
struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
struct pollfd *ufds = &a_few_on_stack[0];
+ bool ufds_malloc = FALSE;
+#else
+ struct pollfd pre_poll;
+ WSANETWORKEVENTS wsa_events;
+ DEBUGASSERT(multi->wsa_event != WSA_INVALID_EVENT);
+#endif
if(!GOOD_MULTI_HANDLE(multi))
return CURLM_BAD_HANDLE;
@@ -1025,6 +1105,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
if(multi->in_callback)
return CURLM_RECURSIVE_API_CALL;
+ if(timeout_ms < 0)
+ return CURLM_BAD_FUNCTION_ARGUMENT;
+
/* Count up how many fds we have from the multi handle */
data = multi->easyp;
while(data) {
@@ -1059,6 +1142,17 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
curlfds = nfds; /* number of internal file descriptors */
nfds += extra_nfds; /* add the externally provided ones */
+#ifdef ENABLE_WAKEUP
+#ifdef USE_WINSOCK
+ if(use_wakeup) {
+#else
+ if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+#endif
+ ++nfds;
+ }
+#endif
+
+#ifndef USE_WINSOCK
if(nfds > NUM_POLLS_ON_STACK) {
/* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
big, so at 2^29 sockets this value might wrap. When a process gets
@@ -1069,7 +1163,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
return CURLM_OUT_OF_MEMORY;
ufds_malloc = TRUE;
}
+
nfds = 0;
+#endif
/* only do the second loop if we found descriptors in the first stage run
above */
@@ -1080,24 +1176,42 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
while(data) {
bitmap = multi_getsock(data, sockbunch);
- for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
+ for(i = 0; i < MAX_SOCKSPEREASYHANDLE; i++) {
curl_socket_t s = CURL_SOCKET_BAD;
-
+#ifdef USE_WINSOCK
+ long mask = 0;
+#endif
if(bitmap & GETSOCK_READSOCK(i)) {
+#ifdef USE_WINSOCK
+ if(timeout_ms && SOCKET_READABLE(sockbunch[i], 0) > 0)
+ timeout_ms = 0;
+ mask |= FD_READ|FD_ACCEPT|FD_CLOSE;
+#else
ufds[nfds].fd = sockbunch[i];
ufds[nfds].events = POLLIN;
++nfds;
+#endif
s = sockbunch[i];
}
if(bitmap & GETSOCK_WRITESOCK(i)) {
+#ifdef USE_WINSOCK
+ if(timeout_ms && SOCKET_WRITABLE(sockbunch[i], 0) > 0)
+ timeout_ms = 0;
+ mask |= FD_WRITE|FD_CONNECT|FD_CLOSE;
+#else
ufds[nfds].fd = sockbunch[i];
ufds[nfds].events = POLLOUT;
++nfds;
+#endif
s = sockbunch[i];
}
if(s == CURL_SOCKET_BAD) {
break;
}
+#ifdef USE_WINSOCK
+ if(WSAEventSelect(s, multi->wsa_event, mask) != 0)
+ return CURLM_INTERNAL_ERROR;
+#endif
}
data = data->next; /* check next handle */
@@ -1106,6 +1220,37 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
/* Add external file descriptions from poll-like struct curl_waitfd */
for(i = 0; i < extra_nfds; i++) {
+#ifdef USE_WINSOCK
+ long mask = 0;
+ extra_fds[i].revents = 0;
+ pre_poll.fd = extra_fds[i].fd;
+ pre_poll.events = 0;
+ pre_poll.revents = 0;
+ if(extra_fds[i].events & CURL_WAIT_POLLIN) {
+ mask |= FD_READ|FD_ACCEPT|FD_CLOSE;
+ pre_poll.events |= POLLIN;
+ }
+ if(extra_fds[i].events & CURL_WAIT_POLLPRI) {
+ mask |= FD_OOB;
+ pre_poll.events |= POLLPRI;
+ }
+ if(extra_fds[i].events & CURL_WAIT_POLLOUT) {
+ mask |= FD_WRITE|FD_CONNECT|FD_CLOSE;
+ pre_poll.events |= POLLOUT;
+ }
+ if(Curl_poll(&pre_poll, 1, 0) > 0) {
+ if(pre_poll.revents & POLLIN)
+ extra_fds[i].revents |= CURL_WAIT_POLLIN;
+ if(pre_poll.revents & POLLPRI)
+ extra_fds[i].revents |= CURL_WAIT_POLLPRI;
+ if(pre_poll.revents & POLLOUT)
+ extra_fds[i].revents |= CURL_WAIT_POLLOUT;
+ if(extra_fds[i].revents)
+ timeout_ms = 0;
+ }
+ if(WSAEventSelect(extra_fds[i].fd, multi->wsa_event, mask) != 0)
+ return CURLM_INTERNAL_ERROR;
+#else
ufds[nfds].fd = extra_fds[i].fd;
ufds[nfds].events = 0;
if(extra_fds[i].events & CURL_WAIT_POLLIN)
@@ -1115,20 +1260,57 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
if(extra_fds[i].events & CURL_WAIT_POLLOUT)
ufds[nfds].events |= POLLOUT;
++nfds;
+#endif
}
+#ifdef ENABLE_WAKEUP
+#ifndef USE_WINSOCK
+ if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+ ufds[nfds].fd = multi->wakeup_pair[0];
+ ufds[nfds].events = POLLIN;
+ ++nfds;
+ }
+#endif
+#endif
+
if(nfds) {
- int pollrc;
/* wait... */
- pollrc = Curl_poll(ufds, nfds, timeout_ms);
+#ifdef USE_WINSOCK
+ WSAWaitForMultipleEvents(1, &multi->wsa_event, FALSE, timeout_ms, FALSE);
+#else
+ int pollrc = Curl_poll(ufds, nfds, timeout_ms);
+#endif
+#ifdef USE_WINSOCK
+ /* With Winsock, we have to run this unconditionally to call
+ WSAEventSelect(fd, event, 0) on all the sockets */
+ {
+ retcode = 0;
+#else
if(pollrc > 0) {
retcode = pollrc;
+#endif
/* copy revents results from the poll to the curl_multi_wait poll
struct, the bit values of the actual underlying poll() implementation
may not be the same as the ones in the public libcurl API! */
for(i = 0; i < extra_nfds; i++) {
unsigned short mask = 0;
+#ifdef USE_WINSOCK
+ wsa_events.lNetworkEvents = 0;
+ mask = extra_fds[i].revents;
+ if(WSAEnumNetworkEvents(extra_fds[i].fd, multi->wsa_event,
+ &wsa_events) == 0) {
+ if(wsa_events.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE))
+ mask |= CURL_WAIT_POLLIN;
+ if(wsa_events.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE))
+ mask |= CURL_WAIT_POLLOUT;
+ if(wsa_events.lNetworkEvents & FD_OOB)
+ mask |= CURL_WAIT_POLLPRI;
+ if(ret && wsa_events.lNetworkEvents != 0)
+ retcode++;
+ }
+ WSAEventSelect(extra_fds[i].fd, multi->wsa_event, 0);
+#else
unsigned r = ufds[curlfds + i].revents;
if(r & POLLIN)
@@ -1137,17 +1319,79 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
mask |= CURL_WAIT_POLLOUT;
if(r & POLLPRI)
mask |= CURL_WAIT_POLLPRI;
-
+#endif
extra_fds[i].revents = mask;
}
+
+#ifdef USE_WINSOCK
+ /* Count up all our own sockets that had activity,
+ and remove them from the event. */
+ if(curlfds) {
+ data = multi->easyp;
+ while(data) {
+ bitmap = multi_getsock(data, sockbunch);
+
+ for(i = 0; i < MAX_SOCKSPEREASYHANDLE; i++) {
+ if(bitmap & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i))) {
+ wsa_events.lNetworkEvents = 0;
+ if(WSAEnumNetworkEvents(sockbunch[i], multi->wsa_event,
+ &wsa_events) == 0) {
+ if(ret && wsa_events.lNetworkEvents != 0)
+ retcode++;
+ }
+ if(ret && !timeout_ms && wsa_events.lNetworkEvents == 0) {
+ if((bitmap & GETSOCK_READSOCK(i)) &&
+ SOCKET_READABLE(sockbunch[i], 0) > 0)
+ retcode++;
+ else if((bitmap & GETSOCK_WRITESOCK(i)) &&
+ SOCKET_WRITABLE(sockbunch[i], 0) > 0)
+ retcode++;
+ }
+ WSAEventSelect(sockbunch[i], multi->wsa_event, 0);
+ }
+ else
+ break;
+ }
+
+ data = data->next;
+ }
+ }
+
+ WSAResetEvent(multi->wsa_event);
+#else
+#ifdef ENABLE_WAKEUP
+ if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+ if(ufds[curlfds + extra_nfds].revents & POLLIN) {
+ char buf[64];
+ ssize_t nread;
+ while(1) {
+ /* the reading socket is non-blocking, try to read
+ data from it until it receives an error (except EINTR).
+ In normal cases it will get EAGAIN or EWOULDBLOCK
+ when there is no more data, breaking the loop. */
+ nread = sread(multi->wakeup_pair[0], buf, sizeof(buf));
+ if(nread <= 0) {
+ if(nread < 0 && EINTR == SOCKERRNO)
+ continue;
+ break;
+ }
+ }
+ /* do not count the wakeup socket into the returned value */
+ retcode--;
+ }
+ }
+#endif
+#endif
}
}
+#ifndef USE_WINSOCK
if(ufds_malloc)
free(ufds);
+#endif
if(ret)
*ret = retcode;
- if(!extrawait || extra_fds || curlfds)
+ if(!extrawait || nfds)
/* if any socket was checked */
;
else {
@@ -1157,7 +1401,11 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
if(!curl_multi_timeout(multi, &sleep_ms) && sleep_ms) {
if(sleep_ms > timeout_ms)
sleep_ms = timeout_ms;
- Curl_wait_ms((int)sleep_ms);
+ /* when there are no easy handles in the multi, this holds a -1
+ timeout */
+ else if(sleep_ms < 0)
+ sleep_ms = timeout_ms;
+ Curl_wait_ms(sleep_ms);
}
}
@@ -1170,7 +1418,8 @@ CURLMcode curl_multi_wait(struct Curl_multi *multi,
int timeout_ms,
int *ret)
{
- return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, FALSE);
+ return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, FALSE,
+ FALSE);
}
CURLMcode curl_multi_poll(struct Curl_multi *multi,
@@ -1179,7 +1428,60 @@ CURLMcode curl_multi_poll(struct Curl_multi *multi,
int timeout_ms,
int *ret)
{
- return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, TRUE);
+ return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, TRUE,
+ TRUE);
+}
+
+CURLMcode curl_multi_wakeup(struct Curl_multi *multi)
+{
+ /* this function is usually called from another thread,
+ it has to be careful only to access parts of the
+ Curl_multi struct that are constant */
+
+ /* GOOD_MULTI_HANDLE can be safely called */
+ if(!GOOD_MULTI_HANDLE(multi))
+ return CURLM_BAD_HANDLE;
+
+#ifdef ENABLE_WAKEUP
+#ifdef USE_WINSOCK
+ if(WSASetEvent(multi->wsa_event))
+ return CURLM_OK;
+#else
+ /* the wakeup_pair variable is only written during init and cleanup,
+ making it safe to access from another thread after the init part
+ and before cleanup */
+ if(multi->wakeup_pair[1] != CURL_SOCKET_BAD) {
+ char buf[1];
+ buf[0] = 1;
+ while(1) {
+ /* swrite() is not thread-safe in general, because concurrent calls
+ can have their messages interleaved, but in this case the content
+ of the messages does not matter, which makes it ok to call.
+
+ The write socket is set to non-blocking, this way this function
+ cannot block, making it safe to call even from the same thread
+ that will call Curl_multi_wait(). If swrite() returns that it
+ would block, it's considered successful because it means that
+ previous calls to this function will wake up the poll(). */
+ if(swrite(multi->wakeup_pair[1], buf, sizeof(buf)) < 0) {
+ int err = SOCKERRNO;
+ int return_success;
+#ifdef USE_WINSOCK
+ return_success = WSAEWOULDBLOCK == err;
+#else
+ if(EINTR == err)
+ continue;
+ return_success = EWOULDBLOCK == err || EAGAIN == err;
+#endif
+ if(!return_success)
+ return CURLM_WAKEUP_FAILURE;
+ }
+ return CURLM_OK;
+ }
+ }
+#endif
+#endif
+ return CURLM_WAKEUP_FAILURE;
}
/*
@@ -1242,6 +1544,7 @@ static CURLcode multi_do(struct Curl_easy *data, bool *done)
DEBUGASSERT(conn);
DEBUGASSERT(conn->handler);
+ DEBUGASSERT(conn->data == data);
if(conn->handler->do_it) {
/* generic protocol-specific function pointer set in curl_connect() */
@@ -1348,7 +1651,7 @@ static CURLcode protocol_connect(struct connectdata *conn,
}
if(!conn->bits.protoconnstart) {
-
+#ifndef CURL_DISABLE_PROXY
result = Curl_proxy_connect(conn, FIRSTSOCKET);
if(result)
return result;
@@ -1362,7 +1665,7 @@ static CURLcode protocol_connect(struct connectdata *conn,
/* when using an HTTP tunnel proxy, await complete tunnel establishment
before proceeding further. Return CURLE_OK so we'll be called again */
return CURLE_OK;
-
+#endif
if(conn->handler->connect_it) {
/* is there a protocol-specific connect() procedure? */
@@ -1381,9 +1684,24 @@ static CURLcode protocol_connect(struct connectdata *conn,
return result; /* pass back status */
}
+/*
+ * Curl_preconnect() is called immediately before a connect starts. When a
+ * redirect is followed, this is then called multiple times during a single
+ * transfer.
+ */
+CURLcode Curl_preconnect(struct Curl_easy *data)
+{
+ if(!data->state.buffer) {
+ data->state.buffer = malloc(data->set.buffer_size + 1);
+ if(!data->state.buffer)
+ return CURLE_OUT_OF_MEMORY;
+ }
+ return CURLE_OK;
+}
+
static CURLMcode multi_runsingle(struct Curl_multi *multi,
- struct curltime now,
+ struct curltime *nowp,
struct Curl_easy *data)
{
struct Curl_message *msg = NULL;
@@ -1408,19 +1726,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
bool stream_error = FALSE;
rc = CURLM_OK;
- DEBUGASSERT((data->mstate <= CURLM_STATE_CONNECT) ||
- (data->mstate >= CURLM_STATE_DONE) ||
- data->conn);
- if(!data->conn &&
- data->mstate > CURLM_STATE_CONNECT &&
- data->mstate < CURLM_STATE_DONE) {
- /* In all these states, the code will blindly access 'data->conn'
- so this is precaution that it isn't NULL. And it silences static
- analyzers. */
- failf(data, "In state %d with no conn, bail out!\n", data->mstate);
- return CURLM_INTERNAL_ERROR;
- }
-
if(multi_ischanged(multi, TRUE)) {
DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n"));
process_pending_handles(multi); /* multiplexed */
@@ -1437,7 +1742,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
(data->mstate < CURLM_STATE_COMPLETED)) {
/* we need to wait for the connect state as only then is the start time
stored, but we must not check already completed handles */
- timeout_ms = Curl_timeleft(data, &now,
+ timeout_ms = Curl_timeleft(data, nowp,
(data->mstate <= CURLM_STATE_DO)?
TRUE:FALSE);
@@ -1446,25 +1751,25 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(data->mstate == CURLM_STATE_WAITRESOLVE)
failf(data, "Resolving timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds",
- Curl_timediff(now, data->progress.t_startsingle));
+ Curl_timediff(*nowp, data->progress.t_startsingle));
else if(data->mstate == CURLM_STATE_WAITCONNECT)
failf(data, "Connection timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds",
- Curl_timediff(now, data->progress.t_startsingle));
+ Curl_timediff(*nowp, data->progress.t_startsingle));
else {
struct SingleRequest *k = &data->req;
if(k->size != -1) {
failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds with %" CURL_FORMAT_CURL_OFF_T " out of %"
CURL_FORMAT_CURL_OFF_T " bytes received",
- Curl_timediff(now, data->progress.t_startsingle),
+ Curl_timediff(*nowp, data->progress.t_startsingle),
k->bytecount, k->size);
}
else {
failf(data, "Operation timed out after %" CURL_FORMAT_TIMEDIFF_T
" milliseconds with %" CURL_FORMAT_CURL_OFF_T
" bytes received",
- Curl_timediff(now, data->progress.t_startsingle),
+ Curl_timediff(*nowp, data->progress.t_startsingle),
k->bytecount);
}
}
@@ -1489,7 +1794,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(!result) {
/* after init, go CONNECT */
multistate(data, CURLM_STATE_CONNECT);
- Curl_pgrsTime(data, TIMER_STARTOP);
+ *nowp = Curl_pgrsTime(data, TIMER_STARTOP);
rc = CURLM_CALL_MULTI_PERFORM;
}
break;
@@ -1501,7 +1806,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_CONNECT:
/* Connect. We want to get a connection identifier filled in. */
- Curl_pgrsTime(data, TIMER_STARTSINGLE);
+ /* init this transfer. */
+ result = Curl_preconnect(data);
+ if(result)
+ break;
+
+ *nowp = Curl_pgrsTime(data, TIMER_STARTSINGLE);
if(data->set.timeout)
Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);
@@ -1558,9 +1868,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
const char *hostname;
DEBUGASSERT(conn);
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.httpproxy)
hostname = conn->http_proxy.host.name;
- else if(conn->bits.conn_to_host)
+ else
+#endif
+ if(conn->bits.conn_to_host)
hostname = conn->conn_to_host.name;
else
hostname = conn->host.name;
@@ -1626,7 +1939,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
DEBUGASSERT(data->conn);
result = Curl_http_connect(data->conn, &protocol_connected);
-
+#ifndef CURL_DISABLE_PROXY
if(data->conn->bits.proxy_connect_closed) {
rc = CURLM_CALL_MULTI_PERFORM;
/* connect back to proxy again */
@@ -1634,16 +1947,21 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
multi_done(data, CURLE_OK, FALSE);
multistate(data, CURLM_STATE_CONNECT);
}
- else if(!result) {
- if((data->conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
- data->conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
- Curl_connect_complete(data->conn)) {
- rc = CURLM_CALL_MULTI_PERFORM;
- /* initiate protocol connect phase */
- multistate(data, CURLM_STATE_SENDPROTOCONNECT);
+ else
+#endif
+ if(!result) {
+ if(
+#ifndef CURL_DISABLE_PROXY
+ (data->conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
+ data->conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
+#endif
+ Curl_connect_complete(data->conn)) {
+ rc = CURLM_CALL_MULTI_PERFORM;
+ /* initiate protocol connect phase */
+ multistate(data, CURLM_STATE_SENDPROTOCONNECT);
+ }
}
- }
- else if(result)
+ else
stream_error = TRUE;
break;
#endif
@@ -1654,17 +1972,25 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
result = Curl_is_connected(data->conn, FIRSTSOCKET, &connected);
if(connected && !result) {
#ifndef CURL_DISABLE_HTTP
- if((data->conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
- !data->conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
- Curl_connect_ongoing(data->conn)) {
+ if(
+#ifndef CURL_DISABLE_PROXY
+ (data->conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
+ !data->conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
+#endif
+ Curl_connect_ongoing(data->conn)) {
multistate(data, CURLM_STATE_WAITPROXYCONNECT);
break;
}
#endif
rc = CURLM_CALL_MULTI_PERFORM;
- multistate(data, data->conn->bits.tunnel_proxy?
+#ifndef CURL_DISABLE_PROXY
+ multistate(data,
+ data->conn->bits.tunnel_proxy?
CURLM_STATE_WAITPROXYCONNECT:
CURLM_STATE_SENDPROTOCONNECT);
+#else
+ multistate(data, CURLM_STATE_SENDPROTOCONNECT);
+#endif
}
else if(result) {
/* failure detected */
@@ -1685,7 +2011,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
multistate(data, CURLM_STATE_DO);
rc = CURLM_CALL_MULTI_PERFORM;
}
- else if(result) {
+ else {
/* failure detected */
Curl_posttransfer(data);
multi_done(data, result, TRUE);
@@ -1893,7 +2219,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
if(Curl_pgrsUpdate(data->conn))
result = CURLE_ABORTED_BY_CALLBACK;
else
- result = Curl_speedcheck(data, now);
+ result = Curl_speedcheck(data, *nowp);
if(!result) {
send_timeout_ms = 0;
@@ -1903,7 +2229,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.ul_limit_size,
data->set.max_send_speed,
data->progress.ul_limit_start,
- now);
+ *nowp);
recv_timeout_ms = 0;
if(data->set.max_recv_speed > 0)
@@ -1912,11 +2238,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.dl_limit_size,
data->set.max_recv_speed,
data->progress.dl_limit_start,
- now);
+ *nowp);
if(!send_timeout_ms && !recv_timeout_ms) {
multistate(data, CURLM_STATE_PERFORM);
- Curl_ratelimit(data, now);
+ Curl_ratelimit(data, *nowp);
}
else if(send_timeout_ms >= recv_timeout_ms)
Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
@@ -1930,7 +2256,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
char *newurl = NULL;
bool retry = FALSE;
bool comeback = FALSE;
-
+ DEBUGASSERT(data->state.buffer);
/* check if over send speed */
send_timeout_ms = 0;
if(data->set.max_send_speed > 0)
@@ -1938,7 +2264,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.ul_limit_size,
data->set.max_send_speed,
data->progress.ul_limit_start,
- now);
+ *nowp);
/* check if over recv speed */
recv_timeout_ms = 0;
@@ -1947,10 +2273,10 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
data->progress.dl_limit_size,
data->set.max_recv_speed,
data->progress.dl_limit_start,
- now);
+ *nowp);
if(send_timeout_ms || recv_timeout_ms) {
- Curl_ratelimit(data, now);
+ Curl_ratelimit(data, *nowp);
multistate(data, CURLM_STATE_TOOFAST);
if(send_timeout_ms >= recv_timeout_ms)
Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
@@ -2069,8 +2395,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
}
}
- else if(comeback)
- rc = CURLM_CALL_MULTI_PERFORM;
+ else if(comeback) {
+ /* This avoids CURLM_CALL_MULTI_PERFORM so that a very fast transfer
+ won't get stuck on this transfer at the expense of other concurrent
+ transfers */
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+ rc = CURLM_OK;
+ }
break;
}
@@ -2098,8 +2429,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
* access free'd data, if the connection is free'd and the handle
* removed before we perform the processing in CURLM_STATE_COMPLETED
*/
- if(data->conn)
- detach_connnection(data);
+ Curl_detach_connnection(data);
}
#ifndef CURL_DISABLE_FTP
@@ -2151,7 +2481,10 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
/* This is where we make sure that the conn pointer is reset.
We don't have to do this in every case block above where a
failure is detected */
- detach_connnection(data);
+ Curl_detach_connnection(data);
+
+ /* remove connection from cache */
+ Curl_conncache_remove_conn(data, conn, TRUE);
/* disconnect properly */
Curl_disconnect(data, conn, dead_connection);
@@ -2223,7 +2556,7 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
SIGPIPE_VARIABLE(pipe_st);
sigpipe_ignore(data, &pipe_st);
- result = multi_runsingle(multi, now, data);
+ result = multi_runsingle(multi, &now, data);
sigpipe_restore(&pipe_st);
if(result)
@@ -2305,6 +2638,15 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
Curl_hash_destroy(&multi->hostcache);
Curl_psl_destroy(&multi->psl);
+
+#ifdef USE_WINSOCK
+ WSACloseEvent(multi->wsa_event);
+#else
+#ifdef ENABLE_WAKEUP
+ sclose(multi->wakeup_pair[0]);
+ sclose(multi->wakeup_pair[1]);
+#endif
+#endif
free(multi);
return CURLM_OK;
@@ -2332,7 +2674,7 @@ CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue)
!multi->in_callback &&
Curl_llist_count(&multi->msglist)) {
/* there is one or more messages in the list */
- struct curl_llist_element *e;
+ struct Curl_llist_element *e;
/* extract the head of the list to return */
e = multi->msglist.head;
@@ -2562,15 +2904,15 @@ static CURLMcode add_next_timeout(struct curltime now,
struct Curl_easy *d)
{
struct curltime *tv = &d->state.expiretime;
- struct curl_llist *list = &d->state.timeoutlist;
- struct curl_llist_element *e;
+ struct Curl_llist *list = &d->state.timeoutlist;
+ struct Curl_llist_element *e;
struct time_node *node = NULL;
/* move over the timeout list for this specific handle and remove all
timeouts that are now passed tense and store the next pending
timeout in *tv */
for(e = list->head; e;) {
- struct curl_llist_element *n = e->next;
+ struct Curl_llist_element *n = e->next;
timediff_t diff;
node = (struct time_node *)e->ptr;
diff = Curl_timediff(node->time, now);
@@ -2640,8 +2982,8 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
and just move on. */
;
else {
- struct curl_hash_iterator iter;
- struct curl_hash_element *he;
+ struct Curl_hash_iterator iter;
+ struct Curl_hash_element *he;
/* the socket can be shared by many transfers, iterate */
Curl_hash_start_iterate(&entry->transfers, &iter);
@@ -2688,7 +3030,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
SIGPIPE_VARIABLE(pipe_st);
sigpipe_ignore(data, &pipe_st);
- result = multi_runsingle(multi, now, data);
+ result = multi_runsingle(multi, &now, data);
sigpipe_restore(&pipe_st);
if(CURLM_OK >= result) {
@@ -2777,9 +3119,7 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi,
long streams = va_arg(param, long);
if(streams < 1)
streams = 100;
- multi->max_concurrent_streams =
- (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)?
- (long)INITIAL_MAX_CONCURRENT_STREAMS : streams;
+ multi->max_concurrent_streams = curlx_sltoui(streams);
}
break;
default:
@@ -2926,8 +3266,8 @@ void Curl_update_timer(struct Curl_multi *multi)
static void
multi_deltimeout(struct Curl_easy *data, expire_id eid)
{
- struct curl_llist_element *e;
- struct curl_llist *timeoutlist = &data->state.timeoutlist;
+ struct Curl_llist_element *e;
+ struct Curl_llist *timeoutlist = &data->state.timeoutlist;
/* find and remove the specific node from the list */
for(e = timeoutlist->head; e; e = e->next) {
struct time_node *n = (struct time_node *)e->ptr;
@@ -2950,11 +3290,11 @@ multi_addtimeout(struct Curl_easy *data,
struct curltime *stamp,
expire_id eid)
{
- struct curl_llist_element *e;
+ struct Curl_llist_element *e;
struct time_node *node;
- struct curl_llist_element *prev = NULL;
+ struct Curl_llist_element *prev = NULL;
size_t n;
- struct curl_llist *timeoutlist = &data->state.timeoutlist;
+ struct Curl_llist *timeoutlist = &data->state.timeoutlist;
node = &data->state.expires[eid];
@@ -3081,7 +3421,7 @@ void Curl_expire_clear(struct Curl_easy *data)
if(nowp->tv_sec || nowp->tv_usec) {
/* Since this is an cleared time, we must remove the previous entry from
the splay tree */
- struct curl_llist *list = &data->state.timeoutlist;
+ struct Curl_llist *list = &data->state.timeoutlist;
int rc;
rc = Curl_splayremovebyaddr(multi->timetree,
@@ -3152,7 +3492,7 @@ void Curl_multiuse_state(struct connectdata *conn,
static void process_pending_handles(struct Curl_multi *multi)
{
- struct curl_llist_element *e = multi->pending.head;
+ struct Curl_llist_element *e = multi->pending.head;
if(e) {
struct Curl_easy *data = e->ptr;
@@ -3221,8 +3561,8 @@ void Curl_multi_dump(struct Curl_multi *multi)
}
#endif
-size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi)
+unsigned int Curl_multi_max_concurrent_streams(struct Curl_multi *multi)
{
- return multi ? ((size_t)multi->max_concurrent_streams ?
- (size_t)multi->max_concurrent_streams : 100) : 0;
+ DEBUGASSERT(multi);
+ return multi->max_concurrent_streams;
}
diff --git a/lib/multihandle.h b/lib/multihandle.h
index b65bd9638..c70a1ce09 100644
--- a/lib/multihandle.h
+++ b/lib/multihandle.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,9 +24,10 @@
#include "conncache.h"
#include "psl.h"
+#include "socketpair.h"
struct Curl_message {
- struct curl_llist_element list;
+ struct Curl_llist_element list;
/* the 'CURLMsg' is the part that is visible to the external user */
struct CURLMsg extmsg;
};
@@ -66,13 +67,21 @@ typedef enum {
#define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
+#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS) && \
+ !defined(CURL_DISABLE_SOCKETPAIR)
+#define ENABLE_WAKEUP
+#endif
+
+/* value for MAXIMUM CONCURRENT STREAMS upper limit */
+#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1)
+
/* This is the struct known as CURLM on the outside */
struct Curl_multi {
/* First a simple identifier to easier detect if a user mix up
this multi handle with an easy handle. Set this to CURL_MULTI_HANDLE. */
long type;
- /* We have a doubly-linked circular list with easy handles */
+ /* We have a doubly-linked list with easy handles */
struct Curl_easy *easyp;
struct Curl_easy *easylp; /* last node */
@@ -80,9 +89,9 @@ struct Curl_multi {
int num_alive; /* amount of easy handles that are added but have not yet
reached COMPLETE state */
- struct curl_llist msglist; /* a list of messages from completed transfers */
+ struct Curl_llist msglist; /* a list of messages from completed transfers */
- struct curl_llist pending; /* Curl_easys that are in the
+ struct Curl_llist pending; /* Curl_easys that are in the
CURLM_STATE_CONNECT_PEND state */
/* callback function and user data pointer for the *socket() API */
@@ -94,7 +103,7 @@ struct Curl_multi {
void *push_userp;
/* Hostname cache */
- struct curl_hash hostcache;
+ struct Curl_hash hostcache;
#ifdef USE_LIBPSL
/* PSL cache. */
@@ -108,12 +117,7 @@ struct Curl_multi {
/* 'sockhash' is the lookup hash for socket descriptor => easy handles (note
the pluralis form, there can be more than one easy handle waiting on the
same actual socket) */
- struct curl_hash sockhash;
-
- /* multiplexing wanted */
- bool multiplexing;
-
- bool recheckstate; /* see Curl_multi_connchanged */
+ struct Curl_hash sockhash;
/* Shared connection cache (bundles)*/
struct conncache conn_cache;
@@ -132,8 +136,21 @@ struct Curl_multi {
void *timer_userp;
struct curltime timer_lastcall; /* the fixed time for the timeout for the
previous callback */
+ unsigned int max_concurrent_streams;
+
+#ifdef USE_WINSOCK
+ WSAEVENT wsa_event; /* winsock event used for waits */
+#else
+#ifdef ENABLE_WAKEUP
+ curl_socket_t wakeup_pair[2]; /* socketpair() used for wakeup
+ 0 is used for read, 1 is used for write */
+#endif
+#endif
+ /* multiplexing wanted */
+ bool multiplexing;
+ bool recheckstate; /* see Curl_multi_connchanged */
bool in_callback; /* true while executing a callback */
- long max_concurrent_streams; /* max concurrent streams client to support */
+ bool ipv6_works;
};
#endif /* HEADER_CURL_MULTIHANDLE_H */
diff --git a/lib/multiif.h b/lib/multiif.h
index 75025232c..7d574df92 100644
--- a/lib/multiif.h
+++ b/lib/multiif.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -33,9 +33,11 @@ void Curl_expire_done(struct Curl_easy *data, expire_id id);
void Curl_update_timer(struct Curl_multi *multi);
void Curl_attach_connnection(struct Curl_easy *data,
struct connectdata *conn);
+void Curl_detach_connnection(struct Curl_easy *data);
bool Curl_multiplex_wanted(const struct Curl_multi *multi);
void Curl_set_in_callback(struct Curl_easy *data, bool value);
bool Curl_is_in_callback(struct Curl_easy *easy);
+CURLcode Curl_preconnect(struct Curl_easy *data);
/* Internal version of curl_multi_init() accepts size parameters for the
socket and connection hashes */
@@ -90,9 +92,7 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
struct connectdata *conn);
-/* Return the value of the CURLMOPT_MAX_CONCURRENT_STREAMS option
- * If not specified or 0, default would be 100
- */
-size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi);
+/* Return the value of the CURLMOPT_MAX_CONCURRENT_STREAMS option */
+unsigned int Curl_multi_max_concurrent_streams(struct Curl_multi *multi);
#endif /* HEADER_CURL_MULTIIF_H */
diff --git a/lib/nonblock.c b/lib/nonblock.c
index 4d105c1fe..abeb6598c 100644
--- a/lib/nonblock.c
+++ b/lib/nonblock.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/nonblock.h b/lib/nonblock.h
index eb18ea1c3..d50d31594 100644
--- a/lib/nonblock.h
+++ b/lib/nonblock.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/nwlib.c b/lib/nwlib.c
index 7bf5f51c3..beec0b388 100644
--- a/lib/nwlib.c
+++ b/lib/nwlib.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,21 +36,19 @@
/* The last #include file should be: */
#include "memdebug.h"
-typedef struct
-{
+struct libthreaddata {
int _errno;
void *twentybytes;
-} libthreaddata_t;
+};
-typedef struct
-{
+struct libdata {
int x;
int y;
int z;
void *tenbytes;
NXKey_t perthreadkey; /* if -1, no key obtained... */
NXMutex_t *lock;
-} libdata_t;
+};
int gLibId = -1;
void *gLibHandle = (void *) NULL;
@@ -60,7 +58,8 @@ NXMutex_t *gLibLock = (NXMutex_t *) NULL;
/* internal library function prototypes... */
int DisposeLibraryData(void *);
void DisposeThreadData(void *);
-int GetOrSetUpData(int id, libdata_t **data, libthreaddata_t **threaddata);
+int GetOrSetUpData(int id, struct libdata **data,
+ struct libthreaddata **threaddata);
int _NonAppStart(void *NLMHandle,
@@ -154,24 +153,24 @@ int _NonAppCheckUnload(void)
return 0;
}
-int GetOrSetUpData(int id, libdata_t **appData,
- libthreaddata_t **threadData)
+int GetOrSetUpData(int id, struct libdata **appData,
+ struct libthreaddata **threadData)
{
int err;
- libdata_t *app_data;
- libthreaddata_t *thread_data;
+ struct libdata *app_data;
+ struct libthreaddata *thread_data;
NXKey_t key;
NX_LOCK_INFO_ALLOC(liblock, "Application Data Lock", 0);
err = 0;
- thread_data = (libthreaddata_t *) NULL;
+ thread_data = (struct libthreaddata_t *) NULL;
/*
* Attempt to get our data for the application calling us. This is where we
* store whatever application-specific information we need to carry in
* support of calling applications.
*/
- app_data = (libdata_t *) get_app_data(id);
+ app_data = (struct libdata *) get_app_data(id);
if(!app_data) {
/*
@@ -184,9 +183,9 @@ int GetOrSetUpData(int id, libdata_t **appData,
*/
NXLock(gLibLock);
- app_data = (libdata_t *) get_app_data(id);
+ app_data = (struct libdata *) get_app_data(id);
if(!app_data) {
- app_data = calloc(1, sizeof(libdata_t));
+ app_data = calloc(1, sizeof(struct libdata));
if(app_data) {
app_data->tenbytes = malloc(10);
@@ -249,7 +248,7 @@ int GetOrSetUpData(int id, libdata_t **appData,
* a pointer is not very important, this just helps to demonstrate that
* we can have arbitrarily complex per-thread data.
*/
- thread_data = malloc(sizeof(libthreaddata_t));
+ thread_data = malloc(sizeof(struct libthreaddata));
if(thread_data) {
thread_data->_errno = 0;
@@ -257,7 +256,7 @@ int GetOrSetUpData(int id, libdata_t **appData,
if(!thread_data->twentybytes) {
free(thread_data);
- thread_data = (libthreaddata_t *) NULL;
+ thread_data = (struct libthreaddata *) NULL;
err = ENOMEM;
}
@@ -265,7 +264,7 @@ int GetOrSetUpData(int id, libdata_t **appData,
if(err) {
free(thread_data->twentybytes);
free(thread_data);
- thread_data = (libthreaddata_t *) NULL;
+ thread_data = (struct libthreaddata *) NULL;
}
}
}
@@ -295,7 +294,7 @@ int DisposeLibraryData(void *data)
void DisposeThreadData(void *data)
{
if(data) {
- void *twentybytes = ((libthreaddata_t *) data)->twentybytes;
+ void *twentybytes = ((struct libthreaddata *) data)->twentybytes;
free(twentybytes);
free(data);
diff --git a/lib/openldap.c b/lib/openldap.c
index 734ca5fa0..2aff4f603 100644
--- a/lib/openldap.c
+++ b/lib/openldap.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010, Howard Chu, <hyc@openldap.org>
- * Copyright (C) 2011 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2011 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -107,6 +107,7 @@ const struct Curl_handler Curl_handler_ldap = {
ZERO_NULL, /* connection_check */
PORT_LDAP, /* defport */
CURLPROTO_LDAP, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_NONE /* flags */
};
@@ -132,7 +133,8 @@ const struct Curl_handler Curl_handler_ldaps = {
ZERO_NULL, /* readwrite */
ZERO_NULL, /* connection_check */
PORT_LDAPS, /* defport */
- CURLPROTO_LDAP, /* protocol */
+ CURLPROTO_LDAPS, /* protocol */
+ CURLPROTO_LDAP, /* family */
PROTOPT_SSL /* flags */
};
#endif
@@ -162,10 +164,10 @@ struct ldapconninfo {
bool didbind;
};
-typedef struct ldapreqinfo {
+struct ldapreqinfo {
int msgid;
int nument;
-} ldapreqinfo;
+};
static CURLcode ldap_setup_connection(struct connectdata *conn)
{
@@ -374,7 +376,7 @@ static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
static CURLcode ldap_do(struct connectdata *conn, bool *done)
{
struct ldapconninfo *li = conn->proto.ldapc;
- ldapreqinfo *lr;
+ struct ldapreqinfo *lr;
CURLcode status = CURLE_OK;
int rc = 0;
LDAPURLDesc *ludp = NULL;
@@ -406,7 +408,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)
failf(data, "LDAP local: ldap_search_ext %s", ldap_err2string(rc));
return CURLE_LDAP_SEARCH_FAILED;
}
- lr = calloc(1, sizeof(ldapreqinfo));
+ lr = calloc(1, sizeof(struct ldapreqinfo));
if(!lr)
return CURLE_OUT_OF_MEMORY;
lr->msgid = msgid;
@@ -419,7 +421,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)
static CURLcode ldap_done(struct connectdata *conn, CURLcode res,
bool premature)
{
- ldapreqinfo *lr = conn->data->req.protop;
+ struct ldapreqinfo *lr = conn->data->req.protop;
(void)res;
(void)premature;
@@ -443,7 +445,7 @@ static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
{
struct ldapconninfo *li = conn->proto.ldapc;
struct Curl_easy *data = conn->data;
- ldapreqinfo *lr = data->req.protop;
+ struct ldapreqinfo *lr = data->req.protop;
int rc, ret;
LDAPMessage *msg = NULL;
LDAPMessage *ent;
diff --git a/lib/parsedate.c b/lib/parsedate.c
index f4b18d091..dd6150b44 100644
--- a/lib/parsedate.c
+++ b/lib/parsedate.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -275,48 +275,21 @@ enum assume {
DATE_TIME
};
-/* this is a clone of 'struct tm' but with all fields we don't need or use
- cut out */
-struct my_tm {
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year; /* full year */
-};
-
-/* struct tm to time since epoch in GMT time zone.
- * This is similar to the standard mktime function but for GMT only, and
- * doesn't suffer from the various bugs and portability problems that
- * some systems' implementations have.
- *
- * Returns 0 on success, otherwise non-zero.
+/*
+ * time2epoch: time stamp to seconds since epoch in GMT time zone. Similar to
+ * mktime but for GMT only.
*/
-static void my_timegm(struct my_tm *tm, time_t *t)
+static time_t time2epoch(int sec, int min, int hour,
+ int mday, int mon, int year)
{
static const int month_days_cumulative [12] =
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
- int month, year, leap_days;
-
- year = tm->tm_year;
- month = tm->tm_mon;
- if(month < 0) {
- year += (11 - month) / 12;
- month = 11 - (11 - month) % 12;
- }
- else if(month >= 12) {
- year -= month / 12;
- month = month % 12;
- }
-
- leap_days = year - (tm->tm_mon <= 1);
+ int leap_days = year - (mon <= 1);
leap_days = ((leap_days / 4) - (leap_days / 100) + (leap_days / 400)
- (1969 / 4) + (1969 / 100) - (1969 / 400));
-
- *t = ((((time_t) (year - 1970) * 365
- + leap_days + month_days_cumulative[month] + tm->tm_mday - 1) * 24
- + tm->tm_hour) * 60 + tm->tm_min) * 60 + tm->tm_sec;
+ return ((((time_t) (year - 1970) * 365
+ + leap_days + month_days_cumulative[mon] + mday - 1) * 24
+ + hour) * 60 + min) * 60 + sec;
}
/*
@@ -341,7 +314,6 @@ static int parsedate(const char *date, time_t *output)
int secnum = -1;
int yearnum = -1;
int tzoff = -1;
- struct my_tm tm;
enum assume dignext = DATE_MDAY;
const char *indate = date; /* save the original pointer */
int part = 0; /* max 6 parts */
@@ -533,18 +505,11 @@ static int parsedate(const char *date, time_t *output)
(hournum > 23) || (minnum > 59) || (secnum > 60))
return PARSEDATE_FAIL; /* clearly an illegal date */
- tm.tm_sec = secnum;
- tm.tm_min = minnum;
- tm.tm_hour = hournum;
- tm.tm_mday = mdaynum;
- tm.tm_mon = monnum;
- tm.tm_year = yearnum;
-
- /* my_timegm() returns a time_t. time_t is often 32 bits, sometimes even on
+ /* time2epoch() returns a time_t. time_t is often 32 bits, sometimes even on
architectures that feature 64 bit 'long' but ultimately time_t is the
correct data type to use.
*/
- my_timegm(&tm, &t);
+ t = time2epoch(secnum, minnum, hournum, mdaynum, monnum, yearnum);
/* Add the time zone diff between local time zone and GMT. */
if(tzoff == -1)
@@ -587,6 +552,30 @@ time_t curl_getdate(const char *p, const time_t *now)
return -1;
}
+/* Curl_getdate_capped() differs from curl_getdate() in that this will return
+ TIME_T_MAX in case the parsed time value was too big, instead of an
+ error. */
+
+time_t Curl_getdate_capped(const char *p)
+{
+ time_t parsed = -1;
+ int rc = parsedate(p, &parsed);
+
+ switch(rc) {
+ case PARSEDATE_OK:
+ if(parsed == -1)
+ /* avoid returning -1 for a working scenario */
+ parsed++;
+ return parsed;
+ case PARSEDATE_LATER:
+ /* this returns the maximum time value */
+ return parsed;
+ default:
+ return -1; /* everything else is fail */
+ }
+ /* UNREACHABLE */
+}
+
/*
* Curl_gmtime() is a gmtime() replacement for portability. Do not use the
* gmtime_r() or gmtime() functions anywhere else but here.
@@ -600,6 +589,7 @@ CURLcode Curl_gmtime(time_t intime, struct tm *store)
/* thread-safe version */
tm = (struct tm *)gmtime_r(&intime, store);
#else
+ /* !checksrc! disable BANNEDFUNC 1 */
tm = gmtime(&intime);
if(tm)
*store = *tm; /* copy the pointed struct to the local copy */
diff --git a/lib/parsedate.h b/lib/parsedate.h
index 8dc3b90ec..8c7ae94e4 100644
--- a/lib/parsedate.h
+++ b/lib/parsedate.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,4 +27,10 @@ extern const char * const Curl_month[12];
CURLcode Curl_gmtime(time_t intime, struct tm *store);
+/* Curl_getdate_capped() differs from curl_getdate() in that this will return
+ TIME_T_MAX in case the parsed time value was too big, instead of an
+ error. */
+
+time_t Curl_getdate_capped(const char *p);
+
#endif /* HEADER_CURL_PARSEDATE_H */
diff --git a/lib/pingpong.c b/lib/pingpong.c
index d0710053b..5a06674ad 100644
--- a/lib/pingpong.c
+++ b/lib/pingpong.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,12 +44,12 @@
/* Returns timeout in ms. 0 or negative number means the timeout has already
triggered */
-time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting)
+timediff_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting)
{
struct connectdata *conn = pp->conn;
struct Curl_easy *data = conn->data;
- time_t timeout_ms; /* in milliseconds */
- long response_time = (data->set.server_response_timeout)?
+ timediff_t timeout_ms; /* in milliseconds */
+ timediff_t response_time = (data->set.server_response_timeout)?
data->set.server_response_timeout: pp->response_time;
/* if CURLOPT_SERVER_RESPONSE_TIMEOUT is set, use that to determine
@@ -60,12 +60,12 @@ time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting)
/* Without a requested timeout, we only wait 'response_time' seconds for the
full response to arrive before we bail out */
timeout_ms = response_time -
- (time_t)Curl_timediff(Curl_now(), pp->response); /* spent time */
+ Curl_timediff(Curl_now(), pp->response); /* spent time */
if(data->set.timeout && !disconnecting) {
/* if timeout is requested, find out how much remaining time we have */
- time_t timeout2_ms = data->set.timeout - /* timeout time */
- (time_t)Curl_timediff(Curl_now(), conn->now); /* spent time */
+ timediff_t timeout2_ms = data->set.timeout - /* timeout time */
+ Curl_timediff(Curl_now(), conn->now); /* spent time */
/* pick the lowest number */
timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
@@ -83,8 +83,8 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block,
struct connectdata *conn = pp->conn;
curl_socket_t sock = conn->sock[FIRSTSOCKET];
int rc;
- time_t interval_ms;
- time_t timeout_ms = Curl_pp_state_timeout(pp, disconnecting);
+ timediff_t interval_ms;
+ timediff_t timeout_ms = Curl_pp_state_timeout(pp, disconnecting);
struct Curl_easy *data = conn->data;
CURLcode result = CURLE_OK;
@@ -146,7 +146,11 @@ void Curl_pp_init(struct pingpong *pp)
pp->response = Curl_now(); /* start response time-out now! */
}
-
+/* setup for the coming transfer */
+void Curl_pp_setup(struct pingpong *pp)
+{
+ Curl_dyn_init(&pp->sendbuf, DYN_PINGPPONG_CMD);
+}
/***********************************************************************
*
@@ -162,9 +166,8 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
const char *fmt,
va_list args)
{
- ssize_t bytes_written;
+ ssize_t bytes_written = 0;
size_t write_len;
- char *fmt_crlf;
char *s;
CURLcode result;
struct connectdata *conn = pp->conn;
@@ -181,48 +184,42 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
if(!conn)
/* can't send without a connection! */
return CURLE_SEND_ERROR;
-
data = conn->data;
- fmt_crlf = aprintf("%s\r\n", fmt); /* append a trailing CRLF */
- if(!fmt_crlf)
- return CURLE_OUT_OF_MEMORY;
-
- s = vaprintf(fmt_crlf, args); /* trailing CRLF appended */
- free(fmt_crlf);
- if(!s)
- return CURLE_OUT_OF_MEMORY;
+ Curl_dyn_reset(&pp->sendbuf);
+ result = Curl_dyn_vaddf(&pp->sendbuf, fmt, args);
+ if(result)
+ return result;
- bytes_written = 0;
- write_len = strlen(s);
+ /* append CRLF */
+ result = Curl_dyn_addn(&pp->sendbuf, "\r\n", 2);
+ if(result)
+ return result;
+ write_len = Curl_dyn_len(&pp->sendbuf);
+ s = Curl_dyn_ptr(&pp->sendbuf);
Curl_pp_init(pp);
result = Curl_convert_to_network(data, s, write_len);
/* Curl_convert_to_network calls failf if unsuccessful */
- if(result) {
- free(s);
+ if(result)
return result;
- }
#ifdef HAVE_GSSAPI
conn->data_prot = PROT_CMD;
#endif
result = Curl_write(conn, conn->sock[FIRSTSOCKET], s, write_len,
- &bytes_written);
+ &bytes_written);
+ if(result)
+ return result;
#ifdef HAVE_GSSAPI
data_sec = conn->data_prot;
DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
conn->data_prot = data_sec;
#endif
- if(result) {
- free(s);
- return result;
- }
-
- if(conn->data->set.verbose)
- Curl_debug(conn->data, CURLINFO_HEADER_OUT, s, (size_t)bytes_written);
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_OUT, s, (size_t)bytes_written);
if(bytes_written != (ssize_t)write_len) {
/* the whole chunk was not sent, keep it around and adjust sizes */
@@ -231,7 +228,6 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
pp->sendleft = write_len - bytes_written;
}
else {
- free(s);
pp->sendthis = NULL;
pp->sendleft = pp->sendsize = 0;
pp->response = Curl_now();
@@ -384,10 +380,10 @@ CURLcode Curl_pp_readresp(curl_socket_t sockfd,
if(pp->endofresp(conn, pp->linestart_resp, perline, code)) {
/* This is the end of the last line, copy the last line to the
- start of the buffer and zero terminate, for old times sake */
+ start of the buffer and null-terminate, for old times sake */
size_t n = ptr - pp->linestart_resp;
memmove(buf, pp->linestart_resp, n);
- buf[n] = 0; /* zero terminate */
+ buf[n] = 0; /* null-terminate */
keepon = FALSE;
pp->linestart_resp = ptr + 1; /* advance pointer */
i++; /* skip this before getting out */
@@ -493,7 +489,6 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp)
pp->sendleft -= written;
}
else {
- free(pp->sendthis);
pp->sendthis = NULL;
pp->sendleft = pp->sendsize = 0;
pp->response = Curl_now();
@@ -503,15 +498,15 @@ CURLcode Curl_pp_flushsend(struct pingpong *pp)
CURLcode Curl_pp_disconnect(struct pingpong *pp)
{
- free(pp->cache);
- pp->cache = NULL;
+ Curl_dyn_free(&pp->sendbuf);
+ Curl_safefree(pp->cache);
return CURLE_OK;
}
bool Curl_pp_moredata(struct pingpong *pp)
{
return (!pp->sendleft && pp->cache && pp->nread_resp < pp->cache_size) ?
- TRUE : FALSE;
+ TRUE : FALSE;
}
#endif
diff --git a/lib/pingpong.h b/lib/pingpong.h
index 849a7c0ff..855815afd 100644
--- a/lib/pingpong.h
+++ b/lib/pingpong.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -60,11 +60,11 @@ struct pingpong {
size_t sendsize; /* total size of the sendthis buffer */
struct curltime response; /* set to Curl_now() when a command has been sent
off, used to time-out response reading */
- long response_time; /* When no timeout is given, this is the amount of
- milliseconds we await for a server response. */
-
+ timediff_t response_time; /* When no timeout is given, this is the amount of
+ milliseconds we await for a server response. */
struct connectdata *conn; /* points to the connectdata struct that this
belongs to */
+ struct dynbuf sendbuf;
/* Function pointers the protocols MUST implement and provide for the
pingpong layer to function */
@@ -87,9 +87,12 @@ CURLcode Curl_pp_statemach(struct pingpong *pp, bool block,
/* initialize stuff to prepare for reading a fresh new response */
void Curl_pp_init(struct pingpong *pp);
+/* setup for the transfer */
+void Curl_pp_setup(struct pingpong *pp);
+
/* Returns timeout in ms. 0 or negative number means the timeout has already
triggered */
-time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting);
+timediff_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting);
/***********************************************************************
diff --git a/lib/pop3.c b/lib/pop3.c
index 57c1373aa..5a7354582 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -128,6 +128,7 @@ const struct Curl_handler Curl_handler_pop3 = {
ZERO_NULL, /* connection_check */
PORT_POP3, /* defport */
CURLPROTO_POP3, /* protocol */
+ CURLPROTO_POP3, /* family */
PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
PROTOPT_URLOPTIONS
};
@@ -155,6 +156,7 @@ const struct Curl_handler Curl_handler_pop3s = {
ZERO_NULL, /* connection_check */
PORT_POP3S, /* defport */
CURLPROTO_POP3S, /* protocol */
+ CURLPROTO_POP3, /* family */
PROTOPT_CLOSEACTION | PROTOPT_SSL
| PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
};
@@ -178,7 +180,7 @@ static void pop3_to_pop3s(struct connectdata *conn)
conn->handler = &Curl_handler_pop3s;
/* Set the connection's upgraded to TLS flag */
- conn->tls_upgraded = TRUE;
+ conn->bits.tls_upgraded = TRUE;
}
#else
#define pop3_to_pop3s(x) Curl_nop_stmt
@@ -412,7 +414,7 @@ static CURLcode pop3_perform_apop(struct connectdata *conn)
CURLcode result = CURLE_OK;
struct pop3_conn *pop3c = &conn->proto.pop3c;
size_t i;
- MD5_context *ctxt;
+ struct MD5_context *ctxt;
unsigned char digest[MD5_DIGEST_LEN];
char secret[2 * MD5_DIGEST_LEN + 1];
@@ -1091,6 +1093,7 @@ static CURLcode pop3_connect(struct connectdata *conn, bool *done)
Curl_sasl_init(&pop3c->sasl, &saslpop3);
/* Initialise the pingpong layer */
+ Curl_pp_setup(pp);
Curl_pp_init(pp);
/* Parse the URL options */
@@ -1312,7 +1315,7 @@ static CURLcode pop3_setup_connection(struct connectdata *conn)
return result;
/* Clear the TLS upgraded flag */
- conn->tls_upgraded = FALSE;
+ conn->bits.tls_upgraded = FALSE;
return CURLE_OK;
}
@@ -1390,7 +1393,7 @@ static CURLcode pop3_parse_url_path(struct connectdata *conn)
const char *path = &data->state.up.path[1]; /* skip leading path */
/* URL decode the path for the message ID */
- return Curl_urldecode(data, path, 0, &pop3->id, NULL, TRUE);
+ return Curl_urldecode(data, path, 0, &pop3->id, NULL, REJECT_CTRL);
}
/***********************************************************************
@@ -1408,7 +1411,7 @@ static CURLcode pop3_parse_custom_request(struct connectdata *conn)
/* URL decode the custom request */
if(custom)
- result = Curl_urldecode(data, custom, 0, &pop3->custom, NULL, TRUE);
+ result = Curl_urldecode(data, custom, 0, &pop3->custom, NULL, REJECT_CTRL);
return result;
}
diff --git a/lib/pop3.h b/lib/pop3.h
index a8e697cde..3ba799977 100644
--- a/lib/pop3.h
+++ b/lib/pop3.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/progress.c b/lib/progress.c
index 2aa929599..eced74c9f 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -164,9 +164,13 @@ void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
}
/*
+ *
+ * Curl_pgrsTime(). Store the current time at the given label. This fetches a
+ * fresh "now" and returns it.
+ *
* @unittest: 1399
*/
-void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
+struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
struct curltime now = Curl_now();
timediff_t *delta = NULL;
@@ -209,7 +213,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
* changing the t_starttransfer time.
*/
if(data->progress.is_t_startransfer_set) {
- return;
+ return now;
}
else {
data->progress.is_t_startransfer_set = true;
@@ -228,6 +232,7 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
us = 1; /* make sure at least one microsecond passed */
*delta += us;
}
+ return now;
}
void Curl_pgrsStartNow(struct Curl_easy *data)
@@ -282,9 +287,9 @@ timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
* stay below 'limit'.
*/
if(size < CURL_OFF_T_MAX/1000)
- minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
+ minimum = (timediff_t) (CURL_OFF_T_C(1000) * size / limit);
else {
- minimum = (time_t) (size / limit);
+ minimum = (timediff_t) (size / limit);
if(minimum < TIMEDIFF_T_MAX/1000)
minimum *= 1000;
else
@@ -594,11 +599,13 @@ int Curl_pgrsUpdate(struct connectdata *conn)
data->progress.size_ul,
data->progress.uploaded);
Curl_set_in_callback(data, false);
- if(result)
- failf(data, "Callback aborted");
- return result;
+ if(result != CURL_PROGRESSFUNC_CONTINUE) {
+ if(result)
+ failf(data, "Callback aborted");
+ return result;
+ }
}
- if(data->set.fprogress) {
+ else if(data->set.fprogress) {
int result;
/* The older deprecated callback is set, call that */
Curl_set_in_callback(data, true);
@@ -608,9 +615,11 @@ int Curl_pgrsUpdate(struct connectdata *conn)
(double)data->progress.size_ul,
(double)data->progress.uploaded);
Curl_set_in_callback(data, false);
- if(result)
- failf(data, "Callback aborted");
- return result;
+ if(result != CURL_PROGRESSFUNC_CONTINUE) {
+ if(result)
+ failf(data, "Callback aborted");
+ return result;
+ }
}
if(showprogress)
diff --git a/lib/progress.h b/lib/progress.h
index 3515ac6d5..c19d966d3 100644
--- a/lib/progress.h
+++ b/lib/progress.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -49,7 +49,7 @@ void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size);
void Curl_ratelimit(struct Curl_easy *data, struct curltime now);
int Curl_pgrsUpdate(struct connectdata *);
void Curl_pgrsResetTransferSizes(struct Curl_easy *data);
-void Curl_pgrsTime(struct Curl_easy *data, timerid timer);
+struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer);
timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
curl_off_t startsize,
curl_off_t limit,
diff --git a/lib/quic.h b/lib/quic.h
index 6c132a324..8e7df90ea 100644
--- a/lib/quic.h
+++ b/lib/quic.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -45,9 +45,15 @@ CURLcode Curl_quic_is_connected(struct connectdata *conn,
bool *connected);
int Curl_quic_ver(char *p, size_t len);
CURLcode Curl_quic_done_sending(struct connectdata *conn);
+void Curl_quic_done(struct Curl_easy *data, bool premature);
+bool Curl_quic_data_pending(const struct Curl_easy *data);
+void Curl_quic_disconnect(struct connectdata *conn, int tempindex);
#else /* ENABLE_QUIC */
#define Curl_quic_done_sending(x)
+#define Curl_quic_done(x,y)
+#define Curl_quic_data_pending(x)
+#define Curl_quic_disconnect(x,y)
#endif /* !ENABLE_QUIC */
#endif /* HEADER_CURL_QUIC_H */
diff --git a/lib/rename.c b/lib/rename.c
new file mode 100644
index 000000000..fe5f95d0d
--- /dev/null
+++ b/lib/rename.c
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "rename.h"
+
+#include "curl_setup.h"
+
+#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)) || \
+ defined(USE_ALTSVC)
+
+#include "curl_multibyte.h"
+#include "timeval.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+/* return 0 on success, 1 on error */
+int Curl_rename(const char *oldpath, const char *newpath)
+{
+#ifdef WIN32
+ /* rename() on Windows doesn't overwrite, so we can't use it here.
+ MoveFileEx() will overwrite and is usually atomic, however it fails
+ when there are open handles to the file. */
+ const int max_wait_ms = 1000;
+ struct curltime start = Curl_now();
+ TCHAR *tchar_oldpath = curlx_convert_UTF8_to_tchar((char *)oldpath);
+ TCHAR *tchar_newpath = curlx_convert_UTF8_to_tchar((char *)newpath);
+ for(;;) {
+ timediff_t diff;
+ if(MoveFileEx(tchar_oldpath, tchar_newpath, MOVEFILE_REPLACE_EXISTING)) {
+ curlx_unicodefree(tchar_oldpath);
+ curlx_unicodefree(tchar_newpath);
+ break;
+ }
+ diff = Curl_timediff(Curl_now(), start);
+ if(diff < 0 || diff > max_wait_ms) {
+ curlx_unicodefree(tchar_oldpath);
+ curlx_unicodefree(tchar_newpath);
+ return 1;
+ }
+ Sleep(1);
+ }
+#else
+ if(rename(oldpath, newpath))
+ return 1;
+#endif
+ return 0;
+}
+
+#endif
diff --git a/lib/rename.h b/lib/rename.h
new file mode 100644
index 000000000..d7442c844
--- /dev/null
+++ b/lib/rename.h
@@ -0,0 +1,27 @@
+#ifndef HEADER_CURL_RENAME_H
+#define HEADER_CURL_RENAME_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+int Curl_rename(const char *oldpath, const char *newpath);
+
+#endif /* HEADER_CURL_RENAME_H */
diff --git a/lib/rtsp.c b/lib/rtsp.c
index bba4c16a1..46c3c4f8f 100644
--- a/lib/rtsp.c
+++ b/lib/rtsp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -106,6 +106,7 @@ const struct Curl_handler Curl_handler_rtsp = {
rtsp_conncheck, /* connection_check */
PORT_RTSP, /* defport */
CURLPROTO_RTSP, /* protocol */
+ CURLPROTO_RTSP, /* family */
PROTOPT_NONE /* flags */
};
@@ -233,7 +234,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
CURLcode result = CURLE_OK;
Curl_RtspReq rtspreq = data->set.rtspreq;
struct RTSP *rtsp = data->req.protop;
- Curl_send_buffer *req_buffer;
+ struct dynbuf req_buffer;
curl_off_t postsize = 0; /* for ANNOUNCE and SET_PARAMETER */
curl_off_t putsize = 0; /* for ANNOUNCE and SET_PARAMETER */
@@ -333,12 +334,12 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
if(rtspreq == RTSPREQ_SETUP && !p_transport) {
/* New Transport: setting? */
if(data->set.str[STRING_RTSP_TRANSPORT]) {
- Curl_safefree(conn->allocptr.rtsp_transport);
+ Curl_safefree(data->state.aptr.rtsp_transport);
- conn->allocptr.rtsp_transport =
+ data->state.aptr.rtsp_transport =
aprintf("Transport: %s\r\n",
data->set.str[STRING_RTSP_TRANSPORT]);
- if(!conn->allocptr.rtsp_transport)
+ if(!data->state.aptr.rtsp_transport)
return CURLE_OUT_OF_MEMORY;
}
else {
@@ -347,7 +348,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
return CURLE_BAD_FUNCTION_ARGUMENT;
}
- p_transport = conn->allocptr.rtsp_transport;
+ p_transport = data->state.aptr.rtsp_transport;
}
/* Accept Headers for DESCRIBE requests */
@@ -359,14 +360,14 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
/* Accept-Encoding header */
if(!Curl_checkheaders(conn, "Accept-Encoding") &&
data->set.str[STRING_ENCODING]) {
- Curl_safefree(conn->allocptr.accept_encoding);
- conn->allocptr.accept_encoding =
+ Curl_safefree(data->state.aptr.accept_encoding);
+ data->state.aptr.accept_encoding =
aprintf("Accept-Encoding: %s\r\n", data->set.str[STRING_ENCODING]);
- if(!conn->allocptr.accept_encoding)
+ if(!data->state.aptr.accept_encoding)
return CURLE_OUT_OF_MEMORY;
- p_accept_encoding = conn->allocptr.accept_encoding;
+ p_accept_encoding = data->state.aptr.accept_encoding;
}
}
@@ -374,13 +375,13 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
it might have been used in the proxy connect, but if we have got a header
with the user-agent string specified, we erase the previously made string
here. */
- if(Curl_checkheaders(conn, "User-Agent") && conn->allocptr.uagent) {
- Curl_safefree(conn->allocptr.uagent);
- conn->allocptr.uagent = NULL;
+ if(Curl_checkheaders(conn, "User-Agent") && data->state.aptr.uagent) {
+ Curl_safefree(data->state.aptr.uagent);
+ data->state.aptr.uagent = NULL;
}
else if(!Curl_checkheaders(conn, "User-Agent") &&
data->set.str[STRING_USERAGENT]) {
- p_uagent = conn->allocptr.uagent;
+ p_uagent = data->state.aptr.uagent;
}
/* setup the authentication headers */
@@ -388,17 +389,17 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
if(result)
return result;
- p_proxyuserpwd = conn->allocptr.proxyuserpwd;
- p_userpwd = conn->allocptr.userpwd;
+ p_proxyuserpwd = data->state.aptr.proxyuserpwd;
+ p_userpwd = data->state.aptr.userpwd;
/* Referrer */
- Curl_safefree(conn->allocptr.ref);
+ Curl_safefree(data->state.aptr.ref);
if(data->change.referer && !Curl_checkheaders(conn, "Referer"))
- conn->allocptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
+ data->state.aptr.ref = aprintf("Referer: %s\r\n", data->change.referer);
else
- conn->allocptr.ref = NULL;
+ data->state.aptr.ref = NULL;
- p_referrer = conn->allocptr.ref;
+ p_referrer = data->state.aptr.ref;
/*
* Range Header
@@ -411,9 +412,9 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
/* Check to see if there is a range set in the custom headers */
if(!Curl_checkheaders(conn, "Range") && data->state.range) {
- Curl_safefree(conn->allocptr.rangeline);
- conn->allocptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
- p_range = conn->allocptr.rangeline;
+ Curl_safefree(data->state.aptr.rangeline);
+ data->state.aptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
+ p_range = data->state.aptr.rangeline;
}
}
@@ -430,16 +431,13 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
}
/* Initialize a dynamic send buffer */
- req_buffer = Curl_add_buffer_init();
-
- if(!req_buffer)
- return CURLE_OUT_OF_MEMORY;
+ Curl_dyn_init(&req_buffer, DYN_RTSP_REQ_HEADER);
result =
- Curl_add_bufferf(&req_buffer,
- "%s %s RTSP/1.0\r\n" /* Request Stream-URI RTSP/1.0 */
- "CSeq: %ld\r\n", /* CSeq */
- p_request, p_stream_uri, rtsp->CSeq_sent);
+ Curl_dyn_addf(&req_buffer,
+ "%s %s RTSP/1.0\r\n" /* Request Stream-URI RTSP/1.0 */
+ "CSeq: %ld\r\n", /* CSeq */
+ p_request, p_stream_uri, rtsp->CSeq_sent);
if(result)
return result;
@@ -448,7 +446,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
* to make comparison easier
*/
if(p_session_id) {
- result = Curl_add_bufferf(&req_buffer, "Session: %s\r\n", p_session_id);
+ result = Curl_dyn_addf(&req_buffer, "Session: %s\r\n", p_session_id);
if(result)
return result;
}
@@ -456,42 +454,42 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
/*
* Shared HTTP-like options
*/
- result = Curl_add_bufferf(&req_buffer,
- "%s" /* transport */
- "%s" /* accept */
- "%s" /* accept-encoding */
- "%s" /* range */
- "%s" /* referrer */
- "%s" /* user-agent */
- "%s" /* proxyuserpwd */
- "%s" /* userpwd */
- ,
- p_transport ? p_transport : "",
- p_accept ? p_accept : "",
- p_accept_encoding ? p_accept_encoding : "",
- p_range ? p_range : "",
- p_referrer ? p_referrer : "",
- p_uagent ? p_uagent : "",
- p_proxyuserpwd ? p_proxyuserpwd : "",
- p_userpwd ? p_userpwd : "");
+ result = Curl_dyn_addf(&req_buffer,
+ "%s" /* transport */
+ "%s" /* accept */
+ "%s" /* accept-encoding */
+ "%s" /* range */
+ "%s" /* referrer */
+ "%s" /* user-agent */
+ "%s" /* proxyuserpwd */
+ "%s" /* userpwd */
+ ,
+ p_transport ? p_transport : "",
+ p_accept ? p_accept : "",
+ p_accept_encoding ? p_accept_encoding : "",
+ p_range ? p_range : "",
+ p_referrer ? p_referrer : "",
+ p_uagent ? p_uagent : "",
+ p_proxyuserpwd ? p_proxyuserpwd : "",
+ p_userpwd ? p_userpwd : "");
/*
* Free userpwd now --- cannot reuse this for Negotiate and possibly NTLM
* with basic and digest, it will be freed anyway by the next request
*/
- Curl_safefree(conn->allocptr.userpwd);
- conn->allocptr.userpwd = NULL;
+ Curl_safefree(data->state.aptr.userpwd);
+ data->state.aptr.userpwd = NULL;
if(result)
return result;
if((rtspreq == RTSPREQ_SETUP) || (rtspreq == RTSPREQ_DESCRIBE)) {
- result = Curl_add_timecondition(conn, req_buffer);
+ result = Curl_add_timecondition(conn, &req_buffer);
if(result)
return result;
}
- result = Curl_add_custom_headers(conn, FALSE, req_buffer);
+ result = Curl_add_custom_headers(conn, FALSE, &req_buffer);
if(result)
return result;
@@ -501,14 +499,14 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
if(data->set.upload) {
putsize = data->state.infilesize;
- data->set.httpreq = HTTPREQ_PUT;
+ data->state.httpreq = HTTPREQ_PUT;
}
else {
postsize = (data->state.infilesize != -1)?
data->state.infilesize:
(data->set.postfields? (curl_off_t)strlen(data->set.postfields):0);
- data->set.httpreq = HTTPREQ_POST;
+ data->state.httpreq = HTTPREQ_POST;
}
if(putsize > 0 || postsize > 0) {
@@ -516,9 +514,9 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
* actually set a custom Content-Length in the headers */
if(!Curl_checkheaders(conn, "Content-Length")) {
result =
- Curl_add_bufferf(&req_buffer,
- "Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n",
- (data->set.upload ? putsize : postsize));
+ Curl_dyn_addf(&req_buffer,
+ "Content-Length: %" CURL_FORMAT_CURL_OFF_T"\r\n",
+ (data->set.upload ? putsize : postsize));
if(result)
return result;
}
@@ -526,8 +524,8 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
if(rtspreq == RTSPREQ_SET_PARAMETER ||
rtspreq == RTSPREQ_GET_PARAMETER) {
if(!Curl_checkheaders(conn, "Content-Type")) {
- result = Curl_add_bufferf(&req_buffer,
- "Content-Type: text/parameters\r\n");
+ result = Curl_dyn_addf(&req_buffer,
+ "Content-Type: text/parameters\r\n");
if(result)
return result;
}
@@ -535,8 +533,8 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
if(rtspreq == RTSPREQ_ANNOUNCE) {
if(!Curl_checkheaders(conn, "Content-Type")) {
- result = Curl_add_bufferf(&req_buffer,
- "Content-Type: application/sdp\r\n");
+ result = Curl_dyn_addf(&req_buffer,
+ "Content-Type: application/sdp\r\n");
if(result)
return result;
}
@@ -546,7 +544,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
}
else if(rtspreq == RTSPREQ_GET_PARAMETER) {
/* Check for an empty GET_PARAMETER (heartbeat) request */
- data->set.httpreq = HTTPREQ_HEAD;
+ data->state.httpreq = HTTPREQ_HEAD;
data->set.opt_no_body = TRUE;
}
}
@@ -554,20 +552,20 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
/* RTSP never allows chunked transfer */
data->req.forbidchunk = TRUE;
/* Finish the request buffer */
- result = Curl_add_buffer(&req_buffer, "\r\n", 2);
+ result = Curl_dyn_add(&req_buffer, "\r\n");
if(result)
return result;
if(postsize > 0) {
- result = Curl_add_buffer(&req_buffer, data->set.postfields,
- (size_t)postsize);
+ result = Curl_dyn_addn(&req_buffer, data->set.postfields,
+ (size_t)postsize);
if(result)
return result;
}
/* issue the request */
- result = Curl_add_buffer_send(&req_buffer, conn,
- &data->info.request_size, 0, FIRSTSOCKET);
+ result = Curl_buffer_send(&req_buffer, conn,
+ &data->info.request_size, 0, FIRSTSOCKET);
if(result) {
failf(data, "Failed sending RTSP request");
return result;
diff --git a/lib/rtsp.h b/lib/rtsp.h
index 2f9cc32c8..1aae86456 100644
--- a/lib/rtsp.h
+++ b/lib/rtsp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/security.c b/lib/security.c
deleted file mode 100644
index fbfa70741..000000000
--- a/lib/security.c
+++ /dev/null
@@ -1,579 +0,0 @@
-/* This source code was modified by Martin Hedenfalk <mhe@stacken.kth.se> for
- * use in Curl. His latest changes were done 2000-09-18.
- *
- * It has since been patched and modified a lot by Daniel Stenberg
- * <daniel@haxx.se> to make it better applied to curl conditions, and to make
- * it not use globals, pollute name space and more. This source code awaits a
- * rewrite to work around the paragraph 2 in the BSD licenses as explained
- * below.
- *
- * Copyright (c) 1998, 1999, 2017 Kungliga Tekniska Högskolan
- * (Royal Institute of Technology, Stockholm, Sweden).
- *
- * Copyright (C) 2001 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE. */
-
-#include "curl_setup.h"
-
-#ifndef CURL_DISABLE_FTP
-#ifdef HAVE_GSSAPI
-
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-
-#include <limits.h>
-
-#include "urldata.h"
-#include "curl_base64.h"
-#include "curl_memory.h"
-#include "curl_sec.h"
-#include "ftp.h"
-#include "sendf.h"
-#include "strcase.h"
-#include "warnless.h"
-#include "strdup.h"
-/* The last 3 #include files should be in this order */
-#include "curl_printf.h"
-#include "curl_memory.h"
-#include "memdebug.h"
-
-static const struct {
- enum protection_level level;
- const char *name;
-} level_names[] = {
- { PROT_CLEAR, "clear" },
- { PROT_SAFE, "safe" },
- { PROT_CONFIDENTIAL, "confidential" },
- { PROT_PRIVATE, "private" }
-};
-
-static enum protection_level
-name_to_level(const char *name)
-{
- int i;
- for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++)
- if(checkprefix(name, level_names[i].name))
- return level_names[i].level;
- return PROT_NONE;
-}
-
-/* Convert a protocol |level| to its char representation.
- We take an int to catch programming mistakes. */
-static char level_to_char(int level)
-{
- switch(level) {
- case PROT_CLEAR:
- return 'C';
- case PROT_SAFE:
- return 'S';
- case PROT_CONFIDENTIAL:
- return 'E';
- case PROT_PRIVATE:
- return 'P';
- case PROT_CMD:
- /* Fall through */
- default:
- /* Those 2 cases should not be reached! */
- break;
- }
- DEBUGASSERT(0);
- /* Default to the most secure alternative. */
- return 'P';
-}
-
-/* Send an FTP command defined by |message| and the optional arguments. The
- function returns the ftp_code. If an error occurs, -1 is returned. */
-static int ftp_send_command(struct connectdata *conn, const char *message, ...)
-{
- int ftp_code;
- ssize_t nread = 0;
- va_list args;
- char print_buffer[50];
-
- va_start(args, message);
- mvsnprintf(print_buffer, sizeof(print_buffer), message, args);
- va_end(args);
-
- if(Curl_ftpsend(conn, print_buffer)) {
- ftp_code = -1;
- }
- else {
- if(Curl_GetFTPResponse(&nread, conn, &ftp_code))
- ftp_code = -1;
- }
-
- (void)nread; /* Unused */
- return ftp_code;
-}
-
-/* Read |len| from the socket |fd| and store it in |to|. Return a CURLcode
- saying whether an error occurred or CURLE_OK if |len| was read. */
-static CURLcode
-socket_read(curl_socket_t fd, void *to, size_t len)
-{
- char *to_p = to;
- CURLcode result;
- ssize_t nread = 0;
-
- while(len > 0) {
- result = Curl_read_plain(fd, to_p, len, &nread);
- if(!result) {
- len -= nread;
- to_p += nread;
- }
- else {
- if(result == CURLE_AGAIN)
- continue;
- return result;
- }
- }
- return CURLE_OK;
-}
-
-
-/* Write |len| bytes from the buffer |to| to the socket |fd|. Return a
- CURLcode saying whether an error occurred or CURLE_OK if |len| was
- written. */
-static CURLcode
-socket_write(struct connectdata *conn, curl_socket_t fd, const void *to,
- size_t len)
-{
- const char *to_p = to;
- CURLcode result;
- ssize_t written;
-
- while(len > 0) {
- result = Curl_write_plain(conn, fd, to_p, len, &written);
- if(!result) {
- len -= written;
- to_p += written;
- }
- else {
- if(result == CURLE_AGAIN)
- continue;
- return result;
- }
- }
- return CURLE_OK;
-}
-
-static CURLcode read_data(struct connectdata *conn,
- curl_socket_t fd,
- struct krb5buffer *buf)
-{
- int len;
- CURLcode result;
-
- result = socket_read(fd, &len, sizeof(len));
- if(result)
- return result;
-
- if(len) {
- /* only realloc if there was a length */
- len = ntohl(len);
- buf->data = Curl_saferealloc(buf->data, len);
- }
- if(!len || !buf->data)
- return CURLE_OUT_OF_MEMORY;
-
- result = socket_read(fd, buf->data, len);
- if(result)
- return result;
- buf->size = conn->mech->decode(conn->app_data, buf->data, len,
- conn->data_prot, conn);
- buf->index = 0;
- return CURLE_OK;
-}
-
-static size_t
-buffer_read(struct krb5buffer *buf, void *data, size_t len)
-{
- if(buf->size - buf->index < len)
- len = buf->size - buf->index;
- memcpy(data, (char *)buf->data + buf->index, len);
- buf->index += len;
- return len;
-}
-
-/* Matches Curl_recv signature */
-static ssize_t sec_recv(struct connectdata *conn, int sockindex,
- char *buffer, size_t len, CURLcode *err)
-{
- size_t bytes_read;
- size_t total_read = 0;
- curl_socket_t fd = conn->sock[sockindex];
-
- *err = CURLE_OK;
-
- /* Handle clear text response. */
- if(conn->sec_complete == 0 || conn->data_prot == PROT_CLEAR)
- return sread(fd, buffer, len);
-
- if(conn->in_buffer.eof_flag) {
- conn->in_buffer.eof_flag = 0;
- return 0;
- }
-
- bytes_read = buffer_read(&conn->in_buffer, buffer, len);
- len -= bytes_read;
- total_read += bytes_read;
- buffer += bytes_read;
-
- while(len > 0) {
- if(read_data(conn, fd, &conn->in_buffer))
- return -1;
- if(conn->in_buffer.size == 0) {
- if(bytes_read > 0)
- conn->in_buffer.eof_flag = 1;
- return bytes_read;
- }
- bytes_read = buffer_read(&conn->in_buffer, buffer, len);
- len -= bytes_read;
- total_read += bytes_read;
- buffer += bytes_read;
- }
- return total_read;
-}
-
-/* Send |length| bytes from |from| to the |fd| socket taking care of encoding
- and negotiating with the server. |from| can be NULL. */
-static void do_sec_send(struct connectdata *conn, curl_socket_t fd,
- const char *from, int length)
-{
- int bytes, htonl_bytes; /* 32-bit integers for htonl */
- char *buffer = NULL;
- char *cmd_buffer;
- size_t cmd_size = 0;
- CURLcode error;
- enum protection_level prot_level = conn->data_prot;
- bool iscmd = (prot_level == PROT_CMD)?TRUE:FALSE;
-
- DEBUGASSERT(prot_level > PROT_NONE && prot_level < PROT_LAST);
-
- if(iscmd) {
- if(!strncmp(from, "PASS ", 5) || !strncmp(from, "ACCT ", 5))
- prot_level = PROT_PRIVATE;
- else
- prot_level = conn->command_prot;
- }
- bytes = conn->mech->encode(conn->app_data, from, length, prot_level,
- (void **)&buffer);
- if(!buffer || bytes <= 0)
- return; /* error */
-
- if(iscmd) {
- error = Curl_base64_encode(conn->data, buffer, curlx_sitouz(bytes),
- &cmd_buffer, &cmd_size);
- if(error) {
- free(buffer);
- return; /* error */
- }
- if(cmd_size > 0) {
- static const char *enc = "ENC ";
- static const char *mic = "MIC ";
- if(prot_level == PROT_PRIVATE)
- socket_write(conn, fd, enc, 4);
- else
- socket_write(conn, fd, mic, 4);
-
- socket_write(conn, fd, cmd_buffer, cmd_size);
- socket_write(conn, fd, "\r\n", 2);
- infof(conn->data, "Send: %s%s\n", prot_level == PROT_PRIVATE?enc:mic,
- cmd_buffer);
- free(cmd_buffer);
- }
- }
- else {
- htonl_bytes = htonl(bytes);
- socket_write(conn, fd, &htonl_bytes, sizeof(htonl_bytes));
- socket_write(conn, fd, buffer, curlx_sitouz(bytes));
- }
- free(buffer);
-}
-
-static ssize_t sec_write(struct connectdata *conn, curl_socket_t fd,
- const char *buffer, size_t length)
-{
- ssize_t tx = 0, len = conn->buffer_size;
-
- len -= conn->mech->overhead(conn->app_data, conn->data_prot,
- curlx_sztosi(len));
- if(len <= 0)
- len = length;
- while(length) {
- if(length < (size_t)len)
- len = length;
-
- do_sec_send(conn, fd, buffer, curlx_sztosi(len));
- length -= len;
- buffer += len;
- tx += len;
- }
- return tx;
-}
-
-/* Matches Curl_send signature */
-static ssize_t sec_send(struct connectdata *conn, int sockindex,
- const void *buffer, size_t len, CURLcode *err)
-{
- curl_socket_t fd = conn->sock[sockindex];
- *err = CURLE_OK;
- return sec_write(conn, fd, buffer, len);
-}
-
-int Curl_sec_read_msg(struct connectdata *conn, char *buffer,
- enum protection_level level)
-{
- /* decoded_len should be size_t or ssize_t but conn->mech->decode returns an
- int */
- int decoded_len;
- char *buf;
- int ret_code = 0;
- size_t decoded_sz = 0;
- CURLcode error;
-
- if(!conn->mech)
- /* not inititalized, return error */
- return -1;
-
- DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
-
- error = Curl_base64_decode(buffer + 4, (unsigned char **)&buf, &decoded_sz);
- if(error || decoded_sz == 0)
- return -1;
-
- if(decoded_sz > (size_t)INT_MAX) {
- free(buf);
- return -1;
- }
- decoded_len = curlx_uztosi(decoded_sz);
-
- decoded_len = conn->mech->decode(conn->app_data, buf, decoded_len,
- level, conn);
- if(decoded_len <= 0) {
- free(buf);
- return -1;
- }
-
- if(conn->data->set.verbose) {
- buf[decoded_len] = '\n';
- Curl_debug(conn->data, CURLINFO_HEADER_IN, buf, decoded_len + 1);
- }
-
- buf[decoded_len] = '\0';
- if(decoded_len <= 3)
- /* suspiciously short */
- return 0;
-
- if(buf[3] != '-')
- /* safe to ignore return code */
- (void)sscanf(buf, "%d", &ret_code);
-
- if(buf[decoded_len - 1] == '\n')
- buf[decoded_len - 1] = '\0';
- strcpy(buffer, buf);
- free(buf);
- return ret_code;
-}
-
-static int sec_set_protection_level(struct connectdata *conn)
-{
- int code;
- enum protection_level level = conn->request_data_prot;
-
- DEBUGASSERT(level > PROT_NONE && level < PROT_LAST);
-
- if(!conn->sec_complete) {
- infof(conn->data, "Trying to change the protection level after the"
- " completion of the data exchange.\n");
- return -1;
- }
-
- /* Bail out if we try to set up the same level */
- if(conn->data_prot == level)
- return 0;
-
- if(level) {
- char *pbsz;
- static unsigned int buffer_size = 1 << 20; /* 1048576 */
-
- code = ftp_send_command(conn, "PBSZ %u", buffer_size);
- if(code < 0)
- return -1;
-
- if(code/100 != 2) {
- failf(conn->data, "Failed to set the protection's buffer size.");
- return -1;
- }
- conn->buffer_size = buffer_size;
-
- pbsz = strstr(conn->data->state.buffer, "PBSZ=");
- if(pbsz) {
- /* ignore return code, use default value if it fails */
- (void)sscanf(pbsz, "PBSZ=%u", &buffer_size);
- if(buffer_size < conn->buffer_size)
- conn->buffer_size = buffer_size;
- }
- }
-
- /* Now try to negiociate the protection level. */
- code = ftp_send_command(conn, "PROT %c", level_to_char(level));
-
- if(code < 0)
- return -1;
-
- if(code/100 != 2) {
- failf(conn->data, "Failed to set the protection level.");
- return -1;
- }
-
- conn->data_prot = level;
- if(level == PROT_PRIVATE)
- conn->command_prot = level;
-
- return 0;
-}
-
-int
-Curl_sec_request_prot(struct connectdata *conn, const char *level)
-{
- enum protection_level l = name_to_level(level);
- if(l == PROT_NONE)
- return -1;
- DEBUGASSERT(l > PROT_NONE && l < PROT_LAST);
- conn->request_data_prot = l;
- return 0;
-}
-
-static CURLcode choose_mech(struct connectdata *conn)
-{
- int ret;
- struct Curl_easy *data = conn->data;
- void *tmp_allocation;
- const struct Curl_sec_client_mech *mech = &Curl_krb5_client_mech;
-
- tmp_allocation = realloc(conn->app_data, mech->size);
- if(tmp_allocation == NULL) {
- failf(data, "Failed realloc of size %zu", mech->size);
- mech = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
- conn->app_data = tmp_allocation;
-
- if(mech->init) {
- ret = mech->init(conn->app_data);
- if(ret) {
- infof(data, "Failed initialization for %s. Skipping it.\n",
- mech->name);
- return CURLE_FAILED_INIT;
- }
- }
-
- infof(data, "Trying mechanism %s...\n", mech->name);
- ret = ftp_send_command(conn, "AUTH %s", mech->name);
- if(ret < 0)
- return CURLE_COULDNT_CONNECT;
-
- if(ret/100 != 3) {
- switch(ret) {
- case 504:
- infof(data, "Mechanism %s is not supported by the server (server "
- "returned ftp code: 504).\n", mech->name);
- break;
- case 534:
- infof(data, "Mechanism %s was rejected by the server (server returned "
- "ftp code: 534).\n", mech->name);
- break;
- default:
- if(ret/100 == 5) {
- infof(data, "server does not support the security extensions\n");
- return CURLE_USE_SSL_FAILED;
- }
- break;
- }
- return CURLE_LOGIN_DENIED;
- }
-
- /* Authenticate */
- ret = mech->auth(conn->app_data, conn);
-
- if(ret != AUTH_CONTINUE) {
- if(ret != AUTH_OK) {
- /* Mechanism has dumped the error to stderr, don't error here. */
- return -1;
- }
- DEBUGASSERT(ret == AUTH_OK);
-
- conn->mech = mech;
- conn->sec_complete = 1;
- conn->recv[FIRSTSOCKET] = sec_recv;
- conn->send[FIRSTSOCKET] = sec_send;
- conn->recv[SECONDARYSOCKET] = sec_recv;
- conn->send[SECONDARYSOCKET] = sec_send;
- conn->command_prot = PROT_SAFE;
- /* Set the requested protection level */
- /* BLOCKING */
- (void)sec_set_protection_level(conn);
- }
-
- return CURLE_OK;
-}
-
-CURLcode
-Curl_sec_login(struct connectdata *conn)
-{
- return choose_mech(conn);
-}
-
-
-void
-Curl_sec_end(struct connectdata *conn)
-{
- if(conn->mech != NULL && conn->mech->end)
- conn->mech->end(conn->app_data);
- free(conn->app_data);
- conn->app_data = NULL;
- if(conn->in_buffer.data) {
- free(conn->in_buffer.data);
- conn->in_buffer.data = NULL;
- conn->in_buffer.size = 0;
- conn->in_buffer.index = 0;
- conn->in_buffer.eof_flag = 0;
- }
- conn->sec_complete = 0;
- conn->data_prot = PROT_CLEAR;
- conn->mech = NULL;
-}
-
-#endif /* HAVE_GSSAPI */
-
-#endif /* CURL_DISABLE_FTP */
diff --git a/lib/select.c b/lib/select.c
index 8cd9eb2ad..917133b72 100644
--- a/lib/select.c
+++ b/lib/select.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,8 +22,12 @@
#include "curl_setup.h"
+#include <limits.h>
+
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#if !defined(HAVE_SELECT) && !defined(HAVE_POLL_FINE)
@@ -48,14 +52,9 @@
#include "urldata.h"
#include "connect.h"
#include "select.h"
+#include "timeval.h"
#include "warnless.h"
-/* Convenience local macros */
-#define ELAPSED_MS() (int)Curl_timediff(Curl_now(), initial_tv)
-
-int Curl_ack_eintr = 0;
-#define ERROR_NOT_EINTR(error) (Curl_ack_eintr || error != EINTR)
-
/*
* Internal function used for waiting a specific amount of ms
* in Curl_socket_check() and Curl_poll() when no file descriptor
@@ -72,15 +71,8 @@ int Curl_ack_eintr = 0;
* -1 = system call error, invalid timeout value, or interrupted
* 0 = specified timeout has elapsed
*/
-int Curl_wait_ms(int timeout_ms)
+int Curl_wait_ms(timediff_t timeout_ms)
{
-#if !defined(MSDOS) && !defined(USE_WINSOCK)
-#ifndef HAVE_POLL_FINE
- struct timeval pending_tv;
-#endif
- struct curltime initial_tv;
- int pending_ms;
-#endif
int r = 0;
if(!timeout_ms)
@@ -91,31 +83,47 @@ int Curl_wait_ms(int timeout_ms)
}
#if defined(MSDOS)
delay(timeout_ms);
-#elif defined(USE_WINSOCK)
- Sleep(timeout_ms);
+#elif defined(WIN32)
+ /* prevent overflow, timeout_ms is typecast to ULONG/DWORD. */
+#if TIMEDIFF_T_MAX >= ULONG_MAX
+ if(timeout_ms >= ULONG_MAX)
+ timeout_ms = ULONG_MAX-1;
+ /* don't use ULONG_MAX, because that is equal to INFINITE */
+#endif
+ Sleep((ULONG)timeout_ms);
#else
- pending_ms = timeout_ms;
- initial_tv = Curl_now();
- do {
- int error;
#if defined(HAVE_POLL_FINE)
- r = poll(NULL, 0, pending_ms);
+ /* prevent overflow, timeout_ms is typecast to int. */
+#if TIMEDIFF_T_MAX > INT_MAX
+ if(timeout_ms > INT_MAX)
+ timeout_ms = INT_MAX;
+#endif
+ r = poll(NULL, 0, (int)timeout_ms);
#else
- pending_tv.tv_sec = pending_ms / 1000;
- pending_tv.tv_usec = (pending_ms % 1000) * 1000;
+ {
+ struct timeval pending_tv;
+ timediff_t tv_sec = timeout_ms / 1000;
+ timediff_t tv_usec = (timeout_ms % 1000) * 1000; /* max=999999 */
+#ifdef HAVE_SUSECONDS_T
+#if TIMEDIFF_T_MAX > TIME_T_MAX
+ /* tv_sec overflow check in case time_t is signed */
+ if(tv_sec > TIME_T_MAX)
+ tv_sec = TIME_T_MAX;
+#endif
+ pending_tv.tv_sec = (time_t)tv_sec;
+ pending_tv.tv_usec = (suseconds_t)tv_usec;
+#else
+#if TIMEDIFF_T_MAX > INT_MAX
+ /* tv_sec overflow check in case time_t is signed */
+ if(tv_sec > INT_MAX)
+ tv_sec = INT_MAX;
+#endif
+ pending_tv.tv_sec = (int)tv_sec;
+ pending_tv.tv_usec = (int)tv_usec;
+#endif
r = select(0, NULL, NULL, NULL, &pending_tv);
+ }
#endif /* HAVE_POLL_FINE */
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- pending_ms = timeout_ms - ELAPSED_MS();
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- } while(r == -1);
#endif /* USE_WINSOCK */
if(r)
r = -1;
@@ -123,6 +131,96 @@ int Curl_wait_ms(int timeout_ms)
}
/*
+ * This is a wrapper around select() to aid in Windows compatibility.
+ * A negative timeout value makes this function wait indefinitely,
+ * unless no valid file descriptor is given, when this happens the
+ * negative timeout is ignored and the function times out immediately.
+ *
+ * Return values:
+ * -1 = system call error or fd >= FD_SETSIZE
+ * 0 = timeout
+ * N = number of signalled file descriptors
+ */
+int Curl_select(curl_socket_t maxfd, /* highest socket number */
+ fd_set *fds_read, /* sockets ready for reading */
+ fd_set *fds_write, /* sockets ready for writing */
+ fd_set *fds_err, /* sockets with errors */
+ timediff_t timeout_ms) /* milliseconds to wait */
+{
+ struct timeval pending_tv;
+ struct timeval *ptimeout;
+
+#ifdef USE_WINSOCK
+ /* WinSock select() can't handle zero events. See the comment below. */
+ if((!fds_read || fds_read->fd_count == 0) &&
+ (!fds_write || fds_write->fd_count == 0) &&
+ (!fds_err || fds_err->fd_count == 0)) {
+ /* no sockets, just wait */
+ return Curl_wait_ms(timeout_ms);
+ }
+#endif
+
+ ptimeout = &pending_tv;
+ if(timeout_ms < 0) {
+ ptimeout = NULL;
+ }
+ else if(timeout_ms > 0) {
+ timediff_t tv_sec = timeout_ms / 1000;
+ timediff_t tv_usec = (timeout_ms % 1000) * 1000; /* max=999999 */
+#ifdef HAVE_SUSECONDS_T
+#if TIMEDIFF_T_MAX > TIME_T_MAX
+ /* tv_sec overflow check in case time_t is signed */
+ if(tv_sec > TIME_T_MAX)
+ tv_sec = TIME_T_MAX;
+#endif
+ pending_tv.tv_sec = (time_t)tv_sec;
+ pending_tv.tv_usec = (suseconds_t)tv_usec;
+#elif defined(WIN32) /* maybe also others in the future */
+#if TIMEDIFF_T_MAX > LONG_MAX
+ /* tv_sec overflow check on Windows there we know it is long */
+ if(tv_sec > LONG_MAX)
+ tv_sec = LONG_MAX;
+#endif
+ pending_tv.tv_sec = (long)tv_sec;
+ pending_tv.tv_usec = (long)tv_usec;
+#else
+#if TIMEDIFF_T_MAX > INT_MAX
+ /* tv_sec overflow check in case time_t is signed */
+ if(tv_sec > INT_MAX)
+ tv_sec = INT_MAX;
+#endif
+ pending_tv.tv_sec = (int)tv_sec;
+ pending_tv.tv_usec = (int)tv_usec;
+#endif
+ }
+ else {
+ pending_tv.tv_sec = 0;
+ pending_tv.tv_usec = 0;
+ }
+
+#ifdef USE_WINSOCK
+ /* WinSock select() must not be called with an fd_set that contains zero
+ fd flags, or it will return WSAEINVAL. But, it also can't be called
+ with no fd_sets at all! From the documentation:
+
+ Any two of the parameters, readfds, writefds, or exceptfds, can be
+ given as null. At least one must be non-null, and any non-null
+ descriptor set must contain at least one handle to a socket.
+
+ It is unclear why WinSock doesn't just handle this for us instead of
+ calling this an error. Luckily, with WinSock, we can _also_ ask how
+ many bits are set on an fd_set. So, let's just check it beforehand.
+ */
+ return select((int)maxfd + 1,
+ fds_read && fds_read->fd_count ? fds_read : NULL,
+ fds_write && fds_write->fd_count ? fds_write : NULL,
+ fds_err && fds_err->fd_count ? fds_err : NULL, ptimeout);
+#else
+ return select((int)maxfd + 1, fds_read, fds_write, fds_err, ptimeout);
+#endif
+}
+
+/*
* Wait for read or write events on a set of file descriptors. It uses poll()
* when a fine poll() is available, in order to avoid limits with FD_SETSIZE,
* otherwise select() is used. An error is returned if select() is being used
@@ -145,35 +243,16 @@ int Curl_wait_ms(int timeout_ms)
int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
curl_socket_t readfd1,
curl_socket_t writefd, /* socket to write to */
- time_t timeout_ms) /* milliseconds to wait */
+ timediff_t timeout_ms) /* milliseconds to wait */
{
-#ifdef HAVE_POLL_FINE
struct pollfd pfd[3];
int num;
-#else
- struct timeval pending_tv;
- struct timeval *ptimeout;
- fd_set fds_read;
- fd_set fds_write;
- fd_set fds_err;
- curl_socket_t maxfd;
-#endif
- struct curltime initial_tv = {0, 0};
- int pending_ms = 0;
int r;
- int ret;
-
-#if SIZEOF_TIME_T != SIZEOF_INT
- /* wrap-around precaution */
- if(timeout_ms >= INT_MAX)
- timeout_ms = INT_MAX;
-#endif
if((readfd0 == CURL_SOCKET_BAD) && (readfd1 == CURL_SOCKET_BAD) &&
(writefd == CURL_SOCKET_BAD)) {
/* no sockets, just wait */
- r = Curl_wait_ms((int)timeout_ms);
- return r;
+ return Curl_wait_ms(timeout_ms);
}
/* Avoid initial timestamp, avoid Curl_now() call, when elapsed
@@ -181,13 +260,6 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
- if(timeout_ms > 0) {
- pending_ms = (int)timeout_ms;
- initial_tv = Curl_now();
- }
-
-#ifdef HAVE_POLL_FINE
-
num = 0;
if(readfd0 != CURL_SOCKET_BAD) {
pfd[num].fd = readfd0;
@@ -203,177 +275,39 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
}
if(writefd != CURL_SOCKET_BAD) {
pfd[num].fd = writefd;
- pfd[num].events = POLLWRNORM|POLLOUT;
+ pfd[num].events = POLLWRNORM|POLLOUT|POLLPRI;
pfd[num].revents = 0;
num++;
}
- do {
- int error;
- if(timeout_ms < 0)
- pending_ms = -1;
- else if(!timeout_ms)
- pending_ms = 0;
- r = poll(pfd, num, pending_ms);
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = (int)(timeout_ms - ELAPSED_MS());
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
+ r = Curl_poll(pfd, num, timeout_ms);
+ if(r <= 0)
+ return r;
- ret = 0;
+ r = 0;
num = 0;
if(readfd0 != CURL_SOCKET_BAD) {
if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP))
- ret |= CURL_CSELECT_IN;
+ r |= CURL_CSELECT_IN;
if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL))
- ret |= CURL_CSELECT_ERR;
+ r |= CURL_CSELECT_ERR;
num++;
}
if(readfd1 != CURL_SOCKET_BAD) {
if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP))
- ret |= CURL_CSELECT_IN2;
+ r |= CURL_CSELECT_IN2;
if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL))
- ret |= CURL_CSELECT_ERR;
+ r |= CURL_CSELECT_ERR;
num++;
}
if(writefd != CURL_SOCKET_BAD) {
if(pfd[num].revents & (POLLWRNORM|POLLOUT))
- ret |= CURL_CSELECT_OUT;
- if(pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL))
- ret |= CURL_CSELECT_ERR;
+ r |= CURL_CSELECT_OUT;
+ if(pfd[num].revents & (POLLERR|POLLHUP|POLLPRI|POLLNVAL))
+ r |= CURL_CSELECT_ERR;
}
- return ret;
-
-#else /* HAVE_POLL_FINE */
-
- FD_ZERO(&fds_err);
- maxfd = (curl_socket_t)-1;
-
- FD_ZERO(&fds_read);
- if(readfd0 != CURL_SOCKET_BAD) {
- VERIFY_SOCK(readfd0);
- FD_SET(readfd0, &fds_read);
- FD_SET(readfd0, &fds_err);
- maxfd = readfd0;
- }
- if(readfd1 != CURL_SOCKET_BAD) {
- VERIFY_SOCK(readfd1);
- FD_SET(readfd1, &fds_read);
- FD_SET(readfd1, &fds_err);
- if(readfd1 > maxfd)
- maxfd = readfd1;
- }
-
- FD_ZERO(&fds_write);
- if(writefd != CURL_SOCKET_BAD) {
- VERIFY_SOCK(writefd);
- FD_SET(writefd, &fds_write);
- FD_SET(writefd, &fds_err);
- if(writefd > maxfd)
- maxfd = writefd;
- }
-
- ptimeout = (timeout_ms < 0) ? NULL : &pending_tv;
-
- do {
- int error;
- if(timeout_ms > 0) {
- pending_tv.tv_sec = pending_ms / 1000;
- pending_tv.tv_usec = (pending_ms % 1000) * 1000;
- }
- else if(!timeout_ms) {
- pending_tv.tv_sec = 0;
- pending_tv.tv_usec = 0;
- }
-
- /* WinSock select() must not be called with an fd_set that contains zero
- fd flags, or it will return WSAEINVAL. But, it also can't be called
- with no fd_sets at all! From the documentation:
-
- Any two of the parameters, readfds, writefds, or exceptfds, can be
- given as null. At least one must be non-null, and any non-null
- descriptor set must contain at least one handle to a socket.
-
- We know that we have at least one bit set in at least two fd_sets in
- this case, but we may have no bits set in either fds_read or fd_write,
- so check for that and handle it. Luckily, with WinSock, we can _also_
- ask how many bits are set on an fd_set.
-
- It is unclear why WinSock doesn't just handle this for us instead of
- calling this an error.
-
- Note also that WinSock ignores the first argument, so we don't worry
- about the fact that maxfd is computed incorrectly with WinSock (since
- curl_socket_t is unsigned in such cases and thus -1 is the largest
- value).
- */
-#ifdef USE_WINSOCK
- r = select((int)maxfd + 1,
- fds_read.fd_count ? &fds_read : NULL,
- fds_write.fd_count ? &fds_write : NULL,
- &fds_err, ptimeout);
-#else
- r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
-#endif
-
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = (int)(timeout_ms - ELAPSED_MS());
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
-
- ret = 0;
- if(readfd0 != CURL_SOCKET_BAD) {
- if(FD_ISSET(readfd0, &fds_read))
- ret |= CURL_CSELECT_IN;
- if(FD_ISSET(readfd0, &fds_err))
- ret |= CURL_CSELECT_ERR;
- }
- if(readfd1 != CURL_SOCKET_BAD) {
- if(FD_ISSET(readfd1, &fds_read))
- ret |= CURL_CSELECT_IN2;
- if(FD_ISSET(readfd1, &fds_err))
- ret |= CURL_CSELECT_ERR;
- }
- if(writefd != CURL_SOCKET_BAD) {
- if(FD_ISSET(writefd, &fds_write))
- ret |= CURL_CSELECT_OUT;
- if(FD_ISSET(writefd, &fds_err))
- ret |= CURL_CSELECT_ERR;
- }
-
- return ret;
-
-#endif /* HAVE_POLL_FINE */
-
+ return r;
}
/*
@@ -389,20 +323,18 @@ int Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */
* 0 = timeout
* N = number of structures with non zero revent fields
*/
-int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
+int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms)
{
-#ifndef HAVE_POLL_FINE
- struct timeval pending_tv;
- struct timeval *ptimeout;
+#ifdef HAVE_POLL_FINE
+ int pending_ms;
+#else
fd_set fds_read;
fd_set fds_write;
fd_set fds_err;
curl_socket_t maxfd;
#endif
- struct curltime initial_tv = {0, 0};
bool fds_none = TRUE;
unsigned int i;
- int pending_ms = 0;
int r;
if(ufds) {
@@ -414,8 +346,8 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
}
}
if(fds_none) {
- r = Curl_wait_ms(timeout_ms);
- return r;
+ /* no sockets, just wait */
+ return Curl_wait_ms(timeout_ms);
}
/* Avoid initial timestamp, avoid Curl_now() call, when elapsed
@@ -423,38 +355,22 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
- if(timeout_ms > 0) {
- pending_ms = timeout_ms;
- initial_tv = Curl_now();
- }
-
#ifdef HAVE_POLL_FINE
- do {
- int error;
- if(timeout_ms < 0)
- pending_ms = -1;
- else if(!timeout_ms)
- pending_ms = 0;
- r = poll(ufds, nfds, pending_ms);
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = (int)(timeout_ms - ELAPSED_MS());
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
+ /* prevent overflow, timeout_ms is typecast to int. */
+#if TIMEDIFF_T_MAX > INT_MAX
+ if(timeout_ms > INT_MAX)
+ timeout_ms = INT_MAX;
+#endif
+ if(timeout_ms > 0)
+ pending_ms = (int)timeout_ms;
+ else if(timeout_ms < 0)
+ pending_ms = -1;
+ else
+ pending_ms = 0;
+ r = poll(ufds, nfds, pending_ms);
+ if(r <= 0)
+ return r;
for(i = 0; i < nfds; i++) {
if(ufds[i].fd == CURL_SOCKET_BAD)
@@ -462,7 +378,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
if(ufds[i].revents & POLLHUP)
ufds[i].revents |= POLLIN;
if(ufds[i].revents & POLLERR)
- ufds[i].revents |= (POLLIN|POLLOUT);
+ ufds[i].revents |= POLLIN|POLLOUT;
}
#else /* HAVE_POLL_FINE */
@@ -478,7 +394,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
continue;
VERIFY_SOCK(ufds[i].fd);
if(ufds[i].events & (POLLIN|POLLOUT|POLLPRI|
- POLLRDNORM|POLLWRNORM|POLLRDBAND)) {
+ POLLRDNORM|POLLWRNORM|POLLRDBAND)) {
if(ufds[i].fd > maxfd)
maxfd = ufds[i].fd;
if(ufds[i].events & (POLLRDNORM|POLLIN))
@@ -490,71 +406,39 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
}
}
-#ifdef USE_WINSOCK
- /* WinSock select() can't handle zero events. See the comment about this in
- Curl_check_socket(). */
- if(fds_read.fd_count == 0 && fds_write.fd_count == 0
- && fds_err.fd_count == 0) {
- r = Curl_wait_ms(timeout_ms);
+ /*
+ Note also that WinSock ignores the first argument, so we don't worry
+ about the fact that maxfd is computed incorrectly with WinSock (since
+ curl_socket_t is unsigned in such cases and thus -1 is the largest
+ value).
+ */
+ r = Curl_select(maxfd, &fds_read, &fds_write, &fds_err, timeout_ms);
+ if(r <= 0)
return r;
- }
-#endif
-
- ptimeout = (timeout_ms < 0) ? NULL : &pending_tv;
-
- do {
- int error;
- if(timeout_ms > 0) {
- pending_tv.tv_sec = pending_ms / 1000;
- pending_tv.tv_usec = (pending_ms % 1000) * 1000;
- }
- else if(!timeout_ms) {
- pending_tv.tv_sec = 0;
- pending_tv.tv_usec = 0;
- }
-
-#ifdef USE_WINSOCK
- r = select((int)maxfd + 1,
- /* WinSock select() can't handle fd_sets with zero bits set, so
- don't give it such arguments. See the comment about this in
- Curl_check_socket().
- */
- fds_read.fd_count ? &fds_read : NULL,
- fds_write.fd_count ? &fds_write : NULL,
- fds_err.fd_count ? &fds_err : NULL, ptimeout);
-#else
- r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
-#endif
- if(r != -1)
- break;
- error = SOCKERRNO;
- if(error && ERROR_NOT_EINTR(error))
- break;
- if(timeout_ms > 0) {
- pending_ms = timeout_ms - ELAPSED_MS();
- if(pending_ms <= 0) {
- r = 0; /* Simulate a "call timed out" case */
- break;
- }
- }
- } while(r == -1);
-
- if(r < 0)
- return -1;
- if(r == 0)
- return 0;
r = 0;
for(i = 0; i < nfds; i++) {
ufds[i].revents = 0;
if(ufds[i].fd == CURL_SOCKET_BAD)
continue;
- if(FD_ISSET(ufds[i].fd, &fds_read))
- ufds[i].revents |= POLLIN;
- if(FD_ISSET(ufds[i].fd, &fds_write))
- ufds[i].revents |= POLLOUT;
- if(FD_ISSET(ufds[i].fd, &fds_err))
- ufds[i].revents |= POLLPRI;
+ if(FD_ISSET(ufds[i].fd, &fds_read)) {
+ if(ufds[i].events & POLLRDNORM)
+ ufds[i].revents |= POLLRDNORM;
+ if(ufds[i].events & POLLIN)
+ ufds[i].revents |= POLLIN;
+ }
+ if(FD_ISSET(ufds[i].fd, &fds_write)) {
+ if(ufds[i].events & POLLWRNORM)
+ ufds[i].revents |= POLLWRNORM;
+ if(ufds[i].events & POLLOUT)
+ ufds[i].revents |= POLLOUT;
+ }
+ if(FD_ISSET(ufds[i].fd, &fds_err)) {
+ if(ufds[i].events & POLLRDBAND)
+ ufds[i].revents |= POLLRDBAND;
+ if(ufds[i].events & POLLPRI)
+ ufds[i].revents |= POLLPRI;
+ }
if(ufds[i].revents != 0)
r++;
}
diff --git a/lib/select.h b/lib/select.h
index f5652a74f..c9cc5c2e8 100644
--- a/lib/select.h
+++ b/lib/select.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,36 +72,45 @@ struct pollfd
therefore defined here */
#define CURL_CSELECT_IN2 (CURL_CSELECT_ERR << 1)
+int Curl_select(curl_socket_t maxfd,
+ fd_set *fds_read,
+ fd_set *fds_write,
+ fd_set *fds_err,
+ timediff_t timeout_ms);
+
int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
curl_socket_t writefd,
- time_t timeout_ms);
-
+ timediff_t timeout_ms);
#define SOCKET_READABLE(x,z) \
- Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, (time_t)z)
+ Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, z)
#define SOCKET_WRITABLE(x,z) \
- Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, (time_t)z)
-
-int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);
+ Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, z)
-/* On non-DOS and non-Winsock platforms, when Curl_ack_eintr is set,
- * EINTR condition is honored and function might exit early without
- * awaiting full timeout. Otherwise EINTR will be ignored and full
- * timeout will elapse. */
-extern int Curl_ack_eintr;
-
-int Curl_wait_ms(int timeout_ms);
+int Curl_poll(struct pollfd ufds[], unsigned int nfds, timediff_t timeout_ms);
+int Curl_wait_ms(timediff_t timeout_ms);
#ifdef TPF
int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
- fd_set* excepts, struct timeval* tv);
+ fd_set* excepts, struct timeval *tv);
#endif
-/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1], which
+/* TPF sockets are not in range [0..FD_SETSIZE-1], which
unfortunately makes it impossible for us to easily check if they're valid
+
+ With Winsock the valid range is [0..INVALID_SOCKET-1] according to
+ https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2
*/
-#if defined(USE_WINSOCK) || defined(TPF)
+#if defined(TPF)
#define VALID_SOCK(x) 1
#define VERIFY_SOCK(x) Curl_nop_stmt
+#elif defined(USE_WINSOCK)
+#define VALID_SOCK(s) ((s) < INVALID_SOCKET)
+#define VERIFY_SOCK(x) do { \
+ if(!VALID_SOCK(x)) { \
+ SET_SOCKERRNO(WSAEINVAL); \
+ return -1; \
+ } \
+} while(0)
#else
#define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE))
#define VERIFY_SOCK(x) do { \
@@ -109,7 +118,7 @@ int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes,
SET_SOCKERRNO(EINVAL); \
return -1; \
} \
-} WHILE_FALSE
+} while(0)
#endif
#endif /* HEADER_CURL_SELECT_H */
diff --git a/lib/sendf.c b/lib/sendf.c
index 5913ea406..6cfc89b69 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,13 +36,14 @@
#include "sendf.h"
#include "connect.h"
#include "vtls/vtls.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "easyif.h"
#include "multiif.h"
#include "non-ascii.h"
#include "strerror.h"
#include "select.h"
#include "strdup.h"
+#include "http2.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -139,7 +140,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
psnd->recv_size > psnd->recv_processed;
}
-static void pre_receive_plain(struct connectdata *conn, int num)
+static CURLcode pre_receive_plain(struct connectdata *conn, int num)
{
const curl_socket_t sockfd = conn->sock[num];
struct postponed_data * const psnd = &(conn->postponed[num]);
@@ -160,6 +161,8 @@ static void pre_receive_plain(struct connectdata *conn, int num)
/* Use buffer double default size for intermediate buffer */
psnd->allocated_size = 2 * conn->data->set.buffer_size;
psnd->buffer = malloc(psnd->allocated_size);
+ if(!psnd->buffer)
+ return CURLE_OUT_OF_MEMORY;
psnd->recv_size = 0;
psnd->recv_processed = 0;
#ifdef DEBUGBUILD
@@ -179,6 +182,7 @@ static void pre_receive_plain(struct connectdata *conn, int num)
psnd->allocated_size = 0;
}
}
+ return CURLE_OK;
}
static ssize_t get_pre_recved(struct connectdata *conn, int num, char *buf,
@@ -224,7 +228,7 @@ bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
(void)sockindex;
return false;
}
-#define pre_receive_plain(c,n) do {} WHILE_FALSE
+#define pre_receive_plain(c,n) CURLE_OK
#define get_pre_recved(c,n,b,l) 0
#endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
@@ -266,7 +270,7 @@ void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
size_t len;
char error[CURL_ERROR_SIZE + 2];
va_start(ap, fmt);
- mvsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
+ (void)mvsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
len = strlen(error);
if(data->set.errorbuffer && !data->state.errorbuf) {
@@ -282,52 +286,6 @@ void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
}
}
-/* Curl_sendf() sends formatted data to the server */
-CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn,
- const char *fmt, ...)
-{
- struct Curl_easy *data = conn->data;
- ssize_t bytes_written;
- size_t write_len;
- CURLcode result = CURLE_OK;
- char *s;
- char *sptr;
- va_list ap;
- va_start(ap, fmt);
- s = vaprintf(fmt, ap); /* returns an allocated string */
- va_end(ap);
- if(!s)
- return CURLE_OUT_OF_MEMORY; /* failure */
-
- bytes_written = 0;
- write_len = strlen(s);
- sptr = s;
-
- for(;;) {
- /* Write the buffer to the socket */
- result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written);
-
- if(result)
- break;
-
- if(data->set.verbose)
- Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written);
-
- if((size_t)bytes_written != write_len) {
- /* if not all was written at once, we must advance the pointer, decrease
- the size left and try again! */
- write_len -= bytes_written;
- sptr += bytes_written;
- }
- else
- break;
- }
-
- free(s); /* free the output string */
-
- return result;
-}
-
/*
* Curl_write() is an internal write function that sends data to the
* server. Works with plain sockets, SCP, SSL or kerberos.
@@ -378,7 +336,10 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num,
To avoid lossage of received data, recv() must be
performed before every send() if any incoming data is
available. */
- pre_receive_plain(conn, num);
+ if(pre_receive_plain(conn, num)) {
+ *code = CURLE_OUT_OF_MEMORY;
+ return -1;
+ }
#if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */
if(conn->bits.tcp_fastopen) {
@@ -497,10 +458,12 @@ static CURLcode pausewrite(struct Curl_easy *data,
is again enabled */
struct SingleRequest *k = &data->req;
struct UrlState *s = &data->state;
- char *dupl;
unsigned int i;
bool newtype = TRUE;
+ /* If this transfers over HTTP/2, pause the stream! */
+ Curl_http2_stream_pause(data, TRUE);
+
if(s->tempcount) {
for(i = 0; i< s->tempcount; i++) {
if(s->tempwrite[i].type == type) {
@@ -514,42 +477,21 @@ static CURLcode pausewrite(struct Curl_easy *data,
else
i = 0;
- if(!newtype) {
- /* append new data to old data */
-
- /* figure out the new size of the data to save */
- size_t newlen = len + s->tempwrite[i].len;
- /* allocate the new memory area */
- char *newptr = realloc(s->tempwrite[i].buf, newlen);
- if(!newptr)
- return CURLE_OUT_OF_MEMORY;
- /* copy the new data to the end of the new area */
- memcpy(newptr + s->tempwrite[i].len, ptr, len);
-
- /* update the pointer and the size */
- s->tempwrite[i].buf = newptr;
- s->tempwrite[i].len = newlen;
- }
- else {
- dupl = Curl_memdup(ptr, len);
- if(!dupl)
- return CURLE_OUT_OF_MEMORY;
-
+ if(newtype) {
/* store this information in the state struct for later use */
- s->tempwrite[i].buf = dupl;
- s->tempwrite[i].len = len;
+ Curl_dyn_init(&s->tempwrite[i].b, DYN_PAUSE_BUFFER);
s->tempwrite[i].type = type;
if(newtype)
s->tempcount++;
}
+ if(Curl_dyn_addn(&s->tempwrite[i].b, (unsigned char *)ptr, len))
+ return CURLE_OUT_OF_MEMORY;
+
/* mark the connection as RECV paused */
k->keepon |= KEEP_RECV_PAUSE;
- DEBUGF(infof(data, "Paused %zu bytes in buffer for type %02x\n",
- len, type));
-
return CURLE_OK;
}
@@ -611,7 +553,7 @@ static CURLcode chop_write(struct connectdata *conn,
return pausewrite(data, type, ptr, len);
}
if(wrote != chunklen) {
- failf(data, "Failed writing body (%zu != %zu)", wrote, chunklen);
+ failf(data, "Failure writing output to destination");
return CURLE_WRITE_ERROR;
}
}
@@ -692,19 +634,20 @@ CURLcode Curl_read_plain(curl_socket_t sockfd,
ssize_t nread = sread(sockfd, buf, bytesfromsocket);
if(-1 == nread) {
- int err = SOCKERRNO;
- int return_error;
+ const int err = SOCKERRNO;
+ const bool return_error =
#ifdef USE_WINSOCK
- return_error = WSAEWOULDBLOCK == err;
+ WSAEWOULDBLOCK == err
#else
- return_error = EWOULDBLOCK == err || EAGAIN == err || EINTR == err;
+ EWOULDBLOCK == err || EAGAIN == err || EINTR == err
#endif
+ ;
+ *n = 0; /* no data returned */
if(return_error)
return CURLE_AGAIN;
return CURLE_RECV_ERROR;
}
- /* we only return number of bytes read when we return OK */
*n = nread;
return CURLE_OK;
}
diff --git a/lib/sendf.h b/lib/sendf.h
index c68b017da..2e270c598 100644
--- a/lib/sendf.h
+++ b/lib/sendf.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,8 +24,6 @@
#include "curl_setup.h"
-CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *,
- const char *fmt, ...);
void Curl_infof(struct Curl_easy *, const char *fmt, ...);
void Curl_failf(struct Curl_easy *, const char *fmt, ...);
diff --git a/lib/setopt.c b/lib/setopt.c
index 64c29e333..fa5398215 100644
--- a/lib/setopt.c
+++ b/lib/setopt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -77,6 +77,37 @@ CURLcode Curl_setstropt(char **charp, const char *s)
return CURLE_OK;
}
+CURLcode Curl_setblobopt(struct curl_blob **blobp,
+ const struct curl_blob *blob)
+{
+ /* free the previous storage at `blobp' and replace by a dynamic storage
+ copy of blob. If CURL_BLOB_COPY is set, the data is copied. */
+
+ Curl_safefree(*blobp);
+
+ if(blob) {
+ struct curl_blob *nblob;
+ if(blob->len > CURL_MAX_INPUT_LENGTH)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ nblob = (struct curl_blob *)
+ malloc(sizeof(struct curl_blob) +
+ ((blob->flags & CURL_BLOB_COPY) ? blob->len : 0));
+ if(!nblob)
+ return CURLE_OUT_OF_MEMORY;
+ *nblob = *blob;
+ if(blob->flags & CURL_BLOB_COPY) {
+ /* put the data after the blob struct in memory */
+ nblob->data = (char *)nblob + sizeof(struct curl_blob);
+ memcpy(nblob->data, blob->data, blob->len);
+ }
+
+ *blobp = nblob;
+ return CURLE_OK;
+ }
+
+ return CURLE_OK;
+}
+
static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
{
CURLcode result = CURLE_OK;
@@ -240,6 +271,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* Do not include the body part in the output data stream.
*/
data->set.opt_no_body = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ if(data->set.opt_no_body)
+ /* in HTTP lingo, no body means using the HEAD request... */
+ data->set.method = HTTPREQ_HEAD;
+ else if(data->set.method == HTTPREQ_HEAD)
+ data->set.method = HTTPREQ_GET;
break;
case CURLOPT_FAILONERROR:
/*
@@ -261,13 +297,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.upload = (0 != va_arg(param, long)) ? TRUE : FALSE;
if(data->set.upload) {
/* If this is HTTP, PUT is what's needed to "upload" */
- data->set.httpreq = HTTPREQ_PUT;
+ data->set.method = HTTPREQ_PUT;
data->set.opt_no_body = FALSE; /* this is implied */
}
else
/* In HTTP, the opposite of upload is GET (unless NOBODY is true as
then this can be changed to HEAD later on) */
- data->set.httpreq = HTTPREQ_GET;
+ data->set.method = HTTPREQ_GET;
break;
case CURLOPT_REQUEST_TARGET:
result = Curl_setstropt(&data->set.str[STRING_TARGET],
@@ -363,7 +399,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
break;
case CURLOPT_SSLVERSION:
+#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLVERSION:
+#endif
/*
* Set explicit SSL version to try to connect with, as some SSL
* implementations are lame.
@@ -371,9 +409,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
#ifdef USE_SSL
{
long version, version_max;
- struct ssl_primary_config *primary = (option == CURLOPT_SSLVERSION ?
- &data->set.ssl.primary :
- &data->set.proxy_ssl.primary);
+ struct ssl_primary_config *primary = &data->set.ssl.primary;
+#ifndef CURL_DISABLE_PROXY
+ if(option != CURLOPT_SSLVERSION)
+ primary = &data->set.proxy_ssl.primary;
+#endif
arg = va_arg(param, long);
@@ -390,104 +430,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
primary->version_max = version_max;
}
#else
- result = CURLE_UNKNOWN_OPTION;
+ result = CURLE_NOT_BUILT_IN;
#endif
break;
-#ifndef CURL_DISABLE_HTTP
- case CURLOPT_AUTOREFERER:
- /*
- * Switch on automatic referer that gets set if curl follows locations.
- */
- data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_ACCEPT_ENCODING:
- /*
- * String to use at the value of Accept-Encoding header.
- *
- * If the encoding is set to "" we use an Accept-Encoding header that
- * encompasses all the encodings we support.
- * If the encoding is set to NULL we don't send an Accept-Encoding header
- * and ignore an received Content-Encoding header.
- *
- */
- argptr = va_arg(param, char *);
- if(argptr && !*argptr) {
- argptr = Curl_all_content_encodings();
- if(!argptr)
- result = CURLE_OUT_OF_MEMORY;
- else {
- result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
- free(argptr);
- }
- }
- else
- result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
- break;
-
- case CURLOPT_TRANSFER_ENCODING:
- data->set.http_transfer_encoding = (0 != va_arg(param, long)) ?
- TRUE : FALSE;
- break;
-
- case CURLOPT_FOLLOWLOCATION:
- /*
- * Follow Location: header hints on a HTTP-server.
- */
- data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_UNRESTRICTED_AUTH:
- /*
- * Send authentication (user+password) when following locations, even when
- * hostname changed.
- */
- data->set.allow_auth_to_other_hosts =
- (0 != va_arg(param, long)) ? TRUE : FALSE;
- break;
-
- case CURLOPT_MAXREDIRS:
- /*
- * The maximum amount of hops you allow curl to follow Location:
- * headers. This should mostly be used to detect never-ending loops.
- */
- arg = va_arg(param, long);
- if(arg < -1)
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.maxredirs = arg;
- break;
-
- case CURLOPT_POSTREDIR:
- /*
- * Set the behaviour of POST when redirecting
- * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
- * CURL_REDIR_POST_301 - POST is kept as POST after 301
- * CURL_REDIR_POST_302 - POST is kept as POST after 302
- * CURL_REDIR_POST_303 - POST is kept as POST after 303
- * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
- * other - POST is kept as POST after 301 and 302
- */
- arg = va_arg(param, long);
- if(arg < CURL_REDIR_GET_ALL)
- /* no return error on too high numbers since the bitmask could be
- extended in a future */
- return CURLE_BAD_FUNCTION_ARGUMENT;
- data->set.keep_post = arg & CURL_REDIR_POST_ALL;
- break;
-
- case CURLOPT_POST:
- /* Does this option serve a purpose anymore? Yes it does, when
- CURLOPT_POSTFIELDS isn't used and the POST data is read off the
- callback! */
- if(va_arg(param, long)) {
- data->set.httpreq = HTTPREQ_POST;
- data->set.opt_no_body = FALSE; /* this is implied */
- }
- else
- data->set.httpreq = HTTPREQ_GET;
- break;
-
+ /* MQTT "borrows" some of the HTTP options */
+#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT)
case CURLOPT_COPYPOSTFIELDS:
/*
* A string with POST data. Makes curl HTTP POST. Even if it is NULL.
@@ -532,7 +480,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
}
data->set.postfields = data->set.str[STRING_COPYPOSTFIELDS];
- data->set.httpreq = HTTPREQ_POST;
+ data->set.method = HTTPREQ_POST;
break;
case CURLOPT_POSTFIELDS:
@@ -542,7 +490,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.postfields = va_arg(param, void *);
/* Release old copied data. */
(void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
- data->set.httpreq = HTTPREQ_POST;
+ data->set.method = HTTPREQ_POST;
break;
case CURLOPT_POSTFIELDSIZE:
@@ -582,13 +530,107 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.postfieldsize = bigsize;
break;
+#endif
+#ifndef CURL_DISABLE_HTTP
+ case CURLOPT_AUTOREFERER:
+ /*
+ * Switch on automatic referer that gets set if curl follows locations.
+ */
+ data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_ACCEPT_ENCODING:
+ /*
+ * String to use at the value of Accept-Encoding header.
+ *
+ * If the encoding is set to "" we use an Accept-Encoding header that
+ * encompasses all the encodings we support.
+ * If the encoding is set to NULL we don't send an Accept-Encoding header
+ * and ignore an received Content-Encoding header.
+ *
+ */
+ argptr = va_arg(param, char *);
+ if(argptr && !*argptr) {
+ argptr = Curl_all_content_encodings();
+ if(!argptr)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
+ free(argptr);
+ }
+ }
+ else
+ result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr);
+ break;
+
+ case CURLOPT_TRANSFER_ENCODING:
+ data->set.http_transfer_encoding = (0 != va_arg(param, long)) ?
+ TRUE : FALSE;
+ break;
+
+ case CURLOPT_FOLLOWLOCATION:
+ /*
+ * Follow Location: header hints on a HTTP-server.
+ */
+ data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_UNRESTRICTED_AUTH:
+ /*
+ * Send authentication (user+password) when following locations, even when
+ * hostname changed.
+ */
+ data->set.allow_auth_to_other_hosts =
+ (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
+
+ case CURLOPT_MAXREDIRS:
+ /*
+ * The maximum amount of hops you allow curl to follow Location:
+ * headers. This should mostly be used to detect never-ending loops.
+ */
+ arg = va_arg(param, long);
+ if(arg < -1)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.maxredirs = arg;
+ break;
+
+ case CURLOPT_POSTREDIR:
+ /*
+ * Set the behaviour of POST when redirecting
+ * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
+ * CURL_REDIR_POST_301 - POST is kept as POST after 301
+ * CURL_REDIR_POST_302 - POST is kept as POST after 302
+ * CURL_REDIR_POST_303 - POST is kept as POST after 303
+ * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
+ * other - POST is kept as POST after 301 and 302
+ */
+ arg = va_arg(param, long);
+ if(arg < CURL_REDIR_GET_ALL)
+ /* no return error on too high numbers since the bitmask could be
+ extended in a future */
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+ data->set.keep_post = arg & CURL_REDIR_POST_ALL;
+ break;
+
+ case CURLOPT_POST:
+ /* Does this option serve a purpose anymore? Yes it does, when
+ CURLOPT_POSTFIELDS isn't used and the POST data is read off the
+ callback! */
+ if(va_arg(param, long)) {
+ data->set.method = HTTPREQ_POST;
+ data->set.opt_no_body = FALSE; /* this is implied */
+ }
+ else
+ data->set.method = HTTPREQ_GET;
+ break;
case CURLOPT_HTTPPOST:
/*
* Set to make us do HTTP POST
*/
data->set.httppost = va_arg(param, struct curl_httppost *);
- data->set.httpreq = HTTPREQ_POST_FORM;
+ data->set.method = HTTPREQ_POST_FORM;
data->set.opt_no_body = FALSE; /* this is implied */
break;
#endif /* CURL_DISABLE_HTTP */
@@ -600,7 +642,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_mime_set_subparts(&data->set.mimepost,
va_arg(param, curl_mime *), FALSE);
if(!result) {
- data->set.httpreq = HTTPREQ_POST_MIME;
+ data->set.method = HTTPREQ_POST_MIME;
data->set.opt_no_body = FALSE; /* this is implied */
}
break;
@@ -680,6 +722,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
argptr = (char *)va_arg(param, void *);
if(argptr) {
struct curl_slist *cl;
+ /* general protection against mistakes and abuse */
+ if(strlen(argptr) > CURL_MAX_INPUT_LENGTH)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
/* append the cookie file name to the list of file names, and deal with
them later */
cl = curl_slist_append(data->change.cookielist, argptr);
@@ -764,6 +809,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
/* if cookie engine was not running, activate it */
data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
+ /* general protection against mistakes and abuse */
+ if(strlen(argptr) > CURL_MAX_INPUT_LENGTH)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
argptr = strdup(argptr);
if(!argptr || !data->cookies) {
result = CURLE_OUT_OF_MEMORY;
@@ -795,7 +843,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* Set to force us do HTTP GET
*/
if(va_arg(param, long)) {
- data->set.httpreq = HTTPREQ_GET;
+ data->set.method = HTTPREQ_GET;
data->set.upload = FALSE; /* switch off upload */
data->set.opt_no_body = FALSE; /* this is implied */
}
@@ -905,7 +953,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
va_arg(param, char *));
/* we don't set
- data->set.httpreq = HTTPREQ_CUSTOM;
+ data->set.method = HTTPREQ_CUSTOM;
here, we continue as if we were using the already set type
and this just changes the actual request keyword */
break;
@@ -1029,7 +1077,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
break;
default:
/* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
+ result = CURLE_BAD_FUNCTION_ARGUMENT;
break;
}
break;
@@ -1182,21 +1230,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* An FTP/SFTP option that modifies an upload to create missing
* directories on the server.
*/
- switch(va_arg(param, long)) {
- case 0:
- data->set.ftp_create_missing_dirs = 0;
- break;
- case 1:
- data->set.ftp_create_missing_dirs = 1;
- break;
- case 2:
- data->set.ftp_create_missing_dirs = 2;
- break;
- default:
- /* reserve other values for future use */
- result = CURLE_UNKNOWN_OPTION;
- break;
- }
+ arg = va_arg(param, long);
+ /* reserve other values for future use */
+ if((arg < CURLFTP_CREATE_DIR_NONE) ||
+ (arg > CURLFTP_CREATE_DIR_RETRY))
+ result = CURLE_BAD_FUNCTION_ARGUMENT;
+ else
+ data->set.ftp_create_missing_dirs = (int)arg;
break;
case CURLOPT_READDATA:
/*
@@ -1606,6 +1646,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_CERT_ORIG],
va_arg(param, char *));
break;
+ case CURLOPT_SSLCERT_BLOB:
+ /*
+ * Blob that holds file name of the SSL certificate to use
+ */
+ result = Curl_setblobopt(&data->set.blobs[BLOB_CERT_ORIG],
+ va_arg(param, struct curl_blob *));
+ break;
#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLCERT:
/*
@@ -1614,6 +1661,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_CERT_PROXY],
va_arg(param, char *));
break;
+ case CURLOPT_PROXY_SSLCERT_BLOB:
+ /*
+ * Blob that holds file name of the SSL certificate to use for proxy
+ */
+ result = Curl_setblobopt(&data->set.blobs[BLOB_CERT_PROXY],
+ va_arg(param, struct curl_blob *));
+ break;
#endif
case CURLOPT_SSLCERTTYPE:
/*
@@ -1638,6 +1692,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_ORIG],
va_arg(param, char *));
break;
+ case CURLOPT_SSLKEY_BLOB:
+ /*
+ * Blob that holds file name of the SSL key to use
+ */
+ result = Curl_setblobopt(&data->set.blobs[BLOB_KEY_ORIG],
+ va_arg(param, struct curl_blob *));
+ break;
#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSLKEY:
/*
@@ -1646,6 +1707,13 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_KEY_PROXY],
va_arg(param, char *));
break;
+ case CURLOPT_PROXY_SSLKEY_BLOB:
+ /*
+ * Blob that holds file name of the SSL key to use for proxy
+ */
+ result = Curl_setblobopt(&data->set.blobs[BLOB_KEY_PROXY],
+ va_arg(param, struct curl_blob *));
+ break;
#endif
case CURLOPT_SSLKEYTYPE:
/*
@@ -1970,6 +2038,30 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT_ORIG],
va_arg(param, char *));
break;
+ case CURLOPT_ISSUERCERT_BLOB:
+ /*
+ * Blob that holds Issuer certificate to check certificates issuer
+ */
+ result = Curl_setblobopt(&data->set.blobs[BLOB_SSL_ISSUERCERT_ORIG],
+ va_arg(param, struct curl_blob *));
+ break;
+#ifndef CURL_DISABLE_PROXY
+ case CURLOPT_PROXY_ISSUERCERT:
+ /*
+ * Set Issuer certificate file
+ * to check certificates issuer
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT_PROXY],
+ va_arg(param, char *));
+ break;
+ case CURLOPT_PROXY_ISSUERCERT_BLOB:
+ /*
+ * Blob that holds Issuer certificate to check certificates issuer
+ */
+ result = Curl_setblobopt(&data->set.blobs[BLOB_SSL_ISSUERCERT_PROXY],
+ va_arg(param, struct curl_blob *));
+ break;
+#endif
#ifndef CURL_DISABLE_TELNET
case CURLOPT_TELNETOPTIONS:
/*
@@ -1983,6 +2075,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* The application kindly asks for a differently sized receive buffer.
* If it seems reasonable, we'll use it.
*/
+ if(data->state.buffer)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
arg = va_arg(param, long);
if(arg > READBUFFER_MAX)
@@ -1992,18 +2087,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
else if(arg < READBUFFER_MIN)
arg = READBUFFER_MIN;
- /* Resize if new size */
- if(arg != data->set.buffer_size) {
- char *newbuff = realloc(data->state.buffer, arg + 1);
- if(!newbuff) {
- DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
- result = CURLE_OUT_OF_MEMORY;
- }
- else
- data->state.buffer = newbuff;
- }
data->set.buffer_size = arg;
-
break;
case CURLOPT_UPLOAD_BUFFERSIZE:
@@ -2133,6 +2217,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.ssl.enable_beast =
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+ data->set.ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
+ data->set.ssl.revoke_best_effort = !!(arg & CURLSSLOPT_REVOKE_BEST_EFFORT);
+ data->set.ssl.native_ca_store = !!(arg & CURLSSLOPT_NATIVE_CA);
break;
#ifndef CURL_DISABLE_PROXY
@@ -2141,9 +2228,21 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.proxy_ssl.enable_beast =
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
+ data->set.proxy_ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
+ data->set.proxy_ssl.native_ca_store = !!(arg & CURLSSLOPT_NATIVE_CA);
+ data->set.proxy_ssl.revoke_best_effort =
+ !!(arg & CURLSSLOPT_REVOKE_BEST_EFFORT);
break;
#endif
+ case CURLOPT_SSL_EC_CURVES:
+ /*
+ * Set accepted curves in SSL connection setup.
+ * Specify colon-delimited list of curve algorithm names.
+ */
+ result = Curl_setstropt(&data->set.str[STRING_SSL_EC_CURVES],
+ va_arg(param, char *));
+ break;
#endif
case CURLOPT_IPRESOLVE:
arg = va_arg(param, long);
@@ -2243,7 +2342,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_SSL_SESSIONID_CACHE:
data->set.ssl.primary.sessionid = (0 != va_arg(param, long)) ?
TRUE : FALSE;
+#ifndef CURL_DISABLE_PROXY
data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid;
+#endif
break;
#ifdef USE_SSH
@@ -2286,7 +2387,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_SSH_KEYFUNCTION:
/* setting to NULL is fine since the ssh.c functions themselves will
- then rever to use the internal default */
+ then revert to use the internal default */
data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback);
break;
@@ -2389,6 +2490,10 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
/* Set the list of mail recipients */
data->set.mail_rcpt = va_arg(param, struct curl_slist *);
break;
+ case CURLOPT_MAIL_RCPT_ALLLOWFAILS:
+ /* allow RCPT TO command to fail for some recipients */
+ data->set.mail_rcpt_allowfails = (0 != va_arg(param, long)) ? TRUE : FALSE;
+ break;
#endif
case CURLOPT_SASL_AUTHZID:
@@ -2408,9 +2513,9 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
* Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...)
* Would this be better if the RTSPREQ_* were just moved into here?
*/
- long curl_rtspreq = va_arg(param, long);
+ long in_rtspreq = va_arg(param, long);
Curl_RtspReq rtspreq = RTSPREQ_NONE;
- switch(curl_rtspreq) {
+ switch(in_rtspreq) {
case CURL_RTSPREQ_OPTIONS:
rtspreq = RTSPREQ_OPTIONS;
break;
@@ -2541,9 +2646,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_PROXY_TLSAUTH_USERNAME:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY],
va_arg(param, char *));
+#ifndef CURL_DISABLE_PROXY
if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
!data->set.proxy_ssl.authtype)
data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
+#endif
break;
case CURLOPT_TLSAUTH_PASSWORD:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_ORIG],
@@ -2554,9 +2661,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
case CURLOPT_PROXY_TLSAUTH_PASSWORD:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY],
va_arg(param, char *));
+#ifndef CURL_DISABLE_PROXY
if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
!data->set.proxy_ssl.authtype)
data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
+#endif
break;
case CURLOPT_TLSAUTH_TYPE:
argptr = va_arg(param, char *);
@@ -2566,6 +2675,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
else
data->set.ssl.authtype = CURL_TLSAUTH_NONE;
break;
+#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_TLSAUTH_TYPE:
argptr = va_arg(param, char *);
if(!argptr ||
@@ -2575,18 +2685,35 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
break;
#endif
+#endif
#ifdef USE_ARES
case CURLOPT_DNS_SERVERS:
- result = Curl_set_dns_servers(data, va_arg(param, char *));
+ result = Curl_setstropt(&data->set.str[STRING_DNS_SERVERS],
+ va_arg(param, char *));
+ if(result)
+ return result;
+ result = Curl_set_dns_servers(data, data->set.str[STRING_DNS_SERVERS]);
break;
case CURLOPT_DNS_INTERFACE:
- result = Curl_set_dns_interface(data, va_arg(param, char *));
+ result = Curl_setstropt(&data->set.str[STRING_DNS_INTERFACE],
+ va_arg(param, char *));
+ if(result)
+ return result;
+ result = Curl_set_dns_interface(data, data->set.str[STRING_DNS_INTERFACE]);
break;
case CURLOPT_DNS_LOCAL_IP4:
- result = Curl_set_dns_local_ip4(data, va_arg(param, char *));
+ result = Curl_setstropt(&data->set.str[STRING_DNS_LOCAL_IP4],
+ va_arg(param, char *));
+ if(result)
+ return result;
+ result = Curl_set_dns_local_ip4(data, data->set.str[STRING_DNS_LOCAL_IP4]);
break;
case CURLOPT_DNS_LOCAL_IP6:
- result = Curl_set_dns_local_ip6(data, va_arg(param, char *));
+ result = Curl_setstropt(&data->set.str[STRING_DNS_LOCAL_IP6],
+ va_arg(param, char *));
+ if(result)
+ return result;
+ result = Curl_set_dns_local_ip6(data, data->set.str[STRING_DNS_LOCAL_IP6]);
break;
#endif
case CURLOPT_TCP_KEEPALIVE:
@@ -2612,14 +2739,12 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param)
result = CURLE_NOT_BUILT_IN;
#endif
break;
-#ifdef USE_NGHTTP2
case CURLOPT_SSL_ENABLE_NPN:
data->set.ssl_enable_npn = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
case CURLOPT_SSL_ENABLE_ALPN:
data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE;
break;
-#endif
#ifdef USE_UNIX_SOCKETS
case CURLOPT_UNIX_SOCKET_PATH:
data->set.abstract_unix_socket = FALSE;
diff --git a/lib/setopt.h b/lib/setopt.h
index 5e347dd66..5fc4368dc 100644
--- a/lib/setopt.h
+++ b/lib/setopt.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,8 @@
***************************************************************************/
CURLcode Curl_setstropt(char **charp, const char *s);
+CURLcode Curl_setblobopt(struct curl_blob **blobp,
+ const struct curl_blob *blob);
CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list arg);
#endif /* HEADER_CURL_SETOPT_H */
diff --git a/lib/setup-os400.h b/lib/setup-os400.h
index 629fd94c4..b693cb3b3 100644
--- a/lib/setup-os400.h
+++ b/lib/setup-os400.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -200,10 +200,10 @@ extern OM_uint32 Curl_gss_delete_sec_context_a(OM_uint32 * minor_status,
/* Some socket functions must be wrapped to process textual addresses
like AF_UNIX. */
-extern int Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen);
-extern int Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen);
+extern int Curl_os400_connect(int sd, struct sockaddr *destaddr, int addrlen);
+extern int Curl_os400_bind(int sd, struct sockaddr *localaddr, int addrlen);
extern int Curl_os400_sendto(int sd, char *buffer, int buflen, int flags,
- struct sockaddr * dstaddr, int addrlen);
+ struct sockaddr *dstaddr, int addrlen);
extern int Curl_os400_recvfrom(int sd, char *buffer, int buflen, int flags,
struct sockaddr *fromaddr, int *addrlen);
extern int Curl_os400_getpeername(int sd, struct sockaddr *addr, int *addrlen);
diff --git a/lib/setup-vms.h b/lib/setup-vms.h
index 6c454aee6..0e39c9f6b 100644
--- a/lib/setup-vms.h
+++ b/lib/setup-vms.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -73,7 +73,7 @@ char *decc$getenv(const char *__name);
# endif
#endif
- struct passwd * decc_getpwuid(uid_t uid);
+ struct passwd *decc_getpwuid(uid_t uid);
#ifdef __DECC
# if __INITIAL_POINTER_SIZE == 32
@@ -138,9 +138,9 @@ static char *vms_getenv(const char *envvar)
static struct passwd vms_passwd_cache;
-static struct passwd * vms_getpwuid(uid_t uid)
+static struct passwd *vms_getpwuid(uid_t uid)
{
- struct passwd * my_passwd;
+ struct passwd *my_passwd;
/* Hack needed to support 64 bit builds, decc_getpwnam is 32 bit only */
#ifdef __DECC
diff --git a/lib/setup-win32.h b/lib/setup-win32.h
new file mode 100644
index 000000000..d20662aa1
--- /dev/null
+++ b/lib/setup-win32.h
@@ -0,0 +1,122 @@
+#ifndef HEADER_CURL_SETUP_WIN32_H
+#define HEADER_CURL_SETUP_WIN32_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/*
+ * Include header files for windows builds before redefining anything.
+ * Use this preprocessor block only to include or exclude windows.h,
+ * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs
+ * to any other further and independent block. Under Cygwin things work
+ * just as under linux (e.g. <sys/socket.h>) and the winsock headers should
+ * never be included when __CYGWIN__ is defined. configure script takes
+ * care of this, not defining HAVE_WINDOWS_H, HAVE_WINSOCK_H, HAVE_WINSOCK2_H,
+ * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined.
+ */
+
+#ifdef HAVE_WINDOWS_H
+# if defined(UNICODE) && !defined(_UNICODE)
+# define _UNICODE
+# endif
+# if defined(_UNICODE) && !defined(UNICODE)
+# define UNICODE
+# endif
+# include <winerror.h>
+# include <windows.h>
+# ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+# ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+# endif
+# else
+# ifdef HAVE_WINSOCK_H
+# include <winsock.h>
+# endif
+# endif
+# include <tchar.h>
+# ifdef UNICODE
+ typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str);
+# endif
+#endif
+
+/*
+ * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else
+ * undefine USE_WINSOCK.
+ */
+
+#undef USE_WINSOCK
+
+#ifdef HAVE_WINSOCK2_H
+# define USE_WINSOCK 2
+#else
+# ifdef HAVE_WINSOCK_H
+# error "WinSock version 1 is no longer supported, version 2 is required!"
+# endif
+#endif
+
+/*
+ * Define _WIN32_WINNT_[OS] symbols because not all Windows build systems have
+ * those symbols to compare against, and even those that do may be missing
+ * newer symbols.
+ */
+
+#ifndef _WIN32_WINNT_NT4
+#define _WIN32_WINNT_NT4 0x0400 /* Windows NT 4.0 */
+#endif
+#ifndef _WIN32_WINNT_WIN2K
+#define _WIN32_WINNT_WIN2K 0x0500 /* Windows 2000 */
+#endif
+#ifndef _WIN32_WINNT_WINXP
+#define _WIN32_WINNT_WINXP 0x0501 /* Windows XP */
+#endif
+#ifndef _WIN32_WINNT_WS03
+#define _WIN32_WINNT_WS03 0x0502 /* Windows Server 2003 */
+#endif
+#ifndef _WIN32_WINNT_WIN6
+#define _WIN32_WINNT_WIN6 0x0600 /* Windows Vista */
+#endif
+#ifndef _WIN32_WINNT_VISTA
+#define _WIN32_WINNT_VISTA 0x0600 /* Windows Vista */
+#endif
+#ifndef _WIN32_WINNT_WS08
+#define _WIN32_WINNT_WS08 0x0600 /* Windows Server 2008 */
+#endif
+#ifndef _WIN32_WINNT_LONGHORN
+#define _WIN32_WINNT_LONGHORN 0x0600 /* Windows Vista */
+#endif
+#ifndef _WIN32_WINNT_WIN7
+#define _WIN32_WINNT_WIN7 0x0601 /* Windows 7 */
+#endif
+#ifndef _WIN32_WINNT_WIN8
+#define _WIN32_WINNT_WIN8 0x0602 /* Windows 8 */
+#endif
+#ifndef _WIN32_WINNT_WINBLUE
+#define _WIN32_WINNT_WINBLUE 0x0603 /* Windows 8.1 */
+#endif
+#ifndef _WIN32_WINNT_WINTHRESHOLD
+#define _WIN32_WINNT_WINTHRESHOLD 0x0A00 /* Windows 10 */
+#endif
+#ifndef _WIN32_WINNT_WIN10
+#define _WIN32_WINNT_WIN10 0x0A00 /* Windows 10 */
+#endif
+
+#endif /* HEADER_CURL_SETUP_WIN32_H */
diff --git a/lib/sha256.c b/lib/sha256.c
index f9287af23..ee5d273c4 100644
--- a/lib/sha256.c
+++ b/lib/sha256.c
@@ -5,7 +5,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2017, Florin Petriuc, <petriuc.florin@gmail.com>
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,16 +36,210 @@
#define USE_OPENSSL_SHA256
#endif
+#endif /* USE_OPENSSL */
+
+#ifdef USE_MBEDTLS
+#include <mbedtls/version.h>
+
+#if(MBEDTLS_VERSION_NUMBER >= 0x02070000)
+ #define HAS_RESULT_CODE_BASED_FUNCTIONS
#endif
+#endif /* USE_MBEDTLS */
+
+/* Please keep the SSL backend-specific #if branches in this order:
+ *
+ * 1. USE_OPENSSL
+ * 2. USE_GNUTLS_NETTLE
+ * 3. USE_GNUTLS
+ * 4. USE_MBEDTLS
+ * 5. USE_COMMON_CRYPTO
+ * 6. USE_WIN32_CRYPTO
+ *
+ * This ensures that the same SSL branch gets activated throughout this source
+ * file even if multiple backends are enabled at the same time.
+ */
+
+#if defined(USE_OPENSSL_SHA256)
-#ifdef USE_OPENSSL_SHA256
/* When OpenSSL is available we use the SHA256-function from OpenSSL */
#include <openssl/sha.h>
+
+#elif defined(USE_GNUTLS_NETTLE)
+
+#include <nettle/sha.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef struct sha256_ctx SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+ sha256_init(ctx);
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+ sha256_update(ctx, length, data);
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+ sha256_digest(ctx, SHA256_DIGEST_SIZE, digest);
+}
+
+#elif defined(USE_GNUTLS)
+
+#include <gcrypt.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef gcry_md_hd_t SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+ gcry_md_open(ctx, GCRY_MD_SHA256, 0);
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+ gcry_md_write(*ctx, data, length);
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+ memcpy(digest, gcry_md_read(*ctx, 0), SHA256_DIGEST_LENGTH);
+ gcry_md_close(*ctx);
+}
+
+#elif defined(USE_MBEDTLS)
+
+#include <mbedtls/sha256.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef mbedtls_sha256_context SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+#if !defined(HAS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_sha256_starts(ctx, 0);
+#else
+ (void) mbedtls_sha256_starts_ret(ctx, 0);
+#endif
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+#if !defined(HAS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_sha256_update(ctx, data, length);
+#else
+ (void) mbedtls_sha256_update_ret(ctx, data, length);
+#endif
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+#if !defined(HAS_RESULT_CODE_BASED_FUNCTIONS)
+ mbedtls_sha256_finish(ctx, digest);
+#else
+ (void) mbedtls_sha256_finish_ret(ctx, digest);
+#endif
+}
+
+#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \
+ (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \
+ (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
+ (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000))
+
+#include <CommonCrypto/CommonDigest.h>
+
+#include "curl_memory.h"
+
+/* The last #include file should be: */
+#include "memdebug.h"
+
+typedef CC_SHA256_CTX SHA256_CTX;
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+ (void) CC_SHA256_Init(ctx);
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+ (void) CC_SHA256_Update(ctx, data, length);
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+ (void) CC_SHA256_Final(digest, ctx);
+}
+
+#elif defined(USE_WIN32_CRYPTO)
+
+#include <wincrypt.h>
+
+struct sha256_ctx {
+ HCRYPTPROV hCryptProv;
+ HCRYPTHASH hHash;
+};
+typedef struct sha256_ctx SHA256_CTX;
+
+#if !defined(CALG_SHA_256)
+#define CALG_SHA_256 0x0000800c
+#endif
+
+static void SHA256_Init(SHA256_CTX *ctx)
+{
+ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_AES,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+ CryptCreateHash(ctx->hCryptProv, CALG_SHA_256, 0, 0, &ctx->hHash);
+ }
+}
+
+static void SHA256_Update(SHA256_CTX *ctx,
+ const unsigned char *data,
+ unsigned int length)
+{
+ CryptHashData(ctx->hHash, (unsigned char *) data, length, 0);
+}
+
+static void SHA256_Final(unsigned char *digest, SHA256_CTX *ctx)
+{
+ unsigned long length = 0;
+
+ CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
+ if(length == SHA256_DIGEST_LENGTH)
+ CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0);
+
+ if(ctx->hHash)
+ CryptDestroyHash(ctx->hHash);
+
+ if(ctx->hCryptProv)
+ CryptReleaseContext(ctx->hCryptProv, 0);
+}
+
#else
/* When no other crypto library is available we use this code segment */
-/* ===== start - public domain SHA256 implementation ===== */
/* This is based on SHA256 implementation in LibTomCrypt that was released into
* public domain by Tom St Denis. */
@@ -86,7 +281,7 @@ do { \
} while(0)
#endif
-typedef struct sha256_state {
+struct sha256_state {
#ifdef HAVE_LONGLONG
unsigned long long length;
#else
@@ -94,8 +289,10 @@ typedef struct sha256_state {
#endif
unsigned long state[8], curlen;
unsigned char buf[64];
-} SHA256_CTX;
-/* the K array */
+};
+typedef struct sha256_state SHA256_CTX;
+
+/* The K array */
static const unsigned long K[64] = {
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
@@ -111,6 +308,7 @@ static const unsigned long K[64] = {
0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
};
+
/* Various logical functions */
#define RORc(x, y) \
(((((unsigned long)(x) & 0xFFFFFFFFUL) >> (unsigned long)((y) & 31)) | \
@@ -123,13 +321,15 @@ static const unsigned long K[64] = {
#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
-/* compress 512-bits */
+
+/* Compress 512-bits */
static int sha256_compress(struct sha256_state *md,
unsigned char *buf)
{
unsigned long S[8], W[64];
int i;
- /* copy state into S */
+
+ /* Copy state into S */
for(i = 0; i < 8; i++) {
S[i] = md->state[i];
}
@@ -141,6 +341,7 @@ static int sha256_compress(struct sha256_state *md,
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
W[i - 16];
}
+
/* Compress */
#define RND(a,b,c,d,e,f,g,h,i) \
unsigned long t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
@@ -153,12 +354,15 @@ static int sha256_compress(struct sha256_state *md,
t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
}
- /* feedback */
+
+ /* Feedback */
for(i = 0; i < 8; i++) {
md->state[i] = md->state[i] + S[i];
}
+
return 0;
}
+
/* Initialize the hash state */
static void SHA256_Init(struct sha256_state *md)
{
@@ -173,7 +377,8 @@ static void SHA256_Init(struct sha256_state *md)
md->state[6] = 0x1F83D9ABUL;
md->state[7] = 0x5BE0CD19UL;
}
-/**
+
+/*
Process a block of memory though the hash
@param md The hash state
@param in The data to hash
@@ -185,6 +390,7 @@ static int SHA256_Update(struct sha256_state *md,
unsigned long inlen)
{
unsigned long n;
+
#define block_size 64
if(md->curlen > sizeof(md->buf))
return -1;
@@ -210,9 +416,11 @@ static int SHA256_Update(struct sha256_state *md,
}
}
}
+
return 0;
}
-/**
+
+/*
Terminate the hash to get the digest
@param md The hash state
@param out [out] The destination of the hash (32 bytes)
@@ -222,13 +430,17 @@ static int SHA256_Final(unsigned char *out,
struct sha256_state *md)
{
int i;
+
if(md->curlen >= sizeof(md->buf))
return -1;
- /* increase the length of the message */
+
+ /* Increase the length of the message */
md->length += md->curlen * 8;
- /* append the '1' bit */
+
+ /* Append the '1' bit */
md->buf[md->curlen++] = (unsigned char)0x80;
- /* if the length is currently above 56 bytes we append zeros
+
+ /* If the length is currently above 56 bytes we append zeros
* then compress. Then we can fall back to padding zeros and length
* encoding like normal.
*/
@@ -239,29 +451,44 @@ static int SHA256_Final(unsigned char *out,
sha256_compress(md, md->buf);
md->curlen = 0;
}
- /* pad up to 56 bytes of zeroes */
+
+ /* Pad up to 56 bytes of zeroes */
while(md->curlen < 56) {
md->buf[md->curlen++] = (unsigned char)0;
}
- /* store length */
+
+ /* Store length */
WPA_PUT_BE64(md->buf + 56, md->length);
sha256_compress(md, md->buf);
- /* copy output */
+
+ /* Copy output */
for(i = 0; i < 8; i++)
WPA_PUT_BE32(out + (4 * i), md->state[i]);
+
return 0;
}
-/* ===== end - public domain SHA256 implementation ===== */
-#endif
+#endif /* CRYPTO LIBS */
-void Curl_sha256it(unsigned char *outbuffer, /* 32 unsigned chars */
- const unsigned char *input)
+/*
+ * Curl_sha256it()
+ *
+ * Generates a SHA256 hash for the given input data.
+ *
+ * Parameters:
+ *
+ * output [in/out] - The output buffer.
+ * input [in] - The input data.
+ * length [in] - The input length.
+ */
+void Curl_sha256it(unsigned char *output, const unsigned char *input,
+ const size_t length)
{
SHA256_CTX ctx;
+
SHA256_Init(&ctx);
- SHA256_Update(&ctx, input, curlx_uztoui(strlen((char *)input)));
- SHA256_Final(outbuffer, &ctx);
+ SHA256_Update(&ctx, input, curlx_uztoui(length));
+ SHA256_Final(output, &ctx);
}
#endif /* CURL_DISABLE_CRYPTO_AUTH */
diff --git a/lib/share.c b/lib/share.c
index 3d5108610..407ac3453 100644
--- a/lib/share.c
+++ b/lib/share.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,7 +70,7 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
case CURLSHOPT_SHARE:
/* this is a type this share will share */
type = va_arg(param, int);
- share->specifier |= (1<<type);
+
switch(type) {
case CURL_LOCK_DATA_DNS:
break;
@@ -92,7 +92,7 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
if(!share->sslsession) {
share->max_ssl_sessions = 8;
share->sslsession = calloc(share->max_ssl_sessions,
- sizeof(struct curl_ssl_session));
+ sizeof(struct Curl_ssl_session));
share->sessionage = 0;
if(!share->sslsession)
res = CURLSHE_NOMEM;
@@ -102,7 +102,7 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
#endif
break;
- case CURL_LOCK_DATA_CONNECT: /* not supported (yet) */
+ case CURL_LOCK_DATA_CONNECT:
if(Curl_conncache_init(&share->conn_cache, 103))
res = CURLSHE_NOMEM;
break;
@@ -116,6 +116,8 @@ curl_share_setopt(struct Curl_share *share, CURLSHoption option, ...)
default:
res = CURLSHE_BAD_OPTION;
}
+ if(!res)
+ share->specifier |= (1<<type);
break;
case CURLSHOPT_UNSHARE:
diff --git a/lib/share.h b/lib/share.h
index a7dea41ad..aa964b6cc 100644
--- a/lib/share.h
+++ b/lib/share.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,7 +46,7 @@ struct Curl_share {
curl_unlock_function unlockfunc;
void *clientdata;
struct conncache conn_cache;
- struct curl_hash hostcache;
+ struct Curl_hash hostcache;
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
struct CookieInfo *cookies;
#endif
@@ -54,7 +54,7 @@ struct Curl_share {
struct PslCache psl;
#endif
- struct curl_ssl_session *sslsession;
+ struct Curl_ssl_session *sslsession;
size_t max_ssl_sessions;
long sessionage;
};
diff --git a/lib/slist.c b/lib/slist.c
index 392b84d13..d27fbe19b 100644
--- a/lib/slist.c
+++ b/lib/slist.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/slist.h b/lib/slist.h
index d73dbf672..799b3c060 100644
--- a/lib/slist.h
+++ b/lib/slist.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/smb.c b/lib/smb.c
index 12f99257f..41d97b84c 100644
--- a/lib/smb.c
+++ b/lib/smb.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
- * Copyright (C) 2016-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2016-2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,11 +23,9 @@
#include "curl_setup.h"
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
(CURL_SIZEOF_CURL_OFF_T > 4)
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
#define BUILDING_CURL_SMB_C
#ifdef HAVE_PROCESS_H
@@ -88,6 +86,7 @@ const struct Curl_handler Curl_handler_smb = {
ZERO_NULL, /* connection_check */
PORT_SMB, /* defport */
CURLPROTO_SMB, /* protocol */
+ CURLPROTO_SMB, /* family */
PROTOPT_NONE /* flags */
};
@@ -113,6 +112,7 @@ const struct Curl_handler Curl_handler_smbs = {
ZERO_NULL, /* connection_check */
PORT_SMBS, /* defport */
CURLPROTO_SMBS, /* protocol */
+ CURLPROTO_SMB, /* family */
PROTOPT_SSL /* flags */
};
#endif
@@ -964,7 +964,7 @@ static CURLcode smb_parse_url_path(struct connectdata *conn)
/* URL decode the path */
CURLcode result = Curl_urldecode(data, data->state.up.path, 0, &path, NULL,
- TRUE);
+ REJECT_CTRL);
if(result)
return result;
@@ -996,6 +996,5 @@ static CURLcode smb_parse_url_path(struct connectdata *conn)
return CURLE_OK;
}
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */
+#endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE &&
+ CURL_SIZEOF_CURL_OFF_T > 4 */
diff --git a/lib/smb.h b/lib/smb.h
index 9ce6b5615..ff0a354b7 100644
--- a/lib/smb.h
+++ b/lib/smb.h
@@ -8,7 +8,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
- * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -193,7 +193,6 @@ struct smb_nt_create_response {
unsigned int ext_file_attributes;
curl_off_t allocation_size;
curl_off_t end_of_file;
-
} PACK;
struct smb_read {
@@ -244,16 +243,13 @@ struct smb_tree_disconnect {
#endif /* BUILDING_CURL_SMB_C */
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
(CURL_SIZEOF_CURL_OFF_T > 4)
-#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
-
extern const struct Curl_handler Curl_handler_smb;
extern const struct Curl_handler Curl_handler_smbs;
-#endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
-
-#endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */
+#endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE &&
+ CURL_SIZEOF_CURL_OFF_T > 4 */
#endif /* HEADER_CURL_SMB_H */
diff --git a/lib/smtp.c b/lib/smtp.c
index 65220b0f6..49743c036 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,6 +27,9 @@
* RFC4752 The Kerberos V5 ("GSSAPI") SASL Mechanism
* RFC4954 SMTP Authentication
* RFC5321 SMTP protocol
+ * RFC5890 Internationalized Domain Names for Applications (IDNA)
+ * RFC6531 SMTP Extension for Internationalized Email
+ * RFC6532 Internationalized Email Headers
* RFC6749 OAuth 2.0 Authorization Framework
* RFC8314 Use of TLS for Email Submission and Access
* Draft SMTP URL Interface <draft-earhart-url-smtp-00.txt>
@@ -101,6 +104,8 @@ static CURLcode smtp_setup_connection(struct connectdata *conn);
static CURLcode smtp_parse_url_options(struct connectdata *conn);
static CURLcode smtp_parse_url_path(struct connectdata *conn);
static CURLcode smtp_parse_custom_request(struct connectdata *conn);
+static CURLcode smtp_parse_address(struct connectdata *conn, const char *fqma,
+ char **address, struct hostname *host);
static CURLcode smtp_perform_auth(struct connectdata *conn, const char *mech,
const char *initresp);
static CURLcode smtp_continue_auth(struct connectdata *conn, const char *resp);
@@ -128,6 +133,7 @@ const struct Curl_handler Curl_handler_smtp = {
ZERO_NULL, /* connection_check */
PORT_SMTP, /* defport */
CURLPROTO_SMTP, /* protocol */
+ CURLPROTO_SMTP, /* family */
PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
PROTOPT_URLOPTIONS
};
@@ -155,6 +161,7 @@ const struct Curl_handler Curl_handler_smtps = {
ZERO_NULL, /* connection_check */
PORT_SMTPS, /* defport */
CURLPROTO_SMTPS, /* protocol */
+ CURLPROTO_SMTP, /* family */
PROTOPT_CLOSEACTION | PROTOPT_SSL
| PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
};
@@ -178,7 +185,7 @@ static void smtp_to_smtps(struct connectdata *conn)
conn->handler = &Curl_handler_smtps;
/* Set the connection's upgraded to TLS flag */
- conn->tls_upgraded = TRUE;
+ conn->bits.tls_upgraded = TRUE;
}
#else
#define smtp_to_smtps(x) Curl_nop_stmt
@@ -481,13 +488,55 @@ static CURLcode smtp_perform_command(struct connectdata *conn)
struct Curl_easy *data = conn->data;
struct SMTP *smtp = data->req.protop;
- /* Send the command */
- if(smtp->rcpt)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s",
- smtp->custom && smtp->custom[0] != '\0' ?
- smtp->custom : "VRFY",
- smtp->rcpt->data);
+ if(smtp->rcpt) {
+ /* We notify the server we are sending UTF-8 data if a) it supports the
+ SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in
+ either the local address or host name parts. This is regardless of
+ whether the host name is encoded using IDN ACE */
+ bool utf8 = FALSE;
+
+ if((!smtp->custom) || (!smtp->custom[0])) {
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the mailbox to verify into the local address and host name
+ parts, converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, smtp->rcpt->data,
+ &address, &host);
+ if(result)
+ return result;
+
+ /* Establish whether we should report SMTPUTF8 to the server for this
+ mailbox as per RFC-6531 sect. 3.1 point 6 */
+ utf8 = (conn->proto.smtpc.utf8_supported) &&
+ ((host.encalloc) || (!Curl_is_ASCII_name(address)) ||
+ (!Curl_is_ASCII_name(host.name)));
+
+ /* Send the VRFY command (Note: The host name part may be absent when the
+ host is a local system) */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "VRFY %s%s%s%s",
+ address,
+ host.name ? "@" : "",
+ host.name ? host.name : "",
+ utf8 ? " SMTPUTF8" : "");
+
+ Curl_free_idnconverted_hostname(&host);
+ free(address);
+ }
+ else {
+ /* Establish whether we should report that we support SMTPUTF8 for EXPN
+ commands to the server as per RFC-6531 sect. 3.1 point 6 */
+ utf8 = (conn->proto.smtpc.utf8_supported) &&
+ (!strcmp(smtp->custom, "EXPN"));
+
+ /* Send the custom recipient based command such as the EXPN command */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s%s", smtp->custom,
+ smtp->rcpt->data,
+ utf8 ? " SMTPUTF8" : "");
+ }
+ }
else
+ /* Send the non-recipient based command such as HELP */
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s",
smtp->custom && smtp->custom[0] != '\0' ?
smtp->custom : "HELP");
@@ -512,22 +561,83 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
+ /* We notify the server we are sending UTF-8 data if a) it supports the
+ SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in
+ either the local address or host name parts. This is regardless of
+ whether the host name is encoded using IDN ACE */
+ bool utf8 = FALSE;
+
/* Calculate the FROM parameter */
- if(!data->set.str[STRING_MAIL_FROM])
+ if(data->set.str[STRING_MAIL_FROM]) {
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the FROM mailbox into the local address and host name parts,
+ converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, data->set.str[STRING_MAIL_FROM],
+ &address, &host);
+ if(result)
+ return result;
+
+ /* Establish whether we should report SMTPUTF8 to the server for this
+ mailbox as per RFC-6531 sect. 3.1 point 4 and sect. 3.4 */
+ utf8 = (conn->proto.smtpc.utf8_supported) &&
+ ((host.encalloc) || (!Curl_is_ASCII_name(address)) ||
+ (!Curl_is_ASCII_name(host.name)));
+
+ if(host.name) {
+ from = aprintf("<%s@%s>", address, host.name);
+
+ Curl_free_idnconverted_hostname(&host);
+ }
+ else
+ /* An invalid mailbox was provided but we'll simply let the server worry
+ about that and reply with a 501 error */
+ from = aprintf("<%s>", address);
+
+ free(address);
+ }
+ else
/* Null reverse-path, RFC-5321, sect. 3.6.3 */
from = strdup("<>");
- else if(data->set.str[STRING_MAIL_FROM][0] == '<')
- from = aprintf("%s", data->set.str[STRING_MAIL_FROM]);
- else
- from = aprintf("<%s>", data->set.str[STRING_MAIL_FROM]);
if(!from)
return CURLE_OUT_OF_MEMORY;
/* Calculate the optional AUTH parameter */
if(data->set.str[STRING_MAIL_AUTH] && conn->proto.smtpc.sasl.authused) {
- if(data->set.str[STRING_MAIL_AUTH][0] != '\0')
- auth = aprintf("%s", data->set.str[STRING_MAIL_AUTH]);
+ if(data->set.str[STRING_MAIL_AUTH][0] != '\0') {
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the AUTH mailbox into the local address and host name parts,
+ converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, data->set.str[STRING_MAIL_AUTH],
+ &address, &host);
+ if(result) {
+ free(from);
+ return result;
+ }
+
+ /* Establish whether we should report SMTPUTF8 to the server for this
+ mailbox as per RFC-6531 sect. 3.1 point 4 and sect. 3.4 */
+ if((!utf8) && (conn->proto.smtpc.utf8_supported) &&
+ ((host.encalloc) || (!Curl_is_ASCII_name(address)) ||
+ (!Curl_is_ASCII_name(host.name))))
+ utf8 = TRUE;
+
+ if(host.name) {
+ auth = aprintf("<%s@%s>", address, host.name);
+
+ Curl_free_idnconverted_hostname(&host);
+ }
+ else
+ /* An invalid mailbox was provided but we'll simply let the server
+ worry about it */
+ auth = aprintf("<%s>", address);
+
+ free(address);
+ }
else
/* Empty AUTH, RFC-2554, sect. 5 */
auth = strdup("<>");
@@ -561,6 +671,7 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
if(result) {
free(from);
free(auth);
+
return result;
}
@@ -583,19 +694,33 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
}
}
+ /* If the mailboxes in the FROM and AUTH parameters don't include a UTF-8
+ based address then quickly scan through the recipient list and check if
+ any there do, as we need to correctly identify our support for SMTPUTF8
+ in the envelope, as per RFC-6531 sect. 3.4 */
+ if(conn->proto.smtpc.utf8_supported && !utf8) {
+ struct SMTP *smtp = data->req.protop;
+ struct curl_slist *rcpt = smtp->rcpt;
+
+ while(rcpt && !utf8) {
+ /* Does the host name contain non-ASCII characters? */
+ if(!Curl_is_ASCII_name(rcpt->data))
+ utf8 = TRUE;
+
+ rcpt = rcpt->next;
+ }
+ }
+
/* Send the MAIL command */
- if(!auth && !size)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s", from);
- else if(auth && !size)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s AUTH=%s", from, auth);
- else if(auth && size)
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s AUTH=%s SIZE=%s", from, auth, size);
- else
- result = Curl_pp_sendf(&conn->proto.smtpc.pp,
- "MAIL FROM:%s SIZE=%s", from, size);
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp,
+ "MAIL FROM:%s%s%s%s%s%s",
+ from, /* Mandatory */
+ auth ? " AUTH=" : "", /* Optional on AUTH support */
+ auth ? auth : "", /* */
+ size ? " SIZE=" : "", /* Optional on SIZE support */
+ size ? size : "", /* */
+ utf8 ? " SMTPUTF8" /* Internationalised mailbox */
+ : ""); /* included in our envelope */
free(from);
free(auth);
@@ -619,14 +744,28 @@ static CURLcode smtp_perform_rcpt_to(struct connectdata *conn)
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct SMTP *smtp = data->req.protop;
+ char *address = NULL;
+ struct hostname host = { NULL, NULL, NULL, NULL };
+
+ /* Parse the recipient mailbox into the local address and host name parts,
+ converting the host name to an IDN A-label if necessary */
+ result = smtp_parse_address(conn, smtp->rcpt->data,
+ &address, &host);
+ if(result)
+ return result;
/* Send the RCPT TO command */
- if(smtp->rcpt->data[0] == '<')
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s",
- smtp->rcpt->data);
+ if(host.name)
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s@%s>", address,
+ host.name);
else
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>",
- smtp->rcpt->data);
+ /* An invalid mailbox was provided but we'll simply let the server worry
+ about that and reply with a 501 error */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:<%s>", address);
+
+ Curl_free_idnconverted_hostname(&host);
+ free(address);
+
if(!result)
state(conn, SMTP_RCPT);
@@ -726,6 +865,10 @@ static CURLcode smtp_state_ehlo_resp(struct connectdata *conn, int smtpcode,
else if(len >= 4 && !memcmp(line, "SIZE", 4))
smtpc->size_supported = TRUE;
+ /* Does the server support the UTF-8 capability? */
+ else if(len >= 8 && !memcmp(line, "SMTPUTF8", 8))
+ smtpc->utf8_supported = TRUE;
+
/* Does the server support authentication? */
else if(len >= 5 && !memcmp(line, "AUTH ", 5)) {
smtpc->auth_supported = TRUE;
@@ -915,25 +1058,53 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn, int smtpcode,
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct SMTP *smtp = data->req.protop;
+ bool is_smtp_err = FALSE;
+ bool is_smtp_blocking_err = FALSE;
(void)instate; /* no use for this yet */
- if(smtpcode/100 != 2) {
- failf(data, "RCPT failed: %d", smtpcode);
- result = CURLE_SEND_ERROR;
+ is_smtp_err = (smtpcode/100 != 2) ? TRUE : FALSE;
+
+ /* If there's multiple RCPT TO to be issued, it's possible to ignore errors
+ and proceed with only the valid addresses. */
+ is_smtp_blocking_err =
+ (is_smtp_err && !data->set.mail_rcpt_allowfails) ? TRUE : FALSE;
+
+ if(is_smtp_err) {
+ /* Remembering the last failure which we can report if all "RCPT TO" have
+ failed and we cannot proceed. */
+ smtp->rcpt_last_error = smtpcode;
+
+ if(is_smtp_blocking_err) {
+ failf(data, "RCPT failed: %d", smtpcode);
+ result = CURLE_SEND_ERROR;
+ }
}
else {
+ /* Some RCPT TO commands have succeeded. */
+ smtp->rcpt_had_ok = TRUE;
+ }
+
+ if(!is_smtp_blocking_err) {
smtp->rcpt = smtp->rcpt->next;
if(smtp->rcpt)
/* Send the next RCPT TO command */
result = smtp_perform_rcpt_to(conn);
else {
- /* Send the DATA command */
- result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "DATA");
+ /* We weren't able to issue a successful RCPT TO command while going
+ over recipients (potentially multiple). Sending back last error. */
+ if(!smtp->rcpt_had_ok) {
+ failf(data, "RCPT failed: %d (last error)", smtp->rcpt_last_error);
+ result = CURLE_SEND_ERROR;
+ }
+ else {
+ /* Send the DATA command */
+ result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s", "DATA");
- if(!result)
- state(conn, SMTP_DATA);
+ if(!result)
+ state(conn, SMTP_DATA);
+ }
}
}
@@ -1153,6 +1324,7 @@ static CURLcode smtp_connect(struct connectdata *conn, bool *done)
Curl_sasl_init(&smtpc->sasl, &saslsmtp);
/* Initialise the pingpong layer */
+ Curl_pp_setup(pp);
Curl_pp_init(pp);
/* Parse the URL options */
@@ -1287,6 +1459,12 @@ static CURLcode smtp_perform(struct connectdata *conn, bool *connected,
/* Store the first recipient (or NULL if not specified) */
smtp->rcpt = data->set.mail_rcpt;
+ /* Track of whether we've successfully sent at least one RCPT TO command */
+ smtp->rcpt_had_ok = FALSE;
+
+ /* Track of the last error we've received by sending RCPT TO command */
+ smtp->rcpt_last_error = 0;
+
/* Initial data character is the first character in line: it is implicitly
preceded by a virtual CRLF. */
smtp->trailing_crlf = TRUE;
@@ -1442,7 +1620,7 @@ static CURLcode smtp_setup_connection(struct connectdata *conn)
CURLcode result;
/* Clear the TLS upgraded flag */
- conn->tls_upgraded = FALSE;
+ conn->bits.tls_upgraded = FALSE;
/* Initialise the SMTP layer */
result = smtp_init(conn);
@@ -1514,7 +1692,8 @@ static CURLcode smtp_parse_url_path(struct connectdata *conn)
}
/* URL decode the path and use it as the domain in our EHLO */
- return Curl_urldecode(conn->data, path, 0, &smtpc->domain, NULL, TRUE);
+ return Curl_urldecode(conn->data, path, 0, &smtpc->domain, NULL,
+ REJECT_CTRL);
}
/***********************************************************************
@@ -1532,7 +1711,79 @@ static CURLcode smtp_parse_custom_request(struct connectdata *conn)
/* URL decode the custom request */
if(custom)
- result = Curl_urldecode(data, custom, 0, &smtp->custom, NULL, TRUE);
+ result = Curl_urldecode(data, custom, 0, &smtp->custom, NULL, REJECT_CTRL);
+
+ return result;
+}
+
+/***********************************************************************
+ *
+ * smtp_parse_address()
+ *
+ * Parse the fully qualified mailbox address into a local address part and the
+ * host name, converting the host name to an IDN A-label, as per RFC-5890, if
+ * necessary.
+ *
+ * Parameters:
+ *
+ * conn [in] - The connection handle.
+ * fqma [in] - The fully qualified mailbox address (which may or
+ * may not contain UTF-8 characters).
+ * address [in/out] - A new allocated buffer which holds the local
+ * address part of the mailbox. This buffer must be
+ * free'ed by the caller.
+ * host [in/out] - The host name structure that holds the original,
+ * and optionally encoded, host name.
+ * Curl_free_idnconverted_hostname() must be called
+ * once the caller has finished with the structure.
+ *
+ * Returns CURLE_OK on success.
+ *
+ * Notes:
+ *
+ * Should a UTF-8 host name require conversion to IDN ACE and we cannot honor
+ * that conversion then we shall return success. This allow the caller to send
+ * the data to the server as a U-label (as per RFC-6531 sect. 3.2).
+ *
+ * If an mailbox '@' separator cannot be located then the mailbox is considered
+ * to be either a local mailbox or an invalid mailbox (depending on what the
+ * calling function deems it to be) then the input will simply be returned in
+ * the address part with the host name being NULL.
+ */
+static CURLcode smtp_parse_address(struct connectdata *conn, const char *fqma,
+ char **address, struct hostname *host)
+{
+ CURLcode result = CURLE_OK;
+ size_t length;
+
+ /* Duplicate the fully qualified email address so we can manipulate it,
+ ensuring it doesn't contain the delimiters if specified */
+ char *dup = strdup(fqma[0] == '<' ? fqma + 1 : fqma);
+ if(!dup)
+ return CURLE_OUT_OF_MEMORY;
+
+ length = strlen(dup);
+ if(length) {
+ if(dup[length - 1] == '>')
+ dup[length - 1] = '\0';
+ }
+
+ /* Extract the host name from the address (if we can) */
+ host->name = strpbrk(dup, "@");
+ if(host->name) {
+ *host->name = '\0';
+ host->name = host->name + 1;
+
+ /* Attempt to convert the host name to IDN ACE */
+ (void) Curl_idnconvert_hostname(conn, host);
+
+ /* If Curl_idnconvert_hostname() fails then we shall attempt to continue
+ and send the host name using UTF-8 rather than as 7-bit ACE (which is
+ our preference) */
+ }
+
+ /* Extract the local address from the mailbox */
+ *address = dup;
return result;
}
diff --git a/lib/smtp.h b/lib/smtp.h
index b67340a40..164a175d7 100644
--- a/lib/smtp.h
+++ b/lib/smtp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,6 +55,9 @@ struct SMTP {
curl_pp_transfer transfer;
char *custom; /* Custom Request */
struct curl_slist *rcpt; /* Recipient list */
+ bool rcpt_had_ok; /* Whether any of RCPT TO commands (depends on
+ total number of recipients) succeeded so far */
+ int rcpt_last_error; /* The last error received for RCPT TO command */
size_t eob; /* Number of bytes of the EOB (End Of Body) that
have been received so far */
bool trailing_crlf; /* Specifies if the tailing CRLF is present */
@@ -71,6 +74,8 @@ struct smtp_conn {
bool tls_supported; /* StartTLS capability supported by server */
bool size_supported; /* If server supports SIZE extension according to
RFC 1870 */
+ bool utf8_supported; /* If server supports SMTPUTF8 extension according
+ to RFC 6531 */
bool auth_supported; /* AUTH capability supported by server */
};
diff --git a/lib/sockaddr.h b/lib/sockaddr.h
index db146803a..b037ee06c 100644
--- a/lib/sockaddr.h
+++ b/lib/sockaddr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/socketpair.c b/lib/socketpair.c
index 1f0e2e4a4..9e1f9ef4c 100644
--- a/lib/socketpair.c
+++ b/lib/socketpair.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
#include "curl_setup.h"
#include "socketpair.h"
-#ifndef HAVE_SOCKETPAIR
+#if !defined(HAVE_SOCKETPAIR) && !defined(CURL_DISABLE_SOCKETPAIR)
#ifdef WIN32
/*
* This is a socketpair() implementation for Windows.
@@ -40,6 +40,9 @@
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> /* IPPROTO_TCP */
#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
#ifndef INADDR_LOOPBACK
#define INADDR_LOOPBACK 0x7f000001
#endif /* !INADDR_LOOPBACK */
diff --git a/lib/socks.c b/lib/socks.c
index 6ae98184d..a41b67d5a 100644
--- a/lib/socks.c
+++ b/lib/socks.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,18 +37,19 @@
#include "connect.h"
#include "timeval.h"
#include "socks.h"
+#include "multiif.h" /* for getsock macros */
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
+#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
* Helper read-from-socket functions. Does the same as Curl_read() but it
* blocks until all bytes amount of buffersize will be read. No more, no less.
*
- * This is STUPID BLOCKING behaviour which we frown upon, but right now this
- * is what we have...
+ * This is STUPID BLOCKING behavior. Only used by the SOCKS GSSAPI functions.
*/
int Curl_blockread_all(struct connectdata *conn, /* connection data */
curl_socket_t sockfd, /* read from this socket */
@@ -61,13 +62,15 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
int result;
*n = 0;
for(;;) {
- timediff_t timeleft = Curl_timeleft(conn->data, NULL, TRUE);
- if(timeleft < 0) {
+ timediff_t timeout_ms = Curl_timeleft(conn->data, NULL, TRUE);
+ if(timeout_ms < 0) {
/* we already got the timeout */
result = CURLE_OPERATION_TIMEDOUT;
break;
}
- if(SOCKET_READABLE(sockfd, timeleft) <= 0) {
+ if(!timeout_ms)
+ timeout_ms = TIMEDIFF_T_MAX;
+ if(SOCKET_READABLE(sockfd, timeout_ms) <= 0) {
result = ~CURLE_OK;
break;
}
@@ -94,6 +97,81 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
}
return result;
}
+#endif
+
+#ifndef DEBUGBUILD
+#define sxstate(x,y) socksstate(x,y)
+#else
+#define sxstate(x,y) socksstate(x,y, __LINE__)
+#endif
+
+
+/* always use this function to change state, to make debugging easier */
+static void socksstate(struct connectdata *conn,
+ enum connect_t state
+#ifdef DEBUGBUILD
+ , int lineno
+#endif
+)
+{
+ enum connect_t oldstate = conn->cnnct.state;
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ /* synced with the state list in urldata.h */
+ static const char * const statename[] = {
+ "INIT",
+ "SOCKS_INIT",
+ "SOCKS_SEND",
+ "SOCKS_READ_INIT",
+ "SOCKS_READ",
+ "GSSAPI_INIT",
+ "AUTH_INIT",
+ "AUTH_SEND",
+ "AUTH_READ",
+ "REQ_INIT",
+ "RESOLVING",
+ "RESOLVED",
+ "RESOLVE_REMOTE",
+ "REQ_SEND",
+ "REQ_SENDING",
+ "REQ_READ",
+ "REQ_READ_MORE",
+ "DONE"
+ };
+#endif
+
+ if(oldstate == state)
+ /* don't bother when the new state is the same as the old state */
+ return;
+
+ conn->cnnct.state = state;
+
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ infof(conn->data,
+ "SXSTATE: %s => %s conn %p; line %d\n",
+ statename[oldstate], statename[conn->cnnct.state], conn,
+ lineno);
+#endif
+}
+
+int Curl_SOCKS_getsock(struct connectdata *conn, curl_socket_t *sock,
+ int sockindex)
+{
+ int rc = 0;
+ sock[0] = conn->sock[sockindex];
+ switch(conn->cnnct.state) {
+ case CONNECT_RESOLVING:
+ case CONNECT_SOCKS_READ:
+ case CONNECT_AUTH_READ:
+ case CONNECT_REQ_READ:
+ case CONNECT_REQ_READ_MORE:
+ rc = GETSOCK_READSOCK(0);
+ break;
+ default:
+ rc = GETSOCK_WRITESOCK(0);
+ break;
+ }
+ return rc;
+}
/*
* This function logs in to a SOCKS4 proxy and sends the specifics to the final
@@ -106,66 +184,98 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
* Set protocol4a=true for "SOCKS 4A (Simple Extension to SOCKS 4 Protocol)"
* Nonsupport "Identification Protocol (RFC1413)"
*/
-CURLcode Curl_SOCKS4(const char *proxy_user,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn)
+CURLproxycode Curl_SOCKS4(const char *proxy_user,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done)
{
const bool protocol4a =
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS4A) ? TRUE : FALSE;
-#define SOCKS4REQLEN 262
- unsigned char socksreq[SOCKS4REQLEN]; /* room for SOCKS4 request incl. user
- id */
- CURLcode code;
- curl_socket_t sock = conn->sock[sockindex];
+ unsigned char *socksreq = &conn->cnnct.socksreq[0];
+ CURLcode result;
+ curl_socket_t sockfd = conn->sock[sockindex];
struct Curl_easy *data = conn->data;
+ struct connstate *sx = &conn->cnnct;
+ struct Curl_dns_entry *dns = NULL;
+ ssize_t actualread;
+ ssize_t written;
- if(Curl_timeleft(data, NULL, TRUE) < 0) {
- /* time-out, bail out, go home */
- failf(data, "Connection time-out");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- if(conn->bits.httpproxy)
- infof(conn->data, "SOCKS4%s: connecting to HTTP proxy %s port %d\n",
- protocol4a ? "a" : "", hostname, remote_port);
-
- (void)curlx_nonblock(sock, FALSE);
-
- infof(data, "SOCKS4 communication to %s:%d\n", hostname, remote_port);
+ if(!SOCKS_STATE(sx->state) && !*done)
+ sxstate(conn, CONNECT_SOCKS_INIT);
- /*
- * Compose socks4 request
- *
- * Request format
- *
- * +----+----+----+----+----+----+----+----+----+----+....+----+
- * | VN | CD | DSTPORT | DSTIP | USERID |NULL|
- * +----+----+----+----+----+----+----+----+----+----+....+----+
- * # of bytes: 1 1 2 4 variable 1
- */
+ switch(sx->state) {
+ case CONNECT_SOCKS_INIT:
+ /* SOCKS4 can only do IPv4, insist! */
+ conn->ip_version = CURL_IPRESOLVE_V4;
+ if(conn->bits.httpproxy)
+ infof(conn->data, "SOCKS4%s: connecting to HTTP proxy %s port %d\n",
+ protocol4a ? "a" : "", hostname, remote_port);
- socksreq[0] = 4; /* version (SOCKS4) */
- socksreq[1] = 1; /* connect */
- socksreq[2] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
- socksreq[3] = (unsigned char)(remote_port & 0xff); /* PORT LSB */
+ infof(data, "SOCKS4 communication to %s:%d\n", hostname, remote_port);
- /* DNS resolve only for SOCKS4, not SOCKS4a */
- if(!protocol4a) {
- struct Curl_dns_entry *dns;
- Curl_addrinfo *hp = NULL;
- int rc;
+ /*
+ * Compose socks4 request
+ *
+ * Request format
+ *
+ * +----+----+----+----+----+----+----+----+----+----+....+----+
+ * | VN | CD | DSTPORT | DSTIP | USERID |NULL|
+ * +----+----+----+----+----+----+----+----+----+----+....+----+
+ * # of bytes: 1 1 2 4 variable 1
+ */
- rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+ socksreq[0] = 4; /* version (SOCKS4) */
+ socksreq[1] = 1; /* connect */
+ socksreq[2] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
+ socksreq[3] = (unsigned char)(remote_port & 0xff); /* PORT LSB */
+
+ /* DNS resolve only for SOCKS4, not SOCKS4a */
+ if(!protocol4a) {
+ enum resolve_t rc =
+ Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+
+ if(rc == CURLRESOLV_ERROR)
+ return CURLPX_RESOLVE_HOST;
+ else if(rc == CURLRESOLV_PENDING) {
+ sxstate(conn, CONNECT_RESOLVING);
+ infof(data, "SOCKS4 non-blocking resolve of %s\n", hostname);
+ return CURLPX_OK;
+ }
+ sxstate(conn, CONNECT_RESOLVED);
+ goto CONNECT_RESOLVED;
+ }
- if(rc == CURLRESOLV_ERROR)
- return CURLE_COULDNT_RESOLVE_PROXY;
+ /* socks4a doesn't resolve anything locally */
+ sxstate(conn, CONNECT_REQ_INIT);
+ goto CONNECT_REQ_INIT;
- if(rc == CURLRESOLV_PENDING)
- /* ignores the return code, but 'dns' remains NULL on failure */
- (void)Curl_resolver_wait_resolv(conn, &dns);
+ case CONNECT_RESOLVING:
+ /* check if we have the name resolved by now */
+ dns = Curl_fetch_addr(conn, hostname, (int)conn->port);
+ if(dns) {
+#ifdef CURLRES_ASYNCH
+ conn->async.dns = dns;
+ conn->async.done = TRUE;
+#endif
+ infof(data, "Hostname '%s' was found\n", hostname);
+ sxstate(conn, CONNECT_RESOLVED);
+ }
+ else {
+ result = Curl_resolv_check(data->conn, &dns);
+ if(!dns) {
+ if(result)
+ return CURLPX_RESOLVE_HOST;
+ return CURLPX_OK;
+ }
+ }
+ /* FALLTHROUGH */
+ CONNECT_RESOLVED:
+ case CONNECT_RESOLVED: {
+ struct Curl_addrinfo *hp = NULL;
+ char buf[64];
/*
* We cannot use 'hostent' as a struct that Curl_resolv() returns. It
* returns a Curl_addrinfo pointer that may not always look the same.
@@ -173,7 +283,6 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(dns)
hp = dns->addr;
if(hp) {
- char buf[64];
Curl_printable_address(hp, buf, sizeof(buf));
if(hp->ai_family == AF_INET) {
@@ -189,7 +298,6 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
}
else {
hp = NULL; /* fail! */
-
failf(data, "SOCKS4 connection to %s not supported\n", buf);
}
@@ -198,165 +306,188 @@ CURLcode Curl_SOCKS4(const char *proxy_user,
if(!hp) {
failf(data, "Failed to resolve \"%s\" for SOCKS4 connect.",
hostname);
- return CURLE_COULDNT_RESOLVE_HOST;
+ return CURLPX_RESOLVE_HOST;
}
}
-
- /*
- * This is currently not supporting "Identification Protocol (RFC1413)".
- */
- socksreq[8] = 0; /* ensure empty userid is NUL-terminated */
- if(proxy_user) {
- size_t plen = strlen(proxy_user);
- if(plen >= sizeof(socksreq) - 8) {
- failf(data, "Too long SOCKS proxy name, can't use!\n");
- return CURLE_COULDNT_CONNECT;
- }
- /* copy the proxy name WITH trailing zero */
- memcpy(socksreq + 8, proxy_user, plen + 1);
- }
-
- /*
- * Make connection
- */
- {
- int result;
- ssize_t actualread;
- ssize_t written;
- ssize_t hostnamelen = 0;
- ssize_t packetsize = 9 +
- strlen((char *)socksreq + 8); /* size including NUL */
-
- /* If SOCKS4a, set special invalid IP address 0.0.0.x */
- if(protocol4a) {
- socksreq[4] = 0;
- socksreq[5] = 0;
- socksreq[6] = 0;
- socksreq[7] = 1;
- /* If still enough room in buffer, also append hostname */
- hostnamelen = (ssize_t)strlen(hostname) + 1; /* length including NUL */
- if(packetsize + hostnamelen <= SOCKS4REQLEN)
- strcpy((char *)socksreq + packetsize, hostname);
- else
- hostnamelen = 0; /* Flag: hostname did not fit in buffer */
+ /* FALLTHROUGH */
+ CONNECT_REQ_INIT:
+ case CONNECT_REQ_INIT:
+ /*
+ * This is currently not supporting "Identification Protocol (RFC1413)".
+ */
+ socksreq[8] = 0; /* ensure empty userid is NUL-terminated */
+ if(proxy_user) {
+ size_t plen = strlen(proxy_user);
+ if(plen >= sizeof(sx->socksreq) - 8) {
+ failf(data, "Too long SOCKS proxy user name, can't use!\n");
+ return CURLPX_LONG_USER;
+ }
+ /* copy the proxy name WITH trailing zero */
+ memcpy(socksreq + 8, proxy_user, plen + 1);
}
+ /*
+ * Make connection
+ */
+ {
+ size_t packetsize = 9 +
+ strlen((char *)socksreq + 8); /* size including NUL */
+
+ /* If SOCKS4a, set special invalid IP address 0.0.0.x */
+ if(protocol4a) {
+ size_t hostnamelen = 0;
+ socksreq[4] = 0;
+ socksreq[5] = 0;
+ socksreq[6] = 0;
+ socksreq[7] = 1;
+ /* append hostname */
+ hostnamelen = strlen(hostname) + 1; /* length including NUL */
+ if(hostnamelen <= 255)
+ strcpy((char *)socksreq + packetsize, hostname);
+ else {
+ failf(data, "SOCKS4: too long host name");
+ return CURLPX_LONG_HOSTNAME;
+ }
+ packetsize += hostnamelen;
+ }
+ sx->outp = socksreq;
+ sx->outstanding = packetsize;
+ sxstate(conn, CONNECT_REQ_SENDING);
+ }
+ /* FALLTHROUGH */
+ case CONNECT_REQ_SENDING:
/* Send request */
- code = Curl_write_plain(conn, sock, (char *)socksreq,
- packetsize + hostnamelen,
- &written);
- if(code || (written != packetsize + hostnamelen)) {
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS4 connect request.");
- return CURLE_COULDNT_CONNECT;
- }
- if(protocol4a && hostnamelen == 0) {
- /* SOCKS4a with very long hostname - send that name separately */
- hostnamelen = (ssize_t)strlen(hostname) + 1;
- code = Curl_write_plain(conn, sock, (char *)hostname, hostnamelen,
- &written);
- if(code || (written != hostnamelen)) {
- failf(data, "Failed to send SOCKS4 connect request.");
- return CURLE_COULDNT_CONNECT;
- }
+ return CURLPX_SEND_CONNECT;
+ }
+ if(written != sx->outstanding) {
+ /* not done, remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLPX_OK;
}
- packetsize = 8; /* receive data size */
+ /* done sending! */
+ sx->outstanding = 8; /* receive data size */
+ sx->outp = socksreq;
+ sxstate(conn, CONNECT_SOCKS_READ);
+ /* FALLTHROUGH */
+ case CONNECT_SOCKS_READ:
/* Receive response */
- result = Curl_blockread_all(conn, sock, (char *)socksreq, packetsize,
- &actualread);
- if(result || (actualread != packetsize)) {
- failf(data, "Failed to receive SOCKS4 connect request ack.");
- return CURLE_COULDNT_CONNECT;
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "SOCKS4: Failed receiving connect request ack: %s",
+ curl_easy_strerror(result));
+ return CURLPX_RECV_CONNECT;
}
-
- /*
- * Response format
- *
- * +----+----+----+----+----+----+----+----+
- * | VN | CD | DSTPORT | DSTIP |
- * +----+----+----+----+----+----+----+----+
- * # of bytes: 1 1 2 4
- *
- * VN is the version of the reply code and should be 0. CD is the result
- * code with one of the following values:
- *
- * 90: request granted
- * 91: request rejected or failed
- * 92: request rejected because SOCKS server cannot connect to
- * identd on the client
- * 93: request rejected because the client program and identd
- * report different user-ids
- */
-
- /* wrong version ? */
- if(socksreq[0] != 0) {
- failf(data,
- "SOCKS4 reply has wrong version, version should be 0.");
- return CURLE_COULDNT_CONNECT;
+ else if(!result && !actualread) {
+ /* connection closed */
+ failf(data, "connection to proxy closed");
+ return CURLPX_CLOSED;
}
-
- /* Result */
- switch(socksreq[1]) {
- case 90:
- infof(data, "SOCKS4%s request granted.\n", protocol4a?"a":"");
- break;
- case 91:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", request rejected or failed.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- case 92:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", request rejected because SOCKS server cannot connect to "
- "identd on the client.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- case 93:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", request rejected because the client program and identd "
- "report different user-ids.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
- default:
- failf(data,
- "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
- ", Unknown.",
- (unsigned char)socksreq[4], (unsigned char)socksreq[5],
- (unsigned char)socksreq[6], (unsigned char)socksreq[7],
- (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
- (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ else if(actualread != sx->outstanding) {
+ /* remain in reading state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLPX_OK;
}
+ sxstate(conn, CONNECT_DONE);
+ break;
+ default: /* lots of unused states in SOCKS4 */
+ break;
+ }
+
+ /*
+ * Response format
+ *
+ * +----+----+----+----+----+----+----+----+
+ * | VN | CD | DSTPORT | DSTIP |
+ * +----+----+----+----+----+----+----+----+
+ * # of bytes: 1 1 2 4
+ *
+ * VN is the version of the reply code and should be 0. CD is the result
+ * code with one of the following values:
+ *
+ * 90: request granted
+ * 91: request rejected or failed
+ * 92: request rejected because SOCKS server cannot connect to
+ * identd on the client
+ * 93: request rejected because the client program and identd
+ * report different user-ids
+ */
+
+ /* wrong version ? */
+ if(socksreq[0] != 0) {
+ failf(data,
+ "SOCKS4 reply has wrong version, version should be 0.");
+ return CURLPX_BAD_VERSION;
}
- (void)curlx_nonblock(sock, TRUE);
+ /* Result */
+ switch(socksreq[1]) {
+ case 90:
+ infof(data, "SOCKS4%s request granted.\n", protocol4a?"a":"");
+ break;
+ case 91:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", request rejected or failed.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLPX_REQUEST_FAILED;
+ case 92:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", request rejected because SOCKS server cannot connect to "
+ "identd on the client.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLPX_IDENTD;
+ case 93:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", request rejected because the client program and identd "
+ "report different user-ids.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLPX_IDENTD_DIFFER;
+ default:
+ failf(data,
+ "Can't complete SOCKS4 connection to %d.%d.%d.%d:%d. (%d)"
+ ", Unknown.",
+ (unsigned char)socksreq[4], (unsigned char)socksreq[5],
+ (unsigned char)socksreq[6], (unsigned char)socksreq[7],
+ (((unsigned char)socksreq[2] << 8) | (unsigned char)socksreq[3]),
+ (unsigned char)socksreq[1]);
+ return CURLPX_UNKNOWN_FAIL;
+ }
- return CURLE_OK; /* Proxy was successful! */
+ *done = TRUE;
+ return CURLPX_OK; /* Proxy was successful! */
}
/*
* This function logs in to a SOCKS5 proxy and sends the specifics to the final
* destination server.
*/
-CURLcode Curl_SOCKS5(const char *proxy_user,
- const char *proxy_password,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn)
+CURLproxycode Curl_SOCKS5(const char *proxy_user,
+ const char *proxy_password,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done)
{
/*
According to the RFC1928, section "6. Replies". This is what a SOCK5
@@ -374,141 +505,162 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
o REP Reply field:
o X'00' succeeded
*/
-#define REQUEST_BUFSIZE 600 /* room for large user/pw (255 max each) */
- unsigned char socksreq[REQUEST_BUFSIZE];
- char dest[REQUEST_BUFSIZE] = "unknown"; /* printable hostname:port */
+ unsigned char *socksreq = &conn->cnnct.socksreq[0];
+ char dest[256] = "unknown"; /* printable hostname:port */
int idx;
ssize_t actualread;
ssize_t written;
- int result;
- CURLcode code;
- curl_socket_t sock = conn->sock[sockindex];
+ CURLcode result;
+ curl_socket_t sockfd = conn->sock[sockindex];
struct Curl_easy *data = conn->data;
- timediff_t timeout;
bool socks5_resolve_local =
(conn->socks_proxy.proxytype == CURLPROXY_SOCKS5) ? TRUE : FALSE;
const size_t hostname_len = strlen(hostname);
ssize_t len = 0;
const unsigned long auth = data->set.socks5auth;
bool allow_gssapi = FALSE;
+ struct connstate *sx = &conn->cnnct;
+ struct Curl_dns_entry *dns = NULL;
+
+ if(!SOCKS_STATE(sx->state) && !*done)
+ sxstate(conn, CONNECT_SOCKS_INIT);
+
+ switch(sx->state) {
+ case CONNECT_SOCKS_INIT:
+ if(conn->bits.httpproxy)
+ infof(conn->data, "SOCKS5: connecting to HTTP proxy %s port %d\n",
+ hostname, remote_port);
+
+ /* RFC1928 chapter 5 specifies max 255 chars for domain name in packet */
+ if(!socks5_resolve_local && hostname_len > 255) {
+ infof(conn->data, "SOCKS5: server resolving disabled for hostnames of "
+ "length > 255 [actual len=%zu]\n", hostname_len);
+ socks5_resolve_local = TRUE;
+ }
- if(conn->bits.httpproxy)
- infof(conn->data, "SOCKS5: connecting to HTTP proxy %s port %d\n",
- hostname, remote_port);
-
- /* RFC1928 chapter 5 specifies max 255 chars for domain name in packet */
- if(!socks5_resolve_local && hostname_len > 255) {
- infof(conn->data, "SOCKS5: server resolving disabled for hostnames of "
- "length > 255 [actual len=%zu]\n", hostname_len);
- socks5_resolve_local = TRUE;
- }
-
- /* get timeout */
- timeout = Curl_timeleft(data, NULL, TRUE);
-
- if(timeout < 0) {
- /* time-out, bail out, go home */
- failf(data, "Connection time-out");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- (void)curlx_nonblock(sock, TRUE);
-
- /* wait until socket gets connected */
- result = SOCKET_WRITABLE(sock, timeout);
-
- if(-1 == result) {
- failf(conn->data, "SOCKS5: no connection here");
- return CURLE_COULDNT_CONNECT;
- }
- if(0 == result) {
- failf(conn->data, "SOCKS5: connection timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- if(result & CURL_CSELECT_ERR) {
- failf(conn->data, "SOCKS5: error occurred during connection");
- return CURLE_COULDNT_CONNECT;
- }
-
- if(auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
- infof(conn->data,
- "warning: unsupported value passed to CURLOPT_SOCKS5_AUTH: %lu\n",
- auth);
- if(!(auth & CURLAUTH_BASIC))
- /* disable username/password auth */
- proxy_user = NULL;
+ if(auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI))
+ infof(conn->data,
+ "warning: unsupported value passed to CURLOPT_SOCKS5_AUTH: %lu\n",
+ auth);
+ if(!(auth & CURLAUTH_BASIC))
+ /* disable username/password auth */
+ proxy_user = NULL;
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(auth & CURLAUTH_GSSAPI)
- allow_gssapi = TRUE;
+ if(auth & CURLAUTH_GSSAPI)
+ allow_gssapi = TRUE;
#endif
- idx = 0;
- socksreq[idx++] = 5; /* version */
- idx++; /* reserve for the number of authentication methods */
- socksreq[idx++] = 0; /* no authentication */
- if(allow_gssapi)
- socksreq[idx++] = 1; /* GSS-API */
- if(proxy_user)
- socksreq[idx++] = 2; /* username/password */
- /* write the number of authentication methods */
- socksreq[1] = (unsigned char) (idx - 2);
-
- (void)curlx_nonblock(sock, FALSE);
-
- infof(data, "SOCKS5 communication to %s:%d\n", hostname, remote_port);
-
- code = Curl_write_plain(conn, sock, (char *)socksreq, (2 + (int)socksreq[1]),
- &written);
- if(code || (written != (2 + (int)socksreq[1]))) {
- failf(data, "Unable to send initial SOCKS5 request.");
- return CURLE_COULDNT_CONNECT;
- }
-
- (void)curlx_nonblock(sock, TRUE);
-
- result = SOCKET_READABLE(sock, timeout);
-
- if(-1 == result) {
- failf(conn->data, "SOCKS5 nothing to read");
- return CURLE_COULDNT_CONNECT;
- }
- if(0 == result) {
- failf(conn->data, "SOCKS5 read timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- if(result & CURL_CSELECT_ERR) {
- failf(conn->data, "SOCKS5 read error occurred");
- return CURLE_RECV_ERROR;
- }
-
- (void)curlx_nonblock(sock, FALSE);
-
- result = Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
- if(result || (actualread != 2)) {
- failf(data, "Unable to receive initial SOCKS5 response.");
- return CURLE_COULDNT_CONNECT;
- }
-
- if(socksreq[0] != 5) {
- failf(data, "Received invalid version in initial SOCKS5 response.");
- return CURLE_COULDNT_CONNECT;
- }
- if(socksreq[1] == 0) {
- /* Nothing to do, no authentication needed */
- ;
- }
+ idx = 0;
+ socksreq[idx++] = 5; /* version */
+ idx++; /* number of authentication methods */
+ socksreq[idx++] = 0; /* no authentication */
+ if(allow_gssapi)
+ socksreq[idx++] = 1; /* GSS-API */
+ if(proxy_user)
+ socksreq[idx++] = 2; /* username/password */
+ /* write the number of authentication methods */
+ socksreq[1] = (unsigned char) (idx - 2);
+
+ result = Curl_write_plain(conn, sockfd, (char *)socksreq, idx, &written);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Unable to send initial SOCKS5 request.");
+ return CURLPX_SEND_CONNECT;
+ }
+ if(written != idx) {
+ sxstate(conn, CONNECT_SOCKS_SEND);
+ sx->outstanding = idx - written;
+ sx->outp = &socksreq[written];
+ return CURLPX_OK;
+ }
+ sxstate(conn, CONNECT_SOCKS_READ);
+ goto CONNECT_SOCKS_READ_INIT;
+ case CONNECT_SOCKS_SEND:
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Unable to send initial SOCKS5 request.");
+ return CURLPX_SEND_CONNECT;
+ }
+ if(written != sx->outstanding) {
+ /* not done, remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLPX_OK;
+ }
+ /* FALLTHROUGH */
+ CONNECT_SOCKS_READ_INIT:
+ case CONNECT_SOCKS_READ_INIT:
+ sx->outstanding = 2; /* expect two bytes */
+ sx->outp = socksreq; /* store it here */
+ /* FALLTHROUGH */
+ case CONNECT_SOCKS_READ:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Unable to receive initial SOCKS5 response.");
+ return CURLPX_RECV_CONNECT;
+ }
+ else if(!result && !actualread) {
+ /* connection closed */
+ failf(data, "Connection to proxy closed");
+ return CURLPX_CLOSED;
+ }
+ else if(actualread != sx->outstanding) {
+ /* remain in reading state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLPX_OK;
+ }
+ else if(socksreq[0] != 5) {
+ failf(data, "Received invalid version in initial SOCKS5 response.");
+ return CURLPX_BAD_VERSION;
+ }
+ else if(socksreq[1] == 0) {
+ /* DONE! No authentication needed. Send request. */
+ sxstate(conn, CONNECT_REQ_INIT);
+ goto CONNECT_REQ_INIT;
+ }
+ else if(socksreq[1] == 2) {
+ /* regular name + password authentication */
+ sxstate(conn, CONNECT_AUTH_INIT);
+ goto CONNECT_AUTH_INIT;
+ }
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- else if(allow_gssapi && (socksreq[1] == 1)) {
- code = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
- if(code) {
- failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
- return CURLE_COULDNT_CONNECT;
+ else if(allow_gssapi && (socksreq[1] == 1)) {
+ sxstate(conn, CONNECT_GSSAPI_INIT);
+ result = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
+ if(result) {
+ failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
+ return CURLPX_GSSAPI;
+ }
}
- }
#endif
- else if(socksreq[1] == 2) {
+ else {
+ /* error */
+ if(!allow_gssapi && (socksreq[1] == 1)) {
+ failf(data,
+ "SOCKS5 GSSAPI per-message authentication is not supported.");
+ return CURLPX_GSSAPI_PERMSG;
+ }
+ else if(socksreq[1] == 255) {
+ failf(data, "No authentication method was acceptable.");
+ return CURLPX_NO_AUTH;
+ }
+ }
+ failf(data,
+ "Undocumented SOCKS5 mode attempted to be used by server.");
+ return CURLPX_UNKNOWN_MODE;
+#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
+ case CONNECT_GSSAPI_INIT:
+ /* GSSAPI stuff done non-blocking */
+ break;
+#endif
+
+ default: /* do nothing! */
+ break;
+
+ CONNECT_AUTH_INIT:
+ case CONNECT_AUTH_INIT: {
/* Needs user name and password */
size_t proxy_user_len, proxy_password_len;
if(proxy_user && proxy_password) {
@@ -534,7 +686,7 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
/* the length must fit in a single byte */
if(proxy_user_len >= 255) {
failf(data, "Excessive user name length for proxy auth");
- return CURLE_BAD_FUNCTION_ARGUMENT;
+ return CURLPX_LONG_USER;
}
memcpy(socksreq + len, proxy_user, proxy_user_len);
}
@@ -544,236 +696,336 @@ CURLcode Curl_SOCKS5(const char *proxy_user,
/* the length must fit in a single byte */
if(proxy_password_len > 255) {
failf(data, "Excessive password length for proxy auth");
- return CURLE_BAD_FUNCTION_ARGUMENT;
+ return CURLPX_LONG_PASSWD;
}
memcpy(socksreq + len, proxy_password, proxy_password_len);
}
len += proxy_password_len;
-
- code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
- if(code || (len != written)) {
+ sxstate(conn, CONNECT_AUTH_SEND);
+ sx->outstanding = len;
+ sx->outp = socksreq;
+ }
+ /* FALLTHROUGH */
+ case CONNECT_AUTH_SEND:
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
failf(data, "Failed to send SOCKS5 sub-negotiation request.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_SEND_AUTH;
}
-
- result = Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread);
- if(result || (actualread != 2)) {
+ if(sx->outstanding != written) {
+ /* remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLPX_OK;
+ }
+ sx->outp = socksreq;
+ sx->outstanding = 2;
+ sxstate(conn, CONNECT_AUTH_READ);
+ /* FALLTHROUGH */
+ case CONNECT_AUTH_READ:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
failf(data, "Unable to receive SOCKS5 sub-negotiation response.");
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_RECV_AUTH;
+ }
+ else if(!result && !actualread) {
+ /* connection closed */
+ failf(data, "connection to proxy closed");
+ return CURLPX_CLOSED;
+ }
+ else if(actualread != sx->outstanding) {
+ /* remain in state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLPX_OK;
}
-
/* ignore the first (VER) byte */
- if(socksreq[1] != 0) { /* status */
+ else if(socksreq[1] != 0) { /* status */
failf(data, "User was rejected by the SOCKS5 server (%d %d).",
socksreq[0], socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ return CURLPX_USER_REJECTED;
}
/* Everything is good so far, user was authenticated! */
- }
- else {
- /* error */
- if(!allow_gssapi && (socksreq[1] == 1)) {
- failf(data,
- "SOCKS5 GSSAPI per-message authentication is not supported.");
- return CURLE_COULDNT_CONNECT;
- }
- if(socksreq[1] == 255) {
- if(!proxy_user || !*proxy_user) {
- failf(data,
- "No authentication method was acceptable. (It is quite likely"
- " that the SOCKS5 server wanted a username/password, since none"
- " was supplied to the server on this connection.)");
+ sxstate(conn, CONNECT_REQ_INIT);
+ /* FALLTHROUGH */
+ CONNECT_REQ_INIT:
+ case CONNECT_REQ_INIT:
+ if(socks5_resolve_local) {
+ enum resolve_t rc = Curl_resolv(conn, hostname, remote_port,
+ FALSE, &dns);
+
+ if(rc == CURLRESOLV_ERROR)
+ return CURLPX_RESOLVE_HOST;
+
+ if(rc == CURLRESOLV_PENDING) {
+ sxstate(conn, CONNECT_RESOLVING);
+ return CURLPX_OK;
}
- else {
- failf(data, "No authentication method was acceptable.");
- }
- return CURLE_COULDNT_CONNECT;
- }
- else {
- failf(data,
- "Undocumented SOCKS5 mode attempted to be used by server.");
- return CURLE_COULDNT_CONNECT;
+ sxstate(conn, CONNECT_RESOLVED);
+ goto CONNECT_RESOLVED;
}
- }
-
- /* Authentication is complete, now specify destination to the proxy */
- len = 0;
- socksreq[len++] = 5; /* version (SOCKS5) */
- socksreq[len++] = 1; /* connect */
- socksreq[len++] = 0; /* must be zero */
-
- if(!socks5_resolve_local) {
- socksreq[len++] = 3; /* ATYP: domain name = 3 */
- socksreq[len++] = (char) hostname_len; /* address length */
- memcpy(&socksreq[len], hostname, hostname_len); /* address str w/o NULL */
- len += hostname_len;
- msnprintf(dest, sizeof(dest), "%s:%d", hostname, remote_port);
- infof(data, "SOCKS5 connect to %s (remotely resolved)\n", dest);
- }
- else {
- struct Curl_dns_entry *dns;
- Curl_addrinfo *hp = NULL;
- int rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
+ goto CONNECT_RESOLVE_REMOTE;
- if(rc == CURLRESOLV_ERROR)
- return CURLE_COULDNT_RESOLVE_HOST;
+ case CONNECT_RESOLVING:
+ /* check if we have the name resolved by now */
+ dns = Curl_fetch_addr(conn, hostname, (int)conn->port);
- if(rc == CURLRESOLV_PENDING) {
- /* this requires that we're in "wait for resolve" state */
- code = Curl_resolver_wait_resolv(conn, &dns);
- if(code)
- return code;
+ if(dns) {
+#ifdef CURLRES_ASYNCH
+ conn->async.dns = dns;
+ conn->async.done = TRUE;
+#endif
+ infof(data, "SOCKS5: hostname '%s' found\n", hostname);
}
- /*
- * We cannot use 'hostent' as a struct that Curl_resolv() returns. It
- * returns a Curl_addrinfo pointer that may not always look the same.
- */
+ if(!dns) {
+ result = Curl_resolv_check(data->conn, &dns);
+ if(!dns) {
+ if(result)
+ return CURLPX_RESOLVE_HOST;
+ return CURLPX_OK;
+ }
+ }
+ /* FALLTHROUGH */
+ CONNECT_RESOLVED:
+ case CONNECT_RESOLVED: {
+ struct Curl_addrinfo *hp = NULL;
+ size_t destlen;
if(dns)
hp = dns->addr;
- if(hp) {
- if(Curl_printable_address(hp, dest, sizeof(dest))) {
- size_t destlen = strlen(dest);
- msnprintf(dest + destlen, sizeof(dest) - destlen, ":%d", remote_port);
- }
- else {
- strcpy(dest, "unknown");
- }
-
- if(hp->ai_family == AF_INET) {
- int i;
- struct sockaddr_in *saddr_in;
- socksreq[len++] = 1; /* ATYP: IPv4 = 1 */
-
- saddr_in = (struct sockaddr_in *)(void *)hp->ai_addr;
- for(i = 0; i < 4; i++) {
- socksreq[len++] = ((unsigned char *)&saddr_in->sin_addr.s_addr)[i];
- }
+ if(!hp) {
+ failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
+ hostname);
+ return CURLPX_RESOLVE_HOST;
+ }
- infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", dest);
- }
-#ifdef ENABLE_IPV6
- else if(hp->ai_family == AF_INET6) {
- int i;
- struct sockaddr_in6 *saddr_in6;
- socksreq[len++] = 4; /* ATYP: IPv6 = 4 */
-
- saddr_in6 = (struct sockaddr_in6 *)(void *)hp->ai_addr;
- for(i = 0; i < 16; i++) {
- socksreq[len++] =
- ((unsigned char *)&saddr_in6->sin6_addr.s6_addr)[i];
- }
+ Curl_printable_address(hp, dest, sizeof(dest));
+ destlen = strlen(dest);
+ msnprintf(dest + destlen, sizeof(dest) - destlen, ":%d", remote_port);
- infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
+ len = 0;
+ socksreq[len++] = 5; /* version (SOCKS5) */
+ socksreq[len++] = 1; /* connect */
+ socksreq[len++] = 0; /* must be zero */
+ if(hp->ai_family == AF_INET) {
+ int i;
+ struct sockaddr_in *saddr_in;
+ socksreq[len++] = 1; /* ATYP: IPv4 = 1 */
+
+ saddr_in = (struct sockaddr_in *)(void *)hp->ai_addr;
+ for(i = 0; i < 4; i++) {
+ socksreq[len++] = ((unsigned char *)&saddr_in->sin_addr.s_addr)[i];
}
-#endif
- else {
- hp = NULL; /* fail! */
- failf(data, "SOCKS5 connection to %s not supported\n", dest);
+ infof(data, "SOCKS5 connect to IPv4 %s (locally resolved)\n", dest);
+ }
+#ifdef ENABLE_IPV6
+ else if(hp->ai_family == AF_INET6) {
+ int i;
+ struct sockaddr_in6 *saddr_in6;
+ socksreq[len++] = 4; /* ATYP: IPv6 = 4 */
+
+ saddr_in6 = (struct sockaddr_in6 *)(void *)hp->ai_addr;
+ for(i = 0; i < 16; i++) {
+ socksreq[len++] =
+ ((unsigned char *)&saddr_in6->sin6_addr.s6_addr)[i];
}
- Curl_resolv_unlock(data, dns); /* not used anymore from now on */
+ infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
}
- if(!hp) {
- failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
- hostname);
- return CURLE_COULDNT_RESOLVE_HOST;
+#endif
+ else {
+ hp = NULL; /* fail! */
+ failf(data, "SOCKS5 connection to %s not supported\n", dest);
}
+
+ Curl_resolv_unlock(data, dns); /* not used anymore from now on */
+ goto CONNECT_REQ_SEND;
}
+ CONNECT_RESOLVE_REMOTE:
+ case CONNECT_RESOLVE_REMOTE:
+ /* Authentication is complete, now specify destination to the proxy */
+ len = 0;
+ socksreq[len++] = 5; /* version (SOCKS5) */
+ socksreq[len++] = 1; /* connect */
+ socksreq[len++] = 0; /* must be zero */
+
+ if(!socks5_resolve_local) {
+ socksreq[len++] = 3; /* ATYP: domain name = 3 */
+ socksreq[len++] = (char) hostname_len; /* one byte address length */
+ memcpy(&socksreq[len], hostname, hostname_len); /* address w/o NULL */
+ len += hostname_len;
+ infof(data, "SOCKS5 connect to %s:%d (remotely resolved)\n",
+ hostname, remote_port);
+ }
+ /* FALLTHROUGH */
- socksreq[len++] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
- socksreq[len++] = (unsigned char)(remote_port & 0xff); /* PORT LSB */
+ CONNECT_REQ_SEND:
+ case CONNECT_REQ_SEND:
+ /* PORT MSB */
+ socksreq[len++] = (unsigned char)((remote_port >> 8) & 0xff);
+ /* PORT LSB */
+ socksreq[len++] = (unsigned char)(remote_port & 0xff);
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(conn->socks5_gssapi_enctype) {
- failf(data, "SOCKS5 GSS-API protection not yet implemented.");
- }
- else
+ if(conn->socks5_gssapi_enctype) {
+ failf(data, "SOCKS5 GSS-API protection not yet implemented.");
+ return CURLPX_GSSAPI_PROTECTION;
+ }
#endif
- code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
-
- if(code || (len != written)) {
- failf(data, "Failed to send SOCKS5 connect request.");
- return CURLE_COULDNT_CONNECT;
- }
-
- len = 10; /* minimum packet size is 10 */
-
+ sx->outp = socksreq;
+ sx->outstanding = len;
+ sxstate(conn, CONNECT_REQ_SENDING);
+ /* FALLTHROUGH */
+ case CONNECT_REQ_SENDING:
+ result = Curl_write_plain(conn, sockfd, (char *)sx->outp,
+ sx->outstanding, &written);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Failed to send SOCKS5 connect request.");
+ return CURLPX_SEND_REQUEST;
+ }
+ if(sx->outstanding != written) {
+ /* remain in state */
+ sx->outstanding -= written;
+ sx->outp += written;
+ return CURLPX_OK;
+ }
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(conn->socks5_gssapi_enctype) {
- failf(data, "SOCKS5 GSS-API protection not yet implemented.");
- }
- else
+ if(conn->socks5_gssapi_enctype) {
+ failf(data, "SOCKS5 GSS-API protection not yet implemented.");
+ return CURLPX_GSSAPI_PROTECTION;
+ }
#endif
- result = Curl_blockread_all(conn, sock, (char *)socksreq,
- len, &actualread);
-
- if(result || (len != actualread)) {
- failf(data, "Failed to receive SOCKS5 connect request ack.");
- return CURLE_COULDNT_CONNECT;
- }
-
- if(socksreq[0] != 5) { /* version */
- failf(data,
- "SOCKS5 reply has wrong version, version should be 5.");
- return CURLE_COULDNT_CONNECT;
- }
-
- /* Fix: in general, returned BND.ADDR is variable length parameter by RFC
- 1928, so the reply packet should be read until the end to avoid errors at
- subsequent protocol level.
-
- +----+-----+-------+------+----------+----------+
- |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
- +----+-----+-------+------+----------+----------+
- | 1 | 1 | X'00' | 1 | Variable | 2 |
- +----+-----+-------+------+----------+----------+
+ sx->outstanding = 10; /* minimum packet size is 10 */
+ sx->outp = socksreq;
+ sxstate(conn, CONNECT_REQ_READ);
+ /* FALLTHROUGH */
+ case CONNECT_REQ_READ:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Failed to receive SOCKS5 connect request ack.");
+ return CURLPX_RECV_REQACK;
+ }
+ else if(!result && !actualread) {
+ /* connection closed */
+ failf(data, "connection to proxy closed");
+ return CURLPX_CLOSED;
+ }
+ else if(actualread != sx->outstanding) {
+ /* remain in state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLPX_OK;
+ }
- ATYP:
- o IP v4 address: X'01', BND.ADDR = 4 byte
- o domain name: X'03', BND.ADDR = [ 1 byte length, string ]
- o IP v6 address: X'04', BND.ADDR = 16 byte
- */
+ if(socksreq[0] != 5) { /* version */
+ failf(data,
+ "SOCKS5 reply has wrong version, version should be 5.");
+ return CURLPX_BAD_VERSION;
+ }
+ else if(socksreq[1] != 0) { /* Anything besides 0 is an error */
+ CURLproxycode rc = CURLPX_REPLY_UNASSIGNED;
+ int code = socksreq[1];
+ failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
+ hostname, (unsigned char)socksreq[1]);
+ if(code < 9) {
+ /* RFC 1928 section 6 lists: */
+ static const CURLproxycode lookup[] = {
+ CURLPX_OK,
+ CURLPX_REPLY_GENERAL_SERVER_FAILURE,
+ CURLPX_REPLY_NOT_ALLOWED,
+ CURLPX_REPLY_NETWORK_UNREACHABLE,
+ CURLPX_REPLY_HOST_UNREACHABLE,
+ CURLPX_REPLY_CONNECTION_REFUSED,
+ CURLPX_REPLY_TTL_EXPIRED,
+ CURLPX_REPLY_COMMAND_NOT_SUPPORTED,
+ CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED,
+ };
+ rc = lookup[code];
+ }
+ return rc;
+ }
- /* Calculate real packet size */
- if(socksreq[3] == 3) {
- /* domain name */
- int addrlen = (int) socksreq[4];
- len = 5 + addrlen + 2;
- }
- else if(socksreq[3] == 4) {
- /* IPv6 */
- len = 4 + 16 + 2;
- }
+ /* Fix: in general, returned BND.ADDR is variable length parameter by RFC
+ 1928, so the reply packet should be read until the end to avoid errors
+ at subsequent protocol level.
+
+ +----+-----+-------+------+----------+----------+
+ |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+ +----+-----+-------+------+----------+----------+
+ | 1 | 1 | X'00' | 1 | Variable | 2 |
+ +----+-----+-------+------+----------+----------+
+
+ ATYP:
+ o IP v4 address: X'01', BND.ADDR = 4 byte
+ o domain name: X'03', BND.ADDR = [ 1 byte length, string ]
+ o IP v6 address: X'04', BND.ADDR = 16 byte
+ */
+
+ /* Calculate real packet size */
+ if(socksreq[3] == 3) {
+ /* domain name */
+ int addrlen = (int) socksreq[4];
+ len = 5 + addrlen + 2;
+ }
+ else if(socksreq[3] == 4) {
+ /* IPv6 */
+ len = 4 + 16 + 2;
+ }
+ else if(socksreq[3] == 1) {
+ len = 4 + 4 + 2;
+ }
+ else {
+ failf(data, "SOCKS5 reply has wrong address type.");
+ return CURLPX_BAD_ADDRESS_TYPE;
+ }
- /* At this point we already read first 10 bytes */
+ /* At this point we already read first 10 bytes */
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- if(!conn->socks5_gssapi_enctype) {
- /* decrypt_gssapi_blockread already read the whole packet */
+ if(!conn->socks5_gssapi_enctype) {
+ /* decrypt_gssapi_blockread already read the whole packet */
#endif
- if(len > 10) {
- result = Curl_blockread_all(conn, sock, (char *)&socksreq[10],
- len - 10, &actualread);
- if(result || ((len - 10) != actualread)) {
- failf(data, "Failed to receive SOCKS5 connect request ack.");
- return CURLE_COULDNT_CONNECT;
+ if(len > 10) {
+ sx->outstanding = len - 10; /* get the rest */
+ sx->outp = &socksreq[10];
+ sxstate(conn, CONNECT_REQ_READ_MORE);
+ }
+ else {
+ sxstate(conn, CONNECT_DONE);
+ break;
}
- }
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
- }
+ }
#endif
-
- if(socksreq[1] != 0) { /* Anything besides 0 is an error */
- failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
- dest, (unsigned char)socksreq[1]);
- return CURLE_COULDNT_CONNECT;
+ /* FALLTHROUGH */
+ case CONNECT_REQ_READ_MORE:
+ result = Curl_read_plain(sockfd, (char *)sx->outp,
+ sx->outstanding, &actualread);
+ if(result && (CURLE_AGAIN != result)) {
+ failf(data, "Failed to receive SOCKS5 connect request ack.");
+ return CURLPX_RECV_ADDRESS;
+ }
+ else if(!result && !actualread) {
+ /* connection closed */
+ failf(data, "connection to proxy closed");
+ return CURLPX_CLOSED;
+ }
+ else if(actualread != sx->outstanding) {
+ /* remain in state */
+ sx->outstanding -= actualread;
+ sx->outp += actualread;
+ return CURLPX_OK;
+ }
+ sxstate(conn, CONNECT_DONE);
}
infof(data, "SOCKS5 request granted.\n");
- (void)curlx_nonblock(sock, TRUE);
- return CURLE_OK; /* Proxy was successful! */
+ *done = TRUE;
+ return CURLPX_OK; /* Proxy was successful! */
}
#endif /* CURL_DISABLE_PROXY */
diff --git a/lib/socks.h b/lib/socks.h
index daa07c127..17e6f4610 100644
--- a/lib/socks.h
+++ b/lib/socks.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,13 +27,13 @@
#ifdef CURL_DISABLE_PROXY
#define Curl_SOCKS4(a,b,c,d,e) CURLE_NOT_BUILT_IN
#define Curl_SOCKS5(a,b,c,d,e,f) CURLE_NOT_BUILT_IN
+#define Curl_SOCKS_getsock(x,y,z) 0
#else
/*
* Helper read-from-socket functions. Does the same as Curl_read() but it
* blocks until all bytes amount of buffersize will be read. No more, no less.
*
- * This is STUPID BLOCKING behaviour which we frown upon, but right now this
- * is what we have...
+ * This is STUPID BLOCKING behavior
*/
int Curl_blockread_all(struct connectdata *conn,
curl_socket_t sockfd,
@@ -41,26 +41,31 @@ int Curl_blockread_all(struct connectdata *conn,
ssize_t buffersize,
ssize_t *n);
+int Curl_SOCKS_getsock(struct connectdata *conn,
+ curl_socket_t *sock,
+ int sockindex);
/*
* This function logs in to a SOCKS4(a) proxy and sends the specifics to the
* final destination server.
*/
-CURLcode Curl_SOCKS4(const char *proxy_name,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn);
+CURLproxycode Curl_SOCKS4(const char *proxy_name,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done);
/*
* This function logs in to a SOCKS5 proxy and sends the specifics to the
* final destination server.
*/
-CURLcode Curl_SOCKS5(const char *proxy_name,
- const char *proxy_password,
- const char *hostname,
- int remote_port,
- int sockindex,
- struct connectdata *conn);
+CURLproxycode Curl_SOCKS5(const char *proxy_name,
+ const char *proxy_password,
+ const char *hostname,
+ int remote_port,
+ int sockindex,
+ struct connectdata *conn,
+ bool *done);
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
/*
diff --git a/lib/socks_gssapi.c b/lib/socks_gssapi.c
index 65294bbeb..2e36b9940 100644
--- a/lib/socks_gssapi.c
+++ b/lib/socks_gssapi.c
@@ -5,8 +5,8 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2009, Markus Moeller, <markus_moeller@compuserve.com>
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -115,7 +115,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_buffer_desc gss_send_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc gss_recv_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc gss_w_token = GSS_C_EMPTY_BUFFER;
- gss_buffer_desc* gss_token = GSS_C_NO_BUFFER;
+ gss_buffer_desc *gss_token = GSS_C_NO_BUFFER;
gss_name_t server = GSS_C_NO_NAME;
gss_name_t gss_client_name = GSS_C_NO_NAME;
unsigned short us_length;
@@ -167,6 +167,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
+ (void)curlx_nonblock(sock, FALSE);
+
/* As long as we need to keep sending some context info, and there's no */
/* errors, keep sending it... */
for(;;) {
@@ -225,7 +227,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_release_buffer(&gss_status, &gss_send_token);
gss_release_buffer(&gss_status, &gss_recv_token);
- if(gss_major_status != GSS_S_CONTINUE_NEEDED) break;
+ if(gss_major_status != GSS_S_CONTINUE_NEEDED)
+ break;
/* analyse response */
@@ -325,7 +328,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
user[gss_send_token.length] = '\0';
gss_release_name(&gss_status, &gss_client_name);
gss_release_buffer(&gss_status, &gss_send_token);
- infof(data, "SOCKS5 server authencticated user %s with GSS-API.\n",user);
+ infof(data, "SOCKS5 server authenticated user %s with GSS-API.\n",user);
free(user);
user = NULL;
@@ -513,6 +516,8 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
gss_release_buffer(&gss_status, &gss_recv_token);
}
+ (void)curlx_nonblock(sock, TRUE);
+
infof(data, "SOCKS5 access with%s protection granted.\n",
(socksreq[0] == 0)?"out GSS-API data":
((socksreq[0] == 1)?" GSS-API integrity":" GSS-API confidentiality"));
diff --git a/lib/socks_sspi.c b/lib/socks_sspi.c
index 57027ef68..2f1fd36fa 100644
--- a/lib/socks_sspi.c
+++ b/lib/socks_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2009, 2011, Markus Moeller, <markus_moeller@compuserve.com>
*
* This software is licensed as described in the file COPYING, which
@@ -153,12 +153,14 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
return CURLE_COULDNT_CONNECT;
}
+ (void)curlx_nonblock(sock, FALSE);
+
/* As long as we need to keep sending some context info, and there's no */
/* errors, keep sending it... */
for(;;) {
TCHAR *sname;
- sname = Curl_convert_UTF8_to_tchar(service_name);
+ sname = curlx_convert_UTF8_to_tchar(service_name);
if(!sname)
return CURLE_OUT_OF_MEMORY;
@@ -178,7 +180,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
&sspi_ret_flags,
&expiry);
- Curl_unicodefree(sname);
+ curlx_unicodefree(sname);
if(sspi_recv_token.pvBuffer) {
s_pSecFn->FreeContextBuffer(sspi_recv_token.pvBuffer);
@@ -325,7 +327,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
failf(data, "Failed to determine user name.");
return CURLE_COULDNT_CONNECT;
}
- infof(data, "SOCKS5 server authencticated user %s with GSS-API.\n",
+ infof(data, "SOCKS5 server authenticated user %s with GSS-API.\n",
names.sUserName);
s_pSecFn->FreeContextBuffer(names.sUserName);
@@ -587,6 +589,7 @@ CURLcode Curl_SOCKS5_gssapi_negotiate(int sockindex,
memcpy(socksreq, sspi_w_token[0].pvBuffer, sspi_w_token[0].cbBuffer);
s_pSecFn->FreeContextBuffer(sspi_w_token[0].pvBuffer);
}
+ (void)curlx_nonblock(sock, TRUE);
infof(data, "SOCKS5 access with%s protection granted.\n",
(socksreq[0] == 0)?"out GSS-API data":
diff --git a/lib/strcase.c b/lib/strcase.c
index a89471225..a309e3529 100644
--- a/lib/strcase.c
+++ b/lib/strcase.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,8 @@
#include "strcase.h"
+static char raw_tolower(char in);
+
/* Portable, consistent toupper (remember EBCDIC). Do not use toupper() because
its behavior is altered by the current locale. */
char Curl_raw_toupper(char in)
@@ -96,7 +98,7 @@ char Curl_raw_toupper(char in)
/* Portable, consistent tolower (remember EBCDIC). Do not use tolower() because
its behavior is altered by the current locale. */
-char Curl_raw_tolower(char in)
+static char raw_tolower(char in)
{
#if !defined(CURL_DOES_CONVERSIONS)
if(in >= 'A' && in <= 'Z')
@@ -245,7 +247,7 @@ void Curl_strntolower(char *dest, const char *src, size_t n)
return;
do {
- *dest++ = Curl_raw_tolower(*src);
+ *dest++ = raw_tolower(*src);
} while(*src++ && --n);
}
diff --git a/lib/strcase.h b/lib/strcase.h
index baa768b2b..cd4c4191a 100644
--- a/lib/strcase.h
+++ b/lib/strcase.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,7 +40,6 @@ int Curl_safe_strcasecompare(const char *first, const char *second);
int Curl_strncasecompare(const char *first, const char *second, size_t max);
char Curl_raw_toupper(char in);
-char Curl_raw_tolower(char in);
/* checkprefix() is a shorter version of the above, used when the first
argument is zero-byte terminated */
diff --git a/lib/strdup.c b/lib/strdup.c
index 51e7978b7..7732802b0 100644
--- a/lib/strdup.c
+++ b/lib/strdup.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,19 +39,14 @@ char *curlx_strdup(const char *str)
if(!str)
return (char *)NULL;
- len = strlen(str);
+ len = strlen(str) + 1;
- if(len >= ((size_t)-1) / sizeof(char))
- return (char *)NULL;
-
- newstr = malloc((len + 1)*sizeof(char));
+ newstr = malloc(len);
if(!newstr)
return (char *)NULL;
- memcpy(newstr, str, (len + 1)*sizeof(char));
-
+ memcpy(newstr, str, len);
return newstr;
-
}
#endif
diff --git a/lib/strerror.c b/lib/strerror.c
index d0650d80c..b5808df2d 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2004 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2004 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -314,6 +314,15 @@ curl_easy_strerror(CURLcode error)
case CURLE_AUTH_ERROR:
return "An authentication function returned an error";
+ case CURLE_HTTP3:
+ return "HTTP/3 error";
+
+ case CURLE_QUIC_CONNECT_ERROR:
+ return "QUIC connection error";
+
+ case CURLE_PROXY:
+ return "proxy handshake error";
+
/* error codes not used by current libcurl */
case CURLE_OBSOLETE20:
case CURLE_OBSOLETE24:
@@ -386,6 +395,12 @@ curl_multi_strerror(CURLMcode error)
case CURLM_RECURSIVE_API_CALL:
return "API function called from within callback";
+ case CURLM_WAKEUP_FAILURE:
+ return "Wakeup is unavailable or failed";
+
+ case CURLM_BAD_FUNCTION_ARGUMENT:
+ return "A libcurl function was given a bad argument";
+
case CURLM_LAST:
break;
}
@@ -436,19 +451,26 @@ curl_share_strerror(CURLSHcode error)
}
#ifdef USE_WINSOCK
-
-/* This function handles most / all (?) Winsock errors curl is able to produce.
+/* This is a helper function for Curl_strerror that converts Winsock error
+ * codes (WSAGetLastError) to error messages.
+ * Returns NULL if no error message was found for error code.
*/
static const char *
get_winsock_error (int err, char *buf, size_t len)
{
-#ifdef PRESERVE_WINDOWS_ERROR_CODE
- DWORD old_win_err = GetLastError();
-#endif
- int old_errno = errno;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
const char *p;
+#endif
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ if(!len)
+ return NULL;
+
+ *buf = '\0';
+
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
+ (void)err;
+ return NULL;
+#else
switch(err) {
case WSAEINTR:
p = "Call interrupted";
@@ -617,26 +639,56 @@ get_winsock_error (int err, char *buf, size_t len)
default:
return NULL;
}
-#else
- if(!err)
- return NULL;
- else
- p = "error";
-#endif
strncpy(buf, p, len);
buf [len-1] = '\0';
+ return buf;
+#endif
+}
+#endif /* USE_WINSOCK */
- if(errno != old_errno)
- errno = old_errno;
+#if defined(WIN32) || defined(_WIN32_WCE)
+/* This is a helper function for Curl_strerror that converts Windows API error
+ * codes (GetLastError) to error messages.
+ * Returns NULL if no error message was found for error code.
+ */
+static const char *
+get_winapi_error(int err, char *buf, size_t buflen)
+{
+ char *p;
+ wchar_t wbuf[256];
-#ifdef PRESERVE_WINDOWS_ERROR_CODE
- if(old_win_err != GetLastError())
- SetLastError(old_win_err);
-#endif
+ if(!buflen)
+ return NULL;
- return buf;
+ *buf = '\0';
+ *wbuf = L'\0';
+
+ /* We return the local codepage version of the error string because if it is
+ output to the user's terminal it will likely be with functions which
+ expect the local codepage (eg fprintf, failf, infof).
+ FormatMessageW -> wcstombs is used for Windows CE compatibility. */
+ if(FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+ LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
+ size_t written = wcstombs(buf, wbuf, buflen - 1);
+ if(written != (size_t)-1)
+ buf[written] = '\0';
+ else
+ *buf = '\0';
+ }
+
+ /* Truncate multiple lines */
+ p = strchr(buf, '\n');
+ if(p) {
+ if(p > buf && *(p-1) == '\r')
+ *(p-1) = '\0';
+ else
+ *p = '\0';
+ }
+
+ return (*buf ? buf : NULL);
}
-#endif /* USE_WINSOCK */
+#endif /* WIN32 || _WIN32_WCE */
/*
* Our thread-safe and smart strerror() replacement.
@@ -648,6 +700,14 @@ get_winsock_error (int err, char *buf, size_t len)
*
* We don't do range checking (on systems other than Windows) since there is
* no good reliable and portable way to do it.
+ *
+ * On Windows different types of error codes overlap. This function has an
+ * order of preference when trying to match error codes:
+ * CRT (errno), Winsock (WSAGetLastError), Windows API (GetLastError).
+ *
+ * It may be more correct to call one of the variant functions instead:
+ * Call Curl_sspi_strerror if the error code is definitely Windows SSPI.
+ * Call Curl_winapi_strerror if the error code is definitely Windows API.
*/
const char *Curl_strerror(int err, char *buf, size_t buflen)
{
@@ -658,35 +718,30 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
char *p;
size_t max;
+ if(!buflen)
+ return NULL;
+
DEBUGASSERT(err >= 0);
max = buflen - 1;
*buf = '\0';
-#ifdef USE_WINSOCK
-
-#ifdef _WIN32_WCE
- {
- wchar_t wbuf[256];
- wbuf[0] = L'\0';
-
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
- LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL);
- wcstombs(buf, wbuf, max);
- }
-#else
+#if defined(WIN32) || defined(_WIN32_WCE)
+#if defined(WIN32)
/* 'sys_nerr' is the maximum errno number, it is not widely portable */
if(err >= 0 && err < sys_nerr)
strncpy(buf, strerror(err), max);
- else {
- if(!get_winsock_error(err, buf, max) &&
- !FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
- LANG_NEUTRAL, buf, (DWORD)max, NULL))
+ else
+#endif
+ {
+ if(
+#ifdef USE_WINSOCK
+ !get_winsock_error(err, buf, max) &&
+#endif
+ !get_winapi_error((DWORD)err, buf, max))
msnprintf(buf, max, "Unknown error %d (%#x)", err, err);
}
-#endif
-
-#else /* not USE_WINSOCK coming up */
+#else /* not Windows coming up */
#if defined(HAVE_STRERROR_R) && defined(HAVE_POSIX_STRERROR_R)
/*
@@ -734,9 +789,9 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
}
#endif
-#endif /* end of ! USE_WINSOCK */
+#endif /* end of not Windows */
- buf[max] = '\0'; /* make sure the string is zero terminated */
+ buf[max] = '\0'; /* make sure the string is null-terminated */
/* strip trailing '\r\n' or '\n'. */
p = strrchr(buf, '\n');
@@ -757,7 +812,52 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
return buf;
}
+/*
+ * Curl_winapi_strerror:
+ * Variant of Curl_strerror if the error code is definitely Windows API.
+ */
+#if defined(WIN32) || defined(_WIN32_WCE)
+const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen)
+{
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ DWORD old_win_err = GetLastError();
+#endif
+ int old_errno = errno;
+
+ if(!buflen)
+ return NULL;
+
+ *buf = '\0';
+
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ if(!get_winapi_error(err, buf, buflen)) {
+ msnprintf(buf, buflen, "Unknown error %u (0x%08X)", err, err);
+ }
+#else
+ {
+ const char *txt = (err == ERROR_SUCCESS) ? "No error" : "Error";
+ strncpy(buf, txt, buflen);
+ buf[buflen - 1] = '\0';
+ }
+#endif
+
+ if(errno != old_errno)
+ errno = old_errno;
+
+#ifdef PRESERVE_WINDOWS_ERROR_CODE
+ if(old_win_err != GetLastError())
+ SetLastError(old_win_err);
+#endif
+
+ return buf;
+}
+#endif /* WIN32 || _WIN32_WCE */
+
#ifdef USE_WINDOWS_SSPI
+/*
+ * Curl_sspi_strerror:
+ * Variant of Curl_strerror if the error code is definitely Windows SSPI.
+ */
const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
{
#ifdef PRESERVE_WINDOWS_ERROR_CODE
@@ -765,18 +865,11 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
#endif
int old_errno = errno;
const char *txt;
- char *outbuf;
- size_t outmax;
-#ifndef CURL_DISABLE_VERBOSE_STRINGS
- char txtbuf[80];
- char msgbuf[256];
- char *p, *str, *msg = NULL;
- bool msg_formatted = FALSE;
-#endif
- outbuf = buf;
- outmax = buflen - 1;
- *outbuf = '\0';
+ if(!buflen)
+ return NULL;
+
+ *buf = '\0';
#ifndef CURL_DISABLE_VERBOSE_STRINGS
@@ -784,314 +877,121 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
case SEC_E_OK:
txt = "No error";
break;
- case CRYPT_E_REVOKED:
- txt = "CRYPT_E_REVOKED";
- break;
- case SEC_E_ALGORITHM_MISMATCH:
- txt = "SEC_E_ALGORITHM_MISMATCH";
- break;
- case SEC_E_BAD_BINDINGS:
- txt = "SEC_E_BAD_BINDINGS";
- break;
- case SEC_E_BAD_PKGID:
- txt = "SEC_E_BAD_PKGID";
- break;
- case SEC_E_BUFFER_TOO_SMALL:
- txt = "SEC_E_BUFFER_TOO_SMALL";
- break;
- case SEC_E_CANNOT_INSTALL:
- txt = "SEC_E_CANNOT_INSTALL";
- break;
- case SEC_E_CANNOT_PACK:
- txt = "SEC_E_CANNOT_PACK";
- break;
- case SEC_E_CERT_EXPIRED:
- txt = "SEC_E_CERT_EXPIRED";
- break;
- case SEC_E_CERT_UNKNOWN:
- txt = "SEC_E_CERT_UNKNOWN";
- break;
- case SEC_E_CERT_WRONG_USAGE:
- txt = "SEC_E_CERT_WRONG_USAGE";
- break;
- case SEC_E_CONTEXT_EXPIRED:
- txt = "SEC_E_CONTEXT_EXPIRED";
- break;
- case SEC_E_CROSSREALM_DELEGATION_FAILURE:
- txt = "SEC_E_CROSSREALM_DELEGATION_FAILURE";
- break;
- case SEC_E_CRYPTO_SYSTEM_INVALID:
- txt = "SEC_E_CRYPTO_SYSTEM_INVALID";
- break;
- case SEC_E_DECRYPT_FAILURE:
- txt = "SEC_E_DECRYPT_FAILURE";
- break;
- case SEC_E_DELEGATION_POLICY:
- txt = "SEC_E_DELEGATION_POLICY";
- break;
- case SEC_E_DELEGATION_REQUIRED:
- txt = "SEC_E_DELEGATION_REQUIRED";
- break;
- case SEC_E_DOWNGRADE_DETECTED:
- txt = "SEC_E_DOWNGRADE_DETECTED";
- break;
- case SEC_E_ENCRYPT_FAILURE:
- txt = "SEC_E_ENCRYPT_FAILURE";
- break;
- case SEC_E_ILLEGAL_MESSAGE:
- txt = "SEC_E_ILLEGAL_MESSAGE";
- break;
- case SEC_E_INCOMPLETE_CREDENTIALS:
- txt = "SEC_E_INCOMPLETE_CREDENTIALS";
- break;
- case SEC_E_INCOMPLETE_MESSAGE:
- txt = "SEC_E_INCOMPLETE_MESSAGE";
- break;
- case SEC_E_INSUFFICIENT_MEMORY:
- txt = "SEC_E_INSUFFICIENT_MEMORY";
- break;
- case SEC_E_INTERNAL_ERROR:
- txt = "SEC_E_INTERNAL_ERROR";
- break;
- case SEC_E_INVALID_HANDLE:
- txt = "SEC_E_INVALID_HANDLE";
- break;
- case SEC_E_INVALID_PARAMETER:
- txt = "SEC_E_INVALID_PARAMETER";
- break;
- case SEC_E_INVALID_TOKEN:
- txt = "SEC_E_INVALID_TOKEN";
- break;
- case SEC_E_ISSUING_CA_UNTRUSTED:
- txt = "SEC_E_ISSUING_CA_UNTRUSTED";
- break;
- case SEC_E_ISSUING_CA_UNTRUSTED_KDC:
- txt = "SEC_E_ISSUING_CA_UNTRUSTED_KDC";
- break;
- case SEC_E_KDC_CERT_EXPIRED:
- txt = "SEC_E_KDC_CERT_EXPIRED";
- break;
- case SEC_E_KDC_CERT_REVOKED:
- txt = "SEC_E_KDC_CERT_REVOKED";
- break;
- case SEC_E_KDC_INVALID_REQUEST:
- txt = "SEC_E_KDC_INVALID_REQUEST";
- break;
- case SEC_E_KDC_UNABLE_TO_REFER:
- txt = "SEC_E_KDC_UNABLE_TO_REFER";
- break;
- case SEC_E_KDC_UNKNOWN_ETYPE:
- txt = "SEC_E_KDC_UNKNOWN_ETYPE";
- break;
- case SEC_E_LOGON_DENIED:
- txt = "SEC_E_LOGON_DENIED";
- break;
- case SEC_E_MAX_REFERRALS_EXCEEDED:
- txt = "SEC_E_MAX_REFERRALS_EXCEEDED";
- break;
- case SEC_E_MESSAGE_ALTERED:
- txt = "SEC_E_MESSAGE_ALTERED";
- break;
- case SEC_E_MULTIPLE_ACCOUNTS:
- txt = "SEC_E_MULTIPLE_ACCOUNTS";
- break;
- case SEC_E_MUST_BE_KDC:
- txt = "SEC_E_MUST_BE_KDC";
- break;
- case SEC_E_NOT_OWNER:
- txt = "SEC_E_NOT_OWNER";
- break;
- case SEC_E_NO_AUTHENTICATING_AUTHORITY:
- txt = "SEC_E_NO_AUTHENTICATING_AUTHORITY";
- break;
- case SEC_E_NO_CREDENTIALS:
- txt = "SEC_E_NO_CREDENTIALS";
- break;
- case SEC_E_NO_IMPERSONATION:
- txt = "SEC_E_NO_IMPERSONATION";
- break;
- case SEC_E_NO_IP_ADDRESSES:
- txt = "SEC_E_NO_IP_ADDRESSES";
- break;
- case SEC_E_NO_KERB_KEY:
- txt = "SEC_E_NO_KERB_KEY";
- break;
- case SEC_E_NO_PA_DATA:
- txt = "SEC_E_NO_PA_DATA";
- break;
- case SEC_E_NO_S4U_PROT_SUPPORT:
- txt = "SEC_E_NO_S4U_PROT_SUPPORT";
- break;
- case SEC_E_NO_TGT_REPLY:
- txt = "SEC_E_NO_TGT_REPLY";
- break;
- case SEC_E_OUT_OF_SEQUENCE:
- txt = "SEC_E_OUT_OF_SEQUENCE";
- break;
- case SEC_E_PKINIT_CLIENT_FAILURE:
- txt = "SEC_E_PKINIT_CLIENT_FAILURE";
- break;
- case SEC_E_PKINIT_NAME_MISMATCH:
- txt = "SEC_E_PKINIT_NAME_MISMATCH";
- break;
- case SEC_E_POLICY_NLTM_ONLY:
- txt = "SEC_E_POLICY_NLTM_ONLY";
- break;
- case SEC_E_QOP_NOT_SUPPORTED:
- txt = "SEC_E_QOP_NOT_SUPPORTED";
- break;
- case SEC_E_REVOCATION_OFFLINE_C:
- txt = "SEC_E_REVOCATION_OFFLINE_C";
- break;
- case SEC_E_REVOCATION_OFFLINE_KDC:
- txt = "SEC_E_REVOCATION_OFFLINE_KDC";
- break;
- case SEC_E_SECPKG_NOT_FOUND:
- txt = "SEC_E_SECPKG_NOT_FOUND";
- break;
- case SEC_E_SECURITY_QOS_FAILED:
- txt = "SEC_E_SECURITY_QOS_FAILED";
- break;
- case SEC_E_SHUTDOWN_IN_PROGRESS:
- txt = "SEC_E_SHUTDOWN_IN_PROGRESS";
- break;
- case SEC_E_SMARTCARD_CERT_EXPIRED:
- txt = "SEC_E_SMARTCARD_CERT_EXPIRED";
- break;
- case SEC_E_SMARTCARD_CERT_REVOKED:
- txt = "SEC_E_SMARTCARD_CERT_REVOKED";
- break;
- case SEC_E_SMARTCARD_LOGON_REQUIRED:
- txt = "SEC_E_SMARTCARD_LOGON_REQUIRED";
- break;
- case SEC_E_STRONG_CRYPTO_NOT_SUPPORTED:
- txt = "SEC_E_STRONG_CRYPTO_NOT_SUPPORTED";
- break;
- case SEC_E_TARGET_UNKNOWN:
- txt = "SEC_E_TARGET_UNKNOWN";
- break;
- case SEC_E_TIME_SKEW:
- txt = "SEC_E_TIME_SKEW";
- break;
- case SEC_E_TOO_MANY_PRINCIPALS:
- txt = "SEC_E_TOO_MANY_PRINCIPALS";
- break;
- case SEC_E_UNFINISHED_CONTEXT_DELETED:
- txt = "SEC_E_UNFINISHED_CONTEXT_DELETED";
- break;
- case SEC_E_UNKNOWN_CREDENTIALS:
- txt = "SEC_E_UNKNOWN_CREDENTIALS";
- break;
- case SEC_E_UNSUPPORTED_FUNCTION:
- txt = "SEC_E_UNSUPPORTED_FUNCTION";
- break;
- case SEC_E_UNSUPPORTED_PREAUTH:
- txt = "SEC_E_UNSUPPORTED_PREAUTH";
- break;
- case SEC_E_UNTRUSTED_ROOT:
- txt = "SEC_E_UNTRUSTED_ROOT";
- break;
- case SEC_E_WRONG_CREDENTIAL_HANDLE:
- txt = "SEC_E_WRONG_CREDENTIAL_HANDLE";
- break;
- case SEC_E_WRONG_PRINCIPAL:
- txt = "SEC_E_WRONG_PRINCIPAL";
- break;
- case SEC_I_COMPLETE_AND_CONTINUE:
- txt = "SEC_I_COMPLETE_AND_CONTINUE";
- break;
- case SEC_I_COMPLETE_NEEDED:
- txt = "SEC_I_COMPLETE_NEEDED";
- break;
- case SEC_I_CONTEXT_EXPIRED:
- txt = "SEC_I_CONTEXT_EXPIRED";
- break;
- case SEC_I_CONTINUE_NEEDED:
- txt = "SEC_I_CONTINUE_NEEDED";
- break;
- case SEC_I_INCOMPLETE_CREDENTIALS:
- txt = "SEC_I_INCOMPLETE_CREDENTIALS";
- break;
- case SEC_I_LOCAL_LOGON:
- txt = "SEC_I_LOCAL_LOGON";
- break;
- case SEC_I_NO_LSA_CONTEXT:
- txt = "SEC_I_NO_LSA_CONTEXT";
- break;
- case SEC_I_RENEGOTIATE:
- txt = "SEC_I_RENEGOTIATE";
- break;
- case SEC_I_SIGNATURE_NEEDED:
- txt = "SEC_I_SIGNATURE_NEEDED";
- break;
+#define SEC2TXT(sec) case sec: txt = #sec; break
+ SEC2TXT(CRYPT_E_REVOKED);
+ SEC2TXT(SEC_E_ALGORITHM_MISMATCH);
+ SEC2TXT(SEC_E_BAD_BINDINGS);
+ SEC2TXT(SEC_E_BAD_PKGID);
+ SEC2TXT(SEC_E_BUFFER_TOO_SMALL);
+ SEC2TXT(SEC_E_CANNOT_INSTALL);
+ SEC2TXT(SEC_E_CANNOT_PACK);
+ SEC2TXT(SEC_E_CERT_EXPIRED);
+ SEC2TXT(SEC_E_CERT_UNKNOWN);
+ SEC2TXT(SEC_E_CERT_WRONG_USAGE);
+ SEC2TXT(SEC_E_CONTEXT_EXPIRED);
+ SEC2TXT(SEC_E_CROSSREALM_DELEGATION_FAILURE);
+ SEC2TXT(SEC_E_CRYPTO_SYSTEM_INVALID);
+ SEC2TXT(SEC_E_DECRYPT_FAILURE);
+ SEC2TXT(SEC_E_DELEGATION_POLICY);
+ SEC2TXT(SEC_E_DELEGATION_REQUIRED);
+ SEC2TXT(SEC_E_DOWNGRADE_DETECTED);
+ SEC2TXT(SEC_E_ENCRYPT_FAILURE);
+ SEC2TXT(SEC_E_ILLEGAL_MESSAGE);
+ SEC2TXT(SEC_E_INCOMPLETE_CREDENTIALS);
+ SEC2TXT(SEC_E_INCOMPLETE_MESSAGE);
+ SEC2TXT(SEC_E_INSUFFICIENT_MEMORY);
+ SEC2TXT(SEC_E_INTERNAL_ERROR);
+ SEC2TXT(SEC_E_INVALID_HANDLE);
+ SEC2TXT(SEC_E_INVALID_PARAMETER);
+ SEC2TXT(SEC_E_INVALID_TOKEN);
+ SEC2TXT(SEC_E_ISSUING_CA_UNTRUSTED);
+ SEC2TXT(SEC_E_ISSUING_CA_UNTRUSTED_KDC);
+ SEC2TXT(SEC_E_KDC_CERT_EXPIRED);
+ SEC2TXT(SEC_E_KDC_CERT_REVOKED);
+ SEC2TXT(SEC_E_KDC_INVALID_REQUEST);
+ SEC2TXT(SEC_E_KDC_UNABLE_TO_REFER);
+ SEC2TXT(SEC_E_KDC_UNKNOWN_ETYPE);
+ SEC2TXT(SEC_E_LOGON_DENIED);
+ SEC2TXT(SEC_E_MAX_REFERRALS_EXCEEDED);
+ SEC2TXT(SEC_E_MESSAGE_ALTERED);
+ SEC2TXT(SEC_E_MULTIPLE_ACCOUNTS);
+ SEC2TXT(SEC_E_MUST_BE_KDC);
+ SEC2TXT(SEC_E_NOT_OWNER);
+ SEC2TXT(SEC_E_NO_AUTHENTICATING_AUTHORITY);
+ SEC2TXT(SEC_E_NO_CREDENTIALS);
+ SEC2TXT(SEC_E_NO_IMPERSONATION);
+ SEC2TXT(SEC_E_NO_IP_ADDRESSES);
+ SEC2TXT(SEC_E_NO_KERB_KEY);
+ SEC2TXT(SEC_E_NO_PA_DATA);
+ SEC2TXT(SEC_E_NO_S4U_PROT_SUPPORT);
+ SEC2TXT(SEC_E_NO_TGT_REPLY);
+ SEC2TXT(SEC_E_OUT_OF_SEQUENCE);
+ SEC2TXT(SEC_E_PKINIT_CLIENT_FAILURE);
+ SEC2TXT(SEC_E_PKINIT_NAME_MISMATCH);
+ SEC2TXT(SEC_E_POLICY_NLTM_ONLY);
+ SEC2TXT(SEC_E_QOP_NOT_SUPPORTED);
+ SEC2TXT(SEC_E_REVOCATION_OFFLINE_C);
+ SEC2TXT(SEC_E_REVOCATION_OFFLINE_KDC);
+ SEC2TXT(SEC_E_SECPKG_NOT_FOUND);
+ SEC2TXT(SEC_E_SECURITY_QOS_FAILED);
+ SEC2TXT(SEC_E_SHUTDOWN_IN_PROGRESS);
+ SEC2TXT(SEC_E_SMARTCARD_CERT_EXPIRED);
+ SEC2TXT(SEC_E_SMARTCARD_CERT_REVOKED);
+ SEC2TXT(SEC_E_SMARTCARD_LOGON_REQUIRED);
+ SEC2TXT(SEC_E_STRONG_CRYPTO_NOT_SUPPORTED);
+ SEC2TXT(SEC_E_TARGET_UNKNOWN);
+ SEC2TXT(SEC_E_TIME_SKEW);
+ SEC2TXT(SEC_E_TOO_MANY_PRINCIPALS);
+ SEC2TXT(SEC_E_UNFINISHED_CONTEXT_DELETED);
+ SEC2TXT(SEC_E_UNKNOWN_CREDENTIALS);
+ SEC2TXT(SEC_E_UNSUPPORTED_FUNCTION);
+ SEC2TXT(SEC_E_UNSUPPORTED_PREAUTH);
+ SEC2TXT(SEC_E_UNTRUSTED_ROOT);
+ SEC2TXT(SEC_E_WRONG_CREDENTIAL_HANDLE);
+ SEC2TXT(SEC_E_WRONG_PRINCIPAL);
+ SEC2TXT(SEC_I_COMPLETE_AND_CONTINUE);
+ SEC2TXT(SEC_I_COMPLETE_NEEDED);
+ SEC2TXT(SEC_I_CONTEXT_EXPIRED);
+ SEC2TXT(SEC_I_CONTINUE_NEEDED);
+ SEC2TXT(SEC_I_INCOMPLETE_CREDENTIALS);
+ SEC2TXT(SEC_I_LOCAL_LOGON);
+ SEC2TXT(SEC_I_NO_LSA_CONTEXT);
+ SEC2TXT(SEC_I_RENEGOTIATE);
+ SEC2TXT(SEC_I_SIGNATURE_NEEDED);
default:
txt = "Unknown error";
}
- if(err == SEC_E_OK)
- strncpy(outbuf, txt, outmax);
- else if(err == SEC_E_ILLEGAL_MESSAGE)
- msnprintf(outbuf, outmax,
+ if(err == SEC_E_ILLEGAL_MESSAGE) {
+ msnprintf(buf, buflen,
"SEC_E_ILLEGAL_MESSAGE (0x%08X) - This error usually occurs "
"when a fatal SSL/TLS alert is received (e.g. handshake failed)."
" More detail may be available in the Windows System event log.",
err);
+ }
else {
- str = txtbuf;
+ char txtbuf[80];
+ char msgbuf[256];
+
msnprintf(txtbuf, sizeof(txtbuf), "%s (0x%08X)", txt, err);
- txtbuf[sizeof(txtbuf)-1] = '\0';
-
-#ifdef _WIN32_WCE
- {
- wchar_t wbuf[256];
- wbuf[0] = L'\0';
-
- if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, err, LANG_NEUTRAL,
- wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
- wcstombs(msgbuf, wbuf, sizeof(msgbuf)-1);
- msg_formatted = TRUE;
- }
- }
-#else
- if(FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, err, LANG_NEUTRAL,
- msgbuf, sizeof(msgbuf)-1, NULL)) {
- msg_formatted = TRUE;
- }
-#endif
- if(msg_formatted) {
- msgbuf[sizeof(msgbuf)-1] = '\0';
- /* strip trailing '\r\n' or '\n' */
- p = strrchr(msgbuf, '\n');
- if(p && (p - msgbuf) >= 2)
- *p = '\0';
- p = strrchr(msgbuf, '\r');
- if(p && (p - msgbuf) >= 1)
- *p = '\0';
- msg = msgbuf;
+
+ if(get_winapi_error(err, msgbuf, sizeof(msgbuf)))
+ msnprintf(buf, buflen, "%s - %s", txtbuf, msgbuf);
+ else {
+ strncpy(buf, txtbuf, buflen);
+ buf[buflen - 1] = '\0';
}
- if(msg)
- msnprintf(outbuf, outmax, "%s - %s", str, msg);
- else
- strncpy(outbuf, str, outmax);
}
#else
-
if(err == SEC_E_OK)
txt = "No error";
else
txt = "Error";
-
- strncpy(outbuf, txt, outmax);
-
+ strncpy(buf, txt, buflen);
+ buf[buflen - 1] = '\0';
#endif
- outbuf[outmax] = '\0';
-
if(errno != old_errno)
errno = old_errno;
@@ -1100,6 +1000,6 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
SetLastError(old_win_err);
#endif
- return outbuf;
+ return buf;
}
#endif /* USE_WINDOWS_SSPI */
diff --git a/lib/strerror.h b/lib/strerror.h
index 683b5b4a3..bae8f8974 100644
--- a/lib/strerror.h
+++ b/lib/strerror.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,9 +24,12 @@
#include "urldata.h"
-#define STRERROR_LEN 128 /* a suitable length */
+#define STRERROR_LEN 256 /* a suitable length */
const char *Curl_strerror(int err, char *buf, size_t buflen);
+#if defined(WIN32) || defined(_WIN32_WCE)
+const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen);
+#endif
#ifdef USE_WINDOWS_SSPI
const char *Curl_sspi_strerror(int err, char *buf, size_t buflen);
#endif
diff --git a/lib/strtok.c b/lib/strtok.c
index 460eb87e5..ba6e0258a 100644
--- a/lib/strtok.c
+++ b/lib/strtok.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -52,7 +52,7 @@ Curl_strtok_r(char *ptr, const char *sep, char **end)
if(**end) {
/* the end is not a null byte */
- **end = '\0'; /* zero terminate it! */
+ **end = '\0'; /* null-terminate it! */
++*end; /* advance the last pointer to beyond the null byte */
}
diff --git a/lib/strtok.h b/lib/strtok.h
index 90b831eb6..e221fa680 100644
--- a/lib/strtok.h
+++ b/lib/strtok.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/strtoofft.c b/lib/strtoofft.c
index 546a3ff75..96e382060 100644
--- a/lib/strtoofft.c
+++ b/lib/strtoofft.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/system_win32.c b/lib/system_win32.c
index 52a5fd951..9b0797bf9 100644
--- a/lib/system_win32.c
+++ b/lib/system_win32.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2020, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,7 @@
#include <curl/curl.h>
#include "system_win32.h"
+#include "version_win32.h"
#include "curl_sspi.h"
#include "warnless.h"
@@ -54,12 +55,7 @@ CURLcode Curl_win32_init(long flags)
WSADATA wsaData;
int res;
-#if defined(ENABLE_IPV6) && (USE_WINSOCK < 2)
-#error IPV6_requires_winsock2
-#endif
-
- wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
-
+ wVersionRequested = MAKEWORD(2, 2);
res = WSAStartup(wVersionRequested, &wsaData);
if(res != 0)
@@ -82,9 +78,9 @@ CURLcode Curl_win32_init(long flags)
return CURLE_FAILED_INIT;
}
/* The Windows Sockets DLL is acceptable. Proceed. */
- #elif defined(USE_LWIPSOCK)
+#elif defined(USE_LWIPSOCK)
lwip_init();
- #endif
+#endif
} /* CURL_GLOBAL_WIN32 */
#ifdef USE_WINDOWS_SSPI
@@ -106,14 +102,14 @@ CURLcode Curl_win32_init(long flags)
Curl_if_nametoindex = pIfNameToIndex;
}
- if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT,
- VERSION_GREATER_THAN_EQUAL)) {
+ if(curlx_verify_windows_version(6, 0, PLATFORM_WINNT,
+ VERSION_GREATER_THAN_EQUAL)) {
Curl_isVistaOrGreater = TRUE;
- QueryPerformanceFrequency(&Curl_freq);
}
else
Curl_isVistaOrGreater = FALSE;
+ QueryPerformanceFrequency(&Curl_freq);
return CURLE_OK;
}
@@ -160,198 +156,6 @@ typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
#endif
/*
- * Curl_verify_windows_version()
- *
- * This is used to verify if we are running on a specific windows version.
- *
- * Parameters:
- *
- * majorVersion [in] - The major version number.
- * minorVersion [in] - The minor version number.
- * platform [in] - The optional platform identifier.
- * condition [in] - The test condition used to specifier whether we are
- * checking a version less then, equal to or greater than
- * what is specified in the major and minor version
- * numbers.
- *
- * Returns TRUE if matched; otherwise FALSE.
- */
-bool Curl_verify_windows_version(const unsigned int majorVersion,
- const unsigned int minorVersion,
- const PlatformIdentifier platform,
- const VersionCondition condition)
-{
- bool matched = FALSE;
-
-#if defined(CURL_WINDOWS_APP)
- /* We have no way to determine the Windows version from Windows apps,
- so let's assume we're running on the target Windows version. */
- const WORD fullVersion = MAKEWORD(minorVersion, majorVersion);
- const WORD targetVersion = (WORD)_WIN32_WINNT;
-
- switch(condition) {
- case VERSION_LESS_THAN:
- matched = targetVersion < fullVersion;
- break;
-
- case VERSION_LESS_THAN_EQUAL:
- matched = targetVersion <= fullVersion;
- break;
-
- case VERSION_EQUAL:
- matched = targetVersion == fullVersion;
- break;
-
- case VERSION_GREATER_THAN_EQUAL:
- matched = targetVersion >= fullVersion;
- break;
-
- case VERSION_GREATER_THAN:
- matched = targetVersion > fullVersion;
- break;
- }
-
- if(matched && (platform == PLATFORM_WINDOWS)) {
- /* we're always running on PLATFORM_WINNT */
- matched = FALSE;
- }
-#elif !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_WIN2K) || \
- (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
- OSVERSIONINFO osver;
-
- memset(&osver, 0, sizeof(osver));
- osver.dwOSVersionInfoSize = sizeof(osver);
-
- /* Find out Windows version */
- if(GetVersionEx(&osver)) {
- /* Verify the Operating System version number */
- switch(condition) {
- case VERSION_LESS_THAN:
- if(osver.dwMajorVersion < majorVersion ||
- (osver.dwMajorVersion == majorVersion &&
- osver.dwMinorVersion < minorVersion))
- matched = TRUE;
- break;
-
- case VERSION_LESS_THAN_EQUAL:
- if(osver.dwMajorVersion < majorVersion ||
- (osver.dwMajorVersion == majorVersion &&
- osver.dwMinorVersion <= minorVersion))
- matched = TRUE;
- break;
-
- case VERSION_EQUAL:
- if(osver.dwMajorVersion == majorVersion &&
- osver.dwMinorVersion == minorVersion)
- matched = TRUE;
- break;
-
- case VERSION_GREATER_THAN_EQUAL:
- if(osver.dwMajorVersion > majorVersion ||
- (osver.dwMajorVersion == majorVersion &&
- osver.dwMinorVersion >= minorVersion))
- matched = TRUE;
- break;
-
- case VERSION_GREATER_THAN:
- if(osver.dwMajorVersion > majorVersion ||
- (osver.dwMajorVersion == majorVersion &&
- osver.dwMinorVersion > minorVersion))
- matched = TRUE;
- break;
- }
-
- /* Verify the platform identifier (if necessary) */
- if(matched) {
- switch(platform) {
- case PLATFORM_WINDOWS:
- if(osver.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
- matched = FALSE;
- break;
-
- case PLATFORM_WINNT:
- if(osver.dwPlatformId != VER_PLATFORM_WIN32_NT)
- matched = FALSE;
-
- default: /* like platform == PLATFORM_DONT_CARE */
- break;
- }
- }
- }
-#else
- ULONGLONG cm = 0;
- OSVERSIONINFOEX osver;
- BYTE majorCondition;
- BYTE minorCondition;
- BYTE spMajorCondition;
- BYTE spMinorCondition;
-
- switch(condition) {
- case VERSION_LESS_THAN:
- majorCondition = VER_LESS;
- minorCondition = VER_LESS;
- spMajorCondition = VER_LESS_EQUAL;
- spMinorCondition = VER_LESS_EQUAL;
- break;
-
- case VERSION_LESS_THAN_EQUAL:
- majorCondition = VER_LESS_EQUAL;
- minorCondition = VER_LESS_EQUAL;
- spMajorCondition = VER_LESS_EQUAL;
- spMinorCondition = VER_LESS_EQUAL;
- break;
-
- case VERSION_EQUAL:
- majorCondition = VER_EQUAL;
- minorCondition = VER_EQUAL;
- spMajorCondition = VER_GREATER_EQUAL;
- spMinorCondition = VER_GREATER_EQUAL;
- break;
-
- case VERSION_GREATER_THAN_EQUAL:
- majorCondition = VER_GREATER_EQUAL;
- minorCondition = VER_GREATER_EQUAL;
- spMajorCondition = VER_GREATER_EQUAL;
- spMinorCondition = VER_GREATER_EQUAL;
- break;
-
- case VERSION_GREATER_THAN:
- majorCondition = VER_GREATER;
- minorCondition = VER_GREATER;
- spMajorCondition = VER_GREATER_EQUAL;
- spMinorCondition = VER_GREATER_EQUAL;
- break;
-
- default:
- return FALSE;
- }
-
- memset(&osver, 0, sizeof(osver));
- osver.dwOSVersionInfoSize = sizeof(osver);
- osver.dwMajorVersion = majorVersion;
- osver.dwMinorVersion = minorVersion;
- if(platform == PLATFORM_WINDOWS)
- osver.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;
- else if(platform == PLATFORM_WINNT)
- osver.dwPlatformId = VER_PLATFORM_WIN32_NT;
-
- cm = VerSetConditionMask(cm, VER_MAJORVERSION, majorCondition);
- cm = VerSetConditionMask(cm, VER_MINORVERSION, minorCondition);
- cm = VerSetConditionMask(cm, VER_SERVICEPACKMAJOR, spMajorCondition);
- cm = VerSetConditionMask(cm, VER_SERVICEPACKMINOR, spMinorCondition);
- if(platform != PLATFORM_DONT_CARE)
- cm = VerSetConditionMask(cm, VER_PLATFORMID, VER_EQUAL);
-
- if(VerifyVersionInfo(&osver, (VER_MAJORVERSION | VER_MINORVERSION |
- VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR),
- cm))
- matched = TRUE;
-#endif
-
- return matched;
-}
-
-/*
* Curl_load_library()
*
* This is used to dynamically load DLLs using the most secure method available
diff --git a/lib/system_win32.h b/lib/system_win32.h
index d2882fce1..2547bda95 100644
--- a/lib/system_win32.h
+++ b/lib/system_win32.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2016 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2016 - 2020, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,34 +32,12 @@ extern bool Curl_isVistaOrGreater;
CURLcode Curl_win32_init(long flags);
void Curl_win32_cleanup(long init_flags);
-/* Version condition */
-typedef enum {
- VERSION_LESS_THAN,
- VERSION_LESS_THAN_EQUAL,
- VERSION_EQUAL,
- VERSION_GREATER_THAN_EQUAL,
- VERSION_GREATER_THAN
-} VersionCondition;
-
-/* Platform identifier */
-typedef enum {
- PLATFORM_DONT_CARE,
- PLATFORM_WINDOWS,
- PLATFORM_WINNT
-} PlatformIdentifier;
-
/* We use our own typedef here since some headers might lack this */
typedef unsigned int(WINAPI *IF_NAMETOINDEX_FN)(const char *);
/* This is used instead of if_nametoindex if available on Windows */
extern IF_NAMETOINDEX_FN Curl_if_nametoindex;
-/* This is used to verify if we are running on a specific windows version */
-bool Curl_verify_windows_version(const unsigned int majorVersion,
- const unsigned int minorVersion,
- const PlatformIdentifier platform,
- const VersionCondition condition);
-
/* This is used to dynamically load DLLs */
HMODULE Curl_load_library(LPCTSTR filename);
diff --git a/lib/telnet.c b/lib/telnet.c
index 955255c36..754febe27 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -69,12 +69,12 @@
do { \
x->subend = x->subpointer; \
CURL_SB_CLEAR(x); \
- } WHILE_FALSE
+ } while(0)
#define CURL_SB_ACCUM(x,c) \
do { \
if(x->subpointer < (x->subbuffer + sizeof(x->subbuffer))) \
*x->subpointer++ = (c); \
- } WHILE_FALSE
+ } while(0)
#define CURL_SB_GET(x) ((*x->subpointer++)&0xff)
#define CURL_SB_LEN(x) (x->subend - x->subpointer)
@@ -87,12 +87,6 @@
#define printoption(a,b,c,d) Curl_nop_stmt
#endif
-#ifdef USE_WINSOCK
-typedef WSAEVENT (WINAPI *WSOCK2_EVENT)(void);
-typedef FARPROC WSOCK2_FUNC;
-static CURLcode check_wsock2(struct Curl_easy *data);
-#endif
-
static
CURLcode telrcv(struct connectdata *,
const unsigned char *inbuf, /* Data received from socket */
@@ -194,50 +188,11 @@ const struct Curl_handler Curl_handler_telnet = {
ZERO_NULL, /* connection_check */
PORT_TELNET, /* defport */
CURLPROTO_TELNET, /* protocol */
+ CURLPROTO_TELNET, /* family */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
};
-#ifdef USE_WINSOCK
-static CURLcode
-check_wsock2(struct Curl_easy *data)
-{
- int err;
- WORD wVersionRequested;
- WSADATA wsaData;
-
- DEBUGASSERT(data);
-
- /* telnet requires at least WinSock 2.0 so ask for it. */
- wVersionRequested = MAKEWORD(2, 0);
-
- err = WSAStartup(wVersionRequested, &wsaData);
-
- /* We must've called this once already, so this call */
- /* should always succeed. But, just in case... */
- if(err != 0) {
- failf(data,"WSAStartup failed (%d)",err);
- return CURLE_FAILED_INIT;
- }
-
- /* We have to have a WSACleanup call for every successful */
- /* WSAStartup call. */
- WSACleanup();
-
- /* Check that our version is supported */
- if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
- HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested)) {
- /* Our version isn't supported */
- failf(data, "insufficient winsock version to support "
- "telnet");
- return CURLE_FAILED_INIT;
- }
-
- /* Our version is supported */
- return CURLE_OK;
-}
-#endif
-
static
CURLcode init_telnet(struct connectdata *conn)
{
@@ -1301,11 +1256,6 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
#ifdef USE_WINSOCK
- HMODULE wsock2;
- WSOCK2_FUNC close_event_func;
- WSOCK2_EVENT create_event_func;
- WSOCK2_FUNC event_select_func;
- WSOCK2_FUNC enum_netevents_func;
WSAEVENT event_handle;
WSANETWORKEVENTS events;
HANDLE stdin_handle;
@@ -1315,7 +1265,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
DWORD readfile_read;
int err;
#else
- int interval_ms;
+ timediff_t interval_ms;
struct pollfd pfd[2];
int poll_cnt;
curl_off_t total_dl = 0;
@@ -1340,75 +1290,21 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
return result;
#ifdef USE_WINSOCK
- /*
- ** This functionality only works with WinSock >= 2.0. So,
- ** make sure we have it.
- */
- result = check_wsock2(data);
- if(result)
- return result;
-
- /* OK, so we have WinSock 2.0. We need to dynamically */
- /* load ws2_32.dll and get the function pointers we need. */
- wsock2 = Curl_load_library(TEXT("WS2_32.DLL"));
- if(wsock2 == NULL) {
- failf(data, "failed to load WS2_32.DLL (%u)", GetLastError());
- return CURLE_FAILED_INIT;
- }
-
- /* Grab a pointer to WSACreateEvent */
- create_event_func =
- CURLX_FUNCTION_CAST(WSOCK2_EVENT,
- (GetProcAddress(wsock2, "WSACreateEvent")));
- if(create_event_func == NULL) {
- failf(data, "failed to find WSACreateEvent function (%u)", GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
- /* And WSACloseEvent */
- close_event_func = GetProcAddress(wsock2, "WSACloseEvent");
- if(close_event_func == NULL) {
- failf(data, "failed to find WSACloseEvent function (%u)", GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
- /* And WSAEventSelect */
- event_select_func = GetProcAddress(wsock2, "WSAEventSelect");
- if(event_select_func == NULL) {
- failf(data, "failed to find WSAEventSelect function (%u)", GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
- /* And WSAEnumNetworkEvents */
- enum_netevents_func = GetProcAddress(wsock2, "WSAEnumNetworkEvents");
- if(enum_netevents_func == NULL) {
- failf(data, "failed to find WSAEnumNetworkEvents function (%u)",
- GetLastError());
- FreeLibrary(wsock2);
- return CURLE_FAILED_INIT;
- }
-
/* We want to wait for both stdin and the socket. Since
** the select() function in winsock only works on sockets
** we have to use the WaitForMultipleObjects() call.
*/
/* First, create a sockets event object */
- event_handle = (WSAEVENT)create_event_func();
+ event_handle = WSACreateEvent();
if(event_handle == WSA_INVALID_EVENT) {
failf(data, "WSACreateEvent failed (%d)", SOCKERRNO);
- FreeLibrary(wsock2);
return CURLE_FAILED_INIT;
}
/* Tell winsock what events we want to listen to */
- if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) ==
- SOCKET_ERROR) {
- close_event_func(event_handle);
- FreeLibrary(wsock2);
+ if(WSAEventSelect(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
+ WSACloseEvent(event_handle);
return CURLE_OK;
}
@@ -1439,6 +1335,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
DWORD waitret = WaitForMultipleObjects(obj_count, objs,
FALSE, wait_timeout);
switch(waitret) {
+
case WAIT_TIMEOUT:
{
for(;;) {
@@ -1508,9 +1405,9 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
break;
case WAIT_OBJECT_0:
-
+ {
events.lNetworkEvents = 0;
- if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) {
+ if(WSAEnumNetworkEvents(sockfd, event_handle, &events) == SOCKET_ERROR) {
err = SOCKERRNO;
if(err != EINPROGRESS) {
infof(data, "WSAEnumNetworkEvents failed (%d)", err);
@@ -1554,7 +1451,8 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
if(events.lNetworkEvents & FD_CLOSE) {
keepon = FALSE;
}
- break;
+ }
+ break;
}
@@ -1569,19 +1467,9 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
}
/* We called WSACreateEvent, so call WSACloseEvent */
- if(!close_event_func(event_handle)) {
+ if(!WSACloseEvent(event_handle)) {
infof(data, "WSACloseEvent failed (%d)", SOCKERRNO);
}
-
- /* "Forget" pointers into the library we're about to free */
- create_event_func = NULL;
- close_event_func = NULL;
- event_select_func = NULL;
- enum_netevents_func = NULL;
-
- /* We called LoadLibrary, so call FreeLibrary */
- if(!FreeLibrary(wsock2))
- infof(data, "FreeLibrary(wsock2) failed (%u)", GetLastError());
#else
pfd[0].fd = sockfd;
pfd[0].events = POLLIN;
diff --git a/lib/telnet.h b/lib/telnet.h
index 668a78a13..431427f39 100644
--- a/lib/telnet.h
+++ b/lib/telnet.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/tftp.c b/lib/tftp.c
index 346f293dc..1d3b8e825 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -115,11 +115,11 @@ typedef enum {
TFTP_ERR_NORESPONSE
} tftp_error_t;
-typedef struct tftp_packet {
+struct tftp_packet {
unsigned char *data;
-} tftp_packet_t;
+};
-typedef struct tftp_state_data {
+struct tftp_state_data {
tftp_state_t state;
tftp_mode_t mode;
tftp_error_t error;
@@ -140,21 +140,21 @@ typedef struct tftp_state_data {
int sbytes;
int blksize;
int requested_blksize;
- tftp_packet_t rpacket;
- tftp_packet_t spacket;
-} tftp_state_data_t;
+ struct tftp_packet rpacket;
+ struct tftp_packet spacket;
+};
/* Forward declarations */
-static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event);
-static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event);
+static CURLcode tftp_rx(struct tftp_state_data *state, tftp_event_t event);
+static CURLcode tftp_tx(struct tftp_state_data *state, tftp_event_t event);
static CURLcode tftp_connect(struct connectdata *conn, bool *done);
static CURLcode tftp_disconnect(struct connectdata *conn,
bool dead_connection);
static CURLcode tftp_do(struct connectdata *conn, bool *done);
static CURLcode tftp_done(struct connectdata *conn,
CURLcode, bool premature);
-static CURLcode tftp_setup_connection(struct connectdata * conn);
+static CURLcode tftp_setup_connection(struct connectdata *conn);
static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done);
static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks);
@@ -183,6 +183,7 @@ const struct Curl_handler Curl_handler_tftp = {
ZERO_NULL, /* connection_check */
PORT_TFTP, /* defport */
CURLPROTO_TFTP, /* protocol */
+ CURLPROTO_TFTP, /* family */
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
};
@@ -196,7 +197,7 @@ const struct Curl_handler Curl_handler_tftp = {
*
*
**********************************************************/
-static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
+static CURLcode tftp_set_timeouts(struct tftp_state_data *state)
{
time_t maxtime, timeout;
timediff_t timeout_ms;
@@ -279,25 +280,25 @@ static CURLcode tftp_set_timeouts(tftp_state_data_t *state)
*
**********************************************************/
-static void setpacketevent(tftp_packet_t *packet, unsigned short num)
+static void setpacketevent(struct tftp_packet *packet, unsigned short num)
{
packet->data[0] = (unsigned char)(num >> 8);
packet->data[1] = (unsigned char)(num & 0xff);
}
-static void setpacketblock(tftp_packet_t *packet, unsigned short num)
+static void setpacketblock(struct tftp_packet *packet, unsigned short num)
{
packet->data[2] = (unsigned char)(num >> 8);
packet->data[3] = (unsigned char)(num & 0xff);
}
-static unsigned short getrpacketevent(const tftp_packet_t *packet)
+static unsigned short getrpacketevent(const struct tftp_packet *packet)
{
return (unsigned short)((packet->data[0] << 8) | packet->data[1]);
}
-static unsigned short getrpacketblock(const tftp_packet_t *packet)
+static unsigned short getrpacketblock(const struct tftp_packet *packet)
{
return (unsigned short)((packet->data[2] << 8) | packet->data[3]);
}
@@ -330,7 +331,7 @@ static const char *tftp_option_get(const char *buf, size_t len,
return &buf[loc];
}
-static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
+static CURLcode tftp_parse_option_ack(struct tftp_state_data *state,
const char *ptr, int len)
{
const char *tmp = ptr;
@@ -403,7 +404,7 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
return CURLE_OK;
}
-static CURLcode tftp_option_add(tftp_state_data_t *state, size_t *csize,
+static CURLcode tftp_option_add(struct tftp_state_data *state, size_t *csize,
char *buf, const char *option)
{
if(( strlen(option) + *csize + 1) > (size_t)state->blksize)
@@ -413,7 +414,7 @@ static CURLcode tftp_option_add(tftp_state_data_t *state, size_t *csize,
return CURLE_OK;
}
-static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
+static CURLcode tftp_connect_for_tx(struct tftp_state_data *state,
tftp_event_t event)
{
CURLcode result;
@@ -429,7 +430,7 @@ static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
return tftp_tx(state, event);
}
-static CURLcode tftp_connect_for_rx(tftp_state_data_t *state,
+static CURLcode tftp_connect_for_rx(struct tftp_state_data *state,
tftp_event_t event)
{
CURLcode result;
@@ -445,7 +446,8 @@ static CURLcode tftp_connect_for_rx(tftp_state_data_t *state,
return tftp_rx(state, event);
}
-static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
+static CURLcode tftp_send_first(struct tftp_state_data *state,
+ tftp_event_t event)
{
size_t sbytes;
ssize_t senddata;
@@ -486,7 +488,7 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
file name so we skip the always-present first letter of the path
string. */
result = Curl_urldecode(data, &state->conn->data->state.up.path[1], 0,
- &filename, NULL, FALSE);
+ &filename, NULL, REJECT_ZERO);
if(result)
return result;
@@ -598,7 +600,8 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
* Event handler for the RX state
*
**********************************************************/
-static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
+static CURLcode tftp_rx(struct tftp_state_data *state,
+ tftp_event_t event)
{
ssize_t sbytes;
int rblock;
@@ -720,7 +723,7 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
* Event handler for the TX state
*
**********************************************************/
-static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
+static CURLcode tftp_tx(struct tftp_state_data *state, tftp_event_t event)
{
struct Curl_easy *data = state->conn->data;
ssize_t sbytes;
@@ -920,7 +923,7 @@ static CURLcode tftp_translate_code(tftp_error_t error)
* The tftp state machine event dispatcher
*
**********************************************************/
-static CURLcode tftp_state_machine(tftp_state_data_t *state,
+static CURLcode tftp_state_machine(struct tftp_state_data *state,
tftp_event_t event)
{
CURLcode result = CURLE_OK;
@@ -961,7 +964,7 @@ static CURLcode tftp_state_machine(tftp_state_data_t *state,
**********************************************************/
static CURLcode tftp_disconnect(struct connectdata *conn, bool dead_connection)
{
- tftp_state_data_t *state = conn->proto.tftpc;
+ struct tftp_state_data *state = conn->proto.tftpc;
(void) dead_connection;
/* done, free dynamically allocated pkt buffers */
@@ -983,13 +986,13 @@ static CURLcode tftp_disconnect(struct connectdata *conn, bool dead_connection)
**********************************************************/
static CURLcode tftp_connect(struct connectdata *conn, bool *done)
{
- tftp_state_data_t *state;
+ struct tftp_state_data *state;
int blksize;
int need_blksize;
blksize = TFTP_BLKSIZE_DEFAULT;
- state = conn->proto.tftpc = calloc(1, sizeof(tftp_state_data_t));
+ state = conn->proto.tftpc = calloc(1, sizeof(struct tftp_state_data));
if(!state)
return CURLE_OUT_OF_MEMORY;
@@ -1078,7 +1081,7 @@ static CURLcode tftp_done(struct connectdata *conn, CURLcode status,
bool premature)
{
CURLcode result = CURLE_OK;
- tftp_state_data_t *state = (tftp_state_data_t *)conn->proto.tftpc;
+ struct tftp_state_data *state = conn->proto.tftpc;
(void)status; /* unused */
(void)premature; /* not used */
@@ -1119,7 +1122,7 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
curl_socklen_t fromlen;
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
- tftp_state_data_t *state = (tftp_state_data_t *)conn->proto.tftpc;
+ struct tftp_state_data *state = conn->proto.tftpc;
struct SingleRequest *k = &data->req;
/* Receive the packet */
@@ -1206,8 +1209,8 @@ static CURLcode tftp_receive_packet(struct connectdata *conn)
**********************************************************/
static long tftp_state_timeout(struct connectdata *conn, tftp_event_t *event)
{
- time_t current;
- tftp_state_data_t *state = (tftp_state_data_t *)conn->proto.tftpc;
+ time_t current;
+ struct tftp_state_data *state = conn->proto.tftpc;
if(event)
*event = TFTP_EVENT_NONE;
@@ -1244,7 +1247,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
tftp_event_t event;
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
- tftp_state_data_t *state = (tftp_state_data_t *)conn->proto.tftpc;
+ struct tftp_state_data *state = conn->proto.tftpc;
long timeout_ms = tftp_state_timeout(conn, &event);
*done = FALSE;
@@ -1328,7 +1331,7 @@ static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done)
static CURLcode tftp_perform(struct connectdata *conn, bool *dophase_done)
{
CURLcode result = CURLE_OK;
- tftp_state_data_t *state = (tftp_state_data_t *)conn->proto.tftpc;
+ struct tftp_state_data *state = conn->proto.tftpc;
*dophase_done = FALSE;
@@ -1358,7 +1361,7 @@ static CURLcode tftp_perform(struct connectdata *conn, bool *dophase_done)
static CURLcode tftp_do(struct connectdata *conn, bool *done)
{
- tftp_state_data_t *state;
+ struct tftp_state_data *state;
CURLcode result;
*done = FALSE;
@@ -1369,7 +1372,7 @@ static CURLcode tftp_do(struct connectdata *conn, bool *done)
return result;
}
- state = (tftp_state_data_t *)conn->proto.tftpc;
+ state = conn->proto.tftpc;
if(!state)
return CURLE_TFTP_ILLEGAL;
@@ -1384,7 +1387,7 @@ static CURLcode tftp_do(struct connectdata *conn, bool *done)
return result;
}
-static CURLcode tftp_setup_connection(struct connectdata * conn)
+static CURLcode tftp_setup_connection(struct connectdata *conn)
{
struct Curl_easy *data = conn->data;
char *type;
diff --git a/lib/tftp.h b/lib/tftp.h
index 1335f64bd..33348300f 100644
--- a/lib/tftp.h
+++ b/lib/tftp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/timeval.c b/lib/timeval.c
index 9b05cf051..e761966a1 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@
extern LARGE_INTEGER Curl_freq;
extern bool Curl_isVistaOrGreater;
+/* In case of bug fix this function has a counterpart in tool_util.c */
struct curltime Curl_now(void)
{
struct curltime now;
diff --git a/lib/transfer.c b/lib/transfer.c
index d0d4aeb50..a07c7af8c 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -48,6 +48,8 @@
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifndef HAVE_SOCKET
@@ -126,12 +128,13 @@ static size_t Curl_trailers_read(char *buffer, size_t size, size_t nitems,
void *raw)
{
struct Curl_easy *data = (struct Curl_easy *)raw;
- Curl_send_buffer *trailers_buf = data->state.trailers_buf;
- size_t bytes_left = trailers_buf->size_used-data->state.trailers_bytes_sent;
+ struct dynbuf *trailers_buf = &data->state.trailers_buf;
+ size_t bytes_left = Curl_dyn_len(trailers_buf) -
+ data->state.trailers_bytes_sent;
size_t to_copy = (size*nitems < bytes_left) ? size*nitems : bytes_left;
if(to_copy) {
memcpy(buffer,
- &trailers_buf->buffer[data->state.trailers_bytes_sent],
+ Curl_dyn_ptr(trailers_buf) + data->state.trailers_bytes_sent,
to_copy);
data->state.trailers_bytes_sent += to_copy;
}
@@ -141,8 +144,8 @@ static size_t Curl_trailers_read(char *buffer, size_t size, size_t nitems,
static size_t Curl_trailers_left(void *raw)
{
struct Curl_easy *data = (struct Curl_easy *)raw;
- Curl_send_buffer *trailers_buf = data->state.trailers_buf;
- return trailers_buf->size_used - data->state.trailers_bytes_sent;
+ struct dynbuf *trailers_buf = &data->state.trailers_buf;
+ return Curl_dyn_len(trailers_buf) - data->state.trailers_bytes_sent;
}
#endif
@@ -184,11 +187,8 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
infof(data,
"Moving trailers state machine from initialized to sending.\n");
data->state.trailers_state = TRAILERS_SENDING;
- data->state.trailers_buf = Curl_add_buffer_init();
- if(!data->state.trailers_buf) {
- failf(data, "Unable to allocate trailing headers buffer !");
- return CURLE_OUT_OF_MEMORY;
- }
+ Curl_dyn_init(&data->state.trailers_buf, DYN_TRAILERS);
+
data->state.trailers_bytes_sent = 0;
Curl_set_in_callback(data, true);
trailers_ret_code = data->set.trailer_callback(&trailers,
@@ -204,7 +204,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
result = CURLE_ABORTED_BY_CALLBACK;
}
if(result) {
- Curl_add_buffer_free(&data->state.trailers_buf);
+ Curl_dyn_free(&data->state.trailers_buf);
curl_slist_free_all(trailers);
return result;
}
@@ -367,7 +367,7 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
#ifndef CURL_DISABLE_HTTP
if(data->state.trailers_state == TRAILERS_SENDING &&
!Curl_trailers_left(data)) {
- Curl_add_buffer_free(&data->state.trailers_buf);
+ Curl_dyn_free(&data->state.trailers_buf);
data->state.trailers_state = TRAILERS_DONE;
data->set.trailer_data = NULL;
data->set.trailer_callback = NULL;
@@ -433,8 +433,8 @@ CURLcode Curl_readrewind(struct connectdata *conn)
}
if(data->set.postfields)
; /* do nothing */
- else if(data->set.httpreq == HTTPREQ_POST_MIME ||
- data->set.httpreq == HTTPREQ_POST_FORM) {
+ else if(data->state.httpreq == HTTPREQ_POST_MIME ||
+ data->state.httpreq == HTTPREQ_POST_FORM) {
if(Curl_mime_rewind(mimepart)) {
failf(data, "Cannot rewind mime/post data");
return CURLE_SEND_FAIL_REWIND;
@@ -484,8 +484,15 @@ CURLcode Curl_readrewind(struct connectdata *conn)
return CURLE_OK;
}
-static int data_pending(const struct connectdata *conn)
+static int data_pending(const struct Curl_easy *data)
{
+ struct connectdata *conn = data->conn;
+
+#ifdef ENABLE_QUIC
+ if(conn->transport == TRNSPRT_QUIC)
+ return Curl_quic_data_pending(data);
+#endif
+
/* in the case of libssh2, we can never be really sure that we have emptied
its internal buffers so we MUST always try until we get EAGAIN back */
return conn->handler->protocol&(CURLPROTO_SCP|CURLPROTO_SFTP) ||
@@ -555,6 +562,8 @@ static CURLcode readwrite_data(struct Curl_easy *data,
size_t excess = 0; /* excess bytes read */
bool readmore = FALSE; /* used by RTP to signal for more data */
int maxloops = 100;
+ char *buf = data->state.buffer;
+ DEBUGASSERT(buf);
*done = FALSE;
*comeback = FALSE;
@@ -565,17 +574,20 @@ static CURLcode readwrite_data(struct Curl_easy *data,
bool is_empty_data = FALSE;
size_t buffersize = data->set.buffer_size;
size_t bytestoread = buffersize;
+#ifdef USE_NGHTTP2
+ bool is_http2 = ((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
+ (conn->httpversion == 20));
+#endif
if(
-#if defined(USE_NGHTTP2)
+#ifdef USE_NGHTTP2
/* For HTTP/2, read data without caring about the content
length. This is safe because body in HTTP/2 is always
segmented thanks to its framing layer. Meanwhile, we have to
call Curl_read to ensure that http2_handle_stream_close is
called when we read all incoming bytes for a particular
stream. */
- !((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
- conn->httpversion == 20) &&
+ !is_http2 &&
#endif
k->size != -1 && !k->header) {
/* make sure we don't read too much */
@@ -586,7 +598,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
if(bytestoread) {
/* receive data from the network! */
- result = Curl_read(conn, conn->sockfd, k->buf, bytestoread, &nread);
+ result = Curl_read(conn, conn->sockfd, buf, bytestoread, &nread);
/* read would've blocked */
if(CURLE_AGAIN == result)
@@ -613,21 +625,25 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* indicates data of zero size, i.e. empty file */
is_empty_data = ((nread == 0) && (k->bodywrites == 0)) ? TRUE : FALSE;
- /* NUL terminate, allowing string ops to be used */
if(0 < nread || is_empty_data) {
- k->buf[nread] = 0;
+ buf[nread] = 0;
}
else {
- /* if we receive 0 or less here, the server closed the connection
- and we bail out from this! */
- DEBUGF(infof(data, "nread <= 0, server closed connection, bailing\n"));
+ /* if we receive 0 or less here, either the http2 stream is closed or the
+ server closed the connection and we bail out from this! */
+#ifdef USE_NGHTTP2
+ if(is_http2 && !nread)
+ DEBUGF(infof(data, "nread == 0, stream closed, bailing\n"));
+ else
+#endif
+ DEBUGF(infof(data, "nread <= 0, server closed connection, bailing\n"));
k->keepon &= ~KEEP_RECV;
break;
}
/* Default buffer to use when we write the buffer, it may be changed
in the flow below before the actual storing is done. */
- k->str = k->buf;
+ k->str = buf;
if(conn->handler->readwrite) {
result = conn->handler->readwrite(data, conn, &nread, &readmore);
@@ -676,7 +692,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* This is not an 'else if' since it may be a rest from the header
parsing, where the beginning of the buffer is headers and the end
is non-headers. */
- if(k->str && !k->header && (nread > 0 || is_empty_data)) {
+ if(!k->header && (nread > 0 || is_empty_data)) {
if(data->set.opt_no_body) {
/* data arrives although we want none, bail out */
@@ -707,7 +723,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
infof(data, "Ignoring the response-body\n");
}
if(data->state.resume_from && !k->content_range &&
- (data->set.httpreq == HTTPREQ_GET) &&
+ (data->state.httpreq == HTTPREQ_GET) &&
!k->ignorebody) {
if(k->size == data->state.resume_from) {
@@ -757,8 +773,9 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* pass data to the debug function before it gets "dechunked" */
if(data->set.verbose) {
if(k->badheader) {
- Curl_debug(data, CURLINFO_DATA_IN, data->state.headerbuff,
- (size_t)k->hbuflen);
+ Curl_debug(data, CURLINFO_DATA_IN,
+ Curl_dyn_ptr(&data->state.headerb),
+ Curl_dyn_len(&data->state.headerb));
if(k->badheader == HEADER_PARTHEADER)
Curl_debug(data, CURLINFO_DATA_IN,
k->str, (size_t)nread);
@@ -809,9 +826,9 @@ static CURLcode readwrite_data(struct Curl_easy *data,
/* Account for body content stored in the header buffer */
if((k->badheader == HEADER_PARTHEADER) && !k->ignorebody) {
- DEBUGF(infof(data, "Increasing bytecount by %zu from hbuflen\n",
- k->hbuflen));
- k->bytecount += k->hbuflen;
+ size_t headlen = Curl_dyn_len(&data->state.headerb);
+ DEBUGF(infof(data, "Increasing bytecount by %zu\n", headlen));
+ k->bytecount += headlen;
}
if((-1 != k->maxdownload) &&
@@ -826,6 +843,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
", maxdownload = %" CURL_FORMAT_CURL_OFF_T
", bytecount = %" CURL_FORMAT_CURL_OFF_T "\n",
excess, k->size, k->maxdownload, k->bytecount);
+ connclose(conn, "excess found in a read");
}
nread = (ssize_t) (k->maxdownload - k->bytecount);
@@ -845,15 +863,16 @@ static CURLcode readwrite_data(struct Curl_easy *data,
if(k->badheader && !k->ignorebody) {
/* we parsed a piece of data wrongly assuming it was a header
and now we output it as body instead */
+ size_t headlen = Curl_dyn_len(&data->state.headerb);
/* Don't let excess data pollute body writes */
- if(k->maxdownload == -1 || (curl_off_t)k->hbuflen <= k->maxdownload)
+ if(k->maxdownload == -1 || (curl_off_t)headlen <= k->maxdownload)
result = Curl_client_write(conn, CLIENTWRITE_BODY,
- data->state.headerbuff,
- k->hbuflen);
+ Curl_dyn_ptr(&data->state.headerb),
+ headlen);
else
result = Curl_client_write(conn, CLIENTWRITE_BODY,
- data->state.headerbuff,
+ Curl_dyn_ptr(&data->state.headerb),
(size_t)k->maxdownload);
if(result)
@@ -887,14 +906,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
} /* if(!header and data to read) */
- if(conn->handler->readwrite && excess && !conn->bits.stream_was_rewound) {
+ if(conn->handler->readwrite && excess) {
/* Parse the excess data */
k->str += nread;
- if(&k->str[excess] > &k->buf[data->set.buffer_size]) {
+ if(&k->str[excess] > &buf[data->set.buffer_size]) {
/* the excess amount was too excessive(!), make sure
it doesn't read out of buffer */
- excess = &k->buf[data->set.buffer_size] - k->str;
+ excess = &buf[data->set.buffer_size] - k->str;
}
nread = (ssize_t)excess;
@@ -918,7 +937,7 @@ static CURLcode readwrite_data(struct Curl_easy *data,
break;
}
- } while(data_pending(conn) && maxloops--);
+ } while(data_pending(data) && maxloops--);
if(maxloops <= 0) {
/* we mark it as read-again-please */
@@ -1174,7 +1193,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
}
- } WHILE_FALSE; /* just to break out from! */
+ } while(0); /* just to break out from! */
return CURLE_OK;
}
@@ -1231,9 +1250,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
/* We go ahead and do a read if we have a readable socket or if
the stream was rewound (in which case we have data in a
buffer) */
- if((k->keepon & KEEP_RECV) &&
- ((select_res & CURL_CSELECT_IN) || conn->bits.stream_was_rewound)) {
-
+ if((k->keepon & KEEP_RECV) && (select_res & CURL_CSELECT_IN)) {
result = readwrite_data(data, conn, k, &didwhat, done, comeback);
if(result || *done)
return result;
@@ -1428,14 +1445,16 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
if(!data->change.url && data->set.uh) {
CURLUcode uc;
+ free(data->set.str[STRING_SET_URL]);
uc = curl_url_get(data->set.uh,
- CURLUPART_URL, &data->set.str[STRING_SET_URL], 0);
+ CURLUPART_URL, &data->set.str[STRING_SET_URL], 0);
if(uc) {
failf(data, "No URL set!");
return CURLE_URL_MALFORMAT;
}
}
+ data->state.httpreq = data->set.method;
data->change.url = data->set.str[STRING_SET_URL];
/* Init the SSL session ID cache here. We do it here since we want to do it
@@ -1455,12 +1474,11 @@ CURLcode Curl_pretransfer(struct Curl_easy *data)
data->state.authhost.want = data->set.httpauth;
data->state.authproxy.want = data->set.proxyauth;
Curl_safefree(data->info.wouldredirect);
- data->info.wouldredirect = NULL;
- if(data->set.httpreq == HTTPREQ_PUT)
+ if(data->state.httpreq == HTTPREQ_PUT)
data->state.infilesize = data->set.filesize;
- else if((data->set.httpreq != HTTPREQ_GET) &&
- (data->set.httpreq != HTTPREQ_HEAD)) {
+ else if((data->state.httpreq != HTTPREQ_GET) &&
+ (data->state.httpreq != HTTPREQ_HEAD)) {
data->state.infilesize = data->set.postfieldsize;
if(data->set.postfields && (data->state.infilesize == -1))
data->state.infilesize = (curl_off_t)strlen(data->set.postfields);
@@ -1671,12 +1689,12 @@ CURLcode Curl_follow(struct Curl_easy *data,
* This behaviour is forbidden by RFC1945 and the obsolete RFC2616, and
* can be overridden with CURLOPT_POSTREDIR.
*/
- if((data->set.httpreq == HTTPREQ_POST
- || data->set.httpreq == HTTPREQ_POST_FORM
- || data->set.httpreq == HTTPREQ_POST_MIME)
+ if((data->state.httpreq == HTTPREQ_POST
+ || data->state.httpreq == HTTPREQ_POST_FORM
+ || data->state.httpreq == HTTPREQ_POST_MIME)
&& !(data->set.keep_post & CURL_REDIR_POST_301)) {
infof(data, "Switch from POST to GET\n");
- data->set.httpreq = HTTPREQ_GET;
+ data->state.httpreq = HTTPREQ_GET;
}
break;
case 302: /* Found */
@@ -1696,22 +1714,29 @@ CURLcode Curl_follow(struct Curl_easy *data,
* This behaviour is forbidden by RFC1945 and the obsolete RFC2616, and
* can be overridden with CURLOPT_POSTREDIR.
*/
- if((data->set.httpreq == HTTPREQ_POST
- || data->set.httpreq == HTTPREQ_POST_FORM
- || data->set.httpreq == HTTPREQ_POST_MIME)
+ if((data->state.httpreq == HTTPREQ_POST
+ || data->state.httpreq == HTTPREQ_POST_FORM
+ || data->state.httpreq == HTTPREQ_POST_MIME)
&& !(data->set.keep_post & CURL_REDIR_POST_302)) {
infof(data, "Switch from POST to GET\n");
- data->set.httpreq = HTTPREQ_GET;
+ data->state.httpreq = HTTPREQ_GET;
}
break;
case 303: /* See Other */
- /* Disable both types of POSTs, unless the user explicitly
- asks for POST after POST */
- if(data->set.httpreq != HTTPREQ_GET
- && !(data->set.keep_post & CURL_REDIR_POST_303)) {
- data->set.httpreq = HTTPREQ_GET; /* enforce GET request */
- infof(data, "Disables POST, goes with %s\n",
+ /* 'See Other' location is not the resource but a substitute for the
+ * resource. In this case we switch the method to GET/HEAD, unless the
+ * method is POST and the user specified to keep it as POST.
+ * https://github.com/curl/curl/issues/5237#issuecomment-614641049
+ */
+ if(data->state.httpreq != HTTPREQ_GET &&
+ ((data->state.httpreq != HTTPREQ_POST &&
+ data->state.httpreq != HTTPREQ_POST_FORM &&
+ data->state.httpreq != HTTPREQ_POST_MIME) ||
+ !(data->set.keep_post & CURL_REDIR_POST_303))) {
+ data->state.httpreq = HTTPREQ_GET;
+ data->set.upload = false;
+ infof(data, "Switch to %s\n",
data->set.opt_no_body?"HEAD":"GET");
}
break;
@@ -1778,7 +1803,15 @@ CURLcode Curl_retry_request(struct connectdata *conn,
retry = TRUE;
}
if(retry) {
- infof(conn->data, "Connection died, retrying a fresh connect\n");
+#define CONN_MAX_RETRIES 5
+ if(data->state.retrycount++ >= CONN_MAX_RETRIES) {
+ failf(data, "Connection died, tried %d times before giving up",
+ CONN_MAX_RETRIES);
+ data->state.retrycount = 0;
+ return CURLE_SEND_ERROR;
+ }
+ infof(conn->data, "Connection died, retrying a fresh connect\
+(retry count: %d)\n", data->state.retrycount);
*url = strdup(conn->data->change.url);
if(!*url)
return CURLE_OUT_OF_MEMORY;
@@ -1820,15 +1853,21 @@ Curl_setup_transfer(
{
struct SingleRequest *k = &data->req;
struct connectdata *conn = data->conn;
+ struct HTTP *http = data->req.protop;
+ bool httpsending = ((conn->handler->protocol&PROTO_FAMILY_HTTP) &&
+ (http->sending == HTTPSEND_REQUEST));
DEBUGASSERT(conn != NULL);
DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
- if(conn->bits.multiplex || conn->httpversion == 20) {
+ if(conn->bits.multiplex || conn->httpversion == 20 || httpsending) {
/* when multiplexing, the read/write sockets need to be the same! */
conn->sockfd = sockindex == -1 ?
((writesockindex == -1 ? CURL_SOCKET_BAD : conn->sock[writesockindex])) :
conn->sock[sockindex];
conn->writesockfd = conn->sockfd;
+ if(httpsending)
+ /* special and very HTTP-specific */
+ writesockindex = FIRSTSOCKET;
}
else {
conn->sockfd = sockindex == -1 ?
@@ -1856,7 +1895,6 @@ Curl_setup_transfer(
k->keepon |= KEEP_RECV;
if(writesockindex != -1) {
- struct HTTP *http = data->req.protop;
/* HTTP 1.1 magic:
Even if we require a 100-return code before uploading data, we might
diff --git a/lib/url.c b/lib/url.c
index 8285474fd..8af33c040 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -106,7 +106,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "http2.h"
#include "file.h"
#include "curl_ldap.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "imap.h"
#include "url.h"
#include "connect.h"
@@ -114,6 +114,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "http_ntlm.h"
#include "curl_rtmp.h"
#include "gopher.h"
+#include "mqtt.h"
#include "http_proxy.h"
#include "conncache.h"
#include "multihandle.h"
@@ -121,6 +122,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "strdup.h"
#include "setopt.h"
#include "altsvc.h"
+#include "dynbuf.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -128,8 +130,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "memdebug.h"
static void conn_free(struct connectdata *conn);
-static void free_idnconverted_hostname(struct hostname *host);
-static unsigned int get_protocol_family(unsigned int protocol);
/* Some parts of the code (e.g. chunked encoding) assume this buffer has at
* more than just a few bytes to play with. Don't let it become too small or
@@ -139,21 +139,41 @@ static unsigned int get_protocol_family(unsigned int protocol);
# error READBUFFER_SIZE is too small
#endif
+/*
+* get_protocol_family()
+*
+* This is used to return the protocol family for a given protocol.
+*
+* Parameters:
+*
+* 'h' [in] - struct Curl_handler pointer.
+*
+* Returns the family as a single bit protocol identifier.
+*/
+static unsigned int get_protocol_family(const struct Curl_handler *h)
+{
+ DEBUGASSERT(h);
+ DEBUGASSERT(h->family);
+ return h->family;
+}
+
/*
- * Protocol table.
+ * Protocol table. Schemes (roughly) in 2019 popularity order:
+ *
+ * HTTPS, HTTP, FTP, FTPS, SFTP, FILE, SCP, SMTP, LDAP, IMAPS, TELNET, IMAP,
+ * LDAPS, SMTPS, TFTP, SMB, POP3, GOPHER POP3S, RTSP, RTMP, SMBS, DICT
*/
-
static const struct Curl_handler * const protocols[] = {
-#ifndef CURL_DISABLE_HTTP
- &Curl_handler_http,
-#endif
-
#if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)
&Curl_handler_https,
#endif
+#ifndef CURL_DISABLE_HTTP
+ &Curl_handler_http,
+#endif
+
#ifndef CURL_DISABLE_FTP
&Curl_handler_ftp,
#endif
@@ -162,12 +182,23 @@ static const struct Curl_handler * const protocols[] = {
&Curl_handler_ftps,
#endif
-#ifndef CURL_DISABLE_TELNET
- &Curl_handler_telnet,
+#if defined(USE_SSH)
+ &Curl_handler_sftp,
#endif
-#ifndef CURL_DISABLE_DICT
- &Curl_handler_dict,
+#ifndef CURL_DISABLE_FILE
+ &Curl_handler_file,
+#endif
+
+#if defined(USE_SSH) && !defined(USE_WOLFSSH)
+ &Curl_handler_scp,
+#endif
+
+#ifndef CURL_DISABLE_SMTP
+ &Curl_handler_smtp,
+#ifdef USE_SSL
+ &Curl_handler_smtps,
+#endif
#endif
#ifndef CURL_DISABLE_LDAP
@@ -179,22 +210,6 @@ static const struct Curl_handler * const protocols[] = {
#endif
#endif
-#ifndef CURL_DISABLE_FILE
- &Curl_handler_file,
-#endif
-
-#ifndef CURL_DISABLE_TFTP
- &Curl_handler_tftp,
-#endif
-
-#if defined(USE_SSH)
- &Curl_handler_scp,
-#endif
-
-#if defined(USE_SSH)
- &Curl_handler_sftp,
-#endif
-
#ifndef CURL_DISABLE_IMAP
&Curl_handler_imap,
#ifdef USE_SSL
@@ -202,6 +217,14 @@ static const struct Curl_handler * const protocols[] = {
#endif
#endif
+#ifndef CURL_DISABLE_TELNET
+ &Curl_handler_telnet,
+#endif
+
+#ifndef CURL_DISABLE_TFTP
+ &Curl_handler_tftp,
+#endif
+
#ifndef CURL_DISABLE_POP3
&Curl_handler_pop3,
#ifdef USE_SSL
@@ -209,26 +232,22 @@ static const struct Curl_handler * const protocols[] = {
#endif
#endif
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
- (CURL_SIZEOF_CURL_OFF_T > 4) && \
- (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO))
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
+ (CURL_SIZEOF_CURL_OFF_T > 4)
&Curl_handler_smb,
#ifdef USE_SSL
&Curl_handler_smbs,
#endif
#endif
-#ifndef CURL_DISABLE_SMTP
- &Curl_handler_smtp,
-#ifdef USE_SSL
- &Curl_handler_smtps,
-#endif
-#endif
-
#ifndef CURL_DISABLE_RTSP
&Curl_handler_rtsp,
#endif
+#ifndef CURL_DISABLE_MQTT
+ &Curl_handler_mqtt,
+#endif
+
#ifndef CURL_DISABLE_GOPHER
&Curl_handler_gopher,
#endif
@@ -242,6 +261,10 @@ static const struct Curl_handler * const protocols[] = {
&Curl_handler_rtmpts,
#endif
+#ifndef CURL_DISABLE_DICT
+ &Curl_handler_dict,
+#endif
+
(struct Curl_handler *) NULL
};
@@ -267,6 +290,7 @@ static const struct Curl_handler Curl_handler_dummy = {
ZERO_NULL, /* connection_check */
0, /* defport */
0, /* protocol */
+ 0, /* family */
PROTOPT_NONE /* flags */
};
@@ -274,10 +298,16 @@ void Curl_freeset(struct Curl_easy *data)
{
/* Free all dynamic strings stored in the data->set substructure. */
enum dupstring i;
+ enum dupblob j;
+
for(i = (enum dupstring)0; i < STRING_LAST; i++) {
Curl_safefree(data->set.str[i]);
}
+ for(j = (enum dupblob)0; j < BLOB_LAST; j++) {
+ Curl_safefree(data->set.blobs[j]);
+ }
+
if(data->change.referer_alloc) {
Curl_safefree(data->change.referer);
data->change.referer_alloc = FALSE;
@@ -376,14 +406,11 @@ CURLcode Curl_close(struct Curl_easy **datap)
up_free(data);
Curl_safefree(data->state.buffer);
- Curl_safefree(data->state.headerbuff);
+ Curl_dyn_free(&data->state.headerb);
Curl_safefree(data->state.ulbuf);
Curl_flush_cookies(data, TRUE);
-#ifdef USE_ALTSVC
- Curl_altsvc_save(data->asi, data->set.str[STRING_ALTSVC]);
- Curl_altsvc_cleanup(data->asi);
- data->asi = NULL;
-#endif
+ Curl_altsvc_save(data, data->asi, data->set.str[STRING_ALTSVC]);
+ Curl_altsvc_cleanup(&data->asi);
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
Curl_http_auth_cleanup_digest(data);
#endif
@@ -403,9 +430,22 @@ CURLcode Curl_close(struct Curl_easy **datap)
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
}
- free(data->req.doh.probe[0].serverdoh.memory);
- free(data->req.doh.probe[1].serverdoh.memory);
+ Curl_safefree(data->state.aptr.proxyuserpwd);
+ Curl_safefree(data->state.aptr.uagent);
+ Curl_safefree(data->state.aptr.userpwd);
+ Curl_safefree(data->state.aptr.accept_encoding);
+ Curl_safefree(data->state.aptr.te);
+ Curl_safefree(data->state.aptr.rangeline);
+ Curl_safefree(data->state.aptr.ref);
+ Curl_safefree(data->state.aptr.host);
+ Curl_safefree(data->state.aptr.cookiehost);
+ Curl_safefree(data->state.aptr.rtsp_transport);
+
+#ifndef CURL_DISABLE_DOH
+ Curl_dyn_free(&data->req.doh.probe[0].serverdoh);
+ Curl_dyn_free(&data->req.doh.probe[1].serverdoh);
curl_slist_free_all(data->req.doh.headers);
+#endif
/* destruct wildcard structures if it is needed */
Curl_wildcard_dtor(&data->wildcard);
@@ -447,7 +487,7 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
set->postfieldsize = -1; /* unknown size */
set->maxredirs = -1; /* allow any amount by default */
- set->httpreq = HTTPREQ_GET; /* Default HTTP request */
+ set->method = HTTPREQ_GET; /* Default HTTP request */
set->rtspreq = RTSPREQ_OPTIONS; /* Default RTSP request */
#ifndef CURL_DISABLE_FTP
set->ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */
@@ -486,7 +526,9 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data)
type */
set->ssl.primary.sessionid = TRUE; /* session ID caching enabled by
default */
+#ifndef CURL_DISABLE_PROXY
set->proxy_ssl = set->ssl;
+#endif
set->new_file_perms = 0644; /* Default permissions */
set->new_directory_perms = 0755; /* Default permissions */
@@ -595,38 +637,22 @@ CURLcode Curl_open(struct Curl_easy **curl)
return result;
}
- /* We do some initial setup here, all those fields that can't be just 0 */
-
- data->state.buffer = malloc(READBUFFER_SIZE + 1);
- if(!data->state.buffer) {
- DEBUGF(fprintf(stderr, "Error: malloc of buffer failed\n"));
- result = CURLE_OUT_OF_MEMORY;
- }
- else {
- data->state.headerbuff = malloc(HEADERSIZE);
- if(!data->state.headerbuff) {
- DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n"));
- result = CURLE_OUT_OF_MEMORY;
- }
- else {
- result = Curl_init_userdefined(data);
-
- data->state.headersize = HEADERSIZE;
- Curl_convert_init(data);
- Curl_initinfo(data);
+ result = Curl_init_userdefined(data);
+ if(!result) {
+ Curl_dyn_init(&data->state.headerb, CURL_MAX_HTTP_HEADER);
+ Curl_convert_init(data);
+ Curl_initinfo(data);
- /* most recent connection is not yet defined */
- data->state.lastconnect = NULL;
+ /* most recent connection is not yet defined */
+ data->state.lastconnect_id = -1;
- data->progress.flags |= PGRS_HIDE;
- data->state.current_speed = -1; /* init to negative == impossible */
- }
+ data->progress.flags |= PGRS_HIDE;
+ data->state.current_speed = -1; /* init to negative == impossible */
}
if(result) {
Curl_resolver_cleanup(data->state.resolver);
- free(data->state.buffer);
- free(data->state.headerbuff);
+ Curl_dyn_free(&data->state.headerb);
Curl_freeset(data);
free(data);
data = NULL;
@@ -672,15 +698,13 @@ static void conn_reset_all_postponed_data(struct connectdata *conn)
}
#else /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
/* Use "do-nothing" macro instead of function when workaround not used */
-#define conn_reset_all_postponed_data(c) do {} WHILE_FALSE
+#define conn_reset_all_postponed_data(c) do {} while(0)
#endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
static void conn_shutdown(struct connectdata *conn)
{
- if(!conn)
- return;
-
+ DEBUGASSERT(conn);
infof(conn->data, "Closing connection %ld\n", conn->connection_id);
DEBUGASSERT(conn->data);
@@ -701,55 +725,40 @@ static void conn_shutdown(struct connectdata *conn)
Curl_closesocket(conn, conn->tempsock[0]);
if(CURL_SOCKET_BAD != conn->tempsock[1])
Curl_closesocket(conn, conn->tempsock[1]);
-
- /* unlink ourselves. this should be called last since other shutdown
- procedures need a valid conn->data and this may clear it. */
- Curl_conncache_remove_conn(conn->data, conn, TRUE);
}
static void conn_free(struct connectdata *conn)
{
- if(!conn)
- return;
-
- free_idnconverted_hostname(&conn->host);
- free_idnconverted_hostname(&conn->conn_to_host);
- free_idnconverted_hostname(&conn->http_proxy.host);
- free_idnconverted_hostname(&conn->socks_proxy.host);
+ DEBUGASSERT(conn);
- Curl_safefree(conn->user);
- Curl_safefree(conn->passwd);
- Curl_safefree(conn->oauth_bearer);
- Curl_safefree(conn->sasl_authzid);
- Curl_safefree(conn->options);
+ Curl_free_idnconverted_hostname(&conn->host);
+ Curl_free_idnconverted_hostname(&conn->conn_to_host);
+#ifndef CURL_DISABLE_PROXY
+ Curl_free_idnconverted_hostname(&conn->http_proxy.host);
+ Curl_free_idnconverted_hostname(&conn->socks_proxy.host);
Curl_safefree(conn->http_proxy.user);
Curl_safefree(conn->socks_proxy.user);
Curl_safefree(conn->http_proxy.passwd);
Curl_safefree(conn->socks_proxy.passwd);
- Curl_safefree(conn->allocptr.proxyuserpwd);
- Curl_safefree(conn->allocptr.uagent);
- Curl_safefree(conn->allocptr.userpwd);
- Curl_safefree(conn->allocptr.accept_encoding);
- Curl_safefree(conn->allocptr.te);
- Curl_safefree(conn->allocptr.rangeline);
- Curl_safefree(conn->allocptr.ref);
- Curl_safefree(conn->allocptr.host);
- Curl_safefree(conn->allocptr.cookiehost);
- Curl_safefree(conn->allocptr.rtsp_transport);
- Curl_safefree(conn->trailer);
+ Curl_safefree(conn->http_proxy.host.rawalloc); /* http proxy name buffer */
+ Curl_safefree(conn->socks_proxy.host.rawalloc); /* socks proxy name buffer */
+ Curl_free_primary_ssl_config(&conn->proxy_ssl_config);
+#endif
+ Curl_safefree(conn->user);
+ Curl_safefree(conn->passwd);
+ Curl_safefree(conn->sasl_authzid);
+ Curl_safefree(conn->options);
+ Curl_dyn_free(&conn->trailer);
Curl_safefree(conn->host.rawalloc); /* host name buffer */
Curl_safefree(conn->conn_to_host.rawalloc); /* host name buffer */
Curl_safefree(conn->hostname_resolve);
Curl_safefree(conn->secondaryhostname);
- Curl_safefree(conn->http_proxy.host.rawalloc); /* http proxy name buffer */
- Curl_safefree(conn->socks_proxy.host.rawalloc); /* socks proxy name buffer */
Curl_safefree(conn->connect_state);
conn_reset_all_postponed_data(conn);
Curl_llist_destroy(&conn->easyq, NULL);
Curl_safefree(conn->localdev);
Curl_free_primary_ssl_config(&conn->ssl_config);
- Curl_free_primary_ssl_config(&conn->proxy_ssl_config);
#ifdef USE_UNIX_SOCKETS
Curl_safefree(conn->unix_domain_socket);
@@ -778,13 +787,17 @@ static void conn_free(struct connectdata *conn)
CURLcode Curl_disconnect(struct Curl_easy *data,
struct connectdata *conn, bool dead_connection)
{
- if(!conn)
- return CURLE_OK; /* this is closed and fine already */
+ /* there must be a connection to close */
+ DEBUGASSERT(conn);
- if(!data) {
- DEBUGF(infof(data, "DISCONNECT without easy handle, ignoring\n"));
- return CURLE_OK;
- }
+ /* it must be removed from the connection cache */
+ DEBUGASSERT(!conn->bundle);
+
+ /* there must be an associated transfer */
+ DEBUGASSERT(data);
+
+ /* the transfer must be detached from the connection */
+ DEBUGASSERT(!data->conn);
/*
* If this connection isn't marked to force-close, leave it open if there
@@ -800,16 +813,11 @@ CURLcode Curl_disconnect(struct Curl_easy *data,
conn->dns_entry = NULL;
}
- Curl_hostcache_prune(data); /* kill old DNS cache entries */
-
-#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM)
/* Cleanup NTLM connection-related data */
Curl_http_auth_cleanup_ntlm(conn);
-#endif
-#if !defined(CURL_DISABLE_HTTP) && defined(USE_SPNEGO)
+
/* Cleanup NEGOTIATE connection-related data */
Curl_http_auth_cleanup_negotiate(conn);
-#endif
/* the protocol specific disconnect handler and conn_shutdown need a transfer
for the connection! */
@@ -871,8 +879,8 @@ static int IsMultiplexingPossible(const struct Curl_easy *handle,
#ifndef CURL_DISABLE_PROXY
static bool
-proxy_info_matches(const struct proxy_info* data,
- const struct proxy_info* needle)
+proxy_info_matches(const struct proxy_info *data,
+ const struct proxy_info *needle)
{
if((data->proxytype == needle->proxytype) &&
(data->port == needle->port) &&
@@ -881,9 +889,37 @@ proxy_info_matches(const struct proxy_info* data,
return FALSE;
}
+
+static bool
+socks_proxy_info_matches(const struct proxy_info *data,
+ const struct proxy_info *needle)
+{
+ if(!proxy_info_matches(data, needle))
+ return FALSE;
+
+ /* the user information is case-sensitive
+ or at least it is not defined as case-insensitive
+ see https://tools.ietf.org/html/rfc3986#section-3.2.1 */
+ if((data->user == NULL) != (needle->user == NULL))
+ return FALSE;
+ /* curl_strequal does a case insentive comparison, so do not use it here! */
+ if(data->user &&
+ needle->user &&
+ strcmp(data->user, needle->user) != 0)
+ return FALSE;
+ if((data->passwd == NULL) != (needle->passwd == NULL))
+ return FALSE;
+ /* curl_strequal does a case insentive comparison, so do not use it here! */
+ if(data->passwd &&
+ needle->passwd &&
+ strcmp(data->passwd, needle->passwd) != 0)
+ return FALSE;
+ return TRUE;
+}
#else
/* disabled, won't get called */
#define proxy_info_matches(x,y) FALSE
+#define socks_proxy_info_matches(x,y) FALSE
#endif
/* A connection has to have been idle for a shorter time than 'maxage_conn' to
@@ -978,8 +1014,12 @@ static int call_extract_if_dead(struct connectdata *conn, void *param)
static void prune_dead_connections(struct Curl_easy *data)
{
struct curltime now = Curl_now();
- timediff_t elapsed =
+ timediff_t elapsed;
+
+ CONNCACHE_LOCK(data);
+ elapsed =
Curl_timediff(now, data->state.conn_cache->last_cleanup);
+ CONNCACHE_UNLOCK(data);
if(elapsed >= 1000L) {
struct prunedead prune;
@@ -987,10 +1027,17 @@ static void prune_dead_connections(struct Curl_easy *data)
prune.extracted = NULL;
while(Curl_conncache_foreach(data, data->state.conn_cache, &prune,
call_extract_if_dead)) {
+ /* unlocked */
+
+ /* remove connection from cache */
+ Curl_conncache_remove_conn(data, prune.extracted, TRUE);
+
/* disconnect it */
- (void)Curl_disconnect(data, prune.extracted, /* dead_connection */TRUE);
+ (void)Curl_disconnect(data, prune.extracted, TRUE);
}
+ CONNCACHE_LOCK(data);
data->state.conn_cache->last_cleanup = now;
+ CONNCACHE_UNLOCK(data);
}
}
@@ -1023,10 +1070,14 @@ ConnectionExists(struct Curl_easy *data,
bool wantNTLMhttp = ((data->state.authhost.want &
(CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
(needle->handler->protocol & PROTO_FAMILY_HTTP));
+#ifndef CURL_DISABLE_PROXY
bool wantProxyNTLMhttp = (needle->bits.proxy_user_passwd &&
((data->state.authproxy.want &
(CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
(needle->handler->protocol & PROTO_FAMILY_HTTP)));
+#else
+ bool wantProxyNTLMhttp = FALSE;
+#endif
#endif
*force_reuse = FALSE;
@@ -1038,7 +1089,7 @@ ConnectionExists(struct Curl_easy *data,
&hostbundle);
if(bundle) {
/* Max pipe length is zero (unlimited) for multiplexed connections */
- struct curl_llist_element *curr;
+ struct Curl_llist_element *curr;
infof(data, "Found bundle for host %s: %p [%s]\n",
hostbundle, (void *)bundle, (bundle->multiuse == BUNDLE_MULTIPLEX ?
@@ -1050,7 +1101,7 @@ ConnectionExists(struct Curl_easy *data,
if(data->set.pipewait) {
infof(data, "Server doesn't support multiplex yet, wait\n");
*waitpipe = TRUE;
- Curl_conncache_unlock(data);
+ CONNCACHE_UNLOCK(data);
return FALSE; /* no re-use */
}
@@ -1071,7 +1122,7 @@ ConnectionExists(struct Curl_easy *data,
curr = bundle->conn_list.head;
while(curr) {
bool match = FALSE;
- size_t multiplexed;
+ size_t multiplexed = 0;
/*
* Note that if we use a HTTP proxy in normal mode (no tunneling), we
@@ -1080,16 +1131,21 @@ ConnectionExists(struct Curl_easy *data,
check = curr->ptr;
curr = curr->next;
- if(check->bits.connect_only)
- /* connect-only connections will not be reused */
+ if(check->bits.connect_only || check->bits.close)
+ /* connect-only or to-be-closed connections will not be reused */
continue;
- multiplexed = CONN_INUSE(check) &&
- (bundle->multiuse == BUNDLE_MULTIPLEX);
+ if(extract_if_dead(check, data)) {
+ /* disconnect it */
+ (void)Curl_disconnect(data, check, TRUE);
+ continue;
+ }
+
+ if(bundle->multiuse == BUNDLE_MULTIPLEX)
+ multiplexed = CONN_INUSE(check);
if(canmultiplex) {
- if(check->bits.protoconnstart && check->bits.close)
- continue;
+ ;
}
else {
if(multiplexed) {
@@ -1109,12 +1165,9 @@ ConnectionExists(struct Curl_easy *data,
}
}
- if((check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) ||
- check->bits.close) {
- if(!check->bits.close)
- foundPendingCandidate = TRUE;
- /* Don't pick a connection that hasn't connected yet or that is going
- to get closed. */
+ if(check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) {
+ foundPendingCandidate = TRUE;
+ /* Don't pick a connection that hasn't connected yet */
infof(data, "Connection #%ld isn't open enough, can't reuse\n",
check->connection_id);
continue;
@@ -1127,7 +1180,8 @@ ConnectionExists(struct Curl_easy *data,
continue;
if(strcmp(needle->unix_domain_socket, check->unix_domain_socket))
continue;
- if(needle->abstract_unix_socket != check->abstract_unix_socket)
+ if(needle->bits.abstract_unix_socket !=
+ check->bits.abstract_unix_socket)
continue;
}
else if(check->unix_domain_socket)
@@ -1137,19 +1191,21 @@ ConnectionExists(struct Curl_easy *data,
if((needle->handler->flags&PROTOPT_SSL) !=
(check->handler->flags&PROTOPT_SSL))
/* don't do mixed SSL and non-SSL connections */
- if(get_protocol_family(check->handler->protocol) !=
- needle->handler->protocol || !check->tls_upgraded)
+ if(get_protocol_family(check->handler) !=
+ needle->handler->protocol || !check->bits.tls_upgraded)
/* except protocols that have been upgraded via TLS */
continue;
+#ifndef CURL_DISABLE_PROXY
if(needle->bits.httpproxy != check->bits.httpproxy ||
needle->bits.socksproxy != check->bits.socksproxy)
continue;
- if(needle->bits.socksproxy && !proxy_info_matches(&needle->socks_proxy,
- &check->socks_proxy))
+ if(needle->bits.socksproxy &&
+ !socks_proxy_info_matches(&needle->socks_proxy,
+ &check->socks_proxy))
continue;
-
+#endif
if(needle->bits.conn_to_host != check->bits.conn_to_host)
/* don't mix connections that use the "connect to host" feature and
* connections that don't use this feature */
@@ -1160,6 +1216,7 @@ ConnectionExists(struct Curl_easy *data,
* connections that don't use this feature */
continue;
+#ifndef CURL_DISABLE_PROXY
if(needle->bits.httpproxy) {
if(!proxy_info_matches(&needle->http_proxy, &check->http_proxy))
continue;
@@ -1186,14 +1243,16 @@ ConnectionExists(struct Curl_easy *data,
}
}
}
+#endif
+
+ DEBUGASSERT(!check->data || GOOD_EASY_HANDLE(check->data));
if(!canmultiplex && check->data)
/* this request can't be multiplexed but the checked connection is
already in use so we skip it */
continue;
- if(CONN_INUSE(check) && check->data &&
- (check->data->multi != needle->data->multi))
+ if(check->data && (check->data->multi != needle->data->multi))
/* this could be subject for multiplex use, but only if they belong to
* the same multi handle */
continue;
@@ -1227,22 +1286,25 @@ ConnectionExists(struct Curl_easy *data,
}
}
- if(!needle->bits.httpproxy || (needle->handler->flags&PROTOPT_SSL) ||
- needle->bits.tunnel_proxy) {
+ if((needle->handler->flags&PROTOPT_SSL)
+#ifndef CURL_DISABLE_PROXY
+ || !needle->bits.httpproxy || needle->bits.tunnel_proxy
+#endif
+ ) {
/* The requested connection does not use a HTTP proxy or it uses SSL or
it is a non-SSL protocol tunneled or it is a non-SSL protocol which
is allowed to be upgraded via TLS */
if((strcasecompare(needle->handler->scheme, check->handler->scheme) ||
- (get_protocol_family(check->handler->protocol) ==
- needle->handler->protocol && check->tls_upgraded)) &&
+ (get_protocol_family(check->handler) ==
+ needle->handler->protocol && check->bits.tls_upgraded)) &&
(!needle->bits.conn_to_host || strcasecompare(
needle->conn_to_host.name, check->conn_to_host.name)) &&
(!needle->bits.conn_to_port ||
needle->conn_to_port == check->conn_to_port) &&
strcasecompare(needle->host.name, check->host.name) &&
needle->remote_port == check->remote_port) {
- /* The schemes match or the the protocol family is the same and the
+ /* The schemes match or the protocol family is the same and the
previous connection was TLS upgraded, and the hostname and host
port match */
if(needle->handler->flags & PROTOPT_SSL) {
@@ -1297,6 +1359,7 @@ ConnectionExists(struct Curl_easy *data,
continue;
}
+#ifndef CURL_DISABLE_PROXY
/* Same for Proxy NTLM authentication */
if(wantProxyNTLMhttp) {
/* Both check->http_proxy.user and check->http_proxy.passwd can be
@@ -1312,7 +1375,7 @@ ConnectionExists(struct Curl_easy *data,
/* Proxy connection is using NTLM auth but we don't want NTLM */
continue;
}
-
+#endif
if(wantNTLMhttp || wantProxyNTLMhttp) {
/* Credentials are already checked, we can use this connection */
chosen = check;
@@ -1350,6 +1413,13 @@ ConnectionExists(struct Curl_easy *data,
multiplexed);
continue;
}
+ else if(multiplexed >=
+ Curl_multi_max_concurrent_streams(needle->data->multi)) {
+ infof(data, "client side MAX_CONCURRENT_STREAMS reached"
+ ", skip (%zu)\n",
+ multiplexed);
+ continue;
+ }
}
#endif
/* When not multiplexed, we have a match here! */
@@ -1369,11 +1439,12 @@ ConnectionExists(struct Curl_easy *data,
if(chosen) {
/* mark it as used before releasing the lock */
chosen->data = data; /* own it! */
- Curl_conncache_unlock(data);
+ Curl_attach_connnection(data, chosen);
+ CONNCACHE_UNLOCK(data);
*usethis = chosen;
return TRUE; /* yes, we found one to use! */
}
- Curl_conncache_unlock(data);
+ CONNCACHE_UNLOCK(data);
if(foundPendingCandidate && data->set.pipewait) {
infof(data,
@@ -1392,8 +1463,10 @@ void Curl_verboseconnect(struct connectdata *conn)
{
if(conn->data->set.verbose)
infof(conn->data, "Connected to %s (%s) port %ld (#%ld)\n",
+#ifndef CURL_DISABLE_PROXY
conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
conn->bits.httpproxy ? conn->http_proxy.host.dispname :
+#endif
conn->bits.conn_to_host ? conn->conn_to_host.dispname :
conn->host.dispname,
conn->ip_addr_str, conn->port, conn->connection_id);
@@ -1403,10 +1476,14 @@ void Curl_verboseconnect(struct connectdata *conn)
/*
* Helpers for IDNA conversions.
*/
-static bool is_ASCII_name(const char *hostname)
+bool Curl_is_ASCII_name(const char *hostname)
{
+ /* get an UNSIGNED local version of the pointer */
const unsigned char *ch = (const unsigned char *)hostname;
+ if(!hostname) /* bad input, consider it ASCII! */
+ return TRUE;
+
while(*ch) {
if(*ch++ & 0x80)
return FALSE;
@@ -1431,8 +1508,8 @@ static void strip_trailing_dot(struct hostname *host)
/*
* Perform any necessary IDN conversion of hostname
*/
-static CURLcode idnconvert_hostname(struct connectdata *conn,
- struct hostname *host)
+CURLcode Curl_idnconvert_hostname(struct connectdata *conn,
+ struct hostname *host)
{
struct Curl_easy *data = conn->data;
@@ -1447,7 +1524,7 @@ static CURLcode idnconvert_hostname(struct connectdata *conn,
host->dispname = host->name;
/* Check name for non-ASCII and convert hostname to ACE form if we can */
- if(!is_ASCII_name(host->name)) {
+ if(!Curl_is_ASCII_name(host->name)) {
#ifdef USE_LIBIDN2
if(idn2_check_version(IDN2_VERSION)) {
char *ace_hostname = NULL;
@@ -1480,7 +1557,9 @@ static CURLcode idnconvert_hostname(struct connectdata *conn,
host->name = host->encalloc;
}
else {
- failf(data, "Failed to convert %s to ACE;\n", host->name);
+ char buffer[STRERROR_LEN];
+ failf(data, "Failed to convert %s to ACE; %s\n", host->name,
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
return CURLE_URL_MALFORMAT;
}
#else
@@ -1493,7 +1572,7 @@ static CURLcode idnconvert_hostname(struct connectdata *conn,
/*
* Frees data allocated by idnconvert_hostname()
*/
-static void free_idnconverted_hostname(struct hostname *host)
+void Curl_free_idnconverted_hostname(struct hostname *host)
{
#if defined(USE_LIBIDN2)
if(host->encalloc) {
@@ -1534,8 +1613,10 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->ssl_extra = ssl;
conn->ssl[0].backend = (void *)ssl;
conn->ssl[1].backend = (void *)(ssl + sslsize);
+#ifndef CURL_DISABLE_PROXY
conn->proxy_ssl[0].backend = (void *)(ssl + 2 * sslsize);
conn->proxy_ssl[1].backend = (void *)(ssl + 3 * sslsize);
+#endif
}
#endif
@@ -1574,10 +1655,10 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->data = data; /* Setup the association between this connection
and the Curl_easy */
+#ifndef CURL_DISABLE_PROXY
conn->http_proxy.proxytype = data->set.proxytype;
conn->socks_proxy.proxytype = CURLPROXY_SOCKS4;
-#if !defined(CURL_DISABLE_PROXY)
/* note that these two proxy bits are now just on what looks to be
requested, they may be altered down the road */
conn->bits.proxy = (data->set.str[STRING_PROXY] &&
@@ -1608,17 +1689,20 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
conn->ssl_config.verifystatus = data->set.ssl.primary.verifystatus;
conn->ssl_config.verifypeer = data->set.ssl.primary.verifypeer;
conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost;
+#ifndef CURL_DISABLE_PROXY
conn->proxy_ssl_config.verifystatus =
data->set.proxy_ssl.primary.verifystatus;
conn->proxy_ssl_config.verifypeer = data->set.proxy_ssl.primary.verifypeer;
conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
+#endif
conn->ip_version = data->set.ipver;
conn->bits.connect_only = data->set.connect_only;
conn->transport = TRNSPRT_TCP; /* most of them are TCP streams */
#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
defined(NTLM_WB_ENABLED)
- conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ conn->ntlm.ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
+ conn->proxyntlm.ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
#endif
/* Initialize the easy handle list */
@@ -1641,6 +1725,7 @@ static struct connectdata *allocate_conn(struct Curl_easy *data)
it may live on without (this specific) Curl_easy */
conn->fclosesocket = data->set.fclosesocket;
conn->closesocket_client = data->set.closesocket_client;
+ conn->lastused = Curl_now(); /* used now */
return conn;
error:
@@ -1771,11 +1856,12 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
CURLU *uh;
CURLUcode uc;
char *hostname;
+ bool use_set_uh = (data->set.uh && !data->state.this_is_a_follow);
up_free(data); /* cleanup previous leftovers first */
/* parse the URL */
- if(data->set.uh) {
+ if(use_set_uh) {
uh = data->state.uh = curl_url_dup(data->set.uh);
}
else {
@@ -1798,7 +1884,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
data->change.url_alloc = TRUE;
}
- if(!data->set.uh) {
+ if(!use_set_uh) {
char *newurl;
uc = curl_url_set(uh, CURLUPART_URL, data->change.url,
CURLU_GUESS_SCHEME |
@@ -1829,23 +1915,32 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
if(result)
return result;
- uc = curl_url_get(uh, CURLUPART_USER, &data->state.up.user,
- CURLU_URLDECODE);
+ /* we don't use the URL API's URL decoder option here since it rejects
+ control codes and we want to allow them for some schemes in the user and
+ password fields */
+ uc = curl_url_get(uh, CURLUPART_USER, &data->state.up.user, 0);
if(!uc) {
- conn->user = strdup(data->state.up.user);
- if(!conn->user)
- return CURLE_OUT_OF_MEMORY;
+ char *decoded;
+ result = Curl_urldecode(NULL, data->state.up.user, 0, &decoded, NULL,
+ conn->handler->flags&PROTOPT_USERPWDCTRL ?
+ REJECT_ZERO : REJECT_CTRL);
+ if(result)
+ return result;
+ conn->user = decoded;
conn->bits.user_passwd = TRUE;
}
else if(uc != CURLUE_NO_USER)
return Curl_uc_to_curlcode(uc);
- uc = curl_url_get(uh, CURLUPART_PASSWORD, &data->state.up.password,
- CURLU_URLDECODE);
+ uc = curl_url_get(uh, CURLUPART_PASSWORD, &data->state.up.password, 0);
if(!uc) {
- conn->passwd = strdup(data->state.up.password);
- if(!conn->passwd)
- return CURLE_OUT_OF_MEMORY;
+ char *decoded;
+ result = Curl_urldecode(NULL, data->state.up.password, 0, &decoded, NULL,
+ conn->handler->flags&PROTOPT_USERPWDCTRL ?
+ REJECT_ZERO : REJECT_CTRL);
+ if(result)
+ return result;
+ conn->passwd = decoded;
conn->bits.user_passwd = TRUE;
}
else if(uc != CURLUE_NO_PASSWORD)
@@ -1955,7 +2050,7 @@ static CURLcode setup_range(struct Curl_easy *data)
*/
static CURLcode setup_connection_internals(struct connectdata *conn)
{
- const struct Curl_handler * p;
+ const struct Curl_handler *p;
CURLcode result;
/* Perform setup complement if some. */
@@ -1987,8 +2082,11 @@ void Curl_free_request_state(struct Curl_easy *data)
{
Curl_safefree(data->req.protop);
Curl_safefree(data->req.newurl);
+
+#ifndef CURL_DISABLE_DOH
Curl_close(&data->req.doh.probe[0].easy);
Curl_close(&data->req.doh.probe[1].easy);
+#endif
}
@@ -2299,26 +2397,18 @@ static CURLcode parse_proxy(struct Curl_easy *data,
static CURLcode parse_proxy_auth(struct Curl_easy *data,
struct connectdata *conn)
{
- char proxyuser[MAX_CURL_USER_LENGTH]="";
- char proxypasswd[MAX_CURL_PASSWORD_LENGTH]="";
- CURLcode result;
-
- if(data->set.str[STRING_PROXYUSERNAME] != NULL) {
- strncpy(proxyuser, data->set.str[STRING_PROXYUSERNAME],
- MAX_CURL_USER_LENGTH);
- proxyuser[MAX_CURL_USER_LENGTH-1] = '\0'; /*To be on safe side*/
- }
- if(data->set.str[STRING_PROXYPASSWORD] != NULL) {
- strncpy(proxypasswd, data->set.str[STRING_PROXYPASSWORD],
- MAX_CURL_PASSWORD_LENGTH);
- proxypasswd[MAX_CURL_PASSWORD_LENGTH-1] = '\0'; /*To be on safe side*/
- }
+ const char *proxyuser = data->set.str[STRING_PROXYUSERNAME] ?
+ data->set.str[STRING_PROXYUSERNAME] : "";
+ const char *proxypasswd = data->set.str[STRING_PROXYPASSWORD] ?
+ data->set.str[STRING_PROXYPASSWORD] : "";
+ CURLcode result = CURLE_OK;
- result = Curl_urldecode(data, proxyuser, 0, &conn->http_proxy.user, NULL,
- FALSE);
- if(!result)
+ if(proxyuser)
+ result = Curl_urldecode(data, proxyuser, 0, &conn->http_proxy.user, NULL,
+ REJECT_ZERO);
+ if(!result && proxypasswd)
result = Curl_urldecode(data, proxypasswd, 0, &conn->http_proxy.passwd,
- NULL, FALSE);
+ NULL, REJECT_ZERO);
return result;
}
@@ -2483,6 +2573,9 @@ static CURLcode create_conn_helper_init_proxy(struct connectdata *conn)
conn->bits.socksproxy = FALSE;
conn->bits.proxy_user_passwd = FALSE;
conn->bits.tunnel_proxy = FALSE;
+ /* CURLPROXY_HTTPS does not have its own flag in conn->bits, yet we need
+ to signal that CURLPROXY_HTTPS is not used for this connection */
+ conn->http_proxy.proxytype = CURLPROXY_HTTP;
}
out:
@@ -2536,6 +2629,12 @@ CURLcode Curl_parse_login_details(const char *login, const size_t len,
size_t plen;
size_t olen;
+ /* the input length check is because this is called directcly from setopt
+ and isn't going through the regular string length check */
+ size_t llen = strlen(login);
+ if(llen > CURL_MAX_INPUT_LENGTH)
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
/* Attempt to find the password separator */
if(passwdp) {
psep = strchr(login, ':');
@@ -2732,12 +2831,14 @@ static CURLcode override_login(struct Curl_easy *data,
/* for updated strings, we update them in the URL */
if(user_changed) {
- uc = curl_url_set(data->state.uh, CURLUPART_USER, *userp, 0);
+ uc = curl_url_set(data->state.uh, CURLUPART_USER, *userp,
+ CURLU_URLENCODE);
if(uc)
return Curl_uc_to_curlcode(uc);
}
if(passwd_changed) {
- uc = curl_url_set(data->state.uh, CURLUPART_PASSWORD, *passwdp, 0);
+ uc = curl_url_set(data->state.uh, CURLUPART_PASSWORD, *passwdp,
+ CURLU_URLENCODE);
if(uc)
return Curl_uc_to_curlcode(uc);
}
@@ -2996,7 +3097,14 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
#ifdef USE_ALTSVC
if(data->asi && !host && (port == -1) &&
- (conn->handler->protocol == CURLPROTO_HTTPS)) {
+ ((conn->handler->protocol == CURLPROTO_HTTPS) ||
+#ifdef CURLDEBUG
+ /* allow debug builds to circumvent the HTTPS restriction */
+ getenv("CURL_ALTSVC_HTTP")
+#else
+ 0
+#endif
+ )) {
/* no connect_to match, try alt-svc! */
enum alpnid srcalpnid;
bool hit;
@@ -3088,7 +3196,7 @@ static CURLcode resolve_server(struct Curl_easy *data,
else {
/* this is a fresh connect */
int rc;
- struct Curl_dns_entry *hostaddr;
+ struct Curl_dns_entry *hostaddr = NULL;
#ifdef USE_UNIX_SOCKETS
if(conn->unix_domain_socket) {
@@ -3103,7 +3211,7 @@ static CURLcode resolve_server(struct Curl_easy *data,
else {
bool longpath = FALSE;
hostaddr->addr = Curl_unix2addr(path, &longpath,
- conn->abstract_unix_socket);
+ conn->bits.abstract_unix_socket);
if(hostaddr->addr)
hostaddr->inuse++;
else {
@@ -3121,6 +3229,7 @@ static CURLcode resolve_server(struct Curl_easy *data,
}
else
#endif
+
if(!conn->bits.proxy) {
struct hostname *connhost;
if(conn->bits.conn_to_host)
@@ -3149,10 +3258,11 @@ static CURLcode resolve_server(struct Curl_easy *data,
else if(!hostaddr) {
failf(data, "Couldn't resolve host '%s'", connhost->dispname);
- result = CURLE_COULDNT_RESOLVE_HOST;
+ result = CURLE_COULDNT_RESOLVE_HOST;
/* don't return yet, we need to clean up the timeout first */
}
}
+#ifndef CURL_DISABLE_PROXY
else {
/* This is a proxy that hasn't been resolved yet. */
@@ -3178,6 +3288,7 @@ static CURLcode resolve_server(struct Curl_easy *data,
/* don't return yet, we need to clean up the timeout first */
}
}
+#endif
DEBUGASSERT(conn->dns_entry == NULL);
conn->dns_entry = hostaddr;
}
@@ -3193,16 +3304,17 @@ static CURLcode resolve_server(struct Curl_easy *data,
static void reuse_conn(struct connectdata *old_conn,
struct connectdata *conn)
{
- free_idnconverted_hostname(&old_conn->http_proxy.host);
- free_idnconverted_hostname(&old_conn->socks_proxy.host);
+#ifndef CURL_DISABLE_PROXY
+ Curl_free_idnconverted_hostname(&old_conn->http_proxy.host);
+ Curl_free_idnconverted_hostname(&old_conn->socks_proxy.host);
free(old_conn->http_proxy.host.rawalloc);
free(old_conn->socks_proxy.host.rawalloc);
-
+ Curl_free_primary_ssl_config(&old_conn->proxy_ssl_config);
+#endif
/* free the SSL config struct from this connection struct as this was
allocated in vain and is targeted for destruction */
Curl_free_primary_ssl_config(&old_conn->ssl_config);
- Curl_free_primary_ssl_config(&old_conn->proxy_ssl_config);
conn->data = old_conn->data;
@@ -3219,6 +3331,7 @@ static void reuse_conn(struct connectdata *old_conn,
old_conn->passwd = NULL;
}
+#ifndef CURL_DISABLE_PROXY
conn->bits.proxy_user_passwd = old_conn->bits.proxy_user_passwd;
if(conn->bits.proxy_user_passwd) {
/* use the new proxy user name and proxy password though */
@@ -3235,11 +3348,16 @@ static void reuse_conn(struct connectdata *old_conn,
old_conn->http_proxy.passwd = NULL;
old_conn->socks_proxy.passwd = NULL;
}
+ Curl_safefree(old_conn->http_proxy.user);
+ Curl_safefree(old_conn->socks_proxy.user);
+ Curl_safefree(old_conn->http_proxy.passwd);
+ Curl_safefree(old_conn->socks_proxy.passwd);
+#endif
/* host can change, when doing keepalive with a proxy or if the case is
different this time etc */
- free_idnconverted_hostname(&conn->host);
- free_idnconverted_hostname(&conn->conn_to_host);
+ Curl_free_idnconverted_hostname(&conn->host);
+ Curl_free_idnconverted_hostname(&conn->conn_to_host);
Curl_safefree(conn->host.rawalloc);
Curl_safefree(conn->conn_to_host.rawalloc);
conn->host = old_conn->host;
@@ -3262,10 +3380,6 @@ static void reuse_conn(struct connectdata *old_conn,
Curl_safefree(old_conn->user);
Curl_safefree(old_conn->passwd);
Curl_safefree(old_conn->options);
- Curl_safefree(old_conn->http_proxy.user);
- Curl_safefree(old_conn->socks_proxy.user);
- Curl_safefree(old_conn->http_proxy.passwd);
- Curl_safefree(old_conn->socks_proxy.passwd);
Curl_safefree(old_conn->localdev);
Curl_llist_destroy(&old_conn->easyq, NULL);
@@ -3335,14 +3449,6 @@ static CURLcode create_conn(struct Curl_easy *data,
if(result)
goto out;
- if(data->set.str[STRING_BEARER]) {
- conn->oauth_bearer = strdup(data->set.str[STRING_BEARER]);
- if(!conn->oauth_bearer) {
- result = CURLE_OUT_OF_MEMORY;
- goto out;
- }
- }
-
if(data->set.str[STRING_SASL_AUTHZID]) {
conn->sasl_authzid = strdup(data->set.str[STRING_SASL_AUTHZID]);
if(!conn->sasl_authzid) {
@@ -3358,7 +3464,7 @@ static CURLcode create_conn(struct Curl_easy *data,
result = CURLE_OUT_OF_MEMORY;
goto out;
}
- conn->abstract_unix_socket = data->set.abstract_unix_socket;
+ conn->bits.abstract_unix_socket = data->set.abstract_unix_socket;
}
#endif
@@ -3368,7 +3474,6 @@ static CURLcode create_conn(struct Curl_easy *data,
result = create_conn_helper_init_proxy(conn);
if(result)
goto out;
-#endif
/*************************************************************
* If the protocol is using SSL and HTTP proxy is used, we set
@@ -3376,6 +3481,7 @@ static CURLcode create_conn(struct Curl_easy *data,
*************************************************************/
if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy)
conn->bits.tunnel_proxy = TRUE;
+#endif
/*************************************************************
* Figure out the remote port number and fix it in the URL
@@ -3406,24 +3512,26 @@ static CURLcode create_conn(struct Curl_easy *data,
/*************************************************************
* IDN-convert the hostnames
*************************************************************/
- result = idnconvert_hostname(conn, &conn->host);
+ result = Curl_idnconvert_hostname(conn, &conn->host);
if(result)
goto out;
if(conn->bits.conn_to_host) {
- result = idnconvert_hostname(conn, &conn->conn_to_host);
+ result = Curl_idnconvert_hostname(conn, &conn->conn_to_host);
if(result)
goto out;
}
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.httpproxy) {
- result = idnconvert_hostname(conn, &conn->http_proxy.host);
+ result = Curl_idnconvert_hostname(conn, &conn->http_proxy.host);
if(result)
goto out;
}
if(conn->bits.socksproxy) {
- result = idnconvert_hostname(conn, &conn->socks_proxy.host);
+ result = Curl_idnconvert_hostname(conn, &conn->socks_proxy.host);
if(result)
goto out;
}
+#endif
/*************************************************************
* Check whether the host and the "connect to host" are equal.
@@ -3442,6 +3550,7 @@ static CURLcode create_conn(struct Curl_easy *data,
conn->bits.conn_to_port = FALSE;
}
+#ifndef CURL_DISABLE_PROXY
/*************************************************************
* If the "connect to" feature is used with an HTTP proxy,
* we set the tunnel_proxy bit.
@@ -3449,6 +3558,7 @@ static CURLcode create_conn(struct Curl_easy *data,
if((conn->bits.conn_to_host || conn->bits.conn_to_port) &&
conn->bits.httpproxy)
conn->bits.tunnel_proxy = TRUE;
+#endif
/*************************************************************
* Setup internals depending on protocol. Needs to be done after
@@ -3481,6 +3591,7 @@ static CURLcode create_conn(struct Curl_easy *data,
if(!result) {
conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; /* we are "connected */
+ Curl_attach_connnection(data, conn);
result = Curl_conncache_add_conn(data->state.conn_cache, conn);
if(result)
goto out;
@@ -3495,7 +3606,6 @@ static CURLcode create_conn(struct Curl_easy *data,
(void)conn->handler->done(conn, result, FALSE);
goto out;
}
- Curl_attach_connnection(data, conn);
Curl_setup_transfer(data, -1, -1, FALSE, -1);
}
@@ -3516,61 +3626,72 @@ static CURLcode create_conn(struct Curl_easy *data,
copies will be separately allocated.
*/
data->set.ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_ORIG];
- data->set.proxy_ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_PROXY];
data->set.ssl.primary.CAfile = data->set.str[STRING_SSL_CAFILE_ORIG];
- data->set.proxy_ssl.primary.CAfile = data->set.str[STRING_SSL_CAFILE_PROXY];
data->set.ssl.primary.random_file = data->set.str[STRING_SSL_RANDOM_FILE];
- data->set.proxy_ssl.primary.random_file =
- data->set.str[STRING_SSL_RANDOM_FILE];
data->set.ssl.primary.egdsocket = data->set.str[STRING_SSL_EGDSOCKET];
- data->set.proxy_ssl.primary.egdsocket = data->set.str[STRING_SSL_EGDSOCKET];
data->set.ssl.primary.cipher_list =
data->set.str[STRING_SSL_CIPHER_LIST_ORIG];
- data->set.proxy_ssl.primary.cipher_list =
- data->set.str[STRING_SSL_CIPHER_LIST_PROXY];
data->set.ssl.primary.cipher_list13 =
data->set.str[STRING_SSL_CIPHER13_LIST_ORIG];
- data->set.proxy_ssl.primary.cipher_list13 =
- data->set.str[STRING_SSL_CIPHER13_LIST_PROXY];
data->set.ssl.primary.pinned_key =
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+ data->set.ssl.primary.cert_blob = data->set.blobs[BLOB_CERT_ORIG];
+ data->set.ssl.primary.curves = data->set.str[STRING_SSL_EC_CURVES];
+
+#ifndef CURL_DISABLE_PROXY
+ data->set.proxy_ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_PROXY];
+ data->set.proxy_ssl.primary.CAfile = data->set.str[STRING_SSL_CAFILE_PROXY];
+ data->set.proxy_ssl.primary.random_file =
+ data->set.str[STRING_SSL_RANDOM_FILE];
+ data->set.proxy_ssl.primary.egdsocket = data->set.str[STRING_SSL_EGDSOCKET];
+ data->set.proxy_ssl.primary.cipher_list =
+ data->set.str[STRING_SSL_CIPHER_LIST_PROXY];
+ data->set.proxy_ssl.primary.cipher_list13 =
+ data->set.str[STRING_SSL_CIPHER13_LIST_PROXY];
data->set.proxy_ssl.primary.pinned_key =
data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY];
-
- data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG];
+ data->set.proxy_ssl.primary.cert_blob = data->set.blobs[BLOB_CERT_PROXY];
data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY];
- data->set.ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_ORIG];
data->set.proxy_ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_PROXY];
- data->set.ssl.cert = data->set.str[STRING_CERT_ORIG];
- data->set.proxy_ssl.cert = data->set.str[STRING_CERT_PROXY];
- data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE_ORIG];
data->set.proxy_ssl.cert_type = data->set.str[STRING_CERT_TYPE_PROXY];
- data->set.ssl.key = data->set.str[STRING_KEY_ORIG];
data->set.proxy_ssl.key = data->set.str[STRING_KEY_PROXY];
- data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE_ORIG];
data->set.proxy_ssl.key_type = data->set.str[STRING_KEY_TYPE_PROXY];
- data->set.ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_ORIG];
data->set.proxy_ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_PROXY];
- data->set.ssl.primary.clientcert = data->set.str[STRING_CERT_ORIG];
data->set.proxy_ssl.primary.clientcert = data->set.str[STRING_CERT_PROXY];
+ data->set.proxy_ssl.key_blob = data->set.blobs[BLOB_KEY_PROXY];
+#endif
+ data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG];
+ data->set.ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_ORIG];
+ data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE_ORIG];
+ data->set.ssl.key = data->set.str[STRING_KEY_ORIG];
+ data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE_ORIG];
+ data->set.ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_ORIG];
+ data->set.ssl.primary.clientcert = data->set.str[STRING_CERT_ORIG];
#ifdef USE_TLS_SRP
data->set.ssl.username = data->set.str[STRING_TLSAUTH_USERNAME_ORIG];
- data->set.proxy_ssl.username = data->set.str[STRING_TLSAUTH_USERNAME_PROXY];
data->set.ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD_ORIG];
+#ifndef CURL_DISABLE_PROXY
+ data->set.proxy_ssl.username = data->set.str[STRING_TLSAUTH_USERNAME_PROXY];
data->set.proxy_ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD_PROXY];
#endif
+#endif
+
+ data->set.ssl.key_blob = data->set.blobs[BLOB_KEY_ORIG];
+ data->set.ssl.issuercert_blob = data->set.blobs[BLOB_SSL_ISSUERCERT_ORIG];
if(!Curl_clone_primary_ssl_config(&data->set.ssl.primary,
- &conn->ssl_config)) {
+ &conn->ssl_config)) {
result = CURLE_OUT_OF_MEMORY;
goto out;
}
+#ifndef CURL_DISABLE_PROXY
if(!Curl_clone_primary_ssl_config(&data->set.proxy_ssl.primary,
&conn->proxy_ssl_config)) {
result = CURLE_OUT_OF_MEMORY;
goto out;
}
+#endif
prune_dead_connections(data);
@@ -3593,25 +3714,6 @@ static CURLcode create_conn(struct Curl_easy *data,
else
reuse = ConnectionExists(data, conn, &conn_temp, &force_reuse, &waitpipe);
- /* If we found a reusable connection that is now marked as in use, we may
- still want to open a new connection if we are multiplexing. */
- if(reuse && !force_reuse && IsMultiplexingPossible(data, conn_temp)) {
- size_t multiplexed = CONN_INUSE(conn_temp);
- if(multiplexed > 0) {
- infof(data, "Found connection %ld, with %zu requests on it\n",
- conn_temp->connection_id, multiplexed);
-
- if(Curl_conncache_bundle_size(conn_temp) < max_host_connections &&
- Curl_conncache_size(data) < max_total_connections) {
- /* We want a new connection anyway */
- reuse = FALSE;
-
- infof(data, "We can reuse, but we want a new connection anyway\n");
- Curl_conncache_return_conn(conn_temp);
- }
- }
- }
-
if(reuse) {
/*
* We already have a connection for this, we got the former connection
@@ -3627,12 +3729,17 @@ static CURLcode create_conn(struct Curl_easy *data,
conn = conn_temp;
*in_connect = conn;
+#ifndef CURL_DISABLE_PROXY
infof(data, "Re-using existing connection! (#%ld) with %s %s\n",
conn->connection_id,
conn->bits.proxy?"proxy":"host",
conn->socks_proxy.host.name ? conn->socks_proxy.host.dispname :
conn->http_proxy.host.name ? conn->http_proxy.host.dispname :
- conn->host.dispname);
+ conn->host.dispname);
+#else
+ infof(data, "Re-using existing connection! (#%ld) with host %s\n",
+ conn->connection_id, conn->host.dispname);
+#endif
}
else {
/* We have decided that we want a new connection. However, we may not
@@ -3664,11 +3771,10 @@ static CURLcode create_conn(struct Curl_easy *data,
/* The bundle is full. Extract the oldest connection. */
conn_candidate = Curl_conncache_extract_bundle(data, bundle);
- Curl_conncache_unlock(data);
+ CONNCACHE_UNLOCK(data);
if(conn_candidate)
- (void)Curl_disconnect(data, conn_candidate,
- /* dead_connection */ FALSE);
+ (void)Curl_disconnect(data, conn_candidate, FALSE);
else {
infof(data, "No more connections allowed to host %s: %zu\n",
bundlehost, max_host_connections);
@@ -3676,7 +3782,7 @@ static CURLcode create_conn(struct Curl_easy *data,
}
}
else
- Curl_conncache_unlock(data);
+ CONNCACHE_UNLOCK(data);
}
@@ -3688,8 +3794,7 @@ static CURLcode create_conn(struct Curl_easy *data,
/* The cache is full. Let's see if we can kill a connection. */
conn_candidate = Curl_conncache_extract_oldest(data);
if(conn_candidate)
- (void)Curl_disconnect(data, conn_candidate,
- /* dead_connection */ FALSE);
+ (void)Curl_disconnect(data, conn_candidate, FALSE);
else {
infof(data, "No connections available in cache\n");
connections_available = FALSE;
@@ -3710,6 +3815,8 @@ static CURLcode create_conn(struct Curl_easy *data,
* This is a brand new connection, so let's store it in the connection
* cache of ours!
*/
+ Curl_attach_connnection(data, conn);
+
result = Curl_conncache_add_conn(data->state.conn_cache, conn);
if(result)
goto out;
@@ -3761,10 +3868,12 @@ static CURLcode create_conn(struct Curl_easy *data,
/* Strip trailing dots. resolve_server copied the name. */
strip_trailing_dot(&conn->host);
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.httpproxy)
strip_trailing_dot(&conn->http_proxy.host);
if(conn->bits.socksproxy)
strip_trailing_dot(&conn->socks_proxy.host);
+#endif
if(conn->bits.conn_to_host)
strip_trailing_dot(&conn->conn_to_host);
@@ -3795,22 +3904,23 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
}
*protocol_done = FALSE; /* default to not done */
+#ifndef CURL_DISABLE_PROXY
/* set proxy_connect_closed to false unconditionally already here since it
is used strictly to provide extra information to a parent function in the
case of proxy CONNECT failures and we must make sure we don't have it
lingering set from a previous invoke */
conn->bits.proxy_connect_closed = FALSE;
-
+#endif
/*
* Set user-agent. Used for HTTP, but since we can attempt to tunnel
* basically anything through a http proxy we can't limit this based on
* protocol.
*/
if(data->set.str[STRING_USERAGENT]) {
- Curl_safefree(conn->allocptr.uagent);
- conn->allocptr.uagent =
+ Curl_safefree(data->state.aptr.uagent);
+ data->state.aptr.uagent =
aprintf("User-Agent: %s\r\n", data->set.str[STRING_USERAGENT]);
- if(!conn->allocptr.uagent)
+ if(!data->state.aptr.uagent)
return CURLE_OUT_OF_MEMORY;
}
@@ -3864,7 +3974,7 @@ CURLcode Curl_connect(struct Curl_easy *data,
result = create_conn(data, &conn, asyncp);
if(!result) {
- if(CONN_INUSE(conn))
+ if(CONN_INUSE(conn) > 1)
/* multiplexed */
*protocol_done = TRUE;
else if(!*asyncp) {
@@ -3881,11 +3991,10 @@ CURLcode Curl_connect(struct Curl_easy *data,
else if(result && conn) {
/* We're not allowed to return failure with memory left allocated in the
connectdata struct, free those here */
+ Curl_detach_connnection(data);
+ Curl_conncache_remove_conn(data, conn, TRUE);
Curl_disconnect(data, conn, TRUE);
}
- else if(!result && !data->conn)
- /* FILE: transfers already have the connection attached */
- Curl_attach_connnection(data, conn);
return result;
}
@@ -3904,6 +4013,11 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
{
struct SingleRequest *k = &data->req;
+ /* if this is a pushed stream, we need this: */
+ CURLcode result = Curl_preconnect(data);
+ if(result)
+ return result;
+
if(conn) {
conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to
use */
@@ -3916,142 +4030,19 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
data->state.done = FALSE; /* *_done() is not called yet */
data->state.expect100header = FALSE;
-
if(data->set.opt_no_body)
/* in HTTP lingo, no body means using the HEAD request... */
- data->set.httpreq = HTTPREQ_HEAD;
- else if(HTTPREQ_HEAD == data->set.httpreq)
- /* ... but if unset there really is no perfect method that is the
- "opposite" of HEAD but in reality most people probably think GET
- then. The important thing is that we can't let it remain HEAD if the
- opt_no_body is set FALSE since then we'll behave wrong when getting
- HTTP. */
- data->set.httpreq = HTTPREQ_GET;
+ data->state.httpreq = HTTPREQ_HEAD;
k->start = Curl_now(); /* start time */
k->now = k->start; /* current time is now */
k->header = TRUE; /* assume header */
-
k->bytecount = 0;
-
- k->buf = data->state.buffer;
- k->hbufp = data->state.headerbuff;
k->ignorebody = FALSE;
Curl_speedinit(data);
-
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
return CURLE_OK;
}
-
-/*
-* get_protocol_family()
-*
-* This is used to return the protocol family for a given protocol.
-*
-* Parameters:
-*
-* protocol [in] - A single bit protocol identifier such as HTTP or HTTPS.
-*
-* Returns the family as a single bit protocol identifier.
-*/
-
-static unsigned int get_protocol_family(unsigned int protocol)
-{
- unsigned int family;
-
- switch(protocol) {
- case CURLPROTO_HTTP:
- case CURLPROTO_HTTPS:
- family = CURLPROTO_HTTP;
- break;
-
- case CURLPROTO_FTP:
- case CURLPROTO_FTPS:
- family = CURLPROTO_FTP;
- break;
-
- case CURLPROTO_SCP:
- family = CURLPROTO_SCP;
- break;
-
- case CURLPROTO_SFTP:
- family = CURLPROTO_SFTP;
- break;
-
- case CURLPROTO_TELNET:
- family = CURLPROTO_TELNET;
- break;
-
- case CURLPROTO_LDAP:
- case CURLPROTO_LDAPS:
- family = CURLPROTO_LDAP;
- break;
-
- case CURLPROTO_DICT:
- family = CURLPROTO_DICT;
- break;
-
- case CURLPROTO_FILE:
- family = CURLPROTO_FILE;
- break;
-
- case CURLPROTO_TFTP:
- family = CURLPROTO_TFTP;
- break;
-
- case CURLPROTO_IMAP:
- case CURLPROTO_IMAPS:
- family = CURLPROTO_IMAP;
- break;
-
- case CURLPROTO_POP3:
- case CURLPROTO_POP3S:
- family = CURLPROTO_POP3;
- break;
-
- case CURLPROTO_SMTP:
- case CURLPROTO_SMTPS:
- family = CURLPROTO_SMTP;
- break;
-
- case CURLPROTO_RTSP:
- family = CURLPROTO_RTSP;
- break;
-
- case CURLPROTO_RTMP:
- case CURLPROTO_RTMPS:
- family = CURLPROTO_RTMP;
- break;
-
- case CURLPROTO_RTMPT:
- case CURLPROTO_RTMPTS:
- family = CURLPROTO_RTMPT;
- break;
-
- case CURLPROTO_RTMPE:
- family = CURLPROTO_RTMPE;
- break;
-
- case CURLPROTO_RTMPTE:
- family = CURLPROTO_RTMPTE;
- break;
-
- case CURLPROTO_GOPHER:
- family = CURLPROTO_GOPHER;
- break;
-
- case CURLPROTO_SMB:
- case CURLPROTO_SMBS:
- family = CURLPROTO_SMB;
- break;
-
- default:
- family = 0;
- break;
- }
-
- return family;
-}
diff --git a/lib/url.h b/lib/url.h
index 053fbdffc..1941dc6a4 100644
--- a/lib/url.h
+++ b/lib/url.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -47,7 +47,7 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn);
CURLcode Curl_open(struct Curl_easy **curl);
CURLcode Curl_init_userdefined(struct Curl_easy *data);
-void Curl_freeset(struct Curl_easy * data);
+void Curl_freeset(struct Curl_easy *data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
CURLcode Curl_close(struct Curl_easy **datap); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
@@ -62,6 +62,11 @@ CURLcode Curl_parse_login_details(const char *login, const size_t len,
const struct Curl_handler *Curl_builtin_scheme(const char *scheme);
+bool Curl_is_ASCII_name(const char *hostname);
+CURLcode Curl_idnconvert_hostname(struct connectdata *conn,
+ struct hostname *host);
+void Curl_free_idnconverted_hostname(struct hostname *host);
+
#define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */
#define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless
specified */
@@ -72,6 +77,10 @@ const struct Curl_handler *Curl_builtin_scheme(const char *scheme);
void Curl_verboseconnect(struct connectdata *conn);
#endif
+#ifdef CURL_DISABLE_PROXY
+#define CONNECT_PROXY_SSL() FALSE
+#else
+
#define CONNECT_PROXY_SSL()\
(conn->http_proxy.proxytype == CURLPROXY_HTTPS &&\
!conn->bits.proxy_ssl_connected[sockindex])
@@ -83,5 +92,6 @@ void Curl_verboseconnect(struct connectdata *conn);
#define CONNECT_SECONDARYSOCKET_PROXY_SSL()\
(conn->http_proxy.proxytype == CURLPROXY_HTTPS &&\
!conn->bits.proxy_ssl_connected[SECONDARYSOCKET])
+#endif /* !CURL_DISABLE_PROXY */
#endif /* HEADER_CURL_URL_H */
diff --git a/lib/urlapi.c b/lib/urlapi.c
index fa514bce5..88b7f042f 100644
--- a/lib/urlapi.c
+++ b/lib/urlapi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -225,7 +225,7 @@ static void strcpy_url(char *output, const char *url, bool relative)
break;
}
}
- *optr = 0; /* zero terminate output buffer */
+ *optr = 0; /* null-terminate output buffer */
}
@@ -428,7 +428,6 @@ static char *concat_url(const char *base, const char *relurl)
*
*/
static CURLUcode parse_hostname_login(struct Curl_URL *u,
- const struct Curl_handler *h,
char **hostname,
unsigned int flags)
{
@@ -437,6 +436,7 @@ static CURLUcode parse_hostname_login(struct Curl_URL *u,
char *userp = NULL;
char *passwdp = NULL;
char *optionsp = NULL;
+ const struct Curl_handler *h = NULL;
/* At this point, we're hoping all the other special cases have
* been taken care of, so conn->host.name is at most
@@ -456,6 +456,10 @@ static CURLUcode parse_hostname_login(struct Curl_URL *u,
* ftp://user:password@ftp.my.site:8021/README */
*hostname = ++ptr;
+ /* if this is a known scheme, get some details */
+ if(u->scheme)
+ h = Curl_builtin_scheme(u->scheme);
+
/* We could use the login information in the URL so extract it. Only parse
options if the handler says we should. Note that 'h' might be NULL! */
ccode = Curl_parse_login_details(login, ptr - login - 1,
@@ -571,7 +575,7 @@ UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
}
/* scan for byte values < 31 or 127 */
-static CURLUcode junkscan(char *part)
+static CURLUcode junkscan(const char *part)
{
if(part) {
static const char badbytes[]={
@@ -580,7 +584,7 @@ static CURLUcode junkscan(char *part)
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x7f,
- 0x00 /* zero terminate */
+ 0x00 /* null-terminate */
};
size_t n = strlen(part);
size_t nfine = strcspn(part, badbytes);
@@ -602,7 +606,7 @@ static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
char dest[16]; /* fits a binary IPv6 address */
#endif
const char *l = "0123456789abcdefABCDEF:.";
- if(hlen < 5) /* '[::1]' is the shortest possible valid string */
+ if(hlen < 4) /* '[::]' is the shortest possible valid string */
return CURLUE_MALFORMED_INPUT;
hostname++;
hlen -= 2;
@@ -668,10 +672,9 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
CURLUcode result;
bool url_has_scheme = FALSE;
char schemebuf[MAX_SCHEME_LEN + 1];
- char *schemep = NULL;
+ const char *schemep = NULL;
size_t schemelen = 0;
size_t urllen;
- const struct Curl_handler *h = NULL;
if(!url)
return CURLUE_MALFORMED_INPUT;
@@ -798,7 +801,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(!(flags & (CURLU_DEFAULT_SCHEME|CURLU_GUESS_SCHEME)))
return CURLUE_MALFORMED_INPUT;
if(flags & CURLU_DEFAULT_SCHEME)
- schemep = (char *) DEFAULT_SCHEME;
+ schemep = DEFAULT_SCHEME;
/*
* The URL was badly formatted, let's try without scheme specified.
@@ -820,36 +823,17 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
return CURLUE_MALFORMED_INPUT;
}
- if((flags & CURLU_GUESS_SCHEME) && !schemep) {
- /* legacy curl-style guess based on host name */
- if(checkprefix("ftp.", hostname))
- schemep = (char *)"ftp";
- else if(checkprefix("dict.", hostname))
- schemep = (char *)"dict";
- else if(checkprefix("ldap.", hostname))
- schemep = (char *)"ldap";
- else if(checkprefix("imap.", hostname))
- schemep = (char *)"imap";
- else if(checkprefix("smtp.", hostname))
- schemep = (char *)"smtp";
- else if(checkprefix("pop3.", hostname))
- schemep = (char *)"pop3";
- else
- schemep = (char *)"http";
- }
-
len = strlen(p);
memcpy(path, p, len);
path[len] = 0;
- u->scheme = strdup(schemep);
- if(!u->scheme)
- return CURLUE_OUT_OF_MEMORY;
+ if(schemep) {
+ u->scheme = strdup(schemep);
+ if(!u->scheme)
+ return CURLUE_OUT_OF_MEMORY;
+ }
}
- /* if this is a known scheme, get some details */
- h = Curl_builtin_scheme(u->scheme);
-
if(junkscan(path))
return CURLUE_MALFORMED_INPUT;
@@ -916,7 +900,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
if(junkscan(hostname))
return CURLUE_MALFORMED_INPUT;
- result = parse_hostname_login(u, h, &hostname, flags);
+ result = parse_hostname_login(u, &hostname, flags);
if(result)
return result;
@@ -936,6 +920,28 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
u->host = strdup(hostname);
if(!u->host)
return CURLUE_OUT_OF_MEMORY;
+
+ if((flags & CURLU_GUESS_SCHEME) && !schemep) {
+ /* legacy curl-style guess based on host name */
+ if(checkprefix("ftp.", hostname))
+ schemep = "ftp";
+ else if(checkprefix("dict.", hostname))
+ schemep = "dict";
+ else if(checkprefix("ldap.", hostname))
+ schemep = "ldap";
+ else if(checkprefix("imap.", hostname))
+ schemep = "imap";
+ else if(checkprefix("smtp.", hostname))
+ schemep = "smtp";
+ else if(checkprefix("pop3.", hostname))
+ schemep = "pop3";
+ else
+ schemep = "http";
+
+ u->scheme = strdup(schemep);
+ if(!u->scheme)
+ return CURLUE_OUT_OF_MEMORY;
+ }
}
Curl_safefree(u->scratch);
@@ -1179,7 +1185,10 @@ CURLUcode curl_url_get(CURLU *u, CURLUPart what,
if(urldecode) {
char *decoded;
size_t dlen;
- CURLcode res = Curl_urldecode(NULL, *part, 0, &decoded, &dlen, TRUE);
+ /* this unconditional rejection of control bytes is documented
+ API behavior */
+ CURLcode res = Curl_urldecode(NULL, *part, 0, &decoded, &dlen,
+ REJECT_CTRL);
free(*part);
if(res) {
*part = NULL;
@@ -1246,8 +1255,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
return CURLUE_UNKNOWN_PART;
}
if(storep && *storep) {
- free(*storep);
- *storep = NULL;
+ Curl_safefree(*storep);
}
return CURLUE_OK;
}
@@ -1275,8 +1283,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
break;
case CURLUPART_HOST:
storep = &u->host;
- free(u->zoneid);
- u->zoneid = NULL;
+ Curl_safefree(u->zoneid);
break;
case CURLUPART_ZONEID:
storep = &u->zoneid;
@@ -1389,7 +1396,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
i = (const unsigned char *)part;
for(o = enc; *i; ++o, ++i)
*o = (*i == ' ') ? '+' : *i;
- *o = 0; /* zero terminate */
+ *o = 0; /* null-terminate */
part = strdup(enc);
if(!part) {
free(enc);
@@ -1413,7 +1420,7 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
o += 3;
}
}
- *o = 0; /* zero terminate */
+ *o = 0; /* null-terminate */
newp = enc;
if(free_part)
free((char *)part);
diff --git a/lib/urldata.h b/lib/urldata.h
index f9365b2e6..5ee81770e 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -49,6 +49,7 @@
#define PORT_RTMPT PORT_HTTP
#define PORT_RTMPS PORT_HTTPS
#define PORT_GOPHER 70
+#define PORT_MQTT 1883
#define DICT_MATCH "/MATCH:"
#define DICT_MATCH2 "/M:"
@@ -75,12 +76,10 @@
/* length of longest IPv6 address string including the trailing null */
#define MAX_IPADR_LEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
-/* Default FTP/IMAP etc response timeout in milliseconds.
- Symbian OS panics when given a timeout much greater than 1/2 hour.
-*/
+/* Default FTP/IMAP etc response timeout in milliseconds */
#define RESP_TIMEOUT (120*1000)
-/* Max string intput length is a precaution against abuse and to detect junk
+/* Max string input length is a precaution against abuse and to detect junk
input easier and better. */
#define CURL_MAX_INPUT_LENGTH 8000000
@@ -103,6 +102,7 @@
#include "hostip.h"
#include "hash.h"
#include "splay.h"
+#include "dynbuf.h"
/* return the count of bytes sent, or -1 on error */
typedef ssize_t (Curl_send)(struct connectdata *conn, /* connection data */
@@ -124,10 +124,11 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
#include "smtp.h"
#include "ftp.h"
#include "file.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "http.h"
#include "rtsp.h"
#include "smb.h"
+#include "mqtt.h"
#include "wildcard.h"
#include "multihandle.h"
#include "quic.h"
@@ -150,10 +151,6 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
#include <libssh2_sftp.h>
#endif /* HAVE_LIBSSH2_H */
-/* Initial size of the buffer to store headers in, it'll be enlarged in case
- of need. */
-#define HEADERSIZE 256
-
#define CURLEASY_MAGIC_NUMBER 0xc0dedbadU
#define GOOD_EASY_HANDLE(x) \
((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
@@ -230,6 +227,8 @@ struct ssl_primary_config {
char *cipher_list; /* list of ciphers to use */
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
char *pinned_key;
+ struct curl_blob *cert_blob;
+ char *curves; /* list of curves to use */
BIT(verifypeer); /* set TRUE if this is desired */
BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */
BIT(verifystatus); /* set TRUE if certificate status must be checked */
@@ -241,11 +240,12 @@ struct ssl_config_data {
long certverifyresult; /* result from the certificate verification */
char *CRLfile; /* CRL to check certificate revocation */
char *issuercert;/* optional issuer certificate filename */
+ struct curl_blob *issuercert_blob;
curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
void *fsslctxp; /* parameter for call back */
- char *cert; /* client certificate file name */
char *cert_type; /* format for certificate (default: PEM)*/
char *key; /* private key file name */
+ struct curl_blob *key_blob;
char *key_type; /* format for private key (default: PEM) */
char *key_passwd; /* plain text private key password */
#ifdef USE_TLS_SRP
@@ -257,6 +257,10 @@ struct ssl_config_data {
BIT(falsestart);
BIT(enable_beast); /* allow this flaw for interoperability's sake*/
BIT(no_revoke); /* disable SSL certificate revocation checks */
+ BIT(no_partialchain); /* don't accept partial certificate chains */
+ BIT(revoke_best_effort); /* ignore SSL revocation offline/missing revocation
+ list errors */
+ BIT(native_ca_store); /* use the native ca store of operating system */
};
struct ssl_general_config {
@@ -264,7 +268,7 @@ struct ssl_general_config {
};
/* information stored about one single SSL session */
-struct curl_ssl_session {
+struct Curl_ssl_session {
char *name; /* host name for which this ID was used */
char *conn_to_host; /* host name for the connection (may be NULL) */
const char *scheme; /* protocol scheme used */
@@ -366,6 +370,14 @@ struct ntlmdata {
unsigned char nonce[8];
void *target_info; /* TargetInfo received in the ntlm type-2 message */
unsigned int target_info_len;
+
+#if defined(NTLM_WB_ENABLED)
+ /* used for communication with Samba's winbind daemon helper ntlm_auth */
+ curl_socket_t ntlm_auth_hlpr_socket;
+ pid_t ntlm_auth_hlpr_pid;
+ char *challenge; /* The received base64 encoded ntlm type-2 message */
+ char *response; /* The generated base64 ntlm type-1/type-3 message */
+#endif
#endif
};
#endif
@@ -406,11 +418,23 @@ struct negotiatedata {
* Boolean values that concerns this connection.
*/
struct ConnectBits {
- /* always modify bits.close with the connclose() and connkeep() macros! */
- bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
- is complete */
bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
the first time on the first connect function call */
+#ifndef CURL_DISABLE_PROXY
+ bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
+ is complete */
+ BIT(httpproxy); /* if set, this transfer is done through a http proxy */
+ BIT(socksproxy); /* if set, this transfer is done through a socks proxy */
+ BIT(proxy_user_passwd); /* user+password for the proxy? */
+ BIT(tunnel_proxy); /* if CONNECT is used to "tunnel" through the proxy.
+ This is implicit when SSL-protocols are used through
+ proxies, but can also be enabled explicitly by
+ apps */
+ BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
+ in a CONNECT request with auth, so that
+ libcurl should reconnect and continue. */
+#endif
+ /* always modify bits.close with the connclose() and connkeep() macros! */
BIT(close); /* if set, we close the connection after this request */
BIT(reuse); /* if set, this is a re-used connection */
BIT(altused); /* this is an alt-svc "redirect" */
@@ -419,10 +443,7 @@ struct ConnectBits {
BIT(conn_to_port); /* if set, this connection has a "connect to port"
that overrides the port in the URL (remote port) */
BIT(proxy); /* if set, this transfer is done through a proxy - any type */
- BIT(httpproxy); /* if set, this transfer is done through a http proxy */
- BIT(socksproxy); /* if set, this transfer is done through a socks proxy */
BIT(user_passwd); /* do we use user+password for this connection? */
- BIT(proxy_user_passwd); /* user+password for the proxy? */
BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6
IP address */
BIT(ipv6); /* we communicate with a site using an IPv6 address */
@@ -432,10 +453,6 @@ struct ConnectBits {
the TCP layer connect */
BIT(retry); /* this connection is about to get closed and then
re-attempted at another connection. */
- BIT(tunnel_proxy); /* if CONNECT is used to "tunnel" through the proxy.
- This is implicit when SSL-protocols are used through
- proxies, but can also be enabled explicitly by
- apps */
BIT(authneg); /* TRUE when the auth phase has started, which means
that we are creating a request with an auth header,
but it is not the final request in the auth
@@ -452,23 +469,25 @@ struct ConnectBits {
EPRT doesn't work we disable it for the forthcoming
requests */
BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */
+ BIT(ftp_use_control_ssl); /* Enabled SSL for the control connection */
#endif
BIT(netrc); /* name+password provided by netrc */
- BIT(userpwd_in_url); /* name+password found in url */
- BIT(stream_was_rewound); /* The stream was rewound after a request read
- past the end of its response byte boundary */
- BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
- in a CONNECT request with auth, so that
- libcurl should reconnect and continue. */
BIT(bound); /* set true if bind() has already been done on this socket/
connection */
- BIT(type_set); /* type= was used in the URL */
BIT(multiplex); /* connection is multiplexed */
BIT(tcp_fastopen); /* use TCP Fast Open */
BIT(tls_enable_npn); /* TLS NPN extension? */
BIT(tls_enable_alpn); /* TLS ALPN extension? */
- BIT(socksproxy_connecting); /* connecting through a socks proxy */
BIT(connect_only);
+ BIT(doh);
+#ifdef USE_UNIX_SOCKETS
+ BIT(abstract_unix_socket);
+#endif
+ BIT(tls_upgraded);
+ BIT(sock_accepted); /* TRUE if the SECONDARYSOCKET was created with
+ accept() */
+ BIT(parallel_connect); /* set TRUE when a parallel connect attempt has
+ started (happy eyeballs) */
};
struct hostname {
@@ -528,9 +547,22 @@ enum upgrade101 {
UPGR101_WORKING /* talking upgraded protocol */
};
-struct dohresponse {
- unsigned char *memory;
- size_t size;
+enum doh_slots {
+ /* Explicit values for first two symbols so as to match hard-coded
+ * constants in existing code
+ */
+ DOH_PROBE_SLOT_IPADDR_V4 = 0, /* make 'V4' stand out for readability */
+ DOH_PROBE_SLOT_IPADDR_V6 = 1, /* 'V6' likewise */
+
+ /* Space here for (possibly build-specific) additional slot definitions */
+
+ /* for example */
+ /* #ifdef WANT_DOH_FOOBAR_TXT */
+ /* DOH_PROBE_SLOT_FOOBAR_TXT, */
+ /* #endif */
+
+ /* AFTER all slot definitions, establish how many we have */
+ DOH_PROBE_SLOTS
};
/* one of these for each DoH request */
@@ -539,12 +571,12 @@ struct dnsprobe {
int dnstype;
unsigned char dohbuffer[512];
size_t dohlen;
- struct dohresponse serverdoh;
+ struct dynbuf serverdoh;
};
struct dohdata {
struct curl_slist *headers;
- struct dnsprobe probe[2];
+ struct dnsprobe probe[DOH_PROBE_SLOTS];
unsigned int pending; /* still outstanding requests */
const char *host;
int port;
@@ -583,12 +615,7 @@ struct SingleRequest {
written as body */
int headerline; /* counts header lines to better track the
first one */
- char *hbufp; /* points at *end* of header line */
- size_t hbuflen;
char *str; /* within buf */
- char *str_start; /* within buf */
- char *end_ptr; /* within buf */
- char *p; /* within headerbuff */
curl_off_t offset; /* possible resume offset read from the
Content-Range: header */
int httpcode; /* error code from the 'HTTP/1.? XXX' or
@@ -597,11 +624,10 @@ struct SingleRequest {
enum expect100 exp100; /* expect 100 continue state */
enum upgrade101 upgr101; /* 101 upgrade state */
- struct contenc_writer_s *writer_stack; /* Content unencoding stack. */
- /* See sec 3.5, RFC2616. */
+ /* Content unencoding stack. See sec 3.5, RFC2616. */
+ struct contenc_writer *writer_stack;
time_t timeofdoc;
long bodywrites;
- char *buf;
int keepon;
char *location; /* This points to an allocated version of the Location:
header data */
@@ -712,6 +738,8 @@ struct Curl_handler {
long defport; /* Default port. */
unsigned int protocol; /* See CURLPROTO_* - this needs to be the single
specific protocol bit */
+ unsigned int family; /* single bit for protocol family; basically the
+ non-TLS name of the protocol this is */
unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */
};
@@ -739,6 +767,8 @@ struct Curl_handler {
HTTP proxy as HTTP proxies may know
this protocol and act as a gateway */
#define PROTOPT_WILDCARD (1<<12) /* protocol supports wildcard matching */
+#define PROTOPT_USERPWDCTRL (1<<13) /* Allow "control bytes" (< 32 ascii) in
+ user name and password */
#define CONNCHECK_NONE 0 /* No checks */
#define CONNCHECK_ISDEAD (1<<0) /* Check if the connection is dead. */
@@ -769,15 +799,10 @@ struct proxy_info {
char *passwd; /* proxy password string, allocated */
};
-#define CONNECT_BUFFER_SIZE 16384
-
/* struct for HTTP CONNECT state data */
struct http_connect_state {
- char connect_buffer[CONNECT_BUFFER_SIZE];
- int perline; /* count bytes per line */
+ struct dynbuf rcvbuf;
int keepon;
- char *line_start;
- char *ptr; /* where to store more data */
curl_off_t cl; /* size of content to read and ignore */
enum {
TUNNEL_INIT, /* init/default/no tunnel state */
@@ -790,6 +815,41 @@ struct http_connect_state {
struct ldapconninfo;
+/* for the (SOCKS) connect state machine */
+enum connect_t {
+ CONNECT_INIT,
+ CONNECT_SOCKS_INIT, /* 1 */
+ CONNECT_SOCKS_SEND, /* 2 waiting to send more first data */
+ CONNECT_SOCKS_READ_INIT, /* 3 set up read */
+ CONNECT_SOCKS_READ, /* 4 read server response */
+ CONNECT_GSSAPI_INIT, /* 5 */
+ CONNECT_AUTH_INIT, /* 6 setup outgoing auth buffer */
+ CONNECT_AUTH_SEND, /* 7 send auth */
+ CONNECT_AUTH_READ, /* 8 read auth response */
+ CONNECT_REQ_INIT, /* 9 init SOCKS "request" */
+ CONNECT_RESOLVING, /* 10 */
+ CONNECT_RESOLVED, /* 11 */
+ CONNECT_RESOLVE_REMOTE, /* 12 */
+ CONNECT_REQ_SEND, /* 13 */
+ CONNECT_REQ_SENDING, /* 14 */
+ CONNECT_REQ_READ, /* 15 */
+ CONNECT_REQ_READ_MORE, /* 16 */
+ CONNECT_DONE /* 17 connected fine to the remote or the SOCKS proxy */
+};
+
+#define SOCKS_STATE(x) (((x) >= CONNECT_SOCKS_INIT) && \
+ ((x) < CONNECT_DONE))
+#define SOCKS_REQUEST_BUFSIZE 600 /* room for large user/pw (255 max each) */
+
+struct connstate {
+ enum connect_t state;
+ unsigned char socksreq[SOCKS_REQUEST_BUFSIZE];
+
+ /* CONNECT_SOCKS_SEND */
+ ssize_t outstanding; /* send this many bytes more */
+ unsigned char *outp; /* send from this pointer */
+};
+
/*
* The connectdata struct contains all fields and variables that should be
* unique for an entire connection.
@@ -799,8 +859,8 @@ struct connectdata {
caution that this might very well vary between different times this
connection is used! */
struct Curl_easy *data;
-
- struct curl_llist_element bundle_node; /* conncache */
+ struct connstate cnnct;
+ struct Curl_llist_element bundle_node; /* conncache */
/* chunk is for HTTP chunked encoding, but is in the general connectdata
struct only because we can do just about any protocol through a HTTP proxy
@@ -822,15 +882,15 @@ struct connectdata {
/* 'dns_entry' is the particular host we use. This points to an entry in the
DNS cache and it will not get pruned while locked. It gets unlocked in
- Curl_done(). This entry will be NULL if the connection is re-used as then
+ multi_done(). This entry will be NULL if the connection is re-used as then
there is no name resolve done. */
struct Curl_dns_entry *dns_entry;
/* 'ip_addr' is the particular IP we connected to. It points to a struct
within the DNS cache, so this pointer is only valid as long as the DNS
- cache entry remains locked. It gets unlocked in Curl_done() */
- Curl_addrinfo *ip_addr;
- Curl_addrinfo *tempaddr[2]; /* for happy eyeballs */
+ cache entry remains locked. It gets unlocked in multi_done() */
+ struct Curl_addrinfo *ip_addr;
+ struct Curl_addrinfo *tempaddr[2]; /* for happy eyeballs */
/* 'ip_addr_str' is the ip_addr data as a human readable string.
It remains available as long as the connection does, which is longer than
@@ -855,10 +915,10 @@ struct connectdata {
char *secondaryhostname; /* secondary socket host name (ftp) */
struct hostname conn_to_host; /* the host to connect to. valid only if
bits.conn_to_host is set */
-
+#ifndef CURL_DISABLE_PROXY
struct proxy_info socks_proxy;
struct proxy_info http_proxy;
-
+#endif
long port; /* which port to use locally */
int remote_port; /* the remote port, not the proxy port! */
int conn_to_port; /* the remote port to connect to. valid only if
@@ -887,7 +947,6 @@ struct connectdata {
char *passwd; /* password string, allocated */
char *options; /* options string, allocated */
- char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */
char *sasl_authzid; /* authorisation identity string, allocated */
int httpversion; /* the HTTP version*10 reported by the server */
@@ -899,8 +958,7 @@ struct connectdata {
curl_socket_t sock[2]; /* two sockets, the second is used for the data
transfer when doing FTP */
curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */
- bool sock_accepted[2]; /* TRUE if the socket on this index was created with
- accept() */
+ int tempfamily[2]; /* family used for the temp sockets */
Curl_recv *recv[2];
Curl_send *send[2];
@@ -908,12 +966,16 @@ struct connectdata {
struct postponed_data postponed[2]; /* two buffers for two sockets */
#endif /* USE_RECV_BEFORE_SEND_WORKAROUND */
struct ssl_connect_data ssl[2]; /* this is for ssl-stuff */
+#ifndef CURL_DISABLE_PROXY
struct ssl_connect_data proxy_ssl[2]; /* this is for proxy ssl-stuff */
+#endif
#ifdef USE_SSL
void *ssl_extra; /* separately allocated backend-specific data */
#endif
struct ssl_primary_config ssl_config;
+#ifndef CURL_DISABLE_PROXY
struct ssl_primary_config proxy_ssl_config;
+#endif
struct ConnectBits bits; /* various state-flags for this connection */
/* connecttime: when connect() is called on the current IP address. Used to
@@ -922,8 +984,10 @@ struct connectdata {
struct curltime connecttime;
/* The two fields below get set in Curl_connecthost */
int num_addr; /* number of addresses to try to connect to */
- timediff_t timeoutms_per_addr; /* how long time in milliseconds to spend on
- trying to connect to each IP address */
+
+ /* how long time in milliseconds to spend on trying to connect to each IP
+ address, per family */
+ timediff_t timeoutms_per_addr[2];
const struct Curl_handler *handler; /* Connection's protocol handler */
const struct Curl_handler *given; /* The protocol first given */
@@ -944,21 +1008,6 @@ struct connectdata {
well be the same we read from.
CURL_SOCKET_BAD disables */
- /** Dynamically allocated strings, MUST be freed before this **/
- /** struct is killed. **/
- struct dynamically_allocated_data {
- char *proxyuserpwd;
- char *uagent;
- char *accept_encoding;
- char *userpwd;
- char *rangeline;
- char *ref;
- char *host;
- char *cookiehost;
- char *rtsp_transport;
- char *te; /* TE: request header */
- } allocptr;
-
#ifdef HAVE_GSSAPI
BIT(sec_complete); /* if Kerberos is enabled for this connection */
enum protection_level command_prot;
@@ -975,7 +1024,7 @@ struct connectdata {
struct kerberos5data krb5; /* variables into the structure definition, */
#endif /* however, some of them are ftp specific. */
- struct curl_llist easyq; /* List of easy handles using this connection */
+ struct Curl_llist easyq; /* List of easy handles using this connection */
curl_seek_callback seek_func; /* function that seeks the input */
void *seek_client; /* pointer to pass to the seek() above */
@@ -992,14 +1041,6 @@ struct connectdata {
because it authenticates connections, not
single requests! */
struct ntlmdata proxyntlm; /* NTLM data for proxy */
-
-#if defined(NTLM_WB_ENABLED)
- /* used for communication with Samba's winbind daemon helper ntlm_auth */
- curl_socket_t ntlm_auth_hlpr_socket;
- pid_t ntlm_auth_hlpr_pid;
- char *challenge_header;
- char *response_header;
-#endif
#endif
#ifdef USE_SPNEGO
@@ -1013,10 +1054,8 @@ struct connectdata {
/* data used for the asynch name resolve callback */
struct Curl_async async;
- /* These three are used for chunked-encoding trailer support */
- char *trailer; /* allocated buffer to store trailer in */
- int trlMax; /* allocated buffer size */
- int trlPos; /* index of where to store data */
+ /* for chunked-encoded trailer */
+ struct dynbuf trailer;
union {
struct ftp_conn ftpc;
@@ -1030,6 +1069,7 @@ struct connectdata {
struct smb_conn smbc;
void *rtmp;
struct ldapconninfo *ldapc;
+ struct mqtt_conn mqtt;
} proto;
int cselect_bits; /* bitmask of socket events */
@@ -1050,19 +1090,9 @@ struct connectdata {
struct http_connect_state *connect_state; /* for HTTP CONNECT */
struct connectbundle *bundle; /* The bundle we are member of */
int negnpn; /* APLN or NPN TLS negotiated protocol, CURL_HTTP_VERSION* */
-
#ifdef USE_UNIX_SOCKETS
char *unix_domain_socket;
- BIT(abstract_unix_socket);
#endif
- BIT(tls_upgraded);
- /* the two following *_inuse fields are only flags, not counters in any way.
- If TRUE it means the channel is in use, and if FALSE it means the channel
- is up for grabs by one. */
- BIT(readchannel_inuse); /* whether the read channel is in use by an easy
- handle */
- BIT(writechannel_inuse); /* whether the write channel is in use by an easy
- handle */
};
/* The end of connectdata. */
@@ -1104,6 +1134,7 @@ struct PureInfo {
OpenSSL, GnuTLS, Schannel, NSS and GSKit
builds. Asked for with CURLOPT_CERTINFO
/ CURLINFO_CERTINFO */
+ CURLproxycode pxcode;
BIT(timecond); /* set to TRUE if the time condition didn't match, which
thus made the document NOT get fetched */
};
@@ -1164,7 +1195,6 @@ typedef enum {
HTTPREQ_POST_MIME, /* we make a difference internally */
HTTPREQ_PUT,
HTTPREQ_HEAD,
- HTTPREQ_OPTIONS,
HTTPREQ_LAST /* last in list */
} Curl_HttpReq;
@@ -1184,17 +1214,6 @@ typedef enum {
RTSPREQ_LAST /* last in list */
} Curl_RtspReq;
-/*
- * Values that are generated, temporary or calculated internally for a
- * "session handle" must be defined within the 'struct UrlState'. This struct
- * will be used within the Curl_easy struct. When the 'Curl_easy'
- * struct is cloned, this data MUST NOT be copied.
- *
- * Remember that any "state" information goes globally for the curl handle.
- * Session-data MUST be put in the connectdata struct and here. */
-#define MAX_CURL_USER_LENGTH 256
-#define MAX_CURL_PASSWORD_LENGTH 256
-
struct auth {
unsigned long want; /* Bitmask set to the authentication methods wanted by
app (with CURLOPT_HTTPAUTH or CURLOPT_PROXYAUTH). */
@@ -1220,9 +1239,7 @@ struct Curl_http2_dep {
* BODY).
*/
struct tempbuf {
- char *buf; /* allocated buffer to keep data in when a write callback
- returns to make the connection paused */
- size_t len; /* size of the 'tempwrite' allocated buffer */
+ struct dynbuf b;
int type; /* type of the 'tempwrite' buffer as a bitmask that is used with
Curl_client_write() */
};
@@ -1232,7 +1249,8 @@ typedef enum {
EXPIRE_100_TIMEOUT,
EXPIRE_ASYNC_NAME,
EXPIRE_CONNECTTIMEOUT,
- EXPIRE_DNS_PER_NAME,
+ EXPIRE_DNS_PER_NAME, /* family1 */
+ EXPIRE_DNS_PER_NAME2, /* family2 */
EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */
EXPIRE_HAPPY_EYEBALLS,
EXPIRE_MULTI_PENDING,
@@ -1257,7 +1275,7 @@ typedef enum {
* One instance for each timeout an easy handle can set.
*/
struct time_node {
- struct curl_llist_element list;
+ struct Curl_llist_element list;
struct curltime time;
expire_id eid;
};
@@ -1275,17 +1293,16 @@ struct urlpieces {
};
struct UrlState {
-
/* Points to the connection cache */
struct conncache *conn_cache;
+ int retrycount; /* number of retries on a new connection */
+
/* buffers to store authentication data in, as parsed from input options */
struct curltime keeps_speed; /* for the progress meter really */
- struct connectdata *lastconnect; /* The last connection, NULL if undefined */
-
- char *headerbuff; /* allocated buffer to store headers in */
- size_t headersize; /* size of the allocation */
+ long lastconnect_id; /* The last connection, -1 if undefined */
+ struct dynbuf headerb; /* buffer to store headers in */
char *buffer; /* download buffer */
char *ulbuf; /* allocated upload buffer or NULL */
@@ -1298,7 +1315,7 @@ struct UrlState {
strdup() data.
*/
int first_remote_port; /* remote port of the first (not followed) request */
- struct curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
+ struct Curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
long sessionage; /* number of the most recent session */
unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */
struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
@@ -1322,7 +1339,7 @@ struct UrlState {
#endif /* USE_OPENSSL */
struct curltime expiretime; /* set this with Curl_expire() only */
struct Curl_tree timenode; /* for the splay stuff */
- struct curl_llist timeoutlist; /* list of pending timeouts */
+ struct Curl_llist timeoutlist; /* list of pending timeouts */
struct time_node expires[EXPIRE_LAST]; /* nodes for each expire type */
/* a place to store the most recently set FTP entrypath */
@@ -1331,8 +1348,7 @@ struct UrlState {
int httpversion; /* the lowest HTTP version*10 reported by any server
involved in this request */
-#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
- !defined(__SYMBIAN32__)
+#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__)
/* do FTP line-end conversions on most platforms */
#define CURL_DO_LINEEND_CONV
/* for FTP downloads: track CRLF sequences that span blocks */
@@ -1363,13 +1379,30 @@ struct UrlState {
int stream_weight;
CURLU *uh; /* URL handle for the current parsed URL */
struct urlpieces up;
+ Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
#ifndef CURL_DISABLE_HTTP
size_t trailers_bytes_sent;
- Curl_send_buffer *trailers_buf; /* a buffer containing the compiled trailing
- headers */
+ struct dynbuf trailers_buf; /* a buffer containing the compiled trailing
+ headers */
#endif
trailers_state trailers_state; /* whether we are sending trailers
and what stage are we at */
+
+ /* Dynamically allocated strings, MUST be freed before this struct is
+ killed. */
+ struct dynamically_allocated_data {
+ char *proxyuserpwd;
+ char *uagent;
+ char *accept_encoding;
+ char *userpwd;
+ char *rangeline;
+ char *ref;
+ char *host;
+ char *cookiehost;
+ char *rtsp_transport;
+ char *te; /* TE: request header */
+ } aptr;
+
#ifdef CURLDEBUG
BIT(conncache_lock);
#endif
@@ -1390,6 +1423,8 @@ struct UrlState {
BIT(ftp_trying_alternative);
BIT(wildcardmatch); /* enable wildcard matching */
BIT(expect100header); /* TRUE if we added Expect: 100-continue */
+ BIT(disableexpect); /* TRUE if Expect: is disabled due to a previous
+ 417 response */
BIT(use_range);
BIT(rangestringalloc); /* the range string is malloc()'ed */
BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE
@@ -1432,6 +1467,14 @@ struct DynamicStatic {
struct Curl_multi; /* declared and used only in multi.c */
+/*
+ * This enumeration MUST not use conditional directives (#ifdefs), new
+ * null terminated strings MUST be added to the enumeration immediately
+ * before STRING_LASTZEROTERMINATED, binary fields immediately before
+ * STRING_LAST. When doing so, ensure that the packages/OS400/chkstring.c
+ * test is updated and applicable changes for EBCDIC to ASCII conversion
+ * are catered for in curl_easy_setopt_ccsid()
+ */
enum dupstring {
STRING_CERT_ORIG, /* client certificate file name */
STRING_CERT_PROXY, /* client certificate file name */
@@ -1488,37 +1531,42 @@ enum dupstring {
STRING_RTSP_SESSION_ID, /* Session ID to use */
STRING_RTSP_STREAM_URI, /* Stream URI for this request */
STRING_RTSP_TRANSPORT, /* Transport for this session */
-#ifdef USE_SSH
+
STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */
STRING_SSH_PUBLIC_KEY, /* path to the public key file for auth */
STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */
STRING_SSH_KNOWNHOSTS, /* file name of knownhosts file */
-#endif
+
STRING_PROXY_SERVICE_NAME, /* Proxy service name */
STRING_SERVICE_NAME, /* Service name */
STRING_MAIL_FROM,
STRING_MAIL_AUTH,
-#ifdef USE_TLS_SRP
STRING_TLSAUTH_USERNAME_ORIG, /* TLS auth <username> */
STRING_TLSAUTH_USERNAME_PROXY, /* TLS auth <username> */
STRING_TLSAUTH_PASSWORD_ORIG, /* TLS auth <password> */
STRING_TLSAUTH_PASSWORD_PROXY, /* TLS auth <password> */
-#endif
+
STRING_BEARER, /* <bearer>, if used */
-#ifdef USE_UNIX_SOCKETS
+
STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */
-#endif
+
STRING_TARGET, /* CURLOPT_REQUEST_TARGET */
STRING_DOH, /* CURLOPT_DOH_URL */
-#ifdef USE_ALTSVC
+
STRING_ALTSVC, /* CURLOPT_ALTSVC */
-#endif
+
STRING_SASL_AUTHZID, /* CURLOPT_SASL_AUTHZID */
-#ifndef CURL_DISABLE_PROXY
+
STRING_TEMP_URL, /* temp URL storage for proxy use */
-#endif
- /* -- end of zero-terminated strings -- */
+
+ STRING_DNS_SERVERS,
+ STRING_DNS_INTERFACE,
+ STRING_DNS_LOCAL_IP4,
+ STRING_DNS_LOCAL_IP6,
+ STRING_SSL_EC_CURVES,
+
+ /* -- end of null-terminated strings -- */
STRING_LASTZEROTERMINATED,
@@ -1526,9 +1574,20 @@ enum dupstring {
STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */
+
STRING_LAST /* not used, just an end-of-list marker */
};
+enum dupblob {
+ BLOB_CERT_ORIG,
+ BLOB_CERT_PROXY,
+ BLOB_KEY_ORIG,
+ BLOB_KEY_PROXY,
+ BLOB_SSL_ISSUERCERT_ORIG,
+ BLOB_SSL_ISSUERCERT_PROXY,
+ BLOB_LAST
+};
+
/* callback that gets called when this easy handle is completed within a multi
handle. Only used for internally created transfers, like for example
DoH. */
@@ -1626,11 +1685,13 @@ struct UserDefined {
the hostname and port to connect to */
curl_TimeCond timecondition; /* kind of time/date comparison */
time_t timevalue; /* what time to compare with */
- Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
+ Curl_HttpReq method; /* what kind of HTTP request (if any) is this */
long httpversion; /* when non-zero, a specific HTTP version requested to
be used in the library's request(s) */
struct ssl_config_data ssl; /* user defined SSL stuff */
+#ifndef CURL_DISABLE_PROXY
struct ssl_config_data proxy_ssl; /* user defined SSL stuff for proxy */
+#endif
struct ssl_general_config general_ssl; /* general user defined SSL stuff */
curl_proxytype proxytype; /* what kind of proxy that is in use */
long dns_cache_timeout; /* DNS cache timeout */
@@ -1660,6 +1721,7 @@ struct UserDefined {
long new_directory_perms; /* Permissions to use when creating remote dirs */
long ssh_auth_types; /* allowed SSH auth types */
char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
+ struct curl_blob *blobs[BLOB_LAST];
unsigned int scope_id; /* Scope id for IPv6 */
long allowed_protocols;
long redir_protocols;
@@ -1773,10 +1835,12 @@ struct UserDefined {
BIT(doh); /* DNS-over-HTTPS enabled */
BIT(doh_get); /* use GET for DoH requests, instead of POST */
BIT(http09_allowed); /* allow HTTP/0.9 responses */
+ BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some
+ recipients */
};
struct Names {
- struct curl_hash *hostcache;
+ struct Curl_hash *hostcache;
enum {
HCACHE_NONE, /* not pointing to anything */
HCACHE_MULTI, /* points to a shared one in the multi handle */
@@ -1800,8 +1864,8 @@ struct Curl_easy {
struct Curl_easy *prev;
struct connectdata *conn;
- struct curl_llist_element connect_queue;
- struct curl_llist_element conn_queue; /* list per connectdata */
+ struct Curl_llist_element connect_queue;
+ struct Curl_llist_element conn_queue; /* list per connectdata */
CURLMstate mstate; /* the handle's state */
CURLcode result; /* previous result */
diff --git a/lib/vauth/cleartext.c b/lib/vauth/cleartext.c
index 6f452c169..3a5c9430f 100644
--- a/lib/vauth/cleartext.c
+++ b/lib/vauth/cleartext.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -81,7 +81,8 @@ CURLcode Curl_auth_create_plain_message(struct Curl_easy *data,
plen = strlen(passwd);
/* Compute binary message length. Check for overflows. */
- if(((zlen + clen) > SIZE_T_MAX/4) || (plen > (SIZE_T_MAX/2 - 2)))
+ if((zlen > SIZE_T_MAX/4) || (clen > SIZE_T_MAX/4) ||
+ (plen > (SIZE_T_MAX/2 - 2)))
return CURLE_OUT_OF_MEMORY;
plainlen = zlen + clen + plen + 2;
diff --git a/lib/vauth/cram.c b/lib/vauth/cram.c
index d148618b0..717d7f093 100644
--- a/lib/vauth/cram.c
+++ b/lib/vauth/cram.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -96,7 +96,7 @@ CURLcode Curl_auth_create_cram_md5_message(struct Curl_easy *data,
{
CURLcode result = CURLE_OK;
size_t chlglen = 0;
- HMAC_context *ctxt;
+ struct HMAC_context *ctxt;
unsigned char digest[MD5_DIGEST_LEN];
char *response;
diff --git a/lib/vauth/digest.c b/lib/vauth/digest.c
index 8cd4d83ed..b9210a8fe 100644
--- a/lib/vauth/digest.c
+++ b/lib/vauth/digest.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -62,7 +62,7 @@
what ultimately goes over the network.
*/
#define CURL_OUTPUT_DIGEST_CONV(a, b) \
- result = Curl_convert_to_network(a, (char *)b, strlen((const char *)b)); \
+ result = Curl_convert_to_network(a, b, strlen(b)); \
if(result) { \
free(b); \
return result; \
@@ -358,7 +358,7 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
char **outptr, size_t *outlen)
{
size_t i;
- MD5_context *ctxt;
+ struct MD5_context *ctxt;
char *response = NULL;
unsigned char digest[MD5_DIGEST_LEN];
char HA1_hex[2 * MD5_DIGEST_LEN + 1];
@@ -660,7 +660,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
}
/*
- * _Curl_auth_create_digest_http_message()
+ * auth_create_digest_http_message()
*
* This is used to generate a HTTP DIGEST response message ready for sending
* to the recipient.
@@ -679,7 +679,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
*
* Returns CURLE_OK on success.
*/
-static CURLcode _Curl_auth_create_digest_http_message(
+static CURLcode auth_create_digest_http_message(
struct Curl_easy *data,
const char *userp,
const char *passwdp,
@@ -688,12 +688,12 @@ static CURLcode _Curl_auth_create_digest_http_message(
struct digestdata *digest,
char **outptr, size_t *outlen,
void (*convert_to_ascii)(unsigned char *, unsigned char *),
- void (*hash)(unsigned char *, const unsigned char *))
+ void (*hash)(unsigned char *, const unsigned char *,
+ const size_t))
{
CURLcode result;
unsigned char hashbuf[32]; /* 32 bytes/256 bits */
unsigned char request_digest[65];
- unsigned char *hashthis;
unsigned char ha1[65]; /* 64 digits and 1 zero byte */
unsigned char ha2[65]; /* 64 digits and 1 zero byte */
char userh[65];
@@ -701,6 +701,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
size_t cnonce_sz = 0;
char *userp_quoted;
char *response = NULL;
+ char *hashthis = NULL;
char *tmp = NULL;
if(!digest->nc)
@@ -722,12 +723,12 @@ static CURLcode _Curl_auth_create_digest_http_message(
}
if(digest->userhash) {
- hashthis = (unsigned char *) aprintf("%s:%s", userp, digest->realm);
+ hashthis = aprintf("%s:%s", userp, digest->realm);
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis);
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, (unsigned char *)userh);
}
@@ -743,14 +744,13 @@ static CURLcode _Curl_auth_create_digest_http_message(
unq(nonce-value) ":" unq(cnonce-value)
*/
- hashthis = (unsigned char *)
- aprintf("%s:%s:%s", digest->userhash ? userh : userp,
- digest->realm, passwdp);
+ hashthis = aprintf("%s:%s:%s", digest->userhash ? userh : userp,
+ digest->realm, passwdp);
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, ha1);
@@ -763,7 +763,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, tmp); /* Convert on non-ASCII machines */
- hash(hashbuf, (unsigned char *) tmp);
+ hash(hashbuf, (unsigned char *) tmp, strlen(tmp));
free(tmp);
convert_to_ascii(hashbuf, ha1);
}
@@ -781,19 +781,19 @@ static CURLcode _Curl_auth_create_digest_http_message(
5.1.1 of RFC 2616)
*/
- hashthis = (unsigned char *) aprintf("%s:%s", request, uripath);
+ hashthis = aprintf("%s:%s", request, uripath);
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
if(digest->qop && strcasecompare(digest->qop, "auth-int")) {
/* We don't support auth-int for PUT or POST */
char hashed[65];
- unsigned char *hashthis2;
+ char *hashthis2;
- hash(hashbuf, (const unsigned char *)"");
+ hash(hashbuf, (const unsigned char *)"", 0);
convert_to_ascii(hashbuf, (unsigned char *)hashed);
- hashthis2 = (unsigned char *)aprintf("%s:%s", hashthis, hashed);
+ hashthis2 = aprintf("%s:%s", hashthis, hashed);
free(hashthis);
hashthis = hashthis2;
}
@@ -802,31 +802,23 @@ static CURLcode _Curl_auth_create_digest_http_message(
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, ha2);
if(digest->qop) {
- hashthis = (unsigned char *) aprintf("%s:%s:%08x:%s:%s:%s",
- ha1,
- digest->nonce,
- digest->nc,
- digest->cnonce,
- digest->qop,
- ha2);
+ hashthis = aprintf("%s:%s:%08x:%s:%s:%s", ha1, digest->nonce, digest->nc,
+ digest->cnonce, digest->qop, ha2);
}
else {
- hashthis = (unsigned char *) aprintf("%s:%s:%s",
- ha1,
- digest->nonce,
- ha2);
+ hashthis = aprintf("%s:%s:%s", ha1, digest->nonce, ha2);
}
if(!hashthis)
return CURLE_OUT_OF_MEMORY;
CURL_OUTPUT_DIGEST_CONV(data, hashthis); /* convert on non-ASCII machines */
- hash(hashbuf, hashthis);
+ hash(hashbuf, (unsigned char *) hashthis, strlen(hashthis));
free(hashthis);
convert_to_ascii(hashbuf, request_digest);
@@ -899,7 +891,7 @@ static CURLcode _Curl_auth_create_digest_http_message(
if(digest->algorithm) {
/* Append the algorithm */
- tmp = aprintf("%s, algorithm=\"%s\"", response, digest->algorithm);
+ tmp = aprintf("%s, algorithm=%s", response, digest->algorithm);
free(response);
if(!tmp)
return CURLE_OUT_OF_MEMORY;
@@ -955,21 +947,21 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
switch(digest->algo) {
case CURLDIGESTALGO_MD5:
case CURLDIGESTALGO_MD5SESS:
- return _Curl_auth_create_digest_http_message(data, userp, passwdp,
- request, uripath, digest,
- outptr, outlen,
- auth_digest_md5_to_ascii,
- Curl_md5it);
+ return auth_create_digest_http_message(data, userp, passwdp,
+ request, uripath, digest,
+ outptr, outlen,
+ auth_digest_md5_to_ascii,
+ Curl_md5it);
case CURLDIGESTALGO_SHA256:
case CURLDIGESTALGO_SHA256SESS:
case CURLDIGESTALGO_SHA512_256:
case CURLDIGESTALGO_SHA512_256SESS:
- return _Curl_auth_create_digest_http_message(data, userp, passwdp,
- request, uripath, digest,
- outptr, outlen,
- auth_digest_sha256_to_ascii,
- Curl_sha256it);
+ return auth_create_digest_http_message(data, userp, passwdp,
+ request, uripath, digest,
+ outptr, outlen,
+ auth_digest_sha256_to_ascii,
+ Curl_sha256it);
default:
return CURLE_UNSUPPORTED_PROTOCOL;
diff --git a/lib/vauth/digest.h b/lib/vauth/digest.h
index 8686c44a4..cc05fdb76 100644
--- a/lib/vauth/digest.h
+++ b/lib/vauth/digest.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/vauth/digest_sspi.c b/lib/vauth/digest_sspi.c
index a1090568b..4998306ce 100644
--- a/lib/vauth/digest_sspi.c
+++ b/lib/vauth/digest_sspi.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
- * Copyright (C) 2015 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -134,7 +134,8 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
if(status != SEC_E_OK) {
free(input_token);
- return CURLE_NOT_BUILT_IN;
+ failf(data, "SSPI: couldn't get auth info\n");
+ return CURLE_AUTH_ERROR;
}
token_max = SecurityPackage->cbMaxToken;
@@ -288,13 +289,13 @@ CURLcode Curl_override_sspi_http_realm(const char *chlg,
if(strcasecompare(value, "realm")) {
/* Setup identity's domain and length */
- domain.tchar_ptr = Curl_convert_UTF8_to_tchar((char *) content);
+ domain.tchar_ptr = curlx_convert_UTF8_to_tchar((char *) content);
if(!domain.tchar_ptr)
return CURLE_OUT_OF_MEMORY;
dup_domain.tchar_ptr = _tcsdup(domain.tchar_ptr);
if(!dup_domain.tchar_ptr) {
- Curl_unicodefree(domain.tchar_ptr);
+ curlx_unicodefree(domain.tchar_ptr);
return CURLE_OUT_OF_MEMORY;
}
@@ -303,7 +304,7 @@ CURLcode Curl_override_sspi_http_realm(const char *chlg,
identity->DomainLength = curlx_uztoul(_tcslen(dup_domain.tchar_ptr));
dup_domain.tchar_ptr = NULL;
- Curl_unicodefree(domain.tchar_ptr);
+ curlx_unicodefree(domain.tchar_ptr);
}
else {
/* Unknown specifier, ignore it! */
@@ -431,8 +432,10 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
/* Query the security package for DigestSSP */
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST),
&SecurityPackage);
- if(status != SEC_E_OK)
- return CURLE_NOT_BUILT_IN;
+ if(status != SEC_E_OK) {
+ failf(data, "SSPI: couldn't get auth info\n");
+ return CURLE_AUTH_ERROR;
+ }
token_max = SecurityPackage->cbMaxToken;
@@ -580,7 +583,7 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
resp_buf.pvBuffer = output_token;
resp_buf.cbBuffer = curlx_uztoul(token_max);
- spn = Curl_convert_UTF8_to_tchar((char *) uripath);
+ spn = curlx_convert_UTF8_to_tchar((char *) uripath);
if(!spn) {
s_pSecFn->FreeCredentialsHandle(&credentials);
@@ -602,7 +605,7 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
&chlg_desc, 0,
digest->http_context,
&resp_desc, &attrs, &expiry);
- Curl_unicodefree(spn);
+ curlx_unicodefree(spn);
if(status == SEC_I_COMPLETE_NEEDED ||
status == SEC_I_COMPLETE_AND_CONTINUE)
diff --git a/lib/vauth/krb5_sspi.c b/lib/vauth/krb5_sspi.c
index 98041d915..1fb6257ea 100644
--- a/lib/vauth/krb5_sspi.c
+++ b/lib/vauth/krb5_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2020, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -125,7 +125,8 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
TEXT(SP_NAME_KERBEROS),
&SecurityPackage);
if(status != SEC_E_OK) {
- return CURLE_NOT_BUILT_IN;
+ failf(data, "SSPI: couldn't get auth info\n");
+ return CURLE_AUTH_ERROR;
}
krb5->token_max = SecurityPackage->cbMaxToken;
@@ -395,7 +396,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
return CURLE_OUT_OF_MEMORY;
/* Convert the user name to UTF8 when operating with Unicode */
- user_name = Curl_convert_tchar_to_UTF8(names.sUserName);
+ user_name = curlx_convert_tchar_to_UTF8(names.sUserName);
if(!user_name) {
free(trailer);
@@ -407,7 +408,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
message = malloc(messagelen);
if(!message) {
free(trailer);
- Curl_unicodefree(user_name);
+ curlx_unicodefree(user_name);
return CURLE_OUT_OF_MEMORY;
}
@@ -420,7 +421,7 @@ CURLcode Curl_auth_create_gssapi_security_message(struct Curl_easy *data,
outdata = htonl(max_size) | sec_layer;
memcpy(message, &outdata, sizeof(outdata));
strcpy((char *) message + sizeof(outdata), user_name);
- Curl_unicodefree(user_name);
+ curlx_unicodefree(user_name);
/* Allocate the padding */
padding = malloc(sizes.cbBlockSize);
diff --git a/lib/vauth/ntlm.c b/lib/vauth/ntlm.c
index 047c2b5a3..ecfeacb9a 100644
--- a/lib/vauth/ntlm.c
+++ b/lib/vauth/ntlm.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,6 +40,7 @@
#include "curl_ntlm_core.h"
#include "curl_gethostname.h"
#include "curl_multibyte.h"
+#include "curl_md5.h"
#include "warnless.h"
#include "rand.h"
#include "vtls/vtls.h"
@@ -190,6 +191,7 @@ static CURLcode ntlm_decode_type2_target(struct Curl_easy *data,
return CURLE_BAD_CONTENT_ENCODING;
}
+ free(ntlm->target_info); /* replace any previous data */
ntlm->target_info = malloc(target_info_len);
if(!ntlm->target_info)
return CURLE_OUT_OF_MEMORY;
@@ -599,11 +601,14 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
#endif
#if defined(USE_NTRESPONSES) && defined(USE_NTLM2SESSION)
+
+#define CURL_MD5_DIGEST_LENGTH 16 /* fixed size */
+
/* We don't support NTLM2 if we don't have USE_NTRESPONSES */
if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM_KEY) {
unsigned char ntbuffer[0x18];
unsigned char tmp[0x18];
- unsigned char md5sum[MD5_DIGEST_LENGTH];
+ unsigned char md5sum[CURL_MD5_DIGEST_LENGTH];
unsigned char entropy[8];
/* Need to create 8 bytes random data */
@@ -621,11 +626,11 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
memcpy(tmp, &ntlm->nonce[0], 8);
memcpy(tmp + 8, entropy, 8);
- result = Curl_ssl_md5sum(tmp, 16, md5sum, MD5_DIGEST_LENGTH);
- if(!result)
- /* We shall only use the first 8 bytes of md5sum, but the des code in
- Curl_ntlm_core_lm_resp only encrypt the first 8 bytes */
- result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
+ Curl_md5it(md5sum, tmp, 16);
+
+ /* We shall only use the first 8 bytes of md5sum, but the des code in
+ Curl_ntlm_core_lm_resp only encrypt the first 8 bytes */
+ result = Curl_ntlm_core_mk_nt_hash(data, passwdp, ntbuffer);
if(result)
return result;
diff --git a/lib/vauth/ntlm_sspi.c b/lib/vauth/ntlm_sspi.c
index cd6cb79c1..84ea51dad 100644
--- a/lib/vauth/ntlm_sspi.c
+++ b/lib/vauth/ntlm_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -105,8 +105,10 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
/* Query the security package for NTLM */
status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
&SecurityPackage);
- if(status != SEC_E_OK)
- return CURLE_NOT_BUILT_IN;
+ if(status != SEC_E_OK) {
+ failf(data, "SSPI: couldn't get auth info\n");
+ return CURLE_AUTH_ERROR;
+ }
ntlm->token_max = SecurityPackage->cbMaxToken;
diff --git a/lib/vauth/spnego_sspi.c b/lib/vauth/spnego_sspi.c
index b9c2cf7d6..194f250f8 100644
--- a/lib/vauth/spnego_sspi.c
+++ b/lib/vauth/spnego_sspi.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -129,8 +129,10 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
nego->status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *)
TEXT(SP_NAME_NEGOTIATE),
&SecurityPackage);
- if(nego->status != SEC_E_OK)
- return CURLE_NOT_BUILT_IN;
+ if(nego->status != SEC_E_OK) {
+ failf(data, "SSPI: couldn't get auth info\n");
+ return CURLE_AUTH_ERROR;
+ }
nego->token_max = SecurityPackage->cbMaxToken;
diff --git a/lib/vauth/vauth.c b/lib/vauth/vauth.c
index a9c5c9c4f..d98e66c68 100644
--- a/lib/vauth/vauth.c
+++ b/lib/vauth/vauth.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014 - 2019, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2020, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -89,7 +89,7 @@ TCHAR *Curl_auth_build_spn(const char *service, const char *host,
}
/* Allocate our TCHAR based SPN */
- tchar_spn = Curl_convert_UTF8_to_tchar(utf8_spn);
+ tchar_spn = curlx_convert_UTF8_to_tchar(utf8_spn);
if(!tchar_spn) {
free(utf8_spn);
@@ -97,7 +97,7 @@ TCHAR *Curl_auth_build_spn(const char *service, const char *host,
}
/* Release the UTF8 variant when operating with Unicode */
- Curl_unicodefree(utf8_spn);
+ curlx_unicodefree(utf8_spn);
/* Return our newly allocated SPN */
return tchar_spn;
diff --git a/lib/version.c b/lib/version.c
index cfd09e36d..bdeba8835 100644
--- a/lib/version.c
+++ b/lib/version.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,13 +26,13 @@
#include "urldata.h"
#include "vtls/vtls.h"
#include "http2.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
#include "quic.h"
#include "curl_printf.h"
#ifdef USE_ARES
-# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
- (defined(WIN32) || defined(__SYMBIAN32__))
+# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
+ defined(WIN32)
# define CARES_STATICLIB
# endif
# include <ares.h>
@@ -56,25 +56,15 @@
#ifdef HAVE_ZLIB_H
#include <zlib.h>
-#ifdef __SYMBIAN32__
-/* zlib pollutes the namespace with this definition */
-#undef WIN32
-#endif
#endif
#ifdef HAVE_BROTLI
#include <brotli/decode.h>
#endif
-void Curl_version_init(void);
-
-/* For thread safety purposes this function is called by global_init so that
- the static data in both version functions is initialized. */
-void Curl_version_init(void)
-{
- curl_version();
- curl_version_info(CURLVERSION_NOW);
-}
+#ifdef HAVE_ZSTD
+#include <zstd.h>
+#endif
#ifdef HAVE_BROTLI
static size_t brotli_version(char *buf, size_t bufsz)
@@ -88,95 +78,139 @@ static size_t brotli_version(char *buf, size_t bufsz)
}
#endif
+#ifdef HAVE_ZSTD
+static size_t zstd_version(char *buf, size_t bufsz)
+{
+ unsigned long zstd_version = (unsigned long)ZSTD_versionNumber();
+ unsigned int major = (unsigned int)(zstd_version / (100 * 100));
+ unsigned int minor = (unsigned int)((zstd_version -
+ (major * 100 * 100)) / 100);
+ unsigned int patch = (unsigned int)(zstd_version -
+ (major * 100 * 100) - (minor * 100));
+
+ return msnprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
+}
+#endif
+
+/*
+ * curl_version() returns a pointer to a static buffer.
+ *
+ * It is implemented to work multi-threaded by making sure repeated invokes
+ * generate the exact same string and never write any temporary data like
+ * zeros in the data.
+ */
+
+#define VERSION_PARTS 14 /* number of substrings we can concatenate */
+
char *curl_version(void)
{
- static bool initialized;
- static char version[250];
- char *ptr = version;
- size_t len;
- size_t left = sizeof(version);
-
- if(initialized)
- return version;
-
- strcpy(ptr, LIBCURL_NAME "/" LIBCURL_VERSION);
- len = strlen(ptr);
- left -= len;
- ptr += len;
-
- len = Curl_ssl_version(ptr + 1, left - 1);
-
- if(len > 0) {
- *ptr = ' ';
- left -= ++len;
- ptr += len;
+ static char out[300];
+ char *outp;
+ size_t outlen;
+ const char *src[VERSION_PARTS];
+#ifdef USE_SSL
+ char ssl_version[200];
+#endif
+#ifdef HAVE_LIBZ
+ char z_version[40];
+#endif
+#ifdef HAVE_BROTLI
+ char br_version[40] = "brotli/";
+#endif
+#ifdef HAVE_ZSTD
+ char zst_version[40] = "zstd/";
+#endif
+#ifdef USE_ARES
+ char cares_version[40];
+#endif
+#if defined(USE_LIBIDN2)
+ char idn_version[40];
+#endif
+#ifdef USE_LIBPSL
+ char psl_version[40];
+#endif
+#if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
+ char iconv_version[40]="iconv";
+#endif
+#ifdef USE_SSH
+ char ssh_version[40];
+#endif
+#ifdef USE_NGHTTP2
+ char h2_version[40];
+#endif
+#ifdef ENABLE_QUIC
+ char h3_version[40];
+#endif
+#ifdef USE_LIBRTMP
+ char rtmp_version[40];
+#endif
+ int i = 0;
+ int j;
+
+#ifdef DEBUGBUILD
+ /* Override version string when environment variable CURL_VERSION is set */
+ const char *debugversion = getenv("CURL_VERSION");
+ if(debugversion) {
+ strncpy(out, debugversion, sizeof(out)-1);
+ out[sizeof(out)-1] = '\0';
+ return out;
}
+#endif
+ src[i++] = LIBCURL_NAME "/" LIBCURL_VERSION;
+#ifdef USE_SSL
+ Curl_ssl_version(ssl_version, sizeof(ssl_version));
+ src[i++] = ssl_version;
+#endif
#ifdef HAVE_LIBZ
- len = msnprintf(ptr, left, " zlib/%s", zlibVersion());
- left -= len;
- ptr += len;
+ msnprintf(z_version, sizeof(z_version), "zlib/%s", zlibVersion());
+ src[i++] = z_version;
#endif
#ifdef HAVE_BROTLI
- len = msnprintf(ptr, left, "%s", " brotli/");
- left -= len;
- ptr += len;
- len = brotli_version(ptr, left);
- left -= len;
- ptr += len;
+ brotli_version(&br_version[7], sizeof(br_version) - 7);
+ src[i++] = br_version;
+#endif
+#ifdef HAVE_ZSTD
+ zstd_version(&zst_version[5], sizeof(zst_version) - 5);
+ src[i++] = zst_version;
#endif
#ifdef USE_ARES
- /* this function is only present in c-ares, not in the original ares */
- len = msnprintf(ptr, left, " c-ares/%s", ares_version(NULL));
- left -= len;
- ptr += len;
+ msnprintf(cares_version, sizeof(cares_version),
+ "c-ares/%s", ares_version(NULL));
+ src[i++] = cares_version;
#endif
#ifdef USE_LIBIDN2
- if(idn2_check_version(IDN2_VERSION)) {
- len = msnprintf(ptr, left, " libidn2/%s", idn2_check_version(NULL));
- left -= len;
- ptr += len;
- }
+ msnprintf(idn_version, sizeof(idn_version),
+ "libidn2/%s", idn2_check_version(NULL));
+ src[i++] = idn_version;
+#elif defined(USE_WIN32_IDN)
+ src[i++] = (char *)"WinIDN";
#endif
+
#ifdef USE_LIBPSL
- len = msnprintf(ptr, left, " libpsl/%s", psl_get_version());
- left -= len;
- ptr += len;
-#endif
-#ifdef USE_WIN32_IDN
- len = msnprintf(ptr, left, " WinIDN");
- left -= len;
- ptr += len;
+ msnprintf(psl_version, sizeof(psl_version), "libpsl/%s", psl_get_version());
+ src[i++] = psl_version;
#endif
#if defined(HAVE_ICONV) && defined(CURL_DOES_CONVERSIONS)
#ifdef _LIBICONV_VERSION
- len = msnprintf(ptr, left, " iconv/%d.%d",
- _LIBICONV_VERSION >> 8, _LIBICONV_VERSION & 255);
+ msnprintf(iconv_version, sizeof(iconv_version), "iconv/%d.%d",
+ _LIBICONV_VERSION >> 8, _LIBICONV_VERSION & 255);
#else
- /* version unknown */
- len = msnprintf(ptr, left, " iconv");
+ /* version unknown, let the default stand */
#endif /* _LIBICONV_VERSION */
- left -= len;
- ptr += len;
+ src[i++] = iconv_version;
#endif
#ifdef USE_SSH
- if(left) {
- *ptr++=' ';
- left--;
- }
- len = Curl_ssh_version(ptr, left);
- left -= len;
- ptr += len;
+ Curl_ssh_version(ssh_version, sizeof(ssh_version));
+ src[i++] = ssh_version;
#endif
#ifdef USE_NGHTTP2
- len = Curl_http2_ver(ptr, left);
- left -= len;
- ptr += len;
+ Curl_http2_ver(h2_version, sizeof(h2_version));
+ src[i++] = h2_version;
#endif
#ifdef ENABLE_QUIC
- len = Curl_quic_ver(ptr, left);
- left -= len;
- ptr += len;
+ Curl_quic_ver(h3_version, sizeof(h3_version));
+ src[i++] = h3_version;
#endif
#ifdef USE_LIBRTMP
{
@@ -188,27 +222,34 @@ char *curl_version(void)
else
suff[0] = '\0';
- msnprintf(ptr, left, " librtmp/%d.%d%s",
+ msnprintf(rtmp_version, sizeof(rtmp_version), "librtmp/%d.%d%s",
RTMP_LIB_VERSION >> 16, (RTMP_LIB_VERSION >> 8) & 0xff,
suff);
-/*
- If another lib version is added below this one, this code would
- also have to do:
-
- len = what msnprintf() returned
-
- left -= len;
- ptr += len;
-*/
+ src[i++] = rtmp_version;
}
#endif
- /* Silent scan-build even if librtmp is not enabled. */
- (void) left;
- (void) ptr;
+ DEBUGASSERT(i <= VERSION_PARTS);
+
+ outp = &out[0];
+ outlen = sizeof(out);
+ for(j = 0; j < i; j++) {
+ size_t n = strlen(src[j]);
+ /* we need room for a space, the string and the final zero */
+ if(outlen <= (n + 2))
+ break;
+ if(j) {
+ /* prepend a space if not the first */
+ *outp++ = ' ';
+ outlen--;
+ }
+ memcpy(outp, src[j], n);
+ outp += n;
+ outlen -= n;
+ }
+ *outp = 0;
- initialized = true;
- return version;
+ return out;
}
/* data for curl_version_info
@@ -253,6 +294,9 @@ static const char * const protocols[] = {
"ldaps",
#endif
#endif
+#ifndef CURL_DISABLE_MQTT
+ "mqtt",
+#endif
#ifndef CURL_DISABLE_POP3
"pop3",
#endif
@@ -265,13 +309,14 @@ static const char * const protocols[] = {
#ifndef CURL_DISABLE_RTSP
"rtsp",
#endif
-#if defined(USE_SSH)
+#if defined(USE_SSH) && !defined(USE_WOLFSSH)
"scp",
+#endif
+#ifdef USE_SSH
"sftp",
#endif
-#if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \
- (CURL_SIZEOF_CURL_OFF_T > 4) && \
- (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO))
+#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \
+ (CURL_SIZEOF_CURL_OFF_T > 4)
"smb",
# ifdef USE_SSL
"smbs",
@@ -340,6 +385,9 @@ static curl_version_info_data version_info = {
( (SIZEOF_OFF_T > 4) || defined(USE_WIN32_LARGE_FILES) )
| CURL_VERSION_LARGEFILE
#endif
+#if defined(WIN32) && defined(UNICODE) && defined(_UNICODE)
+ | CURL_VERSION_UNICODE
+#endif
#if defined(CURL_DOES_CONVERSIONS)
| CURL_VERSION_CONV
#endif
@@ -364,12 +412,12 @@ static curl_version_info_data version_info = {
#if defined(HAVE_BROTLI)
| CURL_VERSION_BROTLI
#endif
+#if defined(HAVE_ZSTD)
+ | CURL_VERSION_ZSTD
+#endif
#if defined(USE_ALTSVC)
| CURL_VERSION_ALTSVC
#endif
-#ifdef USE_ESNI
- | CURL_VERSION_ESNI
-#endif
,
NULL, /* ssl_version */
0, /* ssl_version_num, this is kept at zero */
@@ -384,12 +432,23 @@ static curl_version_info_data version_info = {
NULL, /* brotli version */
0, /* nghttp2 version number */
NULL, /* nghttp2 version string */
- NULL /* quic library string */
+ NULL, /* quic library string */
+#ifdef CURL_CA_BUNDLE
+ CURL_CA_BUNDLE, /* cainfo */
+#else
+ NULL,
+#endif
+#ifdef CURL_CA_PATH
+ CURL_CA_PATH, /* capath */
+#else
+ NULL,
+#endif
+ 0, /* zstd_ver_num */
+ NULL /* zstd version */
};
curl_version_info_data *curl_version_info(CURLversion stamp)
{
- static bool initialized;
#if defined(USE_SSH)
static char ssh_buffer[80];
#endif
@@ -403,18 +462,21 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#ifdef HAVE_BROTLI
static char brotli_buffer[80];
#endif
+#ifdef HAVE_ZSTD
+ static char zstd_buffer[80];
+#endif
- if(initialized)
- return &version_info;
#ifdef USE_SSL
Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer));
version_info.ssl_version = ssl_buffer;
+#ifndef CURL_DISABLE_PROXY
if(Curl_ssl->supports & SSLSUPP_HTTPS_PROXY)
version_info.features |= CURL_VERSION_HTTPS_PROXY;
else
version_info.features &= ~CURL_VERSION_HTTPS_PROXY;
#endif
+#endif
#ifdef HAVE_LIBZ
version_info.libz_version = zlibVersion();
@@ -457,6 +519,12 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
version_info.brotli_version = brotli_buffer;
#endif
+#ifdef HAVE_ZSTD
+ version_info.zstd_ver_num = (unsigned int)ZSTD_versionNumber();
+ zstd_version(zstd_buffer, sizeof(zstd_buffer));
+ version_info.zstd_version = zstd_buffer;
+#endif
+
#ifdef USE_NGHTTP2
{
nghttp2_info *h2 = nghttp2_version(0);
@@ -474,7 +542,5 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
#endif
(void)stamp; /* avoid compiler warnings, we don't use this */
-
- initialized = true;
return &version_info;
}
diff --git a/lib/version_win32.c b/lib/version_win32.c
new file mode 100644
index 000000000..6561d36be
--- /dev/null
+++ b/lib/version_win32.c
@@ -0,0 +1,226 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2016 - 2020, Steve Holme, <steve_holme@hotmail.com>.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#if defined(WIN32)
+
+#include <curl/curl.h>
+#include "version_win32.h"
+
+/* The last #include files should be: */
+#include "curl_memory.h"
+#include "memdebug.h"
+
+/*
+ * curlx_verify_windows_version()
+ *
+ * This is used to verify if we are running on a specific windows version.
+ *
+ * Parameters:
+ *
+ * majorVersion [in] - The major version number.
+ * minorVersion [in] - The minor version number.
+ * platform [in] - The optional platform identifier.
+ * condition [in] - The test condition used to specifier whether we are
+ * checking a version less then, equal to or greater than
+ * what is specified in the major and minor version
+ * numbers.
+ *
+ * Returns TRUE if matched; otherwise FALSE.
+ */
+bool curlx_verify_windows_version(const unsigned int majorVersion,
+ const unsigned int minorVersion,
+ const PlatformIdentifier platform,
+ const VersionCondition condition)
+{
+ bool matched = FALSE;
+
+#if defined(CURL_WINDOWS_APP)
+ /* We have no way to determine the Windows version from Windows apps,
+ so let's assume we're running on the target Windows version. */
+ const WORD fullVersion = MAKEWORD(minorVersion, majorVersion);
+ const WORD targetVersion = (WORD)_WIN32_WINNT;
+
+ switch(condition) {
+ case VERSION_LESS_THAN:
+ matched = targetVersion < fullVersion;
+ break;
+
+ case VERSION_LESS_THAN_EQUAL:
+ matched = targetVersion <= fullVersion;
+ break;
+
+ case VERSION_EQUAL:
+ matched = targetVersion == fullVersion;
+ break;
+
+ case VERSION_GREATER_THAN_EQUAL:
+ matched = targetVersion >= fullVersion;
+ break;
+
+ case VERSION_GREATER_THAN:
+ matched = targetVersion > fullVersion;
+ break;
+ }
+
+ if(matched && (platform == PLATFORM_WINDOWS)) {
+ /* we're always running on PLATFORM_WINNT */
+ matched = FALSE;
+ }
+#elif !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_WIN2K) || \
+ (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
+ OSVERSIONINFO osver;
+
+ memset(&osver, 0, sizeof(osver));
+ osver.dwOSVersionInfoSize = sizeof(osver);
+
+ /* Find out Windows version */
+ if(GetVersionEx(&osver)) {
+ /* Verify the Operating System version number */
+ switch(condition) {
+ case VERSION_LESS_THAN:
+ if(osver.dwMajorVersion < majorVersion ||
+ (osver.dwMajorVersion == majorVersion &&
+ osver.dwMinorVersion < minorVersion))
+ matched = TRUE;
+ break;
+
+ case VERSION_LESS_THAN_EQUAL:
+ if(osver.dwMajorVersion < majorVersion ||
+ (osver.dwMajorVersion == majorVersion &&
+ osver.dwMinorVersion <= minorVersion))
+ matched = TRUE;
+ break;
+
+ case VERSION_EQUAL:
+ if(osver.dwMajorVersion == majorVersion &&
+ osver.dwMinorVersion == minorVersion)
+ matched = TRUE;
+ break;
+
+ case VERSION_GREATER_THAN_EQUAL:
+ if(osver.dwMajorVersion > majorVersion ||
+ (osver.dwMajorVersion == majorVersion &&
+ osver.dwMinorVersion >= minorVersion))
+ matched = TRUE;
+ break;
+
+ case VERSION_GREATER_THAN:
+ if(osver.dwMajorVersion > majorVersion ||
+ (osver.dwMajorVersion == majorVersion &&
+ osver.dwMinorVersion > minorVersion))
+ matched = TRUE;
+ break;
+ }
+
+ /* Verify the platform identifier (if necessary) */
+ if(matched) {
+ switch(platform) {
+ case PLATFORM_WINDOWS:
+ if(osver.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
+ matched = FALSE;
+ break;
+
+ case PLATFORM_WINNT:
+ if(osver.dwPlatformId != VER_PLATFORM_WIN32_NT)
+ matched = FALSE;
+
+ default: /* like platform == PLATFORM_DONT_CARE */
+ break;
+ }
+ }
+ }
+#else
+ ULONGLONG cm = 0;
+ OSVERSIONINFOEX osver;
+ BYTE majorCondition;
+ BYTE minorCondition;
+ BYTE spMajorCondition;
+ BYTE spMinorCondition;
+
+ switch(condition) {
+ case VERSION_LESS_THAN:
+ majorCondition = VER_LESS;
+ minorCondition = VER_LESS;
+ spMajorCondition = VER_LESS_EQUAL;
+ spMinorCondition = VER_LESS_EQUAL;
+ break;
+
+ case VERSION_LESS_THAN_EQUAL:
+ majorCondition = VER_LESS_EQUAL;
+ minorCondition = VER_LESS_EQUAL;
+ spMajorCondition = VER_LESS_EQUAL;
+ spMinorCondition = VER_LESS_EQUAL;
+ break;
+
+ case VERSION_EQUAL:
+ majorCondition = VER_EQUAL;
+ minorCondition = VER_EQUAL;
+ spMajorCondition = VER_GREATER_EQUAL;
+ spMinorCondition = VER_GREATER_EQUAL;
+ break;
+
+ case VERSION_GREATER_THAN_EQUAL:
+ majorCondition = VER_GREATER_EQUAL;
+ minorCondition = VER_GREATER_EQUAL;
+ spMajorCondition = VER_GREATER_EQUAL;
+ spMinorCondition = VER_GREATER_EQUAL;
+ break;
+
+ case VERSION_GREATER_THAN:
+ majorCondition = VER_GREATER;
+ minorCondition = VER_GREATER;
+ spMajorCondition = VER_GREATER_EQUAL;
+ spMinorCondition = VER_GREATER_EQUAL;
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ memset(&osver, 0, sizeof(osver));
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ osver.dwMajorVersion = majorVersion;
+ osver.dwMinorVersion = minorVersion;
+ if(platform == PLATFORM_WINDOWS)
+ osver.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;
+ else if(platform == PLATFORM_WINNT)
+ osver.dwPlatformId = VER_PLATFORM_WIN32_NT;
+
+ cm = VerSetConditionMask(cm, VER_MAJORVERSION, majorCondition);
+ cm = VerSetConditionMask(cm, VER_MINORVERSION, minorCondition);
+ cm = VerSetConditionMask(cm, VER_SERVICEPACKMAJOR, spMajorCondition);
+ cm = VerSetConditionMask(cm, VER_SERVICEPACKMINOR, spMinorCondition);
+ if(platform != PLATFORM_DONT_CARE)
+ cm = VerSetConditionMask(cm, VER_PLATFORMID, VER_EQUAL);
+
+ if(VerifyVersionInfo(&osver, (VER_MAJORVERSION | VER_MINORVERSION |
+ VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR),
+ cm))
+ matched = TRUE;
+#endif
+
+ return matched;
+}
+
+#endif /* WIN32 */
diff --git a/lib/version_win32.h b/lib/version_win32.h
new file mode 100644
index 000000000..94cc62667
--- /dev/null
+++ b/lib/version_win32.h
@@ -0,0 +1,53 @@
+#ifndef HEADER_CURL_VERSION_WIN32_H
+#define HEADER_CURL_VERSION_WIN32_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2016 - 2020, Steve Holme, <steve_holme@hotmail.com>.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#if defined(WIN32)
+
+/* Version condition */
+typedef enum {
+ VERSION_LESS_THAN,
+ VERSION_LESS_THAN_EQUAL,
+ VERSION_EQUAL,
+ VERSION_GREATER_THAN_EQUAL,
+ VERSION_GREATER_THAN
+} VersionCondition;
+
+/* Platform identifier */
+typedef enum {
+ PLATFORM_DONT_CARE,
+ PLATFORM_WINDOWS,
+ PLATFORM_WINNT
+} PlatformIdentifier;
+
+/* This is used to verify if we are running on a specific windows version */
+bool curlx_verify_windows_version(const unsigned int majorVersion,
+ const unsigned int minorVersion,
+ const PlatformIdentifier platform,
+ const VersionCondition condition);
+
+#endif /* WIN32 */
+
+#endif /* HEADER_CURL_VERSION_WIN32_H */
diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c
index c0f9b16e3..c076b7c3e 100644
--- a/lib/vquic/ngtcp2.c
+++ b/lib/vquic/ngtcp2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,9 @@
#include <ngtcp2/ngtcp2.h>
#include <ngtcp2/ngtcp2_crypto.h>
#include <nghttp3/nghttp3.h>
+#ifdef USE_OPENSSL
#include <openssl/err.h>
+#endif
#include "urldata.h"
#include "sendf.h"
#include "strdup.h"
@@ -36,6 +38,9 @@
#include "strcase.h"
#include "connect.h"
#include "strerror.h"
+#include "dynbuf.h"
+#include "vquic.h"
+#include "vtls/keylog.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -49,7 +54,7 @@
#ifdef DEBUG_HTTP3
#define H3BUGF(x) x
#else
-#define H3BUGF(x) do { } WHILE_FALSE
+#define H3BUGF(x) do { } while(0)
#endif
/*
@@ -69,10 +74,18 @@ struct h3out {
#define QUIC_MAX_STREAMS (256*1024)
#define QUIC_MAX_DATA (1*1024*1024)
#define QUIC_IDLE_TIMEOUT 60000 /* milliseconds */
+
+#ifdef USE_OPENSSL
#define QUIC_CIPHERS \
"TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_" \
"POLY1305_SHA256:TLS_AES_128_CCM_SHA256"
#define QUIC_GROUPS "P-256:X25519:P-384:P-521"
+#elif defined(USE_GNUTLS)
+#define QUIC_PRIORITY \
+ "NORMAL:-VERS-ALL:+VERS-TLS1.3:-CIPHER-ALL:+AES-128-GCM:+AES-256-GCM:" \
+ "+CHACHA20-POLY1305:+AES-128-CCM:-GROUP-ALL:+GROUP-SECP256R1:" \
+ "+GROUP-X25519:+GROUP-SECP384R1:+GROUP-SECP521R1"
+#endif
static CURLcode ng_process_ingress(struct connectdata *conn,
curl_socket_t sockfd,
@@ -101,6 +114,7 @@ static void quic_printf(void *user_data, const char *fmt, ...)
}
#endif
+#ifdef USE_OPENSSL
static ngtcp2_crypto_level
quic_from_ossl_level(OSSL_ENCRYPTION_LEVEL ossl_level)
{
@@ -117,22 +131,45 @@ quic_from_ossl_level(OSSL_ENCRYPTION_LEVEL ossl_level)
assert(0);
}
}
-
-static int setup_initial_crypto_context(struct quicsocket *qs)
+#elif defined(USE_GNUTLS)
+static ngtcp2_crypto_level
+quic_from_gtls_level(gnutls_record_encryption_level_t gtls_level)
{
- const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid(qs->qconn);
+ switch(gtls_level) {
+ case GNUTLS_ENCRYPTION_LEVEL_INITIAL:
+ return NGTCP2_CRYPTO_LEVEL_INITIAL;
+ case GNUTLS_ENCRYPTION_LEVEL_EARLY:
+ return NGTCP2_CRYPTO_LEVEL_EARLY;
+ case GNUTLS_ENCRYPTION_LEVEL_HANDSHAKE:
+ return NGTCP2_CRYPTO_LEVEL_HANDSHAKE;
+ case GNUTLS_ENCRYPTION_LEVEL_APPLICATION:
+ return NGTCP2_CRYPTO_LEVEL_APP;
+ default:
+ assert(0);
+ }
+}
+#endif
- if(ngtcp2_crypto_derive_and_install_initial_key(
- qs->qconn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, dcid,
- NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
- return -1;
+static void qlog_callback(void *user_data, uint32_t flags,
+ const void *data, size_t datalen)
+{
+ struct quicsocket *qs = (struct quicsocket *)user_data;
+ (void)flags;
+ if(qs->qlogfd != -1) {
+ ssize_t rc = write(qs->qlogfd, data, datalen);
+ if(rc == -1) {
+ /* on write error, stop further write attempts */
+ close(qs->qlogfd);
+ qs->qlogfd = -1;
+ }
+ }
- return 0;
}
-static void quic_settings(ngtcp2_settings *s,
+static void quic_settings(struct quicsocket *qs,
uint64_t stream_buffer_size)
{
+ ngtcp2_settings *s = &qs->settings;
ngtcp2_settings_default(s);
#ifdef DEBUG_NGTCP2
s->log_printf = quic_printf;
@@ -146,53 +183,50 @@ static void quic_settings(ngtcp2_settings *s,
s->transport_params.initial_max_data = QUIC_MAX_DATA;
s->transport_params.initial_max_streams_bidi = 1;
s->transport_params.initial_max_streams_uni = 3;
- s->transport_params.idle_timeout = QUIC_IDLE_TIMEOUT;
+ s->transport_params.max_idle_timeout = QUIC_IDLE_TIMEOUT;
+ if(qs->qlogfd != -1) {
+ s->qlog.write = qlog_callback;
+ }
}
-static FILE *keylog_file; /* not thread-safe */
+#ifdef USE_OPENSSL
static void keylog_callback(const SSL *ssl, const char *line)
{
(void)ssl;
- fputs(line, keylog_file);
- fputc('\n', keylog_file);
- fflush(keylog_file);
+ Curl_tls_keylog_write_line(line);
}
-
-static int init_ngh3_conn(struct quicsocket *qs);
-
-static int quic_set_encryption_secrets(SSL *ssl,
- OSSL_ENCRYPTION_LEVEL ossl_level,
- const uint8_t *rx_secret,
- const uint8_t *tx_secret,
- size_t secretlen)
+#elif defined(USE_GNUTLS)
+static int keylog_callback(gnutls_session_t session, const char *label,
+ const gnutls_datum_t *secret)
{
- struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
- int level = quic_from_ossl_level(ossl_level);
-
- if(ngtcp2_crypto_derive_and_install_key(
- qs->qconn, ssl, NULL, NULL, NULL, NULL, NULL, NULL, level, rx_secret,
- tx_secret, secretlen, NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
- return 0;
+ gnutls_datum_t crandom;
+ gnutls_datum_t srandom;
- if(level == NGTCP2_CRYPTO_LEVEL_APP && init_ngh3_conn(qs) != CURLE_OK)
- return 0;
+ gnutls_session_get_random(session, &crandom, &srandom);
+ if(crandom.size != 32) {
+ return -1;
+ }
- return 1;
+ Curl_tls_keylog_write(label, crandom.data, secret->data, secret->size);
+ return 0;
}
+#endif
-static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
- const uint8_t *data, size_t len)
+static int init_ngh3_conn(struct quicsocket *qs);
+
+static int write_client_handshake(struct quicsocket *qs,
+ ngtcp2_crypto_level level,
+ const uint8_t *data, size_t len)
{
- struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
struct quic_handshake *crypto_data;
- ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
int rv;
- crypto_data = &qs->client_crypto_data[level];
+ crypto_data = &qs->crypto_data[level];
if(crypto_data->buf == NULL) {
crypto_data->buf = malloc(4096);
+ if(!crypto_data->buf)
+ return 0;
crypto_data->alloclen = 4096;
- /* TODO Explode if malloc failed */
}
/* TODO Just pretend that handshake does not grow more than 4KiB for
@@ -203,8 +237,8 @@ static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
crypto_data->len += len;
rv = ngtcp2_conn_submit_crypto_data(
- qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
- len);
+ qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
+ len);
if(rv) {
H3BUGF(fprintf(stderr, "write_client_handshake failed\n"));
}
@@ -213,6 +247,41 @@ static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
return 1;
}
+#ifdef USE_OPENSSL
+static int quic_set_encryption_secrets(SSL *ssl,
+ OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *rx_secret,
+ const uint8_t *tx_secret,
+ size_t secretlen)
+{
+ struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+ int level = quic_from_ossl_level(ossl_level);
+
+ if(ngtcp2_crypto_derive_and_install_rx_key(
+ qs->qconn, NULL, NULL, NULL, level, rx_secret, secretlen) != 0)
+ return 0;
+
+ if(ngtcp2_crypto_derive_and_install_tx_key(
+ qs->qconn, NULL, NULL, NULL, level, tx_secret, secretlen) != 0)
+ return 0;
+
+ if(level == NGTCP2_CRYPTO_LEVEL_APP) {
+ if(init_ngh3_conn(qs) != CURLE_OK)
+ return 0;
+ }
+
+ return 1;
+}
+
+static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *data, size_t len)
+{
+ struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
+ ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
+
+ return write_client_handshake(qs, level, data, len);
+}
+
static int quic_flush_flight(SSL *ssl)
{
(void)ssl;
@@ -236,7 +305,6 @@ static SSL_QUIC_METHOD quic_method = {quic_set_encryption_secrets,
static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
{
SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_method());
- const char *keylog_filename;
SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_3_VERSION);
SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION);
@@ -244,8 +312,9 @@ static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
SSL_CTX_set_default_verify_paths(ssl_ctx);
if(SSL_CTX_set_ciphersuites(ssl_ctx, QUIC_CIPHERS) != 1) {
- failf(data, "SSL_CTX_set_ciphersuites: %s",
- ERR_error_string(ERR_get_error(), NULL));
+ char error_buffer[256];
+ ERR_error_string_n(ERR_get_error(), error_buffer, sizeof(error_buffer));
+ failf(data, "SSL_CTX_set_ciphersuites: %s", error_buffer);
return NULL;
}
@@ -256,12 +325,10 @@ static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
SSL_CTX_set_quic_method(ssl_ctx, &quic_method);
- keylog_filename = getenv("SSLKEYLOGFILE");
- if(keylog_filename) {
- keylog_file = fopen(keylog_filename, "wb");
- if(keylog_file) {
- SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
- }
+ /* Open the file if a TLS or QUIC backend has not done this before. */
+ Curl_tls_keylog_open();
+ if(Curl_tls_keylog_enabled()) {
+ SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
}
return ssl_ctx;
@@ -276,9 +343,7 @@ static int quic_init_ssl(struct quicsocket *qs)
/* this will need some attention when HTTPS proxy over QUIC get fixed */
const char * const hostname = qs->conn->host.name;
- if(qs->ssl)
- SSL_free(qs->ssl);
-
+ DEBUGASSERT(!qs->ssl);
qs->ssl = SSL_new(qs->sslctx);
SSL_set_app_data(qs->ssl, qs);
@@ -287,8 +352,8 @@ static int quic_init_ssl(struct quicsocket *qs)
switch(qs->version) {
#ifdef NGTCP2_PROTO_VER
case NGTCP2_PROTO_VER:
- alpn = (const uint8_t *)NGTCP2_ALPN_H3;
- alpnlen = sizeof(NGTCP2_ALPN_H3) - 1;
+ alpn = (const uint8_t *)NGHTTP3_ALPN_H3;
+ alpnlen = sizeof(NGHTTP3_ALPN_H3) - 1;
break;
#endif
}
@@ -299,28 +364,202 @@ static int quic_init_ssl(struct quicsocket *qs)
SSL_set_tlsext_host_name(qs->ssl, hostname);
return 0;
}
+#elif defined(USE_GNUTLS)
+static int secret_func(gnutls_session_t ssl,
+ gnutls_record_encryption_level_t gtls_level,
+ const void *rx_secret,
+ const void *tx_secret, size_t secretlen)
+{
+ struct quicsocket *qs = gnutls_session_get_ptr(ssl);
+ int level = quic_from_gtls_level(gtls_level);
+
+ if(level != NGTCP2_CRYPTO_LEVEL_EARLY &&
+ ngtcp2_crypto_derive_and_install_rx_key(
+ qs->qconn, NULL, NULL, NULL, level, rx_secret, secretlen) != 0)
+ return 0;
+
+ if(ngtcp2_crypto_derive_and_install_tx_key(
+ qs->qconn, NULL, NULL, NULL, level, tx_secret, secretlen) != 0)
+ return 0;
+
+ if(level == NGTCP2_CRYPTO_LEVEL_APP) {
+ if(init_ngh3_conn(qs) != CURLE_OK)
+ return -1;
+ }
+
+ return 0;
+}
-static int cb_initial(ngtcp2_conn *quic, void *user_data)
+static int read_func(gnutls_session_t ssl,
+ gnutls_record_encryption_level_t gtls_level,
+ gnutls_handshake_description_t htype, const void *data,
+ size_t len)
{
- struct quicsocket *qs = (struct quicsocket *)user_data;
+ struct quicsocket *qs = gnutls_session_get_ptr(ssl);
+ ngtcp2_crypto_level level = quic_from_gtls_level(gtls_level);
+ int rv;
- if(ngtcp2_crypto_read_write_crypto_data(
- quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
- return NGTCP2_ERR_CALLBACK_FAILURE;
+ if(htype == GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC)
+ return 0;
+
+ rv = write_client_handshake(qs, level, data, len);
+ if(rv == 0)
+ return -1;
return 0;
}
+static int alert_read_func(gnutls_session_t ssl,
+ gnutls_record_encryption_level_t gtls_level,
+ gnutls_alert_level_t alert_level,
+ gnutls_alert_description_t alert_desc)
+{
+ struct quicsocket *qs = gnutls_session_get_ptr(ssl);
+ (void)gtls_level;
+ (void)alert_level;
+
+ qs->tls_alert = alert_desc;
+ return 1;
+}
+
+static int tp_recv_func(gnutls_session_t ssl, const uint8_t *data,
+ size_t data_size)
+{
+ struct quicsocket *qs = gnutls_session_get_ptr(ssl);
+ ngtcp2_transport_params params;
+
+ if(ngtcp2_decode_transport_params(
+ &params, NGTCP2_TRANSPORT_PARAMS_TYPE_ENCRYPTED_EXTENSIONS,
+ data, data_size) != 0)
+ return -1;
+
+ if(ngtcp2_conn_set_remote_transport_params(qs->qconn, &params) != 0)
+ return -1;
+
+ return 0;
+}
+
+static int tp_send_func(gnutls_session_t ssl, gnutls_buffer_t extdata)
+{
+ struct quicsocket *qs = gnutls_session_get_ptr(ssl);
+ uint8_t paramsbuf[64];
+ ngtcp2_transport_params params;
+ ssize_t nwrite;
+ int rc;
+
+ ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
+ nwrite = ngtcp2_encode_transport_params(
+ paramsbuf, sizeof(paramsbuf), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
+ &params);
+ if(nwrite < 0) {
+ H3BUGF(fprintf(stderr, "ngtcp2_encode_transport_params: %s\n",
+ ngtcp2_strerror((int)nwrite)));
+ return -1;
+ }
+
+ rc = gnutls_buffer_append_data(extdata, paramsbuf, nwrite);
+ if(rc < 0)
+ return rc;
+
+ return (int)nwrite;
+}
+
+static int quic_init_ssl(struct quicsocket *qs)
+{
+ gnutls_datum_t alpn = {NULL, 0};
+ /* this will need some attention when HTTPS proxy over QUIC get fixed */
+ const char * const hostname = qs->conn->host.name;
+ int rc;
+
+ DEBUGASSERT(!qs->ssl);
+
+ gnutls_init(&qs->ssl, GNUTLS_CLIENT);
+ gnutls_session_set_ptr(qs->ssl, qs);
+
+ rc = gnutls_priority_set_direct(qs->ssl, QUIC_PRIORITY, NULL);
+ if(rc < 0) {
+ H3BUGF(fprintf(stderr, "gnutls_priority_set_direct failed: %s\n",
+ gnutls_strerror(rc)));
+ return 1;
+ }
+
+ gnutls_handshake_set_secret_function(qs->ssl, secret_func);
+ gnutls_handshake_set_read_function(qs->ssl, read_func);
+ gnutls_alert_set_read_function(qs->ssl, alert_read_func);
+
+ rc = gnutls_session_ext_register(qs->ssl, "QUIC Transport Parameters",
+ 0xffa5, GNUTLS_EXT_TLS,
+ tp_recv_func, tp_send_func,
+ NULL, NULL, NULL,
+ GNUTLS_EXT_FLAG_TLS |
+ GNUTLS_EXT_FLAG_CLIENT_HELLO |
+ GNUTLS_EXT_FLAG_EE);
+ if(rc < 0) {
+ H3BUGF(fprintf(stderr, "gnutls_session_ext_register failed: %s\n",
+ gnutls_strerror(rc)));
+ return 1;
+ }
+
+ /* Open the file if a TLS or QUIC backend has not done this before. */
+ Curl_tls_keylog_open();
+ if(Curl_tls_keylog_enabled()) {
+ gnutls_session_set_keylog_function(qs->ssl, keylog_callback);
+ }
+
+ if(qs->cred)
+ gnutls_certificate_free_credentials(qs->cred);
+
+ rc = gnutls_certificate_allocate_credentials(&qs->cred);
+ if(rc < 0) {
+ H3BUGF(fprintf(stderr,
+ "gnutls_certificate_allocate_credentials failed: %s\n",
+ gnutls_strerror(rc)));
+ return 1;
+ }
+
+ rc = gnutls_certificate_set_x509_system_trust(qs->cred);
+ if(rc < 0) {
+ H3BUGF(fprintf(stderr,
+ "gnutls_certificate_set_x509_system_trust failed: %s\n",
+ gnutls_strerror(rc)));
+ return 1;
+ }
+
+ rc = gnutls_credentials_set(qs->ssl, GNUTLS_CRD_CERTIFICATE, qs->cred);
+ if(rc < 0) {
+ H3BUGF(fprintf(stderr, "gnutls_credentials_set failed: %s\n",
+ gnutls_strerror(rc)));
+ return 1;
+ }
+
+ switch(qs->version) {
+#ifdef NGTCP2_PROTO_VER
+ case NGTCP2_PROTO_VER:
+ /* strip the first byte (the length) from NGHTTP3_ALPN_H3 */
+ alpn.data = (unsigned char *)NGHTTP3_ALPN_H3 + 1;
+ alpn.size = sizeof(NGHTTP3_ALPN_H3) - 2;
+ break;
+#endif
+ }
+ if(alpn.data)
+ gnutls_alpn_set_protocols(qs->ssl, &alpn, 1, 0);
+
+ /* set SNI */
+ gnutls_server_name_set(qs->ssl, GNUTLS_NAME_DNS, hostname, strlen(hostname));
+ return 0;
+}
+#endif
+
static int
cb_recv_crypto_data(ngtcp2_conn *tconn, ngtcp2_crypto_level crypto_level,
uint64_t offset,
const uint8_t *data, size_t datalen,
void *user_data)
{
- struct quicsocket *qs = (struct quicsocket *)user_data;
(void)offset;
+ (void)user_data;
- if(ngtcp2_crypto_read_write_crypto_data(tconn, qs->ssl, crypto_level, data,
+ if(ngtcp2_crypto_read_write_crypto_data(tconn, crypto_level, data,
datalen) != 0)
return NGTCP2_ERR_CRYPTO;
@@ -336,19 +575,27 @@ static int cb_handshake_completed(ngtcp2_conn *tconn, void *user_data)
return 0;
}
-static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
- int fin, uint64_t offset,
+static void extend_stream_window(ngtcp2_conn *tconn,
+ struct HTTP *stream)
+{
+ size_t thismuch = stream->unacked_window;
+ ngtcp2_conn_extend_max_stream_offset(tconn, stream->stream3_id, thismuch);
+ ngtcp2_conn_extend_max_offset(tconn, thismuch);
+ stream->unacked_window = 0;
+}
+
+
+static int cb_recv_stream_data(ngtcp2_conn *tconn, uint32_t flags,
+ int64_t stream_id, uint64_t offset,
const uint8_t *buf, size_t buflen,
void *user_data, void *stream_user_data)
{
struct quicsocket *qs = (struct quicsocket *)user_data;
ssize_t nconsumed;
+ int fin = flags & NGTCP2_STREAM_DATA_FLAG_FIN ? 1 : 0;
(void)offset;
(void)stream_user_data;
- infof(qs->conn->data, "Received %ld bytes data on stream %u\n",
- buflen, stream_id);
-
nconsumed =
nghttp3_conn_read_stream(qs->h3conn, stream_id, buf, buflen, fin);
if(nconsumed < 0) {
@@ -357,6 +604,9 @@ static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
return NGTCP2_ERR_CALLBACK_FAILURE;
}
+ /* number of bytes inside buflen which consists of framing overhead
+ * including QPACK HEADERS. In other words, it does not consume payload of
+ * DATA frame. */
ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
ngtcp2_conn_extend_max_offset(tconn, nconsumed);
@@ -428,20 +678,6 @@ static int cb_stream_reset(ngtcp2_conn *tconn, int64_t stream_id,
return 0;
}
-static int cb_recv_retry(ngtcp2_conn *tconn, const ngtcp2_pkt_hd *hd,
- const ngtcp2_pkt_retry *retry, void *user_data)
-{
- /* Re-generate handshake secrets here because connection ID might change. */
- struct quicsocket *qs = (struct quicsocket *)user_data;
- (void)tconn;
- (void)hd;
- (void)retry;
-
- setup_initial_crypto_context(qs);
-
- return 0;
-}
-
static int cb_extend_max_local_streams_bidi(ngtcp2_conn *tconn,
uint64_t max_streams,
void *user_data)
@@ -494,7 +730,7 @@ static int cb_get_new_connection_id(ngtcp2_conn *tconn, ngtcp2_cid *cid,
}
static ngtcp2_conn_callbacks ng_callbacks = {
- cb_initial,
+ ngtcp2_crypto_client_initial_cb,
NULL, /* recv_client_initial */
cb_recv_crypto_data,
cb_handshake_completed,
@@ -508,19 +744,24 @@ static ngtcp2_conn_callbacks ng_callbacks = {
NULL, /* stream_open */
cb_stream_close,
NULL, /* recv_stateless_reset */
- cb_recv_retry,
+ ngtcp2_crypto_recv_retry_cb,
cb_extend_max_local_streams_bidi,
NULL, /* extend_max_local_streams_uni */
NULL, /* rand */
cb_get_new_connection_id,
NULL, /* remove_connection_id */
- NULL, /* update_key */
+ ngtcp2_crypto_update_key_cb, /* update_key */
NULL, /* path_validation */
NULL, /* select_preferred_addr */
cb_stream_reset,
NULL, /* extend_max_remote_streams_bidi */
NULL, /* extend_max_remote_streams_uni */
cb_extend_max_stream_data,
+ NULL, /* dcid_status */
+ NULL, /* handshake_confirmed */
+ NULL, /* recv_new_token */
+ ngtcp2_crypto_delete_crypto_aead_ctx_cb,
+ ngtcp2_crypto_delete_crypto_cipher_ctx_cb
};
/*
@@ -540,10 +781,10 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
struct quicsocket *qs = &conn->hequic[sockindex];
char ipbuf[40];
long port;
- uint8_t paramsbuf[64];
- ngtcp2_transport_params params;
- ssize_t nwrite;
+ int qfd;
+ if(qs->conn)
+ Curl_quic_disconnect(conn, sockindex);
qs->conn = conn;
/* extract the used address as a string */
@@ -557,13 +798,15 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
infof(data, "Connect socket %d over QUIC to %s:%ld\n",
sockfd, ipbuf, port);
- qs->version = NGTCP2_PROTO_VER;
+ qs->version = NGTCP2_PROTO_VER_MAX;
+#ifdef USE_OPENSSL
qs->sslctx = quic_ssl_ctx(data);
if(!qs->sslctx)
- return CURLE_FAILED_INIT; /* TODO: better return code */
+ return CURLE_QUIC_CONNECT_ERROR;
+#endif
if(quic_init_ssl(qs))
- return CURLE_FAILED_INIT; /* TODO: better return code */
+ return CURLE_QUIC_CONNECT_ERROR;
qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
@@ -575,44 +818,26 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
if(result)
return result;
- quic_settings(&qs->settings, data->set.buffer_size);
+ (void)Curl_qlogdir(data, qs->scid.data, NGTCP2_MAX_CIDLEN, &qfd);
+ qs->qlogfd = qfd; /* -1 if failure above */
+ quic_settings(qs, data->set.buffer_size);
qs->local_addrlen = sizeof(qs->local_addr);
rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
&qs->local_addrlen);
if(rv == -1)
- return CURLE_FAILED_INIT;
+ return CURLE_QUIC_CONNECT_ERROR;
- ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen,
- NULL);
- ngtcp2_addr_init(&path.remote, (uint8_t*)addr, addrlen, NULL);
+ ngtcp2_addr_init(&path.local, &qs->local_addr, qs->local_addrlen, NULL);
+ ngtcp2_addr_init(&path.remote, addr, addrlen, NULL);
-#ifdef NGTCP2_PROTO_VER
-#define QUICVER NGTCP2_PROTO_VER
-#else
-#error "unsupported ngtcp2 version"
-#endif
- rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
- &ng_callbacks, &qs->settings, NULL, qs);
+ rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path,
+ NGTCP2_PROTO_VER_MAX, &ng_callbacks,
+ &qs->settings, NULL, qs);
if(rc)
- return CURLE_FAILED_INIT; /* TODO: create a QUIC error code */
-
- ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
- nwrite = ngtcp2_encode_transport_params(
- paramsbuf, sizeof(paramsbuf), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
- &params);
- if(nwrite < 0) {
- failf(data, "ngtcp2_encode_transport_params: %s\n",
- ngtcp2_strerror((int)nwrite));
- return CURLE_FAILED_INIT;
- }
-
- if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite))
- return CURLE_FAILED_INIT;
+ return CURLE_QUIC_CONNECT_ERROR;
- rc = setup_initial_crypto_context(qs);
- if(rc)
- return CURLE_FAILED_INIT; /* TODO: better return code */
+ ngtcp2_conn_set_tls_native_handle(qs->qconn, qs->ssl);
return CURLE_OK;
}
@@ -625,7 +850,7 @@ int Curl_quic_ver(char *p, size_t len)
{
ngtcp2_info *ng2 = ngtcp2_version(0);
nghttp3_info *ht3 = nghttp3_version(0);
- return msnprintf(p, len, " ngtcp2/%s nghttp3/%s",
+ return msnprintf(p, len, "ngtcp2/%s nghttp3/%s",
ng2->version_str, ht3->version_str);
}
@@ -653,11 +878,49 @@ static int ng_perform_getsock(const struct connectdata *conn,
return ng_getsock((struct connectdata *)conn, socks);
}
+static void qs_disconnect(struct quicsocket *qs)
+{
+ int i;
+ if(!qs->conn) /* already closed */
+ return;
+ qs->conn = NULL;
+ if(qs->qlogfd != -1) {
+ close(qs->qlogfd);
+ qs->qlogfd = -1;
+ }
+ if(qs->ssl)
+#ifdef USE_OPENSSL
+ SSL_free(qs->ssl);
+#elif defined(USE_GNUTLS)
+ gnutls_deinit(qs->ssl);
+#endif
+ qs->ssl = NULL;
+#ifdef USE_GNUTLS
+ if(qs->cred)
+ gnutls_certificate_free_credentials(qs->cred);
+#endif
+ for(i = 0; i < 3; i++)
+ Curl_safefree(qs->crypto_data[i].buf);
+ nghttp3_conn_del(qs->h3conn);
+ ngtcp2_conn_del(qs->qconn);
+#ifdef USE_OPENSSL
+ SSL_CTX_free(qs->sslctx);
+#endif
+}
+
+void Curl_quic_disconnect(struct connectdata *conn,
+ int tempindex)
+{
+ if(conn->transport == TRNSPRT_QUIC)
+ qs_disconnect(&conn->hequic[tempindex]);
+}
+
static CURLcode ng_disconnect(struct connectdata *conn,
bool dead_connection)
{
- (void)conn;
(void)dead_connection;
+ Curl_quic_disconnect(conn, 0);
+ Curl_quic_disconnect(conn, 1);
return CURLE_OK;
}
@@ -687,6 +950,7 @@ static const struct Curl_handler Curl_handler_http3 = {
ng_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
};
@@ -704,42 +968,54 @@ static int cb_h3_stream_close(nghttp3_conn *conn, int64_t stream_id,
stream->closed = TRUE;
Curl_expire(data, 0, EXPIRE_QUIC);
+ /* make sure that ngh3_stream_recv is called again to complete the transfer
+ even if there are no more packets to be received from the server. */
+ data->state.drain = 1;
return 0;
}
+/*
+ * write_data() copies data to the stream's receive buffer. If not enough
+ * space is available in the receive buffer, it copies the rest to the
+ * stream's overflow buffer.
+ */
+static CURLcode write_data(struct HTTP *stream, const void *mem, size_t memlen)
+{
+ CURLcode result = CURLE_OK;
+ const char *buf = mem;
+ size_t ncopy = memlen;
+ /* copy as much as possible to the receive buffer */
+ if(stream->len) {
+ size_t len = CURLMIN(ncopy, stream->len);
+ memcpy(stream->mem, buf, len);
+ stream->len -= len;
+ stream->memlen += len;
+ stream->mem += len;
+ buf += len;
+ ncopy -= len;
+ }
+ /* copy the rest to the overflow buffer */
+ if(ncopy)
+ result = Curl_dyn_addn(&stream->overflow, buf, ncopy);
+ return result;
+}
+
static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
const uint8_t *buf, size_t buflen,
void *user_data, void *stream_user_data)
{
- struct quicsocket *qs = user_data;
- size_t ncopy;
struct Curl_easy *data = stream_user_data;
struct HTTP *stream = data->req.protop;
+ CURLcode result = CURLE_OK;
(void)conn;
- H3BUGF(infof(data, "cb_h3_recv_data CALLED with %d bytes\n", buflen));
-
- /* TODO: this needs to be handled properly */
- DEBUGASSERT(buflen <= stream->len);
-
- ncopy = CURLMIN(stream->len, buflen);
- memcpy(stream->mem, buf, ncopy);
- stream->len -= ncopy;
- stream->memlen += ncopy;
-#if 0 /* extra debugging of incoming h3 data */
- fprintf(stderr, "!! Copies %zd bytes to %p (total %zd)\n",
- ncopy, stream->mem, stream->memlen);
- {
- size_t i;
- for(i = 0; i < ncopy; i++) {
- fprintf(stderr, "!! data[%d]: %02x '%c'\n", i, buf[i], buf[i]);
- }
- }
-#endif
- stream->mem += ncopy;
-
- ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, buflen);
- ngtcp2_conn_extend_max_offset(qs->qconn, buflen);
+ result = write_data(stream, buf, buflen);
+ if(result) {
+ return -1;
+ }
+ stream->unacked_window += buflen;
+ (void)stream_id;
+ (void)user_data;
return 0;
}
@@ -750,10 +1026,10 @@ static int cb_h3_deferred_consume(nghttp3_conn *conn, int64_t stream_id,
struct quicsocket *qs = user_data;
(void)conn;
(void)stream_user_data;
+ (void)stream_id;
ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, consumed);
ngtcp2_conn_extend_max_offset(qs->qconn, consumed);
-
return 0;
}
@@ -789,15 +1065,17 @@ static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
{
struct Curl_easy *data = stream_user_data;
struct HTTP *stream = data->req.protop;
+ CURLcode result = CURLE_OK;
(void)conn;
(void)stream_id;
(void)user_data;
- if(stream->memlen >= 2) {
- memcpy(stream->mem, "\r\n", 2);
- stream->len -= 2;
- stream->memlen += 2;
- stream->mem += 2;
+ /* add a CRLF only if we've received some headers */
+ if(stream->firstheader) {
+ result = write_data(stream, "\r\n", 2);
+ if(result) {
+ return -1;
+ }
}
return 0;
}
@@ -811,7 +1089,7 @@ static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
nghttp3_vec h3val = nghttp3_rcbuf_get_buf(value);
struct Curl_easy *data = stream_user_data;
struct HTTP *stream = data->req.protop;
- size_t ncopy;
+ CURLcode result = CURLE_OK;
(void)conn;
(void)stream_id;
(void)token;
@@ -820,20 +1098,37 @@ static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
if(h3name.len == sizeof(":status") - 1 &&
!memcmp(":status", h3name.base, h3name.len)) {
+ char line[14]; /* status line is always 13 characters long */
+ size_t ncopy;
int status = decode_status_code(h3val.base, h3val.len);
DEBUGASSERT(status != -1);
- msnprintf(stream->mem, stream->len, "HTTP/3 %03d \r\n", status);
+ ncopy = msnprintf(line, sizeof(line), "HTTP/3 %03d \r\n", status);
+ result = write_data(stream, line, ncopy);
+ if(result) {
+ return -1;
+ }
}
else {
/* store as a HTTP1-style header */
- msnprintf(stream->mem, stream->len, "%.*s: %.*s\n",
- h3name.len, h3name.base, h3val.len, h3val.base);
+ result = write_data(stream, h3name.base, h3name.len);
+ if(result) {
+ return -1;
+ }
+ result = write_data(stream, ": ", 2);
+ if(result) {
+ return -1;
+ }
+ result = write_data(stream, h3val.base, h3val.len);
+ if(result) {
+ return -1;
+ }
+ result = write_data(stream, "\r\n", 2);
+ if(result) {
+ return -1;
+ }
}
- ncopy = strlen(stream->mem);
- stream->len -= ncopy;
- stream->memlen += ncopy;
- stream->mem += ncopy;
+ stream->firstheader = TRUE;
return 0;
}
@@ -878,7 +1173,7 @@ static int init_ngh3_conn(struct quicsocket *qs)
if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
failf(qs->conn->data, "too few available QUIC streams");
- return CURLE_FAILED_INIT;
+ return CURLE_QUIC_CONNECT_ERROR;
}
nghttp3_conn_settings_default(&qs->h3settings);
@@ -895,32 +1190,32 @@ static int init_ngh3_conn(struct quicsocket *qs)
rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
if(rc) {
- result = CURLE_FAILED_INIT;
+ result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}
rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
if(rc) {
- result = CURLE_FAILED_INIT;
+ result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}
rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
if(rc) {
- result = CURLE_FAILED_INIT;
+ result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}
rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
if(rc) {
- result = CURLE_FAILED_INIT;
+ result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}
rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
qpack_dec_stream_id);
if(rc) {
- result = CURLE_FAILED_INIT;
+ result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}
@@ -933,6 +1228,22 @@ static int init_ngh3_conn(struct quicsocket *qs)
static Curl_recv ngh3_stream_recv;
static Curl_send ngh3_stream_send;
+static size_t drain_overflow_buffer(struct HTTP *stream)
+{
+ size_t overlen = Curl_dyn_len(&stream->overflow);
+ size_t ncopy = CURLMIN(overlen, stream->len);
+ if(ncopy > 0) {
+ memcpy(stream->mem, Curl_dyn_ptr(&stream->overflow), ncopy);
+ stream->len -= ncopy;
+ stream->mem += ncopy;
+ stream->memlen += ncopy;
+ if(ncopy != overlen)
+ /* make the buffer only keep the tail */
+ (void)Curl_dyn_tail(&stream->overflow, overlen - ncopy);
+ }
+ return ncopy;
+}
+
/* incoming data frames on the h3 stream */
static ssize_t ngh3_stream_recv(struct connectdata *conn,
int sockindex,
@@ -952,6 +1263,10 @@ static ssize_t ngh3_stream_recv(struct connectdata *conn,
}
/* else, there's data in the buffer already */
+ /* if there's data in the overflow buffer from a previous call, copy as much
+ as possible to the receive buffer before receiving more */
+ drain_overflow_buffer(stream);
+
if(ng_process_ingress(conn, sockfd, qs)) {
*curlcode = CURLE_RECV_ERROR;
return -1;
@@ -969,8 +1284,13 @@ static ssize_t ngh3_stream_recv(struct connectdata *conn,
stream->memlen = 0;
stream->mem = buf;
stream->len = buffersize;
- H3BUGF(infof(conn->data, "!! ngh3_stream_recv returns %zd bytes at %p\n",
- memlen, buf));
+ /* extend the stream window with the data we're consuming and send out
+ any additional packets to tell the server that we can receive more */
+ extend_stream_window(qs->qconn, stream);
+ if(ng_flush_egress(conn, sockfd, qs)) {
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
return memlen;
}
@@ -1098,6 +1418,7 @@ static CURLcode http_request(struct connectdata *conn, const void *mem,
stream->stream3_id = stream3_id;
stream->h3req = TRUE; /* senf off! */
+ Curl_dyn_init(&stream->overflow, CURL_MAX_READ_SIZE);
/* Calculate number of headers contained in [mem, mem + len). Assumes a
correctly generated HTTP header field block. */
@@ -1254,7 +1575,7 @@ static CURLcode http_request(struct connectdata *conn, const void *mem,
}
}
- switch(data->set.httpreq) {
+ switch(data->state.httpreq) {
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
case HTTPREQ_POST_MIME:
@@ -1376,11 +1697,11 @@ CURLcode Curl_quic_is_connected(struct connectdata *conn,
result = ng_process_ingress(conn, sockfd, qs);
if(result)
- return result;
+ goto error;
result = ng_flush_egress(conn, sockfd, qs);
if(result)
- return result;
+ goto error;
if(ngtcp2_conn_get_handshake_completed(qs->qconn)) {
*done = TRUE;
@@ -1388,6 +1709,10 @@ CURLcode Curl_quic_is_connected(struct connectdata *conn,
}
return result;
+ error:
+ (void)qs_disconnect(qs);
+ return result;
+
}
static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
@@ -1401,6 +1726,7 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
socklen_t remote_addrlen;
ngtcp2_path path;
ngtcp2_tstamp ts = timestamp();
+ ngtcp2_pkt_info pi = { 0 };
for(;;) {
remote_addrlen = sizeof(remote_addr);
@@ -1417,12 +1743,12 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
return CURLE_RECV_ERROR;
}
- ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr,
+ ngtcp2_addr_init(&path.local, &qs->local_addr,
qs->local_addrlen, NULL);
- ngtcp2_addr_init(&path.remote, (uint8_t *)&remote_addr, remote_addrlen,
- NULL);
+ ngtcp2_addr_init(&path.remote, (struct sockaddr *)&remote_addr,
+ remote_addrlen, NULL);
- rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts);
+ rv = ngtcp2_conn_read_pkt(qs->qconn, &path, &pi, buf, recvd, ts);
if(rv != 0) {
/* TODO Send CONNECTION_CLOSE if possible */
return CURLE_RECV_ERROR;
@@ -1451,13 +1777,15 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
nghttp3_vec vec[16];
ssize_t ndatalen;
- switch(qs->local_addr.ss_family) {
+ switch(qs->local_addr.sa_family) {
case AF_INET:
pktlen = NGTCP2_MAX_PKTLEN_IPV4;
break;
+#ifdef ENABLE_IPV6
case AF_INET6:
pktlen = NGTCP2_MAX_PKTLEN_IPV6;
break;
+#endif
default:
assert(0);
}
@@ -1482,11 +1810,12 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
return CURLE_SEND_ERROR;
}
else if(veccnt > 0) {
+ uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_MORE |
+ (fin ? NGTCP2_WRITE_STREAM_FLAG_FIN : 0);
outlen =
- ngtcp2_conn_writev_stream(qs->qconn, &ps.path,
+ ngtcp2_conn_writev_stream(qs->qconn, &ps.path, NULL,
out, pktlen, &ndatalen,
- NGTCP2_WRITE_STREAM_FLAG_MORE,
- stream_id, fin,
+ flags, stream_id,
(const ngtcp2_vec *)vec, veccnt, ts);
if(outlen == 0) {
break;
@@ -1494,6 +1823,7 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
if(outlen < 0) {
if(outlen == NGTCP2_ERR_STREAM_DATA_BLOCKED ||
outlen == NGTCP2_ERR_STREAM_SHUT_WR) {
+ assert(ndatalen == -1);
rv = nghttp3_conn_block_stream(qs->h3conn, stream_id);
if(rv != 0) {
failf(conn->data,
@@ -1503,7 +1833,7 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
}
continue;
}
- else if(outlen == NGTCP2_ERR_WRITE_STREAM_MORE) {
+ else if(outlen == NGTCP2_ERR_WRITE_MORE) {
assert(ndatalen > 0);
rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id,
ndatalen);
@@ -1516,24 +1846,20 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
continue;
}
else {
+ assert(ndatalen == -1);
failf(conn->data, "ngtcp2_conn_writev_stream returned error: %s\n",
ngtcp2_strerror((int)outlen));
return CURLE_SEND_ERROR;
}
}
- else if(ndatalen >= 0) {
- rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id, ndatalen);
- if(rv != 0) {
- failf(conn->data,
- "nghttp3_conn_add_write_offset returned error: %s\n",
- nghttp3_strerror(rv));
- return CURLE_SEND_ERROR;
- }
+ else {
+ assert(ndatalen == -1);
}
}
}
if(outlen < 0) {
- outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts);
+ outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, NULL,
+ out, pktlen, ts);
if(outlen < 0) {
failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n",
ngtcp2_strerror((int)outlen));
@@ -1590,4 +1916,32 @@ CURLcode Curl_quic_done_sending(struct connectdata *conn)
return CURLE_OK;
}
+
+/*
+ * Called from http.c:Curl_http_done when a request completes.
+ */
+void Curl_quic_done(struct Curl_easy *data, bool premature)
+{
+ (void)premature;
+ if(data->conn->handler == &Curl_handler_http3) {
+ /* only for HTTP/3 transfers */
+ struct HTTP *stream = data->req.protop;
+ Curl_dyn_free(&stream->overflow);
+ }
+}
+
+/*
+ * Called from transfer.c:data_pending to know if we should keep looping
+ * to receive more data from the connection.
+ */
+bool Curl_quic_data_pending(const struct Curl_easy *data)
+{
+ /* We may have received more data than we're able to hold in the receive
+ buffer and allocated an overflow buffer. Since it's possible that
+ there's no more data coming on the socket, we need to keep reading
+ until the overflow buffer is empty. */
+ const struct HTTP *stream = data->req.protop;
+ return Curl_dyn_len(&stream->overflow) > 0;
+}
+
#endif
diff --git a/lib/vquic/ngtcp2.h b/lib/vquic/ngtcp2.h
index 5570fc7e7..afdd01b7c 100644
--- a/lib/vquic/ngtcp2.h
+++ b/lib/vquic/ngtcp2.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,11 @@
#include <ngtcp2/ngtcp2.h>
#include <nghttp3/nghttp3.h>
+#ifdef USE_OPENSSL
#include <openssl/ssl.h>
+#elif defined(USE_GNUTLS)
+#include <gnutls/gnutls.h>
+#endif
struct quic_handshake {
char *buf; /* pointer to the buffer */
@@ -44,16 +48,22 @@ struct quicsocket {
ngtcp2_cid scid;
uint32_t version;
ngtcp2_settings settings;
+#ifdef USE_OPENSSL
SSL_CTX *sslctx;
SSL *ssl;
- struct quic_handshake client_crypto_data[3];
+#elif defined(USE_GNUTLS)
+ gnutls_certificate_credentials_t cred;
+ gnutls_session_t ssl;
+#endif
+ struct quic_handshake crypto_data[3];
/* the last TLS alert description generated by the local endpoint */
uint8_t tls_alert;
- struct sockaddr_storage local_addr;
+ struct sockaddr local_addr;
socklen_t local_addrlen;
nghttp3_conn *h3conn;
nghttp3_conn_settings h3settings;
+ int qlogfd;
};
#include "urldata.h"
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
index 0ee360d07..f52e9da32 100644
--- a/lib/vquic/quiche.c
+++ b/lib/vquic/quiche.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,7 @@
#include "multiif.h"
#include "connect.h"
#include "strerror.h"
+#include "vquic.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -45,7 +46,7 @@
#ifdef DEBUG_HTTP3
#define H3BUGF(x) x
#else
-#define H3BUGF(x) do { } WHILE_FALSE
+#define H3BUGF(x) do { } while(0)
#endif
#define QUIC_MAX_STREAMS (256*1024)
@@ -64,7 +65,6 @@ static CURLcode http_request(struct connectdata *conn, const void *mem,
static Curl_recv h3_stream_recv;
static Curl_send h3_stream_send;
-
static int quiche_getsock(struct connectdata *conn, curl_socket_t *socks)
{
struct SingleRequest *k = &conn->data->req;
@@ -89,16 +89,36 @@ static int quiche_perform_getsock(const struct connectdata *conn,
return quiche_getsock((struct connectdata *)conn, socks);
}
+static CURLcode qs_disconnect(struct quicsocket *qs)
+{
+ if(qs->h3config)
+ quiche_h3_config_free(qs->h3config);
+ if(qs->h3c)
+ quiche_h3_conn_free(qs->h3c);
+ if(qs->cfg) {
+ quiche_config_free(qs->cfg);
+ qs->cfg = NULL;
+ }
+ if(qs->conn) {
+ quiche_conn_free(qs->conn);
+ qs->conn = NULL;
+ }
+ return CURLE_OK;
+}
+
static CURLcode quiche_disconnect(struct connectdata *conn,
bool dead_connection)
{
struct quicsocket *qs = conn->quic;
(void)dead_connection;
- quiche_h3_config_free(qs->h3config);
- quiche_h3_conn_free(qs->h3c);
- quiche_config_free(qs->cfg);
- quiche_conn_free(qs->conn);
- return CURLE_OK;
+ return qs_disconnect(qs);
+}
+
+void Curl_quic_disconnect(struct connectdata *conn,
+ int tempindex)
+{
+ if(conn->transport == TRNSPRT_QUIC)
+ qs_disconnect(&conn->hequic[tempindex]);
}
static unsigned int quiche_conncheck(struct connectdata *conn,
@@ -134,6 +154,7 @@ static const struct Curl_handler Curl_handler_http3 = {
quiche_conncheck, /* connection_check */
PORT_HTTP, /* defport */
CURLPROTO_HTTPS, /* protocol */
+ CURLPROTO_HTTP, /* family */
PROTOPT_SSL | PROTOPT_STREAM /* flags */
};
@@ -152,6 +173,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
CURLcode result;
struct quicsocket *qs = &conn->hequic[sockindex];
struct Curl_easy *data = conn->data;
+ char *keylog_file = NULL;
#ifdef DEBUG_QUICHE
/* initialize debug log callback only once */
@@ -171,7 +193,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
return CURLE_FAILED_INIT;
}
- quiche_config_set_idle_timeout(qs->cfg, QUIC_IDLE_TIMEOUT);
+ quiche_config_set_max_idle_timeout(qs->cfg, QUIC_IDLE_TIMEOUT);
quiche_config_set_initial_max_data(qs->cfg, QUIC_MAX_DATA);
quiche_config_set_initial_max_stream_data_bidi_local(qs->cfg, QUIC_MAX_DATA);
quiche_config_set_initial_max_stream_data_bidi_remote(qs->cfg,
@@ -189,7 +211,9 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
if(result)
return result;
- if(getenv("SSLKEYLOGFILE"))
+ keylog_file = getenv("SSLKEYLOGFILE");
+
+ if(keylog_file)
quiche_config_log_keys(qs->cfg);
qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
@@ -199,6 +223,20 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
return CURLE_OUT_OF_MEMORY;
}
+ if(keylog_file)
+ quiche_conn_set_keylog_path(qs->conn, keylog_file);
+
+ /* Known to not work on Windows */
+#if !defined(WIN32) && defined(HAVE_QUICHE_CONN_SET_QLOG_FD)
+ {
+ int qfd;
+ (void)Curl_qlogdir(data, qs->scid, sizeof(qs->scid), &qfd);
+ if(qfd != -1)
+ quiche_conn_set_qlog_fd(qs->conn, qfd,
+ "qlog title", "curl qlog");
+ }
+#endif
+
result = flush_egress(conn, sockfd, qs);
if(result)
return result;
@@ -217,8 +255,20 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
/* for connection reuse purposes: */
conn->ssl[FIRSTSOCKET].state = ssl_connection_complete;
- infof(data, "Sent QUIC client Initial, ALPN: %s\n",
- QUICHE_H3_APPLICATION_PROTOCOL + 1);
+ {
+ unsigned char alpn_protocols[] = QUICHE_H3_APPLICATION_PROTOCOL;
+ unsigned alpn_len, offset = 0;
+
+ /* Replace each ALPN length prefix by a comma. */
+ while(offset < sizeof(alpn_protocols) - 1) {
+ alpn_len = alpn_protocols[offset];
+ alpn_protocols[offset] = ',';
+ offset += 1 + alpn_len;
+ }
+
+ infof(data, "Sent QUIC client Initial, ALPN: %s\n",
+ alpn_protocols + 1);
+ }
return CURLE_OK;
}
@@ -273,11 +323,11 @@ CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex,
result = process_ingress(conn, sockfd, qs);
if(result)
- return result;
+ goto error;
result = flush_egress(conn, sockfd, qs);
if(result)
- return result;
+ goto error;
if(quiche_conn_is_established(qs->conn)) {
*done = TRUE;
@@ -286,6 +336,9 @@ CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex,
}
return result;
+ error:
+ qs_disconnect(qs);
+ return result;
}
static CURLcode process_ingress(struct connectdata *conn, int sockfd,
@@ -379,6 +432,9 @@ static int cb_each_header(uint8_t *name, size_t name_len,
headers->destlen, "HTTP/3 %.*s\n",
(int) value_len, value);
}
+ else if(!headers->nlen) {
+ return CURLE_HTTP3;
+ }
else {
msnprintf(headers->dest,
headers->destlen, "%.*s: %.*s\n",
@@ -433,7 +489,9 @@ static ssize_t h3_stream_recv(struct connectdata *conn,
case QUICHE_H3_EVENT_HEADERS:
rc = quiche_h3_event_for_each_header(ev, cb_each_header, &headers);
if(rc) {
- /* what do we do about this? */
+ *curlcode = rc;
+ failf(data, "Error in HTTP/3 response header");
+ break;
}
recvd = headers.nlen;
break;
@@ -527,7 +585,7 @@ static ssize_t h3_stream_send(struct connectdata *conn,
*/
int Curl_quic_ver(char *p, size_t len)
{
- return msnprintf(p, len, " quiche/%s", quiche_version());
+ return msnprintf(p, len, "quiche/%s", quiche_version());
}
/* Index where :authority header field will appear in request header
@@ -709,7 +767,7 @@ static CURLcode http_request(struct connectdata *conn, const void *mem,
}
}
- switch(data->set.httpreq) {
+ switch(data->state.httpreq) {
case HTTPREQ_POST:
case HTTPREQ_POST_FORM:
case HTTPREQ_POST_MIME:
@@ -780,4 +838,23 @@ CURLcode Curl_quic_done_sending(struct connectdata *conn)
return CURLE_OK;
}
+/*
+ * Called from http.c:Curl_http_done when a request completes.
+ */
+void Curl_quic_done(struct Curl_easy *data, bool premature)
+{
+ (void)data;
+ (void)premature;
+}
+
+/*
+ * Called from transfer.c:data_pending to know if we should keep looping
+ * to receive more data from the connection.
+ */
+bool Curl_quic_data_pending(const struct Curl_easy *data)
+{
+ (void)data;
+ return FALSE;
+}
+
#endif
diff --git a/lib/vquic/vquic.c b/lib/vquic/vquic.c
new file mode 100644
index 000000000..aae8e0951
--- /dev/null
+++ b/lib/vquic/vquic.c
@@ -0,0 +1,85 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef ENABLE_QUIC
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include "urldata.h"
+#include "dynbuf.h"
+#include "curl_printf.h"
+#include "vquic.h"
+
+#ifdef O_BINARY
+#define QLOGMODE O_WRONLY|O_CREAT|O_BINARY
+#else
+#define QLOGMODE O_WRONLY|O_CREAT
+#endif
+
+/*
+ * If the QLOGDIR environment variable is set, open and return a file
+ * descriptor to write the log to.
+ *
+ * This function returns error if something failed outside of failing to
+ * create the file. Open file success is deemed by seeing if the returned fd
+ * is != -1.
+ */
+CURLcode Curl_qlogdir(struct Curl_easy *data,
+ unsigned char *scid,
+ size_t scidlen,
+ int *qlogfdp)
+{
+ const char *qlog_dir = getenv("QLOGDIR");
+ *qlogfdp = -1;
+ if(qlog_dir) {
+ struct dynbuf fname;
+ CURLcode result;
+ unsigned int i;
+ Curl_dyn_init(&fname, DYN_QLOG_NAME);
+ result = Curl_dyn_add(&fname, qlog_dir);
+ if(!result)
+ result = Curl_dyn_add(&fname, "/");
+ for(i = 0; (i < scidlen) && !result; i++) {
+ char hex[3];
+ msnprintf(hex, 3, "%02x", scid[i]);
+ result = Curl_dyn_add(&fname, hex);
+ }
+ if(!result)
+ result = Curl_dyn_add(&fname, ".qlog");
+
+ if(!result) {
+ int qlogfd = open(Curl_dyn_ptr(&fname), QLOGMODE,
+ data->set.new_file_perms);
+ if(qlogfd != -1)
+ *qlogfdp = qlogfd;
+ }
+ Curl_dyn_free(&fname);
+ if(result)
+ return result;
+ }
+
+ return CURLE_OK;
+}
+#endif
diff --git a/lib/vquic/vquic.h b/lib/vquic/vquic.h
new file mode 100644
index 000000000..ecff0edf4
--- /dev/null
+++ b/lib/vquic/vquic.h
@@ -0,0 +1,34 @@
+#ifndef HEADER_CURL_VQUIC_QUIC_H
+#define HEADER_CURL_VQUIC_QUIC_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef ENABLE_QUIC
+CURLcode Curl_qlogdir(struct Curl_easy *data,
+ unsigned char *scid,
+ size_t scidlen,
+ int *qlogfdp);
+#endif
+
+#endif /* HEADER_CURL_VQUIC_QUIC_H */
diff --git a/lib/vssh/libssh.c b/lib/vssh/libssh.c
index cad8b3786..acdb4e753 100644
--- a/lib/vssh/libssh.c
+++ b/lib/vssh/libssh.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2017 - 2019 Red Hat, Inc.
+ * Copyright (C) 2017 - 2020 Red Hat, Inc.
*
* Authors: Nikos Mavrogiannopoulos, Tomas Mraz, Stanislav Zidek,
* Robert Kolcun, Andreas Schneider
@@ -97,9 +97,13 @@
/* A recent macro provided by libssh. Or make our own. */
#ifndef SSH_STRING_FREE_CHAR
-/* !checksrc! disable ASSIGNWITHINCONDITION 1 */
-#define SSH_STRING_FREE_CHAR(x) \
- do { if((x) != NULL) { ssh_string_free_char(x); x = NULL; } } while(0)
+#define SSH_STRING_FREE_CHAR(x) \
+ do { \
+ if(x) { \
+ ssh_string_free_char(x); \
+ x = NULL; \
+ } \
+ } while(0)
#endif
/* Local functions: */
@@ -154,6 +158,7 @@ const struct Curl_handler Curl_handler_scp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SCP, /* protocol */
+ CURLPROTO_SCP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */
};
@@ -179,6 +184,7 @@ const struct Curl_handler Curl_handler_sftp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SFTP, /* protocol */
+ CURLPROTO_SFTP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
| PROTOPT_NOURLQUERY /* flags */
};
@@ -318,25 +324,50 @@ static int myssh_is_known(struct connectdata *conn)
ssh_key pubkey;
size_t hlen;
unsigned char *hash = NULL;
- char *base64 = NULL;
+ char *found_base64 = NULL;
+ char *known_base64 = NULL;
int vstate;
enum curl_khmatch keymatch;
struct curl_khkey foundkey;
+ struct curl_khkey *knownkeyp = NULL;
curl_sshkeycallback func =
data->set.ssh_keyfunc;
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ struct ssh_knownhosts_entry *knownhostsentry = NULL;
+ struct curl_khkey knownkey;
+#endif
+
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,8,0)
+ rc = ssh_get_server_publickey(sshc->ssh_session, &pubkey);
+#else
rc = ssh_get_publickey(sshc->ssh_session, &pubkey);
+#endif
if(rc != SSH_OK)
return rc;
if(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) {
+ int i;
+ char md5buffer[33];
+ const char *pubkey_md5 = data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5];
+
rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_MD5,
&hash, &hlen);
- if(rc != SSH_OK)
+ if(rc != SSH_OK || hlen != 16) {
+ failf(data,
+ "Denied establishing ssh session: md5 fingerprint not available");
goto cleanup;
+ }
+
+ for(i = 0; i < 16; i++)
+ msnprintf(&md5buffer[i*2], 3, "%02x", (unsigned char)hash[i]);
+
+ infof(data, "SSH MD5 fingerprint: %s\n", md5buffer);
- if(hlen != strlen(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) ||
- memcmp(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5], hash, hlen)) {
+ if(!strcasecompare(md5buffer, pubkey_md5)) {
+ failf(data,
+ "Denied establishing ssh session: mismatch md5 fingerprint. "
+ "Remote %s is not equal to %s", md5buffer, pubkey_md5);
rc = SSH_ERROR;
goto cleanup;
}
@@ -350,6 +381,68 @@ static int myssh_is_known(struct connectdata *conn)
goto cleanup;
}
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ /* Get the known_key from the known hosts file */
+ vstate = ssh_session_get_known_hosts_entry(sshc->ssh_session,
+ &knownhostsentry);
+
+ /* Case an entry was found in a known hosts file */
+ if(knownhostsentry) {
+ if(knownhostsentry->publickey) {
+ rc = ssh_pki_export_pubkey_base64(knownhostsentry->publickey,
+ &known_base64);
+ if(rc != SSH_OK) {
+ goto cleanup;
+ }
+ knownkey.key = known_base64;
+ knownkey.len = strlen(known_base64);
+
+ switch(ssh_key_type(knownhostsentry->publickey)) {
+ case SSH_KEYTYPE_RSA:
+ knownkey.keytype = CURLKHTYPE_RSA;
+ break;
+ case SSH_KEYTYPE_RSA1:
+ knownkey.keytype = CURLKHTYPE_RSA1;
+ break;
+ case SSH_KEYTYPE_ECDSA:
+ case SSH_KEYTYPE_ECDSA_P256:
+ case SSH_KEYTYPE_ECDSA_P384:
+ case SSH_KEYTYPE_ECDSA_P521:
+ knownkey.keytype = CURLKHTYPE_ECDSA;
+ break;
+ case SSH_KEYTYPE_ED25519:
+ knownkey.keytype = CURLKHTYPE_ED25519;
+ break;
+ case SSH_KEYTYPE_DSS:
+ knownkey.keytype = CURLKHTYPE_DSS;
+ break;
+ default:
+ rc = SSH_ERROR;
+ goto cleanup;
+ }
+ knownkeyp = &knownkey;
+ }
+ }
+
+ switch(vstate) {
+ case SSH_KNOWN_HOSTS_OK:
+ keymatch = CURLKHMATCH_OK;
+ break;
+ case SSH_KNOWN_HOSTS_OTHER:
+ /* fallthrough */
+ case SSH_KNOWN_HOSTS_NOT_FOUND:
+ /* fallthrough */
+ case SSH_KNOWN_HOSTS_UNKNOWN:
+ /* fallthrough */
+ case SSH_KNOWN_HOSTS_ERROR:
+ keymatch = CURLKHMATCH_MISSING;
+ break;
+ default:
+ keymatch = CURLKHMATCH_MISMATCH;
+ break;
+ }
+
+#else
vstate = ssh_is_server_known(sshc->ssh_session);
switch(vstate) {
case SSH_SERVER_KNOWN_OK:
@@ -364,14 +457,15 @@ static int myssh_is_known(struct connectdata *conn)
keymatch = CURLKHMATCH_MISMATCH;
break;
}
+#endif
if(func) { /* use callback to determine action */
- rc = ssh_pki_export_pubkey_base64(pubkey, &base64);
+ rc = ssh_pki_export_pubkey_base64(pubkey, &found_base64);
if(rc != SSH_OK)
goto cleanup;
- foundkey.key = base64;
- foundkey.len = strlen(base64);
+ foundkey.key = found_base64;
+ foundkey.len = strlen(found_base64);
switch(ssh_key_type(pubkey)) {
case SSH_KEYTYPE_RSA:
@@ -381,6 +475,11 @@ static int myssh_is_known(struct connectdata *conn)
foundkey.keytype = CURLKHTYPE_RSA1;
break;
case SSH_KEYTYPE_ECDSA:
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ case SSH_KEYTYPE_ECDSA_P256:
+ case SSH_KEYTYPE_ECDSA_P384:
+ case SSH_KEYTYPE_ECDSA_P521:
+#endif
foundkey.keytype = CURLKHTYPE_ECDSA;
break;
#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,7,0)
@@ -396,15 +495,19 @@ static int myssh_is_known(struct connectdata *conn)
goto cleanup;
}
- /* we don't have anything equivalent to knownkey. Always NULL */
Curl_set_in_callback(data, true);
- rc = func(data, NULL, &foundkey, /* from the remote host */
+ rc = func(data, knownkeyp, /* from the knownhosts file */
+ &foundkey, /* from the remote host */
keymatch, data->set.ssh_keyfunc_userp);
Curl_set_in_callback(data, false);
switch(rc) {
case CURLKHSTAT_FINE_ADD_TO_FILE:
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,8,0)
+ rc = ssh_session_update_known_hosts(sshc->ssh_session);
+#else
rc = ssh_write_knownhost(sshc->ssh_session);
+#endif
if(rc != SSH_OK) {
goto cleanup;
}
@@ -425,9 +528,20 @@ static int myssh_is_known(struct connectdata *conn)
rc = SSH_OK;
cleanup:
+ if(found_base64) {
+ free(found_base64);
+ }
+ if(known_base64) {
+ free(known_base64);
+ }
if(hash)
ssh_clean_pubkey_hash(&hash);
ssh_key_free(pubkey);
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,9,0)
+ if(knownhostsentry) {
+ ssh_knownhosts_entry_free(knownhostsentry);
+ }
+#endif
return rc;
}
@@ -1582,7 +1696,6 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
return CURLE_BAD_DOWNLOAD_RESUME;
}
}
- /* Does a completed file need to be seeked and started or closed ? */
/* Now store the number of bytes we are expected to download */
data->req.size = size - data->state.resume_from;
data->req.maxdownload = size - data->state.resume_from;
@@ -2038,6 +2151,7 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
CURLcode result;
curl_socket_t sock = conn->sock[FIRSTSOCKET];
struct Curl_easy *data = conn->data;
+ int rc;
/* initialize per-handle data if not already */
if(!data->req.protop)
@@ -2064,38 +2178,70 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
return CURLE_FAILED_INIT;
}
- ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
+ rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name);
+ if(rc != SSH_OK) {
+ failf(data, "Could not set remote host");
+ return CURLE_FAILED_INIT;
+ }
- if(conn->user) {
+ rc = ssh_options_parse_config(ssh->ssh_session, NULL);
+ if(rc != SSH_OK) {
+ infof(data, "Could not parse SSH configuration files");
+ /* ignore */
+ }
+
+ rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
+ if(rc != SSH_OK) {
+ failf(data, "Could not set socket");
+ return CURLE_FAILED_INIT;
+ }
+
+ if(conn->user && conn->user[0] != '\0') {
infof(data, "User: %s\n", conn->user);
- ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
+ rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
+ if(rc != SSH_OK) {
+ failf(data, "Could not set user");
+ return CURLE_FAILED_INIT;
+ }
}
if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
infof(data, "Known hosts: %s\n", data->set.str[STRING_SSH_KNOWNHOSTS]);
- ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS,
- data->set.str[STRING_SSH_KNOWNHOSTS]);
+ rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS,
+ data->set.str[STRING_SSH_KNOWNHOSTS]);
+ if(rc != SSH_OK) {
+ failf(data, "Could not set known hosts file path");
+ return CURLE_FAILED_INIT;
+ }
}
- ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name);
- if(conn->remote_port)
- ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT,
- &conn->remote_port);
+ if(conn->remote_port) {
+ rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT,
+ &conn->remote_port);
+ if(rc != SSH_OK) {
+ failf(data, "Could not set remote port");
+ return CURLE_FAILED_INIT;
+ }
+ }
if(data->set.ssh_compression) {
- ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION,
- "zlib,zlib@openssh.com,none");
+ rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION,
+ "zlib,zlib@openssh.com,none");
+ if(rc != SSH_OK) {
+ failf(data, "Could not set compression");
+ return CURLE_FAILED_INIT;
+ }
}
ssh->privkey = NULL;
ssh->pubkey = NULL;
if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
- int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
- &ssh->pubkey);
+ rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
+ &ssh->pubkey);
if(rc != SSH_OK) {
failf(data, "Could not load public key file");
- /* ignore */
+ return CURLE_FAILED_INIT;
}
}
@@ -2548,7 +2694,9 @@ static void sftp_quote(struct connectdata *conn)
*/
if(strncasecompare(cmd, "chgrp ", 6) ||
strncasecompare(cmd, "chmod ", 6) ||
- strncasecompare(cmd, "chown ", 6)) {
+ strncasecompare(cmd, "chown ", 6) ||
+ strncasecompare(cmd, "atime ", 6) ||
+ strncasecompare(cmd, "mtime ", 6)) {
/* attribute change */
/* sshc->quote_path1 contains the mode to set */
@@ -2558,7 +2706,7 @@ static void sftp_quote(struct connectdata *conn)
if(result == CURLE_OUT_OF_MEMORY)
failf(data, "Out of memory");
else
- failf(data, "Syntax error in chgrp/chmod/chown: "
+ failf(data, "Syntax error in chgrp/chmod/chown/atime/mtime: "
"Bad second parameter");
Curl_safefree(sshc->quote_path1);
state(conn, SSH_SFTP_CLOSE);
@@ -2719,6 +2867,34 @@ static void sftp_quote_stat(struct connectdata *conn)
}
sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
}
+ else if(strncasecompare(cmd, "atime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect access date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ return;
+ }
+ sshc->quote_attrs->atime = (uint32_t)date;
+ sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
+ }
+ else if(strncasecompare(cmd, "mtime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect modification date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ return;
+ }
+ sshc->quote_attrs->mtime = (uint32_t)date;
+ sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_ACMODTIME;
+ }
/* Now send the completed structure... */
state(conn, SSH_SFTP_QUOTE_SETSTAT);
diff --git a/lib/vssh/libssh2.c b/lib/vssh/libssh2.c
index c71cfbc9f..d983cc9a9 100644
--- a/lib/vssh/libssh2.c
+++ b/lib/vssh/libssh2.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -93,19 +93,17 @@
#define HAS_STATVFS_SUPPORT 1
#endif
-#define sftp_libssh2_last_error(s) curlx_ultosi(libssh2_sftp_last_error(s))
-
-#define sftp_libssh2_realpath(s,p,t,m) \
- libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
- (t), (m), LIBSSH2_SFTP_REALPATH)
-
+#define sftp_libssh2_realpath(s,p,t,m) \
+ libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
+ (t), (m), LIBSSH2_SFTP_REALPATH)
/* Local functions: */
-static const char *sftp_libssh2_strerror(int err);
+static const char *sftp_libssh2_strerror(unsigned long err);
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc);
static LIBSSH2_FREE_FUNC(my_libssh2_free);
+static CURLcode ssh_force_knownhost_key_type(struct connectdata *conn);
static CURLcode ssh_connect(struct connectdata *conn, bool *done);
static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode ssh_do(struct connectdata *conn, bool *done);
@@ -152,6 +150,7 @@ const struct Curl_handler Curl_handler_scp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SCP, /* protocol */
+ CURLPROTO_SCP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
| PROTOPT_NOURLQUERY /* flags */
};
@@ -179,6 +178,7 @@ const struct Curl_handler Curl_handler_sftp = {
ZERO_NULL, /* connection_check */
PORT_SSH, /* defport */
CURLPROTO_SFTP, /* protocol */
+ CURLPROTO_SFTP, /* family */
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
| PROTOPT_NOURLQUERY /* flags */
};
@@ -212,7 +212,7 @@ kbd_callback(const char *name, int name_len, const char *instruction,
(void)abstract;
} /* kbd_callback */
-static CURLcode sftp_libssh2_error_to_CURLE(int err)
+static CURLcode sftp_libssh2_error_to_CURLE(unsigned long err)
{
switch(err) {
case LIBSSH2_FX_OK:
@@ -444,6 +444,7 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
/* we're asked to verify the host against a file */
struct ssh_conn *sshc = &conn->proto.sshc;
+ struct libssh2_knownhost *host = NULL;
int rc;
int keytype;
size_t keylen;
@@ -458,7 +459,6 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
* What host name does OpenSSH store in its file if an IDN name is
* used?
*/
- struct libssh2_knownhost *host;
enum curl_khmatch keymatch;
curl_sshkeycallback func =
data->set.ssh_keyfunc?data->set.ssh_keyfunc:sshkeycallback;
@@ -466,61 +466,95 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
struct curl_khkey *knownkeyp = NULL;
struct curl_khkey foundkey;
- keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
- LIBSSH2_KNOWNHOST_KEY_SSHRSA:LIBSSH2_KNOWNHOST_KEY_SSHDSS;
-
+ switch(keytype) {
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
+ keybit = LIBSSH2_KNOWNHOST_KEY_SSHRSA;
+ break;
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
+ keybit = LIBSSH2_KNOWNHOST_KEY_SSHDSS;
+ break;
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
+ break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_384
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
+ break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_521
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
+ break;
+#endif
+#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
+ keybit = LIBSSH2_KNOWNHOST_KEY_ED25519;
+ break;
+#endif
+ default:
+ infof(data, "unsupported key type, can't check knownhosts!\n");
+ keybit = 0;
+ break;
+ }
+ if(!keybit)
+ /* no check means failure! */
+ rc = CURLKHSTAT_REJECT;
+ else {
#ifdef HAVE_LIBSSH2_KNOWNHOST_CHECKP
- keycheck = libssh2_knownhost_checkp(sshc->kh,
- conn->host.name,
- (conn->remote_port != PORT_SSH)?
- conn->remote_port:-1,
- remotekey, keylen,
- LIBSSH2_KNOWNHOST_TYPE_PLAIN|
- LIBSSH2_KNOWNHOST_KEYENC_RAW|
- keybit,
- &host);
+ keycheck = libssh2_knownhost_checkp(sshc->kh,
+ conn->host.name,
+ (conn->remote_port != PORT_SSH)?
+ conn->remote_port:-1,
+ remotekey, keylen,
+ LIBSSH2_KNOWNHOST_TYPE_PLAIN|
+ LIBSSH2_KNOWNHOST_KEYENC_RAW|
+ keybit,
+ &host);
#else
- keycheck = libssh2_knownhost_check(sshc->kh,
- conn->host.name,
- remotekey, keylen,
- LIBSSH2_KNOWNHOST_TYPE_PLAIN|
- LIBSSH2_KNOWNHOST_KEYENC_RAW|
- keybit,
- &host);
+ keycheck = libssh2_knownhost_check(sshc->kh,
+ conn->host.name,
+ remotekey, keylen,
+ LIBSSH2_KNOWNHOST_TYPE_PLAIN|
+ LIBSSH2_KNOWNHOST_KEYENC_RAW|
+ keybit,
+ &host);
#endif
- infof(data, "SSH host check: %d, key: %s\n", keycheck,
- (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
- host->key:"<none>");
+ infof(data, "SSH host check: %d, key: %s\n", keycheck,
+ (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
+ host->key:"<none>");
+
+ /* setup 'knownkey' */
+ if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
+ knownkey.key = host->key;
+ knownkey.len = 0;
+ knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
+ CURLKHTYPE_RSA : CURLKHTYPE_DSS;
+ knownkeyp = &knownkey;
+ }
- /* setup 'knownkey' */
- if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
- knownkey.key = host->key;
- knownkey.len = 0;
- knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
+ /* setup 'foundkey' */
+ foundkey.key = remotekey;
+ foundkey.len = keylen;
+ foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
CURLKHTYPE_RSA : CURLKHTYPE_DSS;
- knownkeyp = &knownkey;
- }
- /* setup 'foundkey' */
- foundkey.key = remotekey;
- foundkey.len = keylen;
- foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
- CURLKHTYPE_RSA : CURLKHTYPE_DSS;
+ /*
+ * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
+ * curl_khmatch enum are ever modified, we need to introduce a
+ * translation table here!
+ */
+ keymatch = (enum curl_khmatch)keycheck;
- /*
- * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
- * curl_khmatch enum are ever modified, we need to introduce a
- * translation table here!
- */
- keymatch = (enum curl_khmatch)keycheck;
-
- /* Ask the callback how to behave */
- Curl_set_in_callback(data, true);
- rc = func(data, knownkeyp, /* from the knownhosts file */
- &foundkey, /* from the remote host */
- keymatch, data->set.ssh_keyfunc_userp);
- Curl_set_in_callback(data, false);
+ /* Ask the callback how to behave */
+ Curl_set_in_callback(data, true);
+ rc = func(data, knownkeyp, /* from the knownhosts file */
+ &foundkey, /* from the remote host */
+ keymatch, data->set.ssh_keyfunc_userp);
+ Curl_set_in_callback(data, false);
+ }
}
else
/* no remotekey means failure! */
@@ -536,7 +570,13 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
/* DEFER means bail out but keep the SSH_HOSTKEY state */
result = sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
break;
+ case CURLKHSTAT_FINE_REPLACE:
+ /* remove old host+key that doesn't match */
+ if(host)
+ libssh2_knownhost_del(sshc->kh, host);
+ /*FALLTHROUGH*/
case CURLKHSTAT_FINE:
+ /*FALLTHROUGH*/
case CURLKHSTAT_FINE_ADD_TO_FILE:
/* proceed */
if(keycheck != LIBSSH2_KNOWNHOST_CHECK_MATCH) {
@@ -551,7 +591,8 @@ static CURLcode ssh_knownhost(struct connectdata *conn)
if(addrc)
infof(data, "Warning adding the known host %s failed!\n",
conn->host.name);
- else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE) {
+ else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE ||
+ rc == CURLKHSTAT_FINE_REPLACE) {
/* now we write the entire in-memory list of known hosts to the
known_hosts file */
int wrc =
@@ -615,6 +656,138 @@ static CURLcode ssh_check_fingerprint(struct connectdata *conn)
}
/*
+ * ssh_force_knownhost_key_type() will check the known hosts file and try to
+ * force a specific public key type from the server if an entry is found.
+ */
+static CURLcode ssh_force_knownhost_key_type(struct connectdata *conn)
+{
+ CURLcode result = CURLE_OK;
+
+#ifdef HAVE_LIBSSH2_KNOWNHOST_API
+
+#ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
+ static const char * const hostkey_method_ssh_ed25519
+ = "ssh-ed25519";
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_521
+ static const char * const hostkey_method_ssh_ecdsa_521
+ = "ecdsa-sha2-nistp521";
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_384
+ static const char * const hostkey_method_ssh_ecdsa_384
+ = "ecdsa-sha2-nistp384";
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
+ static const char * const hostkey_method_ssh_ecdsa_256
+ = "ecdsa-sha2-nistp256";
+#endif
+ static const char * const hostkey_method_ssh_rsa
+ = "ssh-rsa";
+ static const char * const hostkey_method_ssh_dss
+ = "ssh-dss";
+
+ const char *hostkey_method = NULL;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ struct Curl_easy *data = conn->data;
+ struct libssh2_knownhost* store = NULL;
+ const char *kh_name_end = NULL;
+ size_t kh_name_size = 0;
+ int port = 0;
+ bool found = false;
+
+ if(sshc->kh && !data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) {
+ /* lets try to find our host in the known hosts file */
+ while(!libssh2_knownhost_get(sshc->kh, &store, store)) {
+ /* For non-standard ports, the name will be enclosed in */
+ /* square brackets, followed by a colon and the port */
+ if(store) {
+ if(store->name) {
+ if(store->name[0] == '[') {
+ kh_name_end = strstr(store->name, "]:");
+ if(!kh_name_end) {
+ infof(data, "Invalid host pattern %s in %s\n",
+ store->name, data->set.str[STRING_SSH_KNOWNHOSTS]);
+ continue;
+ }
+ port = atoi(kh_name_end + 2);
+ if(kh_name_end && (port == conn->remote_port)) {
+ kh_name_size = strlen(store->name) - 1 - strlen(kh_name_end);
+ if(strncmp(store->name + 1,
+ conn->host.name, kh_name_size) == 0) {
+ found = true;
+ break;
+ }
+ }
+ }
+ else if(strcmp(store->name, conn->host.name) == 0) {
+ found = true;
+ break;
+ }
+ }
+ else {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if(found) {
+ infof(data, "Found host %s in %s\n",
+ conn->host.name, data->set.str[STRING_SSH_KNOWNHOSTS]);
+
+ switch(store->typemask & LIBSSH2_KNOWNHOST_KEY_MASK) {
+#ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
+ case LIBSSH2_KNOWNHOST_KEY_ED25519:
+ hostkey_method = hostkey_method_ssh_ed25519;
+ break;
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_521
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
+ hostkey_method = hostkey_method_ssh_ecdsa_521;
+ break;
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_384
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_384:
+ hostkey_method = hostkey_method_ssh_ecdsa_384;
+ break;
+#endif
+#ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_256:
+ hostkey_method = hostkey_method_ssh_ecdsa_256;
+ break;
+#endif
+ case LIBSSH2_KNOWNHOST_KEY_SSHRSA:
+ hostkey_method = hostkey_method_ssh_rsa;
+ break;
+ case LIBSSH2_KNOWNHOST_KEY_SSHDSS:
+ hostkey_method = hostkey_method_ssh_dss;
+ break;
+ case LIBSSH2_KNOWNHOST_KEY_RSA1:
+ failf(data, "Found host key type RSA1 which is not supported\n");
+ return CURLE_SSH;
+ default:
+ failf(data, "Unknown host key type: %i\n",
+ (store->typemask & LIBSSH2_KNOWNHOST_KEY_MASK));
+ return CURLE_SSH;
+ }
+
+ infof(data, "Set \"%s\" as SSH hostkey type\n", hostkey_method);
+ result = libssh2_session_error_to_CURLE(
+ libssh2_session_method_pref(
+ sshc->ssh_session, LIBSSH2_METHOD_HOSTKEY, hostkey_method));
+ }
+ else {
+ infof(data, "Did not find host %s in %s\n",
+ conn->host.name, data->set.str[STRING_SSH_KNOWNHOSTS]);
+ }
+ }
+
+#endif /* HAVE_LIBSSH2_KNOWNHOST_API */
+
+ return result;
+}
+
+/*
* ssh_statemach_act() runs the SSH state machine as far as it can without
* blocking and without reaching the end. The data the pointer 'block' points
* to will be set to TRUE if the libssh2 function returns LIBSSH2_ERROR_EAGAIN
@@ -628,10 +801,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
struct SSHPROTO *sftp_scp = data->req.protop;
struct ssh_conn *sshc = &conn->proto.sshc;
curl_socket_t sock = conn->sock[FIRSTSOCKET];
- char *new_readdir_line;
int rc = LIBSSH2_ERROR_NONE;
- int err;
+ int ssherr;
+ unsigned long sftperr;
int seekerr = CURL_SEEKFUNC_OK;
+ size_t readdir_len;
*block = 0; /* we're not blocking by default */
do {
@@ -646,6 +820,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
non-blocking */
libssh2_session_set_blocking(sshc->ssh_session, 0);
+ result = ssh_force_knownhost_key_type(conn);
+ if(result) {
+ state(conn, SSH_SESSION_FREE);
+ sshc->actualcode = result;
+ break;
+ }
+
state(conn, SSH_S_STARTUP);
/* FALLTHROUGH */
@@ -701,12 +882,12 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
state(conn, SSH_AUTH_DONE);
break;
}
- err = libssh2_session_last_errno(sshc->ssh_session);
- if(err == LIBSSH2_ERROR_EAGAIN)
+ ssherr = libssh2_session_last_errno(sshc->ssh_session);
+ if(ssherr == LIBSSH2_ERROR_EAGAIN)
rc = LIBSSH2_ERROR_EAGAIN;
else {
state(conn, SSH_SESSION_FREE);
- sshc->actualcode = libssh2_session_error_to_CURLE(err);
+ sshc->actualcode = libssh2_session_error_to_CURLE(ssherr);
}
break;
}
@@ -1076,16 +1257,16 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
else {
/* Return the error type */
- err = sftp_libssh2_last_error(sshc->sftp_session);
- if(err)
- result = sftp_libssh2_error_to_CURLE(err);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
+ if(sftperr)
+ result = sftp_libssh2_error_to_CURLE(sftperr);
else
/* in this case, the error wasn't in the SFTP level but for example
a time-out or similar */
result = CURLE_SSH;
sshc->actualcode = result;
DEBUGF(infof(data, "error = %d makes libcurl = %d\n",
- err, (int)result));
+ sftperr, (int)result));
state(conn, SSH_STOP);
break;
}
@@ -1187,7 +1368,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
*/
cp = strchr(cmd, ' ');
if(cp == NULL) {
- failf(data, "Syntax error in SFTP command. Supply parameter(s)!");
+ failf(data, "Syntax error command '%s'. Missing parameter!",
+ cmd);
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1203,7 +1385,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(result == CURLE_OUT_OF_MEMORY)
failf(data, "Out of memory");
else
- failf(data, "Syntax error: Bad first parameter");
+ failf(data, "Syntax error: Bad first parameter to '%s'", cmd);
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = result;
@@ -1218,7 +1400,9 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
*/
if(strncasecompare(cmd, "chgrp ", 6) ||
strncasecompare(cmd, "chmod ", 6) ||
- strncasecompare(cmd, "chown ", 6) ) {
+ strncasecompare(cmd, "chown ", 6) ||
+ strncasecompare(cmd, "atime ", 6) ||
+ strncasecompare(cmd, "mtime ", 6)) {
/* attribute change */
/* sshc->quote_path1 contains the mode to set */
@@ -1228,8 +1412,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(result == CURLE_OUT_OF_MEMORY)
failf(data, "Out of memory");
else
- failf(data, "Syntax error in chgrp/chmod/chown: "
- "Bad second parameter");
+ failf(data, "Syntax error in %s: Bad second parameter", cmd);
Curl_safefree(sshc->quote_path1);
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
@@ -1360,11 +1543,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
failf(data, "Attempt to get SFTP stats failed: %s",
- sftp_libssh2_strerror(err));
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1416,6 +1599,34 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
}
+ else if(strncasecompare(cmd, "atime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect access date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ break;
+ }
+ sshc->quote_attrs.atime = (unsigned long)date;
+ sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_ACMODTIME;
+ }
+ else if(strncasecompare(cmd, "mtime", 5)) {
+ time_t date = Curl_getdate_capped(sshc->quote_path1);
+ if(date == -1) {
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+ failf(data, "Syntax error: incorrect modification date format");
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->nextstate = SSH_NO_STATE;
+ sshc->actualcode = CURLE_QUOTE_ERROR;
+ break;
+ }
+ sshc->quote_attrs.mtime = (unsigned long)date;
+ sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_ACMODTIME;
+ }
/* Now send the completed structure... */
state(conn, SSH_SFTP_QUOTE_SETSTAT);
@@ -1431,11 +1642,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
failf(data, "Attempt to set SFTP stats failed: %s",
- sftp_libssh2_strerror(err));
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1454,11 +1665,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
failf(data, "symlink command failed: %s",
- sftp_libssh2_strerror(err));
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1475,9 +1686,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
- failf(data, "mkdir command failed: %s", sftp_libssh2_strerror(err));
+ failf(data, "mkdir command failed: %s",
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1499,10 +1711,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
Curl_safefree(sshc->quote_path2);
- failf(data, "rename command failed: %s", sftp_libssh2_strerror(err));
+ failf(data, "rename command failed: %s",
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1518,9 +1731,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
- failf(data, "rmdir command failed: %s", sftp_libssh2_strerror(err));
+ failf(data, "rmdir command failed: %s",
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1536,9 +1750,9 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
- failf(data, "rm command failed: %s", sftp_libssh2_strerror(err));
+ failf(data, "rm command failed: %s", sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1559,9 +1773,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc != 0 && !sshc->acceptfail) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
Curl_safefree(sshc->quote_path1);
- failf(data, "statvfs command failed: %s", sftp_libssh2_strerror(err));
+ failf(data, "statvfs command failed: %s",
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
sshc->nextstate = SSH_NO_STATE;
sshc->actualcode = CURLE_QUOTE_ERROR;
@@ -1698,21 +1913,21 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
/* only when there was an SFTP protocol error can we extract
the sftp error! */
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
else
- err = -1; /* not an sftp error at all */
+ sftperr = LIBSSH2_FX_OK; /* not an sftp error at all */
if(sshc->secondCreateDirs) {
state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = err>= LIBSSH2_FX_OK?
- sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
+ sshc->actualcode = sftperr != LIBSSH2_FX_OK ?
+ sftp_libssh2_error_to_CURLE(sftperr):CURLE_SSH;
failf(data, "Creating the dir/file failed: %s",
- sftp_libssh2_strerror(err));
+ sftp_libssh2_strerror(sftperr));
break;
}
- if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
- (err == LIBSSH2_FX_FAILURE) ||
- (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
+ if(((sftperr == LIBSSH2_FX_NO_SUCH_FILE) ||
+ (sftperr == LIBSSH2_FX_FAILURE) ||
+ (sftperr == LIBSSH2_FX_NO_SUCH_PATH)) &&
(data->set.ftp_create_missing_dirs &&
(strlen(sftp_scp->path) > 1))) {
/* try to create the path remotely */
@@ -1722,18 +1937,19 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = err>= LIBSSH2_FX_OK?
- sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
+ sshc->actualcode = sftperr != LIBSSH2_FX_OK ?
+ sftp_libssh2_error_to_CURLE(sftperr):CURLE_SSH;
if(!sshc->actualcode) {
- /* Sometimes, for some reason libssh2_sftp_last_error() returns
- zero even though libssh2_sftp_open() failed previously! We need
- to work around that! */
+ /* Sometimes, for some reason libssh2_sftp_last_error() returns zero
+ even though libssh2_sftp_open() failed previously! We need to
+ work around that! */
sshc->actualcode = CURLE_SSH;
- err = -1;
+ sftperr = LIBSSH2_FX_OK;
}
failf(data, "Upload failed: %s (%d/%d)",
- err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
- err, rc);
+ sftperr != LIBSSH2_FX_OK ?
+ sftp_libssh2_strerror(sftperr):"ssh error",
+ sftperr, rc);
break;
}
@@ -1860,11 +2076,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
* permission was denied (creation might succeed further down the
* path) - retry on unspecific FAILURE also
*/
- err = sftp_libssh2_last_error(sshc->sftp_session);
- if((err != LIBSSH2_FX_FILE_ALREADY_EXISTS) &&
- (err != LIBSSH2_FX_FAILURE) &&
- (err != LIBSSH2_FX_PERMISSION_DENIED)) {
- result = sftp_libssh2_error_to_CURLE(err);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
+ if((sftperr != LIBSSH2_FX_FILE_ALREADY_EXISTS) &&
+ (sftperr != LIBSSH2_FX_FAILURE) &&
+ (sftperr != LIBSSH2_FX_PERMISSION_DENIED)) {
+ result = sftp_libssh2_error_to_CURLE(sftperr);
state(conn, SSH_SFTP_CLOSE);
sshc->actualcode = result?result:CURLE_SSH;
break;
@@ -1896,11 +2112,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
failf(data, "Could not open directory for reading: %s",
- sftp_libssh2_strerror(err));
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
- result = sftp_libssh2_error_to_CURLE(err);
+ result = sftp_libssh2_error_to_CURLE(sftperr);
sshc->actualcode = result?result:CURLE_SSH;
break;
}
@@ -1917,6 +2133,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
sshc->actualcode = CURLE_OUT_OF_MEMORY;
break;
}
+ Curl_dyn_init(&sshc->readdir, PATH_MAX * 2);
state(conn, SSH_SFTP_READDIR);
break;
@@ -1931,68 +2148,51 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
if(rc > 0) {
- sshc->readdir_len = (size_t) rc;
- sshc->readdir_filename[sshc->readdir_len] = '\0';
+ readdir_len = (size_t) rc;
+ sshc->readdir_filename[readdir_len] = '\0';
if(data->set.ftp_list_only) {
- char *tmpLine;
-
- tmpLine = aprintf("%s\n", sshc->readdir_filename);
- if(tmpLine == NULL) {
- state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = CURLE_OUT_OF_MEMORY;
- break;
- }
result = Curl_client_write(conn, CLIENTWRITE_BODY,
- tmpLine, sshc->readdir_len + 1);
- free(tmpLine);
-
+ sshc->readdir_filename,
+ readdir_len);
+ if(!result)
+ result = Curl_client_write(conn, CLIENTWRITE_BODY,
+ (char *)"\n", 1);
if(result) {
state(conn, SSH_STOP);
break;
}
/* since this counts what we send to the client, we include the
newline in this counter */
- data->req.bytecount += sshc->readdir_len + 1;
+ data->req.bytecount += readdir_len + 1;
/* output debug output if that is requested */
if(data->set.verbose) {
- Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_filename,
- sshc->readdir_len);
+ Curl_debug(data, CURLINFO_DATA_IN, sshc->readdir_filename,
+ readdir_len);
+ Curl_debug(data, CURLINFO_DATA_IN, (char *)"\n", 1);
}
}
else {
- sshc->readdir_currLen = strlen(sshc->readdir_longentry);
- sshc->readdir_totalLen = 80 + sshc->readdir_currLen;
- sshc->readdir_line = calloc(sshc->readdir_totalLen, 1);
- if(!sshc->readdir_line) {
- Curl_safefree(sshc->readdir_filename);
- Curl_safefree(sshc->readdir_longentry);
- state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = CURLE_OUT_OF_MEMORY;
- break;
- }
-
- memcpy(sshc->readdir_line, sshc->readdir_longentry,
- sshc->readdir_currLen);
- if((sshc->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
- ((sshc->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
- LIBSSH2_SFTP_S_IFLNK)) {
- sshc->readdir_linkPath = malloc(PATH_MAX + 1);
- if(sshc->readdir_linkPath == NULL) {
- Curl_safefree(sshc->readdir_filename);
- Curl_safefree(sshc->readdir_longentry);
- state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = CURLE_OUT_OF_MEMORY;
+ result = Curl_dyn_add(&sshc->readdir, sshc->readdir_longentry);
+
+ if(!result) {
+ if((sshc->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
+ ((sshc->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
+ LIBSSH2_SFTP_S_IFLNK)) {
+ Curl_dyn_init(&sshc->readdir_link, PATH_MAX);
+ result = Curl_dyn_add(&sshc->readdir_link, sftp_scp->path);
+ state(conn, SSH_SFTP_READDIR_LINK);
+ if(!result)
+ break;
+ }
+ else {
+ state(conn, SSH_SFTP_READDIR_BOTTOM);
break;
}
-
- msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", sftp_scp->path,
- sshc->readdir_filename);
- state(conn, SSH_SFTP_READDIR_LINK);
- break;
}
- state(conn, SSH_SFTP_READDIR_BOTTOM);
+ sshc->actualcode = result;
+ state(conn, SSH_SFTP_CLOSE);
break;
}
}
@@ -2003,11 +2203,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
break;
}
else if(rc < 0) {
- err = sftp_libssh2_last_error(sshc->sftp_session);
- result = sftp_libssh2_error_to_CURLE(err);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
+ result = sftp_libssh2_error_to_CURLE(sftperr);
sshc->actualcode = result?result:CURLE_SSH;
failf(data, "Could not open remote file for reading: %s :: %d",
- sftp_libssh2_strerror(err),
+ sftp_libssh2_strerror(sftperr),
libssh2_session_last_errno(sshc->ssh_session));
Curl_safefree(sshc->readdir_filename);
Curl_safefree(sshc->readdir_longentry);
@@ -2019,64 +2219,56 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
case SSH_SFTP_READDIR_LINK:
rc =
libssh2_sftp_symlink_ex(sshc->sftp_session,
- sshc->readdir_linkPath,
- curlx_uztoui(strlen(sshc->readdir_linkPath)),
+ Curl_dyn_ptr(&sshc->readdir_link),
+ (int)Curl_dyn_len(&sshc->readdir_link),
sshc->readdir_filename,
PATH_MAX, LIBSSH2_SFTP_READLINK);
if(rc == LIBSSH2_ERROR_EAGAIN) {
break;
}
- sshc->readdir_len = (size_t) rc;
- Curl_safefree(sshc->readdir_linkPath);
+ readdir_len = (size_t) rc;
+ Curl_dyn_free(&sshc->readdir_link);
+
+ /* append filename and extra output */
+ result = Curl_dyn_addf(&sshc->readdir, " -> %s", sshc->readdir_filename);
- /* get room for the filename and extra output */
- sshc->readdir_totalLen += 4 + sshc->readdir_len;
- new_readdir_line = Curl_saferealloc(sshc->readdir_line,
- sshc->readdir_totalLen);
- if(!new_readdir_line) {
+ if(result) {
sshc->readdir_line = NULL;
Curl_safefree(sshc->readdir_filename);
Curl_safefree(sshc->readdir_longentry);
state(conn, SSH_SFTP_CLOSE);
- sshc->actualcode = CURLE_OUT_OF_MEMORY;
+ sshc->actualcode = result;
break;
}
- sshc->readdir_line = new_readdir_line;
-
- sshc->readdir_currLen += msnprintf(sshc->readdir_line +
- sshc->readdir_currLen,
- sshc->readdir_totalLen -
- sshc->readdir_currLen,
- " -> %s",
- sshc->readdir_filename);
state(conn, SSH_SFTP_READDIR_BOTTOM);
break;
case SSH_SFTP_READDIR_BOTTOM:
- sshc->readdir_currLen += msnprintf(sshc->readdir_line +
- sshc->readdir_currLen,
- sshc->readdir_totalLen -
- sshc->readdir_currLen, "\n");
- result = Curl_client_write(conn, CLIENTWRITE_BODY,
- sshc->readdir_line,
- sshc->readdir_currLen);
+ result = Curl_dyn_addn(&sshc->readdir, "\n", 1);
+ if(!result)
+ result = Curl_client_write(conn, CLIENTWRITE_BODY,
+ Curl_dyn_ptr(&sshc->readdir),
+ Curl_dyn_len(&sshc->readdir));
if(!result) {
/* output debug output if that is requested */
if(data->set.verbose) {
- Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_line,
- sshc->readdir_currLen);
+ Curl_debug(data, CURLINFO_DATA_IN,
+ Curl_dyn_ptr(&sshc->readdir),
+ Curl_dyn_len(&sshc->readdir));
}
- data->req.bytecount += sshc->readdir_currLen;
+ data->req.bytecount += Curl_dyn_len(&sshc->readdir);
}
- Curl_safefree(sshc->readdir_line);
if(result) {
+ Curl_dyn_free(&sshc->readdir);
state(conn, SSH_STOP);
}
- else
+ else {
+ Curl_dyn_reset(&sshc->readdir);
state(conn, SSH_SFTP_READDIR);
+ }
break;
case SSH_SFTP_READDIR_DONE:
@@ -2109,11 +2301,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
rc = LIBSSH2_ERROR_EAGAIN;
break;
}
- err = sftp_libssh2_last_error(sshc->sftp_session);
+ sftperr = libssh2_sftp_last_error(sshc->sftp_session);
failf(data, "Could not open remote file for reading: %s",
- sftp_libssh2_strerror(err));
+ sftp_libssh2_strerror(sftperr));
state(conn, SSH_SFTP_CLOSE);
- result = sftp_libssh2_error_to_CURLE(err);
+ result = sftp_libssh2_error_to_CURLE(sftperr);
sshc->actualcode = result?result:CURLE_SSH;
break;
}
@@ -2217,7 +2409,6 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
return CURLE_BAD_DOWNLOAD_RESUME;
}
}
- /* Does a completed file need to be seeked and started or closed ? */
/* Now store the number of bytes we are expected to download */
data->req.size = attrs.filesize - data->state.resume_from;
data->req.maxdownload = attrs.filesize - data->state.resume_from;
@@ -2379,7 +2570,9 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
/* upload data */
- Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);
+ data->req.size = data->state.infilesize;
+ Curl_pgrsSetUploadSize(data, data->state.infilesize);
+ Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
/* not set by Curl_setup_transfer to preserve keepon bits */
conn->sockfd = conn->writesockfd;
@@ -2449,7 +2642,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* download data */
bytecount = (curl_off_t)sb.st_size;
- data->req.maxdownload = (curl_off_t)sb.st_size;
+ data->req.maxdownload = (curl_off_t)sb.st_size;
Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);
/* not set by Curl_setup_transfer to preserve keepon bits */
@@ -2656,7 +2849,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
Curl_safefree(sshc->readdir_filename);
Curl_safefree(sshc->readdir_longentry);
Curl_safefree(sshc->readdir_line);
- Curl_safefree(sshc->readdir_linkPath);
+ Curl_dyn_free(&sshc->readdir);
/* the code we are about to return */
result = sshc->actualcode;
@@ -2780,7 +2973,7 @@ static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
}
static CURLcode ssh_block_statemach(struct connectdata *conn,
- bool disconnect)
+ bool duringconnect)
{
struct ssh_conn *sshc = &conn->proto.sshc;
CURLcode result = CURLE_OK;
@@ -2795,19 +2988,17 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
if(result)
break;
- if(!disconnect) {
- if(Curl_pgrsUpdate(conn))
- return CURLE_ABORTED_BY_CALLBACK;
+ if(Curl_pgrsUpdate(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
- result = Curl_speedcheck(data, now);
- if(result)
- break;
+ result = Curl_speedcheck(data, now);
+ if(result)
+ break;
- left = Curl_timeleft(data, NULL, FALSE);
- if(left < 0) {
- failf(data, "Operation timed out");
- return CURLE_OPERATION_TIMEDOUT;
- }
+ left = Curl_timeleft(data, NULL, duringconnect);
+ if(left < 0) {
+ failf(data, "Operation timed out");
+ return CURLE_OPERATION_TIMEDOUT;
}
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
@@ -2822,7 +3013,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
fd_write = sock;
/* wait for the socket to become ready */
(void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
- left>1000?1000:(time_t)left);
+ left>1000?1000:left);
}
#endif
@@ -2848,6 +3039,42 @@ static CURLcode ssh_setup_connection(struct connectdata *conn)
static Curl_recv scp_recv, sftp_recv;
static Curl_send scp_send, sftp_send;
+static ssize_t ssh_tls_recv(libssh2_socket_t sock, void *buffer,
+ size_t length, int flags, void **abstract)
+{
+ struct connectdata *conn = (struct connectdata *)*abstract;
+ ssize_t nread;
+ CURLcode result;
+ (void)flags;
+
+ result = Curl_read(conn, sock, buffer, length, &nread);
+ if(result == CURLE_AGAIN)
+ return -EAGAIN; /* magic return code for libssh2 */
+ else if(result)
+ return -1; /* generic error */
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_DATA_IN, (char *)buffer, (size_t)nread);
+ return nread;
+}
+
+static ssize_t ssh_tls_send(libssh2_socket_t sock, const void *buffer,
+ size_t length, int flags, void **abstract)
+{
+ struct connectdata *conn = (struct connectdata *)*abstract;
+ ssize_t nwrite;
+ CURLcode result;
+ (void)flags;
+
+ result = Curl_write(conn, sock, buffer, length, &nwrite);
+ if(result == CURLE_AGAIN)
+ return -EAGAIN; /* magic return code for libssh2 */
+ else if(result)
+ return -1; /* error */
+ if(conn->data->set.verbose)
+ Curl_debug(conn->data, CURLINFO_DATA_OUT, (char *)buffer, (size_t)nwrite);
+ return nwrite;
+}
+
/*
* Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to
* do protocol-specific actions at connect-time.
@@ -2869,14 +3096,6 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
function to make the re-use checks properly be able to check this bit. */
connkeep(conn, "SSH default");
- if(conn->handler->protocol & CURLPROTO_SCP) {
- conn->recv[FIRSTSOCKET] = scp_recv;
- conn->send[FIRSTSOCKET] = scp_send;
- }
- else {
- conn->recv[FIRSTSOCKET] = sftp_recv;
- conn->send[FIRSTSOCKET] = sftp_send;
- }
ssh = &conn->proto.sshc;
#ifdef CURL_LIBSSH2_DEBUG
@@ -2897,6 +3116,53 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
return CURLE_FAILED_INIT;
}
+ if(conn->http_proxy.proxytype == CURLPROXY_HTTPS) {
+ /*
+ * This crazy union dance is here to avoid assigning a void pointer a
+ * function pointer as it is invalid C. The problem is of course that
+ * libssh2 has such an API...
+ */
+ union receive {
+ void *recvp;
+ ssize_t (*recvptr)(libssh2_socket_t, void *, size_t, int, void **);
+ };
+ union transfer {
+ void *sendp;
+ ssize_t (*sendptr)(libssh2_socket_t, const void *, size_t, int, void **);
+ };
+ union receive sshrecv;
+ union transfer sshsend;
+
+ sshrecv.recvptr = ssh_tls_recv;
+ sshsend.sendptr = ssh_tls_send;
+
+ infof(data, "Uses HTTPS proxy!\n");
+ /*
+ Setup libssh2 callbacks to make it read/write TLS from the socket.
+
+ ssize_t
+ recvcb(libssh2_socket_t sock, void *buffer, size_t length,
+ int flags, void **abstract);
+
+ ssize_t
+ sendcb(libssh2_socket_t sock, const void *buffer, size_t length,
+ int flags, void **abstract);
+
+ */
+ libssh2_session_callback_set(ssh->ssh_session,
+ LIBSSH2_CALLBACK_RECV, sshrecv.recvp);
+ libssh2_session_callback_set(ssh->ssh_session,
+ LIBSSH2_CALLBACK_SEND, sshsend.sendp);
+ }
+ else if(conn->handler->protocol & CURLPROTO_SCP) {
+ conn->recv[FIRSTSOCKET] = scp_recv;
+ conn->send[FIRSTSOCKET] = scp_send;
+ }
+ else {
+ conn->recv[FIRSTSOCKET] = sftp_recv;
+ conn->send[FIRSTSOCKET] = sftp_send;
+ }
+
if(data->set.ssh_compression) {
#if LIBSSH2_VERSION_NUM >= 0x010208
if(libssh2_session_flag(ssh->ssh_session, LIBSSH2_FLAG_COMPRESS, 1) < 0)
@@ -3030,7 +3296,7 @@ static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection)
state(conn, SSH_SESSION_DISCONNECT);
- result = ssh_block_statemach(conn, TRUE);
+ result = ssh_block_statemach(conn, FALSE);
}
return result;
@@ -3179,7 +3445,7 @@ static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
if(conn->proto.sshc.ssh_session) {
/* only if there's a session still around to use! */
state(conn, SSH_SFTP_SHUTDOWN);
- result = ssh_block_statemach(conn, TRUE);
+ result = ssh_block_statemach(conn, FALSE);
}
DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));
@@ -3254,7 +3520,7 @@ static ssize_t sftp_recv(struct connectdata *conn, int sockindex,
return nread;
}
-static const char *sftp_libssh2_strerror(int err)
+static const char *sftp_libssh2_strerror(unsigned long err)
{
switch(err) {
case LIBSSH2_FX_NO_SUCH_FILE:
diff --git a/lib/ssh.h b/lib/vssh/ssh.h
index 3213c5a52..9e49993e9 100644
--- a/lib/ssh.h
+++ b/lib/vssh/ssh.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,7 +30,10 @@
#elif defined(HAVE_LIBSSH_LIBSSH_H)
#include <libssh/libssh.h>
#include <libssh/sftp.h>
-#endif /* HAVE_LIBSSH2_H */
+#elif defined(USE_WOLFSSH)
+#include <wolfssh/ssh.h>
+#include <wolfssh/wolfsftp.h>
+#endif
/****************************************************************************
* SSH unique setup
@@ -131,9 +134,7 @@ struct ssh_conn {
quote command fails) */
char *homedir; /* when doing SFTP we figure out home dir in the
connect phase */
- size_t readdir_len, readdir_totalLen, readdir_currLen;
char *readdir_line;
- char *readdir_linkPath;
/* end of READDIR stuff */
int secondCreateDirs; /* counter use by the code to see if the
@@ -144,6 +145,8 @@ struct ssh_conn {
int orig_waitfor; /* default READ/WRITE bits wait for */
#if defined(USE_LIBSSH)
+ char *readdir_linkPath;
+ size_t readdir_len, readdir_totalLen, readdir_currLen;
/* our variables */
unsigned kbd_state; /* 0 or 1 */
ssh_key privkey;
@@ -165,6 +168,8 @@ struct ssh_conn {
const char *readdir_longentry;
char *readdir_tmp;
#elif defined(USE_LIBSSH2)
+ struct dynbuf readdir_link;
+ struct dynbuf readdir;
char *readdir_filename;
char *readdir_longentry;
@@ -188,6 +193,12 @@ struct ssh_conn {
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
LIBSSH2_KNOWNHOSTS *kh;
#endif
+#elif defined(USE_WOLFSSH)
+ WOLFSSH *ssh_session;
+ WOLFSSH_CTX *ctx;
+ word32 handleSz;
+ byte handle[WOLFSSH_MAX_HANDLE];
+ curl_off_t offset;
#endif /* USE_LIBSSH */
};
@@ -195,9 +206,6 @@ struct ssh_conn {
#define CURL_LIBSSH_VERSION ssh_version(0)
-extern const struct Curl_handler Curl_handler_scp;
-extern const struct Curl_handler Curl_handler_sftp;
-
#elif defined(USE_LIBSSH2)
/* Feature detection based on version numbers to better work with
@@ -237,11 +245,13 @@ extern const struct Curl_handler Curl_handler_sftp;
#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
#endif
-extern const struct Curl_handler Curl_handler_scp;
-extern const struct Curl_handler Curl_handler_sftp;
#endif /* USE_LIBSSH2 */
#ifdef USE_SSH
+
+extern const struct Curl_handler Curl_handler_scp;
+extern const struct Curl_handler Curl_handler_sftp;
+
/* generic SSH backend functions */
CURLcode Curl_ssh_init(void);
void Curl_ssh_cleanup(void);
diff --git a/lib/vssh/wolfssh.c b/lib/vssh/wolfssh.c
new file mode 100644
index 000000000..dcbbab6c3
--- /dev/null
+++ b/lib/vssh/wolfssh.c
@@ -0,0 +1,1156 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl_setup.h"
+
+#ifdef USE_WOLFSSH
+
+#include <limits.h>
+
+#include <wolfssh/ssh.h>
+#include <wolfssh/wolfsftp.h>
+#include "urldata.h"
+#include "connect.h"
+#include "sendf.h"
+#include "progress.h"
+#include "curl_path.h"
+#include "strtoofft.h"
+#include "transfer.h"
+#include "speedcheck.h"
+#include "select.h"
+#include "multiif.h"
+#include "warnless.h"
+
+/* The last 3 #include files should be in this order */
+#include "curl_printf.h"
+#include "curl_memory.h"
+#include "memdebug.h"
+
+static CURLcode wssh_connect(struct connectdata *conn, bool *done);
+static CURLcode wssh_multi_statemach(struct connectdata *conn, bool *done);
+static CURLcode wssh_do(struct connectdata *conn, bool *done);
+#if 0
+static CURLcode wscp_done(struct connectdata *conn,
+ CURLcode, bool premature);
+static CURLcode wscp_doing(struct connectdata *conn,
+ bool *dophase_done);
+static CURLcode wscp_disconnect(struct connectdata *conn,
+ bool dead_connection);
+#endif
+static CURLcode wsftp_done(struct connectdata *conn,
+ CURLcode, bool premature);
+static CURLcode wsftp_doing(struct connectdata *conn,
+ bool *dophase_done);
+static CURLcode wsftp_disconnect(struct connectdata *conn, bool dead);
+static int wssh_getsock(struct connectdata *conn,
+ curl_socket_t *sock);
+static int wssh_perform_getsock(const struct connectdata *conn,
+ curl_socket_t *sock);
+static CURLcode wssh_setup_connection(struct connectdata *conn);
+
+#if 0
+/*
+ * SCP protocol handler.
+ */
+
+const struct Curl_handler Curl_handler_scp = {
+ "SCP", /* scheme */
+ wssh_setup_connection, /* setup_connection */
+ wssh_do, /* do_it */
+ wscp_done, /* done */
+ ZERO_NULL, /* do_more */
+ wssh_connect, /* connect_it */
+ wssh_multi_statemach, /* connecting */
+ wscp_doing, /* doing */
+ wssh_getsock, /* proto_getsock */
+ wssh_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ wssh_perform_getsock, /* perform_getsock */
+ wscp_disconnect, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
+ PORT_SSH, /* defport */
+ CURLPROTO_SCP, /* protocol */
+ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
+ | PROTOPT_NOURLQUERY /* flags */
+};
+
+#endif
+
+/*
+ * SFTP protocol handler.
+ */
+
+const struct Curl_handler Curl_handler_sftp = {
+ "SFTP", /* scheme */
+ wssh_setup_connection, /* setup_connection */
+ wssh_do, /* do_it */
+ wsftp_done, /* done */
+ ZERO_NULL, /* do_more */
+ wssh_connect, /* connect_it */
+ wssh_multi_statemach, /* connecting */
+ wsftp_doing, /* doing */
+ wssh_getsock, /* proto_getsock */
+ wssh_getsock, /* doing_getsock */
+ ZERO_NULL, /* domore_getsock */
+ wssh_perform_getsock, /* perform_getsock */
+ wsftp_disconnect, /* disconnect */
+ ZERO_NULL, /* readwrite */
+ ZERO_NULL, /* connection_check */
+ PORT_SSH, /* defport */
+ CURLPROTO_SFTP, /* protocol */
+ PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
+ | PROTOPT_NOURLQUERY /* flags */
+};
+
+/*
+ * SSH State machine related code
+ */
+/* This is the ONLY way to change SSH state! */
+static void state(struct connectdata *conn, sshstate nowstate)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ /* for debug purposes */
+ static const char * const names[] = {
+ "SSH_STOP",
+ "SSH_INIT",
+ "SSH_S_STARTUP",
+ "SSH_HOSTKEY",
+ "SSH_AUTHLIST",
+ "SSH_AUTH_PKEY_INIT",
+ "SSH_AUTH_PKEY",
+ "SSH_AUTH_PASS_INIT",
+ "SSH_AUTH_PASS",
+ "SSH_AUTH_AGENT_INIT",
+ "SSH_AUTH_AGENT_LIST",
+ "SSH_AUTH_AGENT",
+ "SSH_AUTH_HOST_INIT",
+ "SSH_AUTH_HOST",
+ "SSH_AUTH_KEY_INIT",
+ "SSH_AUTH_KEY",
+ "SSH_AUTH_GSSAPI",
+ "SSH_AUTH_DONE",
+ "SSH_SFTP_INIT",
+ "SSH_SFTP_REALPATH",
+ "SSH_SFTP_QUOTE_INIT",
+ "SSH_SFTP_POSTQUOTE_INIT",
+ "SSH_SFTP_QUOTE",
+ "SSH_SFTP_NEXT_QUOTE",
+ "SSH_SFTP_QUOTE_STAT",
+ "SSH_SFTP_QUOTE_SETSTAT",
+ "SSH_SFTP_QUOTE_SYMLINK",
+ "SSH_SFTP_QUOTE_MKDIR",
+ "SSH_SFTP_QUOTE_RENAME",
+ "SSH_SFTP_QUOTE_RMDIR",
+ "SSH_SFTP_QUOTE_UNLINK",
+ "SSH_SFTP_QUOTE_STATVFS",
+ "SSH_SFTP_GETINFO",
+ "SSH_SFTP_FILETIME",
+ "SSH_SFTP_TRANS_INIT",
+ "SSH_SFTP_UPLOAD_INIT",
+ "SSH_SFTP_CREATE_DIRS_INIT",
+ "SSH_SFTP_CREATE_DIRS",
+ "SSH_SFTP_CREATE_DIRS_MKDIR",
+ "SSH_SFTP_READDIR_INIT",
+ "SSH_SFTP_READDIR",
+ "SSH_SFTP_READDIR_LINK",
+ "SSH_SFTP_READDIR_BOTTOM",
+ "SSH_SFTP_READDIR_DONE",
+ "SSH_SFTP_DOWNLOAD_INIT",
+ "SSH_SFTP_DOWNLOAD_STAT",
+ "SSH_SFTP_CLOSE",
+ "SSH_SFTP_SHUTDOWN",
+ "SSH_SCP_TRANS_INIT",
+ "SSH_SCP_UPLOAD_INIT",
+ "SSH_SCP_DOWNLOAD_INIT",
+ "SSH_SCP_DOWNLOAD",
+ "SSH_SCP_DONE",
+ "SSH_SCP_SEND_EOF",
+ "SSH_SCP_WAIT_EOF",
+ "SSH_SCP_WAIT_CLOSE",
+ "SSH_SCP_CHANNEL_FREE",
+ "SSH_SESSION_DISCONNECT",
+ "SSH_SESSION_FREE",
+ "QUIT"
+ };
+
+ /* a precaution to make sure the lists are in sync */
+ DEBUGASSERT(sizeof(names)/sizeof(names[0]) == SSH_LAST);
+
+ if(sshc->state != nowstate) {
+ infof(conn->data, "wolfssh %p state change from %s to %s\n",
+ (void *)sshc, names[sshc->state], names[nowstate]);
+ }
+#endif
+
+ sshc->state = nowstate;
+}
+
+static ssize_t wscp_send(struct connectdata *conn, int sockindex,
+ const void *mem, size_t len, CURLcode *err)
+{
+ ssize_t nwrite = 0;
+ (void)conn;
+ (void)sockindex; /* we only support SCP on the fixed known primary socket */
+ (void)mem;
+ (void)len;
+ (void)err;
+
+ return nwrite;
+}
+
+static ssize_t wscp_recv(struct connectdata *conn, int sockindex,
+ char *mem, size_t len, CURLcode *err)
+{
+ ssize_t nread = 0;
+ (void)conn;
+ (void)sockindex; /* we only support SCP on the fixed known primary socket */
+ (void)mem;
+ (void)len;
+ (void)err;
+
+ return nread;
+}
+
+/* return number of sent bytes */
+static ssize_t wsftp_send(struct connectdata *conn, int sockindex,
+ const void *mem, size_t len, CURLcode *err)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ word32 offset[2];
+ int rc;
+ (void)sockindex;
+
+ offset[0] = (word32)sshc->offset&0xFFFFFFFF;
+ offset[1] = (word32)(sshc->offset>>32)&0xFFFFFFFF;
+
+ rc = wolfSSH_SFTP_SendWritePacket(sshc->ssh_session, sshc->handle,
+ sshc->handleSz,
+ &offset[0],
+ (byte *)mem, (word32)len);
+
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ conn->waitfor = KEEP_RECV;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ conn->waitfor = KEEP_SEND;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+ if(rc < 0) {
+ failf(conn->data, "wolfSSH_SFTP_SendWritePacket returned %d\n", rc);
+ return -1;
+ }
+ DEBUGASSERT(rc == (int)len);
+ infof(conn->data, "sent %zd bytes SFTP from offset %zd\n",
+ len, sshc->offset);
+ sshc->offset += len;
+ return (ssize_t)rc;
+}
+
+/*
+ * Return number of received (decrypted) bytes
+ * or <0 on error
+ */
+static ssize_t wsftp_recv(struct connectdata *conn, int sockindex,
+ char *mem, size_t len, CURLcode *err)
+{
+ int rc;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ word32 offset[2];
+ (void)sockindex;
+
+ offset[0] = (word32)sshc->offset&0xFFFFFFFF;
+ offset[1] = (word32)(sshc->offset>>32)&0xFFFFFFFF;
+
+ rc = wolfSSH_SFTP_SendReadPacket(sshc->ssh_session, sshc->handle,
+ sshc->handleSz,
+ &offset[0],
+ (byte *)mem, (word32)len);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ conn->waitfor = KEEP_RECV;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ conn->waitfor = KEEP_SEND;
+ *err = CURLE_AGAIN;
+ return -1;
+ }
+
+ DEBUGASSERT(rc <= (int)len);
+
+ if(rc < 0) {
+ failf(conn->data, "wolfSSH_SFTP_SendReadPacket returned %d\n", rc);
+ return -1;
+ }
+ sshc->offset += len;
+
+ return (ssize_t)rc;
+}
+
+/*
+ * SSH setup and connection
+ */
+static CURLcode wssh_setup_connection(struct connectdata *conn)
+{
+ struct SSHPROTO *ssh;
+
+ conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO));
+ if(!ssh)
+ return CURLE_OUT_OF_MEMORY;
+
+ return CURLE_OK;
+}
+
+static Curl_recv wscp_recv, wsftp_recv;
+static Curl_send wscp_send, wsftp_send;
+
+static int userauth(byte authtype,
+ WS_UserAuthData* authdata,
+ void *ctx)
+{
+ struct connectdata *conn = ctx;
+ DEBUGF(infof(conn->data, "wolfssh callback: type %s\n",
+ authtype == WOLFSSH_USERAUTH_PASSWORD ? "PASSWORD" :
+ "PUBLICCKEY"));
+ if(authtype == WOLFSSH_USERAUTH_PASSWORD) {
+ authdata->sf.password.password = (byte *)conn->passwd;
+ authdata->sf.password.passwordSz = (word32) strlen(conn->passwd);
+ }
+
+ return 0;
+}
+
+static CURLcode wssh_connect(struct connectdata *conn, bool *done)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssh_conn *sshc;
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
+ int rc;
+
+ /* initialize per-handle data if not already */
+ if(!data->req.protop)
+ wssh_setup_connection(conn);
+
+ /* We default to persistent connections. We set this already in this connect
+ function to make the re-use checks properly be able to check this bit. */
+ connkeep(conn, "SSH default");
+
+ if(conn->handler->protocol & CURLPROTO_SCP) {
+ conn->recv[FIRSTSOCKET] = wscp_recv;
+ conn->send[FIRSTSOCKET] = wscp_send;
+ }
+ else {
+ conn->recv[FIRSTSOCKET] = wsftp_recv;
+ conn->send[FIRSTSOCKET] = wsftp_send;
+ }
+ sshc = &conn->proto.sshc;
+ sshc->ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL);
+ if(!sshc->ctx) {
+ failf(data, "No wolfSSH context");
+ goto error;
+ }
+
+ sshc->ssh_session = wolfSSH_new(sshc->ctx);
+ if(sshc->ssh_session == NULL) {
+ failf(data, "No wolfSSH session");
+ goto error;
+ }
+
+ rc = wolfSSH_SetUsername(sshc->ssh_session, conn->user);
+ if(rc != WS_SUCCESS) {
+ failf(data, "wolfSSH failed to set user name");
+ goto error;
+ }
+
+ /* set callback for authentication */
+ wolfSSH_SetUserAuth(sshc->ctx, userauth);
+ wolfSSH_SetUserAuthCtx(sshc->ssh_session, conn);
+
+ rc = wolfSSH_set_fd(sshc->ssh_session, (int)sock);
+ if(rc) {
+ failf(data, "wolfSSH failed to set socket");
+ goto error;
+ }
+
+#if 0
+ wolfSSH_Debugging_ON();
+#endif
+
+ *done = TRUE;
+ if(conn->handler->protocol & CURLPROTO_SCP)
+ state(conn, SSH_INIT);
+ else
+ state(conn, SSH_SFTP_INIT);
+
+ return wssh_multi_statemach(conn, done);
+ error:
+ wolfSSH_free(sshc->ssh_session);
+ wolfSSH_CTX_free(sshc->ctx);
+ return CURLE_FAILED_INIT;
+}
+
+/*
+ * wssh_statemach_act() runs the SSH state machine as far as it can without
+ * blocking and without reaching the end. The data the pointer 'block' points
+ * to will be set to TRUE if the wolfssh function returns EAGAIN meaning it
+ * wants to be called again when the socket is ready
+ */
+
+static CURLcode wssh_statemach_act(struct connectdata *conn, bool *block)
+{
+ CURLcode result = CURLE_OK;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ struct Curl_easy *data = conn->data;
+ struct SSHPROTO *sftp_scp = data->req.protop;
+ WS_SFTPNAME *name;
+ int rc = 0;
+ *block = FALSE; /* we're not blocking by default */
+
+ do {
+ switch(sshc->state) {
+ case SSH_INIT:
+ state(conn, SSH_S_STARTUP);
+ /* FALLTHROUGH */
+ case SSH_S_STARTUP:
+ rc = wolfSSH_connect(sshc->ssh_session);
+ if(rc != WS_SUCCESS)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc != WS_SUCCESS) {
+ state(conn, SSH_STOP);
+ return CURLE_SSH;
+ }
+ infof(data, "wolfssh connected!\n");
+ state(conn, SSH_STOP);
+ break;
+ case SSH_STOP:
+ break;
+
+ case SSH_SFTP_INIT:
+ rc = wolfSSH_SFTP_connect(sshc->ssh_session);
+ if(rc != WS_SUCCESS)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh SFTP connected!\n");
+ state(conn, SSH_SFTP_REALPATH);
+ }
+ else {
+ failf(data, "wolfssh SFTP connect error %d", rc);
+ return CURLE_SSH;
+ }
+ break;
+ case SSH_SFTP_REALPATH:
+ name = wolfSSH_SFTP_RealPath(sshc->ssh_session, (char *)".");
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(name && (rc == WS_SUCCESS)) {
+ sshc->homedir = malloc(name->fSz + 1);
+ if(!sshc->homedir) {
+ sshc->actualcode = CURLE_OUT_OF_MEMORY;
+ }
+ else {
+ memcpy(sshc->homedir, name->fName, name->fSz);
+ sshc->homedir[name->fSz] = 0;
+ infof(data, "wolfssh SFTP realpath succeeded!\n");
+ }
+ wolfSSH_SFTPNAME_list_free(name);
+ state(conn, SSH_STOP);
+ return CURLE_OK;
+ }
+ failf(data, "wolfssh SFTP realpath %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_QUOTE_INIT:
+ result = Curl_getworkingpath(conn, sshc->homedir, &sftp_scp->path);
+ if(result) {
+ sshc->actualcode = result;
+ state(conn, SSH_STOP);
+ break;
+ }
+
+ if(data->set.quote) {
+ infof(data, "Sending quote commands\n");
+ sshc->quote_item = data->set.quote;
+ state(conn, SSH_SFTP_QUOTE);
+ }
+ else {
+ state(conn, SSH_SFTP_GETINFO);
+ }
+ break;
+ case SSH_SFTP_GETINFO:
+ if(data->set.get_filetime) {
+ state(conn, SSH_SFTP_FILETIME);
+ }
+ else {
+ state(conn, SSH_SFTP_TRANS_INIT);
+ }
+ break;
+ case SSH_SFTP_TRANS_INIT:
+ if(data->set.upload)
+ state(conn, SSH_SFTP_UPLOAD_INIT);
+ else {
+ if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/')
+ state(conn, SSH_SFTP_READDIR_INIT);
+ else
+ state(conn, SSH_SFTP_DOWNLOAD_INIT);
+ }
+ break;
+ case SSH_SFTP_UPLOAD_INIT: {
+ word32 flags;
+ WS_SFTP_FILEATRB createattrs;
+ if(data->state.resume_from) {
+ WS_SFTP_FILEATRB attrs;
+ if(data->state.resume_from < 0) {
+ rc = wolfSSH_SFTP_STAT(sshc->ssh_session, sftp_scp->path,
+ &attrs);
+ if(rc != WS_SUCCESS)
+ break;
+
+ if(rc) {
+ data->state.resume_from = 0;
+ }
+ else {
+ curl_off_t size = ((curl_off_t)attrs.sz[1] << 32) | attrs.sz[0];
+ if(size < 0) {
+ failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
+ return CURLE_BAD_DOWNLOAD_RESUME;
+ }
+ data->state.resume_from = size;
+ }
+ }
+ }
+
+ if(data->set.ftp_append)
+ /* Try to open for append, but create if nonexisting */
+ flags = WOLFSSH_FXF_WRITE|WOLFSSH_FXF_CREAT|WOLFSSH_FXF_APPEND;
+ else if(data->state.resume_from > 0)
+ /* If we have restart position then open for append */
+ flags = WOLFSSH_FXF_WRITE|WOLFSSH_FXF_APPEND;
+ else
+ /* Clear file before writing (normal behaviour) */
+ flags = WOLFSSH_FXF_WRITE|WOLFSSH_FXF_CREAT|WOLFSSH_FXF_TRUNC;
+
+ memset(&createattrs, 0, sizeof(createattrs));
+ createattrs.per = (word32)data->set.new_file_perms;
+ sshc->handleSz = sizeof(sshc->handle);
+ rc = wolfSSH_SFTP_Open(sshc->ssh_session, sftp_scp->path,
+ flags, &createattrs,
+ sshc->handle, &sshc->handleSz);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh SFTP open succeeded!\n");
+ }
+ else {
+ failf(data, "wolfssh SFTP upload open failed: %d", rc);
+ return CURLE_SSH;
+ }
+ state(conn, SSH_SFTP_DOWNLOAD_STAT);
+
+ /* If we have a restart point then we need to seek to the correct
+ position. */
+ if(data->state.resume_from > 0) {
+ /* Let's read off the proper amount of bytes from the input. */
+ int seekerr = CURL_SEEKFUNC_OK;
+ if(conn->seek_func) {
+ Curl_set_in_callback(data, true);
+ seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
+ SEEK_SET);
+ Curl_set_in_callback(data, false);
+ }
+
+ if(seekerr != CURL_SEEKFUNC_OK) {
+ curl_off_t passed = 0;
+
+ if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
+ failf(data, "Could not seek stream");
+ return CURLE_FTP_COULDNT_USE_REST;
+ }
+ /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
+ do {
+ size_t readthisamountnow =
+ (data->state.resume_from - passed > data->set.buffer_size) ?
+ (size_t)data->set.buffer_size :
+ curlx_sotouz(data->state.resume_from - passed);
+
+ size_t actuallyread;
+ Curl_set_in_callback(data, true);
+ actuallyread = data->state.fread_func(data->state.buffer, 1,
+ readthisamountnow,
+ data->state.in);
+ Curl_set_in_callback(data, false);
+
+ passed += actuallyread;
+ if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
+ /* this checks for greater-than only to make sure that the
+ CURL_READFUNC_ABORT return code still aborts */
+ failf(data, "Failed to read data");
+ return CURLE_FTP_COULDNT_USE_REST;
+ }
+ } while(passed < data->state.resume_from);
+ }
+
+ /* now, decrease the size of the read */
+ if(data->state.infilesize > 0) {
+ data->state.infilesize -= data->state.resume_from;
+ data->req.size = data->state.infilesize;
+ Curl_pgrsSetUploadSize(data, data->state.infilesize);
+ }
+
+ sshc->offset += data->state.resume_from;
+ }
+ if(data->state.infilesize > 0) {
+ data->req.size = data->state.infilesize;
+ Curl_pgrsSetUploadSize(data, data->state.infilesize);
+ }
+ /* upload data */
+ Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
+
+ /* not set by Curl_setup_transfer to preserve keepon bits */
+ conn->sockfd = conn->writesockfd;
+
+ if(result) {
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = result;
+ }
+ else {
+ /* store this original bitmask setup to use later on if we can't
+ figure out a "real" bitmask */
+ sshc->orig_waitfor = data->req.keepon;
+
+ /* we want to use the _sending_ function even when the socket turns
+ out readable as the underlying libssh2 sftp send function will deal
+ with both accordingly */
+ conn->cselect_bits = CURL_CSELECT_OUT;
+
+ /* since we don't really wait for anything at this point, we want the
+ state machine to move on as soon as possible so we set a very short
+ timeout here */
+ Curl_expire(data, 0, EXPIRE_RUN_NOW);
+
+ state(conn, SSH_STOP);
+ }
+ break;
+ }
+ case SSH_SFTP_DOWNLOAD_INIT:
+ sshc->handleSz = sizeof(sshc->handle);
+ rc = wolfSSH_SFTP_Open(sshc->ssh_session, sftp_scp->path,
+ WOLFSSH_FXF_READ, NULL,
+ sshc->handle, &sshc->handleSz);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh SFTP open succeeded!\n");
+ state(conn, SSH_SFTP_DOWNLOAD_STAT);
+ return CURLE_OK;
+ }
+
+ failf(data, "wolfssh SFTP open failed: %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_DOWNLOAD_STAT: {
+ WS_SFTP_FILEATRB attrs;
+ curl_off_t size;
+
+ rc = wolfSSH_SFTP_STAT(sshc->ssh_session, sftp_scp->path, &attrs);
+ if(rc == WS_FATAL_ERROR)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ infof(data, "wolfssh STAT succeeded!\n");
+ }
+ else {
+ failf(data, "wolfssh SFTP open failed: %d", rc);
+ data->req.size = -1;
+ data->req.maxdownload = -1;
+ Curl_pgrsSetDownloadSize(data, -1);
+ return CURLE_SSH;
+ }
+
+ size = ((curl_off_t)attrs.sz[1] <<32) | attrs.sz[0];
+
+ data->req.size = size;
+ data->req.maxdownload = size;
+ Curl_pgrsSetDownloadSize(data, size);
+
+ infof(data, "SFTP download %" CURL_FORMAT_CURL_OFF_T " bytes\n", size);
+
+ /* We cannot seek with wolfSSH so resuming and range requests are not
+ possible */
+ if(conn->data->state.use_range || data->state.resume_from) {
+ infof(data, "wolfSSH cannot do range/seek on SFTP\n");
+ return CURLE_BAD_DOWNLOAD_RESUME;
+ }
+
+ /* Setup the actual download */
+ if(data->req.size == 0) {
+ /* no data to transfer */
+ Curl_setup_transfer(data, -1, -1, FALSE, -1);
+ infof(data, "File already completely downloaded\n");
+ state(conn, SSH_STOP);
+ break;
+ }
+ Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
+
+ /* not set by Curl_setup_transfer to preserve keepon bits */
+ conn->writesockfd = conn->sockfd;
+
+ /* we want to use the _receiving_ function even when the socket turns
+ out writableable as the underlying libssh2 recv function will deal
+ with both accordingly */
+ conn->cselect_bits = CURL_CSELECT_IN;
+
+ if(result) {
+ /* this should never occur; the close state should be entered
+ at the time the error occurs */
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = result;
+ }
+ else {
+ state(conn, SSH_STOP);
+ }
+ break;
+ }
+ case SSH_SFTP_CLOSE:
+ if(sshc->handleSz)
+ rc = wolfSSH_SFTP_Close(sshc->ssh_session, sshc->handle,
+ sshc->handleSz);
+ else
+ rc = WS_SUCCESS; /* directory listing */
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(rc == WS_SUCCESS) {
+ state(conn, SSH_STOP);
+ return CURLE_OK;
+ }
+
+ failf(data, "wolfssh SFTP CLOSE failed: %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_READDIR_INIT:
+ Curl_pgrsSetDownloadSize(data, -1);
+ if(data->set.opt_no_body) {
+ state(conn, SSH_STOP);
+ break;
+ }
+ state(conn, SSH_SFTP_READDIR);
+ /* FALLTHROUGH */
+ case SSH_SFTP_READDIR:
+ name = wolfSSH_SFTP_LS(sshc->ssh_session, sftp_scp->path);
+ if(!name)
+ rc = wolfSSH_get_error(sshc->ssh_session);
+ else
+ rc = WS_SUCCESS;
+
+ if(rc == WS_WANT_READ) {
+ *block = TRUE;
+ conn->waitfor = KEEP_RECV;
+ return CURLE_OK;
+ }
+ else if(rc == WS_WANT_WRITE) {
+ *block = TRUE;
+ conn->waitfor = KEEP_SEND;
+ return CURLE_OK;
+ }
+ else if(name && (rc == WS_SUCCESS)) {
+ WS_SFTPNAME *origname = name;
+ result = CURLE_OK;
+ while(name) {
+ char *line = aprintf("%s\n",
+ data->set.ftp_list_only ?
+ name->fName : name->lName);
+ if(line == NULL) {
+ state(conn, SSH_SFTP_CLOSE);
+ sshc->actualcode = CURLE_OUT_OF_MEMORY;
+ break;
+ }
+ result = Curl_client_write(conn, CLIENTWRITE_BODY,
+ line, strlen(line));
+ free(line);
+ if(result) {
+ sshc->actualcode = result;
+ break;
+ }
+ name = name->next;
+ }
+ wolfSSH_SFTPNAME_list_free(origname);
+ state(conn, SSH_STOP);
+ return result;
+ }
+ failf(data, "wolfssh SFTP ls failed: %d", rc);
+ return CURLE_SSH;
+
+ case SSH_SFTP_SHUTDOWN:
+ Curl_safefree(sshc->homedir);
+ wolfSSH_free(sshc->ssh_session);
+ wolfSSH_CTX_free(sshc->ctx);
+ state(conn, SSH_STOP);
+ return CURLE_OK;
+ default:
+ break;
+ }
+ } while(!rc && (sshc->state != SSH_STOP));
+ return result;
+}
+
+/* called repeatedly until done from multi.c */
+static CURLcode wssh_multi_statemach(struct connectdata *conn, bool *done)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ CURLcode result = CURLE_OK;
+ bool block; /* we store the status and use that to provide a ssh_getsock()
+ implementation */
+ do {
+ result = wssh_statemach_act(conn, &block);
+ *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
+ /* if there's no error, it isn't done and it didn't EWOULDBLOCK, then
+ try again */
+ if(*done) {
+ DEBUGF(infof(conn->data, "wssh_statemach_act says DONE\n"));
+ }
+ } while(!result && !*done && !block);
+
+ return result;
+}
+
+static
+CURLcode wscp_perform(struct connectdata *conn,
+ bool *connected,
+ bool *dophase_done)
+{
+ (void)conn;
+ (void)connected;
+ (void)dophase_done;
+ return CURLE_OK;
+}
+
+static
+CURLcode wsftp_perform(struct connectdata *conn,
+ bool *connected,
+ bool *dophase_done)
+{
+ CURLcode result = CURLE_OK;
+
+ DEBUGF(infof(conn->data, "DO phase starts\n"));
+
+ *dophase_done = FALSE; /* not done yet */
+
+ /* start the first command in the DO phase */
+ state(conn, SSH_SFTP_QUOTE_INIT);
+
+ /* run the state-machine */
+ result = wssh_multi_statemach(conn, dophase_done);
+
+ *connected = conn->bits.tcpconnect[FIRSTSOCKET];
+
+ if(*dophase_done) {
+ DEBUGF(infof(conn->data, "DO phase is complete\n"));
+ }
+
+ return result;
+}
+
+/*
+ * The DO function is generic for both protocols.
+ */
+static CURLcode wssh_do(struct connectdata *conn, bool *done)
+{
+ CURLcode result;
+ bool connected = 0;
+ struct Curl_easy *data = conn->data;
+ struct ssh_conn *sshc = &conn->proto.sshc;
+
+ *done = FALSE; /* default to false */
+ data->req.size = -1; /* make sure this is unknown at this point */
+ sshc->actualcode = CURLE_OK; /* reset error code */
+ sshc->secondCreateDirs = 0; /* reset the create dir attempt state
+ variable */
+
+ Curl_pgrsSetUploadCounter(data, 0);
+ Curl_pgrsSetDownloadCounter(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
+
+ if(conn->handler->protocol & CURLPROTO_SCP)
+ result = wscp_perform(conn, &connected, done);
+ else
+ result = wsftp_perform(conn, &connected, done);
+
+ return result;
+}
+
+static CURLcode wssh_block_statemach(struct connectdata *conn,
+ bool disconnect)
+{
+ struct ssh_conn *sshc = &conn->proto.sshc;
+ CURLcode result = CURLE_OK;
+ struct Curl_easy *data = conn->data;
+
+ while((sshc->state != SSH_STOP) && !result) {
+ bool block;
+ timediff_t left = 1000;
+ struct curltime now = Curl_now();
+
+ result = wssh_statemach_act(conn, &block);
+ if(result)
+ break;
+
+ if(!disconnect) {
+ if(Curl_pgrsUpdate(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
+ result = Curl_speedcheck(data, now);
+ if(result)
+ break;
+
+ left = Curl_timeleft(data, NULL, FALSE);
+ if(left < 0) {
+ failf(data, "Operation timed out");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+ }
+
+ if(!result) {
+ int dir = conn->waitfor;
+ curl_socket_t sock = conn->sock[FIRSTSOCKET];
+ curl_socket_t fd_read = CURL_SOCKET_BAD;
+ curl_socket_t fd_write = CURL_SOCKET_BAD;
+ if(dir == KEEP_RECV)
+ fd_read = sock;
+ else if(dir == KEEP_SEND)
+ fd_write = sock;
+
+ /* wait for the socket to become ready */
+ (void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
+ left>1000?1000:left); /* ignore result */
+ }
+ }
+
+ return result;
+}
+
+/* generic done function for both SCP and SFTP called from their specific
+ done functions */
+static CURLcode wssh_done(struct connectdata *conn, CURLcode status)
+{
+ CURLcode result = CURLE_OK;
+ struct SSHPROTO *sftp_scp = conn->data->req.protop;
+
+ if(!status) {
+ /* run the state-machine */
+ result = wssh_block_statemach(conn, FALSE);
+ }
+ else
+ result = status;
+
+ if(sftp_scp)
+ Curl_safefree(sftp_scp->path);
+ if(Curl_pgrsDone(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
+ conn->data->req.keepon = 0; /* clear all bits */
+ return result;
+}
+
+#if 0
+static CURLcode wscp_done(struct connectdata *conn,
+ CURLcode code, bool premature)
+{
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)code;
+ (void)premature;
+
+ return result;
+}
+
+static CURLcode wscp_doing(struct connectdata *conn,
+ bool *dophase_done)
+{
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)dophase_done;
+
+ return result;
+}
+
+static CURLcode wscp_disconnect(struct connectdata *conn, bool dead_connection)
+{
+ CURLcode result = CURLE_OK;
+ (void)conn;
+ (void)dead_connection;
+
+ return result;
+}
+#endif
+
+static CURLcode wsftp_done(struct connectdata *conn,
+ CURLcode code, bool premature)
+{
+ (void)premature;
+ state(conn, SSH_SFTP_CLOSE);
+
+ return wssh_done(conn, code);
+}
+
+static CURLcode wsftp_doing(struct connectdata *conn,
+ bool *dophase_done)
+{
+ CURLcode result = wssh_multi_statemach(conn, dophase_done);
+
+ if(*dophase_done) {
+ DEBUGF(infof(conn->data, "DO phase is complete\n"));
+ }
+ return result;
+}
+
+static CURLcode wsftp_disconnect(struct connectdata *conn, bool dead)
+{
+ CURLcode result = CURLE_OK;
+ (void)dead;
+
+ DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n"));
+
+ if(conn->proto.sshc.ssh_session) {
+ /* only if there's a session still around to use! */
+ state(conn, SSH_SFTP_SHUTDOWN);
+ result = wssh_block_statemach(conn, TRUE);
+ }
+
+ DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));
+ return result;
+}
+
+static int wssh_getsock(struct connectdata *conn,
+ curl_socket_t *sock)
+{
+ return wssh_perform_getsock(conn, sock);
+}
+
+static int wssh_perform_getsock(const struct connectdata *conn,
+ curl_socket_t *sock)
+{
+ int bitmap = GETSOCK_BLANK;
+ int dir = conn->waitfor;
+ sock[0] = conn->sock[FIRSTSOCKET];
+
+ if(dir == KEEP_RECV)
+ bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);
+ else if(dir == KEEP_SEND)
+ bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);
+
+ return bitmap;
+}
+
+size_t Curl_ssh_version(char *buffer, size_t buflen)
+{
+ return msnprintf(buffer, buflen, "wolfssh/%s", LIBWOLFSSH_VERSION_STRING);
+}
+
+CURLcode Curl_ssh_init(void)
+{
+ if(WS_SUCCESS != wolfSSH_Init()) {
+ DEBUGF(fprintf(stderr, "Error: wolfSSH_Init failed\n"));
+ return CURLE_FAILED_INIT;
+ }
+
+ return CURLE_OK;
+}
+void Curl_ssh_cleanup(void)
+{
+}
+
+#endif /* USE_WOLFSSH */
diff --git a/lib/vtls/bearssl.c b/lib/vtls/bearssl.c
new file mode 100644
index 000000000..44e7406e8
--- /dev/null
+++ b/lib/vtls/bearssl.c
@@ -0,0 +1,877 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2019 - 2020, Michael Forney, <mforney@mforney.org>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curl_setup.h"
+
+#ifdef USE_BEARSSL
+
+#include <bearssl.h>
+
+#include "bearssl.h"
+#include "urldata.h"
+#include "sendf.h"
+#include "inet_pton.h"
+#include "vtls.h"
+#include "connect.h"
+#include "select.h"
+#include "multiif.h"
+#include "curl_printf.h"
+#include "curl_memory.h"
+
+struct x509_context {
+ const br_x509_class *vtable;
+ br_x509_minimal_context minimal;
+ bool verifyhost;
+ bool verifypeer;
+};
+
+struct ssl_backend_data {
+ br_ssl_client_context ctx;
+ struct x509_context x509;
+ unsigned char buf[BR_SSL_BUFSIZE_BIDI];
+ br_x509_trust_anchor *anchors;
+ size_t anchors_len;
+ const char *protocols[2];
+ /* SSL client context is active */
+ bool active;
+ /* size of pending write, yet to be flushed */
+ size_t pending_write;
+};
+
+struct cafile_parser {
+ CURLcode err;
+ bool in_cert;
+ br_x509_decoder_context xc;
+ /* array of trust anchors loaded from CAfile */
+ br_x509_trust_anchor *anchors;
+ size_t anchors_len;
+ /* buffer for DN data */
+ unsigned char dn[1024];
+ size_t dn_len;
+};
+
+static void append_dn(void *ctx, const void *buf, size_t len)
+{
+ struct cafile_parser *ca = ctx;
+
+ if(ca->err != CURLE_OK || !ca->in_cert)
+ return;
+ if(sizeof(ca->dn) - ca->dn_len < len) {
+ ca->err = CURLE_FAILED_INIT;
+ return;
+ }
+ memcpy(ca->dn + ca->dn_len, buf, len);
+ ca->dn_len += len;
+}
+
+static void x509_push(void *ctx, const void *buf, size_t len)
+{
+ struct cafile_parser *ca = ctx;
+
+ if(ca->in_cert)
+ br_x509_decoder_push(&ca->xc, buf, len);
+}
+
+static CURLcode load_cafile(const char *path, br_x509_trust_anchor **anchors,
+ size_t *anchors_len)
+{
+ struct cafile_parser ca;
+ br_pem_decoder_context pc;
+ br_x509_trust_anchor *ta;
+ size_t ta_size;
+ br_x509_trust_anchor *new_anchors;
+ size_t new_anchors_len;
+ br_x509_pkey *pkey;
+ FILE *fp;
+ unsigned char buf[BUFSIZ], *p;
+ const char *name;
+ size_t n, i, pushed;
+
+ fp = fopen(path, "rb");
+ if(!fp)
+ return CURLE_SSL_CACERT_BADFILE;
+
+ ca.err = CURLE_OK;
+ ca.in_cert = FALSE;
+ ca.anchors = NULL;
+ ca.anchors_len = 0;
+ br_pem_decoder_init(&pc);
+ br_pem_decoder_setdest(&pc, x509_push, &ca);
+ for(;;) {
+ n = fread(buf, 1, sizeof(buf), fp);
+ if(n == 0)
+ break;
+ p = buf;
+ while(n) {
+ pushed = br_pem_decoder_push(&pc, p, n);
+ if(ca.err)
+ goto fail;
+ p += pushed;
+ n -= pushed;
+
+ switch(br_pem_decoder_event(&pc)) {
+ case 0:
+ break;
+ case BR_PEM_BEGIN_OBJ:
+ name = br_pem_decoder_name(&pc);
+ if(strcmp(name, "CERTIFICATE") && strcmp(name, "X509 CERTIFICATE"))
+ break;
+ br_x509_decoder_init(&ca.xc, append_dn, &ca);
+ if(ca.anchors_len == SIZE_MAX / sizeof(ca.anchors[0])) {
+ ca.err = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ new_anchors_len = ca.anchors_len + 1;
+ new_anchors = realloc(ca.anchors,
+ new_anchors_len * sizeof(ca.anchors[0]));
+ if(!new_anchors) {
+ ca.err = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ ca.anchors = new_anchors;
+ ca.anchors_len = new_anchors_len;
+ ca.in_cert = TRUE;
+ ca.dn_len = 0;
+ ta = &ca.anchors[ca.anchors_len - 1];
+ ta->dn.data = NULL;
+ break;
+ case BR_PEM_END_OBJ:
+ if(!ca.in_cert)
+ break;
+ ca.in_cert = FALSE;
+ if(br_x509_decoder_last_error(&ca.xc)) {
+ ca.err = CURLE_SSL_CACERT_BADFILE;
+ goto fail;
+ }
+ ta->flags = 0;
+ if(br_x509_decoder_isCA(&ca.xc))
+ ta->flags |= BR_X509_TA_CA;
+ pkey = br_x509_decoder_get_pkey(&ca.xc);
+ if(!pkey) {
+ ca.err = CURLE_SSL_CACERT_BADFILE;
+ goto fail;
+ }
+ ta->pkey = *pkey;
+
+ /* calculate space needed for trust anchor data */
+ ta_size = ca.dn_len;
+ switch(pkey->key_type) {
+ case BR_KEYTYPE_RSA:
+ ta_size += pkey->key.rsa.nlen + pkey->key.rsa.elen;
+ break;
+ case BR_KEYTYPE_EC:
+ ta_size += pkey->key.ec.qlen;
+ break;
+ default:
+ ca.err = CURLE_FAILED_INIT;
+ goto fail;
+ }
+
+ /* fill in trust anchor DN and public key data */
+ ta->dn.data = malloc(ta_size);
+ if(!ta->dn.data) {
+ ca.err = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+ memcpy(ta->dn.data, ca.dn, ca.dn_len);
+ ta->dn.len = ca.dn_len;
+ switch(pkey->key_type) {
+ case BR_KEYTYPE_RSA:
+ ta->pkey.key.rsa.n = ta->dn.data + ta->dn.len;
+ memcpy(ta->pkey.key.rsa.n, pkey->key.rsa.n, pkey->key.rsa.nlen);
+ ta->pkey.key.rsa.e = ta->pkey.key.rsa.n + ta->pkey.key.rsa.nlen;
+ memcpy(ta->pkey.key.rsa.e, pkey->key.rsa.e, pkey->key.rsa.elen);
+ break;
+ case BR_KEYTYPE_EC:
+ ta->pkey.key.ec.q = ta->dn.data + ta->dn.len;
+ memcpy(ta->pkey.key.ec.q, pkey->key.ec.q, pkey->key.ec.qlen);
+ break;
+ }
+ break;
+ default:
+ ca.err = CURLE_SSL_CACERT_BADFILE;
+ goto fail;
+ }
+ }
+ }
+ if(ferror(fp))
+ ca.err = CURLE_READ_ERROR;
+
+fail:
+ fclose(fp);
+ if(ca.err == CURLE_OK) {
+ *anchors = ca.anchors;
+ *anchors_len = ca.anchors_len;
+ }
+ else {
+ for(i = 0; i < ca.anchors_len; ++i)
+ free(ca.anchors[i].dn.data);
+ free(ca.anchors);
+ }
+
+ return ca.err;
+}
+
+static void x509_start_chain(const br_x509_class **ctx,
+ const char *server_name)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ if(!x509->verifyhost)
+ server_name = NULL;
+ x509->minimal.vtable->start_chain(&x509->minimal.vtable, server_name);
+}
+
+static void x509_start_cert(const br_x509_class **ctx, uint32_t length)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ x509->minimal.vtable->start_cert(&x509->minimal.vtable, length);
+}
+
+static void x509_append(const br_x509_class **ctx, const unsigned char *buf,
+ size_t len)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ x509->minimal.vtable->append(&x509->minimal.vtable, buf, len);
+}
+
+static void x509_end_cert(const br_x509_class **ctx)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ x509->minimal.vtable->end_cert(&x509->minimal.vtable);
+}
+
+static unsigned x509_end_chain(const br_x509_class **ctx)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+ unsigned err;
+
+ err = x509->minimal.vtable->end_chain(&x509->minimal.vtable);
+ if(err && !x509->verifypeer) {
+ /* ignore any X.509 errors */
+ err = BR_ERR_OK;
+ }
+
+ return err;
+}
+
+static const br_x509_pkey *x509_get_pkey(const br_x509_class *const *ctx,
+ unsigned *usages)
+{
+ struct x509_context *x509 = (struct x509_context *)ctx;
+
+ return x509->minimal.vtable->get_pkey(&x509->minimal.vtable, usages);
+}
+
+static const br_x509_class x509_vtable = {
+ sizeof(struct x509_context),
+ x509_start_chain,
+ x509_start_cert,
+ x509_append,
+ x509_end_cert,
+ x509_end_chain,
+ x509_get_pkey
+};
+
+static CURLcode bearssl_connect_step1(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
+#ifndef CURL_DISABLE_PROXY
+ const char *hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+ conn->host.name;
+#else
+ const char *hostname = conn->host.name;
+#endif
+ const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
+ const bool verifyhost = SSL_CONN_CONFIG(verifyhost);
+ CURLcode ret;
+ unsigned version_min, version_max;
+#ifdef ENABLE_IPV6
+ struct in6_addr addr;
+#else
+ struct in_addr addr;
+#endif
+
+ switch(SSL_CONN_CONFIG(version)) {
+ case CURL_SSLVERSION_SSLv2:
+ failf(data, "BearSSL does not support SSLv2");
+ return CURLE_SSL_CONNECT_ERROR;
+ case CURL_SSLVERSION_SSLv3:
+ failf(data, "BearSSL does not support SSLv3");
+ return CURLE_SSL_CONNECT_ERROR;
+ case CURL_SSLVERSION_TLSv1_0:
+ version_min = BR_TLS10;
+ version_max = BR_TLS10;
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ version_min = BR_TLS11;
+ version_max = BR_TLS11;
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ version_min = BR_TLS12;
+ version_max = BR_TLS12;
+ break;
+ case CURL_SSLVERSION_DEFAULT:
+ case CURL_SSLVERSION_TLSv1:
+ version_min = BR_TLS10;
+ version_max = BR_TLS12;
+ break;
+ default:
+ failf(data, "BearSSL: unknown CURLOPT_SSLVERSION");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+
+ if(ssl_cafile) {
+ ret = load_cafile(ssl_cafile, &backend->anchors, &backend->anchors_len);
+ if(ret != CURLE_OK) {
+ if(verifypeer) {
+ failf(data, "error setting certificate verify locations:\n"
+ " CAfile: %s\n", ssl_cafile);
+ return ret;
+ }
+ infof(data, "error setting certificate verify locations,"
+ " continuing anyway:\n");
+ }
+ }
+
+ /* initialize SSL context */
+ br_ssl_client_init_full(&backend->ctx, &backend->x509.minimal,
+ backend->anchors, backend->anchors_len);
+ br_ssl_engine_set_versions(&backend->ctx.eng, version_min, version_max);
+ br_ssl_engine_set_buffer(&backend->ctx.eng, backend->buf,
+ sizeof(backend->buf), 1);
+
+ /* initialize X.509 context */
+ backend->x509.vtable = &x509_vtable;
+ backend->x509.verifypeer = verifypeer;
+ backend->x509.verifyhost = verifyhost;
+ br_ssl_engine_set_x509(&backend->ctx.eng, &backend->x509.vtable);
+
+ if(SSL_SET_OPTION(primary.sessionid)) {
+ void *session;
+
+ Curl_ssl_sessionid_lock(conn);
+ if(!Curl_ssl_getsessionid(conn, &session, NULL, sockindex)) {
+ br_ssl_engine_set_session_parameters(&backend->ctx.eng, session);
+ infof(data, "BearSSL: re-using session ID\n");
+ }
+ Curl_ssl_sessionid_unlock(conn);
+ }
+
+ if(conn->bits.tls_enable_alpn) {
+ int cur = 0;
+
+ /* NOTE: when adding more protocols here, increase the size of the
+ * protocols array in `struct ssl_backend_data`.
+ */
+
+#ifdef USE_NGHTTP2
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2
+#ifndef CURL_DISABLE_PROXY
+ && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)
+#endif
+ ) {
+ backend->protocols[cur++] = NGHTTP2_PROTO_VERSION_ID;
+ infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
+ }
+#endif
+
+ backend->protocols[cur++] = ALPN_HTTP_1_1;
+ infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
+
+ br_ssl_engine_set_protocol_names(&backend->ctx.eng,
+ backend->protocols, cur);
+ }
+
+ if((1 == Curl_inet_pton(AF_INET, hostname, &addr))
+#ifdef ENABLE_IPV6
+ || (1 == Curl_inet_pton(AF_INET6, hostname, &addr))
+#endif
+ ) {
+ if(verifyhost) {
+ failf(data, "BearSSL: "
+ "host verification of IP address is not supported");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ }
+ hostname = NULL;
+ }
+
+ if(!br_ssl_client_reset(&backend->ctx, hostname, 0))
+ return CURLE_FAILED_INIT;
+ backend->active = TRUE;
+
+ connssl->connecting_state = ssl_connect_2;
+
+ return CURLE_OK;
+}
+
+static CURLcode bearssl_run_until(struct connectdata *conn, int sockindex,
+ unsigned target)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ curl_socket_t sockfd = conn->sock[sockindex];
+ unsigned state;
+ unsigned char *buf;
+ size_t len;
+ ssize_t ret;
+ int err;
+
+ for(;;) {
+ state = br_ssl_engine_current_state(&backend->ctx.eng);
+ if(state & BR_SSL_CLOSED) {
+ err = br_ssl_engine_last_error(&backend->ctx.eng);
+ switch(err) {
+ case BR_ERR_OK:
+ /* TLS close notify */
+ if(connssl->state != ssl_connection_complete) {
+ failf(data, "SSL: connection closed during handshake");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ return CURLE_OK;
+ case BR_ERR_X509_EXPIRED:
+ failf(data, "SSL: X.509 verification: "
+ "certificate is expired or not yet valid");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ case BR_ERR_X509_BAD_SERVER_NAME:
+ failf(data, "SSL: X.509 verification: "
+ "expected server name was not found in the chain");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ case BR_ERR_X509_NOT_TRUSTED:
+ failf(data, "SSL: X.509 verification: "
+ "chain could not be linked to a trust anchor");
+ return CURLE_PEER_FAILED_VERIFICATION;
+ }
+ /* X.509 errors are documented to have the range 32..63 */
+ if(err >= 32 && err < 64)
+ return CURLE_PEER_FAILED_VERIFICATION;
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ if(state & target)
+ return CURLE_OK;
+ if(state & BR_SSL_SENDREC) {
+ buf = br_ssl_engine_sendrec_buf(&backend->ctx.eng, &len);
+ ret = swrite(sockfd, buf, len);
+ if(ret == -1) {
+ if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+ if(connssl->state != ssl_connection_complete)
+ connssl->connecting_state = ssl_connect_2_writing;
+ return CURLE_AGAIN;
+ }
+ return CURLE_WRITE_ERROR;
+ }
+ br_ssl_engine_sendrec_ack(&backend->ctx.eng, ret);
+ }
+ else if(state & BR_SSL_RECVREC) {
+ buf = br_ssl_engine_recvrec_buf(&backend->ctx.eng, &len);
+ ret = sread(sockfd, buf, len);
+ if(ret == 0) {
+ failf(data, "SSL: EOF without close notify");
+ return CURLE_READ_ERROR;
+ }
+ if(ret == -1) {
+ if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+ if(connssl->state != ssl_connection_complete)
+ connssl->connecting_state = ssl_connect_2_reading;
+ return CURLE_AGAIN;
+ }
+ return CURLE_READ_ERROR;
+ }
+ br_ssl_engine_recvrec_ack(&backend->ctx.eng, ret);
+ }
+ }
+}
+
+static CURLcode bearssl_connect_step2(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ CURLcode ret;
+
+ ret = bearssl_run_until(conn, sockindex, BR_SSL_SENDAPP | BR_SSL_RECVAPP);
+ if(ret == CURLE_AGAIN)
+ return CURLE_OK;
+ if(ret == CURLE_OK) {
+ if(br_ssl_engine_current_state(&backend->ctx.eng) == BR_SSL_CLOSED) {
+ failf(data, "SSL: connection closed during handshake");
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ connssl->connecting_state = ssl_connect_3;
+ }
+ return ret;
+}
+
+static CURLcode bearssl_connect_step3(struct connectdata *conn, int sockindex)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ CURLcode ret;
+
+ DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
+
+ if(conn->bits.tls_enable_alpn) {
+ const char *protocol;
+
+ protocol = br_ssl_engine_get_selected_protocol(&backend->ctx.eng);
+ if(protocol) {
+ infof(data, "ALPN, server accepted to use %s\n", protocol);
+
+#ifdef USE_NGHTTP2
+ if(!strcmp(protocol, NGHTTP2_PROTO_VERSION_ID))
+ conn->negnpn = CURL_HTTP_VERSION_2;
+ else
+#endif
+ if(!strcmp(protocol, ALPN_HTTP_1_1))
+ conn->negnpn = CURL_HTTP_VERSION_1_1;
+ else
+ infof(data, "ALPN, unrecognized protocol %s\n", protocol);
+ Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
+ BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
+ }
+ else
+ infof(data, "ALPN, server did not agree to a protocol\n");
+ }
+
+ if(SSL_SET_OPTION(primary.sessionid)) {
+ bool incache;
+ void *oldsession;
+ br_ssl_session_parameters *session;
+
+ session = malloc(sizeof(*session));
+ if(!session)
+ return CURLE_OUT_OF_MEMORY;
+ br_ssl_engine_get_session_parameters(&backend->ctx.eng, session);
+ Curl_ssl_sessionid_lock(conn);
+ incache = !(Curl_ssl_getsessionid(conn, &oldsession, NULL, sockindex));
+ if(incache)
+ Curl_ssl_delsessionid(conn, oldsession);
+ ret = Curl_ssl_addsessionid(conn, session, 0, sockindex);
+ Curl_ssl_sessionid_unlock(conn);
+ if(ret) {
+ free(session);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ }
+
+ connssl->connecting_state = ssl_connect_done;
+
+ return CURLE_OK;
+}
+
+static ssize_t bearssl_send(struct connectdata *conn, int sockindex,
+ const void *buf, size_t len, CURLcode *err)
+{
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ unsigned char *app;
+ size_t applen;
+
+ for(;;) {
+ *err = bearssl_run_until(conn, sockindex, BR_SSL_SENDAPP);
+ if (*err != CURLE_OK)
+ return -1;
+ app = br_ssl_engine_sendapp_buf(&backend->ctx.eng, &applen);
+ if(!app) {
+ failf(data, "SSL: connection closed during write");
+ *err = CURLE_SEND_ERROR;
+ return -1;
+ }
+ if(backend->pending_write) {
+ applen = backend->pending_write;
+ backend->pending_write = 0;
+ return applen;
+ }
+ if(applen > len)
+ applen = len;
+ memcpy(app, buf, applen);
+ br_ssl_engine_sendapp_ack(&backend->ctx.eng, applen);
+ br_ssl_engine_flush(&backend->ctx.eng, 0);
+ backend->pending_write = applen;
+ }
+}
+
+static ssize_t bearssl_recv(struct connectdata *conn, int sockindex,
+ char *buf, size_t len, CURLcode *err)
+{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ unsigned char *app;
+ size_t applen;
+
+ *err = bearssl_run_until(conn, sockindex, BR_SSL_RECVAPP);
+ if(*err != CURLE_OK)
+ return -1;
+ app = br_ssl_engine_recvapp_buf(&backend->ctx.eng, &applen);
+ if(!app)
+ return 0;
+ if(applen > len)
+ applen = len;
+ memcpy(buf, app, applen);
+ br_ssl_engine_recvapp_ack(&backend->ctx.eng, applen);
+
+ return applen;
+}
+
+static CURLcode bearssl_connect_common(struct connectdata *conn,
+ int sockindex,
+ bool nonblocking,
+ bool *done)
+{
+ CURLcode ret;
+ struct Curl_easy *data = conn->data;
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ curl_socket_t sockfd = conn->sock[sockindex];
+ timediff_t timeout_ms;
+ int what;
+
+ /* check if the connection has already been established */
+ if(ssl_connection_complete == connssl->state) {
+ *done = TRUE;
+ return CURLE_OK;
+ }
+
+ if(ssl_connect_1 == connssl->connecting_state) {
+ ret = bearssl_connect_step1(conn, sockindex);
+ if(ret)
+ return ret;
+ }
+
+ while(ssl_connect_2 == connssl->connecting_state ||
+ ssl_connect_2_reading == connssl->connecting_state ||
+ ssl_connect_2_writing == connssl->connecting_state) {
+ /* check allowed time left */
+ timeout_ms = Curl_timeleft(data, NULL, TRUE);
+
+ if(timeout_ms < 0) {
+ /* no need to continue if time already is up */
+ failf(data, "SSL connection timeout");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+
+ /* if ssl is expecting something, check if it's available. */
+ if(ssl_connect_2_reading == connssl->connecting_state ||
+ ssl_connect_2_writing == connssl->connecting_state) {
+
+ curl_socket_t writefd = ssl_connect_2_writing ==
+ connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
+ curl_socket_t readfd = ssl_connect_2_reading ==
+ connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
+
+ what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
+ nonblocking?0:timeout_ms);
+ if(what < 0) {
+ /* fatal error */
+ failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ else if(0 == what) {
+ if(nonblocking) {
+ *done = FALSE;
+ return CURLE_OK;
+ }
+ else {
+ /* timeout */
+ failf(data, "SSL connection timeout");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+ }
+ /* socket is readable or writable */
+ }
+
+ /* Run transaction, and return to the caller if it failed or if this
+ * connection is done nonblocking and this loop would execute again. This
+ * permits the owner of a multi handle to abort a connection attempt
+ * before step2 has completed while ensuring that a client using select()
+ * or epoll() will always have a valid fdset to wait on.
+ */
+ ret = bearssl_connect_step2(conn, sockindex);
+ if(ret || (nonblocking &&
+ (ssl_connect_2 == connssl->connecting_state ||
+ ssl_connect_2_reading == connssl->connecting_state ||
+ ssl_connect_2_writing == connssl->connecting_state)))
+ return ret;
+ }
+
+ if(ssl_connect_3 == connssl->connecting_state) {
+ ret = bearssl_connect_step3(conn, sockindex);
+ if(ret)
+ return ret;
+ }
+
+ if(ssl_connect_done == connssl->connecting_state) {
+ connssl->state = ssl_connection_complete;
+ conn->recv[sockindex] = bearssl_recv;
+ conn->send[sockindex] = bearssl_send;
+ *done = TRUE;
+ }
+ else
+ *done = FALSE;
+
+ /* Reset our connect state machine */
+ connssl->connecting_state = ssl_connect_1;
+
+ return CURLE_OK;
+}
+
+static size_t Curl_bearssl_version(char *buffer, size_t size)
+{
+ return msnprintf(buffer, size, "BearSSL");
+}
+
+static bool Curl_bearssl_data_pending(const struct connectdata *conn,
+ int connindex)
+{
+ const struct ssl_connect_data *connssl = &conn->ssl[connindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ return br_ssl_engine_current_state(&backend->ctx.eng) & BR_SSL_RECVAPP;
+}
+
+static CURLcode Curl_bearssl_random(struct Curl_easy *data UNUSED_PARAM,
+ unsigned char *entropy, size_t length)
+{
+ static br_hmac_drbg_context ctx;
+ static bool seeded = FALSE;
+
+ if(!seeded) {
+ br_prng_seeder seeder;
+
+ br_hmac_drbg_init(&ctx, &br_sha256_vtable, NULL, 0);
+ seeder = br_prng_seeder_system(NULL);
+ if(!seeder || !seeder(&ctx.vtable))
+ return CURLE_FAILED_INIT;
+ seeded = TRUE;
+ }
+ br_hmac_drbg_generate(&ctx, entropy, length);
+
+ return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_connect(struct connectdata *conn, int sockindex)
+{
+ CURLcode ret;
+ bool done = FALSE;
+
+ ret = bearssl_connect_common(conn, sockindex, FALSE, &done);
+ if(ret)
+ return ret;
+
+ DEBUGASSERT(done);
+
+ return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_connect_nonblocking(struct connectdata *conn,
+ int sockindex, bool *done)
+{
+ return bearssl_connect_common(conn, sockindex, TRUE, done);
+}
+
+static void *Curl_bearssl_get_internals(struct ssl_connect_data *connssl,
+ CURLINFO info UNUSED_PARAM)
+{
+ struct ssl_backend_data *backend = connssl->backend;
+ return &backend->ctx;
+}
+
+static void Curl_bearssl_close(struct connectdata *conn, int sockindex)
+{
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+ size_t i;
+
+ if(backend->active) {
+ br_ssl_engine_close(&backend->ctx.eng);
+ (void)bearssl_run_until(conn, sockindex, BR_SSL_CLOSED);
+ }
+ for(i = 0; i < backend->anchors_len; ++i)
+ free(backend->anchors[i].dn.data);
+ free(backend->anchors);
+}
+
+static void Curl_bearssl_session_free(void *ptr)
+{
+ free(ptr);
+}
+
+static CURLcode Curl_bearssl_md5sum(unsigned char *input,
+ size_t inputlen,
+ unsigned char *md5sum,
+ size_t md5len UNUSED_PARAM)
+{
+ br_md5_context ctx;
+
+ br_md5_init(&ctx);
+ br_md5_update(&ctx, input, inputlen);
+ br_md5_out(&ctx, md5sum);
+ return CURLE_OK;
+}
+
+static CURLcode Curl_bearssl_sha256sum(const unsigned char *input,
+ size_t inputlen,
+ unsigned char *sha256sum,
+ size_t sha256len UNUSED_PARAM)
+{
+ br_sha256_context ctx;
+
+ br_sha256_init(&ctx);
+ br_sha256_update(&ctx, input, inputlen);
+ br_sha256_out(&ctx, sha256sum);
+ return CURLE_OK;
+}
+
+const struct Curl_ssl Curl_ssl_bearssl = {
+ { CURLSSLBACKEND_BEARSSL, "bearssl" },
+ 0,
+ sizeof(struct ssl_backend_data),
+
+ Curl_none_init,
+ Curl_none_cleanup,
+ Curl_bearssl_version,
+ Curl_none_check_cxn,
+ Curl_none_shutdown,
+ Curl_bearssl_data_pending,
+ Curl_bearssl_random,
+ Curl_none_cert_status_request,
+ Curl_bearssl_connect,
+ Curl_bearssl_connect_nonblocking,
+ Curl_bearssl_get_internals,
+ Curl_bearssl_close,
+ Curl_none_close_all,
+ Curl_bearssl_session_free,
+ Curl_none_set_engine,
+ Curl_none_set_engine_default,
+ Curl_none_engines_list,
+ Curl_none_false_start,
+ Curl_bearssl_md5sum,
+ Curl_bearssl_sha256sum
+};
+
+#endif /* USE_BEARSSL */
diff --git a/lib/vtls/polarssl.h b/lib/vtls/bearssl.h
index 23c3636ee..5f94922b9 100644
--- a/lib/vtls/polarssl.h
+++ b/lib/vtls/bearssl.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_POLARSSL_H
-#define HEADER_CURL_POLARSSL_H
+#ifndef HEADER_CURL_BEARSSL_H
+#define HEADER_CURL_BEARSSL_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,8 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
- * Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
+ * Copyright (C) 2019, Michael Forney, <mforney@mforney.org>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,11 +21,12 @@
* KIND, either express or implied.
*
***************************************************************************/
+
#include "curl_setup.h"
-#ifdef USE_POLARSSL
+#ifdef USE_BEARSSL
-extern const struct Curl_ssl Curl_ssl_polarssl;
+extern const struct Curl_ssl Curl_ssl_bearssl;
-#endif /* USE_POLARSSL */
-#endif /* HEADER_CURL_POLARSSL_H */
+#endif /* USE_BEARSSL */
+#endif /* HEADER_CURL_BEARSSL_H */
diff --git a/lib/vtls/gskit.c b/lib/vtls/gskit.c
index 32153dd07..dc79f487c 100644
--- a/lib/vtls/gskit.c
+++ b/lib/vtls/gskit.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -108,13 +108,13 @@ struct ssl_backend_data {
#define BACKEND connssl->backend
/* Supported ciphers. */
-typedef struct {
+struct gskit_cipher {
const char *name; /* Cipher name. */
const char *gsktoken; /* Corresponding token for GSKit String. */
unsigned int versions; /* SSL version flags. */
-} gskit_cipher;
+};
-static const gskit_cipher ciphertable[] = {
+static const struct gskit_cipher ciphertable[] = {
{ "null-md5", "01",
CURL_GSKPROTO_SSLV3_MASK | CURL_GSKPROTO_TLSV10_MASK |
CURL_GSKPROTO_TLSV11_MASK | CURL_GSKPROTO_TLSV12_MASK },
@@ -307,7 +307,7 @@ static CURLcode set_ciphers(struct connectdata *conn,
struct Curl_easy *data = conn->data;
const char *cipherlist = SSL_CONN_CONFIG(cipher_list);
const char *clp;
- const gskit_cipher *ctp;
+ const struct gskit_cipher *ctp;
int i;
int l;
bool unsupported;
@@ -524,7 +524,6 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
int m;
int i;
int ret = 0;
- struct timeval tv = {0, 0};
char buf[CURL_MAX_WRITE_SIZE];
if(!connssl->use || !connproxyssl->use)
@@ -544,7 +543,7 @@ static int pipe_ssloverssl(struct connectdata *conn, int sockindex,
if(n < conn->sock[sockindex])
n = conn->sock[sockindex];
}
- i = select(n + 1, &fds_read, &fds_write, NULL, &tv);
+ i = Curl_select(n + 1, &fds_read, &fds_write, NULL, 0);
if(i < 0)
return -1; /* Select error. */
@@ -706,7 +705,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
int rc;
const char * const keyringfile = SSL_CONN_CONFIG(CAfile);
const char * const keyringpwd = SSL_SET_OPTION(key_passwd);
- const char * const keyringlabel = SSL_SET_OPTION(cert);
+ const char * const keyringlabel = SSL_SET_OPTION(primary.clientcert);
const long int ssl_version = SSL_CONN_CONFIG(version);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name:
@@ -820,7 +819,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
if(!result) {
/* Compute the handshake timeout. Since GSKit granularity is 1 second,
we round up the required value. */
- long timeout = Curl_timeleft(data, NULL, TRUE);
+ timediff_t timeout = Curl_timeleft(data, NULL, TRUE);
if(timeout < 0)
result = CURLE_OPERATION_TIMEDOUT;
else
@@ -933,7 +932,7 @@ static CURLcode gskit_connect_step2(struct connectdata *conn, int sockindex,
/* Poll or wait for end of SSL asynchronous handshake. */
for(;;) {
- long timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
+ timediff_t timeout_ms = nonblocking? 0: Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0)
timeout_ms = 0;
stmv.tv_sec = timeout_ms / 1000;
diff --git a/lib/vtls/gskit.h b/lib/vtls/gskit.h
index 466ee4d9d..b06b5e17d 100644
--- a/lib/vtls/gskit.h
+++ b/lib/vtls/gskit.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index 3737d7c68..ec3f8599b 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -72,97 +72,24 @@ static void tls_log_func(int level, const char *str)
#endif
static bool gtls_inited = FALSE;
-#if defined(GNUTLS_VERSION_NUMBER)
-# if (GNUTLS_VERSION_NUMBER >= 0x020c00)
-# undef gnutls_transport_set_lowat
-# define gnutls_transport_set_lowat(A,B) Curl_nop_stmt
-# define USE_GNUTLS_PRIORITY_SET_DIRECT 1
-# endif
-# if (GNUTLS_VERSION_NUMBER >= 0x020c03)
-# define GNUTLS_MAPS_WINSOCK_ERRORS 1
-# endif
-
-# if HAVE_GNUTLS_ALPN_SET_PROTOCOLS
-# define HAS_ALPN
-# endif
-
-# if HAVE_GNUTLS_OCSP_REQ_INIT
-# define HAS_OCSP
-# endif
-
-# if (GNUTLS_VERSION_NUMBER >= 0x030306)
-# define HAS_CAPATH
-# endif
+#if !defined(GNUTLS_VERSION_NUMBER) || (GNUTLS_VERSION_NUMBER < 0x03010a)
+#error "too old GnuTLS version"
#endif
-#if (GNUTLS_VERSION_NUMBER >= 0x030603)
-#define HAS_TLS13
-#endif
-
-#ifdef HAS_OCSP
# include <gnutls/ocsp.h>
-#endif
struct ssl_backend_data {
gnutls_session_t session;
gnutls_certificate_credentials_t cred;
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
gnutls_srp_client_credentials_t srp_client_cred;
#endif
};
-#define BACKEND connssl->backend
-
-/*
- * Custom push and pull callback functions used by GNU TLS to read and write
- * to the socket. These functions are simple wrappers to send() and recv()
- * (although here using the sread/swrite macros as defined by
- * curl_setup_once.h).
- * We use custom functions rather than the GNU TLS defaults because it allows
- * us to get specific about the fourth "flags" argument, and to use arbitrary
- * private data with gnutls_transport_set_ptr if we wish.
- *
- * When these custom push and pull callbacks fail, GNU TLS checks its own
- * session-specific error variable, and when not set also its own global
- * errno variable, in order to take appropriate action. GNU TLS does not
- * require that the transport is actually a socket. This implies that for
- * Windows builds these callbacks should ideally set the session-specific
- * error variable using function gnutls_transport_set_errno or as a last
- * resort global errno variable using gnutls_transport_set_global_errno,
- * with a transport agnostic error value. This implies that some winsock
- * error translation must take place in these callbacks.
- *
- * Paragraph above applies to GNU TLS versions older than 2.12.3, since
- * this version GNU TLS does its own internal winsock error translation
- * using system_errno() function.
- */
-
-#if defined(USE_WINSOCK) && !defined(GNUTLS_MAPS_WINSOCK_ERRORS)
-# define gtls_EINTR 4
-# define gtls_EIO 5
-# define gtls_EAGAIN 11
-static int gtls_mapped_sockerrno(void)
-{
- switch(SOCKERRNO) {
- case WSAEWOULDBLOCK:
- return gtls_EAGAIN;
- case WSAEINTR:
- return gtls_EINTR;
- default:
- break;
- }
- return gtls_EIO;
-}
-#endif
-
static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len)
{
curl_socket_t sock = *(curl_socket_t *)s;
ssize_t ret = swrite(sock, buf, len);
-#if defined(USE_WINSOCK) && !defined(GNUTLS_MAPS_WINSOCK_ERRORS)
- if(ret < 0)
- gnutls_transport_set_global_errno(gtls_mapped_sockerrno());
-#endif
return ret;
}
@@ -170,10 +97,6 @@ static ssize_t Curl_gtls_pull(void *s, void *buf, size_t len)
{
curl_socket_t sock = *(curl_socket_t *)s;
ssize_t ret = sread(sock, buf, len);
-#if defined(USE_WINSOCK) && !defined(GNUTLS_MAPS_WINSOCK_ERRORS)
- if(ret < 0)
- gnutls_transport_set_global_errno(gtls_mapped_sockerrno());
-#endif
return ret;
}
@@ -284,7 +207,8 @@ static CURLcode handshake(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- gnutls_session_t session = BACKEND->session;
+ struct ssl_backend_data *backend = connssl->backend;
+ gnutls_session_t session = backend->session;
curl_socket_t sockfd = conn->sock[sockindex];
for(;;) {
@@ -311,7 +235,7 @@ static CURLcode handshake(struct connectdata *conn,
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
nonblocking?0:
- timeout_ms?(time_t)timeout_ms:1000);
+ timeout_ms?timeout_ms:1000);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -380,54 +304,9 @@ static gnutls_x509_crt_fmt_t do_file_type(const char *type)
return GNUTLS_X509_FMT_PEM;
if(strcasecompare(type, "DER"))
return GNUTLS_X509_FMT_DER;
- return -1;
+ return GNUTLS_X509_FMT_PEM; /* default to PEM */
}
-#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT
-static CURLcode
-set_ssl_version_min_max(int *list, size_t list_size, struct connectdata *conn)
-{
- struct Curl_easy *data = conn->data;
- long ssl_version = SSL_CONN_CONFIG(version);
- long ssl_version_max = SSL_CONN_CONFIG(version_max);
- long i = ssl_version;
- long protocol_priority_idx = 0;
-
- switch(ssl_version_max) {
- case CURL_SSLVERSION_MAX_NONE:
- case CURL_SSLVERSION_MAX_DEFAULT:
-#ifdef HAS_TLS13
- ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_3;
-#endif
- ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
- break;
- }
-
- for(; i <= (ssl_version_max >> 16) &&
- protocol_priority_idx < list_size; ++i) {
- switch(i) {
- case CURL_SSLVERSION_TLSv1_0:
- protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_0;
- break;
- case CURL_SSLVERSION_TLSv1_1:
- protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_1;
- break;
- case CURL_SSLVERSION_TLSv1_2:
- protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_2;
- break;
- case CURL_SSLVERSION_TLSv1_3:
-#ifdef HAS_TLS13
- protocol_priority[protocol_priority_idx++] = GNUTLS_TLS1_3;
- break;
-#else
- failf(data, "GnuTLS: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
-#endif
- }
- }
- return CURLE_OK;
-}
-#else
#define GNUTLS_CIPHERS "NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509"
/* If GnuTLS was compiled without support for SRP it will error out if SRP is
requested in the priority string, so treat it specially
@@ -445,77 +324,59 @@ set_ssl_version_min_max(const char **prioritylist, struct connectdata *conn)
ssl_version_max = CURL_SSLVERSION_MAX_DEFAULT;
}
switch(ssl_version | ssl_version_max) {
- case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_0:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.0:" GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_1:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.0:+VERS-TLS1.1:" GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_2:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2:" GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_TLSv1_1:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.1:" GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_TLSv1_2:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.1:+VERS-TLS1.2:" GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_2 | CURL_SSLVERSION_MAX_TLSv1_2:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.2:" GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_3 | CURL_SSLVERSION_MAX_TLSv1_3:
-#ifdef HAS_TLS13
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.3:" GNUTLS_SRP;
- return CURLE_OK;
-#else
- failf(data, "GnuTLS: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
-#endif
- case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_DEFAULT:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2:"
-#ifdef HAS_TLS13
- "+VERS-TLS1.3:"
-#endif
- GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_DEFAULT:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.1:+VERS-TLS1.2:"
-#ifdef HAS_TLS13
- "+VERS-TLS1.3:"
-#endif
- GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_2 | CURL_SSLVERSION_MAX_DEFAULT:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.2:"
-#ifdef HAS_TLS13
- "+VERS-TLS1.3:"
-#endif
- GNUTLS_SRP;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_3 | CURL_SSLVERSION_MAX_DEFAULT:
- *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
- "+VERS-TLS1.2:"
-#ifdef HAS_TLS13
- "+VERS-TLS1.3:"
-#endif
- GNUTLS_SRP;
- return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_0:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_1:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0:+VERS-TLS1.1";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_TLSv1_2:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_TLSv1_1:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.1";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_TLSv1_2:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.1:+VERS-TLS1.2";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_2 | CURL_SSLVERSION_MAX_TLSv1_2:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.2";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_3 | CURL_SSLVERSION_MAX_TLSv1_3:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.3";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_0 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2"
+ ":+VERS-TLS1.3";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_1 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.1:+VERS-TLS1.2"
+ ":+VERS-TLS1.3";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_2 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.2"
+ ":+VERS-TLS1.3";
+ return CURLE_OK;
+ case CURL_SSLVERSION_TLSv1_3 | CURL_SSLVERSION_MAX_DEFAULT:
+ *prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:-VERS-TLS-ALL:"
+ "+VERS-TLS1.2"
+ ":+VERS-TLS1.3";
+ return CURLE_OK;
}
failf(data, "GnuTLS: cannot set ssl protocol");
return CURLE_SSL_CONNECT_ERROR;
}
-#endif
static CURLcode
gtls_connect_step1(struct connectdata *conn,
@@ -523,6 +384,7 @@ gtls_connect_step1(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
unsigned int init_flags;
gnutls_session_t session;
int rc;
@@ -535,28 +397,10 @@ gtls_connect_step1(struct connectdata *conn,
#else
struct in_addr addr;
#endif
-#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT
- static const int cipher_priority[] = {
- /* These two ciphers were added to GnuTLS as late as ver. 3.0.1,
- but this code path is only ever used for ver. < 2.12.0.
- GNUTLS_CIPHER_AES_128_GCM,
- GNUTLS_CIPHER_AES_256_GCM,
- */
- GNUTLS_CIPHER_AES_128_CBC,
- GNUTLS_CIPHER_AES_256_CBC,
- GNUTLS_CIPHER_CAMELLIA_128_CBC,
- GNUTLS_CIPHER_CAMELLIA_256_CBC,
- GNUTLS_CIPHER_3DES_CBC,
- };
- static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 };
- int protocol_priority[] = { 0, 0, 0, 0 };
-#else
const char *prioritylist;
const char *err = NULL;
-#endif
-
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
+ const char * const hostname = SSL_HOST_NAME();
+ long * const certverifyresult = &SSL_SET_OPTION_LVALUE(certverifyresult);
if(connssl->state == ssl_connection_complete)
/* to make us tolerant against being called more than once for the
@@ -566,6 +410,9 @@ gtls_connect_step1(struct connectdata *conn,
if(!gtls_inited)
Curl_gtls_init();
+ /* Initialize certverifyresult to OK */
+ *certverifyresult = 0;
+
if(SSL_CONN_CONFIG(version) == CURL_SSLVERSION_SSLv2) {
failf(data, "GnuTLS does not support SSLv2");
return CURLE_SSL_CONNECT_ERROR;
@@ -574,25 +421,25 @@ gtls_connect_step1(struct connectdata *conn,
sni = FALSE; /* SSLv3 has no SNI */
/* allocate a cred struct */
- rc = gnutls_certificate_allocate_credentials(&BACKEND->cred);
+ rc = gnutls_certificate_allocate_credentials(&backend->cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_cert_all_cred() failed: %s", gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
}
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
infof(data, "Using TLS-SRP username: %s\n", SSL_SET_OPTION(username));
rc = gnutls_srp_allocate_client_credentials(
- &BACKEND->srp_client_cred);
+ &backend->srp_client_cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_srp_allocate_client_cred() failed: %s",
gnutls_strerror(rc));
return CURLE_OUT_OF_MEMORY;
}
- rc = gnutls_srp_set_client_credentials(BACKEND->srp_client_cred,
+ rc = gnutls_srp_set_client_credentials(backend->srp_client_cred,
SSL_SET_OPTION(username),
SSL_SET_OPTION(password));
if(rc != GNUTLS_E_SUCCESS) {
@@ -605,52 +452,54 @@ gtls_connect_step1(struct connectdata *conn,
if(SSL_CONN_CONFIG(CAfile)) {
/* set the trusted CA cert bundle file */
- gnutls_certificate_set_verify_flags(BACKEND->cred,
+ gnutls_certificate_set_verify_flags(backend->cred,
GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
- rc = gnutls_certificate_set_x509_trust_file(BACKEND->cred,
+ rc = gnutls_certificate_set_x509_trust_file(backend->cred,
SSL_CONN_CONFIG(CAfile),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
infof(data, "error reading ca cert file %s (%s)\n",
SSL_CONN_CONFIG(CAfile), gnutls_strerror(rc));
- if(SSL_CONN_CONFIG(verifypeer))
+ if(SSL_CONN_CONFIG(verifypeer)) {
+ *certverifyresult = rc;
return CURLE_SSL_CACERT_BADFILE;
+ }
}
else
infof(data, "found %d certificates in %s\n", rc,
SSL_CONN_CONFIG(CAfile));
}
-#ifdef HAS_CAPATH
if(SSL_CONN_CONFIG(CApath)) {
/* set the trusted CA cert directory */
- rc = gnutls_certificate_set_x509_trust_dir(BACKEND->cred,
+ rc = gnutls_certificate_set_x509_trust_dir(backend->cred,
SSL_CONN_CONFIG(CApath),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
infof(data, "error reading ca cert file %s (%s)\n",
SSL_CONN_CONFIG(CApath), gnutls_strerror(rc));
- if(SSL_CONN_CONFIG(verifypeer))
+ if(SSL_CONN_CONFIG(verifypeer)) {
+ *certverifyresult = rc;
return CURLE_SSL_CACERT_BADFILE;
+ }
}
else
infof(data, "found %d certificates in %s\n",
rc, SSL_CONN_CONFIG(CApath));
}
-#endif
#ifdef CURL_CA_FALLBACK
/* use system ca certificate store as fallback */
if(SSL_CONN_CONFIG(verifypeer) &&
!(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath))) {
- gnutls_certificate_set_x509_system_trust(BACKEND->cred);
+ gnutls_certificate_set_x509_system_trust(backend->cred);
}
#endif
if(SSL_SET_OPTION(CRLfile)) {
/* set the CRL list file */
- rc = gnutls_certificate_set_x509_crl_file(BACKEND->cred,
+ rc = gnutls_certificate_set_x509_crl_file(backend->cred,
SSL_SET_OPTION(CRLfile),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
@@ -666,19 +515,23 @@ gtls_connect_step1(struct connectdata *conn,
/* Initialize TLS session as a client */
init_flags = GNUTLS_CLIENT;
+#if defined(GNUTLS_FORCE_CLIENT_CERT)
+ init_flags |= GNUTLS_FORCE_CLIENT_CERT;
+#endif
+
#if defined(GNUTLS_NO_TICKETS)
/* Disable TLS session tickets */
init_flags |= GNUTLS_NO_TICKETS;
#endif
- rc = gnutls_init(&BACKEND->session, init_flags);
+ rc = gnutls_init(&backend->session, init_flags);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_init() failed: %d", rc);
return CURLE_SSL_CONNECT_ERROR;
}
/* convenient assign */
- session = BACKEND->session;
+ session = backend->session;
if((0 == Curl_inet_pton(AF_INET, hostname, &addr)) &&
#ifdef ENABLE_IPV6
@@ -695,62 +548,6 @@ gtls_connect_step1(struct connectdata *conn,
if(rc != GNUTLS_E_SUCCESS)
return CURLE_SSL_CONNECT_ERROR;
-#ifndef USE_GNUTLS_PRIORITY_SET_DIRECT
- rc = gnutls_cipher_set_priority(session, cipher_priority);
- if(rc != GNUTLS_E_SUCCESS)
- return CURLE_SSL_CONNECT_ERROR;
-
- /* Sets the priority on the certificate types supported by gnutls. Priority
- is higher for types specified before others. After specifying the types
- you want, you must append a 0. */
- rc = gnutls_certificate_type_set_priority(session, cert_type_priority);
- if(rc != GNUTLS_E_SUCCESS)
- return CURLE_SSL_CONNECT_ERROR;
-
- if(SSL_CONN_CONFIG(cipher_list) != NULL) {
- failf(data, "can't pass a custom cipher list to older GnuTLS"
- " versions");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- switch(SSL_CONN_CONFIG(version)) {
- case CURL_SSLVERSION_SSLv3:
- protocol_priority[0] = GNUTLS_SSL3;
- break;
- case CURL_SSLVERSION_DEFAULT:
- case CURL_SSLVERSION_TLSv1:
- protocol_priority[0] = GNUTLS_TLS1_0;
- protocol_priority[1] = GNUTLS_TLS1_1;
- protocol_priority[2] = GNUTLS_TLS1_2;
-#ifdef HAS_TLS13
- protocol_priority[3] = GNUTLS_TLS1_3;
-#endif
- break;
- case CURL_SSLVERSION_TLSv1_0:
- case CURL_SSLVERSION_TLSv1_1:
- case CURL_SSLVERSION_TLSv1_2:
- case CURL_SSLVERSION_TLSv1_3:
- {
- CURLcode result = set_ssl_version_min_max(protocol_priority,
- sizeof(protocol_priority)/sizeof(protocol_priority[0]), conn);
- if(result != CURLE_OK)
- return result;
- break;
- }
- case CURL_SSLVERSION_SSLv2:
- failf(data, "GnuTLS does not support SSLv2");
- return CURLE_SSL_CONNECT_ERROR;
- default:
- failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
- return CURLE_SSL_CONNECT_ERROR;
- }
- rc = gnutls_protocol_set_priority(session, protocol_priority);
- if(rc != GNUTLS_E_SUCCESS) {
- failf(data, "Did you pass a valid GnuTLS cipher list?");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
-#else
/* Ensure +SRP comes at the *end* of all relevant strings so that it can be
* removed if a run-time error indicates that SRP is not supported by this
* GnuTLS version */
@@ -760,11 +557,11 @@ gtls_connect_step1(struct connectdata *conn,
break;
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0:"
+ prioritylist = GNUTLS_CIPHERS ":-VERS-SSL3.0"
#ifdef HAS_TLS13
- "+VERS-TLS1.3:"
+ ":+VERS-TLS1.3"
#endif
- GNUTLS_SRP;
+ ;
break;
case CURL_SSLVERSION_TLSv1_0:
case CURL_SSLVERSION_TLSv1_1:
@@ -783,39 +580,49 @@ gtls_connect_step1(struct connectdata *conn,
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
return CURLE_SSL_CONNECT_ERROR;
}
- rc = gnutls_priority_set_direct(session, prioritylist, &err);
- if((rc == GNUTLS_E_INVALID_REQUEST) && err) {
- if(!strcmp(err, GNUTLS_SRP)) {
- /* This GnuTLS was probably compiled without support for SRP.
- * Note that fact and try again without it. */
- int validprioritylen = curlx_uztosi(err - prioritylist);
- char *prioritycopy = strdup(prioritylist);
- if(!prioritycopy)
- return CURLE_OUT_OF_MEMORY;
+#ifdef HAVE_GNUTLS_SRP
+ /* Only add SRP to the cipher list if SRP is requested. Otherwise
+ * GnuTLS will disable TLS 1.3 support. */
+ if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
+ size_t len = strlen(prioritylist);
+
+ char *prioritysrp = malloc(len + sizeof(GNUTLS_SRP) + 1);
+ if(!prioritysrp)
+ return CURLE_OUT_OF_MEMORY;
+ strcpy(prioritysrp, prioritylist);
+ strcpy(prioritysrp + len, ":" GNUTLS_SRP);
+
+ rc = gnutls_priority_set_direct(session, prioritysrp, &err);
+ free(prioritysrp);
+
+ if((rc == GNUTLS_E_INVALID_REQUEST) && err) {
infof(data, "This GnuTLS does not support SRP\n");
- if(validprioritylen)
- /* Remove the :+SRP */
- prioritycopy[validprioritylen - 1] = 0;
- rc = gnutls_priority_set_direct(session, prioritycopy, &err);
- free(prioritycopy);
}
}
+ else {
+#endif
+ rc = gnutls_priority_set_direct(session, prioritylist, &err);
+#ifdef HAVE_GNUTLS_SRP
+ }
+#endif
+
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "Error %d setting GnuTLS cipher list starting with %s",
rc, err);
return CURLE_SSL_CONNECT_ERROR;
}
-#endif
-#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
int cur = 0;
gnutls_datum_t protocols[2];
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
- (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2
+#ifndef CURL_DISABLE_PROXY
+ && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)
+#endif
+ ) {
protocols[cur].data = (unsigned char *)NGHTTP2_PROTO_VERSION_ID;
protocols[cur].size = NGHTTP2_PROTO_VERSION_ID_LEN;
cur++;
@@ -830,21 +637,19 @@ gtls_connect_step1(struct connectdata *conn,
gnutls_alpn_set_protocols(session, protocols, cur, 0);
}
-#endif
- if(SSL_SET_OPTION(cert)) {
+ if(SSL_SET_OPTION(primary.clientcert)) {
if(SSL_SET_OPTION(key_passwd)) {
-#if HAVE_GNUTLS_CERTIFICATE_SET_X509_KEY_FILE2
const unsigned int supported_key_encryption_algorithms =
GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR |
GNUTLS_PKCS_USE_PKCS12_RC2_40 | GNUTLS_PKCS_USE_PBES2_3DES |
GNUTLS_PKCS_USE_PBES2_AES_128 | GNUTLS_PKCS_USE_PBES2_AES_192 |
GNUTLS_PKCS_USE_PBES2_AES_256;
rc = gnutls_certificate_set_x509_key_file2(
- BACKEND->cred,
- SSL_SET_OPTION(cert),
+ backend->cred,
+ SSL_SET_OPTION(primary.clientcert),
SSL_SET_OPTION(key) ?
- SSL_SET_OPTION(key) : SSL_SET_OPTION(cert),
+ SSL_SET_OPTION(key) : SSL_SET_OPTION(primary.clientcert),
do_file_type(SSL_SET_OPTION(cert_type)),
SSL_SET_OPTION(key_passwd),
supported_key_encryption_algorithms);
@@ -854,17 +659,13 @@ gtls_connect_step1(struct connectdata *conn,
gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
}
-#else
- failf(data, "gnutls lacks support for encrypted key files");
- return CURLE_SSL_CONNECT_ERROR;
-#endif
}
else {
if(gnutls_certificate_set_x509_key_file(
- BACKEND->cred,
- SSL_SET_OPTION(cert),
+ backend->cred,
+ SSL_SET_OPTION(primary.clientcert),
SSL_SET_OPTION(key) ?
- SSL_SET_OPTION(key) : SSL_SET_OPTION(cert),
+ SSL_SET_OPTION(key) : SSL_SET_OPTION(primary.clientcert),
do_file_type(SSL_SET_OPTION(cert_type)) ) !=
GNUTLS_E_SUCCESS) {
failf(data, "error reading X.509 key or certificate file");
@@ -873,11 +674,11 @@ gtls_connect_step1(struct connectdata *conn,
}
}
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
/* put the credentials to the current session */
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
rc = gnutls_credentials_set(session, GNUTLS_CRD_SRP,
- BACKEND->srp_client_cred);
+ backend->srp_client_cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_credentials_set() failed: %s", gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
@@ -887,19 +688,22 @@ gtls_connect_step1(struct connectdata *conn,
#endif
{
rc = gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE,
- BACKEND->cred);
+ backend->cred);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_credentials_set() failed: %s", gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR;
}
}
+#ifndef CURL_DISABLE_PROXY
if(conn->proxy_ssl[sockindex].use) {
transport_ptr = conn->proxy_ssl[sockindex].backend->session;
gnutls_transport_push = Curl_gtls_push_ssl;
gnutls_transport_pull = Curl_gtls_pull_ssl;
}
- else {
+ else
+#endif
+ {
/* file descriptor for the socket */
transport_ptr = &conn->sock[sockindex];
gnutls_transport_push = Curl_gtls_push;
@@ -913,10 +717,6 @@ gtls_connect_step1(struct connectdata *conn,
gnutls_transport_set_push_function(session, gnutls_transport_push);
gnutls_transport_set_pull_function(session, gnutls_transport_pull);
- /* lowat must be set to zero when using custom push and pull functions. */
- gnutls_transport_set_lowat(session, 0);
-
-#ifdef HAS_OCSP
if(SSL_CONN_CONFIG(verifystatus)) {
rc = gnutls_ocsp_status_request_enable_client(session, NULL, 0, NULL);
if(rc != GNUTLS_E_SUCCESS) {
@@ -924,7 +724,6 @@ gtls_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
}
-#endif
/* This might be a reconnect, so we check for a session ID in the cache
to speed up things */
@@ -1016,25 +815,25 @@ gtls_connect_step3(struct connectdata *conn,
unsigned int verify_status = 0;
gnutls_x509_crt_t x509_cert, x509_issuer;
gnutls_datum_t issuerp;
- char certbuf[256] = ""; /* big enough? */
+ gnutls_datum_t certfields;
+ char certname[65] = ""; /* limited to 64 chars by ASN.1 */
size_t size;
time_t certclock;
const char *ptr;
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- gnutls_session_t session = BACKEND->session;
+ struct ssl_backend_data *backend = connssl->backend;
+ gnutls_session_t session = backend->session;
int rc;
-#ifdef HAS_ALPN
gnutls_datum_t proto;
-#endif
CURLcode result = CURLE_OK;
#ifndef CURL_DISABLE_VERBOSE_STRINGS
unsigned int algo;
unsigned int bits;
gnutls_protocol_t version = gnutls_protocol_get_version(session);
#endif
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
+ const char * const hostname = SSL_HOST_NAME();
+ long * const certverifyresult = &SSL_SET_OPTION_LVALUE(certverifyresult);
/* the name of the cipher suite used, e.g. ECDHE_RSA_AES_256_GCM_SHA384. */
ptr = gnutls_cipher_suite_get_name(gnutls_kx_get(session),
@@ -1055,7 +854,7 @@ gtls_connect_step3(struct connectdata *conn,
if(SSL_CONN_CONFIG(verifypeer) ||
SSL_CONN_CONFIG(verifyhost) ||
SSL_SET_OPTION(issuercert)) {
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
&& SSL_SET_OPTION(username) != NULL
&& !SSL_CONN_CONFIG(verifypeer)
@@ -1066,8 +865,9 @@ gtls_connect_step3(struct connectdata *conn,
else {
#endif
failf(data, "failed to get server cert");
+ *certverifyresult = GNUTLS_E_NO_CERTIFICATE_FOUND;
return CURLE_PEER_FAILED_VERIFICATION;
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
}
#endif
}
@@ -1102,9 +902,12 @@ gtls_connect_step3(struct connectdata *conn,
rc = gnutls_certificate_verify_peers2(session, &verify_status);
if(rc < 0) {
failf(data, "server cert verify failed: %d", rc);
+ *certverifyresult = rc;
return CURLE_SSL_CONNECT_ERROR;
}
+ *certverifyresult = verify_status;
+
/* verify_status is a bitmask of gnutls_certificate_status bits */
if(verify_status & GNUTLS_CERT_INVALID) {
if(SSL_CONN_CONFIG(verifypeer)) {
@@ -1123,7 +926,6 @@ gtls_connect_step3(struct connectdata *conn,
else
infof(data, "\t server certificate verification SKIPPED\n");
-#ifdef HAS_OCSP
if(SSL_CONN_CONFIG(verifystatus)) {
if(gnutls_ocsp_status_request_is_checked(session, 0) == 0) {
gnutls_datum_t status_request;
@@ -1226,7 +1028,6 @@ gtls_connect_step3(struct connectdata *conn,
}
else
infof(data, "\t server certificate status verification SKIPPED\n");
-#endif
/* initialize an X.509 certificate structure. */
gnutls_x509_crt_init(&x509_cert);
@@ -1253,11 +1054,11 @@ gtls_connect_step3(struct connectdata *conn,
SSL_SET_OPTION(issuercert)?SSL_SET_OPTION(issuercert):"none");
}
- size = sizeof(certbuf);
+ size = sizeof(certname);
rc = gnutls_x509_crt_get_dn_by_oid(x509_cert, GNUTLS_OID_X520_COMMON_NAME,
0, /* the first and only one */
FALSE,
- certbuf,
+ certname,
&size);
if(rc) {
infof(data, "error fetching CN from cert:%s\n",
@@ -1313,21 +1114,18 @@ gtls_connect_step3(struct connectdata *conn,
}
#endif
if(!rc) {
- const char * const dispname = SSL_IS_PROXY() ?
- conn->http_proxy.host.dispname : conn->host.dispname;
-
if(SSL_CONN_CONFIG(verifyhost)) {
failf(data, "SSL: certificate subject name (%s) does not match "
- "target host name '%s'", certbuf, dispname);
+ "target host name '%s'", certname, SSL_HOST_DISPNAME());
gnutls_x509_crt_deinit(x509_cert);
return CURLE_PEER_FAILED_VERIFICATION;
}
else
infof(data, "\t common name: %s (does not match '%s')\n",
- certbuf, dispname);
+ certname, SSL_HOST_DISPNAME());
}
else
- infof(data, "\t common name: %s (matched)\n", certbuf);
+ infof(data, "\t common name: %s (matched)\n", certname);
/* Check for time-based validity */
certclock = gnutls_x509_crt_get_expiration_time(x509_cert);
@@ -1335,6 +1133,7 @@ gtls_connect_step3(struct connectdata *conn,
if(certclock == (time_t)-1) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data, "server cert expiration date verify failed");
+ *certverifyresult = GNUTLS_CERT_EXPIRED;
gnutls_x509_crt_deinit(x509_cert);
return CURLE_SSL_CONNECT_ERROR;
}
@@ -1345,6 +1144,7 @@ gtls_connect_step3(struct connectdata *conn,
if(certclock < time(NULL)) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data, "server certificate expiration date has passed.");
+ *certverifyresult = GNUTLS_CERT_EXPIRED;
gnutls_x509_crt_deinit(x509_cert);
return CURLE_PEER_FAILED_VERIFICATION;
}
@@ -1360,6 +1160,7 @@ gtls_connect_step3(struct connectdata *conn,
if(certclock == (time_t)-1) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data, "server cert activation date verify failed");
+ *certverifyresult = GNUTLS_CERT_NOT_ACTIVATED;
gnutls_x509_crt_deinit(x509_cert);
return CURLE_SSL_CONNECT_ERROR;
}
@@ -1370,6 +1171,7 @@ gtls_connect_step3(struct connectdata *conn,
if(certclock > time(NULL)) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data, "server certificate not activated yet.");
+ *certverifyresult = GNUTLS_CERT_NOT_ACTIVATED;
gnutls_x509_crt_deinit(x509_cert);
return CURLE_PEER_FAILED_VERIFICATION;
}
@@ -1412,24 +1214,28 @@ gtls_connect_step3(struct connectdata *conn,
gnutls_x509_crt_get_version(x509_cert));
- size = sizeof(certbuf);
- gnutls_x509_crt_get_dn(x509_cert, certbuf, &size);
- infof(data, "\t subject: %s\n", certbuf);
+ rc = gnutls_x509_crt_get_dn2(x509_cert, &certfields);
+ if(rc)
+ infof(data, "Failed to get certificate name\n");
+ else {
+ infof(data, "\t subject: %s\n", certfields.data);
- certclock = gnutls_x509_crt_get_activation_time(x509_cert);
- showtime(data, "start date", certclock);
+ certclock = gnutls_x509_crt_get_activation_time(x509_cert);
+ showtime(data, "start date", certclock);
- certclock = gnutls_x509_crt_get_expiration_time(x509_cert);
- showtime(data, "expire date", certclock);
+ certclock = gnutls_x509_crt_get_expiration_time(x509_cert);
+ showtime(data, "expire date", certclock);
+ }
- size = sizeof(certbuf);
- gnutls_x509_crt_get_issuer_dn(x509_cert, certbuf, &size);
- infof(data, "\t issuer: %s\n", certbuf);
+ rc = gnutls_x509_crt_get_issuer_dn2(x509_cert, &certfields);
+ if(rc)
+ infof(data, "Failed to get certificate issuer\n");
+ else
+ infof(data, "\t issuer: %s\n", certfields.data);
#endif
gnutls_x509_crt_deinit(x509_cert);
-#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
rc = gnutls_alpn_get_selected_protocol(session, &proto);
if(rc == 0) {
@@ -1455,7 +1261,6 @@ gtls_connect_step3(struct connectdata *conn,
Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
}
-#endif
conn->ssl[sockindex].state = ssl_connection_complete;
conn->recv[sockindex] = gtls_recv;
@@ -1573,14 +1378,18 @@ static bool Curl_gtls_data_pending(const struct connectdata *conn,
{
const struct ssl_connect_data *connssl = &conn->ssl[connindex];
bool res = FALSE;
- if(BACKEND->session &&
- 0 != gnutls_record_check_pending(BACKEND->session))
+ struct ssl_backend_data *backend = connssl->backend;
+ if(backend->session &&
+ 0 != gnutls_record_check_pending(backend->session))
res = TRUE;
+#ifndef CURL_DISABLE_PROXY
connssl = &conn->proxy_ssl[connindex];
- if(BACKEND->session &&
- 0 != gnutls_record_check_pending(BACKEND->session))
+ backend = connssl->backend;
+ if(backend->session &&
+ 0 != gnutls_record_check_pending(backend->session))
res = TRUE;
+#endif
return res;
}
@@ -1592,7 +1401,8 @@ static ssize_t gtls_send(struct connectdata *conn,
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- ssize_t rc = gnutls_record_send(BACKEND->session, mem, len);
+ struct ssl_backend_data *backend = connssl->backend;
+ ssize_t rc = gnutls_record_send(backend->session, mem, len);
if(rc < 0) {
*curlcode = (rc == GNUTLS_E_AGAIN)
@@ -1607,19 +1417,20 @@ static ssize_t gtls_send(struct connectdata *conn,
static void close_one(struct ssl_connect_data *connssl)
{
- if(BACKEND->session) {
- gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
- gnutls_deinit(BACKEND->session);
- BACKEND->session = NULL;
+ struct ssl_backend_data *backend = connssl->backend;
+ if(backend->session) {
+ gnutls_bye(backend->session, GNUTLS_SHUT_WR);
+ gnutls_deinit(backend->session);
+ backend->session = NULL;
}
- if(BACKEND->cred) {
- gnutls_certificate_free_credentials(BACKEND->cred);
- BACKEND->cred = NULL;
+ if(backend->cred) {
+ gnutls_certificate_free_credentials(backend->cred);
+ backend->cred = NULL;
}
-#ifdef USE_TLS_SRP
- if(BACKEND->srp_client_cred) {
- gnutls_srp_free_client_credentials(BACKEND->srp_client_cred);
- BACKEND->srp_client_cred = NULL;
+#ifdef HAVE_GNUTLS_SRP
+ if(backend->srp_client_cred) {
+ gnutls_srp_free_client_credentials(backend->srp_client_cred);
+ backend->srp_client_cred = NULL;
}
#endif
}
@@ -1627,7 +1438,9 @@ static void close_one(struct ssl_connect_data *connssl)
static void Curl_gtls_close(struct connectdata *conn, int sockindex)
{
close_one(&conn->ssl[sockindex]);
+#ifndef CURL_DISABLE_PROXY
close_one(&conn->proxy_ssl[sockindex]);
+#endif
}
/*
@@ -1637,6 +1450,7 @@ static void Curl_gtls_close(struct connectdata *conn, int sockindex)
static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
int retval = 0;
struct Curl_easy *data = conn->data;
@@ -1647,10 +1461,10 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
we do not send one. Let's hope other servers do the same... */
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
- gnutls_bye(BACKEND->session, GNUTLS_SHUT_WR);
+ gnutls_bye(backend->session, GNUTLS_SHUT_WR);
#endif
- if(BACKEND->session) {
+ if(backend->session) {
ssize_t result;
bool done = FALSE;
char buf[120];
@@ -1661,7 +1475,7 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
if(what > 0) {
/* Something to read, let's do it and hope that it is the close
notify alert from the server */
- result = gnutls_record_recv(BACKEND->session,
+ result = gnutls_record_recv(backend->session,
buf, sizeof(buf));
switch(result) {
case 0:
@@ -1691,18 +1505,18 @@ static int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
done = TRUE;
}
}
- gnutls_deinit(BACKEND->session);
+ gnutls_deinit(backend->session);
}
- gnutls_certificate_free_credentials(BACKEND->cred);
+ gnutls_certificate_free_credentials(backend->cred);
-#ifdef USE_TLS_SRP
+#ifdef HAVE_GNUTLS_SRP
if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
&& SSL_SET_OPTION(username) != NULL)
- gnutls_srp_free_client_credentials(BACKEND->srp_client_cred);
+ gnutls_srp_free_client_credentials(backend->srp_client_cred);
#endif
- BACKEND->cred = NULL;
- BACKEND->session = NULL;
+ backend->cred = NULL;
+ backend->session = NULL;
return retval;
}
@@ -1714,9 +1528,10 @@ static ssize_t gtls_recv(struct connectdata *conn, /* connection data */
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[num];
+ struct ssl_backend_data *backend = connssl->backend;
ssize_t ret;
- ret = gnutls_record_recv(BACKEND->session, buf, buffersize);
+ ret = gnutls_record_recv(backend->session, buf, buffersize);
if((ret == GNUTLS_E_AGAIN) || (ret == GNUTLS_E_INTERRUPTED)) {
*curlcode = CURLE_AGAIN;
return -1;
@@ -1832,18 +1647,15 @@ static CURLcode Curl_gtls_sha256sum(const unsigned char *tmp, /* input */
static bool Curl_gtls_cert_status_request(void)
{
-#ifdef HAS_OCSP
return TRUE;
-#else
- return FALSE;
-#endif
}
static void *Curl_gtls_get_internals(struct ssl_connect_data *connssl,
CURLINFO info UNUSED_PARAM)
{
+ struct ssl_backend_data *backend = connssl->backend;
(void)info;
- return BACKEND->session;
+ return backend->session;
}
const struct Curl_ssl Curl_ssl_gnutls = {
diff --git a/lib/vtls/keylog.c b/lib/vtls/keylog.c
new file mode 100644
index 000000000..70d22ecf0
--- /dev/null
+++ b/lib/vtls/keylog.c
@@ -0,0 +1,156 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curl_setup.h"
+
+#include "keylog.h"
+
+/* The last #include files should be: */
+#include "curl_memory.h"
+#include "memdebug.h"
+
+#define KEYLOG_LABEL_MAXLEN (sizeof("CLIENT_HANDSHAKE_TRAFFIC_SECRET") - 1)
+
+#define CLIENT_RANDOM_SIZE 32
+
+/*
+ * The master secret in TLS 1.2 and before is always 48 bytes. In TLS 1.3, the
+ * secret size depends on the cipher suite's hash function which is 32 bytes
+ * for SHA-256 and 48 bytes for SHA-384.
+ */
+#define SECRET_MAXLEN 48
+
+
+/* The fp for the open SSLKEYLOGFILE, or NULL if not open */
+static FILE *keylog_file_fp;
+
+void
+Curl_tls_keylog_open(void)
+{
+ char *keylog_file_name;
+
+ if(!keylog_file_fp) {
+ keylog_file_name = curl_getenv("SSLKEYLOGFILE");
+ if(keylog_file_name) {
+ keylog_file_fp = fopen(keylog_file_name, FOPEN_APPENDTEXT);
+ if(keylog_file_fp) {
+#ifdef WIN32
+ if(setvbuf(keylog_file_fp, NULL, _IONBF, 0))
+#else
+ if(setvbuf(keylog_file_fp, NULL, _IOLBF, 4096))
+#endif
+ {
+ fclose(keylog_file_fp);
+ keylog_file_fp = NULL;
+ }
+ }
+ Curl_safefree(keylog_file_name);
+ }
+ }
+}
+
+void
+Curl_tls_keylog_close(void)
+{
+ if(keylog_file_fp) {
+ fclose(keylog_file_fp);
+ keylog_file_fp = NULL;
+ }
+}
+
+bool
+Curl_tls_keylog_enabled(void)
+{
+ return keylog_file_fp != NULL;
+}
+
+bool
+Curl_tls_keylog_write_line(const char *line)
+{
+ /* The current maximum valid keylog line length LF and NUL is 195. */
+ size_t linelen;
+ char buf[256];
+
+ if(!keylog_file_fp || !line) {
+ return false;
+ }
+
+ linelen = strlen(line);
+ if(linelen == 0 || linelen > sizeof(buf) - 2) {
+ /* Empty line or too big to fit in a LF and NUL. */
+ return false;
+ }
+
+ memcpy(buf, line, linelen);
+ if(line[linelen - 1] != '\n') {
+ buf[linelen++] = '\n';
+ }
+ buf[linelen] = '\0';
+
+ /* Using fputs here instead of fprintf since libcurl's fprintf replacement
+ may not be thread-safe. */
+ fputs(buf, keylog_file_fp);
+ return true;
+}
+
+bool
+Curl_tls_keylog_write(const char *label,
+ const unsigned char client_random[CLIENT_RANDOM_SIZE],
+ const unsigned char *secret, size_t secretlen)
+{
+ const char *hex = "0123456789ABCDEF";
+ size_t pos, i;
+ char line[KEYLOG_LABEL_MAXLEN + 1 + 2 * CLIENT_RANDOM_SIZE + 1 +
+ 2 * SECRET_MAXLEN + 1 + 1];
+
+ if(!keylog_file_fp) {
+ return false;
+ }
+
+ pos = strlen(label);
+ if(pos > KEYLOG_LABEL_MAXLEN || !secretlen || secretlen > SECRET_MAXLEN) {
+ /* Should never happen - sanity check anyway. */
+ return false;
+ }
+
+ memcpy(line, label, pos);
+ line[pos++] = ' ';
+
+ /* Client Random */
+ for(i = 0; i < CLIENT_RANDOM_SIZE; i++) {
+ line[pos++] = hex[client_random[i] >> 4];
+ line[pos++] = hex[client_random[i] & 0xF];
+ }
+ line[pos++] = ' ';
+
+ /* Secret */
+ for(i = 0; i < secretlen; i++) {
+ line[pos++] = hex[secret[i] >> 4];
+ line[pos++] = hex[secret[i] & 0xF];
+ }
+ line[pos++] = '\n';
+ line[pos] = '\0';
+
+ /* Using fputs here instead of fprintf since libcurl's fprintf replacement
+ may not be thread-safe. */
+ fputs(line, keylog_file_fp);
+ return true;
+}
diff --git a/lib/vtls/keylog.h b/lib/vtls/keylog.h
new file mode 100644
index 000000000..c6b99db93
--- /dev/null
+++ b/lib/vtls/keylog.h
@@ -0,0 +1,56 @@
+#ifndef HEADER_CURL_KEYLOG_H
+#define HEADER_CURL_KEYLOG_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curl_setup.h"
+
+/*
+ * Opens the TLS key log file if requested by the user. The SSLKEYLOGFILE
+ * environment variable specifies the output file.
+ */
+void Curl_tls_keylog_open(void);
+
+/*
+ * Closes the TLS key log file if not already.
+ */
+void Curl_tls_keylog_close(void);
+
+/*
+ * Returns true if the user successfully enabled the TLS key log file.
+ */
+bool Curl_tls_keylog_enabled(void);
+
+/*
+ * Appends a key log file entry.
+ * Returns true iff the key log file is open and a valid entry was provided.
+ */
+bool Curl_tls_keylog_write(const char *label,
+ const unsigned char client_random[32],
+ const unsigned char *secret, size_t secretlen);
+
+/*
+ * Appends a line to the key log file, ensure it is terminated by a LF.
+ * Returns true iff the key log file is open and a valid line was provided.
+ */
+bool Curl_tls_keylog_write_line(const char *line);
+
+#endif /* HEADER_CURL_KEYLOG_H */
diff --git a/lib/vtls/mbedtls.c b/lib/vtls/mbedtls.c
index e34ec9d13..4e5f6574f 100644
--- a/lib/vtls/mbedtls.c
+++ b/lib/vtls/mbedtls.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,9 @@
#ifdef USE_MBEDTLS
+/* Define this to enable lots of debugging for mbedTLS */
+/* #define MBEDTLS_DEBUG */
+
#include <mbedtls/version.h>
#if MBEDTLS_VERSION_NUMBER >= 0x02040000
#include <mbedtls/net_sockets.h>
@@ -46,6 +49,12 @@
#include <mbedtls/ctr_drbg.h>
#include <mbedtls/sha256.h>
+#if MBEDTLS_VERSION_MAJOR >= 2
+# ifdef MBEDTLS_DEBUG
+# include <mbedtls/debug.h>
+# endif
+#endif
+
#include "urldata.h"
#include "sendf.h"
#include "inet_pton.h"
@@ -55,7 +64,7 @@
#include "connect.h" /* for the connect timeout */
#include "select.h"
#include "multiif.h"
-#include "polarssl_threadlock.h"
+#include "mbedtls_threadlock.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
@@ -75,8 +84,6 @@ struct ssl_backend_data {
const char *protocols[3];
};
-#define BACKEND connssl->backend
-
/* apply threading? */
#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
#define THREADING_SUPPORT
@@ -91,12 +98,12 @@ static int entropy_init_initialized = 0;
static void entropy_init_mutex(mbedtls_entropy_context *ctx)
{
/* lock 0 = entropy_init_mutex() */
- Curl_polarsslthreadlock_lock_function(0);
+ Curl_mbedtlsthreadlock_lock_function(0);
if(entropy_init_initialized == 0) {
mbedtls_entropy_init(ctx);
entropy_init_initialized = 1;
}
- Curl_polarsslthreadlock_unlock_function(0);
+ Curl_mbedtlsthreadlock_unlock_function(0);
}
/* end of entropy_init_mutex() */
@@ -105,9 +112,9 @@ static int entropy_func_mutex(void *data, unsigned char *output, size_t len)
{
int ret;
/* lock 1 = entropy_func_mutex() */
- Curl_polarsslthreadlock_lock_function(1);
+ Curl_mbedtlsthreadlock_lock_function(1);
ret = mbedtls_entropy_func(data, output, len);
- Curl_polarsslthreadlock_unlock_function(1);
+ Curl_mbedtlsthreadlock_unlock_function(1);
return ret;
}
@@ -115,9 +122,6 @@ static int entropy_func_mutex(void *data, unsigned char *output, size_t len)
#endif /* THREADING_SUPPORT */
-/* Define this to enable lots of debugging for mbedTLS */
-#undef MBEDTLS_DEBUG
-
#ifdef MBEDTLS_DEBUG
static void mbed_debug(void *context, int level, const char *f_name,
int line_nb, const char *line)
@@ -196,6 +200,7 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
int mbedtls_ver_min = MBEDTLS_SSL_MINOR_VERSION_1;
int mbedtls_ver_max = MBEDTLS_SSL_MINOR_VERSION_1;
long ssl_version = SSL_CONN_CONFIG(version);
@@ -227,9 +232,9 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
return result;
}
- mbedtls_ssl_conf_min_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_min_version(&backend->config, MBEDTLS_SSL_MAJOR_VERSION_3,
mbedtls_ver_min);
- mbedtls_ssl_conf_max_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_max_version(&backend->config, MBEDTLS_SSL_MAJOR_VERSION_3,
mbedtls_ver_max);
return result;
@@ -240,15 +245,21 @@ mbed_connect_step1(struct connectdata *conn,
int sockindex)
{
struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
- char * const ssl_cert = SSL_SET_OPTION(cert);
+ char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+#else
+ const char * const hostname = conn->host.name;
+ const long int port = conn->remote_port;
+#endif
int ret = -1;
char errorbuf[128];
errorbuf[0] = 0;
@@ -261,9 +272,9 @@ mbed_connect_step1(struct connectdata *conn,
#ifdef THREADING_SUPPORT
entropy_init_mutex(&ts_entropy);
- mbedtls_ctr_drbg_init(&BACKEND->ctr_drbg);
+ mbedtls_ctr_drbg_init(&backend->ctr_drbg);
- ret = mbedtls_ctr_drbg_seed(&BACKEND->ctr_drbg, entropy_func_mutex,
+ ret = mbedtls_ctr_drbg_seed(&backend->ctr_drbg, entropy_func_mutex,
&ts_entropy, NULL, 0);
if(ret) {
#ifdef MBEDTLS_ERROR_C
@@ -273,11 +284,11 @@ mbed_connect_step1(struct connectdata *conn,
-ret, errorbuf);
}
#else
- mbedtls_entropy_init(&BACKEND->entropy);
- mbedtls_ctr_drbg_init(&BACKEND->ctr_drbg);
+ mbedtls_entropy_init(&backend->entropy);
+ mbedtls_ctr_drbg_init(&backend->ctr_drbg);
- ret = mbedtls_ctr_drbg_seed(&BACKEND->ctr_drbg, mbedtls_entropy_func,
- &BACKEND->entropy, NULL, 0);
+ ret = mbedtls_ctr_drbg_seed(&backend->ctr_drbg, mbedtls_entropy_func,
+ &backend->entropy, NULL, 0);
if(ret) {
#ifdef MBEDTLS_ERROR_C
mbedtls_strerror(ret, errorbuf, sizeof(errorbuf));
@@ -288,10 +299,10 @@ mbed_connect_step1(struct connectdata *conn,
#endif /* THREADING_SUPPORT */
/* Load the trusted CA */
- mbedtls_x509_crt_init(&BACKEND->cacert);
+ mbedtls_x509_crt_init(&backend->cacert);
if(ssl_cafile) {
- ret = mbedtls_x509_crt_parse_file(&BACKEND->cacert, ssl_cafile);
+ ret = mbedtls_x509_crt_parse_file(&backend->cacert, ssl_cafile);
if(ret<0) {
#ifdef MBEDTLS_ERROR_C
@@ -306,7 +317,7 @@ mbed_connect_step1(struct connectdata *conn,
}
if(ssl_capath) {
- ret = mbedtls_x509_crt_parse_path(&BACKEND->cacert, ssl_capath);
+ ret = mbedtls_x509_crt_parse_path(&backend->cacert, ssl_capath);
if(ret<0) {
#ifdef MBEDTLS_ERROR_C
@@ -321,10 +332,10 @@ mbed_connect_step1(struct connectdata *conn,
}
/* Load the client certificate */
- mbedtls_x509_crt_init(&BACKEND->clicert);
+ mbedtls_x509_crt_init(&backend->clicert);
if(ssl_cert) {
- ret = mbedtls_x509_crt_parse_file(&BACKEND->clicert, ssl_cert);
+ ret = mbedtls_x509_crt_parse_file(&backend->clicert, ssl_cert);
if(ret) {
#ifdef MBEDTLS_ERROR_C
@@ -338,13 +349,13 @@ mbed_connect_step1(struct connectdata *conn,
}
/* Load the client private key */
- mbedtls_pk_init(&BACKEND->pk);
+ mbedtls_pk_init(&backend->pk);
if(SSL_SET_OPTION(key)) {
- ret = mbedtls_pk_parse_keyfile(&BACKEND->pk, SSL_SET_OPTION(key),
+ ret = mbedtls_pk_parse_keyfile(&backend->pk, SSL_SET_OPTION(key),
SSL_SET_OPTION(key_passwd));
- if(ret == 0 && !(mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_RSA) ||
- mbedtls_pk_can_do(&BACKEND->pk, MBEDTLS_PK_ECKEY)))
+ if(ret == 0 && !(mbedtls_pk_can_do(&backend->pk, MBEDTLS_PK_RSA) ||
+ mbedtls_pk_can_do(&backend->pk, MBEDTLS_PK_ECKEY)))
ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
if(ret) {
@@ -359,10 +370,10 @@ mbed_connect_step1(struct connectdata *conn,
}
/* Load the CRL */
- mbedtls_x509_crl_init(&BACKEND->crl);
+ mbedtls_x509_crl_init(&backend->crl);
if(ssl_crlfile) {
- ret = mbedtls_x509_crl_parse_file(&BACKEND->crl, ssl_crlfile);
+ ret = mbedtls_x509_crl_parse_file(&backend->crl, ssl_crlfile);
if(ret) {
#ifdef MBEDTLS_ERROR_C
@@ -377,14 +388,14 @@ mbed_connect_step1(struct connectdata *conn,
infof(data, "mbedTLS: Connecting to %s:%ld\n", hostname, port);
- mbedtls_ssl_config_init(&BACKEND->config);
+ mbedtls_ssl_config_init(&backend->config);
- mbedtls_ssl_init(&BACKEND->ssl);
- if(mbedtls_ssl_setup(&BACKEND->ssl, &BACKEND->config)) {
+ mbedtls_ssl_init(&backend->ssl);
+ if(mbedtls_ssl_setup(&backend->ssl, &backend->config)) {
failf(data, "mbedTLS: ssl_init failed");
return CURLE_SSL_CONNECT_ERROR;
}
- ret = mbedtls_ssl_config_defaults(&BACKEND->config,
+ ret = mbedtls_ssl_config_defaults(&backend->config,
MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM,
MBEDTLS_SSL_PRESET_DEFAULT);
@@ -394,20 +405,20 @@ mbed_connect_step1(struct connectdata *conn,
}
/* new profile with RSA min key len = 1024 ... */
- mbedtls_ssl_conf_cert_profile(&BACKEND->config,
+ mbedtls_ssl_conf_cert_profile(&backend->config,
&mbedtls_x509_crt_profile_fr);
switch(SSL_CONN_CONFIG(version)) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- mbedtls_ssl_conf_min_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_min_version(&backend->config, MBEDTLS_SSL_MAJOR_VERSION_3,
MBEDTLS_SSL_MINOR_VERSION_1);
infof(data, "mbedTLS: Set min SSL version to TLS 1.0\n");
break;
case CURL_SSLVERSION_SSLv3:
- mbedtls_ssl_conf_min_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_min_version(&backend->config, MBEDTLS_SSL_MAJOR_VERSION_3,
MBEDTLS_SSL_MINOR_VERSION_0);
- mbedtls_ssl_conf_max_version(&BACKEND->config, MBEDTLS_SSL_MAJOR_VERSION_3,
+ mbedtls_ssl_conf_max_version(&backend->config, MBEDTLS_SSL_MAJOR_VERSION_3,
MBEDTLS_SSL_MINOR_VERSION_0);
infof(data, "mbedTLS: Set SSL version to SSLv3\n");
break;
@@ -426,25 +437,25 @@ mbed_connect_step1(struct connectdata *conn,
return CURLE_SSL_CONNECT_ERROR;
}
- mbedtls_ssl_conf_authmode(&BACKEND->config, MBEDTLS_SSL_VERIFY_OPTIONAL);
+ mbedtls_ssl_conf_authmode(&backend->config, MBEDTLS_SSL_VERIFY_OPTIONAL);
- mbedtls_ssl_conf_rng(&BACKEND->config, mbedtls_ctr_drbg_random,
- &BACKEND->ctr_drbg);
- mbedtls_ssl_set_bio(&BACKEND->ssl, &conn->sock[sockindex],
+ mbedtls_ssl_conf_rng(&backend->config, mbedtls_ctr_drbg_random,
+ &backend->ctr_drbg);
+ mbedtls_ssl_set_bio(&backend->ssl, &conn->sock[sockindex],
mbedtls_net_send,
mbedtls_net_recv,
NULL /* rev_timeout() */);
- mbedtls_ssl_conf_ciphersuites(&BACKEND->config,
+ mbedtls_ssl_conf_ciphersuites(&backend->config,
mbedtls_ssl_list_ciphersuites());
#if defined(MBEDTLS_SSL_RENEGOTIATION)
- mbedtls_ssl_conf_renegotiation(&BACKEND->config,
+ mbedtls_ssl_conf_renegotiation(&backend->config,
MBEDTLS_SSL_RENEGOTIATION_ENABLED);
#endif
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
- mbedtls_ssl_conf_session_tickets(&BACKEND->config,
+ mbedtls_ssl_conf_session_tickets(&backend->config,
MBEDTLS_SSL_SESSION_TICKETS_DISABLED);
#endif
@@ -454,7 +465,7 @@ mbed_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &old_session, NULL, sockindex)) {
- ret = mbedtls_ssl_set_session(&BACKEND->ssl, old_session);
+ ret = mbedtls_ssl_set_session(&backend->ssl, old_session);
if(ret) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "mbedtls_ssl_set_session returned -0x%x", -ret);
@@ -465,15 +476,15 @@ mbed_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_unlock(conn);
}
- mbedtls_ssl_conf_ca_chain(&BACKEND->config,
- &BACKEND->cacert,
- &BACKEND->crl);
+ mbedtls_ssl_conf_ca_chain(&backend->config,
+ &backend->cacert,
+ &backend->crl);
if(SSL_SET_OPTION(key)) {
- mbedtls_ssl_conf_own_cert(&BACKEND->config,
- &BACKEND->clicert, &BACKEND->pk);
+ mbedtls_ssl_conf_own_cert(&backend->config,
+ &backend->clicert, &backend->pk);
}
- if(mbedtls_ssl_set_hostname(&BACKEND->ssl, hostname)) {
+ if(mbedtls_ssl_set_hostname(&backend->ssl, hostname)) {
/* mbedtls_ssl_set_hostname() sets the name to use in CN/SAN checks *and*
the name to set in the SNI extension. So even if curl connects to a
host specified as an IP address, this function must be used. */
@@ -483,7 +494,7 @@ mbed_connect_step1(struct connectdata *conn,
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
- const char **p = &BACKEND->protocols[0];
+ const char **p = &backend->protocols[0];
#ifdef USE_NGHTTP2
if(data->set.httpversion >= CURL_HTTP_VERSION_2)
*p++ = NGHTTP2_PROTO_VERSION_ID;
@@ -492,19 +503,19 @@ mbed_connect_step1(struct connectdata *conn,
*p = NULL;
/* this function doesn't clone the protocols array, which is why we need
to keep it around */
- if(mbedtls_ssl_conf_alpn_protocols(&BACKEND->config,
- &BACKEND->protocols[0])) {
+ if(mbedtls_ssl_conf_alpn_protocols(&backend->config,
+ &backend->protocols[0])) {
failf(data, "Failed setting ALPN protocols");
return CURLE_SSL_CONNECT_ERROR;
}
- for(p = &BACKEND->protocols[0]; *p; ++p)
+ for(p = &backend->protocols[0]; *p; ++p)
infof(data, "ALPN, offering %s\n", *p);
}
#endif
#ifdef MBEDTLS_DEBUG
/* In order to make that work in mbedtls MBEDTLS_DEBUG_C must be defined. */
- mbedtls_ssl_conf_dbg(&BACKEND->config, mbed_debug, data);
+ mbedtls_ssl_conf_dbg(&backend->config, mbed_debug, data);
/* - 0 No debug
* - 1 Error
* - 2 State change
@@ -516,7 +527,7 @@ mbed_connect_step1(struct connectdata *conn,
/* give application a chance to interfere with mbedTLS set up. */
if(data->set.ssl.fsslctx) {
- ret = (*data->set.ssl.fsslctx)(data, &BACKEND->config,
+ ret = (*data->set.ssl.fsslctx)(data, &backend->config,
data->set.ssl.fsslctxp);
if(ret) {
failf(data, "error signaled by ssl ctx callback");
@@ -535,16 +546,22 @@ mbed_connect_step2(struct connectdata *conn,
{
int ret;
struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
const mbedtls_x509_crt *peercert;
+#ifndef CURL_DISABLE_PROXY
const char * const pinnedpubkey = SSL_IS_PROXY() ?
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+#else
+ const char * const pinnedpubkey =
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+#endif
conn->recv[sockindex] = mbed_recv;
conn->send[sockindex] = mbed_send;
- ret = mbedtls_ssl_handshake(&BACKEND->ssl);
+ ret = mbedtls_ssl_handshake(&backend->ssl);
if(ret == MBEDTLS_ERR_SSL_WANT_READ) {
connssl->connecting_state = ssl_connect_2_reading;
@@ -566,10 +583,10 @@ mbed_connect_step2(struct connectdata *conn,
}
infof(data, "mbedTLS: Handshake complete, cipher is %s\n",
- mbedtls_ssl_get_ciphersuite(&BACKEND->ssl)
+ mbedtls_ssl_get_ciphersuite(&backend->ssl)
);
- ret = mbedtls_ssl_get_verify_result(&BACKEND->ssl);
+ ret = mbedtls_ssl_get_verify_result(&backend->ssl);
if(!SSL_CONN_CONFIG(verifyhost))
/* Ignore hostname errors if verifyhost is disabled */
@@ -594,7 +611,7 @@ mbed_connect_step2(struct connectdata *conn,
return CURLE_PEER_FAILED_VERIFICATION;
}
- peercert = mbedtls_ssl_get_peer_cert(&BACKEND->ssl);
+ peercert = mbedtls_ssl_get_peer_cert(&backend->ssl);
if(peercert && data->set.verbose) {
const size_t bufsize = 16384;
@@ -664,7 +681,7 @@ mbed_connect_step2(struct connectdata *conn,
#ifdef HAS_ALPN
if(conn->bits.tls_enable_alpn) {
- const char *next_protocol = mbedtls_ssl_get_alpn_protocol(&BACKEND->ssl);
+ const char *next_protocol = mbedtls_ssl_get_alpn_protocol(&backend->ssl);
if(next_protocol) {
infof(data, "ALPN, server accepted to use %s\n", next_protocol);
@@ -701,6 +718,7 @@ mbed_connect_step3(struct connectdata *conn,
{
CURLcode retcode = CURLE_OK;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
struct Curl_easy *data = conn->data;
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
@@ -716,7 +734,7 @@ mbed_connect_step3(struct connectdata *conn,
mbedtls_ssl_session_init(our_ssl_sessionid);
- ret = mbedtls_ssl_get_session(&BACKEND->ssl, our_ssl_sessionid);
+ ret = mbedtls_ssl_get_session(&backend->ssl, our_ssl_sessionid);
if(ret) {
if(ret != MBEDTLS_ERR_SSL_ALLOC_FAILED)
mbedtls_ssl_session_free(our_ssl_sessionid);
@@ -750,9 +768,10 @@ static ssize_t mbed_send(struct connectdata *conn, int sockindex,
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
int ret = -1;
- ret = mbedtls_ssl_write(&BACKEND->ssl,
+ ret = mbedtls_ssl_write(&backend->ssl,
(unsigned char *)mem, len);
if(ret < 0) {
@@ -772,15 +791,16 @@ static void Curl_mbedtls_close_all(struct Curl_easy *data)
static void Curl_mbedtls_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- mbedtls_pk_free(&BACKEND->pk);
- mbedtls_x509_crt_free(&BACKEND->clicert);
- mbedtls_x509_crt_free(&BACKEND->cacert);
- mbedtls_x509_crl_free(&BACKEND->crl);
- mbedtls_ssl_config_free(&BACKEND->config);
- mbedtls_ssl_free(&BACKEND->ssl);
- mbedtls_ctr_drbg_free(&BACKEND->ctr_drbg);
+ struct ssl_backend_data *backend = connssl->backend;
+ mbedtls_pk_free(&backend->pk);
+ mbedtls_x509_crt_free(&backend->clicert);
+ mbedtls_x509_crt_free(&backend->cacert);
+ mbedtls_x509_crl_free(&backend->crl);
+ mbedtls_ssl_config_free(&backend->config);
+ mbedtls_ssl_free(&backend->ssl);
+ mbedtls_ctr_drbg_free(&backend->ctr_drbg);
#ifndef THREADING_SUPPORT
- mbedtls_entropy_free(&BACKEND->entropy);
+ mbedtls_entropy_free(&backend->entropy);
#endif /* THREADING_SUPPORT */
}
@@ -789,11 +809,12 @@ static ssize_t mbed_recv(struct connectdata *conn, int num,
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[num];
+ struct ssl_backend_data *backend = connssl->backend;
int ret = -1;
ssize_t len = -1;
memset(buf, 0, buffersize);
- ret = mbedtls_ssl_read(&BACKEND->ssl, (unsigned char *)buf,
+ ret = mbedtls_ssl_read(&backend->ssl, (unsigned char *)buf,
buffersize);
if(ret <= 0) {
@@ -933,7 +954,7 @@ mbed_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : (time_t)timeout_ms);
+ nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -1017,19 +1038,20 @@ static CURLcode Curl_mbedtls_connect(struct connectdata *conn, int sockindex)
*/
static int Curl_mbedtls_init(void)
{
- return Curl_polarsslthreadlock_thread_setup();
+ return Curl_mbedtlsthreadlock_thread_setup();
}
static void Curl_mbedtls_cleanup(void)
{
- (void)Curl_polarsslthreadlock_thread_cleanup();
+ (void)Curl_mbedtlsthreadlock_thread_cleanup();
}
static bool Curl_mbedtls_data_pending(const struct connectdata *conn,
int sockindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- return mbedtls_ssl_get_bytes_avail(&BACKEND->ssl) != 0;
+ struct ssl_backend_data *backend = connssl->backend;
+ return mbedtls_ssl_get_bytes_avail(&backend->ssl) != 0;
}
static CURLcode Curl_mbedtls_sha256sum(const unsigned char *input,
@@ -1051,8 +1073,9 @@ static CURLcode Curl_mbedtls_sha256sum(const unsigned char *input,
static void *Curl_mbedtls_get_internals(struct ssl_connect_data *connssl,
CURLINFO info UNUSED_PARAM)
{
+ struct ssl_backend_data *backend = connssl->backend;
(void)info;
- return &BACKEND->ssl;
+ return &backend->ssl;
}
const struct Curl_ssl Curl_ssl_mbedtls = {
diff --git a/lib/vtls/mbedtls.h b/lib/vtls/mbedtls.h
index 4a938605b..0cc64b399 100644
--- a/lib/vtls/mbedtls.h
+++ b/lib/vtls/mbedtls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
diff --git a/lib/vtls/polarssl_threadlock.c b/lib/vtls/mbedtls_threadlock.c
index 27c94b11e..4d672f106 100644
--- a/lib/vtls/polarssl_threadlock.c
+++ b/lib/vtls/mbedtls_threadlock.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013-2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -22,19 +22,19 @@
***************************************************************************/
#include "curl_setup.h"
-#if (defined(USE_POLARSSL) || defined(USE_MBEDTLS)) && \
- ((defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
- (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)))
+#if defined(USE_MBEDTLS) && \
+ ((defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
+ (defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)))
#if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
# include <pthread.h>
-# define POLARSSL_MUTEX_T pthread_mutex_t
+# define MBEDTLS_MUTEX_T pthread_mutex_t
#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
# include <process.h>
-# define POLARSSL_MUTEX_T HANDLE
+# define MBEDTLS_MUTEX_T HANDLE
#endif
-#include "polarssl_threadlock.h"
+#include "mbedtls_threadlock.h"
#include "curl_printf.h"
#include "curl_memory.h"
/* The last #include file should be: */
@@ -43,14 +43,14 @@
/* number of thread locks */
#define NUMT 2
-/* This array will store all of the mutexes available to PolarSSL. */
-static POLARSSL_MUTEX_T *mutex_buf = NULL;
+/* This array will store all of the mutexes available to Mbedtls. */
+static MBEDTLS_MUTEX_T *mutex_buf = NULL;
-int Curl_polarsslthreadlock_thread_setup(void)
+int Curl_mbedtlsthreadlock_thread_setup(void)
{
int i;
- mutex_buf = calloc(NUMT * sizeof(POLARSSL_MUTEX_T), 1);
+ mutex_buf = calloc(NUMT * sizeof(MBEDTLS_MUTEX_T), 1);
if(!mutex_buf)
return 0; /* error, no number of threads defined */
@@ -70,7 +70,7 @@ int Curl_polarsslthreadlock_thread_setup(void)
return 1; /* OK */
}
-int Curl_polarsslthreadlock_thread_cleanup(void)
+int Curl_mbedtlsthreadlock_thread_cleanup(void)
{
int i;
@@ -95,7 +95,7 @@ int Curl_polarsslthreadlock_thread_cleanup(void)
return 1; /* OK */
}
-int Curl_polarsslthreadlock_lock_function(int n)
+int Curl_mbedtlsthreadlock_lock_function(int n)
{
if(n < NUMT) {
int ret;
@@ -103,14 +103,14 @@ int Curl_polarsslthreadlock_lock_function(int n)
ret = pthread_mutex_lock(&mutex_buf[n]);
if(ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_lock_function failed\n"));
+ "Error: mbedtlsthreadlock_lock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
ret = (WaitForSingleObject(mutex_buf[n], INFINITE) == WAIT_FAILED?1:0);
if(ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_lock_function failed\n"));
+ "Error: mbedtlsthreadlock_lock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
@@ -118,7 +118,7 @@ int Curl_polarsslthreadlock_lock_function(int n)
return 1; /* OK */
}
-int Curl_polarsslthreadlock_unlock_function(int n)
+int Curl_mbedtlsthreadlock_unlock_function(int n)
{
if(n < NUMT) {
int ret;
@@ -126,14 +126,14 @@ int Curl_polarsslthreadlock_unlock_function(int n)
ret = pthread_mutex_unlock(&mutex_buf[n]);
if(ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_unlock_function failed\n"));
+ "Error: mbedtlsthreadlock_unlock_function failed\n"));
return 0; /* pthread_mutex_unlock failed */
}
#elif defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H)
ret = ReleaseMutex(mutex_buf[n]);
if(!ret) {
DEBUGF(fprintf(stderr,
- "Error: polarsslthreadlock_unlock_function failed\n"));
+ "Error: mbedtlsthreadlock_unlock_function failed\n"));
return 0; /* pthread_mutex_lock failed */
}
#endif /* USE_THREADS_POSIX && HAVE_PTHREAD_H */
@@ -141,4 +141,4 @@ int Curl_polarsslthreadlock_unlock_function(int n)
return 1; /* OK */
}
-#endif /* USE_POLARSSL || USE_MBEDTLS */
+#endif /* USE_MBEDTLS */
diff --git a/lib/vtls/polarssl_threadlock.h b/lib/vtls/mbedtls_threadlock.h
index 122647528..96a787d1a 100644
--- a/lib/vtls/polarssl_threadlock.h
+++ b/lib/vtls/mbedtls_threadlock.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_POLARSSL_THREADLOCK_H
-#define HEADER_CURL_POLARSSL_THREADLOCK_H
+#ifndef HEADER_CURL_MBEDTLS_THREADLOCK_H
+#define HEADER_CURL_MBEDTLS_THREADLOCK_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013-2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2013 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
*
* This software is licensed as described in the file COPYING, which
@@ -24,25 +24,25 @@
***************************************************************************/
#include "curl_setup.h"
-#if (defined USE_POLARSSL) || (defined USE_MBEDTLS)
+#ifdef USE_MBEDTLS
#if (defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)) || \
(defined(USE_THREADS_WIN32) && defined(HAVE_PROCESS_H))
-int Curl_polarsslthreadlock_thread_setup(void);
-int Curl_polarsslthreadlock_thread_cleanup(void);
-int Curl_polarsslthreadlock_lock_function(int n);
-int Curl_polarsslthreadlock_unlock_function(int n);
+int Curl_mbedtlsthreadlock_thread_setup(void);
+int Curl_mbedtlsthreadlock_thread_cleanup(void);
+int Curl_mbedtlsthreadlock_lock_function(int n);
+int Curl_mbedtlsthreadlock_unlock_function(int n);
#else
-#define Curl_polarsslthreadlock_thread_setup() 1
-#define Curl_polarsslthreadlock_thread_cleanup() 1
-#define Curl_polarsslthreadlock_lock_function(x) 1
-#define Curl_polarsslthreadlock_unlock_function(x) 1
+#define Curl_mbedtlsthreadlock_thread_setup() 1
+#define Curl_mbedtlsthreadlock_thread_cleanup() 1
+#define Curl_mbedtlsthreadlock_lock_function(x) 1
+#define Curl_mbedtlsthreadlock_unlock_function(x) 1
#endif /* USE_THREADS_POSIX || USE_THREADS_WIN32 */
-#endif /* USE_POLARSSL */
+#endif /* USE_MBEDTLS */
-#endif /* HEADER_CURL_POLARSSL_THREADLOCK_H */
+#endif /* HEADER_CURL_MBEDTLS_THREADLOCK_H */
diff --git a/lib/vtls/mesalink.c b/lib/vtls/mesalink.c
index cab1e390b..7346a75f9 100644
--- a/lib/vtls/mesalink.c
+++ b/lib/vtls/mesalink.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2017 - 2018, Yiming Jing, <jingyiming@baidu.com>
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -158,8 +158,8 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
SSL_CONN_CONFIG(CApath))) {
if(SSL_CONN_CONFIG(verifypeer)) {
failf(data,
- "error setting certificate verify locations:\n"
- " CAfile: %s\n CApath: %s",
+ "error setting certificate verify locations: "
+ " CAfile: %s CApath: %s",
SSL_CONN_CONFIG(CAfile) ?
SSL_CONN_CONFIG(CAfile) : "none",
SSL_CONN_CONFIG(CApath) ?
@@ -173,20 +173,18 @@ mesalink_connect_step1(struct connectdata *conn, int sockindex)
else {
infof(data, "successfully set certificate verify locations:\n");
}
- infof(data,
- " CAfile: %s\n"
- " CApath: %s\n",
- SSL_CONN_CONFIG(CAfile)?
- SSL_CONN_CONFIG(CAfile): "none",
- SSL_CONN_CONFIG(CApath)?
- SSL_CONN_CONFIG(CApath): "none");
+ infof(data, " CAfile: %s\n",
+ SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile): "none");
+ infof(data, " CApath: %s\n",
+ SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath): "none");
}
- if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
+ if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) {
int file_type = do_file_type(SSL_SET_OPTION(cert_type));
- if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert),
- file_type) != 1) {
+ if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx,
+ SSL_SET_OPTION(primary.clientcert),
+ file_type) != 1) {
failf(data, "unable to use client certificate (no key or wrong pass"
" phrase?)");
return CURLE_SSL_CONNECT_ERROR;
@@ -542,9 +540,8 @@ mesalink_connect_common(struct connectdata *conn, int sockindex,
? sockfd
: CURL_SOCKET_BAD;
- what = Curl_socket_check(
- readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : (time_t)timeout_ms);
+ what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
+ nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
index a375f00da..d0988549d 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -83,42 +83,40 @@ struct ssl_backend_data {
PRFileDesc *handle;
char *client_nickname;
struct Curl_easy *data;
- struct curl_llist obj_list;
+ struct Curl_llist obj_list;
PK11GenericObject *obj_clicert;
};
-#define BACKEND connssl->backend
-
static PRLock *nss_initlock = NULL;
static PRLock *nss_crllock = NULL;
static PRLock *nss_findslot_lock = NULL;
static PRLock *nss_trustload_lock = NULL;
-static struct curl_llist nss_crl_list;
+static struct Curl_llist nss_crl_list;
static NSSInitContext *nss_context = NULL;
static volatile int initialized = 0;
/* type used to wrap pointers as list nodes */
struct ptr_list_wrap {
void *ptr;
- struct curl_llist_element node;
+ struct Curl_llist_element node;
};
-typedef struct {
+struct cipher_s {
const char *name;
int num;
-} cipher_s;
+};
#define PK11_SETATTRS(_attr, _idx, _type, _val, _len) do { \
CK_ATTRIBUTE *ptr = (_attr) + ((_idx)++); \
ptr->type = (_type); \
ptr->pValue = (_val); \
ptr->ulValueLen = (_len); \
-} WHILE_FALSE
+} while(0)
#define CERT_NewTempCertificate __CERT_NewTempCertificate
#define NUM_OF_CIPHERS sizeof(cipherlist)/sizeof(cipherlist[0])
-static const cipher_s cipherlist[] = {
+static const struct cipher_s cipherlist[] = {
/* SSL2 cipher suites */
{"rc4", SSL_EN_RC4_128_WITH_MD5},
{"rc4-md5", SSL_EN_RC4_128_WITH_MD5},
@@ -432,7 +430,7 @@ static PK11SlotInfo* nss_find_slot_by_name(const char *slot_name)
}
/* wrap 'ptr' as list node and tail-insert into 'list' */
-static CURLcode insert_wrapped_ptr(struct curl_llist *list, void *ptr)
+static CURLcode insert_wrapped_ptr(struct Curl_llist *list, void *ptr)
{
struct ptr_list_wrap *wrap = malloc(sizeof(*wrap));
if(!wrap)
@@ -462,6 +460,7 @@ static CURLcode nss_create_object(struct ssl_connect_data *connssl,
const int slot_id = (cacert) ? 0 : 1;
char *slot_name = aprintf("PEM Token #%d", slot_id);
+ struct ssl_backend_data *backend = connssl->backend;
if(!slot_name)
return CURLE_OUT_OF_MEMORY;
@@ -495,14 +494,14 @@ static CURLcode nss_create_object(struct ssl_connect_data *connssl,
if(!obj)
return result;
- if(insert_wrapped_ptr(&BACKEND->obj_list, obj) != CURLE_OK) {
+ if(insert_wrapped_ptr(&backend->obj_list, obj) != CURLE_OK) {
PK11_DestroyGenericObject(obj);
return CURLE_OUT_OF_MEMORY;
}
if(!cacert && CKO_CERTIFICATE == obj_class)
/* store reference to a client certificate */
- BACKEND->obj_clicert = obj;
+ backend->obj_clicert = obj;
return CURLE_OK;
}
@@ -1028,10 +1027,7 @@ static SECStatus BadCertHandler(void *arg, PRFileDesc *sock)
CERTCertificate *cert;
/* remember the cert verification result */
- if(SSL_IS_PROXY())
- data->set.proxy_ssl.certverifyresult = err;
- else
- data->set.ssl.certverifyresult = err;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = err;
if(err == SSL_ERROR_BAD_CERT_DOMAIN && !SSL_CONN_CONFIG(verifyhost))
/* we are asked not to verify the host name */
@@ -1084,7 +1080,8 @@ static CURLcode cmp_peer_pubkey(struct ssl_connect_data *connssl,
const char *pinnedpubkey)
{
CURLcode result = CURLE_SSL_PINNEDPUBKEYNOTMATCH;
- struct Curl_easy *data = BACKEND->data;
+ struct ssl_backend_data *backend = connssl->backend;
+ struct Curl_easy *data = backend->data;
CERTCertificate *cert;
if(!pinnedpubkey)
@@ -1092,7 +1089,7 @@ static CURLcode cmp_peer_pubkey(struct ssl_connect_data *connssl,
return CURLE_OK;
/* get peer certificate */
- cert = SSL_PeerCertificate(BACKEND->handle);
+ cert = SSL_PeerCertificate(backend->handle);
if(cert) {
/* extract public key from peer certificate */
SECKEYPublicKey *pubkey = CERT_ExtractPublicKey(cert);
@@ -1136,11 +1133,12 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
struct SECKEYPrivateKeyStr **pRetKey)
{
struct ssl_connect_data *connssl = (struct ssl_connect_data *)arg;
- struct Curl_easy *data = BACKEND->data;
- const char *nickname = BACKEND->client_nickname;
+ struct ssl_backend_data *backend = connssl->backend;
+ struct Curl_easy *data = backend->data;
+ const char *nickname = backend->client_nickname;
static const char pem_slotname[] = "PEM Token #1";
- if(BACKEND->obj_clicert) {
+ if(backend->obj_clicert) {
/* use the cert/key provided by PEM reader */
SECItem cert_der = { 0, NULL, 0 };
void *proto_win = SSL_RevealPinArg(sock);
@@ -1153,7 +1151,7 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
return SECFailure;
}
- if(PK11_ReadRawAttribute(PK11_TypeGeneric, BACKEND->obj_clicert, CKA_VALUE,
+ if(PK11_ReadRawAttribute(PK11_TypeGeneric, backend->obj_clicert, CKA_VALUE,
&cert_der) != SECSuccess) {
failf(data, "NSS: CKA_VALUE not found in PK11 generic object");
PK11_FreeSlot(slot);
@@ -1503,11 +1501,12 @@ static void Curl_nss_cleanup(void)
static int Curl_nss_check_cxn(struct connectdata *conn)
{
struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
+ struct ssl_backend_data *backend = connssl->backend;
int rc;
char buf;
rc =
- PR_Recv(BACKEND->handle, (void *)&buf, 1, PR_MSG_PEEK,
+ PR_Recv(backend->handle, (void *)&buf, 1, PR_MSG_PEEK,
PR_SecondsToInterval(1));
if(rc > 0)
return 1; /* connection still in place */
@@ -1521,26 +1520,27 @@ static int Curl_nss_check_cxn(struct connectdata *conn)
static void nss_close(struct ssl_connect_data *connssl)
{
/* before the cleanup, check whether we are using a client certificate */
- const bool client_cert = (BACKEND->client_nickname != NULL)
- || (BACKEND->obj_clicert != NULL);
+ struct ssl_backend_data *backend = connssl->backend;
+ const bool client_cert = (backend->client_nickname != NULL)
+ || (backend->obj_clicert != NULL);
- free(BACKEND->client_nickname);
- BACKEND->client_nickname = NULL;
+ free(backend->client_nickname);
+ backend->client_nickname = NULL;
/* destroy all NSS objects in order to avoid failure of NSS shutdown */
- Curl_llist_destroy(&BACKEND->obj_list, NULL);
- BACKEND->obj_clicert = NULL;
+ Curl_llist_destroy(&backend->obj_list, NULL);
+ backend->obj_clicert = NULL;
- if(BACKEND->handle) {
+ if(backend->handle) {
if(client_cert)
/* A server might require different authentication based on the
* particular path being requested by the client. To support this
* scenario, we must ensure that a connection will never reuse the
* authentication data from a previous connection. */
- SSL_InvalidateSession(BACKEND->handle);
+ SSL_InvalidateSession(backend->handle);
- PR_Close(BACKEND->handle);
- BACKEND->handle = NULL;
+ PR_Close(backend->handle);
+ backend->handle = NULL;
}
}
@@ -1550,23 +1550,32 @@ static void nss_close(struct ssl_connect_data *connssl)
static void Curl_nss_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+#ifndef CURL_DISABLE_PROXY
struct ssl_connect_data *connssl_proxy = &conn->proxy_ssl[sockindex];
+#endif
+ struct ssl_backend_data *backend = connssl->backend;
- if(BACKEND->handle || connssl_proxy->backend->handle) {
+ if(backend->handle
+#ifndef CURL_DISABLE_PROXY
+ || connssl_proxy->backend->handle
+#endif
+ ) {
/* NSS closes the socket we previously handed to it, so we must mark it
as closed to avoid double close */
fake_sclose(conn->sock[sockindex]);
conn->sock[sockindex] = CURL_SOCKET_BAD;
}
- if(BACKEND->handle)
+#ifndef CURL_DISABLE_PROXY
+ if(backend->handle)
/* nss_close(connssl) will transitively close also
connssl_proxy->backend->handle if both are used. Clear it to avoid
a double close leading to crash. */
connssl_proxy->backend->handle = NULL;
- nss_close(connssl);
nss_close(connssl_proxy);
+#endif
+ nss_close(connssl);
}
/* return true if NSS can provide error code (and possibly msg) for the
@@ -1617,9 +1626,8 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
if(capath && !capath[0])
capath = NULL;
- infof(data, " CAfile: %s\n CApath: %s\n",
- cafile ? cafile : "none",
- capath ? capath : "none");
+ infof(data, " CAfile: %s\n", cafile ? cafile : "none");
+ infof(data, " CApath: %s\n", capath ? capath : "none");
/* load libnssckbi.so if no other trust roots were specified */
use_trust_module = !cafile && !capath;
@@ -1659,7 +1667,8 @@ static CURLcode nss_load_ca_certificates(struct connectdata *conn,
if(!dir)
return CURLE_SSL_CACERT_BADFILE;
- while((entry = PR_ReadDir(dir, PR_SKIP_BOTH | PR_SKIP_HIDDEN))) {
+ while((entry =
+ PR_ReadDir(dir, (PRDirFlags)(PR_SKIP_BOTH | PR_SKIP_HIDDEN)))) {
char *fullpath = aprintf("%s/%s", capath, entry->name);
if(!fullpath) {
PR_CloseDir(dir);
@@ -1773,6 +1782,7 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
CURLcode curlerr)
{
PRErrorCode err = 0;
+ struct ssl_backend_data *backend = connssl->backend;
if(is_nss_error(curlerr)) {
/* read NSPR error code */
@@ -1788,7 +1798,7 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
}
/* cleanup on connection failure */
- Curl_llist_destroy(&BACKEND->obj_list, NULL);
+ Curl_llist_destroy(&backend->obj_list, NULL);
return curlerr;
}
@@ -1799,10 +1809,11 @@ static CURLcode nss_set_blocking(struct ssl_connect_data *connssl,
bool blocking)
{
static PRSocketOptionData sock_opt;
+ struct ssl_backend_data *backend = connssl->backend;
sock_opt.option = PR_SockOpt_Nonblocking;
sock_opt.value.non_blocking = !blocking;
- if(PR_SetSocketOption(BACKEND->handle, &sock_opt) != PR_SUCCESS)
+ if(PR_SetSocketOption(backend->handle, &sock_opt) != PR_SUCCESS)
return nss_fail_connect(connssl, data, CURLE_SSL_CONNECT_ERROR);
return CURLE_OK;
@@ -1818,6 +1829,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[sockindex];
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
CURLcode result;
bool second_layer = FALSE;
SSLVersionRange sslver_supported;
@@ -1835,10 +1847,10 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
#endif
};
- BACKEND->data = data;
+ backend->data = data;
/* list of all NSS objects we need to destroy in Curl_nss_close() */
- Curl_llist_init(&BACKEND->obj_list, nss_destroy_object);
+ Curl_llist_init(&backend->obj_list, nss_destroy_object);
PR_Lock(nss_initlock);
result = nss_init(conn->data);
@@ -1925,10 +1937,7 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
goto error;
/* not checked yet */
- if(SSL_IS_PROXY())
- data->set.proxy_ssl.certverifyresult = 0;
- else
- data->set.ssl.certverifyresult = 0;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = 0;
if(SSL_BadCertHook(model, BadCertHandler, conn) != SECSuccess)
goto error;
@@ -1956,14 +1965,15 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
infof(data, " CRLfile: %s\n", SSL_SET_OPTION(CRLfile));
}
- if(SSL_SET_OPTION(cert)) {
- char *nickname = dup_nickname(data, SSL_SET_OPTION(cert));
+ if(SSL_SET_OPTION(primary.clientcert)) {
+ char *nickname = dup_nickname(data, SSL_SET_OPTION(primary.clientcert));
if(nickname) {
/* we are not going to use libnsspem.so to read the client cert */
- BACKEND->obj_clicert = NULL;
+ backend->obj_clicert = NULL;
}
else {
- CURLcode rv = cert_stuff(conn, sockindex, SSL_SET_OPTION(cert),
+ CURLcode rv = cert_stuff(conn, sockindex,
+ SSL_SET_OPTION(primary.clientcert),
SSL_SET_OPTION(key));
if(rv) {
/* failf() is already done in cert_stuff() */
@@ -1973,10 +1983,10 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
}
/* store the nickname for SelectClientCert() called during handshake */
- BACKEND->client_nickname = nickname;
+ backend->client_nickname = nickname;
}
else
- BACKEND->client_nickname = NULL;
+ backend->client_nickname = NULL;
if(SSL_GetClientAuthDataHook(model, SelectClientCert,
(void *)connssl) != SECSuccess) {
@@ -1984,12 +1994,14 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
goto error;
}
+#ifndef CURL_DISABLE_PROXY
if(conn->proxy_ssl[sockindex].use) {
DEBUGASSERT(ssl_connection_complete == conn->proxy_ssl[sockindex].state);
DEBUGASSERT(conn->proxy_ssl[sockindex].backend->handle != NULL);
nspr_io = conn->proxy_ssl[sockindex].backend->handle;
second_layer = TRUE;
}
+#endif
else {
/* wrap OS file descriptor by NSPR's file descriptor abstraction */
nspr_io = PR_ImportTCPSocket(sockfd);
@@ -2017,8 +2029,8 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
}
/* import our model socket onto the current I/O stack */
- BACKEND->handle = SSL_ImportFD(model, nspr_io);
- if(!BACKEND->handle) {
+ backend->handle = SSL_ImportFD(model, nspr_io);
+ if(!backend->handle) {
if(!second_layer)
PR_Close(nspr_io);
goto error;
@@ -2029,36 +2041,36 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
/* This is the password associated with the cert that we're using */
if(SSL_SET_OPTION(key_passwd)) {
- SSL_SetPKCS11PinArg(BACKEND->handle, SSL_SET_OPTION(key_passwd));
+ SSL_SetPKCS11PinArg(backend->handle, SSL_SET_OPTION(key_passwd));
}
#ifdef SSL_ENABLE_OCSP_STAPLING
if(SSL_CONN_CONFIG(verifystatus)) {
- if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_OCSP_STAPLING, PR_TRUE)
+ if(SSL_OptionSet(backend->handle, SSL_ENABLE_OCSP_STAPLING, PR_TRUE)
!= SECSuccess)
goto error;
}
#endif
#ifdef SSL_ENABLE_NPN
- if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_NPN, conn->bits.tls_enable_npn
+ if(SSL_OptionSet(backend->handle, SSL_ENABLE_NPN, conn->bits.tls_enable_npn
? PR_TRUE : PR_FALSE) != SECSuccess)
goto error;
#endif
#ifdef SSL_ENABLE_ALPN
- if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_ALPN, conn->bits.tls_enable_alpn
+ if(SSL_OptionSet(backend->handle, SSL_ENABLE_ALPN, conn->bits.tls_enable_alpn
? PR_TRUE : PR_FALSE) != SECSuccess)
goto error;
#endif
#if NSSVERNUM >= 0x030f04 /* 3.15.4 */
if(data->set.ssl.falsestart) {
- if(SSL_OptionSet(BACKEND->handle, SSL_ENABLE_FALSE_START, PR_TRUE)
+ if(SSL_OptionSet(backend->handle, SSL_ENABLE_FALSE_START, PR_TRUE)
!= SECSuccess)
goto error;
- if(SSL_SetCanFalseStartCallback(BACKEND->handle, CanFalseStartCallback,
+ if(SSL_SetCanFalseStartCallback(backend->handle, CanFalseStartCallback,
conn) != SECSuccess)
goto error;
}
@@ -2070,8 +2082,11 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
unsigned char protocols[128];
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
- (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2
+#ifndef CURL_DISABLE_PROXY
+ && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)
+#endif
+ ) {
protocols[cur++] = NGHTTP2_PROTO_VERSION_ID_LEN;
memcpy(&protocols[cur], NGHTTP2_PROTO_VERSION_ID,
NGHTTP2_PROTO_VERSION_ID_LEN);
@@ -2082,26 +2097,23 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
memcpy(&protocols[cur], ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH);
cur += ALPN_HTTP_1_1_LENGTH;
- if(SSL_SetNextProtoNego(BACKEND->handle, protocols, cur) != SECSuccess)
+ if(SSL_SetNextProtoNego(backend->handle, protocols, cur) != SECSuccess)
goto error;
}
#endif
/* Force handshake on next I/O */
- if(SSL_ResetHandshake(BACKEND->handle, /* asServer */ PR_FALSE)
+ if(SSL_ResetHandshake(backend->handle, /* asServer */ PR_FALSE)
!= SECSuccess)
goto error;
/* propagate hostname to the TLS layer */
- if(SSL_SetURL(BACKEND->handle, SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name) != SECSuccess)
+ if(SSL_SetURL(backend->handle, SSL_HOST_NAME()) != SECSuccess)
goto error;
/* prevent NSS from re-using the session for a different hostname */
- if(SSL_SetSockPeerID(BACKEND->handle, SSL_IS_PROXY() ?
- conn->http_proxy.host.name : conn->host.name)
- != SECSuccess)
+ if(SSL_SetSockPeerID(backend->handle, SSL_HOST_NAME()) != SECSuccess)
goto error;
return CURLE_OK;
@@ -2116,15 +2128,10 @@ error:
static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
struct Curl_easy *data = conn->data;
CURLcode result = CURLE_SSL_CONNECT_ERROR;
PRUint32 timeout;
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
- const char * const pinnedpubkey = SSL_IS_PROXY() ?
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
-
/* check timeout situation */
const timediff_t time_left = Curl_timeleft(data, NULL, TRUE);
@@ -2136,18 +2143,18 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
/* Force the handshake now */
timeout = PR_MillisecondsToInterval((PRUint32) time_left);
- if(SSL_ForceHandshakeWithTimeout(BACKEND->handle, timeout) != SECSuccess) {
+ if(SSL_ForceHandshakeWithTimeout(backend->handle, timeout) != SECSuccess) {
if(PR_GetError() == PR_WOULD_BLOCK_ERROR)
/* blocking direction is updated by nss_update_connecting_state() */
return CURLE_AGAIN;
- else if(*certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN)
+ else if(SSL_SET_OPTION(certverifyresult) == SSL_ERROR_BAD_CERT_DOMAIN)
result = CURLE_PEER_FAILED_VERIFICATION;
- else if(*certverifyresult != 0)
+ else if(SSL_SET_OPTION(certverifyresult) != 0)
result = CURLE_PEER_FAILED_VERIFICATION;
goto error;
}
- result = display_conn_info(conn, BACKEND->handle);
+ result = display_conn_info(conn, backend->handle);
if(result)
goto error;
@@ -2156,7 +2163,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
char *nickname = dup_nickname(data, SSL_SET_OPTION(issuercert));
if(nickname) {
/* we support only nicknames in case of issuercert for now */
- ret = check_issuer_cert(BACKEND->handle, nickname);
+ ret = check_issuer_cert(backend->handle, nickname);
free(nickname);
}
@@ -2170,7 +2177,7 @@ static CURLcode nss_do_connect(struct connectdata *conn, int sockindex)
}
}
- result = cmp_peer_pubkey(connssl, pinnedpubkey);
+ result = cmp_peer_pubkey(connssl, SSL_PINNED_PUB_KEY());
if(result)
/* status already printed */
goto error;
@@ -2260,13 +2267,14 @@ static ssize_t nss_send(struct connectdata *conn, /* connection data */
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
ssize_t rc;
/* The SelectClientCert() hook uses this for infof() and failf() but the
handle stored in nss_setup_connect() could have already been freed. */
- BACKEND->data = conn->data;
+ backend->data = conn->data;
- rc = PR_Send(BACKEND->handle, mem, (int)len, 0, PR_INTERVAL_NO_WAIT);
+ rc = PR_Send(backend->handle, mem, (int)len, 0, PR_INTERVAL_NO_WAIT);
if(rc < 0) {
PRInt32 err = PR_GetError();
if(err == PR_WOULD_BLOCK_ERROR)
@@ -2297,13 +2305,14 @@ static ssize_t nss_recv(struct connectdata *conn, /* connection data */
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
ssize_t nread;
/* The SelectClientCert() hook uses this for infof() and failf() but the
handle stored in nss_setup_connect() could have already been freed. */
- BACKEND->data = conn->data;
+ backend->data = conn->data;
- nread = PR_Recv(BACKEND->handle, buf, (int)buffersize, 0,
+ nread = PR_Recv(backend->handle, buf, (int)buffersize, 0,
PR_INTERVAL_NO_WAIT);
if(nread < 0) {
/* failed SSL read */
@@ -2364,6 +2373,9 @@ static CURLcode Curl_nss_md5sum(unsigned char *tmp, /* input */
PK11Context *MD5pw = PK11_CreateDigestContext(SEC_OID_MD5);
unsigned int MD5out;
+ if(!MD5pw)
+ return CURLE_NOT_BUILT_IN;
+
PK11_DigestOp(MD5pw, tmp, curlx_uztoui(tmplen));
PK11_DigestFinal(MD5pw, md5sum, &MD5out, curlx_uztoui(md5len));
PK11_DestroyContext(MD5pw, PR_TRUE);
@@ -2379,6 +2391,9 @@ static CURLcode Curl_nss_sha256sum(const unsigned char *tmp, /* input */
PK11Context *SHA256pw = PK11_CreateDigestContext(SEC_OID_SHA256);
unsigned int SHA256out;
+ if(!SHA256pw)
+ return CURLE_NOT_BUILT_IN;
+
PK11_DigestOp(SHA256pw, tmp, curlx_uztoui(tmplen));
PK11_DigestFinal(SHA256pw, sha256sum, &SHA256out, curlx_uztoui(sha256len));
PK11_DestroyContext(SHA256pw, PR_TRUE);
@@ -2407,8 +2422,9 @@ static bool Curl_nss_false_start(void)
static void *Curl_nss_get_internals(struct ssl_connect_data *connssl,
CURLINFO info UNUSED_PARAM)
{
+ struct ssl_backend_data *backend = connssl->backend;
(void)info;
- return BACKEND->handle;
+ return backend->handle;
}
const struct Curl_ssl Curl_ssl_nss = {
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index 760758d23..28a1ae6da 100644
--- a/lib/vtls/openssl.c
+++ b/lib/vtls/openssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,18 @@
#include <limits.h>
+/* Wincrypt must be included before anything that could include OpenSSL. */
+#if defined(USE_WIN32_CRYPTO)
+#include <wincrypt.h>
+/* Undefine wincrypt conflicting symbols for BoringSSL. */
+#undef X509_NAME
+#undef X509_EXTENSIONS
+#undef PKCS7_ISSUER_AND_SERIAL
+#undef PKCS7_SIGNER_INFO
+#undef OCSP_REQUEST
+#undef OCSP_RESPONSE
+#endif
+
#include "urldata.h"
#include "sendf.h"
#include "formdata.h" /* for the boundary function */
@@ -41,11 +53,13 @@
#include "slist.h"
#include "select.h"
#include "vtls.h"
+#include "keylog.h"
#include "strcase.h"
#include "hostcheck.h"
#include "multiif.h"
#include "strerror.h"
#include "curl_printf.h"
+
#include <openssl/ssl.h>
#include <openssl/rand.h>
#include <openssl/x509v3.h>
@@ -142,10 +156,6 @@
#endif
#endif
-#ifdef LIBRESSL_VERSION_NUMBER
-#define OpenSSL_version_num() LIBRESSL_VERSION_NUMBER
-#endif
-
#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL) && /* 1.0.2 or later */ \
!(defined(LIBRESSL_VERSION_NUMBER) && \
LIBRESSL_VERSION_NUMBER < 0x20700000L)
@@ -190,6 +200,10 @@
!defined(OPENSSL_IS_BORINGSSL))
#define HAVE_SSL_CTX_SET_CIPHERSUITES
#define HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
+/* SET_EC_CURVES available under the same preconditions: see
+ * https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set1_groups.html
+ */
+#define HAVE_SSL_CTX_SET_EC_CURVES
#endif
#if defined(LIBRESSL_VERSION_NUMBER)
@@ -211,29 +225,17 @@
"ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH"
#endif
-#define ENABLE_SSLKEYLOGFILE
-
-#ifdef ENABLE_SSLKEYLOGFILE
-typedef struct ssl_tap_state {
- int master_key_length;
- unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
- unsigned char client_random[SSL3_RANDOM_SIZE];
-} ssl_tap_state_t;
-#endif /* ENABLE_SSLKEYLOGFILE */
-
struct ssl_backend_data {
/* these ones requires specific SSL-types */
SSL_CTX* ctx;
SSL* handle;
X509* server_cert;
-#ifdef ENABLE_SSLKEYLOGFILE
- /* tap_state holds the last seen master key if we're logging them */
- ssl_tap_state_t tap_state;
+#ifndef HAVE_KEYLOG_CALLBACK
+ /* Set to true once a valid keylog entry has been created to avoid dupes. */
+ bool keylog_done;
#endif
};
-#define BACKEND connssl->backend
-
/*
* Number of bytes to read from the random number seed file. This must be
* a finite value (because some entropy "files" like /dev/urandom have
@@ -242,57 +244,27 @@ struct ssl_backend_data {
*/
#define RAND_LOAD_LENGTH 1024
-#ifdef ENABLE_SSLKEYLOGFILE
-/* The fp for the open SSLKEYLOGFILE, or NULL if not open */
-static FILE *keylog_file_fp;
-
#ifdef HAVE_KEYLOG_CALLBACK
static void ossl_keylog_callback(const SSL *ssl, const char *line)
{
(void)ssl;
- /* Using fputs here instead of fprintf since libcurl's fprintf replacement
- may not be thread-safe. */
- if(keylog_file_fp && line && *line) {
- char stackbuf[256];
- char *buf;
- size_t linelen = strlen(line);
-
- if(linelen <= sizeof(stackbuf) - 2)
- buf = stackbuf;
- else {
- buf = malloc(linelen + 2);
- if(!buf)
- return;
- }
- memcpy(buf, line, linelen);
- buf[linelen] = '\n';
- buf[linelen + 1] = '\0';
-
- fputs(buf, keylog_file_fp);
- if(buf != stackbuf)
- free(buf);
- }
+ Curl_tls_keylog_write_line(line);
}
#else
-#define KEYLOG_PREFIX "CLIENT_RANDOM "
-#define KEYLOG_PREFIX_LEN (sizeof(KEYLOG_PREFIX) - 1)
/*
- * tap_ssl_key is called by libcurl to make the CLIENT_RANDOMs if the OpenSSL
- * being used doesn't have native support for doing that.
+ * ossl_log_tls12_secret is called by libcurl to make the CLIENT_RANDOMs if the
+ * OpenSSL being used doesn't have native support for doing that.
*/
-static void tap_ssl_key(const SSL *ssl, ssl_tap_state_t *state)
+static void
+ossl_log_tls12_secret(const SSL *ssl, bool *keylog_done)
{
- const char *hex = "0123456789ABCDEF";
- int pos, i;
- char line[KEYLOG_PREFIX_LEN + 2 * SSL3_RANDOM_SIZE + 1 +
- 2 * SSL_MAX_MASTER_KEY_LENGTH + 1 + 1];
const SSL_SESSION *session = SSL_get_session(ssl);
unsigned char client_random[SSL3_RANDOM_SIZE];
unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
int master_key_length = 0;
- if(!session || !keylog_file_fp)
+ if(!session || *keylog_done)
return;
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
@@ -311,44 +283,17 @@ static void tap_ssl_key(const SSL *ssl, ssl_tap_state_t *state)
}
#endif
+ /* The handshake has not progressed sufficiently yet, or this is a TLS 1.3
+ * session (when curl was built with older OpenSSL headers and running with
+ * newer OpenSSL runtime libraries). */
if(master_key_length <= 0)
return;
- /* Skip writing keys if there is no key or it did not change. */
- if(state->master_key_length == master_key_length &&
- !memcmp(state->master_key, master_key, master_key_length) &&
- !memcmp(state->client_random, client_random, SSL3_RANDOM_SIZE)) {
- return;
- }
-
- state->master_key_length = master_key_length;
- memcpy(state->master_key, master_key, master_key_length);
- memcpy(state->client_random, client_random, SSL3_RANDOM_SIZE);
-
- memcpy(line, KEYLOG_PREFIX, KEYLOG_PREFIX_LEN);
- pos = KEYLOG_PREFIX_LEN;
-
- /* Client Random for SSLv3/TLS */
- for(i = 0; i < SSL3_RANDOM_SIZE; i++) {
- line[pos++] = hex[client_random[i] >> 4];
- line[pos++] = hex[client_random[i] & 0xF];
- }
- line[pos++] = ' ';
-
- /* Master Secret (size is at most SSL_MAX_MASTER_KEY_LENGTH) */
- for(i = 0; i < master_key_length; i++) {
- line[pos++] = hex[master_key[i] >> 4];
- line[pos++] = hex[master_key[i] & 0xF];
- }
- line[pos++] = '\n';
- line[pos] = '\0';
-
- /* Using fputs here instead of fprintf since libcurl's fprintf replacement
- may not be thread-safe. */
- fputs(line, keylog_file_fp);
+ *keylog_done = true;
+ Curl_tls_keylog_write("CLIENT_RANDOM", client_random,
+ master_key, master_key_length);
}
#endif /* !HAVE_KEYLOG_CALLBACK */
-#endif /* ENABLE_SSLKEYLOGFILE */
static const char *SSL_ERROR_to_str(int err)
{
@@ -392,11 +337,20 @@ static const char *SSL_ERROR_to_str(int err)
*/
static char *ossl_strerror(unsigned long error, char *buf, size_t size)
{
+ if(size)
+ *buf = '\0';
+
#ifdef OPENSSL_IS_BORINGSSL
ERR_error_string_n((uint32_t)error, buf, size);
#else
ERR_error_string_n(error, buf, size);
#endif
+
+ if(size > 1 && !*buf) {
+ strncpy(buf, (error ? "Unknown error" : "No error"), size);
+ buf[size - 1] = '\0';
+ }
+
return buf;
}
@@ -613,12 +567,138 @@ static bool is_pkcs11_uri(const char *string)
static CURLcode Curl_ossl_set_engine(struct Curl_easy *data,
const char *engine);
+static int
+SSL_CTX_use_certificate_bio(SSL_CTX *ctx, BIO *in, int type,
+ const char *key_passwd)
+{
+ int ret = 0;
+ X509 *x = NULL;
+
+ if(type == SSL_FILETYPE_ASN1) {
+ /* j = ERR_R_ASN1_LIB; */
+ x = d2i_X509_bio(in, NULL);
+ }
+ else if(type == SSL_FILETYPE_PEM) {
+ /* ERR_R_PEM_LIB; */
+ x = PEM_read_bio_X509(in, NULL,
+ passwd_callback, (void *)key_passwd);
+ }
+ else {
+ ret = 0;
+ goto end;
+ }
+
+ if(x == NULL) {
+ ret = 0;
+ goto end;
+ }
+
+ ret = SSL_CTX_use_certificate(ctx, x);
+ end:
+ X509_free(x);
+ return ret;
+}
+
+static int
+SSL_CTX_use_PrivateKey_bio(SSL_CTX *ctx, BIO* in, int type,
+ const char *key_passwd)
+{
+ int ret = 0;
+ EVP_PKEY *pkey = NULL;
+
+ if(type == SSL_FILETYPE_PEM)
+ pkey = PEM_read_bio_PrivateKey(in, NULL, passwd_callback,
+ (void *)key_passwd);
+ else if(type == SSL_FILETYPE_ASN1)
+ pkey = d2i_PrivateKey_bio(in, NULL);
+ else {
+ ret = 0;
+ goto end;
+ }
+ if(pkey == NULL) {
+ ret = 0;
+ goto end;
+ }
+ ret = SSL_CTX_use_PrivateKey(ctx, pkey);
+ EVP_PKEY_free(pkey);
+ end:
+ return ret;
+}
+
+static int
+SSL_CTX_use_certificate_chain_bio(SSL_CTX *ctx, BIO* in,
+ const char *key_passwd)
+{
+/* SSL_CTX_add1_chain_cert introduced in OpenSSL 1.0.2 */
+#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL) && /* OpenSSL 1.0.2 or later */ \
+ !(defined(LIBRESSL_VERSION_NUMBER) && \
+ (LIBRESSL_VERSION_NUMBER < 0x2090100fL)) /* LibreSSL 2.9.1 or later */
+ int ret = 0;
+ X509 *x = NULL;
+ void *passwd_callback_userdata = (void *)key_passwd;
+
+ ERR_clear_error();
+
+ x = PEM_read_bio_X509_AUX(in, NULL,
+ passwd_callback, (void *)key_passwd);
+
+ if(x == NULL) {
+ ret = 0;
+ goto end;
+ }
+
+ ret = SSL_CTX_use_certificate(ctx, x);
+
+ if(ERR_peek_error() != 0)
+ ret = 0;
+
+ if(ret) {
+ X509 *ca;
+ unsigned long err;
+
+ if(!SSL_CTX_clear_chain_certs(ctx)) {
+ ret = 0;
+ goto end;
+ }
+
+ while((ca = PEM_read_bio_X509(in, NULL, passwd_callback,
+ passwd_callback_userdata))
+ != NULL) {
+
+ if(!SSL_CTX_add0_chain_cert(ctx, ca)) {
+ X509_free(ca);
+ ret = 0;
+ goto end;
+ }
+ }
+
+ err = ERR_peek_last_error();
+ if((ERR_GET_LIB(err) == ERR_LIB_PEM) &&
+ (ERR_GET_REASON(err) == PEM_R_NO_START_LINE))
+ ERR_clear_error();
+ else
+ ret = 0;
+ }
+
+ end:
+ X509_free(x);
+ return ret;
+#else
+ (void)ctx; /* unused */
+ (void)in; /* unused */
+ (void)key_passwd; /* unused */
+ return 0;
+#endif
+}
+
static
int cert_stuff(struct connectdata *conn,
SSL_CTX* ctx,
char *cert_file,
+ BIO *cert_bio,
const char *cert_type,
char *key_file,
+ BIO* key_bio,
const char *key_type,
char *key_passwd)
{
@@ -628,10 +708,11 @@ int cert_stuff(struct connectdata *conn,
int file_type = do_file_type(cert_type);
- if(cert_file || (file_type == SSL_FILETYPE_ENGINE)) {
+ if(cert_file || cert_bio || (file_type == SSL_FILETYPE_ENGINE)) {
SSL *ssl;
X509 *x509;
int cert_done = 0;
+ int cert_use_result;
if(key_passwd) {
/* set the password in the callback userdata */
@@ -644,8 +725,10 @@ int cert_stuff(struct connectdata *conn,
switch(file_type) {
case SSL_FILETYPE_PEM:
/* SSL_CTX_use_certificate_chain_file() only works on PEM files */
- if(SSL_CTX_use_certificate_chain_file(ctx,
- cert_file) != 1) {
+ cert_use_result = cert_bio ?
+ SSL_CTX_use_certificate_chain_bio(ctx, cert_bio, key_passwd) :
+ SSL_CTX_use_certificate_chain_file(ctx, cert_file);
+ if(cert_use_result != 1) {
failf(data,
"could not load PEM client certificate, " OSSL_PACKAGE
" error %s, "
@@ -660,9 +743,12 @@ int cert_stuff(struct connectdata *conn,
/* SSL_CTX_use_certificate_file() works with either PEM or ASN1, but
we use the case above for PEM so this can only be performed with
ASN1 files. */
- if(SSL_CTX_use_certificate_file(ctx,
- cert_file,
- file_type) != 1) {
+
+ cert_use_result = cert_bio ?
+ SSL_CTX_use_certificate_bio(ctx, cert_bio,
+ file_type, key_passwd) :
+ SSL_CTX_use_certificate_file(ctx, cert_file, file_type);
+ if(cert_use_result != 1) {
failf(data,
"could not load ASN1 client certificate, " OSSL_PACKAGE
" error %s, "
@@ -742,27 +828,31 @@ int cert_stuff(struct connectdata *conn,
PKCS12 *p12 = NULL;
EVP_PKEY *pri;
STACK_OF(X509) *ca = NULL;
+ if(!cert_bio) {
+ fp = BIO_new(BIO_s_file());
+ if(fp == NULL) {
+ failf(data,
+ "BIO_new return NULL, " OSSL_PACKAGE
+ " error %s",
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)) );
+ return 0;
+ }
- fp = BIO_new(BIO_s_file());
- if(fp == NULL) {
- failf(data,
- "BIO_new return NULL, " OSSL_PACKAGE
- " error %s",
- ossl_strerror(ERR_get_error(), error_buffer,
- sizeof(error_buffer)) );
- return 0;
+ if(BIO_read_filename(fp, cert_file) <= 0) {
+ failf(data, "could not open PKCS12 file '%s'", cert_file);
+ BIO_free(fp);
+ return 0;
+ }
}
- if(BIO_read_filename(fp, cert_file) <= 0) {
- failf(data, "could not open PKCS12 file '%s'", cert_file);
+ p12 = d2i_PKCS12_bio(cert_bio ? cert_bio : fp, NULL);
+ if(fp)
BIO_free(fp);
- return 0;
- }
- p12 = d2i_PKCS12_bio(fp, NULL);
- BIO_free(fp);
if(!p12) {
- failf(data, "error reading PKCS12 file '%s'", cert_file);
+ failf(data, "error reading PKCS12 file '%s'",
+ cert_bio ? "(memory blob)" : cert_file);
return 0;
}
@@ -843,8 +933,10 @@ int cert_stuff(struct connectdata *conn,
return 0;
}
- if(!key_file)
+ if((!key_file) && (!key_bio)) {
key_file = cert_file;
+ key_bio = cert_bio;
+ }
else
file_type = do_file_type(key_type);
@@ -854,9 +946,12 @@ int cert_stuff(struct connectdata *conn,
break;
/* FALLTHROUGH */
case SSL_FILETYPE_ASN1:
- if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
+ cert_use_result = key_bio ?
+ SSL_CTX_use_PrivateKey_bio(ctx, key_bio, file_type, key_passwd) :
+ SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type);
+ if(cert_use_result != 1) {
failf(data, "unable to set private key file: '%s' type %s",
- key_file, key_type?key_type:"PEM");
+ key_file?key_file:"(memory blob)", key_type?key_type:"PEM");
return 0;
}
break;
@@ -1016,10 +1111,6 @@ static int x509_name_oneline(X509_NAME *a, char *buf, size_t size)
*/
static int Curl_ossl_init(void)
{
-#ifdef ENABLE_SSLKEYLOGFILE
- char *keylog_file_name;
-#endif
-
OPENSSL_load_builtin_modules();
#ifdef USE_OPENSSL_ENGINE
@@ -1052,26 +1143,7 @@ static int Curl_ossl_init(void)
OpenSSL_add_all_algorithms();
#endif
-#ifdef ENABLE_SSLKEYLOGFILE
- if(!keylog_file_fp) {
- keylog_file_name = curl_getenv("SSLKEYLOGFILE");
- if(keylog_file_name) {
- keylog_file_fp = fopen(keylog_file_name, FOPEN_APPENDTEXT);
- if(keylog_file_fp) {
-#ifdef WIN32
- if(setvbuf(keylog_file_fp, NULL, _IONBF, 0))
-#else
- if(setvbuf(keylog_file_fp, NULL, _IOLBF, 4096))
-#endif
- {
- fclose(keylog_file_fp);
- keylog_file_fp = NULL;
- }
- }
- Curl_safefree(keylog_file_name);
- }
- }
-#endif
+ Curl_tls_keylog_open();
/* Initialize the extra data indexes */
if(ossl_get_ssl_conn_index() < 0 || ossl_get_ssl_sockindex_index() < 0)
@@ -1114,12 +1186,7 @@ static void Curl_ossl_cleanup(void)
#endif
#endif
-#ifdef ENABLE_SSLKEYLOGFILE
- if(keylog_file_fp) {
- fclose(keylog_file_fp);
- keylog_file_fp = NULL;
- }
-#endif
+ Curl_tls_keylog_close();
}
/*
@@ -1264,19 +1331,19 @@ static struct curl_slist *Curl_ossl_engines_list(struct Curl_easy *data)
return list;
}
-
static void ossl_close(struct ssl_connect_data *connssl)
{
- if(BACKEND->handle) {
- (void)SSL_shutdown(BACKEND->handle);
- SSL_set_connect_state(BACKEND->handle);
+ struct ssl_backend_data *backend = connssl->backend;
+ if(backend->handle) {
+ (void)SSL_shutdown(backend->handle);
+ SSL_set_connect_state(backend->handle);
- SSL_free(BACKEND->handle);
- BACKEND->handle = NULL;
+ SSL_free(backend->handle);
+ backend->handle = NULL;
}
- if(BACKEND->ctx) {
- SSL_CTX_free(BACKEND->ctx);
- BACKEND->ctx = NULL;
+ if(backend->ctx) {
+ SSL_CTX_free(backend->ctx);
+ backend->ctx = NULL;
}
}
@@ -1286,7 +1353,9 @@ static void ossl_close(struct ssl_connect_data *connssl)
static void Curl_ossl_close(struct connectdata *conn, int sockindex)
{
ossl_close(&conn->ssl[sockindex]);
+#ifndef CURL_DISABLE_PROXY
ossl_close(&conn->proxy_ssl[sockindex]);
+#endif
}
/*
@@ -1305,6 +1374,7 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
int buffsize;
int err;
bool done = FALSE;
+ struct ssl_backend_data *backend = connssl->backend;
#ifndef CURL_DISABLE_FTP
/* This has only been tested on the proftpd server, and the mod_tls code
@@ -1313,10 +1383,10 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
we do not send one. Let's hope other servers do the same... */
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
- (void)SSL_shutdown(BACKEND->handle);
+ (void)SSL_shutdown(backend->handle);
#endif
- if(BACKEND->handle) {
+ if(backend->handle) {
buffsize = (int)sizeof(buf);
while(!done) {
int what = SOCKET_READABLE(conn->sock[sockindex],
@@ -1326,8 +1396,8 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
/* Something to read, let's do it and hope that it is the close
notify alert from the server */
- nread = (ssize_t)SSL_read(BACKEND->handle, buf, buffsize);
- err = SSL_get_error(BACKEND->handle, (int)nread);
+ nread = (ssize_t)SSL_read(backend->handle, buf, buffsize);
+ err = SSL_get_error(backend->handle, (int)nread);
switch(err) {
case SSL_ERROR_NONE: /* this is not an error */
@@ -1372,7 +1442,7 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
if(data->set.verbose) {
#ifdef HAVE_SSL_GET_SHUTDOWN
- switch(SSL_get_shutdown(BACKEND->handle)) {
+ switch(SSL_get_shutdown(backend->handle)) {
case SSL_SENT_SHUTDOWN:
infof(data, "SSL_get_shutdown() returned SSL_SENT_SHUTDOWN\n");
break;
@@ -1387,8 +1457,8 @@ static int Curl_ossl_shutdown(struct connectdata *conn, int sockindex)
#endif
}
- SSL_free(BACKEND->handle);
- BACKEND->handle = NULL;
+ SSL_free(backend->handle);
+ backend->handle = NULL;
}
return retval;
}
@@ -1512,10 +1582,8 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
CURLcode result = CURLE_OK;
bool dNSName = FALSE; /* if a dNSName field exists in the cert */
bool iPAddress = FALSE; /* if a iPAddress field exists in the cert */
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
- const char * const dispname = SSL_IS_PROXY() ?
- conn->http_proxy.host.dispname : conn->host.dispname;
+ const char * const hostname = SSL_HOST_NAME();
+ const char * const dispname = SSL_HOST_DISPNAME();
#ifdef ENABLE_IPV6
if(conn->bits.ipv6_ip &&
@@ -1573,7 +1641,7 @@ static CURLcode verifyhost(struct connectdata *conn, X509 *server_cert)
type itself: for example for an IA5String the data will be ASCII"
It has been however verified that in 0.9.6 and 0.9.7, IA5String
- is always zero-terminated.
+ is always null-terminated.
*/
if((altlen == strlen(altptr)) &&
/* if this isn't true, there was an embedded zero in the name
@@ -1707,13 +1775,13 @@ static CURLcode verifystatus(struct connectdata *conn,
const unsigned char *p;
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
-
OCSP_RESPONSE *rsp = NULL;
OCSP_BASICRESP *br = NULL;
X509_STORE *st = NULL;
STACK_OF(X509) *ch = NULL;
+ struct ssl_backend_data *backend = connssl->backend;
- long len = SSL_get_tlsext_status_ocsp_resp(BACKEND->handle, &status);
+ long len = SSL_get_tlsext_status_ocsp_resp(backend->handle, &status);
if(!status) {
failf(data, "No OCSP response received");
@@ -1743,8 +1811,8 @@ static CURLcode verifystatus(struct connectdata *conn,
goto end;
}
- ch = SSL_get_peer_cert_chain(BACKEND->handle);
- st = SSL_CTX_get_cert_store(BACKEND->ctx);
+ ch = SSL_get_peer_cert_chain(backend->handle);
+ st = SSL_CTX_get_cert_store(backend->ctx);
#if ((OPENSSL_VERSION_NUMBER <= 0x1000201fL) /* Fixed after 1.0.2a */ || \
(defined(LIBRESSL_VERSION_NUMBER) && \
@@ -1820,7 +1888,8 @@ static CURLcode verifystatus(struct connectdata *conn,
}
end:
- if(br) OCSP_BASICRESP_free(br);
+ if(br)
+ OCSP_BASICRESP_free(br);
OCSP_RESPONSE_free(rsp);
return result;
@@ -2207,7 +2276,6 @@ set_ssl_version_min_max(SSL_CTX *ctx, struct connectdata *conn)
curl_ssl_version_max = SSL_CONN_CONFIG(version_max);
/* convert cURL max SSL version option to OpenSSL constant */
- ossl_ssl_version_max = 0;
switch(curl_ssl_version_max) {
case CURL_SSLVERSION_MAX_TLSv1_0:
ossl_ssl_version_max = TLS1_VERSION;
@@ -2266,7 +2334,7 @@ set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
#ifdef TLS1_3_VERSION
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- SSL_CTX_set_max_proto_version(BACKEND->ctx, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(backend->ctx, TLS1_3_VERSION);
*ctx_options |= SSL_OP_NO_TLSv1_2;
}
#else
@@ -2394,27 +2462,28 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
bool sni;
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
+ const char * const hostname = SSL_HOST_NAME();
+
#ifdef ENABLE_IPV6
struct in6_addr addr;
#else
struct in_addr addr;
#endif
#endif
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
const long int ssl_version = SSL_CONN_CONFIG(version);
-#ifdef USE_TLS_SRP
+#ifdef HAVE_OPENSSL_SRP
const enum CURL_TLSAUTH ssl_authtype = SSL_SET_OPTION(authtype);
#endif
- char * const ssl_cert = SSL_SET_OPTION(cert);
+ char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
+ const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
const char * const ssl_cert_type = SSL_SET_OPTION(cert_type);
const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
char error_buffer[256];
+ struct ssl_backend_data *backend = connssl->backend;
+ bool imported_native_ca = false;
DEBUGASSERT(ssl_connect_1 == connssl->connecting_state);
@@ -2423,7 +2492,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(result)
return result;
- *certverifyresult = !X509_V_OK;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = !X509_V_OK;
/* check to see if we've been told to use an explicit SSL/TLS version */
@@ -2447,7 +2516,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
failf(data, OSSL_PACKAGE " was built without SSLv2 support");
return CURLE_NOT_BUILT_IN;
#else
-#ifdef USE_TLS_SRP
+#ifdef HAVE_OPENSSL_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP)
return CURLE_SSL_CONNECT_ERROR;
#endif
@@ -2460,7 +2529,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
failf(data, OSSL_PACKAGE " was built without SSLv3 support");
return CURLE_NOT_BUILT_IN;
#else
-#ifdef USE_TLS_SRP
+#ifdef HAVE_OPENSSL_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP)
return CURLE_SSL_CONNECT_ERROR;
#endif
@@ -2473,25 +2542,25 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
return CURLE_SSL_CONNECT_ERROR;
}
- if(BACKEND->ctx)
- SSL_CTX_free(BACKEND->ctx);
- BACKEND->ctx = SSL_CTX_new(req_method);
+ if(backend->ctx)
+ SSL_CTX_free(backend->ctx);
+ backend->ctx = SSL_CTX_new(req_method);
- if(!BACKEND->ctx) {
+ if(!backend->ctx) {
failf(data, "SSL: couldn't create a context: %s",
ossl_strerror(ERR_peek_error(), error_buffer, sizeof(error_buffer)));
return CURLE_OUT_OF_MEMORY;
}
#ifdef SSL_MODE_RELEASE_BUFFERS
- SSL_CTX_set_mode(BACKEND->ctx, SSL_MODE_RELEASE_BUFFERS);
+ SSL_CTX_set_mode(backend->ctx, SSL_MODE_RELEASE_BUFFERS);
#endif
#ifdef SSL_CTRL_SET_MSG_CALLBACK
if(data->set.fdebug && data->set.verbose) {
/* the SSL trace callback is only used for verbose logging */
- SSL_CTX_set_msg_callback(BACKEND->ctx, ssl_tls_trace);
- SSL_CTX_set_msg_callback_arg(BACKEND->ctx, conn);
+ SSL_CTX_set_msg_callback(backend->ctx, ssl_tls_trace);
+ SSL_CTX_set_msg_callback_arg(backend->ctx, conn);
}
#endif
@@ -2557,8 +2626,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* "--sslv2" option means SSLv2 only, disable all others */
case CURL_SSLVERSION_SSLv2:
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
- SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL2_VERSION);
- SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL2_VERSION);
+ SSL_CTX_set_min_proto_version(backend->ctx, SSL2_VERSION);
+ SSL_CTX_set_max_proto_version(backend->ctx, SSL2_VERSION);
#else
ctx_options |= SSL_OP_NO_SSLv3;
ctx_options |= SSL_OP_NO_TLSv1;
@@ -2575,8 +2644,8 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* "--sslv3" option means SSLv3 only, disable all others */
case CURL_SSLVERSION_SSLv3:
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
- SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL3_VERSION);
- SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL3_VERSION);
+ SSL_CTX_set_min_proto_version(backend->ctx, SSL3_VERSION);
+ SSL_CTX_set_max_proto_version(backend->ctx, SSL3_VERSION);
#else
ctx_options |= SSL_OP_NO_SSLv2;
ctx_options |= SSL_OP_NO_TLSv1;
@@ -2603,7 +2672,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
ctx_options |= SSL_OP_NO_SSLv3;
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
- result = set_ssl_version_min_max(BACKEND->ctx, conn);
+ result = set_ssl_version_min_max(backend->ctx, conn);
#else
result = set_ssl_version_min_max_legacy(&ctx_options, conn, sockindex);
#endif
@@ -2616,11 +2685,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
return CURLE_SSL_CONNECT_ERROR;
}
- SSL_CTX_set_options(BACKEND->ctx, ctx_options);
+ SSL_CTX_set_options(backend->ctx, ctx_options);
#ifdef HAS_NPN
if(conn->bits.tls_enable_npn)
- SSL_CTX_set_next_proto_select_cb(BACKEND->ctx, select_next_proto_cb, conn);
+ SSL_CTX_set_next_proto_select_cb(backend->ctx, select_next_proto_cb, conn);
#endif
#ifdef HAS_ALPN
@@ -2629,8 +2698,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
unsigned char protocols[128];
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
- (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2
+#ifndef CURL_DISABLE_PROXY
+ && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)
+#endif
+ ) {
protocols[cur++] = NGHTTP2_PROTO_VERSION_ID_LEN;
memcpy(&protocols[cur], NGHTTP2_PROTO_VERSION_ID,
@@ -2648,14 +2720,37 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* expects length prefixed preference ordered list of protocols in wire
* format
*/
- SSL_CTX_set_alpn_protos(BACKEND->ctx, protocols, cur);
+ SSL_CTX_set_alpn_protos(backend->ctx, protocols, cur);
}
#endif
- if(ssl_cert || ssl_cert_type) {
- if(!cert_stuff(conn, BACKEND->ctx, ssl_cert, ssl_cert_type,
- SSL_SET_OPTION(key), SSL_SET_OPTION(key_type),
- SSL_SET_OPTION(key_passwd))) {
+ if(ssl_cert || ssl_cert_blob || ssl_cert_type) {
+ BIO *ssl_cert_bio = NULL;
+ BIO *ssl_key_bio = NULL;
+ int result_cert_stuff;
+ if(ssl_cert_blob) {
+ /* the typecast of blob->len is fine since it is guaranteed to never be
+ larger than CURL_MAX_INPUT_LENGTH */
+ ssl_cert_bio = BIO_new_mem_buf(ssl_cert_blob->data,
+ (int)ssl_cert_blob->len);
+ if(!ssl_cert_bio)
+ return CURLE_SSL_CERTPROBLEM;
+ }
+ if(SSL_SET_OPTION(key_blob)) {
+ ssl_key_bio = BIO_new_mem_buf(SSL_SET_OPTION(key_blob)->data,
+ (int)SSL_SET_OPTION(key_blob)->len);
+ if(!ssl_key_bio)
+ return CURLE_SSL_CERTPROBLEM;
+ }
+ result_cert_stuff = cert_stuff(conn, backend->ctx,
+ ssl_cert, ssl_cert_bio, ssl_cert_type,
+ SSL_SET_OPTION(key), ssl_key_bio,
+ SSL_SET_OPTION(key_type), SSL_SET_OPTION(key_passwd));
+ if(ssl_cert_bio)
+ BIO_free(ssl_cert_bio);
+ if(ssl_key_bio)
+ BIO_free(ssl_key_bio);
+ if(!result_cert_stuff) {
/* failf() is already done in cert_stuff() */
return CURLE_SSL_CERTPROBLEM;
}
@@ -2665,7 +2760,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(!ciphers)
ciphers = (char *)DEFAULT_CIPHER_SELECTION;
if(ciphers) {
- if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
+ if(!SSL_CTX_set_cipher_list(backend->ctx, ciphers)) {
failf(data, "failed setting cipher list: %s", ciphers);
return CURLE_SSL_CIPHER;
}
@@ -2676,7 +2771,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
{
char *ciphers13 = SSL_CONN_CONFIG(cipher_list13);
if(ciphers13) {
- if(!SSL_CTX_set_ciphersuites(BACKEND->ctx, ciphers13)) {
+ if(!SSL_CTX_set_ciphersuites(backend->ctx, ciphers13)) {
failf(data, "failed setting TLS 1.3 cipher suite: %s", ciphers13);
return CURLE_SSL_CIPHER;
}
@@ -2687,27 +2782,39 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#ifdef HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
/* OpenSSL 1.1.1 requires clients to opt-in for PHA */
- SSL_CTX_set_post_handshake_auth(BACKEND->ctx, 1);
+ SSL_CTX_set_post_handshake_auth(backend->ctx, 1);
#endif
-#ifdef USE_TLS_SRP
+#ifdef HAVE_SSL_CTX_SET_EC_CURVES
+ {
+ char *curves = SSL_CONN_CONFIG(curves);
+ if(curves) {
+ if(!SSL_CTX_set1_curves_list(backend->ctx, curves)) {
+ failf(data, "failed setting curves list: '%s'", curves);
+ return CURLE_SSL_CIPHER;
+ }
+ }
+ }
+#endif
+
+#ifdef HAVE_OPENSSL_SRP
if(ssl_authtype == CURL_TLSAUTH_SRP) {
char * const ssl_username = SSL_SET_OPTION(username);
infof(data, "Using TLS-SRP username: %s\n", ssl_username);
- if(!SSL_CTX_set_srp_username(BACKEND->ctx, ssl_username)) {
+ if(!SSL_CTX_set_srp_username(backend->ctx, ssl_username)) {
failf(data, "Unable to set SRP user name");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
- if(!SSL_CTX_set_srp_password(BACKEND->ctx, SSL_SET_OPTION(password))) {
+ if(!SSL_CTX_set_srp_password(backend->ctx, SSL_SET_OPTION(password))) {
failf(data, "failed setting SRP password");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
if(!SSL_CONN_CONFIG(cipher_list)) {
infof(data, "Setting cipher list SRP\n");
- if(!SSL_CTX_set_cipher_list(BACKEND->ctx, "SRP")) {
+ if(!SSL_CTX_set_cipher_list(backend->ctx, "SRP")) {
failf(data, "failed setting SRP cipher list");
return CURLE_SSL_CIPHER;
}
@@ -2715,19 +2822,195 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
}
#endif
+
+#if defined(USE_WIN32_CRYPTO)
+ /* Import certificates from the Windows root certificate store if requested.
+ https://stackoverflow.com/questions/9507184/
+ https://github.com/d3x0r/SACK/blob/master/src/netlib/ssl_layer.c#L1037
+ https://tools.ietf.org/html/rfc5280 */
+ if((SSL_CONN_CONFIG(verifypeer) || SSL_CONN_CONFIG(verifyhost)) &&
+ (SSL_SET_OPTION(native_ca_store))) {
+ X509_STORE *store = SSL_CTX_get_cert_store(backend->ctx);
+ HCERTSTORE hStore = CertOpenSystemStore((HCRYPTPROV_LEGACY)NULL,
+ TEXT("ROOT"));
+
+ if(hStore) {
+ PCCERT_CONTEXT pContext = NULL;
+ /* The array of enhanced key usage OIDs will vary per certificate and is
+ declared outside of the loop so that rather than malloc/free each
+ iteration we can grow it with realloc, when necessary. */
+ CERT_ENHKEY_USAGE *enhkey_usage = NULL;
+ DWORD enhkey_usage_size = 0;
+
+ /* This loop makes a best effort to import all valid certificates from
+ the MS root store. If a certificate cannot be imported it is skipped.
+ 'result' is used to store only hard-fail conditions (such as out of
+ memory) that cause an early break. */
+ result = CURLE_OK;
+ for(;;) {
+ X509 *x509;
+ FILETIME now;
+ BYTE key_usage[2];
+ DWORD req_size;
+ const unsigned char *encoded_cert;
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ char cert_name[256];
+#endif
+
+ pContext = CertEnumCertificatesInStore(hStore, pContext);
+ if(!pContext)
+ break;
+
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ if(!CertGetNameStringA(pContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0,
+ NULL, cert_name, sizeof(cert_name))) {
+ strcpy(cert_name, "Unknown");
+ }
+ infof(data, "SSL: Checking cert \"%s\"\n", cert_name);
+#endif
+
+ encoded_cert = (const unsigned char *)pContext->pbCertEncoded;
+ if(!encoded_cert)
+ continue;
+
+ GetSystemTimeAsFileTime(&now);
+ if(CompareFileTime(&pContext->pCertInfo->NotBefore, &now) > 0 ||
+ CompareFileTime(&now, &pContext->pCertInfo->NotAfter) > 0)
+ continue;
+
+ /* If key usage exists check for signing attribute */
+ if(CertGetIntendedKeyUsage(pContext->dwCertEncodingType,
+ pContext->pCertInfo,
+ key_usage, sizeof(key_usage))) {
+ if(!(key_usage[0] & CERT_KEY_CERT_SIGN_KEY_USAGE))
+ continue;
+ }
+ else if(GetLastError())
+ continue;
+
+ /* If enhanced key usage exists check for server auth attribute.
+ *
+ * Note "In a Microsoft environment, a certificate might also have EKU
+ * extended properties that specify valid uses for the certificate."
+ * The call below checks both, and behavior varies depending on what is
+ * found. For more details see CertGetEnhancedKeyUsage doc.
+ */
+ if(CertGetEnhancedKeyUsage(pContext, 0, NULL, &req_size)) {
+ if(req_size && req_size > enhkey_usage_size) {
+ void *tmp = realloc(enhkey_usage, req_size);
+
+ if(!tmp) {
+ failf(data, "SSL: Out of memory allocating for OID list");
+ result = CURLE_OUT_OF_MEMORY;
+ break;
+ }
+
+ enhkey_usage = (CERT_ENHKEY_USAGE *)tmp;
+ enhkey_usage_size = req_size;
+ }
+
+ if(CertGetEnhancedKeyUsage(pContext, 0, enhkey_usage, &req_size)) {
+ if(!enhkey_usage->cUsageIdentifier) {
+ /* "If GetLastError returns CRYPT_E_NOT_FOUND, the certificate is
+ good for all uses. If it returns zero, the certificate has no
+ valid uses." */
+ if((HRESULT)GetLastError() != CRYPT_E_NOT_FOUND)
+ continue;
+ }
+ else {
+ DWORD i;
+ bool found = false;
+
+ for(i = 0; i < enhkey_usage->cUsageIdentifier; ++i) {
+ if(!strcmp("1.3.6.1.5.5.7.3.1" /* OID server auth */,
+ enhkey_usage->rgpszUsageIdentifier[i])) {
+ found = true;
+ break;
+ }
+ }
+
+ if(!found)
+ continue;
+ }
+ }
+ else
+ continue;
+ }
+ else
+ continue;
+
+ x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded);
+ if(!x509)
+ continue;
+
+ /* Try to import the certificate. This may fail for legitimate reasons
+ such as duplicate certificate, which is allowed by MS but not
+ OpenSSL. */
+ if(X509_STORE_add_cert(store, x509) == 1) {
+#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
+ infof(data, "SSL: Imported cert \"%s\"\n", cert_name);
+#endif
+ imported_native_ca = true;
+ }
+ X509_free(x509);
+ }
+
+ free(enhkey_usage);
+ CertFreeCertificateContext(pContext);
+ CertCloseStore(hStore, 0);
+
+ if(result)
+ return result;
+ }
+ if(imported_native_ca)
+ infof(data, "successfully imported windows ca store\n");
+ else
+ infof(data, "error importing windows ca store, continuing anyway\n");
+ }
+#endif
+
+#if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3)
+ /* OpenSSL 3.0.0 has deprecated SSL_CTX_load_verify_locations */
+ {
+ if(ssl_cafile) {
+ if(!SSL_CTX_load_verify_file(backend->ctx, ssl_cafile)) {
+ if(verifypeer && !imported_native_ca) {
+ /* Fail if we insist on successfully verifying the server. */
+ failf(data, "error setting certificate file: %s", ssl_cafile);
+ return CURLE_SSL_CACERT_BADFILE;
+ }
+ /* Continue with a warning if no certificate verif is required. */
+ infof(data, "error setting certificate file, continuing anyway\n");
+ }
+ infof(data, " CAfile: %s\n", ssl_cafile);
+ }
+ if(ssl_capath) {
+ if(!SSL_CTX_load_verify_dir(backend->ctx, ssl_capath)) {
+ if(verifypeer && !imported_native_ca) {
+ /* Fail if we insist on successfully verifying the server. */
+ failf(data, "error setting certificate path: %s", ssl_capath);
+ return CURLE_SSL_CACERT_BADFILE;
+ }
+ /* Continue with a warning if no certificate verif is required. */
+ infof(data, "error setting certificate path, continuing anyway\n");
+ }
+ infof(data, " CApath: %s\n", ssl_capath);
+ }
+ }
+#else
if(ssl_cafile || ssl_capath) {
/* tell SSL where to find CA certificates that are used to verify
the servers certificate. */
- if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {
- if(verifypeer) {
+ if(!SSL_CTX_load_verify_locations(backend->ctx, ssl_cafile, ssl_capath)) {
+ if(verifypeer && !imported_native_ca) {
/* Fail if we insist on successfully verifying the server. */
- failf(data, "error setting certificate verify locations:\n"
- " CAfile: %s\n CApath: %s",
+ failf(data, "error setting certificate verify locations:"
+ " CAfile: %s CApath: %s",
ssl_cafile ? ssl_cafile : "none",
ssl_capath ? ssl_capath : "none");
return CURLE_SSL_CACERT_BADFILE;
}
- /* Just continue with a warning if no strict certificate verification
+ /* Just continue with a warning if no strict certificate verification
is required. */
infof(data, "error setting certificate verify locations,"
" continuing anyway:\n");
@@ -2736,24 +3019,23 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
/* Everything is fine. */
infof(data, "successfully set certificate verify locations:\n");
}
- infof(data,
- " CAfile: %s\n"
- " CApath: %s\n",
- ssl_cafile ? ssl_cafile : "none",
- ssl_capath ? ssl_capath : "none");
+ infof(data, " CAfile: %s\n", ssl_cafile ? ssl_cafile : "none");
+ infof(data, " CApath: %s\n", ssl_capath ? ssl_capath : "none");
}
+#endif
+
#ifdef CURL_CA_FALLBACK
- else if(verifypeer) {
+ if(verifypeer && !ssl_cafile && !ssl_capath && !imported_native_ca) {
/* verifying the peer without any CA certificates won't
work so use openssl's built in default as fallback */
- SSL_CTX_set_default_verify_paths(BACKEND->ctx);
+ SSL_CTX_set_default_verify_paths(backend->ctx);
}
#endif
if(ssl_crlfile) {
/* tell SSL where to find CRL file that is used to check certificate
* revocation */
- lookup = X509_STORE_add_lookup(SSL_CTX_get_cert_store(BACKEND->ctx),
+ lookup = X509_STORE_add_lookup(SSL_CTX_get_cert_store(backend->ctx),
X509_LOOKUP_file());
if(!lookup ||
(!X509_load_crl_file(lookup, ssl_crlfile, X509_FILETYPE_PEM)) ) {
@@ -2762,37 +3044,50 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
}
/* Everything is fine. */
infof(data, "successfully load CRL file:\n");
- X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
+ X509_STORE_set_flags(SSL_CTX_get_cert_store(backend->ctx),
X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
infof(data, " CRLfile: %s\n", ssl_crlfile);
}
- /* Try building a chain using issuers in the trusted store first to avoid
- problems with server-sent legacy intermediates. Newer versions of
- OpenSSL do alternate chain checking by default which gives us the same
- fix without as much of a performance hit (slight), so we prefer that if
- available.
- https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
- */
-#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
if(verifypeer) {
- X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
+ /* Try building a chain using issuers in the trusted store first to avoid
+ problems with server-sent legacy intermediates. Newer versions of
+ OpenSSL do alternate chain checking by default but we do not know how to
+ determine that in a reliable manner.
+ https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
+ */
+#if defined(X509_V_FLAG_TRUSTED_FIRST)
+ X509_STORE_set_flags(SSL_CTX_get_cert_store(backend->ctx),
X509_V_FLAG_TRUSTED_FIRST);
- }
#endif
+#ifdef X509_V_FLAG_PARTIAL_CHAIN
+ if(!SSL_SET_OPTION(no_partialchain) && !ssl_crlfile) {
+ /* Have intermediate certificates in the trust store be treated as
+ trust-anchors, in the same way as self-signed root CA certificates
+ are. This allows users to verify servers using the intermediate cert
+ only, instead of needing the whole chain.
+
+ Due to OpenSSL bug https://github.com/openssl/openssl/issues/5081 we
+ cannot do partial chains with CRL check.
+ */
+ X509_STORE_set_flags(SSL_CTX_get_cert_store(backend->ctx),
+ X509_V_FLAG_PARTIAL_CHAIN);
+ }
+#endif
+ }
/* SSL always tries to verify the peer, this only says whether it should
* fail to connect if the verification fails, or if it should continue
* anyway. In the latter case the result of the verification is checked with
* SSL_get_verify_result() below. */
- SSL_CTX_set_verify(BACKEND->ctx,
+ SSL_CTX_set_verify(backend->ctx,
verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
/* Enable logging of secrets to the file specified in env SSLKEYLOGFILE. */
-#if defined(ENABLE_SSLKEYLOGFILE) && defined(HAVE_KEYLOG_CALLBACK)
- if(keylog_file_fp) {
- SSL_CTX_set_keylog_callback(BACKEND->ctx, ossl_keylog_callback);
+#ifdef HAVE_KEYLOG_CALLBACK
+ if(Curl_tls_keylog_enabled()) {
+ SSL_CTX_set_keylog_callback(backend->ctx, ossl_keylog_callback);
}
#endif
@@ -2800,14 +3095,16 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
* callback. Use the "external storage" mode to avoid that OpenSSL creates
* an internal session cache.
*/
- SSL_CTX_set_session_cache_mode(BACKEND->ctx,
+ SSL_CTX_set_session_cache_mode(backend->ctx,
SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
- SSL_CTX_sess_set_new_cb(BACKEND->ctx, ossl_new_session_cb);
+ SSL_CTX_sess_set_new_cb(backend->ctx, ossl_new_session_cb);
/* give application a chance to interfere with SSL set up. */
if(data->set.ssl.fsslctx) {
- result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
+ Curl_set_in_callback(data, true);
+ result = (*data->set.ssl.fsslctx)(data, backend->ctx,
data->set.ssl.fsslctxp);
+ Curl_set_in_callback(data, false);
if(result) {
failf(data, "error signaled by ssl ctx callback");
return result;
@@ -2815,10 +3112,10 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
}
/* Lets make an SSL structure */
- if(BACKEND->handle)
- SSL_free(BACKEND->handle);
- BACKEND->handle = SSL_new(BACKEND->ctx);
- if(!BACKEND->handle) {
+ if(backend->handle)
+ SSL_free(backend->handle);
+ backend->handle = SSL_new(backend->ctx);
+ if(!backend->handle) {
failf(data, "SSL: couldn't create a context (handle)!");
return CURLE_OUT_OF_MEMORY;
}
@@ -2826,23 +3123,23 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
#if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
!defined(OPENSSL_NO_OCSP)
if(SSL_CONN_CONFIG(verifystatus))
- SSL_set_tlsext_status_type(BACKEND->handle, TLSEXT_STATUSTYPE_ocsp);
+ SSL_set_tlsext_status_type(backend->handle, TLSEXT_STATUSTYPE_ocsp);
#endif
#if defined(OPENSSL_IS_BORINGSSL) && defined(ALLOW_RENEG)
- SSL_set_renegotiate_mode(BACKEND->handle, ssl_renegotiate_freely);
+ SSL_set_renegotiate_mode(backend->handle, ssl_renegotiate_freely);
#endif
- SSL_set_connect_state(BACKEND->handle);
+ SSL_set_connect_state(backend->handle);
- BACKEND->server_cert = 0x0;
+ backend->server_cert = 0x0;
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
if((0 == Curl_inet_pton(AF_INET, hostname, &addr)) &&
#ifdef ENABLE_IPV6
(0 == Curl_inet_pton(AF_INET6, hostname, &addr)) &&
#endif
sni &&
- !SSL_set_tlsext_host_name(BACKEND->handle, hostname))
+ !SSL_set_tlsext_host_name(backend->handle, hostname))
infof(data, "WARNING: failed to configure server name indication (SNI) "
"TLS extension\n");
#endif
@@ -2856,14 +3153,14 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
if(connectdata_idx >= 0 && sockindex_idx >= 0) {
/* Store the data needed for the "new session" callback.
* The sockindex is stored as a pointer to an array element. */
- SSL_set_ex_data(BACKEND->handle, connectdata_idx, conn);
- SSL_set_ex_data(BACKEND->handle, sockindex_idx, conn->sock + sockindex);
+ SSL_set_ex_data(backend->handle, connectdata_idx, conn);
+ SSL_set_ex_data(backend->handle, sockindex_idx, conn->sock + sockindex);
}
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
/* we got a session id, use it! */
- if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
+ if(!SSL_set_session(backend->handle, ssl_sessionid)) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSL_set_session failed: %s",
ossl_strerror(ERR_get_error(), error_buffer,
@@ -2876,6 +3173,7 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
Curl_ssl_sessionid_unlock(conn);
}
+#ifndef CURL_DISABLE_PROXY
if(conn->proxy_ssl[sockindex].use) {
BIO *const bio = BIO_new(BIO_f_ssl());
SSL *handle = conn->proxy_ssl[sockindex].backend->handle;
@@ -2883,9 +3181,11 @@ static CURLcode ossl_connect_step1(struct connectdata *conn, int sockindex)
DEBUGASSERT(handle != NULL);
DEBUGASSERT(bio != NULL);
BIO_set_ssl(bio, handle, FALSE);
- SSL_set_bio(BACKEND->handle, bio, bio);
+ SSL_set_bio(backend->handle, bio, bio);
}
- else if(!SSL_set_fd(BACKEND->handle, (int)sockfd)) {
+ else
+#endif
+ if(!SSL_set_fd(backend->handle, (int)sockfd)) {
/* pass the raw socket into the SSL layers */
failf(data, "SSL: SSL_set_fd failed: %s",
ossl_strerror(ERR_get_error(), error_buffer, sizeof(error_buffer)));
@@ -2902,26 +3202,28 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
struct Curl_easy *data = conn->data;
int err;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
+ struct ssl_backend_data *backend = connssl->backend;
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
|| ssl_connect_2_reading == connssl->connecting_state
|| ssl_connect_2_writing == connssl->connecting_state);
ERR_clear_error();
- err = SSL_connect(BACKEND->handle);
- /* If keylogging is enabled but the keylog callback is not supported then log
- secrets here, immediately after SSL_connect by using tap_ssl_key. */
-#if defined(ENABLE_SSLKEYLOGFILE) && !defined(HAVE_KEYLOG_CALLBACK)
- tap_ssl_key(BACKEND->handle, &BACKEND->tap_state);
+ err = SSL_connect(backend->handle);
+#ifndef HAVE_KEYLOG_CALLBACK
+ if(Curl_tls_keylog_enabled()) {
+ /* If key logging is enabled, wait for the handshake to complete and then
+ * proceed with logging secrets (for TLS 1.2 or older).
+ */
+ ossl_log_tls12_secret(backend->handle, &backend->keylog_done);
+ }
#endif
/* 1 is fine
0 is "not successful but was shut down controlled"
<0 is "handshake was not successful, because a fatal error occurred" */
if(1 != err) {
- int detail = SSL_get_error(BACKEND->handle, err);
+ int detail = SSL_get_error(backend->handle, err);
if(SSL_ERROR_WANT_READ == detail) {
connssl->connecting_state = ssl_connect_2_reading;
@@ -2958,12 +3260,13 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
reason = ERR_GET_REASON(errdetail);
if((lib == ERR_LIB_SSL) &&
- (reason == SSL_R_CERTIFICATE_VERIFY_FAILED)) {
+ ((reason == SSL_R_CERTIFICATE_VERIFY_FAILED) ||
+ (reason == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED))) {
result = CURLE_PEER_FAILED_VERIFICATION;
- lerr = SSL_get_verify_result(BACKEND->handle);
+ lerr = SSL_get_verify_result(backend->handle);
if(lerr != X509_V_OK) {
- *certverifyresult = lerr;
+ SSL_SET_OPTION_LVALUE(certverifyresult) = lerr;
msnprintf(error_buffer, sizeof(error_buffer),
"SSL certificate problem: %s",
X509_verify_cert_error_string(lerr));
@@ -2985,11 +3288,19 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
* the SO_ERROR is also lost.
*/
if(CURLE_SSL_CONNECT_ERROR == result && errdetail == 0) {
- const char * const hostname = SSL_IS_PROXY() ?
- conn->http_proxy.host.name : conn->host.name;
+ const char * const hostname = SSL_HOST_NAME();
+#ifndef CURL_DISABLE_PROXY
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+#else
+ const long int port = conn->remote_port;
+#endif
+ char extramsg[80]="";
+ int sockerr = SOCKERRNO;
+ if(sockerr && detail == SSL_ERROR_SYSCALL)
+ Curl_strerror(sockerr, extramsg, sizeof(extramsg));
failf(data, OSSL_PACKAGE " SSL_connect: %s in connection to %s:%ld ",
- SSL_ERROR_to_str(detail), hostname, port);
+ extramsg[0] ? extramsg : SSL_ERROR_to_str(detail),
+ hostname, port);
return result;
}
@@ -3005,8 +3316,8 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
/* Informational message */
infof(data, "SSL connection using %s / %s\n",
- get_ssl_version_txt(BACKEND->handle),
- SSL_get_cipher(BACKEND->handle));
+ get_ssl_version_txt(backend->handle),
+ SSL_get_cipher(backend->handle));
#ifdef HAS_ALPN
/* Sets data and len to negotiated protocol, len is 0 if no protocol was
@@ -3015,7 +3326,7 @@ static CURLcode ossl_connect_step2(struct connectdata *conn, int sockindex)
if(conn->bits.tls_enable_alpn) {
const unsigned char *neg_protocol;
unsigned int len;
- SSL_get0_alpn_selected(BACKEND->handle, &neg_protocol, &len);
+ SSL_get0_alpn_selected(backend->handle, &neg_protocol, &len);
if(len != 0) {
infof(data, "ALPN, server accepted to use %.*s\n", len, neg_protocol);
@@ -3065,7 +3376,7 @@ do { \
Curl_ssl_push_certinfo_len(data, _num, _label, ptr, info_len); \
if(1 != BIO_reset(mem)) \
break; \
-} WHILE_FALSE
+} while(0)
static void pubkey_show(struct Curl_easy *data,
BIO *mem,
@@ -3097,31 +3408,28 @@ do { \
if(_type->_name) { \
pubkey_show(data, mem, _num, #_type, #_name, _type->_name); \
} \
-} WHILE_FALSE
+} while(0)
#endif
-static int X509V3_ext(struct Curl_easy *data,
+static void X509V3_ext(struct Curl_easy *data,
int certnum,
CONST_EXTS STACK_OF(X509_EXTENSION) *exts)
{
int i;
- size_t j;
if((int)sk_X509_EXTENSION_num(exts) <= 0)
/* no extensions, bail out */
- return 1;
+ return;
for(i = 0; i < (int)sk_X509_EXTENSION_num(exts); i++) {
ASN1_OBJECT *obj;
X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
BUF_MEM *biomem;
- char buf[512];
- char *ptr = buf;
char namebuf[128];
BIO *bio_out = BIO_new(BIO_s_mem());
if(!bio_out)
- return 1;
+ return;
obj = X509_EXTENSION_get_object(ext);
@@ -3131,26 +3439,10 @@ static int X509V3_ext(struct Curl_easy *data,
ASN1_STRING_print(bio_out, (ASN1_STRING *)X509_EXTENSION_get_data(ext));
BIO_get_mem_ptr(bio_out, &biomem);
-
- for(j = 0; j < (size_t)biomem->length; j++) {
- const char *sep = "";
- if(biomem->data[j] == '\n') {
- sep = ", ";
- j++; /* skip the newline */
- };
- while((j<(size_t)biomem->length) && (biomem->data[j] == ' '))
- j++;
- if(j<(size_t)biomem->length)
- ptr += msnprintf(ptr, sizeof(buf)-(ptr-buf), "%s%c", sep,
- biomem->data[j]);
- }
-
- Curl_ssl_push_certinfo(data, certnum, namebuf, buf);
-
+ Curl_ssl_push_certinfo_len(data, certnum, namebuf, biomem->data,
+ biomem->length);
BIO_free(bio_out);
-
}
- return 0; /* all is fine */
}
#ifdef OPENSSL_IS_BORINGSSL
@@ -3169,8 +3461,9 @@ static CURLcode get_cert_chain(struct connectdata *conn,
struct Curl_easy *data = conn->data;
numcert_t numcerts;
BIO *mem;
+ struct ssl_backend_data *backend = connssl->backend;
- sk = SSL_get_peer_cert_chain(BACKEND->handle);
+ sk = SSL_get_peer_cert_chain(backend->handle);
if(!sk) {
return CURLE_OUT_OF_MEMORY;
}
@@ -3453,16 +3746,15 @@ static CURLcode servercert(struct connectdata *conn,
char error_buffer[256]="";
char buffer[2048];
const char *ptr;
- long * const certverifyresult = SSL_IS_PROXY() ?
- &data->set.proxy_ssl.certverifyresult : &data->set.ssl.certverifyresult;
BIO *mem = BIO_new(BIO_s_mem());
+ struct ssl_backend_data *backend = connssl->backend;
if(data->set.ssl.certinfo)
/* we've been asked to gather certificate info! */
(void)get_cert_chain(conn, connssl);
- BACKEND->server_cert = SSL_get_peer_certificate(BACKEND->handle);
- if(!BACKEND->server_cert) {
+ backend->server_cert = SSL_get_peer_certificate(backend->handle);
+ if(!backend->server_cert) {
BIO_free(mem);
if(!strict)
return CURLE_OK;
@@ -3473,19 +3765,19 @@ static CURLcode servercert(struct connectdata *conn,
infof(data, "%s certificate:\n", SSL_IS_PROXY() ? "Proxy" : "Server");
- rc = x509_name_oneline(X509_get_subject_name(BACKEND->server_cert),
+ rc = x509_name_oneline(X509_get_subject_name(backend->server_cert),
buffer, sizeof(buffer));
infof(data, " subject: %s\n", rc?"[NONE]":buffer);
#ifndef CURL_DISABLE_VERBOSE_STRINGS
{
long len;
- ASN1_TIME_print(mem, X509_get0_notBefore(BACKEND->server_cert));
+ ASN1_TIME_print(mem, X509_get0_notBefore(backend->server_cert));
len = BIO_get_mem_data(mem, (char **) &ptr);
infof(data, " start date: %.*s\n", len, ptr);
(void)BIO_reset(mem);
- ASN1_TIME_print(mem, X509_get0_notAfter(BACKEND->server_cert));
+ ASN1_TIME_print(mem, X509_get0_notAfter(backend->server_cert));
len = BIO_get_mem_data(mem, (char **) &ptr);
infof(data, " expire date: %.*s\n", len, ptr);
(void)BIO_reset(mem);
@@ -3495,15 +3787,15 @@ static CURLcode servercert(struct connectdata *conn,
BIO_free(mem);
if(SSL_CONN_CONFIG(verifyhost)) {
- result = verifyhost(conn, BACKEND->server_cert);
+ result = verifyhost(conn, backend->server_cert);
if(result) {
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
return result;
}
}
- rc = x509_name_oneline(X509_get_issuer_name(BACKEND->server_cert),
+ rc = x509_name_oneline(X509_get_issuer_name(backend->server_cert),
buffer, sizeof(buffer));
if(rc) {
if(strict)
@@ -3517,27 +3809,32 @@ static CURLcode servercert(struct connectdata *conn,
deallocating the certificate. */
/* e.g. match issuer name with provided issuer certificate */
- if(SSL_SET_OPTION(issuercert)) {
- fp = BIO_new(BIO_s_file());
- if(fp == NULL) {
- failf(data,
- "BIO_new return NULL, " OSSL_PACKAGE
- " error %s",
- ossl_strerror(ERR_get_error(), error_buffer,
- sizeof(error_buffer)) );
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
- return CURLE_OUT_OF_MEMORY;
- }
+ if(SSL_SET_OPTION(issuercert) || SSL_SET_OPTION(issuercert_blob)) {
+ if(SSL_SET_OPTION(issuercert_blob))
+ fp = BIO_new_mem_buf(SSL_SET_OPTION(issuercert_blob)->data,
+ (int)SSL_SET_OPTION(issuercert_blob)->len);
+ else {
+ fp = BIO_new(BIO_s_file());
+ if(fp == NULL) {
+ failf(data,
+ "BIO_new return NULL, " OSSL_PACKAGE
+ " error %s",
+ ossl_strerror(ERR_get_error(), error_buffer,
+ sizeof(error_buffer)) );
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
+ return CURLE_OUT_OF_MEMORY;
+ }
- if(BIO_read_filename(fp, SSL_SET_OPTION(issuercert)) <= 0) {
- if(strict)
- failf(data, "SSL: Unable to open issuer cert (%s)",
- SSL_SET_OPTION(issuercert));
- BIO_free(fp);
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
- return CURLE_SSL_ISSUER_ERROR;
+ if(BIO_read_filename(fp, SSL_SET_OPTION(issuercert)) <= 0) {
+ if(strict)
+ failf(data, "SSL: Unable to open issuer cert (%s)",
+ SSL_SET_OPTION(issuercert));
+ BIO_free(fp);
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
+ return CURLE_SSL_ISSUER_ERROR;
+ }
}
issuer = PEM_read_bio_X509(fp, NULL, ZERO_NULL, NULL);
@@ -3547,19 +3844,19 @@ static CURLcode servercert(struct connectdata *conn,
SSL_SET_OPTION(issuercert));
BIO_free(fp);
X509_free(issuer);
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
return CURLE_SSL_ISSUER_ERROR;
}
- if(X509_check_issued(issuer, BACKEND->server_cert) != X509_V_OK) {
+ if(X509_check_issued(issuer, backend->server_cert) != X509_V_OK) {
if(strict)
failf(data, "SSL: Certificate issuer check failed (%s)",
SSL_SET_OPTION(issuercert));
BIO_free(fp);
X509_free(issuer);
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
return CURLE_SSL_ISSUER_ERROR;
}
@@ -3569,9 +3866,9 @@ static CURLcode servercert(struct connectdata *conn,
X509_free(issuer);
}
- lerr = *certverifyresult = SSL_get_verify_result(BACKEND->handle);
-
- if(*certverifyresult != X509_V_OK) {
+ lerr = SSL_get_verify_result(backend->handle);
+ SSL_SET_OPTION_LVALUE(certverifyresult) = lerr;
+ if(lerr != X509_V_OK) {
if(SSL_CONN_CONFIG(verifypeer)) {
/* We probably never reach this, because SSL_connect() will fail
and we return earlier if verifypeer is set? */
@@ -3594,8 +3891,8 @@ static CURLcode servercert(struct connectdata *conn,
if(SSL_CONN_CONFIG(verifystatus)) {
result = verifystatus(conn, connssl);
if(result) {
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
return result;
}
}
@@ -3608,13 +3905,13 @@ static CURLcode servercert(struct connectdata *conn,
ptr = SSL_IS_PROXY() ? data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
if(!result && ptr) {
- result = pkp_pin_peer_pubkey(data, BACKEND->server_cert, ptr);
+ result = pkp_pin_peer_pubkey(data, backend->server_cert, ptr);
if(result)
failf(data, "SSL: public key does not match pinned public key!");
}
- X509_free(BACKEND->server_cert);
- BACKEND->server_cert = NULL;
+ X509_free(backend->server_cert);
+ backend->server_cert = NULL;
connssl->connecting_state = ssl_connect_done;
return result;
@@ -3655,7 +3952,6 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -3666,7 +3962,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
if(ssl_connect_1 == connssl->connecting_state) {
/* Find out how much more time we're allowed */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ const timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* no need to continue if time already is up */
@@ -3684,7 +3980,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
ssl_connect_2_writing == connssl->connecting_state) {
/* check allowed time left */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ const timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* no need to continue if time already is up */
@@ -3702,7 +3998,7 @@ static CURLcode ossl_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking?0:(time_t)timeout_ms);
+ nonblocking?0:timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -3781,14 +4077,15 @@ static bool Curl_ossl_data_pending(const struct connectdata *conn,
int connindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[connindex];
- const struct ssl_connect_data *proxyssl = &conn->proxy_ssl[connindex];
-
if(connssl->backend->handle && SSL_pending(connssl->backend->handle))
return TRUE;
-
- if(proxyssl->backend->handle && SSL_pending(proxyssl->backend->handle))
- return TRUE;
-
+#ifndef CURL_DISABLE_PROXY
+ {
+ const struct ssl_connect_data *proxyssl = &conn->proxy_ssl[connindex];
+ if(proxyssl->backend->handle && SSL_pending(proxyssl->backend->handle))
+ return TRUE;
+ }
+#endif
return FALSE;
}
@@ -3808,14 +4105,15 @@ static ssize_t ossl_send(struct connectdata *conn,
int memlen;
int rc;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
ERR_clear_error();
memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
- rc = SSL_write(BACKEND->handle, mem, memlen);
+ rc = SSL_write(backend->handle, mem, memlen);
if(rc <= 0) {
- err = SSL_get_error(BACKEND->handle, rc);
+ err = SSL_get_error(backend->handle, rc);
switch(err) {
case SSL_ERROR_WANT_READ:
@@ -3826,18 +4124,33 @@ static ssize_t ossl_send(struct connectdata *conn,
*curlcode = CURLE_AGAIN;
return -1;
case SSL_ERROR_SYSCALL:
- Curl_strerror(SOCKERRNO, error_buffer, sizeof(error_buffer));
- failf(conn->data, OSSL_PACKAGE " SSL_write: %s", error_buffer);
- *curlcode = CURLE_SEND_ERROR;
- return -1;
+ {
+ int sockerr = SOCKERRNO;
+ sslerror = ERR_get_error();
+ if(sslerror)
+ ossl_strerror(sslerror, error_buffer, sizeof(error_buffer));
+ else if(sockerr)
+ Curl_strerror(sockerr, error_buffer, sizeof(error_buffer));
+ else {
+ strncpy(error_buffer, SSL_ERROR_to_str(err), sizeof(error_buffer));
+ error_buffer[sizeof(error_buffer) - 1] = '\0';
+ }
+ failf(conn->data, OSSL_PACKAGE " SSL_write: %s, errno %d",
+ error_buffer, sockerr);
+ *curlcode = CURLE_SEND_ERROR;
+ return -1;
+ }
case SSL_ERROR_SSL:
/* A failure in the SSL library occurred, usually a protocol error.
The OpenSSL error queue contains more information on the error. */
sslerror = ERR_get_error();
if(ERR_GET_LIB(sslerror) == ERR_LIB_SSL &&
ERR_GET_REASON(sslerror) == SSL_R_BIO_NOT_SET &&
- conn->ssl[sockindex].state == ssl_connection_complete &&
- conn->proxy_ssl[sockindex].state == ssl_connection_complete) {
+ conn->ssl[sockindex].state == ssl_connection_complete
+#ifndef CURL_DISABLE_PROXY
+ && conn->proxy_ssl[sockindex].state == ssl_connection_complete
+#endif
+ ) {
char ver[120];
Curl_ossl_version(ver, 120);
failf(conn->data, "Error: %s does not support double SSL tunneling.",
@@ -3870,14 +4183,15 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
ssize_t nread;
int buffsize;
struct ssl_connect_data *connssl = &conn->ssl[num];
+ struct ssl_backend_data *backend = connssl->backend;
ERR_clear_error();
buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
- nread = (ssize_t)SSL_read(BACKEND->handle, buf, buffsize);
+ nread = (ssize_t)SSL_read(backend->handle, buf, buffsize);
if(nread <= 0) {
/* failed SSL_read */
- int err = SSL_get_error(BACKEND->handle, (int)nread);
+ int err = SSL_get_error(backend->handle, (int)nread);
switch(err) {
case SSL_ERROR_NONE: /* this is not an error */
@@ -3894,11 +4208,6 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
/* there's data pending, re-invoke SSL_read() */
*curlcode = CURLE_AGAIN;
return -1;
- case SSL_ERROR_SYSCALL:
- Curl_strerror(SOCKERRNO, error_buffer, sizeof(error_buffer));
- failf(conn->data, OSSL_PACKAGE " SSL_read: %s", error_buffer);
- *curlcode = CURLE_RECV_ERROR;
- return -1;
default:
/* openssl/ssl.h for SSL_ERROR_SYSCALL says "look at error stack/return
value/errno" */
@@ -3907,14 +4216,44 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
if((nread < 0) || sslerror) {
/* If the return code was negative or there actually is an error in the
queue */
+ int sockerr = SOCKERRNO;
+ if(sslerror)
+ ossl_strerror(sslerror, error_buffer, sizeof(error_buffer));
+ else if(sockerr && err == SSL_ERROR_SYSCALL)
+ Curl_strerror(sockerr, error_buffer, sizeof(error_buffer));
+ else {
+ strncpy(error_buffer, SSL_ERROR_to_str(err), sizeof(error_buffer));
+ error_buffer[sizeof(error_buffer) - 1] = '\0';
+ }
failf(conn->data, OSSL_PACKAGE " SSL_read: %s, errno %d",
- (sslerror ?
- ossl_strerror(sslerror, error_buffer, sizeof(error_buffer)) :
- SSL_ERROR_to_str(err)),
- SOCKERRNO);
+ error_buffer, sockerr);
+ *curlcode = CURLE_RECV_ERROR;
+ return -1;
+ }
+ /* For debug builds be a little stricter and error on any
+ SSL_ERROR_SYSCALL. For example a server may have closed the connection
+ abruptly without a close_notify alert. For compatibility with older
+ peers we don't do this by default. #4624
+
+ We can use this to gauge how many users may be affected, and
+ if it goes ok eventually transition to allow in dev and release with
+ the newest OpenSSL: #if (OPENSSL_VERSION_NUMBER >= 0x10101000L) */
+#ifdef DEBUGBUILD
+ if(err == SSL_ERROR_SYSCALL) {
+ int sockerr = SOCKERRNO;
+ if(sockerr)
+ Curl_strerror(sockerr, error_buffer, sizeof(error_buffer));
+ else {
+ msnprintf(error_buffer, sizeof(error_buffer),
+ "Connection closed abruptly");
+ }
+ failf(conn->data, OSSL_PACKAGE " SSL_read: %s, errno %d"
+ " (Fatal because this is a curl debug build)",
+ error_buffer, sockerr);
*curlcode = CURLE_RECV_ERROR;
return -1;
}
+#endif
}
}
return nread;
@@ -3922,13 +4261,35 @@ static ssize_t ossl_recv(struct connectdata *conn, /* connection data */
static size_t Curl_ossl_version(char *buffer, size_t size)
{
-#ifdef OPENSSL_IS_BORINGSSL
+#ifdef LIBRESSL_VERSION_NUMBER
+#if LIBRESSL_VERSION_NUMBER < 0x2070100fL
+ return msnprintf(buffer, size, "%s/%lx.%lx.%lx",
+ OSSL_PACKAGE,
+ (LIBRESSL_VERSION_NUMBER>>28)&0xf,
+ (LIBRESSL_VERSION_NUMBER>>20)&0xff,
+ (LIBRESSL_VERSION_NUMBER>>12)&0xff);
+#else /* OpenSSL_version() first appeared in LibreSSL 2.7.1 */
+ char *p;
+ int count;
+ const char *ver = OpenSSL_version(OPENSSL_VERSION);
+ const char expected[] = OSSL_PACKAGE " "; /* ie "LibreSSL " */
+ if(Curl_strncasecompare(ver, expected, sizeof(expected) - 1)) {
+ ver += sizeof(expected) - 1;
+ }
+ count = msnprintf(buffer, size, "%s/%s", OSSL_PACKAGE, ver);
+ for(p = buffer; *p; ++p) {
+ if(ISSPACE(*p))
+ *p = '_';
+ }
+ return count;
+#endif
+#elif defined(OPENSSL_IS_BORINGSSL)
return msnprintf(buffer, size, OSSL_PACKAGE);
#elif defined(HAVE_OPENSSL_VERSION) && defined(OPENSSL_VERSION_STRING)
return msnprintf(buffer, size, "%s/%s",
OSSL_PACKAGE, OpenSSL_version(OPENSSL_VERSION_STRING));
#else
- /* not BoringSSL and not using OpenSSL_version */
+ /* not LibreSSL, BoringSSL and not using OpenSSL_version */
char sub[3];
unsigned long ssleay_value;
@@ -4013,7 +4374,7 @@ static CURLcode Curl_ossl_sha256sum(const unsigned char *tmp, /* input */
unsigned int len = 0;
(void) unused;
- mdctx = EVP_MD_CTX_create();
+ mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
EVP_DigestUpdate(mdctx, tmp, tmplen);
EVP_DigestFinal_ex(mdctx, sha256sum, &len);
@@ -4036,8 +4397,9 @@ static void *Curl_ossl_get_internals(struct ssl_connect_data *connssl,
CURLINFO info)
{
/* Legacy: CURLINFO_TLS_SESSION must return an SSL_CTX pointer. */
+ struct ssl_backend_data *backend = connssl->backend;
return info == CURLINFO_TLS_SESSION ?
- (void *)BACKEND->ctx : (void *)BACKEND->handle;
+ (void *)backend->ctx : (void *)backend->handle;
}
const struct Curl_ssl Curl_ssl_openssl = {
diff --git a/lib/vtls/polarssl.c b/lib/vtls/polarssl.c
deleted file mode 100644
index 9e7dd9043..000000000
--- a/lib/vtls/polarssl.c
+++ /dev/null
@@ -1,931 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- * Copyright (C) 2010 - 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-
-/*
- * Source file for all PolarSSL-specific code for the TLS/SSL layer. No code
- * but vtls.c should ever call or use these functions.
- *
- */
-
-#include "curl_setup.h"
-
-#ifdef USE_POLARSSL
-#include <polarssl/net.h>
-#include <polarssl/ssl.h>
-#include <polarssl/certs.h>
-#include <polarssl/x509.h>
-#include <polarssl/version.h>
-#include <polarssl/sha256.h>
-
-#if POLARSSL_VERSION_NUMBER < 0x01030000
-#error too old PolarSSL
-#endif
-
-#include <polarssl/error.h>
-#include <polarssl/entropy.h>
-#include <polarssl/ctr_drbg.h>
-
-#include "urldata.h"
-#include "sendf.h"
-#include "inet_pton.h"
-#include "polarssl.h"
-#include "vtls.h"
-#include "parsedate.h"
-#include "connect.h" /* for the connect timeout */
-#include "select.h"
-#include "strcase.h"
-#include "polarssl_threadlock.h"
-#include "multiif.h"
-#include "curl_printf.h"
-#include "curl_memory.h"
-/* The last #include file should be: */
-#include "memdebug.h"
-
-/* See https://tls.mbed.org/discussions/generic/
- howto-determine-exact-buffer-len-for-mbedtls_pk_write_pubkey_der
-*/
-#define RSA_PUB_DER_MAX_BYTES (38 + 2 * POLARSSL_MPI_MAX_SIZE)
-#define ECP_PUB_DER_MAX_BYTES (30 + 2 * POLARSSL_ECP_MAX_BYTES)
-
-#define PUB_DER_MAX_BYTES (RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \
- RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES)
-
-struct ssl_backend_data {
- ctr_drbg_context ctr_drbg;
- entropy_context entropy;
- ssl_context ssl;
- int server_fd;
- x509_crt cacert;
- x509_crt clicert;
- x509_crl crl;
- rsa_context rsa;
-};
-
-#define BACKEND connssl->backend
-
-/* apply threading? */
-#if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
-#define THREADING_SUPPORT
-#endif
-
-#ifndef POLARSSL_ERROR_C
-#define error_strerror(x,y,z)
-#endif /* POLARSSL_ERROR_C */
-
-
-#if defined(THREADING_SUPPORT)
-static entropy_context entropy;
-
-static int entropy_init_initialized = 0;
-
-/* start of entropy_init_mutex() */
-static void entropy_init_mutex(entropy_context *ctx)
-{
- /* lock 0 = entropy_init_mutex() */
- Curl_polarsslthreadlock_lock_function(0);
- if(entropy_init_initialized == 0) {
- entropy_init(ctx);
- entropy_init_initialized = 1;
- }
- Curl_polarsslthreadlock_unlock_function(0);
-}
-/* end of entropy_init_mutex() */
-
-/* start of entropy_func_mutex() */
-static int entropy_func_mutex(void *data, unsigned char *output, size_t len)
-{
- int ret;
- /* lock 1 = entropy_func_mutex() */
- Curl_polarsslthreadlock_lock_function(1);
- ret = entropy_func(data, output, len);
- Curl_polarsslthreadlock_unlock_function(1);
-
- return ret;
-}
-/* end of entropy_func_mutex() */
-
-#endif /* THREADING_SUPPORT */
-
-/* Define this to enable lots of debugging for PolarSSL */
-#undef POLARSSL_DEBUG
-
-#ifdef POLARSSL_DEBUG
-static void polarssl_debug(void *context, int level, const char *line)
-{
- struct Curl_easy *data = NULL;
-
- if(!context)
- return;
-
- data = (struct Curl_easy *)context;
-
- infof(data, "%s", line);
- (void) level;
-}
-#else
-#endif
-
-/* ALPN for http2? */
-#ifdef POLARSSL_SSL_ALPN
-# define HAS_ALPN
-#endif
-
-static Curl_recv polarssl_recv;
-static Curl_send polarssl_send;
-
-static CURLcode polarssl_version_from_curl(int *polarver, long ssl_version)
-{
- switch(ssl_version) {
- case CURL_SSLVERSION_TLSv1_0:
- *polarver = SSL_MINOR_VERSION_1;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_1:
- *polarver = SSL_MINOR_VERSION_2;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_2:
- *polarver = SSL_MINOR_VERSION_3;
- return CURLE_OK;
- case CURL_SSLVERSION_TLSv1_3:
- break;
- }
- return CURLE_SSL_CONNECT_ERROR;
-}
-
-static CURLcode
-set_ssl_version_min_max(struct connectdata *conn, int sockindex)
-{
- struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
- long ssl_version = SSL_CONN_CONFIG(version);
- long ssl_version_max = SSL_CONN_CONFIG(version_max);
- int ssl_min_ver = SSL_MINOR_VERSION_1;
- int ssl_max_ver = SSL_MINOR_VERSION_1;
- CURLcode result = CURLE_OK;
-
- switch(ssl_version) {
- case CURL_SSLVERSION_DEFAULT:
- case CURL_SSLVERSION_TLSv1:
- ssl_version = CURL_SSLVERSION_TLSv1_0;
- break;
- }
-
- switch(ssl_version_max) {
- case CURL_SSLVERSION_MAX_NONE:
- case CURL_SSLVERSION_MAX_DEFAULT:
- ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
- break;
- }
-
- result = polarssl_version_from_curl(&ssl_min_ver, ssl_version);
- if(result) {
- failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
- return result;
- }
- result = polarssl_version_from_curl(&ssl_max_ver, ssl_version_max >> 16);
- if(result) {
- failf(data, "unsupported max version passed via CURLOPT_SSLVERSION");
- return result;
- }
-
- ssl_set_min_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3, ssl_min_ver);
- ssl_set_max_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3, ssl_max_ver);
-
- return result;
-}
-
-static CURLcode
-polarssl_connect_step1(struct connectdata *conn,
- int sockindex)
-{
- struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
- const char *capath = SSL_CONN_CONFIG(CApath);
- const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
- conn->host.name;
- const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
- int ret = -1;
- char errorbuf[128];
- errorbuf[0] = 0;
-
- /* PolarSSL only supports SSLv3 and TLSv1 */
- if(SSL_CONN_CONFIG(version) == CURL_SSLVERSION_SSLv2) {
- failf(data, "PolarSSL does not support SSLv2");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
-#ifdef THREADING_SUPPORT
- entropy_init_mutex(&entropy);
-
- if((ret = ctr_drbg_init(&BACKEND->ctr_drbg, entropy_func_mutex, &entropy,
- NULL, 0)) != 0) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Failed - PolarSSL: ctr_drbg_init returned (-0x%04X) %s\n",
- -ret, errorbuf);
- }
-#else
- entropy_init(&BACKEND->entropy);
-
- if((ret = ctr_drbg_init(&BACKEND->ctr_drbg, entropy_func, &BACKEND->entropy,
- NULL, 0)) != 0) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Failed - PolarSSL: ctr_drbg_init returned (-0x%04X) %s\n",
- -ret, errorbuf);
- }
-#endif /* THREADING_SUPPORT */
-
- /* Load the trusted CA */
- memset(&BACKEND->cacert, 0, sizeof(x509_crt));
-
- if(SSL_CONN_CONFIG(CAfile)) {
- ret = x509_crt_parse_file(&BACKEND->cacert,
- SSL_CONN_CONFIG(CAfile));
-
- if(ret<0) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Error reading ca cert file %s - PolarSSL: (-0x%04X) %s",
- SSL_CONN_CONFIG(CAfile), -ret, errorbuf);
-
- if(SSL_CONN_CONFIG(verifypeer))
- return CURLE_SSL_CACERT_BADFILE;
- }
- }
-
- if(capath) {
- ret = x509_crt_parse_path(&BACKEND->cacert, capath);
-
- if(ret<0) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Error reading ca cert path %s - PolarSSL: (-0x%04X) %s",
- capath, -ret, errorbuf);
-
- if(SSL_CONN_CONFIG(verifypeer))
- return CURLE_SSL_CACERT_BADFILE;
- }
- }
-
- /* Load the client certificate */
- memset(&BACKEND->clicert, 0, sizeof(x509_crt));
-
- if(SSL_SET_OPTION(cert)) {
- ret = x509_crt_parse_file(&BACKEND->clicert,
- SSL_SET_OPTION(cert));
-
- if(ret) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Error reading client cert file %s - PolarSSL: (-0x%04X) %s",
- SSL_SET_OPTION(cert), -ret, errorbuf);
-
- return CURLE_SSL_CERTPROBLEM;
- }
- }
-
- /* Load the client private key */
- if(SSL_SET_OPTION(key)) {
- pk_context pk;
- pk_init(&pk);
- ret = pk_parse_keyfile(&pk, SSL_SET_OPTION(key),
- SSL_SET_OPTION(key_passwd));
- if(ret == 0 && !pk_can_do(&pk, POLARSSL_PK_RSA))
- ret = POLARSSL_ERR_PK_TYPE_MISMATCH;
- if(ret == 0)
- rsa_copy(&BACKEND->rsa, pk_rsa(pk));
- else
- rsa_free(&BACKEND->rsa);
- pk_free(&pk);
-
- if(ret) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Error reading private key %s - PolarSSL: (-0x%04X) %s",
- SSL_SET_OPTION(key), -ret, errorbuf);
-
- return CURLE_SSL_CERTPROBLEM;
- }
- }
-
- /* Load the CRL */
- memset(&BACKEND->crl, 0, sizeof(x509_crl));
-
- if(SSL_SET_OPTION(CRLfile)) {
- ret = x509_crl_parse_file(&BACKEND->crl,
- SSL_SET_OPTION(CRLfile));
-
- if(ret) {
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "Error reading CRL file %s - PolarSSL: (-0x%04X) %s",
- SSL_SET_OPTION(CRLfile), -ret, errorbuf);
-
- return CURLE_SSL_CRL_BADFILE;
- }
- }
-
- infof(data, "PolarSSL: Connecting to %s:%d\n", hostname, port);
-
- if(ssl_init(&BACKEND->ssl)) {
- failf(data, "PolarSSL: ssl_init failed");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- switch(SSL_CONN_CONFIG(version)) {
- case CURL_SSLVERSION_DEFAULT:
- case CURL_SSLVERSION_TLSv1:
- ssl_set_min_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_1);
- break;
- case CURL_SSLVERSION_SSLv3:
- ssl_set_min_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_0);
- ssl_set_max_version(&BACKEND->ssl, SSL_MAJOR_VERSION_3,
- SSL_MINOR_VERSION_0);
- infof(data, "PolarSSL: Forced min. SSL Version to be SSLv3\n");
- break;
- case CURL_SSLVERSION_TLSv1_0:
- case CURL_SSLVERSION_TLSv1_1:
- case CURL_SSLVERSION_TLSv1_2:
- case CURL_SSLVERSION_TLSv1_3:
- {
- CURLcode result = set_ssl_version_min_max(conn, sockindex);
- if(result != CURLE_OK)
- return result;
- break;
- }
- default:
- failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- ssl_set_endpoint(&BACKEND->ssl, SSL_IS_CLIENT);
- ssl_set_authmode(&BACKEND->ssl, SSL_VERIFY_OPTIONAL);
-
- ssl_set_rng(&BACKEND->ssl, ctr_drbg_random,
- &BACKEND->ctr_drbg);
- ssl_set_bio(&BACKEND->ssl,
- net_recv, &conn->sock[sockindex],
- net_send, &conn->sock[sockindex]);
-
- ssl_set_ciphersuites(&BACKEND->ssl, ssl_list_ciphersuites());
-
- /* Check if there's a cached ID we can/should use here! */
- if(SSL_SET_OPTION(primary.sessionid)) {
- void *old_session = NULL;
-
- Curl_ssl_sessionid_lock(conn);
- if(!Curl_ssl_getsessionid(conn, &old_session, NULL, sockindex)) {
- ret = ssl_set_session(&BACKEND->ssl, old_session);
- if(ret) {
- Curl_ssl_sessionid_unlock(conn);
- failf(data, "ssl_set_session returned -0x%x", -ret);
- return CURLE_SSL_CONNECT_ERROR;
- }
- infof(data, "PolarSSL re-using session\n");
- }
- Curl_ssl_sessionid_unlock(conn);
- }
-
- ssl_set_ca_chain(&BACKEND->ssl,
- &BACKEND->cacert,
- &BACKEND->crl,
- hostname);
-
- ssl_set_own_cert_rsa(&BACKEND->ssl,
- &BACKEND->clicert, &BACKEND->rsa);
-
- if(ssl_set_hostname(&BACKEND->ssl, hostname)) {
- /* ssl_set_hostname() sets the name to use in CN/SAN checks *and* the name
- to set in the SNI extension. So even if curl connects to a host
- specified as an IP address, this function must be used. */
- failf(data, "couldn't set hostname in PolarSSL");
- return CURLE_SSL_CONNECT_ERROR;
- }
-
-#ifdef HAS_ALPN
- if(conn->bits.tls_enable_alpn) {
- static const char *protocols[3];
- int cur = 0;
-
-#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2) {
- protocols[cur++] = NGHTTP2_PROTO_VERSION_ID;
- infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
- }
-#endif
-
- protocols[cur++] = ALPN_HTTP_1_1;
- infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
-
- protocols[cur] = NULL;
-
- ssl_set_alpn_protocols(&BACKEND->ssl, protocols);
- }
-#endif
-
-#ifdef POLARSSL_DEBUG
- ssl_set_dbg(&BACKEND->ssl, polarssl_debug, data);
-#endif
-
- connssl->connecting_state = ssl_connect_2;
-
- return CURLE_OK;
-}
-
-static CURLcode
-polarssl_connect_step2(struct connectdata *conn,
- int sockindex)
-{
- int ret;
- struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
- char buffer[1024];
- const char * const pinnedpubkey = SSL_IS_PROXY() ?
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
-
-
- char errorbuf[128];
- errorbuf[0] = 0;
-
- conn->recv[sockindex] = polarssl_recv;
- conn->send[sockindex] = polarssl_send;
-
- ret = ssl_handshake(&BACKEND->ssl);
-
- switch(ret) {
- case 0:
- break;
-
- case POLARSSL_ERR_NET_WANT_READ:
- connssl->connecting_state = ssl_connect_2_reading;
- return CURLE_OK;
-
- case POLARSSL_ERR_NET_WANT_WRITE:
- connssl->connecting_state = ssl_connect_2_writing;
- return CURLE_OK;
-
- default:
- error_strerror(ret, errorbuf, sizeof(errorbuf));
- failf(data, "ssl_handshake returned - PolarSSL: (-0x%04X) %s",
- -ret, errorbuf);
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- infof(data, "PolarSSL: Handshake complete, cipher is %s\n",
- ssl_get_ciphersuite(&BACKEND->ssl) );
-
- ret = ssl_get_verify_result(&BACKEND->ssl);
-
- if(ret && SSL_CONN_CONFIG(verifypeer)) {
- if(ret & BADCERT_EXPIRED)
- failf(data, "Cert verify failed: BADCERT_EXPIRED");
-
- if(ret & BADCERT_REVOKED) {
- failf(data, "Cert verify failed: BADCERT_REVOKED");
- return CURLE_PEER_FAILED_VERIFICATION;
- }
-
- if(ret & BADCERT_CN_MISMATCH)
- failf(data, "Cert verify failed: BADCERT_CN_MISMATCH");
-
- if(ret & BADCERT_NOT_TRUSTED)
- failf(data, "Cert verify failed: BADCERT_NOT_TRUSTED");
-
- return CURLE_PEER_FAILED_VERIFICATION;
- }
-
- if(ssl_get_peer_cert(&(BACKEND->ssl))) {
- /* If the session was resumed, there will be no peer certs */
- memset(buffer, 0, sizeof(buffer));
-
- if(x509_crt_info(buffer, sizeof(buffer), (char *)"* ",
- ssl_get_peer_cert(&(BACKEND->ssl))) != -1)
- infof(data, "Dumping cert info:\n%s\n", buffer);
- }
-
- /* adapted from mbedtls.c */
- if(pinnedpubkey) {
- int size;
- CURLcode result;
- x509_crt *p;
- unsigned char pubkey[PUB_DER_MAX_BYTES];
- const x509_crt *peercert;
-
- peercert = ssl_get_peer_cert(&BACKEND->ssl);
-
- if(!peercert || !peercert->raw.p || !peercert->raw.len) {
- failf(data, "Failed due to missing peer certificate");
- return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
- }
-
- p = calloc(1, sizeof(*p));
-
- if(!p)
- return CURLE_OUT_OF_MEMORY;
-
- x509_crt_init(p);
-
- /* Make a copy of our const peercert because pk_write_pubkey_der
- needs a non-const key, for now.
- https://github.com/ARMmbed/mbedtls/issues/396 */
- if(x509_crt_parse_der(p, peercert->raw.p, peercert->raw.len)) {
- failf(data, "Failed copying peer certificate");
- x509_crt_free(p);
- free(p);
- return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
- }
-
- size = pk_write_pubkey_der(&p->pk, pubkey, PUB_DER_MAX_BYTES);
-
- if(size <= 0) {
- failf(data, "Failed copying public key from peer certificate");
- x509_crt_free(p);
- free(p);
- return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
- }
-
- /* pk_write_pubkey_der writes data at the end of the buffer. */
- result = Curl_pin_peer_pubkey(data,
- pinnedpubkey,
- &pubkey[PUB_DER_MAX_BYTES - size], size);
- if(result) {
- x509_crt_free(p);
- free(p);
- return result;
- }
-
- x509_crt_free(p);
- free(p);
- }
-
-#ifdef HAS_ALPN
- if(conn->bits.tls_enable_alpn) {
- const char *next_protocol = ssl_get_alpn_protocol(&BACKEND->ssl);
-
- if(next_protocol != NULL) {
- infof(data, "ALPN, server accepted to use %s\n", next_protocol);
-
-#ifdef USE_NGHTTP2
- if(!strncmp(next_protocol, NGHTTP2_PROTO_VERSION_ID,
- NGHTTP2_PROTO_VERSION_ID_LEN)) {
- conn->negnpn = CURL_HTTP_VERSION_2;
- }
- else
-#endif
- if(!strncmp(next_protocol, ALPN_HTTP_1_1, ALPN_HTTP_1_1_LENGTH)) {
- conn->negnpn = CURL_HTTP_VERSION_1_1;
- }
- }
- else
- infof(data, "ALPN, server did not agree to a protocol\n");
- Curl_multiuse_state(conn, conn->negnpn == CURL_HTTP_VERSION_2 ?
- BUNDLE_MULTIPLEX : BUNDLE_NO_MULTIUSE);
- }
-#endif
-
- connssl->connecting_state = ssl_connect_3;
- infof(data, "SSL connected\n");
-
- return CURLE_OK;
-}
-
-static CURLcode
-polarssl_connect_step3(struct connectdata *conn,
- int sockindex)
-{
- CURLcode retcode = CURLE_OK;
- struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- struct Curl_easy *data = conn->data;
-
- DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
-
- if(SSL_SET_OPTION(primary.sessionid)) {
- int ret;
- ssl_session *our_ssl_sessionid;
- void *old_ssl_sessionid = NULL;
-
- our_ssl_sessionid = calloc(1, sizeof(ssl_session));
- if(!our_ssl_sessionid)
- return CURLE_OUT_OF_MEMORY;
-
- ret = ssl_get_session(&BACKEND->ssl, our_ssl_sessionid);
- if(ret) {
- failf(data, "ssl_get_session returned -0x%x", -ret);
- return CURLE_SSL_CONNECT_ERROR;
- }
-
- /* If there's already a matching session in the cache, delete it */
- Curl_ssl_sessionid_lock(conn);
- if(!Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL, sockindex))
- Curl_ssl_delsessionid(conn, old_ssl_sessionid);
-
- retcode = Curl_ssl_addsessionid(conn, our_ssl_sessionid, 0, sockindex);
- Curl_ssl_sessionid_unlock(conn);
- if(retcode) {
- free(our_ssl_sessionid);
- failf(data, "failed to store ssl session");
- return retcode;
- }
- }
-
- connssl->connecting_state = ssl_connect_done;
-
- return CURLE_OK;
-}
-
-static ssize_t polarssl_send(struct connectdata *conn,
- int sockindex,
- const void *mem,
- size_t len,
- CURLcode *curlcode)
-{
- struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- int ret = -1;
-
- ret = ssl_write(&BACKEND->ssl,
- (unsigned char *)mem, len);
-
- if(ret < 0) {
- *curlcode = (ret == POLARSSL_ERR_NET_WANT_WRITE) ?
- CURLE_AGAIN : CURLE_SEND_ERROR;
- ret = -1;
- }
-
- return ret;
-}
-
-static void Curl_polarssl_close(struct connectdata *conn, int sockindex)
-{
- struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- rsa_free(&BACKEND->rsa);
- x509_crt_free(&BACKEND->clicert);
- x509_crt_free(&BACKEND->cacert);
- x509_crl_free(&BACKEND->crl);
- ssl_free(&BACKEND->ssl);
-}
-
-static ssize_t polarssl_recv(struct connectdata *conn,
- int num,
- char *buf,
- size_t buffersize,
- CURLcode *curlcode)
-{
- struct ssl_connect_data *connssl = &conn->ssl[num];
- int ret = -1;
- ssize_t len = -1;
-
- memset(buf, 0, buffersize);
- ret = ssl_read(&BACKEND->ssl, (unsigned char *)buf, buffersize);
-
- if(ret <= 0) {
- if(ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY)
- return 0;
-
- *curlcode = (ret == POLARSSL_ERR_NET_WANT_READ) ?
- CURLE_AGAIN : CURLE_RECV_ERROR;
- return -1;
- }
-
- len = ret;
-
- return len;
-}
-
-static void Curl_polarssl_session_free(void *ptr)
-{
- ssl_session_free(ptr);
- free(ptr);
-}
-
-/* 1.3.10 was the first rebranded version. All new releases (in 1.3 branch and
- higher) will be mbed TLS branded.. */
-
-static size_t Curl_polarssl_version(char *buffer, size_t size)
-{
- unsigned int version = version_get_number();
- return msnprintf(buffer, size, "%s/%d.%d.%d",
- version >= 0x01030A00?"mbedTLS":"PolarSSL",
- version>>24, (version>>16)&0xff, (version>>8)&0xff);
-}
-
-static CURLcode
-polarssl_connect_common(struct connectdata *conn,
- int sockindex,
- bool nonblocking,
- bool *done)
-{
- CURLcode result;
- struct Curl_easy *data = conn->data;
- struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
- int what;
-
- /* check if the connection has already been established */
- if(ssl_connection_complete == connssl->state) {
- *done = TRUE;
- return CURLE_OK;
- }
-
- if(ssl_connect_1 == connssl->connecting_state) {
- /* Find out how much more time we're allowed */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
-
- if(timeout_ms < 0) {
- /* no need to continue if time already is up */
- failf(data, "SSL connection timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- result = polarssl_connect_step1(conn, sockindex);
- if(result)
- return result;
- }
-
- while(ssl_connect_2 == connssl->connecting_state ||
- ssl_connect_2_reading == connssl->connecting_state ||
- ssl_connect_2_writing == connssl->connecting_state) {
-
- /* check allowed time left */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
-
- if(timeout_ms < 0) {
- /* no need to continue if time already is up */
- failf(data, "SSL connection timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
-
- /* if ssl is expecting something, check if it's available. */
- if(connssl->connecting_state == ssl_connect_2_reading ||
- connssl->connecting_state == ssl_connect_2_writing) {
-
- curl_socket_t writefd = ssl_connect_2_writing ==
- connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
- curl_socket_t readfd = ssl_connect_2_reading ==
- connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
-
- what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking?0:(time_t)timeout_ms);
- if(what < 0) {
- /* fatal error */
- failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
- return CURLE_SSL_CONNECT_ERROR;
- }
- else if(0 == what) {
- if(nonblocking) {
- *done = FALSE;
- return CURLE_OK;
- }
- else {
- /* timeout */
- failf(data, "SSL connection timeout");
- return CURLE_OPERATION_TIMEDOUT;
- }
- }
- /* socket is readable or writable */
- }
-
- /* Run transaction, and return to the caller if it failed or if
- * this connection is part of a multi handle and this loop would
- * execute again. This permits the owner of a multi handle to
- * abort a connection attempt before step2 has completed while
- * ensuring that a client using select() or epoll() will always
- * have a valid fdset to wait on.
- */
- result = polarssl_connect_step2(conn, sockindex);
- if(result || (nonblocking &&
- (ssl_connect_2 == connssl->connecting_state ||
- ssl_connect_2_reading == connssl->connecting_state ||
- ssl_connect_2_writing == connssl->connecting_state)))
- return result;
-
- } /* repeat step2 until all transactions are done. */
-
- if(ssl_connect_3 == connssl->connecting_state) {
- result = polarssl_connect_step3(conn, sockindex);
- if(result)
- return result;
- }
-
- if(ssl_connect_done == connssl->connecting_state) {
- connssl->state = ssl_connection_complete;
- conn->recv[sockindex] = polarssl_recv;
- conn->send[sockindex] = polarssl_send;
- *done = TRUE;
- }
- else
- *done = FALSE;
-
- /* Reset our connect state machine */
- connssl->connecting_state = ssl_connect_1;
-
- return CURLE_OK;
-}
-
-static CURLcode Curl_polarssl_connect_nonblocking(struct connectdata *conn,
- int sockindex, bool *done)
-{
- return polarssl_connect_common(conn, sockindex, TRUE, done);
-}
-
-
-static CURLcode Curl_polarssl_connect(struct connectdata *conn, int sockindex)
-{
- CURLcode result;
- bool done = FALSE;
-
- result = polarssl_connect_common(conn, sockindex, FALSE, &done);
- if(result)
- return result;
-
- DEBUGASSERT(done);
-
- return CURLE_OK;
-}
-
-/*
- * return 0 error initializing SSL
- * return 1 SSL initialized successfully
- */
-static int Curl_polarssl_init(void)
-{
- return Curl_polarsslthreadlock_thread_setup();
-}
-
-static void Curl_polarssl_cleanup(void)
-{
- (void)Curl_polarsslthreadlock_thread_cleanup();
-}
-
-static bool Curl_polarssl_data_pending(const struct connectdata *conn,
- int sockindex)
-{
- const struct ssl_connect_data *connssl = &conn->ssl[sockindex];
- return ssl_get_bytes_avail(&BACKEND->ssl) != 0;
-}
-
-static CURLcode Curl_polarssl_sha256sum(const unsigned char *input,
- size_t inputlen,
- unsigned char *sha256sum,
- size_t sha256len UNUSED_PARAM)
-{
- (void)sha256len;
- sha256(input, inputlen, sha256sum, 0);
- return CURLE_OK;
-}
-
-static void *Curl_polarssl_get_internals(struct ssl_connect_data *connssl,
- CURLINFO info UNUSED_PARAM)
-{
- (void)info;
- return &BACKEND->ssl;
-}
-
-const struct Curl_ssl Curl_ssl_polarssl = {
- { CURLSSLBACKEND_POLARSSL, "polarssl" }, /* info */
-
- SSLSUPP_CA_PATH |
- SSLSUPP_PINNEDPUBKEY,
-
- sizeof(struct ssl_backend_data),
-
- Curl_polarssl_init, /* init */
- Curl_polarssl_cleanup, /* cleanup */
- Curl_polarssl_version, /* version */
- Curl_none_check_cxn, /* check_cxn */
- Curl_none_shutdown, /* shutdown */
- Curl_polarssl_data_pending, /* data_pending */
- /* This might cause libcurl to use a weeker random! */
- Curl_none_random, /* random */
- Curl_none_cert_status_request, /* cert_status_request */
- Curl_polarssl_connect, /* connect */
- Curl_polarssl_connect_nonblocking, /* connect_nonblocking */
- Curl_polarssl_get_internals, /* get_internals */
- Curl_polarssl_close, /* close_one */
- Curl_none_close_all, /* close_all */
- Curl_polarssl_session_free, /* session_free */
- Curl_none_set_engine, /* set_engine */
- Curl_none_set_engine_default, /* set_engine_default */
- Curl_none_engines_list, /* engines_list */
- Curl_none_false_start, /* false_start */
- Curl_none_md5sum, /* md5sum */
- Curl_polarssl_sha256sum /* sha256sum */
-};
-
-#endif /* USE_POLARSSL */
diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c
index bbd2fe921..c7e4e793c 100644
--- a/lib/vtls/schannel.c
+++ b/lib/vtls/schannel.c
@@ -7,7 +7,7 @@
*
* Copyright (C) 2012 - 2016, Marc Hoersken, <info@marc-hoersken.de>
* Copyright (C) 2012, Mark Salisbury, <mark.salisbury@hp.com>
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,16 +27,6 @@
* but vtls.c should ever call or use these functions.
*/
-/*
- * Based upon the PolarSSL implementation in polarssl.c and polarssl.h:
- * Copyright (C) 2010, 2011, Hoi-Ho Chan, <hoiho.chan@gmail.com>
- *
- * Based upon the CyaSSL implementation in cyassl.c and cyassl.h:
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * Thanks for code and inspiration!
- */
-
#include "curl_setup.h"
#ifdef USE_SCHANNEL
@@ -49,19 +39,20 @@
#include "schannel.h"
#include "vtls.h"
+#include "strcase.h"
#include "sendf.h"
#include "connect.h" /* for the connect timeout */
#include "strerror.h"
-#include "select.h" /* for the socket readyness */
+#include "select.h" /* for the socket readiness */
#include "inet_pton.h" /* for IP addr SNI check */
#include "curl_multibyte.h"
#include "warnless.h"
#include "x509asn1.h"
#include "curl_printf.h"
#include "multiif.h"
-#include "system_win32.h"
+#include "version_win32.h"
- /* The last #include file should be: */
+/* The last #include file should be: */
#include "curl_memory.h"
#include "memdebug.h"
@@ -179,25 +170,25 @@ set_ssl_version_min_max(SCHANNEL_CRED *schannel_cred, struct connectdata *conn)
long i = ssl_version;
switch(ssl_version_max) {
- case CURL_SSLVERSION_MAX_NONE:
- case CURL_SSLVERSION_MAX_DEFAULT:
- ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
- break;
+ case CURL_SSLVERSION_MAX_NONE:
+ case CURL_SSLVERSION_MAX_DEFAULT:
+ ssl_version_max = CURL_SSLVERSION_MAX_TLSv1_2;
+ break;
}
for(; i <= (ssl_version_max >> 16); ++i) {
switch(i) {
- case CURL_SSLVERSION_TLSv1_0:
- schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_0_CLIENT;
- break;
- case CURL_SSLVERSION_TLSv1_1:
- schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_1_CLIENT;
- break;
- case CURL_SSLVERSION_TLSv1_2:
- schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_2_CLIENT;
- break;
- case CURL_SSLVERSION_TLSv1_3:
- failf(data, "schannel: TLS 1.3 is not yet supported");
- return CURLE_SSL_CONNECT_ERROR;
+ case CURL_SSLVERSION_TLSv1_0:
+ schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_0_CLIENT;
+ break;
+ case CURL_SSLVERSION_TLSv1_1:
+ schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_1_CLIENT;
+ break;
+ case CURL_SSLVERSION_TLSv1_2:
+ schannel_cred->grbitEnabledProtocols |= SP_PROT_TLS1_2_CLIENT;
+ break;
+ case CURL_SSLVERSION_TLSv1_3:
+ failf(data, "schannel: TLS 1.3 is not yet supported");
+ return CURLE_SSL_CONNECT_ERROR;
}
}
return CURLE_OK;
@@ -205,9 +196,9 @@ set_ssl_version_min_max(SCHANNEL_CRED *schannel_cred, struct connectdata *conn)
/*longest is 26, buffer is slightly bigger*/
#define LONGEST_ALG_ID 32
-#define CIPHEROPTION(X) \
-if(strcmp(#X, tmp) == 0) \
- return X
+#define CIPHEROPTION(X) \
+ if(strcmp(#X, tmp) == 0) \
+ return X
static int
get_alg_id_by_name(char *name)
@@ -283,11 +274,11 @@ get_alg_id_by_name(char *name)
#ifdef CALG_HMAC
CIPHEROPTION(CALG_HMAC);
#endif
-#if !defined(__W32API_MAJOR_VERSION) || \
- !defined(__W32API_MINOR_VERSION) || \
- defined(__MINGW64_VERSION_MAJOR) || \
- (__W32API_MAJOR_VERSION > 5) || \
- ((__W32API_MAJOR_VERSION == 5) && (__W32API_MINOR_VERSION > 0))
+#if !defined(__W32API_MAJOR_VERSION) || \
+ !defined(__W32API_MINOR_VERSION) || \
+ defined(__MINGW64_VERSION_MAJOR) || \
+ (__W32API_MAJOR_VERSION > 5) || \
+ ((__W32API_MAJOR_VERSION == 5) && (__W32API_MINOR_VERSION > 0))
/* CALG_TLS1PRF has a syntax error in MinGW's w32api up to version 5.0,
see https://osdn.net/projects/mingw/ticket/38391 */
CIPHEROPTION(CALG_TLS1PRF);
@@ -349,12 +340,14 @@ set_ssl_ciphers(SCHANNEL_CRED *schannel_cred, char *ciphers)
if(startCur)
startCur++;
}
- schannel_cred->palgSupportedAlgs = algIds;
+ schannel_cred->palgSupportedAlgs = algIds;
schannel_cred->cSupportedAlgs = algCount;
return CURLE_OK;
}
#ifdef HAS_CLIENT_CERT_PATH
+
+/* Function allocates memory for store_path only if CURLE_OK is returned */
static CURLcode
get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path,
TCHAR **thumbprint)
@@ -397,16 +390,16 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path,
if(sep == NULL)
return CURLE_SSL_CERTPROBLEM;
+ *thumbprint = sep + 1;
+ if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN)
+ return CURLE_SSL_CERTPROBLEM;
+
*sep = TEXT('\0');
*store_path = _tcsdup(store_path_start);
*sep = TEXT('\\');
if(*store_path == NULL)
return CURLE_OUT_OF_MEMORY;
- *thumbprint = sep + 1;
- if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN)
- return CURLE_SSL_CERTPROBLEM;
-
return CURLE_OK;
}
#endif
@@ -427,36 +420,40 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
SCHANNEL_CRED schannel_cred;
PCCERT_CONTEXT client_certs[1] = { NULL };
SECURITY_STATUS sspi_status = SEC_E_OK;
- struct curl_schannel_cred *old_cred = NULL;
+ struct Curl_schannel_cred *old_cred = NULL;
struct in_addr addr;
#ifdef ENABLE_IPV6
struct in6_addr addr6;
#endif
TCHAR *host_name;
CURLcode result;
+#ifndef CURL_DISABLE_PROXY
char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#else
+ char * const hostname = conn->host.name;
+#endif
DEBUGF(infof(data,
"schannel: SSL/TLS connection with %s port %hu (step 1/3)\n",
hostname, conn->remote_port));
- if(Curl_verify_windows_version(5, 1, PLATFORM_WINNT,
- VERSION_LESS_THAN_EQUAL)) {
- /* Schannel in Windows XP (OS version 5.1) uses legacy handshakes and
- algorithms that may not be supported by all servers. */
- infof(data, "schannel: Windows version is old and may not be able to "
- "connect to some servers due to lack of SNI, algorithms, etc.\n");
+ if(curlx_verify_windows_version(5, 1, PLATFORM_WINNT,
+ VERSION_LESS_THAN_EQUAL)) {
+ /* Schannel in Windows XP (OS version 5.1) uses legacy handshakes and
+ algorithms that may not be supported by all servers. */
+ infof(data, "schannel: Windows version is old and may not be able to "
+ "connect to some servers due to lack of SNI, algorithms, etc.\n");
}
#ifdef HAS_ALPN
/* ALPN is only supported on Windows 8.1 / Server 2012 R2 and above.
Also it doesn't seem to be supported for Wine, see curl bug #983. */
BACKEND->use_alpn = conn->bits.tls_enable_alpn &&
- !GetProcAddress(GetModuleHandleA("ntdll"),
- "wine_get_version") &&
- Curl_verify_windows_version(6, 3, PLATFORM_WINNT,
- VERSION_GREATER_THAN_EQUAL);
+ !GetProcAddress(GetModuleHandle(TEXT("ntdll")),
+ "wine_get_version") &&
+ curlx_verify_windows_version(6, 3, PLATFORM_WINNT,
+ VERSION_GREATER_THAN_EQUAL);
#else
BACKEND->use_alpn = false;
#endif
@@ -472,8 +469,8 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
#else
#ifdef HAS_MANUAL_VERIFY_API
if(SSL_CONN_CONFIG(CAfile)) {
- if(Curl_verify_windows_version(6, 1, PLATFORM_WINNT,
- VERSION_GREATER_THAN_EQUAL)) {
+ if(curlx_verify_windows_version(6, 1, PLATFORM_WINNT,
+ VERSION_GREATER_THAN_EQUAL)) {
BACKEND->use_manual_cred_validation = true;
}
else {
@@ -530,8 +527,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
DEBUGF(infof(data, "schannel: disabled server certificate revocation "
"checks\n"));
}
+ else if(data->set.ssl.revoke_best_effort) {
+ schannel_cred.dwFlags |= SCH_CRED_IGNORE_NO_REVOCATION_CHECK |
+ SCH_CRED_IGNORE_REVOCATION_OFFLINE | SCH_CRED_REVOCATION_CHECK_CHAIN;
+
+ DEBUGF(infof(data, "schannel: ignore revocation offline errors"));
+ }
else {
schannel_cred.dwFlags |= SCH_CRED_REVOCATION_CHECK_CHAIN;
+
DEBUGF(infof(data,
"schannel: checking server certificate revocation\n"));
}
@@ -554,20 +558,16 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_0_CLIENT |
- SP_PROT_TLS1_1_CLIENT |
- SP_PROT_TLS1_2_CLIENT;
- break;
case CURL_SSLVERSION_TLSv1_0:
case CURL_SSLVERSION_TLSv1_1:
case CURL_SSLVERSION_TLSv1_2:
case CURL_SSLVERSION_TLSv1_3:
- {
- result = set_ssl_version_min_max(&schannel_cred, conn);
- if(result != CURLE_OK)
- return result;
- break;
- }
+ {
+ result = set_ssl_version_min_max(&schannel_cred, conn);
+ if(result != CURLE_OK)
+ return result;
+ break;
+ }
case CURL_SSLVERSION_SSLv3:
schannel_cred.grbitEnabledProtocols = SP_PROT_SSL3_CLIENT;
break;
@@ -590,80 +590,199 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
#ifdef HAS_CLIENT_CERT_PATH
/* client certificate */
- if(data->set.ssl.cert) {
- DWORD cert_store_name;
- TCHAR *cert_store_path;
- TCHAR *cert_thumbprint_str;
+ if(data->set.ssl.primary.clientcert || data->set.ssl.primary.cert_blob) {
+ DWORD cert_store_name = 0;
+ TCHAR *cert_store_path = NULL;
+ TCHAR *cert_thumbprint_str = NULL;
CRYPT_HASH_BLOB cert_thumbprint;
BYTE cert_thumbprint_data[CERT_THUMBPRINT_DATA_LEN];
- HCERTSTORE cert_store;
+ HCERTSTORE cert_store = NULL;
+ FILE *fInCert = NULL;
+ void *certdata = NULL;
+ size_t certsize = 0;
+ bool blob = data->set.ssl.primary.cert_blob != NULL;
+ TCHAR *cert_path = NULL;
+ if(blob) {
+ certdata = data->set.ssl.primary.cert_blob->data;
+ certsize = data->set.ssl.primary.cert_blob->len;
+ }
+ else {
+ cert_path = curlx_convert_UTF8_to_tchar(
+ data->set.ssl.primary.clientcert);
+ if(!cert_path)
+ return CURLE_OUT_OF_MEMORY;
- TCHAR *cert_path = Curl_convert_UTF8_to_tchar(data->set.ssl.cert);
- if(!cert_path)
- return CURLE_OUT_OF_MEMORY;
+ result = get_cert_location(cert_path, &cert_store_name,
+ &cert_store_path, &cert_thumbprint_str);
- result = get_cert_location(cert_path, &cert_store_name,
- &cert_store_path, &cert_thumbprint_str);
- if(result != CURLE_OK) {
- failf(data, "schannel: Failed to get certificate location for %s",
- cert_path);
- Curl_unicodefree(cert_path);
- return result;
+ if(result && (data->set.ssl.primary.clientcert[0]!='\0'))
+ fInCert = fopen(data->set.ssl.primary.clientcert, "rb");
+
+ if(result && !fInCert) {
+ failf(data, "schannel: Failed to get certificate location"
+ " or file for %s",
+ data->set.ssl.primary.clientcert);
+ curlx_unicodefree(cert_path);
+ return result;
+ }
}
- cert_store =
- CertOpenStore(CURL_CERT_STORE_PROV_SYSTEM, 0,
- (HCRYPTPROV)NULL,
- CERT_STORE_OPEN_EXISTING_FLAG | cert_store_name,
- cert_store_path);
- if(!cert_store) {
- failf(data, "schannel: Failed to open cert store %x %s, "
- "last error is %x",
- cert_store_name, cert_store_path, GetLastError());
- free(cert_store_path);
- Curl_unicodefree(cert_path);
+ if((fInCert || blob) && (data->set.ssl.cert_type) &&
+ (!strcasecompare(data->set.ssl.cert_type, "P12"))) {
+ failf(data, "schannel: certificate format compatibility error "
+ " for %s",
+ blob ? "(memory blob)" : data->set.ssl.primary.clientcert);
+ curlx_unicodefree(cert_path);
return CURLE_SSL_CERTPROBLEM;
}
- free(cert_store_path);
- cert_thumbprint.pbData = cert_thumbprint_data;
- cert_thumbprint.cbData = CERT_THUMBPRINT_DATA_LEN;
+ if(fInCert || blob) {
+ /* Reading a .P12 or .pfx file, like the example at bottom of
+ https://social.msdn.microsoft.com/Forums/windowsdesktop/
+ en-US/3e7bc95f-b21a-4bcd-bd2c-7f996718cae5
+ */
+ CRYPT_DATA_BLOB datablob;
+ WCHAR* pszPassword;
+ size_t pwd_len = 0;
+ int str_w_len = 0;
+ const char *cert_showfilename_error = blob ?
+ "(memory blob)" : data->set.ssl.primary.clientcert;
+ curlx_unicodefree(cert_path);
+ if(fInCert) {
+ long cert_tell = 0;
+ bool continue_reading = fseek(fInCert, 0, SEEK_END) == 0;
+ if(continue_reading)
+ cert_tell = ftell(fInCert);
+ if(cert_tell < 0)
+ continue_reading = FALSE;
+ else
+ certsize = (size_t)cert_tell;
+ if(continue_reading)
+ continue_reading = fseek(fInCert, 0, SEEK_SET) == 0;
+ if(continue_reading)
+ certdata = malloc(certsize + 1);
+ if((!certdata) ||
+ ((int) fread(certdata, certsize, 1, fInCert) != 1))
+ continue_reading = FALSE;
+ fclose(fInCert);
+ if(!continue_reading) {
+ failf(data, "schannel: Failed to read cert file %s",
+ data->set.ssl.primary.clientcert);
+ free(certdata);
+ return CURLE_SSL_CERTPROBLEM;
+ }
+ }
- if(!CryptStringToBinary(cert_thumbprint_str, CERT_THUMBPRINT_STR_LEN,
- CRYPT_STRING_HEX,
- cert_thumbprint_data, &cert_thumbprint.cbData,
- NULL, NULL)) {
- Curl_unicodefree(cert_path);
- return CURLE_SSL_CERTPROBLEM;
- }
+ /* Convert key-pair data to the in-memory certificate store */
+ datablob.pbData = (BYTE*)certdata;
+ datablob.cbData = (DWORD)certsize;
+
+ if(data->set.ssl.key_passwd != NULL)
+ pwd_len = strlen(data->set.ssl.key_passwd);
+ pszPassword = (WCHAR*)malloc(sizeof(WCHAR)*(pwd_len + 1));
+ if(pszPassword) {
+ if(pwd_len > 0)
+ str_w_len = MultiByteToWideChar(CP_UTF8,
+ MB_ERR_INVALID_CHARS,
+ data->set.ssl.key_passwd, (int)pwd_len,
+ pszPassword, (int)(pwd_len + 1));
+
+ if((str_w_len >= 0) && (str_w_len <= (int)pwd_len))
+ pszPassword[str_w_len] = 0;
+ else
+ pszPassword[0] = 0;
+
+ cert_store = PFXImportCertStore(&datablob, pszPassword, 0);
+ free(pszPassword);
+ }
+ if(!blob)
+ free(certdata);
+ if(cert_store == NULL) {
+ DWORD errorcode = GetLastError();
+ if(errorcode == ERROR_INVALID_PASSWORD)
+ failf(data, "schannel: Failed to import cert file %s, "
+ "password is bad",
+ cert_showfilename_error);
+ else
+ failf(data, "schannel: Failed to import cert file %s, "
+ "last error is 0x%x",
+ cert_showfilename_error, errorcode);
+ return CURLE_SSL_CERTPROBLEM;
+ }
- client_certs[0] = CertFindCertificateInStore(
- cert_store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
- CERT_FIND_HASH, &cert_thumbprint, NULL);
+ client_certs[0] = CertFindCertificateInStore(
+ cert_store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
+ CERT_FIND_ANY, NULL, NULL);
- Curl_unicodefree(cert_path);
+ if(client_certs[0] == NULL) {
+ failf(data, "schannel: Failed to get certificate from file %s"
+ ", last error is 0x%x",
+ cert_showfilename_error, GetLastError());
+ CertCloseStore(cert_store, 0);
+ return CURLE_SSL_CERTPROBLEM;
+ }
- if(client_certs[0]) {
schannel_cred.cCreds = 1;
schannel_cred.paCred = client_certs;
}
else {
- /* CRYPT_E_NOT_FOUND / E_INVALIDARG */
- return CURLE_SSL_CERTPROBLEM;
- }
+ cert_store =
+ CertOpenStore(CURL_CERT_STORE_PROV_SYSTEM, 0,
+ (HCRYPTPROV)NULL,
+ CERT_STORE_OPEN_EXISTING_FLAG | cert_store_name,
+ cert_store_path);
+ if(!cert_store) {
+ failf(data, "schannel: Failed to open cert store %x %s, "
+ "last error is 0x%x",
+ cert_store_name, cert_store_path, GetLastError());
+ free(cert_store_path);
+ curlx_unicodefree(cert_path);
+ return CURLE_SSL_CERTPROBLEM;
+ }
+ free(cert_store_path);
+
+ cert_thumbprint.pbData = cert_thumbprint_data;
+ cert_thumbprint.cbData = CERT_THUMBPRINT_DATA_LEN;
+
+ if(!CryptStringToBinary(cert_thumbprint_str,
+ CERT_THUMBPRINT_STR_LEN,
+ CRYPT_STRING_HEX,
+ cert_thumbprint_data,
+ &cert_thumbprint.cbData,
+ NULL, NULL)) {
+ curlx_unicodefree(cert_path);
+ CertCloseStore(cert_store, 0);
+ return CURLE_SSL_CERTPROBLEM;
+ }
+ client_certs[0] = CertFindCertificateInStore(
+ cert_store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
+ CERT_FIND_HASH, &cert_thumbprint, NULL);
+
+ curlx_unicodefree(cert_path);
+
+ if(client_certs[0]) {
+ schannel_cred.cCreds = 1;
+ schannel_cred.paCred = client_certs;
+ }
+ else {
+ /* CRYPT_E_NOT_FOUND / E_INVALIDARG */
+ CertCloseStore(cert_store, 0);
+ return CURLE_SSL_CERTPROBLEM;
+ }
+ }
CertCloseStore(cert_store, 0);
}
#else
- if(data->set.ssl.cert) {
+ if(data->set.ssl.primary.clientcert || data->set.ssl.primary.cert_blob) {
failf(data, "schannel: client cert support not built in");
return CURLE_NOT_BUILT_IN;
}
#endif
/* allocate memory for the re-usable credential handle */
- BACKEND->cred = (struct curl_schannel_cred *)
- calloc(1, sizeof(struct curl_schannel_cred));
+ BACKEND->cred = (struct Curl_schannel_cred *)
+ calloc(1, sizeof(struct Curl_schannel_cred));
if(!BACKEND->cred) {
failf(data, "schannel: unable to allocate memory");
@@ -675,7 +794,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
BACKEND->cred->refcount = 1;
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa374716.aspx
- */
+ */
sspi_status =
s_pSecFn->AcquireCredentialsHandle(NULL, (TCHAR *)UNISP_NAME,
SECPKG_CRED_OUTBOUND, NULL,
@@ -692,15 +811,15 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
Curl_safefree(BACKEND->cred);
switch(sspi_status) {
- case SEC_E_INSUFFICIENT_MEMORY:
- return CURLE_OUT_OF_MEMORY;
- case SEC_E_NO_CREDENTIALS:
- case SEC_E_SECPKG_NOT_FOUND:
- case SEC_E_NOT_OWNER:
- case SEC_E_UNKNOWN_CREDENTIALS:
- case SEC_E_INTERNAL_ERROR:
- default:
- return CURLE_SSL_CONNECT_ERROR;
+ case SEC_E_INSUFFICIENT_MEMORY:
+ return CURLE_OUT_OF_MEMORY;
+ case SEC_E_NO_CREDENTIALS:
+ case SEC_E_SECPKG_NOT_FOUND:
+ case SEC_E_NOT_OWNER:
+ case SEC_E_UNKNOWN_CREDENTIALS:
+ case SEC_E_INTERNAL_ERROR:
+ default:
+ return CURLE_SSL_CONNECT_ERROR;
}
}
}
@@ -722,7 +841,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
unsigned short* list_len = NULL;
/* The first four bytes will be an unsigned int indicating number
- of bytes of data in the rest of the the buffer. */
+ of bytes of data in the rest of the buffer. */
extension_len = (unsigned int *)(&alpn_buffer[cur]);
cur += sizeof(unsigned int);
@@ -777,14 +896,14 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
ISC_REQ_STREAM;
/* allocate memory for the security context handle */
- BACKEND->ctxt = (struct curl_schannel_ctxt *)
- calloc(1, sizeof(struct curl_schannel_ctxt));
+ BACKEND->ctxt = (struct Curl_schannel_ctxt *)
+ calloc(1, sizeof(struct Curl_schannel_ctxt));
if(!BACKEND->ctxt) {
failf(data, "schannel: unable to allocate memory");
return CURLE_OUT_OF_MEMORY;
}
- host_name = Curl_convert_UTF8_to_tchar(hostname);
+ host_name = curlx_convert_UTF8_to_tchar(hostname);
if(!host_name)
return CURLE_OUT_OF_MEMORY;
@@ -801,35 +920,35 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
0, &BACKEND->ctxt->ctxt_handle,
&outbuf_desc, &BACKEND->ret_flags, &BACKEND->ctxt->time_stamp);
- Curl_unicodefree(host_name);
+ curlx_unicodefree(host_name);
if(sspi_status != SEC_I_CONTINUE_NEEDED) {
char buffer[STRERROR_LEN];
Curl_safefree(BACKEND->ctxt);
switch(sspi_status) {
- case SEC_E_INSUFFICIENT_MEMORY:
- failf(data, "schannel: initial InitializeSecurityContext failed: %s",
- Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
- return CURLE_OUT_OF_MEMORY;
- case SEC_E_WRONG_PRINCIPAL:
- failf(data, "schannel: SNI or certificate check failed: %s",
- Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
- return CURLE_PEER_FAILED_VERIFICATION;
- /*
- case SEC_E_INVALID_HANDLE:
- case SEC_E_INVALID_TOKEN:
- case SEC_E_LOGON_DENIED:
- case SEC_E_TARGET_UNKNOWN:
- case SEC_E_NO_AUTHENTICATING_AUTHORITY:
- case SEC_E_INTERNAL_ERROR:
- case SEC_E_NO_CREDENTIALS:
- case SEC_E_UNSUPPORTED_FUNCTION:
- case SEC_E_APPLICATION_PROTOCOL_MISMATCH:
- */
- default:
- failf(data, "schannel: initial InitializeSecurityContext failed: %s",
- Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
- return CURLE_SSL_CONNECT_ERROR;
+ case SEC_E_INSUFFICIENT_MEMORY:
+ failf(data, "schannel: initial InitializeSecurityContext failed: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_OUT_OF_MEMORY;
+ case SEC_E_WRONG_PRINCIPAL:
+ failf(data, "schannel: SNI or certificate check failed: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_PEER_FAILED_VERIFICATION;
+ /*
+ case SEC_E_INVALID_HANDLE:
+ case SEC_E_INVALID_TOKEN:
+ case SEC_E_LOGON_DENIED:
+ case SEC_E_TARGET_UNKNOWN:
+ case SEC_E_NO_AUTHENTICATING_AUTHORITY:
+ case SEC_E_INTERNAL_ERROR:
+ case SEC_E_NO_CREDENTIALS:
+ case SEC_E_UNSUPPORTED_FUNCTION:
+ case SEC_E_APPLICATION_PROTOCOL_MISMATCH:
+ */
+ default:
+ failf(data, "schannel: initial InitializeSecurityContext failed: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_SSL_CONNECT_ERROR;
}
}
@@ -875,8 +994,12 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
SECURITY_STATUS sspi_status = SEC_E_OK;
CURLcode result;
bool doread;
+#ifndef CURL_DISABLE_PROXY
char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#else
+ char * const hostname = conn->host.name;
+#endif
const char *pubkey_ptr;
doread = (connssl->connecting_state != ssl_connect_2_writing) ? TRUE : FALSE;
@@ -984,18 +1107,18 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
memcpy(inbuf[0].pvBuffer, BACKEND->encdata_buffer,
BACKEND->encdata_offset);
- host_name = Curl_convert_UTF8_to_tchar(hostname);
+ host_name = curlx_convert_UTF8_to_tchar(hostname);
if(!host_name)
return CURLE_OUT_OF_MEMORY;
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375924.aspx
- */
+ */
sspi_status = s_pSecFn->InitializeSecurityContext(
&BACKEND->cred->cred_handle, &BACKEND->ctxt->ctxt_handle,
host_name, BACKEND->req_flags, 0, 0, &inbuf_desc, 0, NULL,
&outbuf_desc, &BACKEND->ret_flags, &BACKEND->ctxt->time_stamp);
- Curl_unicodefree(host_name);
+ curlx_unicodefree(host_name);
/* free buffer for received handshake data */
Curl_safefree(inbuf[0].pvBuffer);
@@ -1050,29 +1173,33 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
else {
char buffer[STRERROR_LEN];
switch(sspi_status) {
- case SEC_E_INSUFFICIENT_MEMORY:
- failf(data, "schannel: next InitializeSecurityContext failed: %s",
- Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
- return CURLE_OUT_OF_MEMORY;
- case SEC_E_WRONG_PRINCIPAL:
- failf(data, "schannel: SNI or certificate check failed: %s",
- Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
- return CURLE_PEER_FAILED_VERIFICATION;
- /*
- case SEC_E_INVALID_HANDLE:
- case SEC_E_INVALID_TOKEN:
- case SEC_E_LOGON_DENIED:
- case SEC_E_TARGET_UNKNOWN:
- case SEC_E_NO_AUTHENTICATING_AUTHORITY:
- case SEC_E_INTERNAL_ERROR:
- case SEC_E_NO_CREDENTIALS:
- case SEC_E_UNSUPPORTED_FUNCTION:
- case SEC_E_APPLICATION_PROTOCOL_MISMATCH:
- */
- default:
- failf(data, "schannel: next InitializeSecurityContext failed: %s",
- Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
- return CURLE_SSL_CONNECT_ERROR;
+ case SEC_E_INSUFFICIENT_MEMORY:
+ failf(data, "schannel: next InitializeSecurityContext failed: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_OUT_OF_MEMORY;
+ case SEC_E_WRONG_PRINCIPAL:
+ failf(data, "schannel: SNI or certificate check failed: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_PEER_FAILED_VERIFICATION;
+ case SEC_E_UNTRUSTED_ROOT:
+ failf(data, "schannel: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_PEER_FAILED_VERIFICATION;
+ /*
+ case SEC_E_INVALID_HANDLE:
+ case SEC_E_INVALID_TOKEN:
+ case SEC_E_LOGON_DENIED:
+ case SEC_E_TARGET_UNKNOWN:
+ case SEC_E_NO_AUTHENTICATING_AUTHORITY:
+ case SEC_E_INTERNAL_ERROR:
+ case SEC_E_NO_CREDENTIALS:
+ case SEC_E_UNSUPPORTED_FUNCTION:
+ case SEC_E_APPLICATION_PROTOCOL_MISMATCH:
+ */
+ default:
+ failf(data, "schannel: next InitializeSecurityContext failed: %s",
+ Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
+ return CURLE_SSL_CONNECT_ERROR;
}
}
@@ -1241,8 +1368,10 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
#ifdef HAS_ALPN
if(BACKEND->use_alpn) {
- sspi_status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
- SECPKG_ATTR_APPLICATION_PROTOCOL, &alpn_result);
+ sspi_status =
+ s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
+ SECPKG_ATTR_APPLICATION_PROTOCOL,
+ &alpn_result);
if(sspi_status != SEC_E_OK) {
failf(data, "schannel: failed to retrieve ALPN result");
@@ -1253,21 +1382,21 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
SecApplicationProtocolNegotiationStatus_Success) {
infof(data, "schannel: ALPN, server accepted to use %.*s\n",
- alpn_result.ProtocolIdSize, alpn_result.ProtocolId);
+ alpn_result.ProtocolIdSize, alpn_result.ProtocolId);
#ifdef USE_NGHTTP2
if(alpn_result.ProtocolIdSize == NGHTTP2_PROTO_VERSION_ID_LEN &&
!memcmp(NGHTTP2_PROTO_VERSION_ID, alpn_result.ProtocolId,
- NGHTTP2_PROTO_VERSION_ID_LEN)) {
+ NGHTTP2_PROTO_VERSION_ID_LEN)) {
conn->negnpn = CURL_HTTP_VERSION_2;
}
else
#endif
- if(alpn_result.ProtocolIdSize == ALPN_HTTP_1_1_LENGTH &&
- !memcmp(ALPN_HTTP_1_1, alpn_result.ProtocolId,
- ALPN_HTTP_1_1_LENGTH)) {
- conn->negnpn = CURL_HTTP_VERSION_1_1;
- }
+ if(alpn_result.ProtocolIdSize == ALPN_HTTP_1_1_LENGTH &&
+ !memcmp(ALPN_HTTP_1_1, alpn_result.ProtocolId,
+ ALPN_HTTP_1_1_LENGTH)) {
+ conn->negnpn = CURL_HTTP_VERSION_1_1;
+ }
}
else
infof(data, "ALPN, server did not agree to a protocol\n");
@@ -1279,7 +1408,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
/* save the current session data for possible re-use */
if(SSL_SET_OPTION(primary.sessionid)) {
bool incache;
- struct curl_schannel_cred *old_cred = NULL;
+ struct Curl_schannel_cred *old_cred = NULL;
Curl_ssl_sessionid_lock(conn);
incache = !(Curl_ssl_getsessionid(conn, (void **)&old_cred, NULL,
@@ -1295,7 +1424,7 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
}
if(!incache) {
result = Curl_ssl_addsessionid(conn, (void *)BACKEND->cred,
- sizeof(struct curl_schannel_cred),
+ sizeof(struct Curl_schannel_cred),
sockindex);
if(result) {
Curl_ssl_sessionid_unlock(conn);
@@ -1314,8 +1443,10 @@ schannel_connect_step3(struct connectdata *conn, int sockindex)
if(data->set.ssl.certinfo) {
int certs_count = 0;
- sspi_status = s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
- SECPKG_ATTR_REMOTE_CERT_CONTEXT, &ccert_context);
+ sspi_status =
+ s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
+ SECPKG_ATTR_REMOTE_CERT_CONTEXT,
+ &ccert_context);
if((sspi_status != SEC_E_OK) || (ccert_context == NULL)) {
failf(data, "schannel: failed to retrieve remote cert context");
@@ -1398,7 +1529,7 @@ schannel_connect_common(struct connectdata *conn, int sockindex,
connssl->connecting_state ? sockfd : CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking ? 0 : (time_t)timeout_ms);
+ nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL/TLS socket, errno: %d", SOCKERRNO);
@@ -1547,14 +1678,10 @@ schannel_send(struct connectdata *conn, int sockindex,
/* send entire message or fail */
while(len > (size_t)written) {
- ssize_t this_write;
- timediff_t timeleft;
+ ssize_t this_write = 0;
int what;
-
- this_write = 0;
-
- timeleft = Curl_timeleft(conn->data, NULL, FALSE);
- if(timeleft < 0) {
+ timediff_t timeout_ms = Curl_timeleft(conn->data, NULL, FALSE);
+ if(timeout_ms < 0) {
/* we already got the timeout */
failf(conn->data, "schannel: timed out sending data "
"(bytes sent: %zd)", written);
@@ -1562,8 +1689,9 @@ schannel_send(struct connectdata *conn, int sockindex,
written = -1;
break;
}
-
- what = SOCKET_WRITABLE(conn->sock[sockindex], timeleft);
+ else if(!timeout_ms)
+ timeout_ms = TIMEDIFF_T_MAX;
+ what = SOCKET_WRITABLE(conn->sock[sockindex], timeout_ms);
if(what < 0) {
/* fatal error */
failf(conn->data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -1657,8 +1785,8 @@ schannel_recv(struct connectdata *conn, int sockindex,
}
else if(!len) {
/* It's debatable what to return when !len. Regardless we can't return
- immediately because there may be data to decrypt (in the case we want to
- decrypt all encrypted cached data) so handle !len later in cleanup.
+ immediately because there may be data to decrypt (in the case we want to
+ decrypt all encrypted cached data) so handle !len later in cleanup.
*/
; /* do nothing */
}
@@ -1668,7 +1796,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
if(size < CURL_SCHANNEL_BUFFER_FREE_SIZE ||
BACKEND->encdata_length < min_encdata_length) {
reallocated_length = BACKEND->encdata_offset +
- CURL_SCHANNEL_BUFFER_FREE_SIZE;
+ CURL_SCHANNEL_BUFFER_FREE_SIZE;
if(reallocated_length < min_encdata_length) {
reallocated_length = min_encdata_length;
}
@@ -1736,7 +1864,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
InitSecBufferDesc(&inbuf_desc, inbuf, 4);
/* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375348.aspx
- */
+ */
sspi_status = s_pSecFn->DecryptMessage(&BACKEND->ctxt->ctxt_handle,
&inbuf_desc, 0, NULL);
@@ -1752,7 +1880,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
/* increase buffer in order to fit the received amount of data */
size = inbuf[1].cbBuffer > CURL_SCHANNEL_BUFFER_FREE_SIZE ?
- inbuf[1].cbBuffer : CURL_SCHANNEL_BUFFER_FREE_SIZE;
+ inbuf[1].cbBuffer : CURL_SCHANNEL_BUFFER_FREE_SIZE;
if(BACKEND->decdata_length - BACKEND->decdata_offset < size ||
BACKEND->decdata_length < len) {
/* increase internal decrypted data buffer */
@@ -1822,7 +1950,7 @@ schannel_recv(struct connectdata *conn, int sockindex,
if(BACKEND->encdata_offset) {
*err = CURLE_RECV_ERROR;
infof(data, "schannel: can't renogotiate, "
- "encrypted data available\n");
+ "encrypted data available\n");
goto cleanup;
}
/* begin renegotiation */
@@ -1859,7 +1987,9 @@ schannel_recv(struct connectdata *conn, int sockindex,
goto cleanup;
}
else {
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
char buffer[STRERROR_LEN];
+#endif
*err = CURLE_RECV_ERROR;
infof(data, "schannel: failed to read data from server: %s\n",
Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
@@ -1875,22 +2005,25 @@ schannel_recv(struct connectdata *conn, int sockindex,
"schannel: decrypted data buffer: offset %zu length %zu\n",
BACKEND->decdata_offset, BACKEND->decdata_length));
-cleanup:
+ cleanup:
/* Warning- there is no guarantee the encdata state is valid at this point */
DEBUGF(infof(data, "schannel: schannel_recv cleanup\n"));
/* Error if the connection has closed without a close_notify.
- Behavior here is a matter of debate. We don't want to be vulnerable to a
- truncation attack however there's some browser precedent for ignoring the
- close_notify for compatibility reasons.
- Additionally, Windows 2000 (v5.0) is a special case since it seems it doesn't
- return close_notify. In that case if the connection was closed we assume it
- was graceful (close_notify) since there doesn't seem to be a way to tell.
+
+ The behavior here is a matter of debate. We don't want to be vulnerable
+ to a truncation attack however there's some browser precedent for
+ ignoring the close_notify for compatibility reasons.
+
+ Additionally, Windows 2000 (v5.0) is a special case since it seems it
+ doesn't return close_notify. In that case if the connection was closed we
+ assume it was graceful (close_notify) since there doesn't seem to be a
+ way to tell.
*/
if(len && !BACKEND->decdata_offset && BACKEND->recv_connection_closed &&
!BACKEND->recv_sspi_close_notify) {
- bool isWin2k = Curl_verify_windows_version(5, 0, PLATFORM_WINNT,
- VERSION_EQUAL);
+ bool isWin2k = curlx_verify_windows_version(5, 0, PLATFORM_WINNT,
+ VERSION_EQUAL);
if(isWin2k && sspi_status == SEC_E_OK)
BACKEND->recv_sspi_close_notify = true;
@@ -1902,7 +2035,7 @@ cleanup:
/* Any error other than CURLE_AGAIN is an unrecoverable error. */
if(*err && *err != CURLE_AGAIN)
- BACKEND->recv_unrecoverable_err = *err;
+ BACKEND->recv_unrecoverable_err = *err;
size = len < BACKEND->decdata_offset ? len : BACKEND->decdata_offset;
if(size) {
@@ -1919,10 +2052,11 @@ cleanup:
}
if(!*err && !BACKEND->recv_connection_closed)
- *err = CURLE_AGAIN;
+ *err = CURLE_AGAIN;
- /* It's debatable what to return when !len. We could return whatever error we
- got from decryption but instead we override here so the return is consistent.
+ /* It's debatable what to return when !len. We could return whatever error
+ we got from decryption but instead we override here so the return is
+ consistent.
*/
if(!len)
*err = CURLE_OK;
@@ -1972,7 +2106,7 @@ static void Curl_schannel_close(struct connectdata *conn, int sockindex)
static void Curl_schannel_session_free(void *ptr)
{
/* this is expected to be called under sessionid lock */
- struct curl_schannel_cred *cred = ptr;
+ struct Curl_schannel_cred *cred = ptr;
cred->refcount--;
if(cred->refcount == 0) {
@@ -1988,8 +2122,12 @@ static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
*/
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+#ifndef CURL_DISABLE_PROXY
char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#else
+ char * const hostname = conn->host.name;
+#endif
DEBUGASSERT(data);
@@ -2018,7 +2156,7 @@ static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
Curl_sspi_strerror(sspi_status, buffer, sizeof(buffer)));
}
- host_name = Curl_convert_UTF8_to_tchar(hostname);
+ host_name = curlx_convert_UTF8_to_tchar(hostname);
if(!host_name)
return CURLE_OUT_OF_MEMORY;
@@ -2040,7 +2178,7 @@ static int Curl_schannel_shutdown(struct connectdata *conn, int sockindex)
&BACKEND->ret_flags,
&BACKEND->ctxt->time_stamp);
- Curl_unicodefree(host_name);
+ curlx_unicodefree(host_name);
if((sspi_status == SEC_E_OK) || (sspi_status == SEC_I_CONTEXT_EXPIRED)) {
/* send close message which is in output buffer */
@@ -2149,8 +2287,8 @@ static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
SECURITY_STATUS sspi_status;
const char *x509_der;
DWORD x509_der_len;
- curl_X509certificate x509_parsed;
- curl_asn1Element *pubkey;
+ struct Curl_X509certificate x509_parsed;
+ struct Curl_asn1Element *pubkey;
sspi_status =
s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
@@ -2166,7 +2304,7 @@ static CURLcode pkp_pin_peer_pubkey(struct connectdata *conn, int sockindex,
if(!(((pCertContextServer->dwCertEncodingType & X509_ASN_ENCODING) != 0) &&
- (pCertContextServer->cbCertEncoded > 0)))
+ (pCertContextServer->cbCertEncoded > 0)))
break;
x509_der = (const char *)pCertContextServer->pbCertEncoded;
@@ -2215,7 +2353,7 @@ static void Curl_schannel_checksum(const unsigned char *input,
memset(checksum, 0, checksumlen);
if(!CryptAcquireContext(&hProv, NULL, NULL, provType,
- CRYPT_VERIFYCONTEXT))
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
return; /* failed */
do {
@@ -2257,9 +2395,9 @@ static CURLcode Curl_schannel_md5sum(unsigned char *input,
}
static CURLcode Curl_schannel_sha256sum(const unsigned char *input,
- size_t inputlen,
- unsigned char *sha256sum,
- size_t sha256len)
+ size_t inputlen,
+ unsigned char *sha256sum,
+ size_t sha256len)
{
Curl_schannel_checksum(input, inputlen, sha256sum, sha256len,
PROV_RSA_AES, CALG_SHA_256);
diff --git a/lib/vtls/schannel.h b/lib/vtls/schannel.h
index ee8d7d47a..f87bae8ff 100644
--- a/lib/vtls/schannel.h
+++ b/lib/vtls/schannel.h
@@ -8,7 +8,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012, Marc Hoersken, <info@marc-hoersken.de>, et al.
- * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -70,20 +70,20 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex);
#endif
#endif
-struct curl_schannel_cred {
+struct Curl_schannel_cred {
CredHandle cred_handle;
TimeStamp time_stamp;
int refcount;
};
-struct curl_schannel_ctxt {
+struct Curl_schannel_ctxt {
CtxtHandle ctxt_handle;
TimeStamp time_stamp;
};
struct ssl_backend_data {
- struct curl_schannel_cred *cred;
- struct curl_schannel_ctxt *ctxt;
+ struct Curl_schannel_cred *cred;
+ struct Curl_schannel_ctxt *ctxt;
SecPkgContext_StreamSizes stream_sizes;
size_t encdata_length, decdata_length;
size_t encdata_offset, decdata_offset;
diff --git a/lib/vtls/schannel_verify.c b/lib/vtls/schannel_verify.c
index 1bdf50a55..ab7be3950 100644
--- a/lib/vtls/schannel_verify.c
+++ b/lib/vtls/schannel_verify.c
@@ -7,7 +7,7 @@
*
* Copyright (C) 2012 - 2016, Marc Hoersken, <info@marc-hoersken.de>
* Copyright (C) 2012, Mark Salisbury, <mark.salisbury@hp.com>
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -45,7 +45,7 @@
#include "curl_multibyte.h"
#include "curl_printf.h"
#include "hostcheck.h"
-#include "system_win32.h"
+#include "version_win32.h"
/* The last #include file should be: */
#include "curl_memory.h"
@@ -57,7 +57,7 @@
#define BEGIN_CERT "-----BEGIN CERTIFICATE-----"
#define END_CERT "\n-----END CERTIFICATE-----"
-typedef struct {
+struct cert_chain_engine_config_win7 {
DWORD cbSize;
HCERTSTORE hRestrictedRoot;
HCERTSTORE hRestrictedTrust;
@@ -70,7 +70,7 @@ typedef struct {
DWORD CycleDetectionModulus;
HCERTSTORE hExclusiveRoot;
HCERTSTORE hExclusiveTrustedPeople;
-} CERT_CHAIN_ENGINE_CONFIG_WIN7, *PCERT_CHAIN_ENGINE_CONFIG_WIN7;
+};
static int is_cr_or_lf(char c)
{
@@ -94,12 +94,13 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
int num_certs = 0;
size_t END_CERT_LEN;
- ca_file_tstr = Curl_convert_UTF8_to_tchar((char *)ca_file);
+ ca_file_tstr = curlx_convert_UTF8_to_tchar((char *)ca_file);
if(!ca_file_tstr) {
char buffer[STRERROR_LEN];
failf(data,
"schannel: invalid path name for CA file '%s': %s",
- ca_file, Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ ca_file,
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
goto cleanup;
}
@@ -120,7 +121,8 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
char buffer[STRERROR_LEN];
failf(data,
"schannel: failed to open CA file '%s': %s",
- ca_file, Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ ca_file,
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
goto cleanup;
}
@@ -129,7 +131,8 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
char buffer[STRERROR_LEN];
failf(data,
"schannel: failed to determine size of CA file '%s': %s",
- ca_file, Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ ca_file,
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
goto cleanup;
}
@@ -159,7 +162,8 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
char buffer[STRERROR_LEN];
failf(data,
"schannel: failed to read from CA file '%s': %s",
- ca_file, Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ ca_file,
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
goto cleanup;
}
@@ -223,7 +227,7 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
"schannel: failed to extract certificate from CA file "
"'%s': %s",
ca_file,
- Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
more_certs = 0;
}
@@ -252,7 +256,8 @@ static CURLcode add_certs_to_store(HCERTSTORE trust_store,
"schannel: failed to add certificate from CA file '%s' "
"to certificate store: %s",
ca_file,
- Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ Curl_winapi_strerror(GetLastError(), buffer,
+ sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
more_certs = 0;
}
@@ -283,11 +288,138 @@ cleanup:
CloseHandle(ca_file_handle);
}
Curl_safefree(ca_file_buffer);
- Curl_unicodefree(ca_file_tstr);
+ curlx_unicodefree(ca_file_tstr);
return result;
}
+/*
+ * Returns the number of characters necessary to populate all the host_names.
+ * If host_names is not NULL, populate it with all the host names. Each string
+ * in the host_names is null-terminated and the last string is double
+ * null-terminated. If no DNS names are found, a single null-terminated empty
+ * string is returned.
+ */
+static DWORD cert_get_name_string(struct Curl_easy *data,
+ CERT_CONTEXT *cert_context,
+ LPTSTR host_names,
+ DWORD length)
+{
+ DWORD actual_length = 0;
+ BOOL compute_content = FALSE;
+ CERT_INFO *cert_info = NULL;
+ CERT_EXTENSION *extension = NULL;
+ CRYPT_DECODE_PARA decode_para = {0, 0, 0};
+ CERT_ALT_NAME_INFO *alt_name_info = NULL;
+ DWORD alt_name_info_size = 0;
+ BOOL ret_val = FALSE;
+ LPTSTR current_pos = NULL;
+ DWORD i;
+
+ /* CERT_NAME_SEARCH_ALL_NAMES_FLAG is available from Windows 8 onwards. */
+ if(curlx_verify_windows_version(6, 2, PLATFORM_WINNT,
+ VERSION_GREATER_THAN_EQUAL)) {
+#ifdef CERT_NAME_SEARCH_ALL_NAMES_FLAG
+ /* CertGetNameString will provide the 8-bit character string without
+ * any decoding */
+ DWORD name_flags =
+ CERT_NAME_DISABLE_IE4_UTF8_FLAG | CERT_NAME_SEARCH_ALL_NAMES_FLAG;
+ actual_length = CertGetNameString(cert_context,
+ CERT_NAME_DNS_TYPE,
+ name_flags,
+ NULL,
+ host_names,
+ length);
+ return actual_length;
+#endif
+ }
+
+ compute_content = host_names != NULL && length != 0;
+
+ /* Initialize default return values. */
+ actual_length = 1;
+ if(compute_content) {
+ *host_names = '\0';
+ }
+
+ if(!cert_context) {
+ failf(data, "schannel: Null certificate context.");
+ return actual_length;
+ }
+
+ cert_info = cert_context->pCertInfo;
+ if(!cert_info) {
+ failf(data, "schannel: Null certificate info.");
+ return actual_length;
+ }
+
+ extension = CertFindExtension(szOID_SUBJECT_ALT_NAME2,
+ cert_info->cExtension,
+ cert_info->rgExtension);
+ if(!extension) {
+ failf(data, "schannel: CertFindExtension() returned no extension.");
+ return actual_length;
+ }
+
+ decode_para.cbSize = sizeof(CRYPT_DECODE_PARA);
+
+ ret_val =
+ CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
+ szOID_SUBJECT_ALT_NAME2,
+ extension->Value.pbData,
+ extension->Value.cbData,
+ CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_NOCOPY_FLAG,
+ &decode_para,
+ &alt_name_info,
+ &alt_name_info_size);
+ if(!ret_val) {
+ failf(data,
+ "schannel: CryptDecodeObjectEx() returned no alternate name "
+ "information.");
+ return actual_length;
+ }
+
+ current_pos = host_names;
+
+ /* Iterate over the alternate names and populate host_names. */
+ for(i = 0; i < alt_name_info->cAltEntry; i++) {
+ const CERT_ALT_NAME_ENTRY *entry = &alt_name_info->rgAltEntry[i];
+ wchar_t *dns_w = NULL;
+ size_t current_length = 0;
+
+ if(entry->dwAltNameChoice != CERT_ALT_NAME_DNS_NAME) {
+ continue;
+ }
+ if(entry->pwszDNSName == NULL) {
+ infof(data, "schannel: Empty DNS name.");
+ continue;
+ }
+ current_length = wcslen(entry->pwszDNSName) + 1;
+ if(!compute_content) {
+ actual_length += (DWORD)current_length;
+ continue;
+ }
+ /* Sanity check to prevent buffer overrun. */
+ if((actual_length + current_length) > length) {
+ failf(data, "schannel: Not enough memory to list all host names.");
+ break;
+ }
+ dns_w = entry->pwszDNSName;
+ /* pwszDNSName is in ia5 string format and hence doesn't contain any
+ * non-ascii characters. */
+ while(*dns_w != '\0') {
+ *current_pos++ = (char)(*dns_w++);
+ }
+ *current_pos++ = '\0';
+ actual_length += (DWORD)current_length;
+ }
+ if(compute_content) {
+ /* Last string has double null-terminator. */
+ *current_pos = '\0';
+ }
+ return actual_length;
+}
+
static CURLcode verify_host(struct Curl_easy *data,
CERT_CONTEXT *pCertContextServer,
const char * const conn_hostname)
@@ -298,21 +430,8 @@ static CURLcode verify_host(struct Curl_easy *data,
DWORD len = 0;
DWORD actual_len = 0;
- /* CertGetNameString will provide the 8-bit character string without
- * any decoding */
- DWORD name_flags = CERT_NAME_DISABLE_IE4_UTF8_FLAG;
-
-#ifdef CERT_NAME_SEARCH_ALL_NAMES_FLAG
- name_flags |= CERT_NAME_SEARCH_ALL_NAMES_FLAG;
-#endif
-
/* Determine the size of the string needed for the cert hostname */
- len = CertGetNameString(pCertContextServer,
- CERT_NAME_DNS_TYPE,
- name_flags,
- NULL,
- NULL,
- 0);
+ len = cert_get_name_string(data, pCertContextServer, NULL, 0);
if(len == 0) {
failf(data,
"schannel: CertGetNameString() returned no "
@@ -329,12 +448,8 @@ static CURLcode verify_host(struct Curl_easy *data,
result = CURLE_OUT_OF_MEMORY;
goto cleanup;
}
- actual_len = CertGetNameString(pCertContextServer,
- CERT_NAME_DNS_TYPE,
- name_flags,
- NULL,
- (LPTSTR) cert_hostname_buff,
- len);
+ actual_len = cert_get_name_string(
+ data, pCertContextServer, (LPTSTR)cert_hostname_buff, len);
/* Sanity check */
if(actual_len != len) {
@@ -361,7 +476,7 @@ static CURLcode verify_host(struct Curl_easy *data,
* is acceptable since both values are assumed to use ASCII
* (or some equivalent) encoding
*/
- cert_hostname = Curl_convert_tchar_to_UTF8(
+ cert_hostname = curlx_convert_tchar_to_UTF8(
&cert_hostname_buff[cert_hostname_buff_index]);
if(!cert_hostname) {
result = CURLE_OUT_OF_MEMORY;
@@ -393,7 +508,7 @@ static CURLcode verify_host(struct Curl_easy *data,
result = CURLE_PEER_FAILED_VERIFICATION;
}
- Curl_unicodefree(cert_hostname);
+ curlx_unicodefree(cert_hostname);
}
}
@@ -407,7 +522,7 @@ static CURLcode verify_host(struct Curl_easy *data,
failf(data, "schannel: server certificate name verification failed");
cleanup:
- Curl_unicodefree(cert_hostname_buff);
+ curlx_unicodefree(cert_hostname_buff);
return result;
}
@@ -422,9 +537,13 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
const CERT_CHAIN_CONTEXT *pChainContext = NULL;
HCERTCHAINENGINE cert_chain_engine = NULL;
HCERTSTORE trust_store = NULL;
+#ifndef CURL_DISABLE_PROXY
const char * const conn_hostname = SSL_IS_PROXY() ?
conn->http_proxy.host.name :
conn->host.name;
+#else
+ const char * const conn_hostname = conn->host.name;
+#endif
sspi_status =
s_pSecFn->QueryContextAttributes(&BACKEND->ctxt->ctxt_handle,
@@ -445,7 +564,7 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
* trusted certificates. This is only supported on Windows 7+.
*/
- if(Curl_verify_windows_version(6, 1, PLATFORM_WINNT, VERSION_LESS_THAN)) {
+ if(curlx_verify_windows_version(6, 1, PLATFORM_WINNT, VERSION_LESS_THAN)) {
failf(data, "schannel: this version of Windows is too old to support "
"certificate verification via CA bundle file.");
result = CURLE_SSL_CACERT_BADFILE;
@@ -460,7 +579,7 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
if(!trust_store) {
char buffer[STRERROR_LEN];
failf(data, "schannel: failed to create certificate store: %s",
- Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
}
else {
@@ -470,7 +589,7 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
}
if(result == CURLE_OK) {
- CERT_CHAIN_ENGINE_CONFIG_WIN7 engine_config;
+ struct cert_chain_engine_config_win7 engine_config;
BOOL create_engine_result;
memset(&engine_config, 0, sizeof(engine_config));
@@ -489,7 +608,7 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
char buffer[STRERROR_LEN];
failf(data,
"schannel: failed to create certificate chain engine: %s",
- Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
result = CURLE_SSL_CACERT_BADFILE;
}
}
@@ -512,7 +631,7 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
&pChainContext)) {
char buffer[STRERROR_LEN];
failf(data, "schannel: CertGetCertificateChain failed: %s",
- Curl_strerror(GetLastError(), buffer, sizeof(buffer)));
+ Curl_winapi_strerror(GetLastError(), buffer, sizeof(buffer)));
pChainContext = NULL;
result = CURLE_PEER_FAILED_VERIFICATION;
}
@@ -521,6 +640,15 @@ CURLcode Curl_verify_certificate(struct connectdata *conn, int sockindex)
CERT_SIMPLE_CHAIN *pSimpleChain = pChainContext->rgpChain[0];
DWORD dwTrustErrorMask = ~(DWORD)(CERT_TRUST_IS_NOT_TIME_NESTED);
dwTrustErrorMask &= pSimpleChain->TrustStatus.dwErrorStatus;
+
+ if(data->set.ssl.revoke_best_effort) {
+ /* Ignore errors when root certificates are missing the revocation
+ * list URL, or when the list could not be downloaded because the
+ * server is currently unreachable. */
+ dwTrustErrorMask &= ~(DWORD)(CERT_TRUST_REVOCATION_STATUS_UNKNOWN |
+ CERT_TRUST_IS_OFFLINE_REVOCATION);
+ }
+
if(dwTrustErrorMask) {
if(dwTrustErrorMask & CERT_TRUST_IS_REVOKED)
failf(data, "schannel: CertGetCertificateChain trust error"
diff --git a/lib/vtls/sectransp.c b/lib/vtls/sectransp.c
index 4eece89d5..af63df46a 100644
--- a/lib/vtls/sectransp.c
+++ b/lib/vtls/sectransp.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2012 - 2017, Nick Zitzmann, <nickzman@gmail.com>.
- * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -138,8 +138,6 @@ struct ssl_backend_data {
size_t ssl_write_buffered_length;
};
-#define BACKEND connssl->backend
-
/* pinned public key support tests */
/* version 1 supports macOS 10.12+ and iOS 10+ */
@@ -201,7 +199,8 @@ static OSStatus SocketRead(SSLConnectionRef connection,
UInt8 *currData = (UInt8 *)data;
/*int sock = *(int *)connection;*/
struct ssl_connect_data *connssl = (struct ssl_connect_data *)connection;
- int sock = BACKEND->ssl_sockfd;
+ struct ssl_backend_data *backend = connssl->backend;
+ int sock = backend->ssl_sockfd;
OSStatus rtn = noErr;
size_t bytesRead;
ssize_t rrtn;
@@ -230,7 +229,7 @@ static OSStatus SocketRead(SSLConnectionRef connection,
break;
case EAGAIN:
rtn = errSSLWouldBlock;
- BACKEND->ssl_direction = false;
+ backend->ssl_direction = false;
break;
default:
rtn = ioErr;
@@ -261,7 +260,8 @@ static OSStatus SocketWrite(SSLConnectionRef connection,
size_t bytesSent = 0;
/*int sock = *(int *)connection;*/
struct ssl_connect_data *connssl = (struct ssl_connect_data *)connection;
- int sock = BACKEND->ssl_sockfd;
+ struct ssl_backend_data *backend = connssl->backend;
+ int sock = backend->ssl_sockfd;
ssize_t length;
size_t dataLen = *dataLength;
const UInt8 *dataPtr = (UInt8 *)data;
@@ -281,7 +281,7 @@ static OSStatus SocketWrite(SSLConnectionRef connection,
theErr = errno;
if(theErr == EAGAIN) {
ortn = errSSLWouldBlock;
- BACKEND->ssl_direction = true;
+ backend->ssl_direction = true;
}
else {
ortn = ioErr;
@@ -1126,12 +1126,12 @@ static OSStatus CopyIdentityWithLabel(char *label,
}
static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
+ const struct curl_blob *blob,
const char *cPassword,
SecIdentityRef *out_cert_and_key)
{
OSStatus status = errSecItemNotFound;
- CFURLRef pkcs_url = CFURLCreateFromFileSystemRepresentation(NULL,
- (const UInt8 *)cPath, strlen(cPath), false);
+ CFURLRef pkcs_url = NULL;
CFStringRef password = cPassword ? CFStringCreateWithCString(NULL,
cPassword, kCFStringEncodingUTF8) : NULL;
CFDataRef pkcs_data = NULL;
@@ -1140,8 +1140,26 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
/* These constants are documented as having first appeared in 10.6 but they
raise linker errors when used on that cat for some reason. */
#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
- if(CFURLCreateDataAndPropertiesFromResource(NULL, pkcs_url, &pkcs_data,
- NULL, NULL, &status)) {
+ bool resource_imported;
+
+ if(blob) {
+ pkcs_data = CFDataCreate(kCFAllocatorDefault,
+ (const unsigned char *)blob->data, blob->len);
+ status = (pkcs_data != NULL) ? errSecSuccess : errSecAllocate;
+ resource_imported = (pkcs_data != NULL);
+ }
+ else {
+ pkcs_url =
+ CFURLCreateFromFileSystemRepresentation(NULL,
+ (const UInt8 *)cPath,
+ strlen(cPath), false);
+ resource_imported =
+ CFURLCreateDataAndPropertiesFromResource(NULL,
+ pkcs_url, &pkcs_data,
+ NULL, NULL, &status);
+ }
+
+ if(resource_imported) {
CFArrayRef items = NULL;
/* On iOS SecPKCS12Import will never add the client certificate to the
@@ -1164,7 +1182,7 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
* the Keychain.
*
* As this doesn't match iOS, and apps may not want to see their client
- * certificate saved in the the user's keychain, we use SecItemImport
+ * certificate saved in the user's keychain, we use SecItemImport
* with a NULL keychain to avoid importing it.
*
* This returns a SecCertificateRef from which we can construct a
@@ -1219,7 +1237,8 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
#endif /* CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS */
if(password)
CFRelease(password);
- CFRelease(pkcs_url);
+ if(pkcs_url)
+ CFRelease(pkcs_url);
return status;
}
@@ -1276,6 +1295,7 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
long ssl_version = SSL_CONN_CONFIG(version);
long ssl_version_max = SSL_CONN_CONFIG(version_max);
long max_supported_version_by_os;
@@ -1326,30 +1346,30 @@ set_ssl_version_min_max(struct connectdata *conn, int sockindex)
return result;
}
- (void)SSLSetProtocolVersionMin(BACKEND->ssl_ctx, darwin_ver_min);
- (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, darwin_ver_max);
+ (void)SSLSetProtocolVersionMin(backend->ssl_ctx, darwin_ver_min);
+ (void)SSLSetProtocolVersionMax(backend->ssl_ctx, darwin_ver_max);
return result;
}
else {
#if CURL_SUPPORT_MAC_10_8
long i = ssl_version;
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kSSLProtocolAll,
false);
for(; i <= (ssl_version_max >> 16); i++) {
switch(i) {
case CURL_SSLVERSION_TLSv1_0:
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol1,
true);
break;
case CURL_SSLVERSION_TLSv1_1:
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol11,
true);
break;
case CURL_SSLVERSION_TLSv1_2:
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol12,
true);
break;
@@ -1373,12 +1393,20 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[sockindex];
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
+ const struct curl_blob *ssl_cablob = NULL;
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
- char * const ssl_cert = SSL_SET_OPTION(cert);
+ char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
+ const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const long int port = SSL_IS_PROXY() ? conn->port : conn->remote_port;
+#else
+ const char * const hostname = conn->host.name;
+ const long int port = conn->remote_port;
+#endif
#ifdef ENABLE_IPV6
struct in6_addr addr;
#else
@@ -1395,10 +1423,10 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
if(SSLCreateContext != NULL) { /* use the newer API if available */
- if(BACKEND->ssl_ctx)
- CFRelease(BACKEND->ssl_ctx);
- BACKEND->ssl_ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
- if(!BACKEND->ssl_ctx) {
+ if(backend->ssl_ctx)
+ CFRelease(backend->ssl_ctx);
+ backend->ssl_ctx = SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType);
+ if(!backend->ssl_ctx) {
failf(data, "SSL: couldn't create a context!");
return CURLE_OUT_OF_MEMORY;
}
@@ -1406,9 +1434,9 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
else {
/* The old ST API does not exist under iOS, so don't compile it: */
#if CURL_SUPPORT_MAC_10_8
- if(BACKEND->ssl_ctx)
- (void)SSLDisposeContext(BACKEND->ssl_ctx);
- err = SSLNewContext(false, &(BACKEND->ssl_ctx));
+ if(backend->ssl_ctx)
+ (void)SSLDisposeContext(backend->ssl_ctx);
+ err = SSLNewContext(false, &(backend->ssl_ctx));
if(err != noErr) {
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
return CURLE_OUT_OF_MEMORY;
@@ -1416,31 +1444,31 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
#endif /* CURL_SUPPORT_MAC_10_8 */
}
#else
- if(BACKEND->ssl_ctx)
- (void)SSLDisposeContext(BACKEND->ssl_ctx);
- err = SSLNewContext(false, &(BACKEND->ssl_ctx));
+ if(backend->ssl_ctx)
+ (void)SSLDisposeContext(backend->ssl_ctx);
+ err = SSLNewContext(false, &(backend->ssl_ctx));
if(err != noErr) {
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
return CURLE_OUT_OF_MEMORY;
}
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
- BACKEND->ssl_write_buffered_length = 0UL; /* reset buffered write length */
+ backend->ssl_write_buffered_length = 0UL; /* reset buffered write length */
/* check to see if we've been told to use an explicit SSL/TLS version */
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
if(SSLSetProtocolVersionMax != NULL) {
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_TLSv1:
- (void)SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kTLSProtocol1);
+ (void)SSLSetProtocolVersionMin(backend->ssl_ctx, kTLSProtocol1);
#if (CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11) && HAVE_BUILTIN_AVAILABLE == 1
if(__builtin_available(macOS 10.13, iOS 11.0, *)) {
- (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kTLSProtocol13);
+ (void)SSLSetProtocolVersionMax(backend->ssl_ctx, kTLSProtocol13);
}
else {
- (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kTLSProtocol12);
+ (void)SSLSetProtocolVersionMax(backend->ssl_ctx, kTLSProtocol12);
}
#else
- (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kTLSProtocol12);
+ (void)SSLSetProtocolVersionMax(backend->ssl_ctx, kTLSProtocol12);
#endif /* (CURL_BUILD_MAC_10_13 || CURL_BUILD_IOS_11) &&
HAVE_BUILTIN_AVAILABLE == 1 */
break;
@@ -1456,20 +1484,20 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
break;
}
case CURL_SSLVERSION_SSLv3:
- err = SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kSSLProtocol3);
+ err = SSLSetProtocolVersionMin(backend->ssl_ctx, kSSLProtocol3);
if(err != noErr) {
failf(data, "Your version of the OS does not support SSLv3");
return CURLE_SSL_CONNECT_ERROR;
}
- (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kSSLProtocol3);
+ (void)SSLSetProtocolVersionMax(backend->ssl_ctx, kSSLProtocol3);
break;
case CURL_SSLVERSION_SSLv2:
- err = SSLSetProtocolVersionMin(BACKEND->ssl_ctx, kSSLProtocol2);
+ err = SSLSetProtocolVersionMin(backend->ssl_ctx, kSSLProtocol2);
if(err != noErr) {
failf(data, "Your version of the OS does not support SSLv2");
return CURLE_SSL_CONNECT_ERROR;
}
- (void)SSLSetProtocolVersionMax(BACKEND->ssl_ctx, kSSLProtocol2);
+ (void)SSLSetProtocolVersionMax(backend->ssl_ctx, kSSLProtocol2);
break;
default:
failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
@@ -1478,19 +1506,19 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
}
else {
#if CURL_SUPPORT_MAC_10_8
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kSSLProtocolAll,
false);
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol1,
true);
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol11,
true);
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol12,
true);
break;
@@ -1505,7 +1533,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
break;
}
case CURL_SSLVERSION_SSLv3:
- err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kSSLProtocol3,
true);
if(err != noErr) {
@@ -1514,7 +1542,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
}
break;
case CURL_SSLVERSION_SSLv2:
- err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kSSLProtocol2,
true);
if(err != noErr) {
@@ -1534,12 +1562,12 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
" SSL/TLS version");
return CURLE_SSL_CONNECT_ERROR;
}
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx, kSSLProtocolAll, false);
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx, kSSLProtocolAll, false);
switch(conn->ssl_config.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
case CURL_SSLVERSION_TLSv1_0:
- (void)SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ (void)SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kTLSProtocol1,
true);
break;
@@ -1553,7 +1581,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
failf(data, "Your version of the OS does not support TLSv1.3");
return CURLE_SSL_CONNECT_ERROR;
case CURL_SSLVERSION_SSLv2:
- err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kSSLProtocol2,
true);
if(err != noErr) {
@@ -1562,7 +1590,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
}
break;
case CURL_SSLVERSION_SSLv3:
- err = SSLSetProtocolVersionEnabled(BACKEND->ssl_ctx,
+ err = SSLSetProtocolVersionEnabled(backend->ssl_ctx,
kSSLProtocol3,
true);
if(err != noErr) {
@@ -1583,8 +1611,11 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
&kCFTypeArrayCallBacks);
#ifdef USE_NGHTTP2
- if(data->set.httpversion >= CURL_HTTP_VERSION_2 &&
- (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+ if(data->set.httpversion >= CURL_HTTP_VERSION_2
+#ifndef CURL_DISABLE_PROXY
+ && (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)
+#endif
+ ) {
CFArrayAppendValue(alpnArr, CFSTR(NGHTTP2_PROTO_VERSION_ID));
infof(data, "ALPN, offering %s\n", NGHTTP2_PROTO_VERSION_ID);
}
@@ -1596,7 +1627,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
/* expects length prefixed preference ordered list of protocols in wire
* format
*/
- err = SSLSetALPNProtocols(BACKEND->ssl_ctx, alpnArr);
+ err = SSLSetALPNProtocols(backend->ssl_ctx, alpnArr);
if(err != noErr)
infof(data, "WARNING: failed to set ALPN protocols; OSStatus %d\n",
err);
@@ -1610,15 +1641,16 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
"Transport. The private key must be in the Keychain.\n");
}
- if(ssl_cert) {
+ if(ssl_cert || ssl_cert_blob) {
+ bool is_cert_data = ssl_cert_blob != NULL;
+ bool is_cert_file = (!is_cert_data) && is_file(ssl_cert);
SecIdentityRef cert_and_key = NULL;
- bool is_cert_file = is_file(ssl_cert);
/* User wants to authenticate with a client cert. Look for it:
If we detect that this is a file on disk, then let's load it.
Otherwise, assume that the user wants to use an identity loaded
from the Keychain. */
- if(is_cert_file) {
+ if(is_cert_file || is_cert_data) {
if(!SSL_SET_OPTION(cert_type))
infof(data, "WARNING: SSL: Certificate type not set, assuming "
"PKCS#12 format.\n");
@@ -1627,7 +1659,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
infof(data, "WARNING: SSL: The Security framework only supports "
"loading identities that are in PKCS#12 format.\n");
- err = CopyIdentityFromPKCS12File(ssl_cert,
+ err = CopyIdentityFromPKCS12File(ssl_cert, ssl_cert_blob,
SSL_SET_OPTION(key_passwd), &cert_and_key);
}
else
@@ -1657,7 +1689,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
certs_c[0] = cert_and_key;
certs = CFArrayCreate(NULL, (const void **)certs_c, 1L,
&kCFTypeArrayCallBacks);
- err = SSLSetCertificate(BACKEND->ssl_ctx, certs);
+ err = SSLSetCertificate(backend->ssl_ctx, certs);
if(certs)
CFRelease(certs);
if(err != noErr) {
@@ -1667,27 +1699,30 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
CFRelease(cert_and_key);
}
else {
+ const char *cert_showfilename_error =
+ is_cert_data ? "(memory blob)" : ssl_cert;
+
switch(err) {
case errSecAuthFailed: case -25264: /* errSecPkcs12VerifyFailure */
failf(data, "SSL: Incorrect password for the certificate \"%s\" "
- "and its private key.", ssl_cert);
+ "and its private key.", cert_showfilename_error);
break;
case -26275: /* errSecDecode */ case -25257: /* errSecUnknownFormat */
failf(data, "SSL: Couldn't make sense of the data in the "
"certificate \"%s\" and its private key.",
- ssl_cert);
+ cert_showfilename_error);
break;
case -25260: /* errSecPassphraseRequired */
failf(data, "SSL The certificate \"%s\" requires a password.",
- ssl_cert);
+ cert_showfilename_error);
break;
case errSecItemNotFound:
failf(data, "SSL: Can't find the certificate \"%s\" and its private "
- "key in the Keychain.", ssl_cert);
+ "key in the Keychain.", cert_showfilename_error);
break;
default:
failf(data, "SSL: Can't load the certificate \"%s\" and its private "
- "key: OSStatus %d", ssl_cert, err);
+ "key: OSStatus %d", cert_showfilename_error, err);
break;
}
return CURLE_SSL_CERTPROBLEM;
@@ -1719,8 +1754,9 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
#else
if(SSLSetSessionOption != NULL) {
#endif /* CURL_BUILD_MAC */
- bool break_on_auth = !conn->ssl_config.verifypeer || ssl_cafile;
- err = SSLSetSessionOption(BACKEND->ssl_ctx,
+ bool break_on_auth = !conn->ssl_config.verifypeer ||
+ ssl_cafile || ssl_cablob;
+ err = SSLSetSessionOption(backend->ssl_ctx,
kSSLSessionOptionBreakOnServerAuth,
break_on_auth);
if(err != noErr) {
@@ -1730,7 +1766,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
}
else {
#if CURL_SUPPORT_MAC_10_8
- err = SSLSetEnableCertVerify(BACKEND->ssl_ctx,
+ err = SSLSetEnableCertVerify(backend->ssl_ctx,
conn->ssl_config.verifypeer?true:false);
if(err != noErr) {
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
@@ -1739,7 +1775,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
#endif /* CURL_SUPPORT_MAC_10_8 */
}
#else
- err = SSLSetEnableCertVerify(BACKEND->ssl_ctx,
+ err = SSLSetEnableCertVerify(backend->ssl_ctx,
conn->ssl_config.verifypeer?true:false);
if(err != noErr) {
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
@@ -1747,10 +1783,11 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
}
#endif /* CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS */
- if(ssl_cafile && verifypeer) {
- bool is_cert_file = is_file(ssl_cafile);
+ if((ssl_cafile || ssl_cablob) && verifypeer) {
+ bool is_cert_data = ssl_cablob != NULL;
+ bool is_cert_file = (!is_cert_data) && is_file(ssl_cafile);
- if(!is_cert_file) {
+ if(!(is_cert_file || is_cert_data)) {
failf(data, "SSL: can't load CA certificate file %s", ssl_cafile);
return CURLE_SSL_CACERT_BADFILE;
}
@@ -1760,7 +1797,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
* Both hostname check and SNI require SSLSetPeerDomainName().
* Also: the verifyhost setting influences SNI usage */
if(conn->ssl_config.verifyhost) {
- err = SSLSetPeerDomainName(BACKEND->ssl_ctx, hostname,
+ err = SSLSetPeerDomainName(backend->ssl_ctx, hostname,
strlen(hostname));
if(err != noErr) {
@@ -1786,7 +1823,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
higher priority, but it's probably better that we not connect at all than
to give the user a false sense of security if the server only supports
insecure ciphers. (Note: We don't care about SSLv2-only ciphers.) */
- err = SSLGetNumberSupportedCiphers(BACKEND->ssl_ctx, &all_ciphers_count);
+ err = SSLGetNumberSupportedCiphers(backend->ssl_ctx, &all_ciphers_count);
if(err != noErr) {
failf(data, "SSL: SSLGetNumberSupportedCiphers() failed: OSStatus %d",
err);
@@ -1803,7 +1840,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
failf(data, "SSL: Failed to allocate memory for allowed ciphers");
return CURLE_OUT_OF_MEMORY;
}
- err = SSLGetSupportedCiphers(BACKEND->ssl_ctx, all_ciphers,
+ err = SSLGetSupportedCiphers(backend->ssl_ctx, all_ciphers,
&all_ciphers_count);
if(err != noErr) {
Curl_safefree(all_ciphers);
@@ -1890,7 +1927,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
break;
}
}
- err = SSLSetEnabledCiphers(BACKEND->ssl_ctx, allowed_ciphers,
+ err = SSLSetEnabledCiphers(backend->ssl_ctx, allowed_ciphers,
allowed_ciphers_count);
Curl_safefree(all_ciphers);
Curl_safefree(allowed_ciphers);
@@ -1903,9 +1940,9 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
/* We want to enable 1/n-1 when using a CBC cipher unless the user
specifically doesn't want us doing that: */
if(SSLSetSessionOption != NULL) {
- SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionSendOneByteRecord,
+ SSLSetSessionOption(backend->ssl_ctx, kSSLSessionOptionSendOneByteRecord,
!data->set.ssl.enable_beast);
- SSLSetSessionOption(BACKEND->ssl_ctx, kSSLSessionOptionFalseStart,
+ SSLSetSessionOption(backend->ssl_ctx, kSSLSessionOptionFalseStart,
data->set.ssl.falsestart); /* false start support */
}
#endif /* CURL_BUILD_MAC_10_9 || CURL_BUILD_IOS_7 */
@@ -1919,7 +1956,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
if(!Curl_ssl_getsessionid(conn, (void **)&ssl_sessionid,
&ssl_sessionid_len, sockindex)) {
/* we got a session id, use it! */
- err = SSLSetPeerID(BACKEND->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
+ err = SSLSetPeerID(backend->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
Curl_ssl_sessionid_unlock(conn);
if(err != noErr) {
failf(data, "SSL: SSLSetPeerID() failed: OSStatus %d", err);
@@ -1937,7 +1974,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
verifypeer, SSL_CONN_CONFIG(verifyhost), hostname, port);
ssl_sessionid_len = strlen(ssl_sessionid);
- err = SSLSetPeerID(BACKEND->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
+ err = SSLSetPeerID(backend->ssl_ctx, ssl_sessionid, ssl_sessionid_len);
if(err != noErr) {
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSLSetPeerID() failed: OSStatus %d", err);
@@ -1954,7 +1991,7 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
}
}
- err = SSLSetIOFuncs(BACKEND->ssl_ctx, SocketRead, SocketWrite);
+ err = SSLSetIOFuncs(backend->ssl_ctx, SocketRead, SocketWrite);
if(err != noErr) {
failf(data, "SSL: SSLSetIOFuncs() failed: OSStatus %d", err);
return CURLE_SSL_CONNECT_ERROR;
@@ -1964,8 +2001,8 @@ static CURLcode sectransp_connect_step1(struct connectdata *conn,
/* We need to store the FD in a constant memory address, because
* SSLSetConnection() will not copy that address. I've found that
* conn->sock[sockindex] may change on its own. */
- BACKEND->ssl_sockfd = sockfd;
- err = SSLSetConnection(BACKEND->ssl_ctx, connssl);
+ backend->ssl_sockfd = sockfd;
+ err = SSLSetConnection(backend->ssl_ctx, connssl);
if(err != noErr) {
failf(data, "SSL: SSLSetConnection() failed: %d", err);
return CURLE_SSL_CONNECT_ERROR;
@@ -2346,23 +2383,28 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
OSStatus err;
SSLCipherSuite cipher;
SSLProtocol protocol = 0;
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#else
+ const char * const hostname = conn->host.name;
+#endif
DEBUGASSERT(ssl_connect_2 == connssl->connecting_state
|| ssl_connect_2_reading == connssl->connecting_state
|| ssl_connect_2_writing == connssl->connecting_state);
/* Here goes nothing: */
- err = SSLHandshake(BACKEND->ssl_ctx);
+ err = SSLHandshake(backend->ssl_ctx);
if(err != noErr) {
switch(err) {
case errSSLWouldBlock: /* they're not done with us yet */
- connssl->connecting_state = BACKEND->ssl_direction ?
+ connssl->connecting_state = backend->ssl_direction ?
ssl_connect_2_writing : ssl_connect_2_reading;
return CURLE_OK;
@@ -2371,7 +2413,7 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
case -9841:
if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
CURLcode result = verify_cert(SSL_CONN_CONFIG(CAfile), data,
- BACKEND->ssl_ctx);
+ backend->ssl_ctx);
if(result)
return result;
}
@@ -2580,7 +2622,7 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
#ifdef SECTRANSP_PINNEDPUBKEY
if(data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]) {
- CURLcode result = pkp_pin_peer_pubkey(data, BACKEND->ssl_ctx,
+ CURLcode result = pkp_pin_peer_pubkey(data, backend->ssl_ctx,
data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]);
if(result) {
failf(data, "SSL: public key does not match pinned public key!");
@@ -2590,8 +2632,8 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
#endif /* SECTRANSP_PINNEDPUBKEY */
/* Informational message */
- (void)SSLGetNegotiatedCipher(BACKEND->ssl_ctx, &cipher);
- (void)SSLGetNegotiatedProtocolVersion(BACKEND->ssl_ctx, &protocol);
+ (void)SSLGetNegotiatedCipher(backend->ssl_ctx, &cipher);
+ (void)SSLGetNegotiatedProtocolVersion(backend->ssl_ctx, &protocol);
switch(protocol) {
case kSSLProtocol2:
infof(data, "SSL 2.0 connection using %s\n",
@@ -2631,7 +2673,7 @@ sectransp_connect_step2(struct connectdata *conn, int sockindex)
if(__builtin_available(macOS 10.13.4, iOS 11, tvOS 11, *)) {
CFArrayRef alpnArr = NULL;
CFStringRef chosenProtocol = NULL;
- err = SSLCopyALPNProtocols(BACKEND->ssl_ctx, &alpnArr);
+ err = SSLCopyALPNProtocols(backend->ssl_ctx, &alpnArr);
if(err == noErr && alpnArr && CFArrayGetCount(alpnArr) >= 1)
chosenProtocol = CFArrayGetValueAtIndex(alpnArr, 0);
@@ -2674,19 +2716,20 @@ show_verbose_server_cert(struct connectdata *conn,
{
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
CFArrayRef server_certs = NULL;
SecCertificateRef server_cert;
OSStatus err;
CFIndex i, count;
SecTrustRef trust = NULL;
- if(!BACKEND->ssl_ctx)
+ if(!backend->ssl_ctx)
return;
#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
#if CURL_BUILD_IOS
#pragma unused(server_certs)
- err = SSLCopyPeerTrust(BACKEND->ssl_ctx, &trust);
+ err = SSLCopyPeerTrust(backend->ssl_ctx, &trust);
/* For some reason, SSLCopyPeerTrust() can return noErr and yet return
a null trust, so be on guard for that: */
if(err == noErr && trust) {
@@ -2712,7 +2755,7 @@ show_verbose_server_cert(struct connectdata *conn,
Lion or later. */
if(SecTrustEvaluateAsync != NULL) {
#pragma unused(server_certs)
- err = SSLCopyPeerTrust(BACKEND->ssl_ctx, &trust);
+ err = SSLCopyPeerTrust(backend->ssl_ctx, &trust);
/* For some reason, SSLCopyPeerTrust() can return noErr and yet return
a null trust, so be on guard for that: */
if(err == noErr && trust) {
@@ -2732,7 +2775,7 @@ show_verbose_server_cert(struct connectdata *conn,
}
else {
#if CURL_SUPPORT_MAC_10_8
- err = SSLCopyPeerCertificates(BACKEND->ssl_ctx, &server_certs);
+ err = SSLCopyPeerCertificates(backend->ssl_ctx, &server_certs);
/* Just in case SSLCopyPeerCertificates() returns null too... */
if(err == noErr && server_certs) {
count = CFArrayGetCount(server_certs);
@@ -2754,7 +2797,7 @@ show_verbose_server_cert(struct connectdata *conn,
#endif /* CURL_BUILD_IOS */
#else
#pragma unused(trust)
- err = SSLCopyPeerCertificates(BACKEND->ssl_ctx, &server_certs);
+ err = SSLCopyPeerCertificates(backend->ssl_ctx, &server_certs);
if(err == noErr) {
count = CFArrayGetCount(server_certs);
for(i = 0L ; i < count ; i++) {
@@ -2805,7 +2848,6 @@ sectransp_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- timediff_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -2816,7 +2858,7 @@ sectransp_connect_common(struct connectdata *conn,
if(ssl_connect_1 == connssl->connecting_state) {
/* Find out how much more time we're allowed */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ const timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* no need to continue if time already is up */
@@ -2834,7 +2876,7 @@ sectransp_connect_common(struct connectdata *conn,
ssl_connect_2_writing == connssl->connecting_state) {
/* check allowed time left */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ const timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* no need to continue if time already is up */
@@ -2852,7 +2894,7 @@ sectransp_connect_common(struct connectdata *conn,
connssl->connecting_state?sockfd:CURL_SOCKET_BAD;
what = Curl_socket_check(readfd, CURL_SOCKET_BAD, writefd,
- nonblocking?0:(time_t)timeout_ms);
+ nonblocking ? 0 : timeout_ms);
if(what < 0) {
/* fatal error */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
@@ -2933,34 +2975,36 @@ static CURLcode Curl_sectransp_connect(struct connectdata *conn, int sockindex)
static void Curl_sectransp_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
- if(BACKEND->ssl_ctx) {
- (void)SSLClose(BACKEND->ssl_ctx);
+ if(backend->ssl_ctx) {
+ (void)SSLClose(backend->ssl_ctx);
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
if(SSLCreateContext != NULL)
- CFRelease(BACKEND->ssl_ctx);
+ CFRelease(backend->ssl_ctx);
#if CURL_SUPPORT_MAC_10_8
else
- (void)SSLDisposeContext(BACKEND->ssl_ctx);
+ (void)SSLDisposeContext(backend->ssl_ctx);
#endif /* CURL_SUPPORT_MAC_10_8 */
#else
- (void)SSLDisposeContext(BACKEND->ssl_ctx);
+ (void)SSLDisposeContext(backend->ssl_ctx);
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
- BACKEND->ssl_ctx = NULL;
+ backend->ssl_ctx = NULL;
}
- BACKEND->ssl_sockfd = 0;
+ backend->ssl_sockfd = 0;
}
static int Curl_sectransp_shutdown(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
struct Curl_easy *data = conn->data;
ssize_t nread;
int what;
int rc;
char buf[120];
- if(!BACKEND->ssl_ctx)
+ if(!backend->ssl_ctx)
return 0;
#ifndef CURL_DISABLE_FTP
@@ -3033,11 +3077,12 @@ static size_t Curl_sectransp_version(char *buffer, size_t size)
static int Curl_sectransp_check_cxn(struct connectdata *conn)
{
struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
+ struct ssl_backend_data *backend = connssl->backend;
OSStatus err;
SSLSessionState state;
- if(BACKEND->ssl_ctx) {
- err = SSLGetSessionState(BACKEND->ssl_ctx, &state);
+ if(backend->ssl_ctx) {
+ err = SSLGetSessionState(backend->ssl_ctx, &state);
if(err == noErr)
return state == kSSLConnected || state == kSSLHandshake;
return -1;
@@ -3049,11 +3094,12 @@ static bool Curl_sectransp_data_pending(const struct connectdata *conn,
int connindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[connindex];
+ struct ssl_backend_data *backend = connssl->backend;
OSStatus err;
size_t buffer;
- if(BACKEND->ssl_ctx) { /* SSL is in use */
- err = SSLGetBufferedReadSize(BACKEND->ssl_ctx, &buffer);
+ if(backend->ssl_ctx) { /* SSL is in use */
+ err = SSLGetBufferedReadSize(backend->ssl_ctx, &buffer);
if(err == noErr)
return buffer > 0UL;
return false;
@@ -3119,6 +3165,7 @@ static ssize_t sectransp_send(struct connectdata *conn,
{
/*struct Curl_easy *data = conn->data;*/
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
size_t processed = 0UL;
OSStatus err;
@@ -3137,15 +3184,15 @@ static ssize_t sectransp_send(struct connectdata *conn,
over again with no new data until it quits returning errSSLWouldBlock. */
/* Do we have buffered data to write from the last time we were called? */
- if(BACKEND->ssl_write_buffered_length) {
+ if(backend->ssl_write_buffered_length) {
/* Write the buffered data: */
- err = SSLWrite(BACKEND->ssl_ctx, NULL, 0UL, &processed);
+ err = SSLWrite(backend->ssl_ctx, NULL, 0UL, &processed);
switch(err) {
case noErr:
/* processed is always going to be 0 because we didn't write to
the buffer, so return how much was written to the socket */
- processed = BACKEND->ssl_write_buffered_length;
- BACKEND->ssl_write_buffered_length = 0UL;
+ processed = backend->ssl_write_buffered_length;
+ backend->ssl_write_buffered_length = 0UL;
break;
case errSSLWouldBlock: /* argh, try again */
*curlcode = CURLE_AGAIN;
@@ -3158,13 +3205,13 @@ static ssize_t sectransp_send(struct connectdata *conn,
}
else {
/* We've got new data to write: */
- err = SSLWrite(BACKEND->ssl_ctx, mem, len, &processed);
+ err = SSLWrite(backend->ssl_ctx, mem, len, &processed);
if(err != noErr) {
switch(err) {
case errSSLWouldBlock:
/* Data was buffered but not sent, we have to tell the caller
to try sending again, and remember how much was buffered */
- BACKEND->ssl_write_buffered_length = len;
+ backend->ssl_write_buffered_length = len;
*curlcode = CURLE_AGAIN;
return -1L;
default:
@@ -3185,11 +3232,12 @@ static ssize_t sectransp_recv(struct connectdata *conn,
{
/*struct Curl_easy *data = conn->data;*/
struct ssl_connect_data *connssl = &conn->ssl[num];
+ struct ssl_backend_data *backend = connssl->backend;
size_t processed = 0UL;
OSStatus err;
again:
- err = SSLRead(BACKEND->ssl_ctx, buf, buffersize, &processed);
+ err = SSLRead(backend->ssl_ctx, buf, buffersize, &processed);
if(err != noErr) {
switch(err) {
@@ -3215,7 +3263,7 @@ static ssize_t sectransp_recv(struct connectdata *conn,
case -9841:
if(SSL_CONN_CONFIG(CAfile) && SSL_CONN_CONFIG(verifypeer)) {
CURLcode result = verify_cert(SSL_CONN_CONFIG(CAfile), conn->data,
- BACKEND->ssl_ctx);
+ backend->ssl_ctx);
if(result)
return result;
}
@@ -3233,8 +3281,9 @@ static ssize_t sectransp_recv(struct connectdata *conn,
static void *Curl_sectransp_get_internals(struct ssl_connect_data *connssl,
CURLINFO info UNUSED_PARAM)
{
+ struct ssl_backend_data *backend = connssl->backend;
(void)info;
- return BACKEND->ssl_ctx;
+ return backend->ssl_ctx;
}
const struct Curl_ssl Curl_ssl_sectransp = {
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
index e6d756225..e65fb4f78 100644
--- a/lib/vtls/vtls.c
+++ b/lib/vtls/vtls.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -63,6 +63,7 @@
#include "warnless.h"
#include "curl_base64.h"
#include "curl_printf.h"
+#include "strdup.h"
/* The last #include files should be: */
#include "curl_memory.h"
@@ -82,15 +83,54 @@
else \
dest->var = NULL;
+#define CLONE_BLOB(var) \
+ if(blobdup(&dest->var, source->var)) \
+ return FALSE;
+
+static CURLcode blobdup(struct curl_blob **dest,
+ struct curl_blob *src)
+{
+ DEBUGASSERT(dest);
+ DEBUGASSERT(!*dest);
+ if(src) {
+ /* only if there's data to dupe! */
+ struct curl_blob *d;
+ d = malloc(sizeof(struct curl_blob) + src->len);
+ if(!d)
+ return CURLE_OUT_OF_MEMORY;
+ d->len = src->len;
+ /* Always duplicate because the connection may survive longer than the
+ handle that passed in the blob. */
+ d->flags = CURL_BLOB_COPY;
+ d->data = (void *)((char *)d + sizeof(struct curl_blob));
+ memcpy(d->data, src->data, src->len);
+ *dest = d;
+ }
+ return CURLE_OK;
+}
+
+/* returns TRUE if the blobs are identical */
+static bool blobcmp(struct curl_blob *first, struct curl_blob *second)
+{
+ if(!first && !second) /* both are NULL */
+ return TRUE;
+ if(!first || !second) /* one is NULL */
+ return FALSE;
+ if(first->len != second->len) /* different sizes */
+ return FALSE;
+ return !memcmp(first->data, second->data, first->len); /* same data */
+}
+
bool
-Curl_ssl_config_matches(struct ssl_primary_config* data,
- struct ssl_primary_config* needle)
+Curl_ssl_config_matches(struct ssl_primary_config *data,
+ struct ssl_primary_config *needle)
{
if((data->version == needle->version) &&
(data->version_max == needle->version_max) &&
(data->verifypeer == needle->verifypeer) &&
(data->verifyhost == needle->verifyhost) &&
(data->verifystatus == needle->verifystatus) &&
+ blobcmp(data->cert_blob, needle->cert_blob) &&
Curl_safe_strcasecompare(data->CApath, needle->CApath) &&
Curl_safe_strcasecompare(data->CAfile, needle->CAfile) &&
Curl_safe_strcasecompare(data->clientcert, needle->clientcert) &&
@@ -98,6 +138,7 @@ Curl_ssl_config_matches(struct ssl_primary_config* data,
Curl_safe_strcasecompare(data->egdsocket, needle->egdsocket) &&
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
+ Curl_safe_strcasecompare(data->curves, needle->curves) &&
Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
return TRUE;
@@ -115,6 +156,7 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
dest->verifystatus = source->verifystatus;
dest->sessionid = source->sessionid;
+ CLONE_BLOB(cert_blob);
CLONE_STRING(CApath);
CLONE_STRING(CAfile);
CLONE_STRING(clientcert);
@@ -123,11 +165,12 @@ Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
CLONE_STRING(cipher_list);
CLONE_STRING(cipher_list13);
CLONE_STRING(pinned_key);
+ CLONE_STRING(curves);
return TRUE;
}
-void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc)
+void Curl_free_primary_ssl_config(struct ssl_primary_config *sslc)
{
Curl_safefree(sslc->CApath);
Curl_safefree(sslc->CAfile);
@@ -137,6 +180,8 @@ void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc)
Curl_safefree(sslc->cipher_list);
Curl_safefree(sslc->cipher_list13);
Curl_safefree(sslc->pinned_key);
+ Curl_safefree(sslc->cert_blob);
+ Curl_safefree(sslc->curves);
}
#ifdef USE_SSL
@@ -174,6 +219,9 @@ int Curl_ssl_init(void)
return Curl_ssl->init();
}
+#if defined(CURL_WITH_MULTI_SSL)
+static const struct Curl_ssl Curl_ssl_multi;
+#endif
/* Global cleanup */
void Curl_ssl_cleanup(void)
@@ -181,6 +229,9 @@ void Curl_ssl_cleanup(void)
if(init_ssl) {
/* only cleanup if we did a previous init */
Curl_ssl->cleanup();
+#if defined(CURL_WITH_MULTI_SSL)
+ Curl_ssl = &Curl_ssl_multi;
+#endif
init_ssl = FALSE;
}
}
@@ -209,6 +260,7 @@ static bool ssl_prefs_check(struct Curl_easy *data)
return TRUE;
}
+#ifndef CURL_DISABLE_PROXY
static CURLcode
ssl_connect_init_proxy(struct connectdata *conn, int sockindex)
{
@@ -232,17 +284,20 @@ ssl_connect_init_proxy(struct connectdata *conn, int sockindex)
}
return CURLE_OK;
}
+#endif
CURLcode
Curl_ssl_connect(struct connectdata *conn, int sockindex)
{
CURLcode result;
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.proxy_ssl_connected[sockindex]) {
result = ssl_connect_init_proxy(conn, sockindex);
if(result)
return result;
}
+#endif
if(!ssl_prefs_check(conn->data))
return CURLE_SSL_CONNECT_ERROR;
@@ -264,12 +319,13 @@ Curl_ssl_connect_nonblocking(struct connectdata *conn, int sockindex,
bool *done)
{
CURLcode result;
+#ifndef CURL_DISABLE_PROXY
if(conn->bits.proxy_ssl_connected[sockindex]) {
result = ssl_connect_init_proxy(conn, sockindex);
if(result)
return result;
}
-
+#endif
if(!ssl_prefs_check(conn->data))
return CURLE_SSL_CONNECT_ERROR;
@@ -309,19 +365,27 @@ bool Curl_ssl_getsessionid(struct connectdata *conn,
size_t *idsize, /* set 0 if unknown */
int sockindex)
{
- struct curl_ssl_session *check;
+ struct Curl_ssl_session *check;
struct Curl_easy *data = conn->data;
size_t i;
long *general_age;
bool no_match = TRUE;
+#ifndef CURL_DISABLE_PROXY
const bool isProxy = CONNECT_PROXY_SSL();
struct ssl_primary_config * const ssl_config = isProxy ?
&conn->proxy_ssl_config :
&conn->ssl_config;
- const char * const name = isProxy ? conn->http_proxy.host.name :
- conn->host.name;
+ const char * const name = isProxy ?
+ conn->http_proxy.host.name : conn->host.name;
int port = isProxy ? (int)conn->port : conn->remote_port;
+#else
+ /* no proxy support */
+ struct ssl_primary_config * const ssl_config = &conn->ssl_config;
+ const char * const name = conn->host.name;
+ int port = conn->remote_port;
+ (void)sockindex;
+#endif
*ssl_sessionid = NULL;
DEBUGASSERT(SSL_SET_OPTION(primary.sessionid));
@@ -368,7 +432,7 @@ bool Curl_ssl_getsessionid(struct connectdata *conn,
/*
* Kill a single session ID entry in the cache.
*/
-void Curl_ssl_kill_session(struct curl_ssl_session *session)
+void Curl_ssl_kill_session(struct Curl_ssl_session *session)
{
if(session->sessionid) {
/* defensive check */
@@ -395,7 +459,7 @@ void Curl_ssl_delsessionid(struct connectdata *conn, void *ssl_sessionid)
struct Curl_easy *data = conn->data;
for(i = 0; i < data->set.general_ssl.max_ssl_sessions; i++) {
- struct curl_ssl_session *check = &data->state.session[i];
+ struct Curl_ssl_session *check = &data->state.session[i];
if(check->sessionid == ssl_sessionid) {
Curl_ssl_kill_session(check);
@@ -417,20 +481,29 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
{
size_t i;
struct Curl_easy *data = conn->data; /* the mother of all structs */
- struct curl_ssl_session *store = &data->state.session[0];
+ struct Curl_ssl_session *store = &data->state.session[0];
long oldest_age = data->state.session[0].age; /* zero if unused */
char *clone_host;
char *clone_conn_to_host;
int conn_to_port;
long *general_age;
+#ifndef CURL_DISABLE_PROXY
const bool isProxy = CONNECT_PROXY_SSL();
struct ssl_primary_config * const ssl_config = isProxy ?
&conn->proxy_ssl_config :
&conn->ssl_config;
-
+ const char *hostname = isProxy ? conn->http_proxy.host.name :
+ conn->host.name;
+#else
+ /* proxy support disabled */
+ const bool isProxy = FALSE;
+ struct ssl_primary_config * const ssl_config = &conn->ssl_config;
+ const char *hostname = conn->host.name;
+ (void)sockindex;
+#endif
DEBUGASSERT(SSL_SET_OPTION(primary.sessionid));
- clone_host = strdup(isProxy ? conn->http_proxy.host.name : conn->host.name);
+ clone_host = strdup(hostname);
if(!clone_host)
return CURLE_OUT_OF_MEMORY; /* bail out */
@@ -489,6 +562,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
store->scheme = conn->handler->scheme;
if(!Curl_clone_primary_ssl_config(ssl_config, &store->ssl_config)) {
+ Curl_free_primary_ssl_config(&store->ssl_config);
store->sessionid = NULL; /* let caller free sessionid */
free(clone_host);
free(clone_conn_to_host);
@@ -516,8 +590,8 @@ void Curl_ssl_close_all(struct Curl_easy *data)
}
#if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
- defined(USE_SECTRANSP) || defined(USE_POLARSSL) || defined(USE_NSS) || \
- defined(USE_MBEDTLS) || defined(USE_WOLFSSL)
+ defined(USE_SECTRANSP) || defined(USE_NSS) || \
+ defined(USE_MBEDTLS) || defined(USE_WOLFSSL) || defined(USE_BEARSSL)
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks)
{
struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
@@ -550,6 +624,7 @@ void Curl_ssl_close(struct connectdata *conn, int sockindex)
{
DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
Curl_ssl->close_one(conn, sockindex);
+ conn->ssl[sockindex].state = ssl_connection_none;
}
CURLcode Curl_ssl_shutdown(struct connectdata *conn, int sockindex)
@@ -592,13 +667,13 @@ struct curl_slist *Curl_ssl_engines_list(struct Curl_easy *data)
*/
CURLcode Curl_ssl_initsessions(struct Curl_easy *data, size_t amount)
{
- struct curl_ssl_session *session;
+ struct Curl_ssl_session *session;
if(data->state.session)
/* this is just a precaution to prevent multiple inits */
return CURLE_OK;
- session = calloc(amount, sizeof(struct curl_ssl_session));
+ session = calloc(amount, sizeof(struct Curl_ssl_session));
if(!session)
return CURLE_OUT_OF_MEMORY;
@@ -677,7 +752,7 @@ CURLcode Curl_ssl_init_certinfo(struct Curl_easy *data, int num)
}
/*
- * 'value' is NOT a zero terminated string
+ * 'value' is NOT a null-terminated string
*/
CURLcode Curl_ssl_push_certinfo_len(struct Curl_easy *data,
int certnum,
@@ -699,10 +774,10 @@ CURLcode Curl_ssl_push_certinfo_len(struct Curl_easy *data,
/* sprintf the label and colon */
msnprintf(output, outlen, "%s:", label);
- /* memcpy the value (it might not be zero terminated) */
+ /* memcpy the value (it might not be null-terminated) */
memcpy(&output[labellen + 1], value, valuelen);
- /* zero terminate the output */
+ /* null-terminate the output */
output[labellen + 1 + valuelen] = 0;
nl = Curl_slist_append_nodup(ci->certinfo[certnum], output);
@@ -1077,7 +1152,7 @@ bool Curl_none_false_start(void)
CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
unsigned char *md5sum, size_t md5len UNUSED_PARAM)
{
- MD5_context *MD5pw;
+ struct MD5_context *MD5pw;
(void)md5len;
@@ -1183,12 +1258,12 @@ const struct Curl_ssl *Curl_ssl =
&Curl_ssl_nss;
#elif defined(USE_OPENSSL)
&Curl_ssl_openssl;
-#elif defined(USE_POLARSSL)
- &Curl_ssl_polarssl;
#elif defined(USE_SCHANNEL)
&Curl_ssl_schannel;
#elif defined(USE_MESALINK)
&Curl_ssl_mesalink;
+#elif defined(USE_BEARSSL)
+ &Curl_ssl_bearssl;
#else
#error "Missing struct Curl_ssl for selected SSL backend"
#endif
@@ -1215,15 +1290,15 @@ static const struct Curl_ssl *available_backends[] = {
#if defined(USE_OPENSSL)
&Curl_ssl_openssl,
#endif
-#if defined(USE_POLARSSL)
- &Curl_ssl_polarssl,
-#endif
#if defined(USE_SCHANNEL)
&Curl_ssl_schannel,
#endif
#if defined(USE_MESALINK)
&Curl_ssl_mesalink,
#endif
+#if defined(USE_BEARSSL)
+ &Curl_ssl_bearssl,
+#endif
NULL
};
@@ -1231,7 +1306,7 @@ static size_t Curl_multissl_version(char *buffer, size_t size)
{
static const struct Curl_ssl *selected;
static char backends[200];
- static size_t total;
+ static size_t backends_len;
const struct Curl_ssl *current;
current = Curl_ssl == &Curl_ssl_multi ? available_backends[0] : Curl_ssl;
@@ -1243,27 +1318,32 @@ static size_t Curl_multissl_version(char *buffer, size_t size)
selected = current;
- for(i = 0; available_backends[i] && p < (end - 4); i++) {
- if(i)
- *(p++) = ' ';
- if(selected != available_backends[i])
- *(p++) = '(';
- p += available_backends[i]->version(p, end - p - 2);
- if(selected != available_backends[i])
- *(p++) = ')';
+ backends[0] = '\0';
+
+ for(i = 0; available_backends[i]; ++i) {
+ char vb[200];
+ bool paren = (selected != available_backends[i]);
+
+ if(available_backends[i]->version(vb, sizeof(vb))) {
+ p += msnprintf(p, end - p, "%s%s%s%s", (p != backends ? " " : ""),
+ (paren ? "(" : ""), vb, (paren ? ")" : ""));
+ }
}
- *p = '\0';
- total = p - backends;
+
+ backends_len = p - backends;
}
- if(size > total)
- memcpy(buffer, backends, total + 1);
- else {
- memcpy(buffer, backends, size - 1);
+ if(!size)
+ return 0;
+
+ if(size <= backends_len) {
+ strncpy(buffer, backends, size - 1);
buffer[size - 1] = '\0';
+ return size - 1;
}
- return CURLMIN(size - 1, total);
+ strcpy(buffer, backends);
+ return backends_len;
}
static int multissl_init(const struct Curl_ssl *backend)
diff --git a/lib/vtls/vtls.h b/lib/vtls/vtls.h
index 61d8416c2..b86bdbc1d 100644
--- a/lib/vtls/vtls.h
+++ b/lib/vtls/vtls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -102,23 +102,17 @@ CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
#include "gtls.h" /* GnuTLS versions */
#include "nssg.h" /* NSS versions */
#include "gskit.h" /* Global Secure ToolKit versions */
-#include "polarssl.h" /* PolarSSL versions */
#include "wolfssl.h" /* wolfSSL versions */
#include "schannel.h" /* Schannel SSPI version */
#include "sectransp.h" /* SecureTransport (Darwin) version */
#include "mbedtls.h" /* mbedTLS versions */
#include "mesalink.h" /* MesaLink versions */
+#include "bearssl.h" /* BearSSL versions */
#ifndef MAX_PINNED_PUBKEY_SIZE
#define MAX_PINNED_PUBKEY_SIZE 1048576 /* 1MB */
#endif
-#ifndef MD5_DIGEST_LENGTH
-#ifndef LIBWOLFSSL_VERSION_HEX /* because WolfSSL borks this */
-#define MD5_DIGEST_LENGTH 16 /* fixed size */
-#endif
-#endif
-
#ifndef CURL_SHA256_DIGEST_LENGTH
#define CURL_SHA256_DIGEST_LENGTH 32 /* fixed size */
#endif
@@ -129,20 +123,41 @@ CURLcode Curl_none_md5sum(unsigned char *input, size_t inputlen,
/* set of helper macros for the backends to access the correct fields. For the
proxy or for the remote host - to properly support HTTPS proxy */
+#ifndef CURL_DISABLE_PROXY
+#define SSL_IS_PROXY() \
+ (CURLPROXY_HTTPS == conn->http_proxy.proxytype && \
+ ssl_connection_complete != \
+ conn->proxy_ssl[conn->sock[SECONDARYSOCKET] == \
+ CURL_SOCKET_BAD ? FIRSTSOCKET : SECONDARYSOCKET].state)
+#define SSL_SET_OPTION(var) \
+ (SSL_IS_PROXY() ? data->set.proxy_ssl.var : data->set.ssl.var)
+#define SSL_SET_OPTION_LVALUE(var) \
+ (*(SSL_IS_PROXY() ? &data->set.proxy_ssl.var : &data->set.ssl.var))
+#define SSL_CONN_CONFIG(var) \
+ (SSL_IS_PROXY() ? conn->proxy_ssl_config.var : conn->ssl_config.var)
+#define SSL_HOST_NAME() \
+ (SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name)
+#define SSL_HOST_DISPNAME() \
+ (SSL_IS_PROXY() ? conn->http_proxy.host.dispname : conn->host.dispname)
+#define SSL_PINNED_PUB_KEY() (SSL_IS_PROXY() \
+ ? data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] \
+ : data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG])
+#else
+#define SSL_IS_PROXY() FALSE
+#define SSL_SET_OPTION(var) data->set.ssl.var
+#define SSL_SET_OPTION_LVALUE(var) data->set.ssl.var
+#define SSL_CONN_CONFIG(var) conn->ssl_config.var
+#define SSL_HOST_NAME() conn->host.name
+#define SSL_HOST_DISPNAME() conn->host.dispname
+#define SSL_PINNED_PUB_KEY() \
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG]
+#endif
-#define SSL_IS_PROXY() (CURLPROXY_HTTPS == conn->http_proxy.proxytype && \
- ssl_connection_complete != conn->proxy_ssl[conn->sock[SECONDARYSOCKET] == \
- CURL_SOCKET_BAD ? FIRSTSOCKET : SECONDARYSOCKET].state)
-#define SSL_SET_OPTION(var) (SSL_IS_PROXY() ? data->set.proxy_ssl.var : \
- data->set.ssl.var)
-#define SSL_CONN_CONFIG(var) (SSL_IS_PROXY() ? \
- conn->proxy_ssl_config.var : conn->ssl_config.var)
-
-bool Curl_ssl_config_matches(struct ssl_primary_config* data,
- struct ssl_primary_config* needle);
+bool Curl_ssl_config_matches(struct ssl_primary_config *data,
+ struct ssl_primary_config *needle);
bool Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
struct ssl_primary_config *dest);
-void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc);
+void Curl_free_primary_ssl_config(struct ssl_primary_config *sslc);
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks);
int Curl_ssl_backend(void);
@@ -220,7 +235,7 @@ CURLcode Curl_ssl_addsessionid(struct connectdata *conn,
* take sessionid object ownership from sessionid cache
* (e.g. decrement refcount).
*/
-void Curl_ssl_kill_session(struct curl_ssl_session *session);
+void Curl_ssl_kill_session(struct Curl_ssl_session *session);
/* delete a session from the cache
* Sessionid mutex must be locked (see Curl_ssl_sessionid_lock).
* This will call engine-specific curlssl_session_free function, which must
@@ -262,7 +277,6 @@ bool Curl_ssl_false_start(void);
#define Curl_ssl_send(a,b,c,d,e) -1
#define Curl_ssl_recv(a,b,c,d,e) -1
#define Curl_ssl_initsessions(x,y) CURLE_OK
-#define Curl_ssl_version(x,y) 0
#define Curl_ssl_data_pending(x,y) 0
#define Curl_ssl_check_cxn(x) 0
#define Curl_ssl_free_certinfo(x) Curl_nop_stmt
diff --git a/lib/vtls/wolfssl.c b/lib/vtls/wolfssl.c
index 890bcbf79..a299b99d1 100644
--- a/lib/vtls/wolfssl.c
+++ b/lib/vtls/wolfssl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -63,6 +63,7 @@
#include "sendf.h"
#include "inet_pton.h"
#include "vtls.h"
+#include "keylog.h"
#include "parsedate.h"
#include "connect.h" /* for the connect timeout */
#include "select.h"
@@ -96,11 +97,109 @@ struct ssl_backend_data {
SSL* handle;
};
-#define BACKEND connssl->backend
-
static Curl_recv wolfssl_recv;
static Curl_send wolfssl_send;
+#ifdef OPENSSL_EXTRA
+/*
+ * Availability note:
+ * The TLS 1.3 secret callback (wolfSSL_set_tls13_secret_cb) was added in
+ * WolfSSL 4.4.0, but requires the -DHAVE_SECRET_CALLBACK build option. If that
+ * option is not set, then TLS 1.3 will not be logged.
+ * For TLS 1.2 and before, we use wolfSSL_get_keys().
+ * SSL_get_client_random and wolfSSL_get_keys require OPENSSL_EXTRA
+ * (--enable-opensslextra or --enable-all).
+ */
+#if defined(HAVE_SECRET_CALLBACK) && defined(WOLFSSL_TLS13)
+static int
+wolfssl_tls13_secret_callback(SSL *ssl, int id, const unsigned char *secret,
+ int secretSz, void *ctx)
+{
+ const char *label;
+ unsigned char client_random[SSL3_RANDOM_SIZE];
+ (void)ctx;
+
+ if(!ssl || !Curl_tls_keylog_enabled()) {
+ return 0;
+ }
+
+ switch(id) {
+ case CLIENT_EARLY_TRAFFIC_SECRET:
+ label = "CLIENT_EARLY_TRAFFIC_SECRET";
+ break;
+ case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
+ label = "CLIENT_HANDSHAKE_TRAFFIC_SECRET";
+ break;
+ case SERVER_HANDSHAKE_TRAFFIC_SECRET:
+ label = "SERVER_HANDSHAKE_TRAFFIC_SECRET";
+ break;
+ case CLIENT_TRAFFIC_SECRET:
+ label = "CLIENT_TRAFFIC_SECRET_0";
+ break;
+ case SERVER_TRAFFIC_SECRET:
+ label = "SERVER_TRAFFIC_SECRET_0";
+ break;
+ case EARLY_EXPORTER_SECRET:
+ label = "EARLY_EXPORTER_SECRET";
+ break;
+ case EXPORTER_SECRET:
+ label = "EXPORTER_SECRET";
+ break;
+ default:
+ return 0;
+ }
+
+ if(SSL_get_client_random(ssl, client_random, SSL3_RANDOM_SIZE) == 0) {
+ /* Should never happen as wolfSSL_KeepArrays() was called before. */
+ return 0;
+ }
+
+ Curl_tls_keylog_write(label, client_random, secret, secretSz);
+ return 0;
+}
+#endif /* defined(HAVE_SECRET_CALLBACK) && defined(WOLFSSL_TLS13) */
+
+static void
+wolfssl_log_tls12_secret(SSL *ssl)
+{
+ unsigned char *ms, *sr, *cr;
+ unsigned int msLen, srLen, crLen, i, x = 0;
+
+#if LIBWOLFSSL_VERSION_HEX >= 0x0300d000 /* >= 3.13.0 */
+ /* wolfSSL_GetVersion is available since 3.13, we use it instead of
+ * SSL_version since the latter relies on OPENSSL_ALL (--enable-opensslall or
+ * --enable-all). Failing to perform this check could result in an unusable
+ * key log line when TLS 1.3 is actually negotiated. */
+ switch(wolfSSL_GetVersion(ssl)) {
+ case WOLFSSL_SSLV3:
+ case WOLFSSL_TLSV1:
+ case WOLFSSL_TLSV1_1:
+ case WOLFSSL_TLSV1_2:
+ break;
+ default:
+ /* TLS 1.3 does not use this mechanism, the "master secret" returned below
+ * is not directly usable. */
+ return;
+ }
+#endif
+
+ if(SSL_get_keys(ssl, &ms, &msLen, &sr, &srLen, &cr, &crLen) != SSL_SUCCESS) {
+ return;
+ }
+
+ /* Check for a missing master secret and skip logging. That can happen if
+ * curl rejects the server certificate and aborts the handshake.
+ */
+ for(i = 0; i < msLen; i++) {
+ x |= ms[i];
+ }
+ if(x == 0) {
+ return;
+ }
+
+ Curl_tls_keylog_write("CLIENT_RANDOM", cr, ms, msLen);
+}
+#endif /* OPENSSL_EXTRA */
static int do_file_type(const char *type)
{
@@ -123,7 +222,8 @@ wolfssl_connect_step1(struct connectdata *conn,
{
char *ciphers;
struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
SSL_METHOD* req_method = NULL;
curl_socket_t sockfd = conn->sock[sockindex];
#ifdef HAVE_SNI
@@ -203,11 +303,11 @@ wolfssl_connect_step1(struct connectdata *conn,
return CURLE_OUT_OF_MEMORY;
}
- if(BACKEND->ctx)
- SSL_CTX_free(BACKEND->ctx);
- BACKEND->ctx = SSL_CTX_new(req_method);
+ if(backend->ctx)
+ SSL_CTX_free(backend->ctx);
+ backend->ctx = SSL_CTX_new(req_method);
- if(!BACKEND->ctx) {
+ if(!backend->ctx) {
failf(data, "SSL: couldn't create a context!");
return CURLE_OUT_OF_MEMORY;
}
@@ -222,11 +322,11 @@ wolfssl_connect_step1(struct connectdata *conn,
* defaults to TLS 1.1) so we have this short circuit evaluation to find
* the minimum supported TLS version.
*/
- if((wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1) != 1) &&
- (wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_1) != 1) &&
- (wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_2) != 1)
+ if((wolfSSL_CTX_SetMinVersion(backend->ctx, WOLFSSL_TLSV1) != 1) &&
+ (wolfSSL_CTX_SetMinVersion(backend->ctx, WOLFSSL_TLSV1_1) != 1) &&
+ (wolfSSL_CTX_SetMinVersion(backend->ctx, WOLFSSL_TLSV1_2) != 1)
#ifdef WOLFSSL_TLS13
- && (wolfSSL_CTX_SetMinVersion(BACKEND->ctx, WOLFSSL_TLSV1_3) != 1)
+ && (wolfSSL_CTX_SetMinVersion(backend->ctx, WOLFSSL_TLSV1_3) != 1)
#endif
) {
failf(data, "SSL: couldn't set the minimum protocol version");
@@ -238,7 +338,7 @@ wolfssl_connect_step1(struct connectdata *conn,
ciphers = SSL_CONN_CONFIG(cipher_list);
if(ciphers) {
- if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
+ if(!SSL_CTX_set_cipher_list(backend->ctx, ciphers)) {
failf(data, "failed setting cipher list: %s", ciphers);
return CURLE_SSL_CIPHER;
}
@@ -248,13 +348,13 @@ wolfssl_connect_step1(struct connectdata *conn,
#ifndef NO_FILESYSTEM
/* load trusted cacert */
if(SSL_CONN_CONFIG(CAfile)) {
- if(1 != SSL_CTX_load_verify_locations(BACKEND->ctx,
+ if(1 != SSL_CTX_load_verify_locations(backend->ctx,
SSL_CONN_CONFIG(CAfile),
SSL_CONN_CONFIG(CApath))) {
if(SSL_CONN_CONFIG(verifypeer)) {
/* Fail if we insist on successfully verifying the server. */
- failf(data, "error setting certificate verify locations:\n"
- " CAfile: %s\n CApath: %s",
+ failf(data, "error setting certificate verify locations:"
+ " CAfile: %s CApath: %s",
SSL_CONN_CONFIG(CAfile)?
SSL_CONN_CONFIG(CAfile): "none",
SSL_CONN_CONFIG(CApath)?
@@ -272,28 +372,26 @@ wolfssl_connect_step1(struct connectdata *conn,
/* Everything is fine. */
infof(data, "successfully set certificate verify locations:\n");
}
- infof(data,
- " CAfile: %s\n"
- " CApath: %s\n",
- SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile):
- "none",
- SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath):
- "none");
+ infof(data, " CAfile: %s\n",
+ SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile) : "none");
+ infof(data, " CApath: %s\n",
+ SSL_CONN_CONFIG(CApath) ? SSL_CONN_CONFIG(CApath) : "none");
}
/* Load the client certificate, and private key */
- if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
+ if(SSL_SET_OPTION(primary.clientcert) && SSL_SET_OPTION(key)) {
int file_type = do_file_type(SSL_SET_OPTION(cert_type));
- if(SSL_CTX_use_certificate_file(BACKEND->ctx, SSL_SET_OPTION(cert),
- file_type) != 1) {
+ if(SSL_CTX_use_certificate_file(backend->ctx,
+ SSL_SET_OPTION(primary.clientcert),
+ file_type) != 1) {
failf(data, "unable to use client certificate (no key or wrong pass"
" phrase?)");
return CURLE_SSL_CONNECT_ERROR;
}
file_type = do_file_type(SSL_SET_OPTION(key_type));
- if(SSL_CTX_use_PrivateKey_file(BACKEND->ctx, SSL_SET_OPTION(key),
+ if(SSL_CTX_use_PrivateKey_file(backend->ctx, SSL_SET_OPTION(key),
file_type) != 1) {
failf(data, "unable to set private key");
return CURLE_SSL_CONNECT_ERROR;
@@ -305,7 +403,7 @@ wolfssl_connect_step1(struct connectdata *conn,
* fail to connect if the verification fails, or if it should continue
* anyway. In the latter case the result of the verification is checked with
* SSL_get_verify_result() below. */
- SSL_CTX_set_verify(BACKEND->ctx,
+ SSL_CTX_set_verify(backend->ctx,
SSL_CONN_CONFIG(verifypeer)?SSL_VERIFY_PEER:
SSL_VERIFY_NONE,
NULL);
@@ -316,15 +414,19 @@ wolfssl_connect_step1(struct connectdata *conn,
#ifdef ENABLE_IPV6
struct in6_addr addr6;
#endif
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
+#else
+ const char * const hostname = conn->host.name;
+#endif
size_t hostname_len = strlen(hostname);
if((hostname_len < USHRT_MAX) &&
(0 == Curl_inet_pton(AF_INET, hostname, &addr4)) &&
#ifdef ENABLE_IPV6
(0 == Curl_inet_pton(AF_INET6, hostname, &addr6)) &&
#endif
- (wolfSSL_CTX_UseSNI(BACKEND->ctx, WOLFSSL_SNI_HOST_NAME, hostname,
+ (wolfSSL_CTX_UseSNI(backend->ctx, WOLFSSL_SNI_HOST_NAME, hostname,
(unsigned short)hostname_len) != 1)) {
infof(data, "WARNING: failed to configure server name indication (SNI) "
"TLS extension\n");
@@ -334,7 +436,7 @@ wolfssl_connect_step1(struct connectdata *conn,
/* give application a chance to interfere with SSL set up. */
if(data->set.ssl.fsslctx) {
- CURLcode result = (*data->set.ssl.fsslctx)(data, BACKEND->ctx,
+ CURLcode result = (*data->set.ssl.fsslctx)(data, backend->ctx,
data->set.ssl.fsslctxp);
if(result) {
failf(data, "error signaled by ssl ctx callback");
@@ -352,10 +454,10 @@ wolfssl_connect_step1(struct connectdata *conn,
#endif
/* Let's make an SSL structure */
- if(BACKEND->handle)
- SSL_free(BACKEND->handle);
- BACKEND->handle = SSL_new(BACKEND->ctx);
- if(!BACKEND->handle) {
+ if(backend->handle)
+ SSL_free(backend->handle);
+ backend->handle = SSL_new(backend->ctx);
+ if(!backend->handle) {
failf(data, "SSL: couldn't create a context (handle)!");
return CURLE_OUT_OF_MEMORY;
}
@@ -378,7 +480,7 @@ wolfssl_connect_step1(struct connectdata *conn,
strcpy(protocols + strlen(protocols), ALPN_HTTP_1_1);
infof(data, "ALPN, offering %s\n", ALPN_HTTP_1_1);
- if(wolfSSL_UseALPN(BACKEND->handle, protocols,
+ if(wolfSSL_UseALPN(backend->handle, protocols,
(unsigned)strlen(protocols),
WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) != SSL_SUCCESS) {
failf(data, "SSL: failed setting ALPN protocols");
@@ -387,6 +489,17 @@ wolfssl_connect_step1(struct connectdata *conn,
}
#endif /* HAVE_ALPN */
+#ifdef OPENSSL_EXTRA
+ if(Curl_tls_keylog_enabled()) {
+ /* Ensure the Client Random is preserved. */
+ wolfSSL_KeepArrays(backend->handle);
+#if defined(HAVE_SECRET_CALLBACK) && defined(WOLFSSL_TLS13)
+ wolfSSL_set_tls13_secret_cb(backend->handle,
+ wolfssl_tls13_secret_callback, NULL);
+#endif
+ }
+#endif /* OPENSSL_EXTRA */
+
/* Check if there's a cached ID we can/should use here! */
if(SSL_SET_OPTION(primary.sessionid)) {
void *ssl_sessionid = NULL;
@@ -394,11 +507,11 @@ wolfssl_connect_step1(struct connectdata *conn,
Curl_ssl_sessionid_lock(conn);
if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, NULL, sockindex)) {
/* we got a session id, use it! */
- if(!SSL_set_session(BACKEND->handle, ssl_sessionid)) {
+ if(!SSL_set_session(backend->handle, ssl_sessionid)) {
char error_buffer[WOLFSSL_MAX_ERROR_SZ];
Curl_ssl_sessionid_unlock(conn);
failf(data, "SSL: SSL_set_session failed: %s",
- ERR_error_string(SSL_get_error(BACKEND->handle, 0),
+ ERR_error_string(SSL_get_error(backend->handle, 0),
error_buffer));
return CURLE_SSL_CONNECT_ERROR;
}
@@ -409,7 +522,7 @@ wolfssl_connect_step1(struct connectdata *conn,
}
/* pass the raw socket into the SSL layer */
- if(!SSL_set_fd(BACKEND->handle, (int)sockfd)) {
+ if(!SSL_set_fd(backend->handle, (int)sockfd)) {
failf(data, "SSL: SSL_set_fd failed");
return CURLE_SSL_CONNECT_ERROR;
}
@@ -425,29 +538,62 @@ wolfssl_connect_step2(struct connectdata *conn,
{
int ret = -1;
struct Curl_easy *data = conn->data;
- struct ssl_connect_data* connssl = &conn->ssl[sockindex];
+ struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
+#ifndef CURL_DISABLE_PROXY
const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
conn->host.name;
const char * const dispname = SSL_IS_PROXY() ?
conn->http_proxy.host.dispname : conn->host.dispname;
const char * const pinnedpubkey = SSL_IS_PROXY() ?
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
- data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY] :
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+#else
+ const char * const hostname = conn->host.name;
+ const char * const dispname = conn->host.dispname;
+ const char * const pinnedpubkey =
+ data->set.str[STRING_SSL_PINNEDPUBLICKEY_ORIG];
+#endif
conn->recv[sockindex] = wolfssl_recv;
conn->send[sockindex] = wolfssl_send;
/* Enable RFC2818 checks */
if(SSL_CONN_CONFIG(verifyhost)) {
- ret = wolfSSL_check_domain_name(BACKEND->handle, hostname);
+ ret = wolfSSL_check_domain_name(backend->handle, hostname);
if(ret == SSL_FAILURE)
return CURLE_OUT_OF_MEMORY;
}
- ret = SSL_connect(BACKEND->handle);
+ ret = SSL_connect(backend->handle);
+
+#ifdef OPENSSL_EXTRA
+ if(Curl_tls_keylog_enabled()) {
+ /* If key logging is enabled, wait for the handshake to complete and then
+ * proceed with logging secrets (for TLS 1.2 or older).
+ *
+ * During the handshake (ret==-1), wolfSSL_want_read() is true as it waits
+ * for the server response. At that point the master secret is not yet
+ * available, so we must not try to read it.
+ * To log the secret on completion with a handshake failure, detect
+ * completion via the observation that there is nothing to read or write.
+ * Note that OpenSSL SSL_want_read() is always true here. If wolfSSL ever
+ * changes, the worst case is that no key is logged on error.
+ */
+ if(ret == SSL_SUCCESS ||
+ (!wolfSSL_want_read(backend->handle) &&
+ !wolfSSL_want_write(backend->handle))) {
+ wolfssl_log_tls12_secret(backend->handle);
+ /* Client Random and master secrets are no longer needed, erase these.
+ * Ignored while the handshake is still in progress. */
+ wolfSSL_FreeArrays(backend->handle);
+ }
+ }
+#endif /* OPENSSL_EXTRA */
+
if(ret != 1) {
char error_buffer[WOLFSSL_MAX_ERROR_SZ];
- int detail = SSL_get_error(BACKEND->handle, ret);
+ int detail = SSL_get_error(backend->handle, ret);
if(SSL_ERROR_WANT_READ == detail) {
connssl->connecting_state = ssl_connect_2_reading;
@@ -512,11 +658,11 @@ wolfssl_connect_step2(struct connectdata *conn,
X509 *x509;
const char *x509_der;
int x509_der_len;
- curl_X509certificate x509_parsed;
- curl_asn1Element *pubkey;
+ struct Curl_X509certificate x509_parsed;
+ struct Curl_asn1Element *pubkey;
CURLcode result;
- x509 = SSL_get_peer_certificate(BACKEND->handle);
+ x509 = SSL_get_peer_certificate(backend->handle);
if(!x509) {
failf(data, "SSL: failed retrieving server certificate");
return CURLE_SSL_PINNEDPUBKEYNOTMATCH;
@@ -558,7 +704,7 @@ wolfssl_connect_step2(struct connectdata *conn,
char *protocol = NULL;
unsigned short protocol_len = 0;
- rc = wolfSSL_ALPN_GetProtocol(BACKEND->handle, &protocol, &protocol_len);
+ rc = wolfSSL_ALPN_GetProtocol(backend->handle, &protocol, &protocol_len);
if(rc == SSL_SUCCESS) {
infof(data, "ALPN, server accepted to use %.*s\n", protocol_len,
@@ -592,8 +738,8 @@ wolfssl_connect_step2(struct connectdata *conn,
connssl->connecting_state = ssl_connect_3;
#if (LIBWOLFSSL_VERSION_HEX >= 0x03009010)
infof(data, "SSL connection using %s / %s\n",
- wolfSSL_get_version(BACKEND->handle),
- wolfSSL_get_cipher_name(BACKEND->handle));
+ wolfSSL_get_version(backend->handle),
+ wolfSSL_get_cipher_name(backend->handle));
#else
infof(data, "SSL connected\n");
#endif
@@ -609,6 +755,7 @@ wolfssl_connect_step3(struct connectdata *conn,
CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
DEBUGASSERT(ssl_connect_3 == connssl->connecting_state);
@@ -617,7 +764,7 @@ wolfssl_connect_step3(struct connectdata *conn,
SSL_SESSION *our_ssl_sessionid;
void *old_ssl_sessionid = NULL;
- our_ssl_sessionid = SSL_get_session(BACKEND->handle);
+ our_ssl_sessionid = SSL_get_session(backend->handle);
Curl_ssl_sessionid_lock(conn);
incache = !(Curl_ssl_getsessionid(conn, &old_ssl_sessionid, NULL,
@@ -655,12 +802,13 @@ static ssize_t wolfssl_send(struct connectdata *conn,
CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
char error_buffer[WOLFSSL_MAX_ERROR_SZ];
- int memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
- int rc = SSL_write(BACKEND->handle, mem, memlen);
+ int memlen = (len > (size_t)INT_MAX) ? INT_MAX : (int)len;
+ int rc = SSL_write(backend->handle, mem, memlen);
if(rc < 0) {
- int err = SSL_get_error(BACKEND->handle, rc);
+ int err = SSL_get_error(backend->handle, rc);
switch(err) {
case SSL_ERROR_WANT_READ:
@@ -682,31 +830,33 @@ static ssize_t wolfssl_send(struct connectdata *conn,
static void Curl_wolfssl_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
- if(BACKEND->handle) {
- (void)SSL_shutdown(BACKEND->handle);
- SSL_free(BACKEND->handle);
- BACKEND->handle = NULL;
+ if(backend->handle) {
+ (void)SSL_shutdown(backend->handle);
+ SSL_free(backend->handle);
+ backend->handle = NULL;
}
- if(BACKEND->ctx) {
- SSL_CTX_free(BACKEND->ctx);
- BACKEND->ctx = NULL;
+ if(backend->ctx) {
+ SSL_CTX_free(backend->ctx);
+ backend->ctx = NULL;
}
}
static ssize_t wolfssl_recv(struct connectdata *conn,
- int num,
- char *buf,
- size_t buffersize,
- CURLcode *curlcode)
+ int num,
+ char *buf,
+ size_t buffersize,
+ CURLcode *curlcode)
{
struct ssl_connect_data *connssl = &conn->ssl[num];
+ struct ssl_backend_data *backend = connssl->backend;
char error_buffer[WOLFSSL_MAX_ERROR_SZ];
- int buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
- int nread = SSL_read(BACKEND->handle, buf, buffsize);
+ int buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize;
+ int nread = SSL_read(backend->handle, buf, buffsize);
if(nread < 0) {
- int err = SSL_get_error(BACKEND->handle, nread);
+ int err = SSL_get_error(backend->handle, nread);
switch(err) {
case SSL_ERROR_ZERO_RETURN: /* no more data */
@@ -747,6 +897,9 @@ static size_t Curl_wolfssl_version(char *buffer, size_t size)
static int Curl_wolfssl_init(void)
{
+#ifdef OPENSSL_EXTRA
+ Curl_tls_keylog_open();
+#endif
return (wolfSSL_Init() == SSL_SUCCESS);
}
@@ -754,15 +907,19 @@ static int Curl_wolfssl_init(void)
static void Curl_wolfssl_cleanup(void)
{
wolfSSL_Cleanup();
+#ifdef OPENSSL_EXTRA
+ Curl_tls_keylog_close();
+#endif
}
-static bool Curl_wolfssl_data_pending(const struct connectdata* conn,
- int connindex)
+static bool Curl_wolfssl_data_pending(const struct connectdata *conn,
+ int connindex)
{
const struct ssl_connect_data *connssl = &conn->ssl[connindex];
- if(BACKEND->handle) /* SSL is in use */
- return (0 != SSL_pending(BACKEND->handle)) ? TRUE : FALSE;
+ struct ssl_backend_data *backend = connssl->backend;
+ if(backend->handle) /* SSL is in use */
+ return (0 != SSL_pending(backend->handle)) ? TRUE : FALSE;
else
return FALSE;
}
@@ -776,10 +933,11 @@ static int Curl_wolfssl_shutdown(struct connectdata *conn, int sockindex)
{
int retval = 0;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+ struct ssl_backend_data *backend = connssl->backend;
- if(BACKEND->handle) {
- SSL_free(BACKEND->handle);
- BACKEND->handle = NULL;
+ if(backend->handle) {
+ SSL_free(backend->handle);
+ backend->handle = NULL;
}
return retval;
}
@@ -795,7 +953,6 @@ wolfssl_connect_common(struct connectdata *conn,
struct Curl_easy *data = conn->data;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
curl_socket_t sockfd = conn->sock[sockindex];
- time_t timeout_ms;
int what;
/* check if the connection has already been established */
@@ -806,7 +963,7 @@ wolfssl_connect_common(struct connectdata *conn,
if(ssl_connect_1 == connssl->connecting_state) {
/* Find out how much more time we're allowed */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ const timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* no need to continue if time already is up */
@@ -824,7 +981,7 @@ wolfssl_connect_common(struct connectdata *conn,
ssl_connect_2_writing == connssl->connecting_state) {
/* check allowed time left */
- timeout_ms = Curl_timeleft(data, NULL, TRUE);
+ const timediff_t timeout_ms = Curl_timeleft(data, NULL, TRUE);
if(timeout_ms < 0) {
/* no need to continue if time already is up */
@@ -923,7 +1080,7 @@ static CURLcode Curl_wolfssl_connect(struct connectdata *conn, int sockindex)
static CURLcode Curl_wolfssl_random(struct Curl_easy *data,
unsigned char *entropy, size_t length)
{
- RNG rng;
+ WC_RNG rng;
(void)data;
if(wc_InitRng(&rng))
return CURLE_FAILED_INIT;
@@ -937,11 +1094,11 @@ static CURLcode Curl_wolfssl_random(struct Curl_easy *data,
}
static CURLcode Curl_wolfssl_sha256sum(const unsigned char *tmp, /* input */
- size_t tmplen,
- unsigned char *sha256sum /* output */,
- size_t unused)
+ size_t tmplen,
+ unsigned char *sha256sum /* output */,
+ size_t unused)
{
- Sha256 SHA256pw;
+ wc_Sha256 SHA256pw;
(void)unused;
wc_InitSha256(&SHA256pw);
wc_Sha256Update(&SHA256pw, tmp, (word32)tmplen);
@@ -950,10 +1107,11 @@ static CURLcode Curl_wolfssl_sha256sum(const unsigned char *tmp, /* input */
}
static void *Curl_wolfssl_get_internals(struct ssl_connect_data *connssl,
- CURLINFO info UNUSED_PARAM)
+ CURLINFO info UNUSED_PARAM)
{
+ struct ssl_backend_data *backend = connssl->backend;
(void)info;
- return BACKEND->handle;
+ return backend->handle;
}
const struct Curl_ssl Curl_ssl_wolfssl = {
diff --git a/lib/warnless.h b/lib/warnless.h
index ea4c4395d..ab78f9448 100644
--- a/lib/warnless.h
+++ b/lib/warnless.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -94,19 +94,6 @@ unsigned short curlx_htons(unsigned short usnum);
unsigned short curlx_ntohs(unsigned short usnum);
-#ifndef BUILDING_WARNLESS_C
-# undef FD_ISSET
-# define FD_ISSET(a,b) curlx_FD_ISSET((a),(b))
-# undef FD_SET
-# define FD_SET(a,b) curlx_FD_SET((a),(b))
-# undef FD_ZERO
-# define FD_ZERO(a) curlx_FD_ZERO((a))
-# undef htons
-# define htons(a) curlx_htons((a))
-# undef ntohs
-# define ntohs(a) curlx_ntohs((a))
-#endif
-
#endif /* __INTEL_COMPILER && __unix__ */
#endif /* HEADER_CURL_WARNLESS_H */
diff --git a/lib/wildcard.h b/lib/wildcard.h
index 306c8c99f..f090826fb 100644
--- a/lib/wildcard.h
+++ b/lib/wildcard.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2010 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -39,18 +39,18 @@ typedef enum {
CURLWC_ERROR, /* error cases */
CURLWC_DONE /* if is wildcard->state == CURLWC_DONE wildcard loop
will end */
-} curl_wildcard_states;
+} wildcard_states;
-typedef void (*curl_wildcard_dtor)(void *ptr);
+typedef void (*wildcard_dtor)(void *ptr);
/* struct keeping information about wildcard download process */
struct WildcardData {
- curl_wildcard_states state;
+ wildcard_states state;
char *path; /* path to the directory, where we trying wildcard-match */
char *pattern; /* wildcard pattern */
- struct curl_llist filelist; /* llist with struct Curl_fileinfo */
+ struct Curl_llist filelist; /* llist with struct Curl_fileinfo */
void *protdata; /* pointer to protocol specific temporary data */
- curl_wildcard_dtor dtor;
+ wildcard_dtor dtor;
void *customptr; /* for CURLOPT_CHUNK_DATA pointer */
};
diff --git a/lib/x509asn1.c b/lib/x509asn1.c
index ece5364d8..52747d57d 100644
--- a/lib/x509asn1.c
+++ b/lib/x509asn1.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,7 +44,7 @@
static const char cnOID[] = "2.5.4.3"; /* Common name. */
static const char sanOID[] = "2.5.29.17"; /* Subject alternative name. */
-static const curl_OID OIDtable[] = {
+static const struct Curl_OID OIDtable[] = {
{ "1.2.840.10040.4.1", "dsa" },
{ "1.2.840.10040.4.3", "dsa-with-sha1" },
{ "1.2.840.10045.2.1", "ecPublicKey" },
@@ -103,16 +103,16 @@ static const curl_OID OIDtable[] = {
* Please note there is no pretention here to rewrite a full SSL library.
*/
-static const char *getASN1Element(curl_asn1Element *elem,
+static const char *getASN1Element(struct Curl_asn1Element *elem,
const char *beg, const char *end)
WARN_UNUSED_RESULT;
-static const char *getASN1Element(curl_asn1Element *elem,
+static const char *getASN1Element(struct Curl_asn1Element *elem,
const char *beg, const char *end)
{
unsigned char b;
unsigned long len;
- curl_asn1Element lelem;
+ struct Curl_asn1Element lelem;
/* Get a single ASN.1 element into `elem', parse ASN.1 string at `beg'
ending at `end'.
@@ -176,9 +176,9 @@ static const char *getASN1Element(curl_asn1Element *elem,
* Search the null terminated OID or OID identifier in local table.
* Return the table entry pointer or NULL if not found.
*/
-static const curl_OID * searchOID(const char *oid)
+static const struct Curl_OID *searchOID(const char *oid)
{
- const curl_OID *op;
+ const struct Curl_OID *op;
for(op = OIDtable; op->numoid; op++)
if(!strcmp(op->numoid, oid) || strcasecompare(op->textoid, oid))
return op;
@@ -445,7 +445,7 @@ static const char *OID2str(const char *beg, const char *end, bool symbolic)
buf[buflen] = '\0';
if(symbolic) {
- const curl_OID *op = searchOID(buf);
+ const struct Curl_OID *op = searchOID(buf);
if(op) {
free(buf);
buf = strdup(op->textoid);
@@ -565,7 +565,7 @@ static const char *UTime2str(const char *beg, const char *end)
* Convert an ASN.1 element to a printable string.
* Return the dynamically allocated string, or NULL if an error occurs.
*/
-static const char *ASN1tostr(curl_asn1Element *elem, int type)
+static const char *ASN1tostr(struct Curl_asn1Element *elem, int type)
{
if(elem->constructed)
return NULL; /* No conversion of structured elements. */
@@ -609,12 +609,12 @@ static const char *ASN1tostr(curl_asn1Element *elem, int type)
* ASCII encode distinguished name at `dn' into the `buflen'-sized buffer at
* `buf'. Return the total string length, even if larger than `buflen'.
*/
-static ssize_t encodeDN(char *buf, size_t buflen, curl_asn1Element *dn)
+static ssize_t encodeDN(char *buf, size_t buflen, struct Curl_asn1Element *dn)
{
- curl_asn1Element rdn;
- curl_asn1Element atv;
- curl_asn1Element oid;
- curl_asn1Element value;
+ struct Curl_asn1Element rdn;
+ struct Curl_asn1Element atv;
+ struct Curl_asn1Element oid;
+ struct Curl_asn1Element value;
size_t l = 0;
const char *p1;
const char *p2;
@@ -683,7 +683,7 @@ static ssize_t encodeDN(char *buf, size_t buflen, curl_asn1Element *dn)
* Convert an ASN.1 distinguished name into a printable string.
* Return the dynamically allocated string, or NULL if an error occurs.
*/
-static const char *DNtostr(curl_asn1Element *dn)
+static const char *DNtostr(struct Curl_asn1Element *dn)
{
char *buf = NULL;
ssize_t buflen = encodeDN(NULL, 0, dn);
@@ -703,11 +703,11 @@ static const char *DNtostr(curl_asn1Element *dn)
* Syntax is assumed to have already been checked by the SSL backend.
* See RFC 5280.
*/
-int Curl_parseX509(curl_X509certificate *cert,
+int Curl_parseX509(struct Curl_X509certificate *cert,
const char *beg, const char *end)
{
- curl_asn1Element elem;
- curl_asn1Element tbsCertificate;
+ struct Curl_asn1Element elem;
+ struct Curl_asn1Element tbsCertificate;
const char *ccp;
static const char defaultVersion = 0; /* v1. */
@@ -835,10 +835,10 @@ static size_t copySubstring(char *to, const char *from)
return i;
}
-static const char *dumpAlgo(curl_asn1Element *param,
+static const char *dumpAlgo(struct Curl_asn1Element *param,
const char *beg, const char *end)
{
- curl_asn1Element oid;
+ struct Curl_asn1Element oid;
/* Get algorithm parameters and return algorithm name. */
@@ -855,7 +855,7 @@ static const char *dumpAlgo(curl_asn1Element *param,
}
static void do_pubkey_field(struct Curl_easy *data, int certnum,
- const char *label, curl_asn1Element *elem)
+ const char *label, struct Curl_asn1Element *elem)
{
const char *output;
@@ -872,11 +872,11 @@ static void do_pubkey_field(struct Curl_easy *data, int certnum,
}
static void do_pubkey(struct Curl_easy *data, int certnum,
- const char *algo, curl_asn1Element *param,
- curl_asn1Element *pubkey)
+ const char *algo, struct Curl_asn1Element *param,
+ struct Curl_asn1Element *pubkey)
{
- curl_asn1Element elem;
- curl_asn1Element pk;
+ struct Curl_asn1Element elem;
+ struct Curl_asn1Element pk;
const char *p;
/* Generate all information records for the public key. */
@@ -950,9 +950,9 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn,
const char *beg,
const char *end)
{
- curl_X509certificate cert;
+ struct Curl_X509certificate cert;
struct Curl_easy *data = conn->data;
- curl_asn1Element param;
+ struct Curl_asn1Element param;
const char *ccp;
char *cp1;
size_t cl1;
@@ -1111,7 +1111,7 @@ CURLcode Curl_extract_certinfo(struct connectdata *conn,
static const char *checkOID(const char *beg, const char *end,
const char *oid)
{
- curl_asn1Element e;
+ struct Curl_asn1Element e;
const char *ccp;
const char *p;
bool matched;
@@ -1136,22 +1136,21 @@ CURLcode Curl_verifyhost(struct connectdata *conn,
const char *beg, const char *end)
{
struct Curl_easy *data = conn->data;
- curl_X509certificate cert;
- curl_asn1Element dn;
- curl_asn1Element elem;
- curl_asn1Element ext;
- curl_asn1Element name;
+ struct Curl_X509certificate cert;
+ struct Curl_asn1Element dn;
+ struct Curl_asn1Element elem;
+ struct Curl_asn1Element ext;
+ struct Curl_asn1Element name;
const char *p;
const char *q;
char *dnsname;
int matched = -1;
size_t addrlen = (size_t) -1;
ssize_t len;
- const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name:
- conn->host.name;
- const char * const dispname = SSL_IS_PROXY()?
- conn->http_proxy.host.dispname:
- conn->host.dispname;
+ const char *const hostname = SSL_IS_PROXY()?
+ conn->http_proxy.host.name : conn->host.name;
+ const char *const dispname = SSL_IS_PROXY()?
+ conn->http_proxy.host.dispname : conn->host.dispname;
#ifdef ENABLE_IPV6
struct in6_addr addr;
#else
diff --git a/lib/x509asn1.h b/lib/x509asn1.h
index 205fdc0d7..0b7fb8817 100644
--- a/lib/x509asn1.h
+++ b/lib/x509asn1.h
@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -79,52 +79,51 @@
*/
/* ASN.1 parsed element. */
-typedef struct {
- const char * header; /* Pointer to header byte. */
- const char * beg; /* Pointer to element data. */
- const char * end; /* Pointer to 1st byte after element. */
- unsigned char class; /* ASN.1 element class. */
- unsigned char tag; /* ASN.1 element tag. */
- bool constructed; /* Element is constructed. */
-} curl_asn1Element;
+struct Curl_asn1Element {
+ const char *header; /* Pointer to header byte. */
+ const char *beg; /* Pointer to element data. */
+ const char *end; /* Pointer to 1st byte after element. */
+ unsigned char class; /* ASN.1 element class. */
+ unsigned char tag; /* ASN.1 element tag. */
+ bool constructed; /* Element is constructed. */
+};
/* ASN.1 OID table entry. */
-typedef struct {
- const char * numoid; /* Dotted-numeric OID. */
- const char * textoid; /* OID name. */
-} curl_OID;
+struct Curl_OID {
+ const char *numoid; /* Dotted-numeric OID. */
+ const char *textoid; /* OID name. */
+};
/* X509 certificate: RFC 5280. */
-typedef struct {
- curl_asn1Element certificate;
- curl_asn1Element version;
- curl_asn1Element serialNumber;
- curl_asn1Element signatureAlgorithm;
- curl_asn1Element signature;
- curl_asn1Element issuer;
- curl_asn1Element notBefore;
- curl_asn1Element notAfter;
- curl_asn1Element subject;
- curl_asn1Element subjectPublicKeyInfo;
- curl_asn1Element subjectPublicKeyAlgorithm;
- curl_asn1Element subjectPublicKey;
- curl_asn1Element issuerUniqueID;
- curl_asn1Element subjectUniqueID;
- curl_asn1Element extensions;
-} curl_X509certificate;
-
+struct Curl_X509certificate {
+ struct Curl_asn1Element certificate;
+ struct Curl_asn1Element version;
+ struct Curl_asn1Element serialNumber;
+ struct Curl_asn1Element signatureAlgorithm;
+ struct Curl_asn1Element signature;
+ struct Curl_asn1Element issuer;
+ struct Curl_asn1Element notBefore;
+ struct Curl_asn1Element notAfter;
+ struct Curl_asn1Element subject;
+ struct Curl_asn1Element subjectPublicKeyInfo;
+ struct Curl_asn1Element subjectPublicKeyAlgorithm;
+ struct Curl_asn1Element subjectPublicKey;
+ struct Curl_asn1Element issuerUniqueID;
+ struct Curl_asn1Element subjectUniqueID;
+ struct Curl_asn1Element extensions;
+};
/*
* Prototypes.
*/
-const char *Curl_getASN1Element(curl_asn1Element *elem,
- const char *beg, const char *end);
-const char *Curl_ASN1tostr(curl_asn1Element *elem, int type);
-const char *Curl_DNtostr(curl_asn1Element *dn);
-int Curl_parseX509(curl_X509certificate *cert,
+const char *Curl_getASN1Element(struct Curl_asn1Element *elem,
+ const char *beg, const char *end);
+const char *Curl_ASN1tostr(struct Curl_asn1Element *elem, int type);
+const char *Curl_DNtostr(struct Curl_asn1Element *dn);
+int Curl_parseX509(struct Curl_X509certificate *cert,
const char *beg, const char *end);
CURLcode Curl_extract_certinfo(struct connectdata *conn, int certnum,
const char *beg, const char *end);
diff --git a/libcurl.pc.in b/libcurl.pc.in
index feea1cd91..fd1ce2204 100644
--- a/libcurl.pc.in
+++ b/libcurl.pc.in
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -34,6 +34,6 @@ Name: libcurl
URL: https://curl.haxx.se/
Description: Library to transfer files with ftp, http, etc.
Version: @CURLVERSION@
-Libs: -L${libdir} -lcurl
+Libs: -L${libdir} -lcurl @LIBCURL_NO_SHARED@
Libs.private: @LIBCURL_LIBS@
Cflags: -I${includedir} @CPPFLAG_CURL_STATICLIB@
diff --git a/local-configure.patch b/local-configure.patch
index 8cab352ba..fc068599a 100644
--- a/local-configure.patch
+++ b/local-configure.patch
@@ -2,7 +2,7 @@ Index: curl/lib/curl_config.h
===================================================================
--- curl.orig/lib/curl_config.h
+++ curl/lib/curl_config.h
-@@ -473,7 +473,7 @@
+@@ -478,7 +478,7 @@
#define HAVE_NETDB_H 1
/* Define to 1 if you have the <netinet/in6.h> header file. */
@@ -11,7 +11,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
-@@ -513,7 +513,7 @@
+@@ -521,7 +521,7 @@
#define HAVE_OPENSSL_RSA_H 1
/* if you have the function SRP_Calc_client_key */
@@ -20,7 +20,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the <openssl/ssl.h> header file. */
#define HAVE_OPENSSL_SSL_H 1
-@@ -836,9 +836,6 @@
+@@ -862,9 +862,6 @@
/* Define absolute filename for winbind's ntlm_auth helper. */
/* #undef NTLM_WB_FILE */
@@ -30,7 +30,7 @@ Index: curl/lib/curl_config.h
/* Name of package */
#define PACKAGE "curl"
-@@ -894,7 +891,7 @@
+@@ -920,7 +917,7 @@
#define SELECT_TYPE_ARG5 struct timeval *
/* Define to the function return type for select. */
@@ -39,7 +39,7 @@ Index: curl/lib/curl_config.h
/* Define to the type qualifier of arg 2 for send. */
#define SEND_QUAL_ARG2 const
-@@ -920,24 +917,9 @@
+@@ -946,24 +943,9 @@
/* The number of bytes in type int */
#define SIZEOF_INT 4
@@ -64,7 +64,7 @@ Index: curl/lib/curl_config.h
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
-@@ -1026,7 +1008,7 @@
+@@ -1058,7 +1040,7 @@
/* #undef USE_THREADS_WIN32 */
/* Use TLS-SRP authentication */
@@ -73,7 +73,7 @@ Index: curl/lib/curl_config.h
/* Use Unix domain sockets */
#define USE_UNIX_SOCKETS 1
-@@ -1068,7 +1050,7 @@
+@@ -1103,7 +1085,7 @@
#endif
/* Number of bits in a file offset, on hosts where this is settable. */
diff --git a/ltmain.sh b/ltmain.sh
index c12c197be..0cb7f90d3 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -31,7 +31,7 @@
PROGRAM=libtool
PACKAGE=libtool
-VERSION="2.4.6 Debian-2.4.6-9"
+VERSION="2.4.6 Debian-2.4.6-14"
package_revision=2.4.6
@@ -387,7 +387,7 @@ EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
# putting '$debug_cmd' at the start of all your functions, you can get
# bash to show function call trace with:
#
-# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+# debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
debug_cmd=${debug_cmd-":"}
exit_cmd=:
@@ -2141,7 +2141,7 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
- version: $progname $scriptversion Debian-2.4.6-9
+ version: $progname $scriptversion Debian-2.4.6-14
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
@@ -7368,10 +7368,12 @@ func_mode_link ()
# -stdlib=* select c++ std lib with clang
# -fsanitize=* Clang/GCC memory and address sanitizer
# -fuse-ld=* Linker select flags for GCC
+ # -static-* direct GCC to link specific libraries statically
+ # -fcilkplus Cilk Plus language extension features for C/C++
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
- -specs=*|-fsanitize=*|-fuse-ld=*)
+ -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus)
func_quote_for_eval "$arg"
arg=$func_quote_for_eval_result
func_append compile_command " $arg"
diff --git a/m4/curl-compilers.m4 b/m4/curl-compilers.m4
index c64db4bc6..7d59f0667 100644
--- a/m4/curl-compilers.m4
+++ b/m4/curl-compilers.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -151,8 +151,17 @@ AC_DEFUN([CURL_CHECK_COMPILER_DEC_C], [
dnl CURL_CHECK_COMPILER_GNU_C
dnl -------------------------------------------------
-dnl Verify if compiler being used is GNU C.
-
+dnl Verify if compiler being used is GNU C
+dnl
+dnl $compiler_num will be set to MAJOR * 100 + MINOR for gcc less than version
+dnl 7 and just $MAJOR * 100 for gcc version 7 and later.
+dnl
+dnl Examples:
+dnl Version 1.2.3 => 102
+dnl Version 2.95 => 295
+dnl Version 4.7 => 407
+dnl Version 9.2.1 => 900
+dnl
AC_DEFUN([CURL_CHECK_COMPILER_GNU_C], [
AC_REQUIRE([CURL_CHECK_COMPILER_INTEL_C])dnl
AC_REQUIRE([CURL_CHECK_COMPILER_CLANG])dnl
@@ -443,8 +452,10 @@ dnl GNUC versions these warnings are not silenced.
AC_DEFUN([CURL_CONVERT_INCLUDE_TO_ISYSTEM], [
AC_REQUIRE([CURL_SHFUNC_SQUEEZE])dnl
AC_REQUIRE([CURL_CHECK_COMPILER])dnl
+ AC_MSG_CHECKING([convert -I options to -isystem])
if test "$compiler_id" = "GNU_C" ||
test "$compiler_id" = "CLANG"; then
+ AC_MSG_RESULT([yes])
tmp_has_include="no"
tmp_chg_FLAGS="$CFLAGS"
for word1 in $tmp_chg_FLAGS; do
@@ -475,6 +486,8 @@ AC_DEFUN([CURL_CONVERT_INCLUDE_TO_ISYSTEM], [
CPPFLAGS="$tmp_chg_FLAGS"
squeeze CPPFLAGS
fi
+ else
+ AC_MSG_RESULT([no])
fi
])
@@ -561,11 +574,6 @@ AC_DEFUN([CURL_SET_COMPILER_BASIC_OPTS], [
#
if test "$compiler_id" != "unknown"; then
#
- if test "$compiler_id" = "GNU_C" ||
- test "$compiler_id" = "CLANG"; then
- CURL_CONVERT_INCLUDE_TO_ISYSTEM
- fi
- #
tmp_save_CPPFLAGS="$CPPFLAGS"
tmp_save_CFLAGS="$CFLAGS"
tmp_CPPFLAGS=""
@@ -878,36 +886,36 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
#
if test "$want_warnings" = "yes"; then
tmp_CFLAGS="$tmp_CFLAGS -pedantic"
- tmp_CFLAGS="$tmp_CFLAGS -Wall -Wextra"
- tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings"
- tmp_CFLAGS="$tmp_CFLAGS -Wshadow"
- tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [all extra])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [pointer-arith write-strings])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [shadow])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [inline nested-externs])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [missing-declarations])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [missing-prototypes])
tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long"
- tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal"
- tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare"
- tmp_CFLAGS="$tmp_CFLAGS -Wundef"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [float-equal])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [no-multichar sign-compare])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [undef])
tmp_CFLAGS="$tmp_CFLAGS -Wno-format-nonliteral"
- tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes"
- tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement"
- tmp_CFLAGS="$tmp_CFLAGS -Wcast-align"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [endif-labels strict-prototypes])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [declaration-after-statement])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [cast-align])
tmp_CFLAGS="$tmp_CFLAGS -Wno-system-headers"
- tmp_CFLAGS="$tmp_CFLAGS -Wshorten-64-to-32"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [shorten-64-to-32])
#
dnl Only clang 1.1 or later
if test "$compiler_num" -ge "101"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wunused"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [unused])
fi
#
dnl Only clang 2.8 or later
if test "$compiler_num" -ge "208"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wvla"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [vla])
fi
#
dnl Only clang 2.9 or later
if test "$compiler_num" -ge "209"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wshift-sign-overflow"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [shift-sign-overflow])
fi
#
dnl Only clang 3.2 or later
@@ -918,25 +926,29 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
dnl mingw because the libtool wrapper executable causes them
;;
*)
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-variable-declarations"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [missing-variable-declarations])
;;
esac
fi
#
dnl Only clang 3.6 or later
if test "$compiler_num" -ge "306"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [double-promotion])
fi
#
dnl Only clang 3.9 or later
if test "$compiler_num" -ge "309"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wcomma"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [comma])
# avoid the varargs warning, fixed in 4.0
# https://bugs.llvm.org/show_bug.cgi?id=29140
if test "$compiler_num" -lt "400"; then
tmp_CFLAGS="$tmp_CFLAGS -Wno-varargs"
fi
fi
+ dnl clang 7 or later
+ if test "$compiler_num" -ge "700"; then
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [assign-enum])
+ fi
fi
;;
#
@@ -960,43 +972,45 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
fi
#
dnl Set of options we believe *ALL* gcc versions support:
- tmp_CFLAGS="$tmp_CFLAGS -Wall -W"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [all])
+ tmp_CFLAGS="$tmp_CFLAGS -W"
#
dnl Only gcc 1.4 or later
if test "$compiler_num" -ge "104"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wpointer-arith -Wwrite-strings"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [pointer-arith write-strings])
dnl If not cross-compiling with a gcc older than 3.0
if test "x$cross_compiling" != "xyes" ||
test "$compiler_num" -ge "300"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wunused -Wshadow"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [unused shadow])
fi
fi
#
dnl Only gcc 2.7 or later
if test "$compiler_num" -ge "207"; then
- tmp_CFLAGS="$tmp_CFLAGS -Winline -Wnested-externs"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [inline nested-externs])
dnl If not cross-compiling with a gcc older than 3.0
if test "x$cross_compiling" != "xyes" ||
test "$compiler_num" -ge "300"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-declarations"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-prototypes"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [missing-declarations])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [missing-prototypes])
fi
fi
#
dnl Only gcc 2.95 or later
if test "$compiler_num" -ge "295"; then
tmp_CFLAGS="$tmp_CFLAGS -Wno-long-long"
- tmp_CFLAGS="$tmp_CFLAGS -Wbad-function-cast"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [bad-function-cast])
fi
#
dnl Only gcc 2.96 or later
if test "$compiler_num" -ge "296"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wfloat-equal"
- tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar -Wsign-compare"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [float-equal])
+ tmp_CFLAGS="$tmp_CFLAGS -Wno-multichar"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [sign-compare])
dnl -Wundef used only if gcc is 2.96 or later since we get
dnl lots of "`_POSIX_C_SOURCE' is not defined" in system
dnl headers with gcc 2.95.4 on FreeBSD 4.9
- tmp_CFLAGS="$tmp_CFLAGS -Wundef"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [undef])
fi
#
dnl Only gcc 2.97 or later
@@ -1015,13 +1029,13 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
#
dnl Only gcc 3.3 or later
if test "$compiler_num" -ge "303"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wendif-labels -Wstrict-prototypes"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [endif-labels strict-prototypes])
fi
#
dnl Only gcc 3.4 or later
if test "$compiler_num" -ge "304"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wdeclaration-after-statement"
- tmp_CFLAGS="$tmp_CFLAGS -Wold-style-definition"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [declaration-after-statement])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [old-style-definition])
fi
#
dnl Only gcc 4.0 or later
@@ -1031,15 +1045,17 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
#
dnl Only gcc 4.2 or later
if test "$compiler_num" -ge "402"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wcast-align"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [cast-align])
fi
#
dnl Only gcc 4.3 or later
if test "$compiler_num" -ge "403"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wtype-limits -Wold-style-declaration"
- tmp_CFLAGS="$tmp_CFLAGS -Wmissing-parameter-type -Wempty-body"
- tmp_CFLAGS="$tmp_CFLAGS -Wclobbered -Wignored-qualifiers"
- tmp_CFLAGS="$tmp_CFLAGS -Wconversion -Wno-sign-conversion -Wvla"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [type-limits old-style-declaration])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [missing-parameter-type empty-body])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [clobbered ignored-qualifiers])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [conversion])
+ tmp_CFLAGS="$tmp_CFLAGS -Wno-sign-conversion"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [vla])
dnl required for -Warray-bounds, included in -Wall
tmp_CFLAGS="$tmp_CFLAGS -ftree-vrp"
fi
@@ -1054,7 +1070,7 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
#
dnl Only gcc 4.6 or later
if test "$compiler_num" -ge "406"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wdouble-promotion"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [double-promotion])
fi
#
dnl only gcc 4.8 or later
@@ -1069,18 +1085,19 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
#
dnl Only gcc 6 or later
if test "$compiler_num" -ge "600"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wshift-negative-value"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [shift-negative-value])
tmp_CFLAGS="$tmp_CFLAGS -Wshift-overflow=2"
- tmp_CFLAGS="$tmp_CFLAGS -Wnull-dereference -fdelete-null-pointer-checks"
- tmp_CFLAGS="$tmp_CFLAGS -Wduplicated-cond"
- tmp_CFLAGS="$tmp_CFLAGS -Wunused-const-variable"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [null-dereference])
+ tmp_CFLAGS="$tmp_CFLAGS -fdelete-null-pointer-checks"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [duplicated-cond])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [unused-const-variable])
fi
#
dnl Only gcc 7 or later
if test "$compiler_num" -ge "700"; then
- tmp_CFLAGS="$tmp_CFLAGS -Wduplicated-branches"
- tmp_CFLAGS="$tmp_CFLAGS -Wrestrict"
- tmp_CFLAGS="$tmp_CFLAGS -Walloc-zero"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [duplicated-branches])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [restrict])
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [alloc-zero])
tmp_CFLAGS="$tmp_CFLAGS -Wformat-overflow=2"
tmp_CFLAGS="$tmp_CFLAGS -Wformat-truncation=2"
tmp_CFLAGS="$tmp_CFLAGS -Wimplicit-fallthrough=4"
@@ -1106,6 +1123,10 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
fi
fi
fi
+ dnl Only gcc 10 or later
+ if test "$compiler_num" -ge "1000"; then
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [enum-conversion])
+ fi
;;
#
HP_UX_C)
@@ -1156,11 +1177,6 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
tmp_CFLAGS="$tmp_CFLAGS -fno-strict-aliasing"
dnl Value-safe optimizations on floating-point data
tmp_CFLAGS="$tmp_CFLAGS -fp-model precise"
- dnl Only icc 10.0 or later
- if test "$compiler_num" -ge "1000"; then
- dnl Disable vectorizer diagnostic information
- tmp_CFLAGS="$tmp_CFLAGS -vec-report0"
- fi
;;
#
INTEL_WINDOWS_C)
@@ -1211,11 +1227,11 @@ AC_DEFUN([CURL_SET_COMPILER_WARNING_OPTS], [
#
if test "$want_warnings" = "yes"; then
dnl Activate all warnings
- tmp_CFLAGS="$tmp_CFLAGS -Wall"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [all])
dnl Make string constants be of type const char *
- tmp_CFLAGS="$tmp_CFLAGS -Wwrite-strings"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [write-strings])
dnl Warn use of unsupported GCC features ignored by TCC
- tmp_CFLAGS="$tmp_CFLAGS -Wunsupported"
+ CURL_ADD_COMPILER_WARNINGS([tmp_CFLAGS], [unsupported])
fi
;;
#
@@ -1642,3 +1658,24 @@ AC_DEFUN([CURL_VAR_STRIP], [
[$1]="$ac_var_stripped"
squeeze [$1]
])
+
+dnl CURL_ADD_COMPILER_WARNINGS (WARNING-LIST, NEW-WARNINGS)
+dnl -------------------------------------------------------
+dnl Contents of variable WARNING-LIST and NEW-WARNINGS are
+dnl handled as whitespace separated lists of words.
+dnl Add each compiler warning from NEW-WARNINGS that has not
+dnl been disabled via CFLAGS to WARNING-LIST.
+
+AC_DEFUN([CURL_ADD_COMPILER_WARNINGS], [
+ AC_REQUIRE([CURL_SHFUNC_SQUEEZE])dnl
+ ac_var_added_warnings=""
+ for warning in [$2]; do
+ CURL_VAR_MATCH(CFLAGS, [-Wno-$warning -W$warning])
+ if test "$ac_var_match_word" = "no"; then
+ ac_var_added_warnings="$ac_var_added_warnings -W$warning"
+ fi
+ done
+ dnl squeeze whitespace out of result
+ [$1]="$[$1] $ac_var_added_warnings"
+ squeeze [$1]
+])
diff --git a/m4/curl-confopts.m4 b/m4/curl-confopts.m4
index af15a85d9..5f877133a 100644
--- a/m4/curl-confopts.m4
+++ b/m4/curl-confopts.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -107,7 +107,7 @@ AC_HELP_STRING([--disable-curldebug],[Disable curl debug memory tracking]),
;;
default)
dnl configure's curldebug option not specified. Initially we will
- dnl handle this as a a request to use the same setting as option
+ dnl handle this as a request to use the same setting as option
dnl --enable-debug. IOW, initially, for debug-enabled builds
dnl this will be handled as a request to enable curldebug if
dnl possible, and for debug-disabled builds this will be handled
@@ -198,7 +198,7 @@ AC_HELP_STRING([--disable-optimize],[Disable compiler optimizations]),
;;
default)
dnl configure's optimize option not specified. Initially we will
- dnl handle this as a a request contrary to configure's setting
+ dnl handle this as a request contrary to configure's setting
dnl for --enable-debug. IOW, initially, for debug-enabled builds
dnl this will be handled as a request to disable optimizations if
dnl possible, and for debug-disabled builds this will be handled
@@ -649,37 +649,37 @@ AC_DEFUN([CURL_CHECK_NTLM_WB], [
fi
])
-dnl CURL_CHECK_OPTION_ESNI
+dnl CURL_CHECK_OPTION_ECH
dnl -----------------------------------------------------
dnl Verify whether configure has been invoked with option
-dnl --enable-esni or --disable-esni, and set
-dnl shell variable want_esni as appropriate.
-
-AC_DEFUN([CURL_CHECK_OPTION_ESNI], [
- AC_MSG_CHECKING([whether to enable ESNI support])
- OPT_ESNI="default"
- AC_ARG_ENABLE(esni,
-AC_HELP_STRING([--enable-esni],[Enable ESNI support])
-AC_HELP_STRING([--disable-esni],[Disable ESNI support]),
- OPT_ESNI=$enableval)
- case "$OPT_ESNI" in
+dnl --enable-ech or --disable-ech, and set
+dnl shell variable want_ech as appropriate.
+
+AC_DEFUN([CURL_CHECK_OPTION_ECH], [
+ AC_MSG_CHECKING([whether to enable ECH support])
+ OPT_ECH="default"
+ AC_ARG_ENABLE(ech,
+AC_HELP_STRING([--enable-ech],[Enable ECH support])
+AC_HELP_STRING([--disable-ech],[Disable ECH support]),
+ OPT_ECH=$enableval)
+ case "$OPT_ECH" in
no)
- dnl --disable-esni option used
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ dnl --disable-ech option used
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
AC_MSG_RESULT([no])
;;
default)
dnl configure option not specified
- want_esni="no"
- curl_esni_msg="no (--enable-esni)"
+ want_ech="no"
+ curl_ech_msg="no (--enable-ech)"
AC_MSG_RESULT([no])
;;
*)
- dnl --enable-esni option used
- want_esni="yes"
- curl_esni_msg="enabled (--disable-esni)"
- experimental="esni"
+ dnl --enable-ech option used
+ want_ech="yes"
+ curl_ech_msg="enabled (--disable-ech)"
+ experimental="ech"
AC_MSG_RESULT([yes])
;;
esac
diff --git a/m4/curl-functions.m4 b/m4/curl-functions.m4
index 9020f3942..b4e64cf33 100644
--- a/m4/curl-functions.m4
+++ b/m4/curl-functions.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -6350,7 +6350,7 @@ dnl glibc-style strerror_r:
dnl
dnl char *strerror_r(int errnum, char *workbuf, size_t bufsize);
dnl
-dnl glibc-style strerror_r returns a pointer to the the error string,
+dnl glibc-style strerror_r returns a pointer to the error string,
dnl and might use the provided workbuf as a scratch area if needed. A
dnl quick test on a few systems shows that it's usually not used at all.
dnl
@@ -7289,8 +7289,6 @@ dnl CURL_LIBRARY_PATH variable. It keeps the LD_LIBRARY_PATH
dnl changes contained within this macro.
AC_DEFUN([CURL_RUN_IFELSE], [
- AC_REQUIRE([AC_RUN_IFELSE])dnl
-
old=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CURL_LIBRARY_PATH:$old
export LD_LIBRARY_PATH
diff --git a/m4/curl-openssl.m4 b/m4/curl-openssl.m4
index d55827861..24f33aa11 100644
--- a/m4/curl-openssl.m4
+++ b/m4/curl-openssl.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/m4/curl-override.m4 b/m4/curl-override.m4
index a03504982..18e4e2091 100644
--- a/m4/curl-override.m4
+++ b/m4/curl-override.m4
@@ -1,4 +1,25 @@
#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#***************************************************************************
#***************************************************************************
# File version for 'aclocal' use. Keep it a single number.
diff --git a/m4/curl-reentrant.m4 b/m4/curl-reentrant.m4
index 8b5ca124b..32cbaf854 100644
--- a/m4/curl-reentrant.m4
+++ b/m4/curl-reentrant.m4
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 013074655..a6d21ae56 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -1041,8 +1041,8 @@ int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
- echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
- $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+ echo "$AR cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR cr libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
$RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
cat > conftest.c << _LT_EOF
@@ -1492,7 +1492,7 @@ need_locks=$enable_libtool_lock
m4_defun([_LT_PROG_AR],
[AC_CHECK_TOOLS(AR, [ar], false)
: ${AR=ar}
-: ${AR_FLAGS=cru}
+: ${AR_FLAGS=cr}
_LT_DECL([], [AR], [1], [The archiver])
_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
@@ -4124,7 +4124,7 @@ static const void *lt_preloaded_setup() {
#endif
_LT_EOF
# Now try linking the two files.
- mv -f conftest.$ac_objext conftstm.$ac_objext
+ mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
LIBS=conftstm.$ac_objext
@@ -4704,6 +4704,12 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
;;
+ # flang / f18. f95 an alias for gfortran or flang on Debian
+ flang* | f18* | f95*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
# icc used to be incompatible with GCC.
# ICC 10 doesn't accept -KPIC any more.
icc* | ifort*)
@@ -5677,9 +5683,9 @@ _LT_EOF
hpux9*)
if test yes = "$GCC"; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
@@ -6805,7 +6811,7 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(ld_shlibs, $1)=no
;;
aCC*)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
@@ -6818,7 +6824,7 @@ if test yes != "$_lt_caught_CXX_error"; then
;;
*)
if test yes = "$GXX"; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv -f $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
# FIXME: insert proper C++ library support
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -6954,8 +6960,8 @@ if test yes != "$_lt_caught_CXX_error"; then
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv -f \$templib $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv -f \$templib $lib'
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
@@ -7153,7 +7159,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv -f \$templib $lib'
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
@@ -8264,7 +8270,7 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
fi
while true; do
cat conftest.in conftest.in >conftest.tmp
- mv -f conftest.tmp conftest.in
+ mv conftest.tmp conftest.in
cp conftest.in conftest.nl
echo >>conftest.nl
$lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
diff --git a/m4/xc-am-iface.m4 b/m4/xc-am-iface.m4
index 8fc2ea869..7070193aa 100644
--- a/m4/xc-am-iface.m4
+++ b/m4/xc-am-iface.m4
@@ -2,7 +2,7 @@
#
# xc-am-iface.m4
#
-# Copyright (c) 2013 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2013 - 2020 Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/m4/xc-cc-check.m4 b/m4/xc-cc-check.m4
index f95f25933..fd58ca2ce 100644
--- a/m4/xc-cc-check.m4
+++ b/m4/xc-cc-check.m4
@@ -2,7 +2,7 @@
#
# xc-cc-check.m4
#
-# Copyright (c) 2013 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2013 - 2020, Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/m4/xc-lt-iface.m4 b/m4/xc-lt-iface.m4
index afbd990d6..465767fc3 100644
--- a/m4/xc-lt-iface.m4
+++ b/m4/xc-lt-iface.m4
@@ -2,7 +2,7 @@
#
# xc-lt-iface.m4
#
-# Copyright (c) 2013 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2013 - 2020, Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/m4/xc-translit.m4 b/m4/xc-translit.m4
index 456e72782..18b63ecc8 100644
--- a/m4/xc-translit.m4
+++ b/m4/xc-translit.m4
@@ -2,7 +2,7 @@
#
# xc-translit.m4
#
-# Copyright (c) 2011 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2011 - 2020, Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/m4/xc-val-flgs.m4 b/m4/xc-val-flgs.m4
index 95b450b23..775c149cc 100644
--- a/m4/xc-val-flgs.m4
+++ b/m4/xc-val-flgs.m4
@@ -2,7 +2,7 @@
#
# xc-val-flgs.m4
#
-# Copyright (c) 2013 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2013 - 2020, Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/m4/zz50-xc-ovr.m4 b/m4/zz50-xc-ovr.m4
index 7f530dead..cf8604dcb 100644
--- a/m4/zz50-xc-ovr.m4
+++ b/m4/zz50-xc-ovr.m4
@@ -2,7 +2,7 @@
#
# zz50-xc-ovr.m4
#
-# Copyright (c) 2011 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2011 - 2020, Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/m4/zz60-xc-ovr.m4 b/m4/zz60-xc-ovr.m4
index 45ed8b69a..126ac0fd7 100644
--- a/m4/zz60-xc-ovr.m4
+++ b/m4/zz60-xc-ovr.m4
@@ -2,7 +2,7 @@
#
# zz60-xc-ovr.m4
#
-# Copyright (c) 2013 Daniel Stenberg <daniel@haxx.se>
+# Copyright (c) 2013 - 2020, Daniel Stenberg <daniel@haxx.se>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/missing b/missing
index 625aeb118..8d0eaad25 100755
--- a/missing
+++ b/missing
@@ -3,7 +3,7 @@
scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
diff --git a/packages/DOS/common.dj b/packages/DOS/common.dj
index c97b216eb..b0e15d676 100644
--- a/packages/DOS/common.dj
+++ b/packages/DOS/common.dj
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
# Common defines for curl (djgpp/Watt-32)
#
diff --git a/packages/Makefile.am b/packages/Makefile.am
index 9a2af064d..0fc585629 100644
--- a/packages/Makefile.am
+++ b/packages/Makefile.am
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
SUBDIRS = vms
EXTRA_DIST = README \
@@ -6,6 +27,7 @@ EXTRA_DIST = README \
OS400/README.OS400 \
OS400/ccsidcurl.c \
OS400/ccsidcurl.h \
+ OS400/chkstrings.c \
OS400/curl.inc.in \
OS400/initscript.sh \
OS400/make-include.sh \
@@ -15,16 +37,6 @@ EXTRA_DIST = README \
OS400/makefile.sh \
OS400/os400sys.c \
OS400/os400sys.h \
- Symbian/bwins/libcurlu.def \
- Symbian/eabi/libcurlu.def \
- Symbian/group/bld.inf \
- Symbian/group/curl.iby \
- Symbian/group/curl.mmp \
- Symbian/group/curl.pkg \
- Symbian/group/libcurl.iby \
- Symbian/group/libcurl.mmp \
- Symbian/group/libcurl.pkg \
- Symbian/readme.txt \
TPF/curl.mak \
TPF/maketpf.env_curl \
TPF/maketpf.env_curllib \
diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c
index 11e4c777e..4e04927b0 100644
--- a/packages/OS400/ccsidcurl.c
+++ b/packages/OS400/ccsidcurl.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -1130,22 +1130,6 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
char *cp;
unsigned int ccsid;
curl_off_t pfsize;
- static char testwarn = 1;
-
- /* Warns if this procedure has not been updated when the dupstring enum
- changes.
- We (try to) do it only once: there is no need to issue several times
- the same message; but since threadsafeness is not handled here,
- this may occur (and we don't care!). */
-
- if(testwarn) {
- testwarn = 0;
-
- if((int) STRING_LASTZEROTERMINATED != (int) STRING_SASL_AUTHZID + 1 ||
- (int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1)
- curl_mfprintf(stderr,
- "*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n");
- }
data = (struct Curl_easy *) curl;
va_start(arg, tag);
@@ -1164,6 +1148,9 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
case CURLOPT_CUSTOMREQUEST:
case CURLOPT_DEFAULT_PROTOCOL:
case CURLOPT_DNS_SERVERS:
+ case CURLOPT_DNS_INTERFACE:
+ case CURLOPT_DNS_LOCAL_IP4:
+ case CURLOPT_DNS_LOCAL_IP6:
case CURLOPT_DOH_URL:
case CURLOPT_EGDSOCKET:
case CURLOPT_ENCODING:
diff --git a/packages/OS400/chkstrings.c b/packages/OS400/chkstrings.c
new file mode 100644
index 000000000..083263640
--- /dev/null
+++ b/packages/OS400/chkstrings.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include <stdlib.h>
+#pragma enum(int)
+#include "curl_setup.h"
+#include "urldata.h"
+
+/* The following defines indicate the expected dupstring enum values
+ * in curl_easy_setopt_ccsid() in packages/OS400/ccsidcurl.c. If a
+ * mismatch is flagged during the build, it indicates that curl_easy_setopt_ccsid()
+ * may need updating to perform data EBCDIC to ASCII data conversion on
+ * the string.
+ * Once any applicable changes to curl_easy_setopt_ccsid() have been
+ * made, the EXPECTED_STRING_LASTZEROTERMINATED/EXPECTED_STRING_LAST
+ * values can be updated to match the latest enum values in urldata.h.
+ */
+#define EXPECTED_STRING_LASTZEROTERMINATED (STRING_DNS_LOCAL_IP6 + 1)
+#define EXPECTED_STRING_LAST (STRING_COPYPOSTFIELDS + 1)
+
+int main(int argc, char *argv[])
+{
+ int rc = 0;
+
+ if (STRING_LASTZEROTERMINATED != EXPECTED_STRING_LASTZEROTERMINATED)
+ {
+ fprintf(stderr,"STRING_LASTZEROTERMINATED(%d) is not expected value(%d).\n",
+ STRING_LASTZEROTERMINATED, EXPECTED_STRING_LASTZEROTERMINATED);
+ rc += 1;
+ }
+ if (STRING_LAST != EXPECTED_STRING_LAST)
+ {
+ fprintf(stderr,"STRING_LAST(%d) is not expected value(%d).\n",
+ STRING_LAST, EXPECTED_STRING_LAST);
+ rc += 2;
+ }
+ if (rc != 0)
+ {
+ fprintf(stderr,"curl_easy_setopt_ccsid() in packages/OS400/ccsidcurl.c"
+ " may need updating if new strings are provided as input via the curl API.\n");
+ }
+ return rc;
+}
diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in
index 8be6c8986..33ac8b34b 100644
--- a/packages/OS400/curl.inc.in
+++ b/packages/OS400/curl.inc.in
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -140,6 +140,8 @@
d c X'01000000'
d CURL_VERSION_HTTP3...
d c X'02000000'
+ d CURL_VERSION_UNICODE...
+ d c X'04000000'
*
d CURL_HTTPPOST_FILENAME...
d c X'00000001'
@@ -596,6 +598,14 @@
d c 91
d CURLE_HTTP2_STREAM...
d c 92
+ d CURLE_RECURSIVE_API_CALL...
+ d c 93
+ d CURLE_AUTH_ERROR...
+ d c 94
+ d CURLE_HTTP3...
+ d c 95
+ d CURLE_QUIC_CONNECT_ERROR...
+ d c 96
*
/if not defined(CURL_NO_OLDIES)
d CURLE_URL_MALFORMAT_USER...
@@ -760,6 +770,10 @@
d c X'0001'
d CURLSSLOPT_NO_REVOKE...
d c X'0002'
+ d CURLSSLOPT_NO_PARTIALCHAIN...
+ d c X'0004'
+ d CURLSSLOPT_REVOKE_BEST_EFFORT...
+ d c X'0008'
*
d CURL_HET_DEFAULT...
d c 200
@@ -1804,7 +1818,13 @@
d c 6
d CURLM_ADDED_ALREADY...
d c 7
- d CURLM_LAST c 8
+ d CURLM_RECURSIVE_API_CALL...
+ d c 8
+ d CURLM_WAKEUP_FAILURE...
+ d c 9
+ d CURLM_BAD_FUNCTION_ARGUMENT...
+ d c 10
+ d CURLM_LAST c 11
*
d CURLMSG s 10i 0 based(######ptr######) Enum
d CURLMSG_NONE c 0
diff --git a/packages/OS400/initscript.sh b/packages/OS400/initscript.sh
index a13d651bc..a59351106 100644
--- a/packages/OS400/initscript.sh
+++ b/packages/OS400/initscript.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
setenv()
diff --git a/packages/OS400/make-include.sh b/packages/OS400/make-include.sh
index 3c50d2d5f..4cb0edd86 100644
--- a/packages/OS400/make-include.sh
+++ b/packages/OS400/make-include.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
# Installation of the header files in the OS/400 library.
#
diff --git a/packages/OS400/make-lib.sh b/packages/OS400/make-lib.sh
index 410bef05b..c772b246c 100644
--- a/packages/OS400/make-lib.sh
+++ b/packages/OS400/make-lib.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
# libcurl compilation script for the OS/400.
#
@@ -46,6 +67,26 @@ sed -e ':begin' \
INCLUDES="'`pwd`'"
+# Create a small C program to check ccsidcurl.c is up to date
+if action_needed "${LIBIFSNAME}/CHKSTRINGS.PGM"
+then
+ CMD="CRTBNDC PGM(${TARGETLIB}/CHKSTRINGS) SRCSTMF('${SCRIPTDIR}/chkstrings.c')"
+ CMD="${CMD} INCDIR('${TOPDIR}/include/curl' '${TOPDIR}/include' '${SRCDIR}' ${INCLUDES})"
+ system -i "${CMD}"
+ if [ $? -ne 0 ]
+ then
+ echo "ERROR: Failed to build CHKSTRINGS *PGM object!"
+ exit 2
+ else
+ ${LIBIFSNAME}/CHKSTRINGS.PGM
+ if [ $? -ne 0 ]
+ then
+ echo "ERROR: CHKSTRINGS failed!"
+ exit 2
+ fi
+ fi
+fi
+
make_module OS400SYS "${SCRIPTDIR}/os400sys.c"
make_module CCSIDCURL "${SCRIPTDIR}/ccsidcurl.c"
diff --git a/packages/OS400/make-src.sh b/packages/OS400/make-src.sh
index 090ae1287..dbe039b2c 100644
--- a/packages/OS400/make-src.sh
+++ b/packages/OS400/make-src.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
#
# Not implemented yet on OS/400.
diff --git a/packages/OS400/make-tests.sh b/packages/OS400/make-tests.sh
index 9240b7ff6..54cdd2fea 100644
--- a/packages/OS400/make-tests.sh
+++ b/packages/OS400/make-tests.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
# tests compilation script for the OS/400.
#
diff --git a/packages/OS400/makefile.sh b/packages/OS400/makefile.sh
index 7c6bcd7c6..29ba506e0 100644
--- a/packages/OS400/makefile.sh
+++ b/packages/OS400/makefile.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
# curl compilation script for the OS/400.
#
@@ -32,7 +53,7 @@ fi
for TEXT in "${TOPDIR}/COPYING" "${SCRIPTDIR}/README.OS400" \
"${TOPDIR}/CHANGES" "${TOPDIR}/docs/THANKS" "${TOPDIR}/docs/FAQ" \
"${TOPDIR}/docs/FEATURES" "${TOPDIR}/docs/SSLCERTS.md" \
- "${TOPDIR}/docs/RESOURCES" "${TOPDIR}/docs/VERSIONS" \
+ "${TOPDIR}/docs/RESOURCES" "${TOPDIR}/docs/VERSIONS.md" \
"${TOPDIR}/docs/HISTORY.md"
do MEMBER="`basename \"${TEXT}\" .OS400`"
MEMBER="`basename \"${MEMBER}\" .md`"
diff --git a/packages/OS400/os400sys.h b/packages/OS400/os400sys.h
index c98e198cc..8dafd6491 100644
--- a/packages/OS400/os400sys.h
+++ b/packages/OS400/os400sys.h
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/packages/Symbian/bwins/libcurlu.def b/packages/Symbian/bwins/libcurlu.def
deleted file mode 100644
index 7f30b7feb..000000000
--- a/packages/Symbian/bwins/libcurlu.def
+++ /dev/null
@@ -1,60 +0,0 @@
-EXPORTS
- curl_easy_cleanup @ 1 NONAME
- curl_easy_duphandle @ 2 NONAME
- curl_easy_escape @ 3 NONAME
- curl_easy_getinfo @ 4 NONAME
- curl_easy_init @ 5 NONAME
- curl_easy_pause @ 6 NONAME
- curl_easy_perform @ 7 NONAME
- curl_easy_reset @ 8 NONAME
- curl_easy_setopt @ 9 NONAME
- curl_easy_strerror @ 10 NONAME
- curl_easy_unescape @ 11 NONAME
- curl_escape @ 12 NONAME
- curl_formadd @ 13 NONAME
- curl_formfree @ 14 NONAME
- curl_formget @ 15 NONAME
- curl_free @ 16 NONAME
- curl_getdate @ 17 NONAME
- curl_getenv @ 18 NONAME
- curl_global_cleanup @ 19 NONAME
- curl_global_init @ 20 NONAME
- curl_global_init_mem @ 21 NONAME
- curl_maprintf @ 22 NONAME
- curl_mfprintf @ 23 NONAME
- curl_mprintf @ 24 NONAME
- curl_msnprintf @ 25 NONAME
- curl_msprintf @ 26 NONAME
- curl_multi_add_handle @ 27 NONAME
- curl_multi_assign @ 28 NONAME
- curl_multi_cleanup @ 29 NONAME
- curl_multi_fdset @ 30 NONAME
- curl_multi_info_read @ 31 NONAME
- curl_multi_init @ 32 NONAME
- curl_multi_perform @ 33 NONAME
- curl_multi_remove_handle @ 34 NONAME
- curl_multi_setopt @ 35 NONAME
- curl_multi_socket @ 36 NONAME
- curl_multi_socket_action @ 37 NONAME
- curl_multi_socket_all @ 38 NONAME
- curl_multi_strerror @ 39 NONAME
- curl_multi_timeout @ 40 NONAME
- curl_mvaprintf @ 41 NONAME
- curl_mvfprintf @ 42 NONAME
- curl_mvprintf @ 43 NONAME
- curl_mvsnprintf @ 44 NONAME
- curl_mvsprintf @ 45 NONAME
- curl_share_cleanup @ 46 NONAME
- curl_share_init @ 47 NONAME
- curl_share_setopt @ 48 NONAME
- curl_share_strerror @ 49 NONAME
- curl_slist_append @ 50 NONAME
- curl_slist_free_all @ 51 NONAME
- curl_strequal @ 52 NONAME
- curl_strnequal @ 53 NONAME
- curl_unescape @ 54 NONAME
- curl_version @ 55 NONAME
- curl_version_info @ 56 NONAME
- curl_easy_recv @ 57 NONAME
- curl_easy_send @ 58 NONAME
- curl_multi_wait @ 59 NONAME
diff --git a/packages/Symbian/eabi/libcurlu.def b/packages/Symbian/eabi/libcurlu.def
deleted file mode 100644
index 7f30b7feb..000000000
--- a/packages/Symbian/eabi/libcurlu.def
+++ /dev/null
@@ -1,60 +0,0 @@
-EXPORTS
- curl_easy_cleanup @ 1 NONAME
- curl_easy_duphandle @ 2 NONAME
- curl_easy_escape @ 3 NONAME
- curl_easy_getinfo @ 4 NONAME
- curl_easy_init @ 5 NONAME
- curl_easy_pause @ 6 NONAME
- curl_easy_perform @ 7 NONAME
- curl_easy_reset @ 8 NONAME
- curl_easy_setopt @ 9 NONAME
- curl_easy_strerror @ 10 NONAME
- curl_easy_unescape @ 11 NONAME
- curl_escape @ 12 NONAME
- curl_formadd @ 13 NONAME
- curl_formfree @ 14 NONAME
- curl_formget @ 15 NONAME
- curl_free @ 16 NONAME
- curl_getdate @ 17 NONAME
- curl_getenv @ 18 NONAME
- curl_global_cleanup @ 19 NONAME
- curl_global_init @ 20 NONAME
- curl_global_init_mem @ 21 NONAME
- curl_maprintf @ 22 NONAME
- curl_mfprintf @ 23 NONAME
- curl_mprintf @ 24 NONAME
- curl_msnprintf @ 25 NONAME
- curl_msprintf @ 26 NONAME
- curl_multi_add_handle @ 27 NONAME
- curl_multi_assign @ 28 NONAME
- curl_multi_cleanup @ 29 NONAME
- curl_multi_fdset @ 30 NONAME
- curl_multi_info_read @ 31 NONAME
- curl_multi_init @ 32 NONAME
- curl_multi_perform @ 33 NONAME
- curl_multi_remove_handle @ 34 NONAME
- curl_multi_setopt @ 35 NONAME
- curl_multi_socket @ 36 NONAME
- curl_multi_socket_action @ 37 NONAME
- curl_multi_socket_all @ 38 NONAME
- curl_multi_strerror @ 39 NONAME
- curl_multi_timeout @ 40 NONAME
- curl_mvaprintf @ 41 NONAME
- curl_mvfprintf @ 42 NONAME
- curl_mvprintf @ 43 NONAME
- curl_mvsnprintf @ 44 NONAME
- curl_mvsprintf @ 45 NONAME
- curl_share_cleanup @ 46 NONAME
- curl_share_init @ 47 NONAME
- curl_share_setopt @ 48 NONAME
- curl_share_strerror @ 49 NONAME
- curl_slist_append @ 50 NONAME
- curl_slist_free_all @ 51 NONAME
- curl_strequal @ 52 NONAME
- curl_strnequal @ 53 NONAME
- curl_unescape @ 54 NONAME
- curl_version @ 55 NONAME
- curl_version_info @ 56 NONAME
- curl_easy_recv @ 57 NONAME
- curl_easy_send @ 58 NONAME
- curl_multi_wait @ 59 NONAME
diff --git a/packages/Symbian/group/bld.inf b/packages/Symbian/group/bld.inf
deleted file mode 100644
index 354a84382..000000000
--- a/packages/Symbian/group/bld.inf
+++ /dev/null
@@ -1,10 +0,0 @@
-//
-// libcurl and curl bld.inf file for Symbian OS
-//
-PRJ_EXPORTS
- libcurl.iby /epoc32/rom/include/libcurl.iby
- curl.iby /epoc32/rom/include/curl.iby
-
-PRJ_MMPFILES
- libcurl.mmp
- curl.mmp
diff --git a/packages/Symbian/group/curl.iby b/packages/Symbian/group/curl.iby
deleted file mode 100644
index 7921aaa07..000000000
--- a/packages/Symbian/group/curl.iby
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// curl file transfer utility command-line utility
-//
-// Use this file with buildrom to add curl to a device ROM
-//
-
-#ifndef CURL_IBY
-#define CURL_IBY
-
-#include <openenv.iby>
-#include <libcurl.iby>
-
-file=ABI_DIR\BUILD_DIR\curl.exe \sys\bin\curl.exe
-
-#endif // CURL_IBY
diff --git a/packages/Symbian/group/curl.mmp b/packages/Symbian/group/curl.mmp
deleted file mode 100644
index 14ccf1419..000000000
--- a/packages/Symbian/group/curl.mmp
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// curl network retrieval client
-//
-
-TARGET curl.exe
-TARGETTYPE exe
-UID 0x00000000 0xF0206442
-
-SOURCEPATH ../../../src
-SOURCE \
- tool_binmode.c \
- tool_bname.c \
- tool_cb_dbg.c \
- tool_cb_hdr.c \
- tool_cb_prg.c \
- tool_cb_rea.c \
- tool_cb_see.c \
- tool_cb_wrt.c \
- tool_cfgable.c \
- tool_convert.c \
- tool_dirhie.c \
- tool_doswin.c \
- tool_easysrc.c \
- tool_formparse.c \
- tool_getparam.c \
- tool_getpass.c \
- tool_help.c \
- tool_helpers.c \
- tool_homedir.c \
- tool_hugehelp.c \
- tool_libinfo.c \
- tool_main.c \
- tool_metalink.c \
- tool_mfiles.c \
- tool_msgs.c \
- tool_operate.c \
- tool_operhlp.c \
- tool_panykey.c \
- tool_paramhlp.c \
- tool_parsecfg.c \
- tool_setopt.c \
- tool_sleep.c \
- tool_urlglob.c \
- tool_util.c \
- tool_vms.c \
- tool_writeenv.c \
- tool_writeout.c \
- tool_xattr.c
-
-SOURCEPATH ../../../lib
-SOURCE \
- strcase.c nonblock.c
-
-USERINCLUDE ../../../src ../../../lib ../../../include/curl
-
-SYSTEMINCLUDE ../../../include /epoc32/include /epoc32/include/stdapis
-
-LIBRARY euser.lib libc.lib libcurl.lib
-STATICLIBRARY libcrt0.lib
-
-CAPABILITY NetworkServices
-
-EPOCSTACKSIZE 0x8000
diff --git a/packages/Symbian/group/curl.pkg b/packages/Symbian/group/curl.pkg
deleted file mode 100644
index 17c64f1e0..000000000
--- a/packages/Symbian/group/curl.pkg
+++ /dev/null
@@ -1,26 +0,0 @@
-; curl package definition file
-; Use with makesis to create a Symbian .sis package
-
-;Language - standard language definitions
-&EN
-
-;Header - standard sis file header including version number
-;Version scheme: curl's major, curl's minor, curl's subminor*100 + build number
-; e.g. The third Symbian package of curl ver. 7.20.1 would have a SIS package
-; version of 7, 20, 103
-#{"curl"}, (0xF0206442), 7, 20, <please_update_version>, TYPE=SA
-
-; Vendor name
-%{"curl project"}
-:"curl project"
-
-; Embedded component
-@"libcurl.sis",(0xF0206D00)
-
-; A dependency on P.I.P.S. and the stdio server are probably good to have here
-;(0x20009A80), *, *, *, {"Open C Standard Libraries"}
-;(0x20009A81), *, *, *, {"P.I.P.S. for UIQ 3"}
-;(0x20009AA2), *, *, *, {"Symbian OS STDIOSERVER"}
-
-;Files - standard file specifications
-"\epoc32\release\armv5\urel\curl.exe" - "$:\sys\bin\curl.exe"
diff --git a/packages/Symbian/group/libcurl.iby b/packages/Symbian/group/libcurl.iby
deleted file mode 100644
index 373f5b37d..000000000
--- a/packages/Symbian/group/libcurl.iby
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// libcurl file transfer DLL
-//
-// Use this file with buildrom to add libcurl to a device ROM
-//
-
-#ifndef LIBCURL_IBY
-#define LIBCURL_IBY
-
-#include <openenv.iby>
-
-file=ABI_DIR\BUILD_DIR\libcurl.dll \sys\bin\libcurl.dll
-
-#endif // LIBCURL_IBY
diff --git a/packages/Symbian/group/libcurl.mmp b/packages/Symbian/group/libcurl.mmp
deleted file mode 100644
index 6e94d8489..000000000
--- a/packages/Symbian/group/libcurl.mmp
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// libcurl.dll curl network retrieval client library
-//
-
-// Build-time options (uncomment these to enable)
-#define ENABLE_ZLIB // Enable gzip/deflate decompression
-//#define ENABLE_SSL // Enable SSL for HTTPS/FTPS (requires S60 Open C SDK)
-
-TARGET libcurl.dll
-TARGETTYPE dll
-UID 0x1000008d 0xF0206D00
-
-MACRO BUILDING_LIBCURL
-
-#ifdef ENABLE_ZLIB
-MACRO HAVE_LIBZ
-#endif
-#ifdef ENABLE_SSL
-MACRO USE_OPENSSL
-#endif
-
-SOURCEPATH ../../../lib
-SOURCE \
- file.c timeval.c base64.c hostip.c progress.c formdata.c \
- cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c \
- ldap.c vtls/openssl.c version.c getenv.c escape.c mprintf.c telnet.c \
- netrc.c getinfo.c transfer.c strequal.c easy.c security.c krb4.c \
- curl_fnmatch.c fileinfo.c ftplistparser.c wildcard.c krb5.c \
- memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \
- content_encoding.c share.c http_digest.c md4.c md5.c curl_rand.c \
- http_negotiate.c inet_pton.c strtoofft.c strerror.c amigaos.c \
- hostasyn.c hostip4.c hostip6.c hostsyn.c inet_ntop.c parsedate.c \
- select.c vtls/gtls.c vtls/vtls.c tftp.c splay.c strdup.c socks.c \
- ssh.c vtls/nss.c strcase.c curl_addrinfo.c socks_gssapi.c \
- socks_sspi.c curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c \
- pop3.c smtp.c pingpong.c rtsp.c curl_threads.c warnless.c hmac.c \
- vtls/polarssl.c curl_rtmp.c openldap.c curl_gethostname.c gopher.c \
- idn_win32.c vtls/cyassl.c http_proxy.c non-ascii.c \
- asyn-ares.c asyn-thread.c curl_gssapi.c http_ntlm.c curl_ntlm_wb.c \
- curl_ntlm_core.c curl_sasl.c vtls/schannel.c curl_multibyte.c \
- vtls/darwinssl.c conncache.c curl_sasl_sspi.c smb.c curl_endian.c \
- curl_des.c curl_range.c system_win32.c sha256.c \
- vauth/vauth.c vauth/cleartext.c vauth/cram.c vauth/digest.c \
- vauth/digest_sspi.c vauth/krb5_gssapi.c vauth/krb5_sspi.c \
- vauth/ntlm.c vauth/ntlm_sspi.c vauth/oauth2.c vauth/spnego_gssapi.c \
- vauth/spnego_sspi.c
-
-USERINCLUDE ../../../lib ../../../include/curl
-#ifdef ENABLE_SSL
-SYSTEMINCLUDE /epoc32/include/osextensions/stdapis
-// Older versions of the SDK need this instead:
-//USERINCLUDE /epoc32/include/stdapis/openssl
-#endif
-
-SYSTEMINCLUDE ../../../include /epoc32/include/stdapis /epoc32/include
-
-LIBRARY euser.lib libc.lib
-#ifdef ENABLE_ZLIB
-LIBRARY ezlib.lib
-#endif
-#ifdef ENABLE_SSL
-LIBRARY libssl.lib libcrypto.lib
-#endif
-
-CAPABILITY NetworkServices
-
-EPOCALLOWDLLDATA
diff --git a/packages/Symbian/group/libcurl.pkg b/packages/Symbian/group/libcurl.pkg
deleted file mode 100644
index 6b0479753..000000000
--- a/packages/Symbian/group/libcurl.pkg
+++ /dev/null
@@ -1,22 +0,0 @@
-; libcurl package definition file
-; Use with makesis to create a Symbian .sis package
-
-;Language - standard language definitions
-&EN
-
-;Header - standard sis file header including version number
-;Version scheme: curl's major, curl's minor, curl's subminor*100 + build number
-; e.g. The third Symbian package of curl ver. 7.20.1 would have a SIS package
-; version of 7, 20, 103
-#{"libcurl"}, (0xF0206D00), 7, 20, <please_update_version>, TYPE=SA
-
-; Vendor name
-%{"curl project"}
-:"curl project"
-
-; A dependency on P.I.P.S. is probably a good idea to add here
-;(0x20009A80), *, *, *, {"Open C Standard Libraries"}
-;(0x20009A81), *, *, *, {"P.I.P.S. for UIQ 3"}
-
-;Files - standard file specifications
-"\epoc32\release\armv5\urel\libcurl.dll" - "$:\sys\bin\libcurl.dll"
diff --git a/packages/Symbian/readme.txt b/packages/Symbian/readme.txt
deleted file mode 100644
index d6312fbe3..000000000
--- a/packages/Symbian/readme.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Curl on Symbian OS
-==================
-This is a basic port of curl and libcurl to Symbian OS. The port is
-a straightforward one using Symbian's P.I.P.S. POSIX compatibility
-layer, which was first available for OS version 9.1. A more complete
-port would involve writing a Symbian C++ binding, or wrapping libcurl
-as a Symbian application server with a C++ API to handle requests
-from client applications as well as creating a GUI application to allow
-file transfers. The author has no current plans to do so.
-
-This means that integration with standard Symbian OS programs can be
-tricky, since libcurl isn't designed with Symbian's native asynchronous
-message passing idioms in mind. However, it may be possible to use libcurl
-in an active object-based application through libcurl's multi interface.
-The port is most easily used when porting POSIX applications to Symbian
-OS using P.I.P.S. (a.k.a. Open C).
-
-libcurl is built as a standard Symbian ordinal-linked DLL, and curl is
-built as a text mode EXE application. They have not been Symbian
-Signed, which is required in order to install them on most phones.
-
-Following are some things to keep in mind when using this port.
-
-
-curl notes
-----------
-When starting curl in the Windows emulator from the Windows command-line,
-place a double-dash -- before the first curl command-line option.
-e.g. \epoc32\release\winscw\udeb\curl -- -v http://localhost/
-Failure to do so may mean that some of your options won't be correctly
-processed.
-
-Symbian's ESHELL allows for redirecting stdin and stdout to files, but
-stderr goes to the epocwind.out file (on the emulator). The standard
-curl options -o, --stderr and --trace-ascii can be used to
-redirect output to a file (or stdout) instead.
-
-P.I.P.S. doesn't inherit the current working directory at startup from
-the shell, so relative path names are always relative to
-C:\Private\f0206442\.
-
-P.I.P.S. provides no way to disable echoing of characters as they are
-entered, so passwords typed in on the console will be visible. It also
-line buffers keyboard input so interactive telnet sessions are not very
-feasible.
-
-All screen output disappears after curl exits, so after a command completes,
-curl waits by default for Enter to be pressed before exiting. This behaviour
-is suppressed when the -s option is given.
-
-curl's "home directory" in Symbian is C:\Private\f0206442\. The .curlrc file
-is read from this directory on startup.
-
-
-libcurl notes
--------------
-libcurl uses writable static data, so the EPOCALLOWDLLDATA option is
-used in its MMP file, with the corresponding additional memory usage
-and limitations on the Windows emulator.
-
-curl_global_init() *must* be called (either explicitly or implicitly through
-calling certain other libcurl functions) before any libcurl functions
-that could allocate memory (like curl_getenv()).
-
-P.I.P.S. doesn't support signals or the alarm() call, so some timeouts
-(such as the connect timeout) are not honoured. This should not be
-an issue once support for CURLRES_THREADED is added for Symbian.
-
-P.I.P.S. causes a USER:87 panic if certain timeouts much longer than
-half an hour are selected.
-
-LDAP, SCP or SFTP methods are not supported due to lack of support for
-the dependent libraries on Symbian.
-
-gzip and deflate decompression is supported when the appropriate macro
-is uncommented in the libcurl.mmp file.
-
-SSL/TLS encryption is not enabled by default, but it is possible to add
-when the OpenSSL libraries included in the S60 Open C SDK are available.
-The appropriate macro in the libcurl.mmp file must be uncommented to
-enable support.
-
-NTLM authentication may not work on some servers due to the lack of
-MD4 support in the OpenSSL libraries included with Open C.
-
-Debug builds are not supported (i.e. --enable-debug) because they cause
-additional symbol exports in the library which are not frozen in the .def
-files.
-
-
-Dan Fandrich
-dan@coneharvesters.com
-March 2010
diff --git a/packages/TPF/curl.mak b/packages/TPF/curl.mak
index 176abec24..d8d55a805 100644
--- a/packages/TPF/curl.mak
+++ b/packages/TPF/curl.mak
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#######################################################################
# #
# MAKEFILE NAME..... curl.mak #
diff --git a/packages/TPF/maketpf.env_curl b/packages/TPF/maketpf.env_curl
index 3ebf1d189..ac460438e 100644
--- a/packages/TPF/maketpf.env_curl
+++ b/packages/TPF/maketpf.env_curl
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
################################################################################
################################################################################
#env TPF CURL Includes
diff --git a/packages/TPF/maketpf.env_curllib b/packages/TPF/maketpf.env_curllib
index 30cc3169e..613619bdc 100644
--- a/packages/TPF/maketpf.env_curllib
+++ b/packages/TPF/maketpf.env_curllib
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
################################################################################
################################################################################
#env TPF CURL Library Source and Output
diff --git a/packages/vms/Makefile.am b/packages/vms/Makefile.am
index 38f65859a..f5cf9a93f 100644
--- a/packages/vms/Makefile.am
+++ b/packages/vms/Makefile.am
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
EXTRA_DIST = \
backup_gnv_curl_src.com \
build_curl-config_script.com \
diff --git a/packages/vms/backup_gnv_curl_src.com b/packages/vms/backup_gnv_curl_src.com
index 38575710b..fcf3061c2 100644
--- a/packages/vms/backup_gnv_curl_src.com
+++ b/packages/vms/backup_gnv_curl_src.com
@@ -17,7 +17,7 @@ $! This file is created from a template file for the purpose of making it
$! easier to port Unix code, particularly open source code to VMS.
$! Therefore permission is freely granted for any use.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/build_gnv_curl.com b/packages/vms/build_gnv_curl.com
index 1eaa7d5f3..ede38548d 100644
--- a/packages/vms/build_gnv_curl.com
+++ b/packages/vms/build_gnv_curl.com
@@ -4,7 +4,7 @@ $! $Id$
$!
$! All in one build procedure
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/build_gnv_curl_pcsi_desc.com b/packages/vms/build_gnv_curl_pcsi_desc.com
index fab2c823c..941875ab4 100644
--- a/packages/vms/build_gnv_curl_pcsi_desc.com
+++ b/packages/vms/build_gnv_curl_pcsi_desc.com
@@ -31,7 +31,7 @@ $! A rename action section is needed to make sure that the files are
$! created in the GNV$GNU: in the correct case, and to create the alias
$! link [usr.bin]curl. for [usr.bin]curl.exe.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/build_gnv_curl_pcsi_text.com b/packages/vms/build_gnv_curl_pcsi_text.com
index df98f6301..94ca7eb44 100644
--- a/packages/vms/build_gnv_curl_pcsi_text.com
+++ b/packages/vms/build_gnv_curl_pcsi_text.com
@@ -12,7 +12,7 @@ $! 4. Generated Producer section.
$!
$! Set the name of the release notes from the GNV_PCSI_FILENAME_BASE
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/build_gnv_curl_release_notes.com b/packages/vms/build_gnv_curl_release_notes.com
index da0276f58..8342ef978 100644
--- a/packages/vms/build_gnv_curl_release_notes.com
+++ b/packages/vms/build_gnv_curl_release_notes.com
@@ -11,7 +11,7 @@ $!
$! Set the name of the release notes from the GNV_PCSI_FILENAME_BASE
$! logical name.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/build_libcurl_pc.com b/packages/vms/build_libcurl_pc.com
index 97e6ae643..5b2315e2a 100644
--- a/packages/vms/build_libcurl_pc.com
+++ b/packages/vms/build_libcurl_pc.com
@@ -4,7 +4,7 @@ $! $Id:$
$!
$! Build the libcurl.pc file from the libcurl.pc.in file
$!
-$! Copyright 2013, John Malmberg
+$! Copyright 2013 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/build_vms.com b/packages/vms/build_vms.com
index e21e57c47..1b023649f 100644
--- a/packages/vms/build_vms.com
+++ b/packages/vms/build_vms.com
@@ -133,7 +133,7 @@ $! for non-VAX architectures that triggered link failure.
$! Replaced curl_sys_inc with sys_inc.
$! 19-Mar-2013, John Malmberg
$! symbol tool_main needs to be quoted when parse style is
-$! set to exended in versions of VMS greater than 7.3-1.
+$! set to extended in versions of VMS greater than 7.3-1.
$! Remove curlbuild.h generation as it should be pre-built
$! in the curl release or daily tarball.
$! 12-Jul-2013, John Malmberg
diff --git a/packages/vms/clean_gnv_curl.com b/packages/vms/clean_gnv_curl.com
index 4e58356b1..5846739e4 100644
--- a/packages/vms/clean_gnv_curl.com
+++ b/packages/vms/clean_gnv_curl.com
@@ -15,7 +15,7 @@ $! Parameter P1: REALCLEAN
$! This removes all build products and brings the environment back to
$! the point where the gnv_curl_configure.sh procedure needs to be run again.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/compare_curl_source.com b/packages/vms/compare_curl_source.com
index eeaec31dc..a720afc63 100644
--- a/packages/vms/compare_curl_source.com
+++ b/packages/vms/compare_curl_source.com
@@ -17,7 +17,7 @@ $! me because VMS Backup can create a saveset of files from a
$! NFS mounted volume.
$!
$! First the files in the original source directory which is assumed to be
-$! under source codde control are compared with the copy directory.
+$! under source code control are compared with the copy directory.
$!
$! Then the files are are only in the copy directory are listed.
$!
@@ -69,7 +69,7 @@ $!
$! This is to make sure that the backup save set for the unmodified
$! source is up to date.
$!
-$! Copyright 2011, John Malmberg
+$! Copyright 2011 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/config_h.com b/packages/vms/config_h.com
index 967eb40de..4049d9f06 100644
--- a/packages/vms/config_h.com
+++ b/packages/vms/config_h.com
@@ -28,7 +28,7 @@ $!
$! This procedure may not guess the options correctly for all architectures,
$! and is a work in progress.
$!
-$! Copyright 2011, John Malmberg
+$! Copyright 2011 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
@@ -803,28 +803,6 @@ $ write tf "#endif"
$ goto cfgh_in_loop1
$ endif
$!
-$ if key2 .eqs. "HAVE_ENGINE_LOAD_BUILTIN_ENGINES"
-$ then
-$ if f$search("''ssl_header_dir'engine.h") .nes. ""
-$ then
-$ search_key = key2 - "HAVE_"
-$ define/user sys$output nl:
-$ define/user sys$error nl:
-$ search/output=nl: 'ssl_header_dir'engine.h 'search_key'
-$ if '$severity' .eq. 1
-$ then
-$ write tf "#ifndef ''key2'"
-$ write tf "#define ''key2' 1"
-$ write tf "#endif"
-$ else
-$ write tf "/* #undef ''key2' */"
-$ endif
-$ else
-$ write tf "/* #undef ''key2' */"
-$ endif
-$ goto cfgh_in_loop1
-$ endif
-$!
$ if key2b .eqs. "RAND" .and. key2c .nes. "" .and. key2d .eqs. ""
$ then
$ if (key2c .eqs. "EGD") .or. -
diff --git a/packages/vms/curl_crtl_init.c b/packages/vms/curl_crtl_init.c
index 7a8d84743..b8e5f7f50 100644
--- a/packages/vms/curl_crtl_init.c
+++ b/packages/vms/curl_crtl_init.c
@@ -1,7 +1,28 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
/* File: curl_crtl_init.c
*
* This file makes sure that the DECC Unix settings are correct for
- * the mode the the program is run in.
+ * the mode the program is run in.
*
* The CRTL has not been initialized at the time that these routines
* are called, so many routines can not be called.
diff --git a/packages/vms/curl_gnv_build_steps.txt b/packages/vms/curl_gnv_build_steps.txt
index 9072b20a2..52dc32881 100644
--- a/packages/vms/curl_gnv_build_steps.txt
+++ b/packages/vms/curl_gnv_build_steps.txt
@@ -1,6 +1,6 @@
From File: curl_gnv_build_steps.txt
- Copyright 2009, John Malmberg
+ Copyright 2009 - 2020, John Malmberg
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -125,7 +125,7 @@ or
$ @build_gnv_curl.com.
The GNV configure procedure takes considerably longer than the DCL build
-procecure takes. It is of use for testing the GNV build environment, and
+procedure takes. It is of use for testing the GNV build environment, and
may not have been kept up to date.
The pcsi_product_gnv_curl.com needs the following logical names which
diff --git a/packages/vms/curl_startup.com b/packages/vms/curl_startup.com
index 84760a0af..b94ee7f44 100644
--- a/packages/vms/curl_startup.com
+++ b/packages/vms/curl_startup.com
@@ -5,7 +5,7 @@ $!
$! Procedure to setup the CURL libraries for use by programs from the
$! VMS SYSTARTUP*.COM procedure.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/curlmsg.h b/packages/vms/curlmsg.h
index 424a382f0..55c9ee5cb 100644
--- a/packages/vms/curlmsg.h
+++ b/packages/vms/curlmsg.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/packages/vms/curlmsg.msg b/packages/vms/curlmsg.msg
index 492657c02..73bc763e8 100644
--- a/packages/vms/curlmsg.msg
+++ b/packages/vms/curlmsg.msg
@@ -1,3 +1,24 @@
+!***************************************************************************
+! _ _ ____ _
+! Project ___| | | | _ \| |
+! / __| | | | |_) | |
+! | (__| |_| | _ <| |___
+! \___|\___/|_| \_\_____|
+!
+! Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+!
+! This software is licensed as described in the file COPYING, which
+! you should have received as part of this distribution. The terms
+! are also available at https://curl.haxx.se/docs/copyright.html.
+!
+! You may opt to use, copy, modify, merge, publish, distribute and/or sell
+! copies of the Software, and permit persons to whom the Software is
+! furnished to do so, under the terms of the COPYING file.
+!
+! This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+! KIND, either express or implied.
+!
+!##########################################################################
!
! These VMS error codes are generated by taking apart the curl.h
! file and putting all the CURLE_* enum stuff into this file,
diff --git a/packages/vms/curlmsg_vms.h b/packages/vms/curlmsg_vms.h
index b7ff7a0cb..9dbc6ab71 100644
--- a/packages/vms/curlmsg_vms.h
+++ b/packages/vms/curlmsg_vms.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/packages/vms/generate_config_vms_h_curl.com b/packages/vms/generate_config_vms_h_curl.com
index 62870da5e..6c65b24cb 100644
--- a/packages/vms/generate_config_vms_h_curl.com
+++ b/packages/vms/generate_config_vms_h_curl.com
@@ -17,7 +17,7 @@ $! and the [.lib]config-vms.h file do two different tasks and that the
$! filenames are slightly different.
$!
$!
-$! Copyright 2013, John Malmberg
+$! Copyright 2013 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
@@ -325,8 +325,8 @@ $! configure defaults to USE_*, a real configure on VMS chooses different.
$write cvh "#ifdef USE_ARES"
$write cvh "#undef USE_ARES"
$write cvh "#endif"
-$write cvh "#ifdef USE_CYASSL"
-$write cvh "#undef USE_CYASSL"
+$write cvh "#ifdef USE_WOLFSSL"
+$write cvh "#undef USE_WOLFSSL"
$write cvh "#endif"
$write cvh "#ifdef USE_GNUTLS"
$write cvh "#undef USE_GNUTLS"
@@ -349,9 +349,6 @@ $write cvh "#endif"
$write cvh "#ifdef USE_OPENLDAP"
$write cvh "#undef USE_OPENLDAP"
$write cvh "#endif"
-$write cvh "#ifdef USE_POLARSSL"
-$write cvh "#undef USE_POLARSSL"
-$write cvh "#endif"
$write cvh "#ifdef USE_THREADS_POSIX"
$write cvh "#undef USE_THREADS_POSIX"
$write cvh "#endif"
diff --git a/packages/vms/generate_vax_transfer.com b/packages/vms/generate_vax_transfer.com
index 92391f92e..00020810f 100644
--- a/packages/vms/generate_vax_transfer.com
+++ b/packages/vms/generate_vax_transfer.com
@@ -14,7 +14,7 @@ $! gnv_libcurl_xfer.obj
$! gnv_libcurl_xfer.opt
$! macro32_exactcase.exe
$!
-$! Copyright 2013, John Malmberg
+$! Copyright 2013 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/gnv_conftest.c_first b/packages/vms/gnv_conftest.c_first
index f47469c5b..1d69600a2 100644
--- a/packages/vms/gnv_conftest.c_first
+++ b/packages/vms/gnv_conftest.c_first
@@ -2,7 +2,7 @@
*
* $Id$
*
- * Copyright 2009, John Malmberg
+ * Copyright 2009 - 2020, John Malmberg
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/gnv_curl_configure.sh b/packages/vms/gnv_curl_configure.sh
index 2eeb209c8..839a40bff 100644
--- a/packages/vms/gnv_curl_configure.sh
+++ b/packages/vms/gnv_curl_configure.sh
@@ -5,7 +5,7 @@
# Set up and run the configure script for Curl so that it can find the
# proper options for VMS.
#
-# Copyright 2009, John Malmberg
+# Copyright 2009 - 2020, John Malmberg
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/gnv_libcurl_symbols.opt b/packages/vms/gnv_libcurl_symbols.opt
index 84655926c..cae2a754b 100644
--- a/packages/vms/gnv_libcurl_symbols.opt
+++ b/packages/vms/gnv_libcurl_symbols.opt
@@ -41,7 +41,7 @@
! maintaining multiple versions as long as the routine can be called with
! the old number of parameters.
!
-! Copyright 2009, John Malmberg
+! Copyright 2009 - 2020, John Malmberg
!
! Permission to use, copy, modify, and/or distribute this software for any
! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/gnv_link_curl.com b/packages/vms/gnv_link_curl.com
index 7ec4ecb09..c9db8d90d 100644
--- a/packages/vms/gnv_link_curl.com
+++ b/packages/vms/gnv_link_curl.com
@@ -4,7 +4,7 @@ $! $Id$
$!
$! File to build images using gnv$libcurl.exe
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/make_gnv_curl_install.sh b/packages/vms/make_gnv_curl_install.sh
index 5099fe447..699c8d2f2 100644
--- a/packages/vms/make_gnv_curl_install.sh
+++ b/packages/vms/make_gnv_curl_install.sh
@@ -7,7 +7,7 @@
# This makes the library, the curl binary and attempts an install.
# A search list should be set up for GNU (GNV$GNU).
#
-# Copyright 2009, John Malmberg
+# Copyright 2009 - 2020, John Malmberg
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/make_pcsi_curl_kit_name.com b/packages/vms/make_pcsi_curl_kit_name.com
index f644fe3ec..2061429ae 100644
--- a/packages/vms/make_pcsi_curl_kit_name.com
+++ b/packages/vms/make_pcsi_curl_kit_name.com
@@ -8,7 +8,7 @@ $!
$! The results are stored in as logical names so that other procedures
$! can use them.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/pcsi_gnv_curl_file_list.txt b/packages/vms/pcsi_gnv_curl_file_list.txt
index 07539b2cd..6eb69c384 100644
--- a/packages/vms/pcsi_gnv_curl_file_list.txt
+++ b/packages/vms/pcsi_gnv_curl_file_list.txt
@@ -15,7 +15,7 @@
!
! [xxx.yyy]file.ext is a file for the rename and add phases.
!
-! Copyright 2009, John Malmberg
+! Copyright 2009 - 2020, John Malmberg
!
! Permission to use, copy, modify, and/or distribute this software for any
! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/pcsi_product_gnv_curl.com b/packages/vms/pcsi_product_gnv_curl.com
index 747cbd63a..0f9961f49 100644
--- a/packages/vms/pcsi_product_gnv_curl.com
+++ b/packages/vms/pcsi_product_gnv_curl.com
@@ -5,7 +5,7 @@ $!
$! This command file packages up the product CURL into a sequential
$! format kit
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/readme b/packages/vms/readme
index ddfac747a..be1278fca 100644
--- a/packages/vms/readme
+++ b/packages/vms/readme
@@ -194,7 +194,7 @@ LDAP and Kerberos installed, you can use the GNV_LINK_CURL.COM file.
The GNV_LINK_CURL.COM contains information on how to link and run with a newer
version of HP SSL than what may be install on an Alpha or IA64 based system.
-To build the PCSI kit, follow the the instructions in the file
+To build the PCSI kit, follow the instructions in the file
curl_gnv_build_steps.txt.
Other Notes:
@@ -206,7 +206,7 @@ The libcurl formdata.c module and Curl tools post form now have some
understanding of VMS file types. Files will be posted in STREAM_LF format.
The Curl tool now has some understanding of VMS file types and will upload the
-files in STREAM_LF fomat.
+files in STREAM_LF format.
When CURL is uploading a VARIABLE format VMS file, it is less efficient as in
order to get the file size, it will first read the entire file once, and then
diff --git a/packages/vms/setup_gnv_curl_build.com b/packages/vms/setup_gnv_curl_build.com
index 03d5c0b4d..45dcf0fb8 100644
--- a/packages/vms/setup_gnv_curl_build.com
+++ b/packages/vms/setup_gnv_curl_build.com
@@ -7,7 +7,7 @@ $!
$! GNV needs some files moved into the other directories to help with
$! the configure script and the build.
$!
-$! Copyright 2009, John Malmberg
+$! Copyright 2009 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/stage_curl_install.com b/packages/vms/stage_curl_install.com
index 84540d739..d79c9e33e 100644
--- a/packages/vms/stage_curl_install.com
+++ b/packages/vms/stage_curl_install.com
@@ -24,7 +24,7 @@ $! [usr.share.man.man3]curl*.3
$! [usr.share.man.man3]libcurl*.3
$! Future: A symbolic link to the release notes?
$!
-$! Copyright 2012, John Malmberg
+$! Copyright 2012 - 2020, John Malmberg
$!
$! Permission to use, copy, modify, and/or distribute this software for any
$! purpose with or without fee is hereby granted, provided that the above
diff --git a/packages/vms/vms_eco_level.h b/packages/vms/vms_eco_level.h
index 354875bbb..05abe9101 100644
--- a/packages/vms/vms_eco_level.h
+++ b/packages/vms/vms_eco_level.h
@@ -2,7 +2,7 @@
*
* $Id$
*
- * Copyright 2012, John Malmberg
+ * Copyright 2012 - 2020, John Malmberg
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
diff --git a/plan9/BUILD.PLAN9.txt b/plan9/README
index 6df23d31a..6df23d31a 100644
--- a/plan9/BUILD.PLAN9.txt
+++ b/plan9/README
diff --git a/projects/Windows/VC10/curl-all.sln b/projects/Windows/VC10/curl-all.sln
index 7bd131c35..bdd2e662a 100644
--- a/projects/Windows/VC10/curl-all.sln
+++ b/projects/Windows/VC10/curl-all.sln
@@ -1,298 +1,298 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC10/lib/libcurl.sln b/projects/Windows/VC10/lib/libcurl.sln
index 15461ef9a..159ab7d0f 100644
--- a/projects/Windows/VC10/lib/libcurl.sln
+++ b/projects/Windows/VC10/lib/libcurl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC10/lib/libcurl.vcxproj b/projects/Windows/VC10/lib/libcurl.vcxproj
index 3765afd04..e346e4b35 100644
--- a/projects/Windows/VC10/lib/libcurl.vcxproj
+++ b/projects/Windows/VC10/lib/libcurl.vcxproj
@@ -896,7 +896,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -963,7 +963,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1029,7 +1029,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1094,7 +1094,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1138,7 +1138,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1184,7 +1184,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1225,7 +1225,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1271,7 +1271,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1310,7 +1310,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1344,7 +1344,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1377,7 +1377,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1409,7 +1409,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -1700,7 +1700,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1734,7 +1734,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1767,7 +1767,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1799,7 +1799,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -2353,7 +2353,10 @@
<ClCompile Include="..\..\..\..\lib\dict.c" />
<ClCompile Include="..\..\..\..\lib\doh.c" />
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2391,6 +2394,7 @@
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
<ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
+ <ClCompile Include="..\..\..\..\lib\mqtt.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
<ClCompile Include="..\..\..\..\lib\non-ascii.c" />
@@ -2402,8 +2406,8 @@
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
<ClCompile Include="..\..\..\..\lib\rand.c" />
+ <ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2431,6 +2435,7 @@
<ClCompile Include="..\..\..\..\lib\urlapi.c" />
<ClCompile Include="..\..\..\..\lib\url.c" />
<ClCompile Include="..\..\..\..\lib\version.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\lib\wildcard.c" />
<ClCompile Include="..\..\..\..\lib\x509asn1.c" />
@@ -2446,14 +2451,21 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\vquic.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\wolfssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\keylog.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\mbedtls_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mesalink.c" />
<ClCompile Include="..\..\..\..\lib\vtls\nss.c" />
<ClCompile Include="..\..\..\..\lib\vtls\openssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
@@ -2480,6 +2492,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2493,7 +2506,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2503,7 +2515,9 @@
<ClInclude Include="..\..\..\..\lib\dict.h" />
<ClInclude Include="..\..\..\..\lib\doh.h" />
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
@@ -2529,6 +2543,7 @@
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
<ClInclude Include="..\..\..\..\lib\mime.h" />
+ <ClInclude Include="..\..\..\..\lib\mqtt.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2541,6 +2556,7 @@
<ClInclude Include="..\..\..\..\lib\psl.h" />
<ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
+ <ClInclude Include="..\..\..\..\lib\rename.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
@@ -2556,7 +2572,6 @@
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
- <ClInclude Include="..\..\..\..\lib\ssh.h" />
<ClInclude Include="..\..\..\..\lib\strcase.h" />
<ClInclude Include="..\..\..\..\lib\strdup.h" />
<ClInclude Include="..\..\..\..\lib\strerror.h" />
@@ -2570,20 +2585,26 @@
<ClInclude Include="..\..\..\..\lib\urlapi-int.h" />
<ClInclude Include="..\..\..\..\lib\urldata.h" />
<ClInclude Include="..\..\..\..\lib\url.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\lib\wildcard.h" />
<ClInclude Include="..\..\..\..\lib\x509asn1.h" />
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\vquic.h" />
+ <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\keylog.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\mbedtls_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mesalink.h" />
<ClInclude Include="..\..\..\..\lib\vtls\nssg.h" />
<ClInclude Include="..\..\..\..\lib\vtls\openssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
diff --git a/projects/Windows/VC10/src/curl.sln b/projects/Windows/VC10/src/curl.sln
index 131f27b7a..31bcc14c2 100644
--- a/projects/Windows/VC10/src/curl.sln
+++ b/projects/Windows/VC10/src/curl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC10/src/curl.vcxproj b/projects/Windows/VC10/src/curl.vcxproj
index a4dfabca7..ee3bf7894 100644
--- a/projects/Windows/VC10/src/curl.vcxproj
+++ b/projects/Windows/VC10/src/curl.vcxproj
@@ -2160,7 +2160,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2192,7 +2192,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2223,7 +2223,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2253,7 +2253,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2282,7 +2282,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2314,7 +2314,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2345,7 +2345,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2375,7 +2375,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC10\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC10\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC10\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2628,8 +2628,11 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
+ <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\src\slist_wc.c" />
<ClCompile Include="..\..\..\..\src\tool_binmode.c" />
@@ -2670,14 +2673,18 @@
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
+ <ClCompile Include="..\..\..\..\src\tool_writeout_json.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\config-win32.h" />
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\src\slist_wc.h" />
<ClInclude Include="..\..\..\..\src\tool_binmode.h" />
@@ -2721,6 +2728,7 @@
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
+ <ClInclude Include="..\..\..\..\src\tool_writeout_json.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
<ItemGroup>
diff --git a/projects/Windows/VC11/curl-all.sln b/projects/Windows/VC11/curl-all.sln
index bec0ad84c..4bc4caeb7 100644
--- a/projects/Windows/VC11/curl-all.sln
+++ b/projects/Windows/VC11/curl-all.sln
@@ -1,298 +1,298 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC11/lib/libcurl.sln b/projects/Windows/VC11/lib/libcurl.sln
index 780dc91a2..34c1dd225 100644
--- a/projects/Windows/VC11/lib/libcurl.sln
+++ b/projects/Windows/VC11/lib/libcurl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC11/lib/libcurl.vcxproj b/projects/Windows/VC11/lib/libcurl.vcxproj
index 595e4f7eb..a937b95cd 100644
--- a/projects/Windows/VC11/lib/libcurl.vcxproj
+++ b/projects/Windows/VC11/lib/libcurl.vcxproj
@@ -952,7 +952,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1019,7 +1019,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1085,7 +1085,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1150,7 +1150,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1194,7 +1194,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1240,7 +1240,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1281,7 +1281,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1327,7 +1327,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1366,7 +1366,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1400,7 +1400,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1433,7 +1433,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1465,7 +1465,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -1756,7 +1756,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1790,7 +1790,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1823,7 +1823,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1855,7 +1855,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -2409,7 +2409,10 @@
<ClCompile Include="..\..\..\..\lib\dict.c" />
<ClCompile Include="..\..\..\..\lib\doh.c" />
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2447,6 +2450,7 @@
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
<ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
+ <ClCompile Include="..\..\..\..\lib\mqtt.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
<ClCompile Include="..\..\..\..\lib\non-ascii.c" />
@@ -2458,8 +2462,8 @@
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
<ClCompile Include="..\..\..\..\lib\rand.c" />
+ <ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2487,6 +2491,7 @@
<ClCompile Include="..\..\..\..\lib\urlapi.c" />
<ClCompile Include="..\..\..\..\lib\url.c" />
<ClCompile Include="..\..\..\..\lib\version.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\lib\wildcard.c" />
<ClCompile Include="..\..\..\..\lib\x509asn1.c" />
@@ -2502,14 +2507,21 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\vquic.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\wolfssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\keylog.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\mbedtls_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mesalink.c" />
<ClCompile Include="..\..\..\..\lib\vtls\nss.c" />
<ClCompile Include="..\..\..\..\lib\vtls\openssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
@@ -2536,6 +2548,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2549,7 +2562,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2559,7 +2571,9 @@
<ClInclude Include="..\..\..\..\lib\dict.h" />
<ClInclude Include="..\..\..\..\lib\doh.h" />
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
@@ -2585,6 +2599,7 @@
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
<ClInclude Include="..\..\..\..\lib\mime.h" />
+ <ClInclude Include="..\..\..\..\lib\mqtt.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2597,6 +2612,7 @@
<ClInclude Include="..\..\..\..\lib\psl.h" />
<ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
+ <ClInclude Include="..\..\..\..\lib\rename.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
@@ -2612,7 +2628,6 @@
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
- <ClInclude Include="..\..\..\..\lib\ssh.h" />
<ClInclude Include="..\..\..\..\lib\strcase.h" />
<ClInclude Include="..\..\..\..\lib\strdup.h" />
<ClInclude Include="..\..\..\..\lib\strerror.h" />
@@ -2626,20 +2641,26 @@
<ClInclude Include="..\..\..\..\lib\urlapi-int.h" />
<ClInclude Include="..\..\..\..\lib\urldata.h" />
<ClInclude Include="..\..\..\..\lib\url.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\lib\wildcard.h" />
<ClInclude Include="..\..\..\..\lib\x509asn1.h" />
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\vquic.h" />
+ <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\keylog.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\mbedtls_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mesalink.h" />
<ClInclude Include="..\..\..\..\lib\vtls\nssg.h" />
<ClInclude Include="..\..\..\..\lib\vtls\openssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
diff --git a/projects/Windows/VC11/src/curl.sln b/projects/Windows/VC11/src/curl.sln
index e12253e9b..31fff6863 100644
--- a/projects/Windows/VC11/src/curl.sln
+++ b/projects/Windows/VC11/src/curl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC11/src/curl.vcxproj b/projects/Windows/VC11/src/curl.vcxproj
index 0c9adcbc6..00c2b095b 100644
--- a/projects/Windows/VC11/src/curl.vcxproj
+++ b/projects/Windows/VC11/src/curl.vcxproj
@@ -2216,7 +2216,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2248,7 +2248,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2279,7 +2279,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2309,7 +2309,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2338,7 +2338,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2370,7 +2370,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2401,7 +2401,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2431,7 +2431,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC11\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC11\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC11\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2684,8 +2684,11 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
+ <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\src\slist_wc.c" />
<ClCompile Include="..\..\..\..\src\tool_binmode.c" />
@@ -2726,14 +2729,18 @@
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
+ <ClCompile Include="..\..\..\..\src\tool_writeout_json.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\config-win32.h" />
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\src\slist_wc.h" />
<ClInclude Include="..\..\..\..\src\tool_binmode.h" />
@@ -2777,6 +2784,7 @@
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
+ <ClInclude Include="..\..\..\..\src\tool_writeout_json.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
<ItemGroup>
diff --git a/projects/Windows/VC12/curl-all.sln b/projects/Windows/VC12/curl-all.sln
index 38b33e6f5..1557b9e3b 100644
--- a/projects/Windows/VC12/curl-all.sln
+++ b/projects/Windows/VC12/curl-all.sln
@@ -1,298 +1,298 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC12/lib/libcurl.sln b/projects/Windows/VC12/lib/libcurl.sln
index 860a06028..4d690de53 100644
--- a/projects/Windows/VC12/lib/libcurl.sln
+++ b/projects/Windows/VC12/lib/libcurl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC12/lib/libcurl.vcxproj b/projects/Windows/VC12/lib/libcurl.vcxproj
index 2321d70ee..ed379af05 100644
--- a/projects/Windows/VC12/lib/libcurl.vcxproj
+++ b/projects/Windows/VC12/lib/libcurl.vcxproj
@@ -952,7 +952,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1019,7 +1019,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1085,7 +1085,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1150,7 +1150,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1194,7 +1194,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1240,7 +1240,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1281,7 +1281,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1327,7 +1327,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1366,7 +1366,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1400,7 +1400,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1433,7 +1433,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1465,7 +1465,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -1756,7 +1756,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1790,7 +1790,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1823,7 +1823,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1855,7 +1855,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -2409,7 +2409,10 @@
<ClCompile Include="..\..\..\..\lib\dict.c" />
<ClCompile Include="..\..\..\..\lib\doh.c" />
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2447,6 +2450,7 @@
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
<ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
+ <ClCompile Include="..\..\..\..\lib\mqtt.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
<ClCompile Include="..\..\..\..\lib\non-ascii.c" />
@@ -2458,8 +2462,8 @@
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
<ClCompile Include="..\..\..\..\lib\rand.c" />
+ <ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2487,6 +2491,7 @@
<ClCompile Include="..\..\..\..\lib\urlapi.c" />
<ClCompile Include="..\..\..\..\lib\url.c" />
<ClCompile Include="..\..\..\..\lib\version.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\lib\wildcard.c" />
<ClCompile Include="..\..\..\..\lib\x509asn1.c" />
@@ -2502,14 +2507,21 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\vquic.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\wolfssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\keylog.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\mbedtls_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mesalink.c" />
<ClCompile Include="..\..\..\..\lib\vtls\nss.c" />
<ClCompile Include="..\..\..\..\lib\vtls\openssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
@@ -2536,6 +2548,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2549,7 +2562,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2559,7 +2571,9 @@
<ClInclude Include="..\..\..\..\lib\dict.h" />
<ClInclude Include="..\..\..\..\lib\doh.h" />
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
@@ -2585,6 +2599,7 @@
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
<ClInclude Include="..\..\..\..\lib\mime.h" />
+ <ClInclude Include="..\..\..\..\lib\mqtt.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2597,6 +2612,7 @@
<ClInclude Include="..\..\..\..\lib\psl.h" />
<ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
+ <ClInclude Include="..\..\..\..\lib\rename.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
@@ -2612,7 +2628,6 @@
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
- <ClInclude Include="..\..\..\..\lib\ssh.h" />
<ClInclude Include="..\..\..\..\lib\strcase.h" />
<ClInclude Include="..\..\..\..\lib\strdup.h" />
<ClInclude Include="..\..\..\..\lib\strerror.h" />
@@ -2626,20 +2641,26 @@
<ClInclude Include="..\..\..\..\lib\urlapi-int.h" />
<ClInclude Include="..\..\..\..\lib\urldata.h" />
<ClInclude Include="..\..\..\..\lib\url.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\lib\wildcard.h" />
<ClInclude Include="..\..\..\..\lib\x509asn1.h" />
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\vquic.h" />
+ <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\keylog.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\mbedtls_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mesalink.h" />
<ClInclude Include="..\..\..\..\lib\vtls\nssg.h" />
<ClInclude Include="..\..\..\..\lib\vtls\openssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
diff --git a/projects/Windows/VC12/src/curl.sln b/projects/Windows/VC12/src/curl.sln
index 7b5244c1f..d4e38dc59 100644
--- a/projects/Windows/VC12/src/curl.sln
+++ b/projects/Windows/VC12/src/curl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC12/src/curl.vcxproj b/projects/Windows/VC12/src/curl.vcxproj
index c03c56deb..bb6b5c041 100644
--- a/projects/Windows/VC12/src/curl.vcxproj
+++ b/projects/Windows/VC12/src/curl.vcxproj
@@ -2216,7 +2216,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2248,7 +2248,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2279,7 +2279,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2309,7 +2309,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2338,7 +2338,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2370,7 +2370,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2401,7 +2401,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2431,7 +2431,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC12\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC12\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC12\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2684,8 +2684,11 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
+ <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\src\slist_wc.c" />
<ClCompile Include="..\..\..\..\src\tool_binmode.c" />
@@ -2726,14 +2729,18 @@
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
+ <ClCompile Include="..\..\..\..\src\tool_writeout_json.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\config-win32.h" />
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\src\slist_wc.h" />
<ClInclude Include="..\..\..\..\src\tool_binmode.h" />
@@ -2777,6 +2784,7 @@
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
+ <ClInclude Include="..\..\..\..\src\tool_writeout_json.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
<ItemGroup>
diff --git a/projects/Windows/VC14/curl-all.sln b/projects/Windows/VC14/curl-all.sln
index 05820e1f4..02bccc521 100644
--- a/projects/Windows/VC14/curl-all.sln
+++ b/projects/Windows/VC14/curl-all.sln
@@ -1,298 +1,298 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2015
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC14/lib/libcurl.sln b/projects/Windows/VC14/lib/libcurl.sln
index cd8afe248..f768b6d39 100644
--- a/projects/Windows/VC14/lib/libcurl.sln
+++ b/projects/Windows/VC14/lib/libcurl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2015
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC14/lib/libcurl.vcxproj b/projects/Windows/VC14/lib/libcurl.vcxproj
index b57db7aaa..3bc619152 100644
--- a/projects/Windows/VC14/lib/libcurl.vcxproj
+++ b/projects/Windows/VC14/lib/libcurl.vcxproj
@@ -952,7 +952,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1019,7 +1019,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1085,7 +1085,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1150,7 +1150,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1194,7 +1194,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1240,7 +1240,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -1281,7 +1281,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1327,7 +1327,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1366,7 +1366,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1400,7 +1400,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1433,7 +1433,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1465,7 +1465,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -1756,7 +1756,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC14\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1790,7 +1790,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC14\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1823,7 +1823,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC14\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1855,7 +1855,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC14\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -2409,7 +2409,10 @@
<ClCompile Include="..\..\..\..\lib\dict.c" />
<ClCompile Include="..\..\..\..\lib\doh.c" />
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2447,6 +2450,7 @@
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
<ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
+ <ClCompile Include="..\..\..\..\lib\mqtt.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
<ClCompile Include="..\..\..\..\lib\non-ascii.c" />
@@ -2458,8 +2462,8 @@
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
<ClCompile Include="..\..\..\..\lib\rand.c" />
+ <ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2487,6 +2491,7 @@
<ClCompile Include="..\..\..\..\lib\urlapi.c" />
<ClCompile Include="..\..\..\..\lib\url.c" />
<ClCompile Include="..\..\..\..\lib\version.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\lib\wildcard.c" />
<ClCompile Include="..\..\..\..\lib\x509asn1.c" />
@@ -2502,14 +2507,21 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\vquic.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\wolfssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\keylog.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\mbedtls_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mesalink.c" />
<ClCompile Include="..\..\..\..\lib\vtls\nss.c" />
<ClCompile Include="..\..\..\..\lib\vtls\openssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
@@ -2536,6 +2548,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2549,7 +2562,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2559,7 +2571,9 @@
<ClInclude Include="..\..\..\..\lib\dict.h" />
<ClInclude Include="..\..\..\..\lib\doh.h" />
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
@@ -2585,6 +2599,7 @@
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
<ClInclude Include="..\..\..\..\lib\mime.h" />
+ <ClInclude Include="..\..\..\..\lib\mqtt.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2597,6 +2612,7 @@
<ClInclude Include="..\..\..\..\lib\psl.h" />
<ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
+ <ClInclude Include="..\..\..\..\lib\rename.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
@@ -2612,7 +2628,6 @@
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
- <ClInclude Include="..\..\..\..\lib\ssh.h" />
<ClInclude Include="..\..\..\..\lib\strcase.h" />
<ClInclude Include="..\..\..\..\lib\strdup.h" />
<ClInclude Include="..\..\..\..\lib\strerror.h" />
@@ -2626,20 +2641,26 @@
<ClInclude Include="..\..\..\..\lib\urlapi-int.h" />
<ClInclude Include="..\..\..\..\lib\urldata.h" />
<ClInclude Include="..\..\..\..\lib\url.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\lib\wildcard.h" />
<ClInclude Include="..\..\..\..\lib\x509asn1.h" />
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\vquic.h" />
+ <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\keylog.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\mbedtls_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mesalink.h" />
<ClInclude Include="..\..\..\..\lib\vtls\nssg.h" />
<ClInclude Include="..\..\..\..\lib\vtls\openssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
diff --git a/projects/Windows/VC14/src/curl.sln b/projects/Windows/VC14/src/curl.sln
index b40c18bed..ca123edf2 100644
--- a/projects/Windows/VC14/src/curl.sln
+++ b/projects/Windows/VC14/src/curl.sln
@@ -1,181 +1,181 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
- DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
- DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
- LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
- LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2015
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcxproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug - DLL wolfSSL|Win32 = DLL Debug - DLL wolfSSL|Win32
+ DLL Debug - DLL wolfSSL|x64 = DLL Debug - DLL wolfSSL|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release - DLL wolfSSL|Win32 = DLL Release - DLL wolfSSL|Win32
+ DLL Release - DLL wolfSSL|x64 = DLL Release - DLL wolfSSL|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug - LIB wolfSSL|Win32 = LIB Debug - LIB wolfSSL|Win32
+ LIB Debug - LIB wolfSSL|x64 = LIB Debug - LIB wolfSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release - LIB wolfSSL|Win32 = LIB Release - LIB wolfSSL|Win32
+ LIB Release - LIB wolfSSL|x64 = LIB Release - LIB wolfSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.ActiveCfg = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|Win32.Build.0 = DLL Debug - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.ActiveCfg = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL wolfSSL|x64.Build.0 = DLL Debug - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.ActiveCfg = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|Win32.Build.0 = DLL Release - DLL wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.ActiveCfg = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL wolfSSL|x64.Build.0 = DLL Release - DLL wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.ActiveCfg = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|Win32.Build.0 = LIB Debug - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.ActiveCfg = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB wolfSSL|x64.Build.0 = LIB Debug - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.ActiveCfg = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|Win32.Build.0 = LIB Release - LIB wolfSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.ActiveCfg = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB wolfSSL|x64.Build.0 = LIB Release - LIB wolfSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC14/src/curl.vcxproj b/projects/Windows/VC14/src/curl.vcxproj
index 368066098..2f2986534 100644
--- a/projects/Windows/VC14/src/curl.vcxproj
+++ b/projects/Windows/VC14/src/curl.vcxproj
@@ -2216,7 +2216,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2248,7 +2248,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2279,7 +2279,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2309,7 +2309,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2338,7 +2338,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC14\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2370,7 +2370,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC14\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC14\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2401,7 +2401,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC14\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2431,7 +2431,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC14\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC14\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC14\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2684,8 +2684,11 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
+ <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\src\slist_wc.c" />
<ClCompile Include="..\..\..\..\src\tool_binmode.c" />
@@ -2726,14 +2729,18 @@
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
+ <ClCompile Include="..\..\..\..\src\tool_writeout_json.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\config-win32.h" />
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\src\slist_wc.h" />
<ClInclude Include="..\..\..\..\src\tool_binmode.h" />
@@ -2777,6 +2784,7 @@
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
+ <ClInclude Include="..\..\..\..\src\tool_writeout_json.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
<ItemGroup>
diff --git a/projects/Windows/VC15/lib/libcurl.vcxproj b/projects/Windows/VC15/lib/libcurl.vcxproj
index 1a19d32ef..98a38f93c 100644
--- a/projects/Windows/VC15/lib/libcurl.vcxproj
+++ b/projects/Windows/VC15/lib/libcurl.vcxproj
@@ -951,7 +951,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1016,7 +1016,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1081,7 +1081,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1146,7 +1146,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;USE_WOLFSSL;USE_IPV6;WOLFSSL_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1189,7 +1189,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1233,7 +1233,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>_DEBUG;BUILDING_LIBCURL;DEBUGBUILD;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
@@ -1273,7 +1273,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1319,7 +1319,7 @@
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\..\..\include;..\..\..\..\lib;..\..\..\..\..\wolfssl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_CYASSL;USE_IPV6;HAVE_CYASSL_OPTIONS_H;HAVE_CYASSL_ERROR_SSL_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>NDEBUG;BUILDING_LIBCURL;CURL_STATICLIB;USE_WOLFSSL;USE_IPV6;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1357,7 +1357,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1390,7 +1390,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1423,7 +1423,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1455,7 +1455,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -1741,7 +1741,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC15\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1774,7 +1774,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC15\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -1807,7 +1807,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win32\VC15\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ManifestFile>$(IntDir)$(TargetFileName).intermediate.manifest</ManifestFile>
@@ -1839,7 +1839,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\..\openssl\build\Win64\VC15\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
@@ -2381,7 +2381,10 @@
<ClCompile Include="..\..\..\..\lib\dict.c" />
<ClCompile Include="..\..\..\..\lib\doh.c" />
<ClCompile Include="..\..\..\..\lib\dotdot.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\easy.c" />
+ <ClCompile Include="..\..\..\..\lib\easygetopt.c" />
+ <ClCompile Include="..\..\..\..\lib\easyoptions.c" />
<ClCompile Include="..\..\..\..\lib\escape.c" />
<ClCompile Include="..\..\..\..\lib\file.c" />
<ClCompile Include="..\..\..\..\lib\fileinfo.c" />
@@ -2419,6 +2422,7 @@
<ClCompile Include="..\..\..\..\lib\memdebug.c" />
<ClCompile Include="..\..\..\..\lib\mime.c" />
<ClCompile Include="..\..\..\..\lib\mprintf.c" />
+ <ClCompile Include="..\..\..\..\lib\mqtt.c" />
<ClCompile Include="..\..\..\..\lib\multi.c" />
<ClCompile Include="..\..\..\..\lib\netrc.c" />
<ClCompile Include="..\..\..\..\lib\non-ascii.c" />
@@ -2430,8 +2434,8 @@
<ClCompile Include="..\..\..\..\lib\progress.c" />
<ClCompile Include="..\..\..\..\lib\psl.c" />
<ClCompile Include="..\..\..\..\lib\rand.c" />
+ <ClCompile Include="..\..\..\..\lib\rename.c" />
<ClCompile Include="..\..\..\..\lib\rtsp.c" />
- <ClCompile Include="..\..\..\..\lib\security.c" />
<ClCompile Include="..\..\..\..\lib\select.c" />
<ClCompile Include="..\..\..\..\lib\sendf.c" />
<ClCompile Include="..\..\..\..\lib\setopt.c" />
@@ -2459,6 +2463,7 @@
<ClCompile Include="..\..\..\..\lib\urlapi.c" />
<ClCompile Include="..\..\..\..\lib\url.c" />
<ClCompile Include="..\..\..\..\lib\version.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\lib\wildcard.c" />
<ClCompile Include="..\..\..\..\lib\x509asn1.c" />
@@ -2474,14 +2479,21 @@
<ClCompile Include="..\..\..\..\lib\vauth\spnego_gssapi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\spnego_sspi.c" />
<ClCompile Include="..\..\..\..\lib\vauth\vauth.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\ngtcp2.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\quiche.c" />
+ <ClCompile Include="..\..\..\..\lib\vquic\vquic.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh2.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\libssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vssh\wolfssh.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\bearssl.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gskit.c" />
<ClCompile Include="..\..\..\..\lib\vtls\gtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\keylog.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mbedtls.c" />
+ <ClCompile Include="..\..\..\..\lib\vtls\mbedtls_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\mesalink.c" />
<ClCompile Include="..\..\..\..\lib\vtls\nss.c" />
<ClCompile Include="..\..\..\..\lib\vtls\openssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl.c" />
- <ClCompile Include="..\..\..\..\lib\vtls\polarssl_threadlock.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel.c" />
<ClCompile Include="..\..\..\..\lib\vtls\schannel_verify.c" />
<ClCompile Include="..\..\..\..\lib\vtls\sectransp.c" />
@@ -2508,6 +2520,7 @@
<ClInclude Include="..\..\..\..\lib\curl_get_line.h" />
<ClInclude Include="..\..\..\..\lib\curl_gssapi.h" />
<ClInclude Include="..\..\..\..\lib\curl_hmac.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_krb5.h" />
<ClInclude Include="..\..\..\..\lib\curl_ldap.h" />
<ClInclude Include="..\..\..\..\lib\curl_md4.h" />
<ClInclude Include="..\..\..\..\lib\curl_md5.h" />
@@ -2521,7 +2534,6 @@
<ClInclude Include="..\..\..\..\lib\curl_range.h" />
<ClInclude Include="..\..\..\..\lib\curl_rtmp.h" />
<ClInclude Include="..\..\..\..\lib\curl_sasl.h" />
- <ClInclude Include="..\..\..\..\lib\curl_sec.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup_once.h" />
<ClInclude Include="..\..\..\..\lib\curl_sha256.h" />
@@ -2531,7 +2543,9 @@
<ClInclude Include="..\..\..\..\lib\dict.h" />
<ClInclude Include="..\..\..\..\lib\doh.h" />
<ClInclude Include="..\..\..\..\lib\dotdot.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\easyif.h" />
+ <ClInclude Include="..\..\..\..\lib\easyoptions.h" />
<ClInclude Include="..\..\..\..\lib\escape.h" />
<ClInclude Include="..\..\..\..\lib\file.h" />
<ClInclude Include="..\..\..\..\lib\fileinfo.h" />
@@ -2557,6 +2571,7 @@
<ClInclude Include="..\..\..\..\lib\llist.h" />
<ClInclude Include="..\..\..\..\lib\memdebug.h" />
<ClInclude Include="..\..\..\..\lib\mime.h" />
+ <ClInclude Include="..\..\..\..\lib\mqtt.h" />
<ClInclude Include="..\..\..\..\lib\multihandle.h" />
<ClInclude Include="..\..\..\..\lib\multiif.h" />
<ClInclude Include="..\..\..\..\lib\netrc.h" />
@@ -2569,6 +2584,7 @@
<ClInclude Include="..\..\..\..\lib\psl.h" />
<ClInclude Include="..\..\..\..\lib\quic.h" />
<ClInclude Include="..\..\..\..\lib\rand.h" />
+ <ClInclude Include="..\..\..\..\lib\rename.h" />
<ClInclude Include="..\..\..\..\lib\rtsp.h" />
<ClInclude Include="..\..\..\..\lib\select.h" />
<ClInclude Include="..\..\..\..\lib\sendf.h" />
@@ -2584,7 +2600,6 @@
<ClInclude Include="..\..\..\..\lib\socks.h" />
<ClInclude Include="..\..\..\..\lib\speedcheck.h" />
<ClInclude Include="..\..\..\..\lib\splay.h" />
- <ClInclude Include="..\..\..\..\lib\ssh.h" />
<ClInclude Include="..\..\..\..\lib\strcase.h" />
<ClInclude Include="..\..\..\..\lib\strdup.h" />
<ClInclude Include="..\..\..\..\lib\strerror.h" />
@@ -2598,20 +2613,26 @@
<ClInclude Include="..\..\..\..\lib\urlapi-int.h" />
<ClInclude Include="..\..\..\..\lib\urldata.h" />
<ClInclude Include="..\..\..\..\lib\url.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\lib\wildcard.h" />
<ClInclude Include="..\..\..\..\lib\x509asn1.h" />
<ClInclude Include="..\..\..\..\lib\vauth\digest.h" />
<ClInclude Include="..\..\..\..\lib\vauth\ntlm.h" />
<ClInclude Include="..\..\..\..\lib\vauth\vauth.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\ngtcp2.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\quiche.h" />
+ <ClInclude Include="..\..\..\..\lib\vquic\vquic.h" />
+ <ClInclude Include="..\..\..\..\lib\vssh\ssh.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\bearssl.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gskit.h" />
<ClInclude Include="..\..\..\..\lib\vtls\gtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\keylog.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mbedtls.h" />
+ <ClInclude Include="..\..\..\..\lib\vtls\mbedtls_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\mesalink.h" />
<ClInclude Include="..\..\..\..\lib\vtls\nssg.h" />
<ClInclude Include="..\..\..\..\lib\vtls\openssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl.h" />
- <ClInclude Include="..\..\..\..\lib\vtls\polarssl_threadlock.h" />
<ClInclude Include="..\..\..\..\lib\vtls\schannel.h" />
<ClInclude Include="..\..\..\..\lib\vtls\sectransp.h" />
<ClInclude Include="..\..\..\..\lib\vtls\vtls.h" />
diff --git a/projects/Windows/VC15/src/curl.vcxproj b/projects/Windows/VC15/src/curl.vcxproj
index f1d448339..85d9179b2 100644
--- a/projects/Windows/VC15/src/curl.vcxproj
+++ b/projects/Windows/VC15/src/curl.vcxproj
@@ -2195,7 +2195,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2226,7 +2226,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2257,7 +2257,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2287,7 +2287,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2315,7 +2315,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC15\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2346,7 +2346,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurld.lib;libeay32.lib;ssleay32.lib;libssh2d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC15\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC15\DLL Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -2377,7 +2377,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libeay32.lib;ssleay32.lib;libssh2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win32\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win32\VC15\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2407,7 +2407,7 @@
<AdditionalIncludeDirectories>..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
- <AdditionalDependencies>ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>crypt32.lib;ws2_32.lib;wldap32.lib;libcurl.lib;libssh2.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>..\..\..\..\build\Win64\VC15\$(Configuration);..\..\..\..\..\openssl\build\Win64\VC15\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC15\DLL Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
@@ -2656,8 +2656,11 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\lib\curl_ctype.c" />
+ <ClCompile Include="..\..\..\..\lib\curl_multibyte.c" />
+ <ClCompile Include="..\..\..\..\lib\dynbuf.c" />
<ClCompile Include="..\..\..\..\lib\nonblock.c" />
<ClCompile Include="..\..\..\..\lib\strtoofft.c" />
+ <ClCompile Include="..\..\..\..\lib\version_win32.c" />
<ClCompile Include="..\..\..\..\lib\warnless.c" />
<ClCompile Include="..\..\..\..\src\slist_wc.c" />
<ClCompile Include="..\..\..\..\src\tool_binmode.c" />
@@ -2698,14 +2701,18 @@
<ClCompile Include="..\..\..\..\src\tool_util.c" />
<ClCompile Include="..\..\..\..\src\tool_vms.c" />
<ClCompile Include="..\..\..\..\src\tool_writeout.c" />
+ <ClCompile Include="..\..\..\..\src\tool_writeout_json.c" />
<ClCompile Include="..\..\..\..\src\tool_xattr.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\..\lib\config-win32.h" />
<ClInclude Include="..\..\..\..\lib\curl_ctype.h" />
+ <ClInclude Include="..\..\..\..\lib\curl_multibyte.h" />
<ClInclude Include="..\..\..\..\lib\curl_setup.h" />
+ <ClInclude Include="..\..\..\..\lib\dynbuf.h" />
<ClInclude Include="..\..\..\..\lib\nonblock.h" />
<ClInclude Include="..\..\..\..\lib\strtoofft.h" />
+ <ClInclude Include="..\..\..\..\lib\version_win32.h" />
<ClInclude Include="..\..\..\..\lib\warnless.h" />
<ClInclude Include="..\..\..\..\src\slist_wc.h" />
<ClInclude Include="..\..\..\..\src\tool_binmode.h" />
@@ -2749,6 +2756,7 @@
<ClInclude Include="..\..\..\..\src\tool_version.h" />
<ClInclude Include="..\..\..\..\src\tool_vms.h" />
<ClInclude Include="..\..\..\..\src\tool_writeout.h" />
+ <ClInclude Include="..\..\..\..\src\tool_writeout_json.h" />
<ClInclude Include="..\..\..\..\src\tool_xattr.h" />
</ItemGroup>
<ItemGroup>
diff --git a/projects/Windows/VC6/lib/libcurl.dsp b/projects/Windows/VC6/lib/libcurl.dsp
index cd7bcd9df..816afae1b 100644
--- a/projects/Windows/VC6/lib/libcurl.dsp
+++ b/projects/Windows/VC6/lib/libcurl.dsp
@@ -105,8 +105,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\libcurld.dll" /pdbtype:con /fixed:no
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /fixed:no
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\libcurld.dll" /pdbtype:con /fixed:no
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /fixed:no
!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Debug DLL OpenSSL DLL LibSSH2"
@@ -135,8 +135,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\DLL Debug - DLL OpenSSL - DLL LibSSH2\libcurld.dll" /pdbtype:con /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Debug DLL Windows SSPI"
@@ -254,8 +254,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /fixed:no /release
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /pdb:none /machine:I386 /fixed:no /release
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /fixed:no /release
!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release DLL OpenSSL DLL LibSSH2"
@@ -284,8 +284,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no /release
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no /release
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no /release
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /dll /pdb:none /machine:I386 /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no /release
!ELSEIF "$(CFG)" == "libcurl - Win32 DLL Release DLL Windows SSPI"
@@ -850,10 +850,22 @@ SOURCE=..\..\..\..\lib\dotdot.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\dynbuf.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\easy.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\easygetopt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\easyoptions.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\escape.c
# End Source File
# Begin Source File
@@ -1002,6 +1014,10 @@ SOURCE=..\..\..\..\lib\mprintf.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\mqtt.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\multi.c
# End Source File
# Begin Source File
@@ -1046,11 +1062,11 @@ SOURCE=..\..\..\..\lib\rand.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\rtsp.c
+SOURCE=..\..\..\..\lib\rename.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\security.c
+SOURCE=..\..\..\..\lib\rtsp.c
# End Source File
# Begin Source File
@@ -1162,6 +1178,10 @@ SOURCE=..\..\..\..\lib\version.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\version_win32.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\warnless.c
# End Source File
# Begin Source File
@@ -1222,6 +1242,34 @@ SOURCE=..\..\..\..\lib\vauth\vauth.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\vquic\ngtcp2.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vquic\quiche.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vquic\vquic.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vssh\libssh2.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vssh\libssh.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vssh\wolfssh.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vtls\bearssl.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\vtls\gskit.c
# End Source File
# Begin Source File
@@ -1230,27 +1278,27 @@ SOURCE=..\..\..\..\lib\vtls\gtls.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\mbedtls.c
+SOURCE=..\..\..\..\lib\vtls\keylog.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\mesalink.c
+SOURCE=..\..\..\..\lib\vtls\mbedtls.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\nss.c
+SOURCE=..\..\..\..\lib\vtls\mbedtls_threadlock.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\openssl.c
+SOURCE=..\..\..\..\lib\vtls\mesalink.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\polarssl.c
+SOURCE=..\..\..\..\lib\vtls\nss.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\polarssl_threadlock.c
+SOURCE=..\..\..\..\lib\vtls\openssl.c
# End Source File
# Begin Source File
@@ -1354,6 +1402,10 @@ SOURCE=..\..\..\..\lib\curl_hmac.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\curl_krb5.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\curl_ldap.h
# End Source File
# Begin Source File
@@ -1406,10 +1458,6 @@ SOURCE=..\..\..\..\lib\curl_sasl.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\curl_sec.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\curl_setup.h
# End Source File
# Begin Source File
@@ -1446,10 +1494,18 @@ SOURCE=..\..\..\..\lib\dotdot.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\dynbuf.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\easyif.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\easyoptions.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\escape.h
# End Source File
# Begin Source File
@@ -1550,6 +1606,10 @@ SOURCE=..\..\..\..\lib\mime.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\mqtt.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\multihandle.h
# End Source File
# Begin Source File
@@ -1598,6 +1658,10 @@ SOURCE=..\..\..\..\lib\rand.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\rename.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\rtsp.h
# End Source File
# Begin Source File
@@ -1658,10 +1722,6 @@ SOURCE=..\..\..\..\lib\splay.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\ssh.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\..\..\lib\strcase.h
# End Source File
# Begin Source File
@@ -1714,6 +1774,10 @@ SOURCE=..\..\..\..\lib\url.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\version_win32.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\warnless.h
# End Source File
# Begin Source File
@@ -1738,6 +1802,26 @@ SOURCE=..\..\..\..\lib\vauth\vauth.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\vquic\ngtcp2.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vquic\quiche.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vquic\vquic.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vssh\ssh.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\vtls\bearssl.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\vtls\gskit.h
# End Source File
# Begin Source File
@@ -1746,27 +1830,27 @@ SOURCE=..\..\..\..\lib\vtls\gtls.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\mbedtls.h
+SOURCE=..\..\..\..\lib\vtls\keylog.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\mesalink.h
+SOURCE=..\..\..\..\lib\vtls\mbedtls.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\nssg.h
+SOURCE=..\..\..\..\lib\vtls\mbedtls_threadlock.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\openssl.h
+SOURCE=..\..\..\..\lib\vtls\mesalink.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\polarssl.h
+SOURCE=..\..\..\..\lib\vtls\nssg.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\lib\vtls\polarssl_threadlock.h
+SOURCE=..\..\..\..\lib\vtls\openssl.h
# End Source File
# Begin Source File
diff --git a/projects/Windows/VC6/src/curl.dsp b/projects/Windows/VC6/src/curl.dsp
index ff2617a92..b35cd1a6c 100644
--- a/projects/Windows/VC6/src/curl.dsp
+++ b/projects/Windows/VC6/src/curl.dsp
@@ -344,8 +344,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /fixed:no
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /fixed:no
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /fixed:no
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /fixed:no
!ELSEIF "$(CFG)" == "curl - Win32 LIB Debug DLL OpenSSL DLL LibSSH2"
@@ -369,8 +369,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL - DLL LibSSH2\curld.exe" /pdbtype:con /libpath:"..\..\..\..\build\Win32\VC6\LIB Debug - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Debug" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Debug" /fixed:no
!ELSEIF "$(CFG)" == "curl - Win32 LIB Debug DLL Windows SSPI"
@@ -518,8 +518,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /fixed:no
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /fixed:no
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /fixed:no
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /fixed:no
!ELSEIF "$(CFG)" == "curl - Win32 LIB Release DLL OpenSSL DLL LibSSH2"
@@ -543,8 +543,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
-# ADD BASE LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no
-# ADD LINK32 advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no
+# ADD BASE LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no
+# ADD LINK32 crypt32.lib advapi32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL - DLL LibSSH2\curl.exe" /libpath:"..\..\..\..\build\Win32\VC6\LIB Release - DLL OpenSSL" /libpath:"..\..\..\..\..\openssl\build\Win32\VC6\DLL Release" /libpath:"..\..\..\..\..\libssh2\build\Win32\VC6\DLL Release" /fixed:no
!ELSEIF "$(CFG)" == "curl - Win32 LIB Release DLL Windows SSPI"
@@ -683,6 +683,14 @@ SOURCE=..\..\..\..\lib\curl_ctype.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\curl_multibyte.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\lib\dynbuf.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\nonblock.c
# End Source File
# Begin Source File
@@ -691,6 +699,10 @@ SOURCE=..\..\..\..\lib\strtoofft.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\version_win32.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\warnless.c
# End Source File
# Begin Source File
@@ -851,6 +863,10 @@ SOURCE=..\..\..\..\src\tool_writeout.c
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\src\tool_writeout_json.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\src\tool_xattr.c
# End Source File
# End Group
@@ -867,10 +883,18 @@ SOURCE=..\..\..\..\lib\curl_ctype.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\curl_multibyte.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\curl_setup.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\dynbuf.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\nonblock.h
# End Source File
# Begin Source File
@@ -879,6 +903,10 @@ SOURCE=..\..\..\..\lib\strtoofft.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\lib\version_win32.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\lib\warnless.h
# End Source File
# Begin Source File
@@ -1051,6 +1079,10 @@ SOURCE=..\..\..\..\src\tool_writeout.h
# End Source File
# Begin Source File
+SOURCE=..\..\..\..\src\tool_writeout_json.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\..\..\src\tool_xattr.h
# End Source File
# End Group
diff --git a/projects/Windows/VC7.1/curl-all.sln b/projects/Windows/VC7.1/curl-all.sln
index fc51b9dc0..0dd90b435 100644
--- a/projects/Windows/VC7.1/curl-all.sln
+++ b/projects/Windows/VC7.1/curl-all.sln
@@ -1,140 +1,140 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- DLL Debug = DLL Debug
- DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
- DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
- DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
- DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
- DLL Release = DLL Release
- DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
- DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
- DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
- DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
- LIB Debug = LIB Debug
- LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
- LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
- LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
- LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
- LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
- LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
- LIB Release = LIB Release
- LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
- LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
- LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
- LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
- LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
- LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ DLL Debug = DLL Debug
+ DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
+ DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
+ DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
+ DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
+ DLL Release = DLL Release
+ DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
+ DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
+ DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
+ DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
+ LIB Debug = LIB Debug
+ LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
+ LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
+ LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
+ LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
+ LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
+ LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
+ LIB Release = LIB Release
+ LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
+ LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
+ LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
+ LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
+ LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
+ LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC7.1/lib/libcurl.sln b/projects/Windows/VC7.1/lib/libcurl.sln
index 7513d3538..c5ca5d4bf 100644
--- a/projects/Windows/VC7.1/lib/libcurl.sln
+++ b/projects/Windows/VC7.1/lib/libcurl.sln
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- DLL Debug = DLL Debug
- DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
- DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
- DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
- DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
- DLL Release = DLL Release
- DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
- DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
- DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
- DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
- LIB Debug = LIB Debug
- LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
- LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
- LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
- LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
- LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
- LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
- LIB Release = LIB Release
- LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
- LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
- LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
- LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
- LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
- LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ DLL Debug = DLL Debug
+ DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
+ DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
+ DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
+ DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
+ DLL Release = DLL Release
+ DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
+ DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
+ DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
+ DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
+ LIB Debug = LIB Debug
+ LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
+ LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
+ LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
+ LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
+ LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
+ LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
+ LIB Release = LIB Release
+ LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
+ LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
+ LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
+ LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
+ LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
+ LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC7.1/lib/libcurl.vcproj b/projects/Windows/VC7.1/lib/libcurl.vcproj
index 9b35114c2..67a2f5e9b 100644
--- a/projects/Windows/VC7.1/lib/libcurl.vcproj
+++ b/projects/Windows/VC7.1/lib/libcurl.vcproj
@@ -35,7 +35,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -93,7 +93,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -664,7 +664,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -957,7 +957,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -1346,9 +1346,18 @@
RelativePath="..\..\..\..\lib\dotdot.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easy.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c">
</File>
<File
@@ -1460,6 +1469,9 @@
RelativePath="..\..\..\..\lib\mprintf.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multi.c">
</File>
<File
@@ -1493,10 +1505,10 @@
RelativePath="..\..\..\..\lib\rand.c">
</File>
<File
- RelativePath="..\..\..\..\lib\rtsp.c">
+ RelativePath="..\..\..\..\lib\rename.c">
</File>
<File
- RelativePath="..\..\..\..\lib\security.c">
+ RelativePath="..\..\..\..\lib\rtsp.c">
</File>
<File
RelativePath="..\..\..\..\lib\select.c">
@@ -1580,6 +1592,9 @@
RelativePath="..\..\..\..\lib\version.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c">
</File>
<File
@@ -1650,6 +1665,9 @@
RelativePath="..\..\..\..\lib\curl_hmac.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h">
</File>
<File
@@ -1689,9 +1707,6 @@
RelativePath="..\..\..\..\lib\curl_sasl.h">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
@@ -1719,9 +1734,15 @@
RelativePath="..\..\..\..\lib\dotdot.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easyif.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h">
</File>
<File
@@ -1797,6 +1818,9 @@
RelativePath="..\..\..\..\lib\mime.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h">
</File>
<File
@@ -1833,6 +1857,9 @@
RelativePath="..\..\..\..\lib\rand.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\rename.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\rtsp.h">
</File>
<File
@@ -1878,9 +1905,6 @@
RelativePath="..\..\..\..\lib\splay.h">
</File>
<File
- RelativePath="..\..\..\..\lib\ssh.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\strcase.h">
</File>
<File
@@ -1920,6 +1944,9 @@
RelativePath="..\..\..\..\lib\url.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h">
</File>
<File
@@ -1994,34 +2021,91 @@
</Filter>
</Filter>
<Filter
+ Name="vquic"
+ Filter="">
+ <Filter
+ Name="Source Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.h">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="vssh"
+ Filter="">
+ <Filter
+ Name="Source Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh2.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\wolfssh.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vssh\ssh.h">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
Name="vtls"
Filter="">
<Filter
Name="Source Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\gtls.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.c">
+ RelativePath="..\..\..\..\lib\vtls\keylog.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.c">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nss.c">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.c">
+ RelativePath="..\..\..\..\lib\vtls\mesalink.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.c">
+ RelativePath="..\..\..\..\lib\vtls\nss.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c">
+ RelativePath="..\..\..\..\lib\vtls\openssl.c">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\schannel.c">
@@ -2043,28 +2127,31 @@
Name="Header Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\gtls.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.h">
+ RelativePath="..\..\..\..\lib\vtls\keylog.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.h">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nssg.h">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.h">
+ RelativePath="..\..\..\..\lib\vtls\mesalink.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.h">
+ RelativePath="..\..\..\..\lib\vtls\nssg.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h">
+ RelativePath="..\..\..\..\lib\vtls\openssl.h">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\schannel.h">
diff --git a/projects/Windows/VC7.1/src/curl.sln b/projects/Windows/VC7.1/src/curl.sln
index 41ebb61ea..d92eb5de5 100644
--- a/projects/Windows/VC7.1/src/curl.sln
+++ b/projects/Windows/VC7.1/src/curl.sln
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- DLL Debug = DLL Debug
- DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
- DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
- DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
- DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
- DLL Release = DLL Release
- DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
- DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
- DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
- DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
- LIB Debug = LIB Debug
- LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
- LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
- LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
- LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
- LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
- LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
- LIB Release = LIB Release
- LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
- LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
- LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
- LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
- LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
- LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ DLL Debug = DLL Debug
+ DLL Debug - DLL OpenSSL = DLL Debug - DLL OpenSSL
+ DLL Debug - DLL OpenSSL - DLL LibSSH2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
+ DLL Debug - DLL Windows SSPI = DLL Debug - DLL Windows SSPI
+ DLL Debug - DLL Windows SSPI - DLL WinIDN = DLL Debug - DLL Windows SSPI - DLL WinIDN
+ DLL Release = DLL Release
+ DLL Release - DLL OpenSSL = DLL Release - DLL OpenSSL
+ DLL Release - DLL OpenSSL - DLL LibSSH2 = DLL Release - DLL OpenSSL - DLL LibSSH2
+ DLL Release - DLL Windows SSPI = DLL Release - DLL Windows SSPI
+ DLL Release - DLL Windows SSPI - DLL WinIDN = DLL Release - DLL Windows SSPI - DLL WinIDN
+ LIB Debug = LIB Debug
+ LIB Debug - DLL OpenSSL = LIB Debug - DLL OpenSSL
+ LIB Debug - DLL OpenSSL - DLL LibSSH2 = LIB Debug - DLL OpenSSL - DLL LibSSH2
+ LIB Debug - DLL Windows SSPI = LIB Debug - DLL Windows SSPI
+ LIB Debug - DLL Windows SSPI - DLL WinIDN = LIB Debug - DLL Windows SSPI - DLL WinIDN
+ LIB Debug - LIB OpenSSL = LIB Debug - LIB OpenSSL
+ LIB Debug - LIB OpenSSL - LIB LibSSH2 = LIB Debug - LIB OpenSSL - LIB LibSSH2
+ LIB Release = LIB Release
+ LIB Release - DLL OpenSSL = LIB Release - DLL OpenSSL
+ LIB Release - DLL OpenSSL - DLL LibSSH2 = LIB Release - DLL OpenSSL - DLL LibSSH2
+ LIB Release - DLL Windows SSPI = LIB Release - DLL Windows SSPI
+ LIB Release - DLL Windows SSPI - DLL WinIDN = LIB Release - DLL Windows SSPI - DLL WinIDN
+ LIB Release - LIB OpenSSL = LIB Release - LIB OpenSSL
+ LIB Release - LIB OpenSSL - LIB LibSSH2 = LIB Release - LIB OpenSSL - LIB LibSSH2
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC7.1/src/curl.vcproj b/projects/Windows/VC7.1/src/curl.vcproj
index 00f6a7f6a..08c738afc 100644
--- a/projects/Windows/VC7.1/src/curl.vcproj
+++ b/projects/Windows/VC7.1/src/curl.vcproj
@@ -199,7 +199,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -427,7 +427,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -482,7 +482,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -647,7 +647,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -1365,12 +1365,21 @@
RelativePath="..\..\..\..\lib\curl_ctype.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\dynbuf.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c">
</File>
<File
RelativePath="..\..\..\..\lib\strtoofft.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c">
</File>
<File
@@ -1491,6 +1500,9 @@
RelativePath="..\..\..\..\src\tool_writeout.c">
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.c">
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.c">
</File>
</Filter>
@@ -1504,15 +1516,24 @@
RelativePath="..\..\..\..\lib\curl_ctype.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h">
</File>
<File
RelativePath="..\..\..\..\lib\strtoofft.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h">
</File>
<File
@@ -1642,6 +1663,9 @@
RelativePath="..\..\..\..\src\tool_writeout.h">
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.h">
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.h">
</File>
</Filter>
diff --git a/projects/Windows/VC7/curl-all.sln b/projects/Windows/VC7/curl-all.sln
index b0746d834..879f7d19e 100644
--- a/projects/Windows/VC7/curl-all.sln
+++ b/projects/Windows/VC7/curl-all.sln
@@ -1,138 +1,138 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- ConfigName.0 = DLL Debug
- ConfigName.1 = DLL Debug - DLL OpenSSL
- ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
- ConfigName.3 = DLL Debug - DLL Windows SSPI
- ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
- ConfigName.5 = DLL Release
- ConfigName.6 = DLL Release - DLL OpenSSL
- ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
- ConfigName.8 = DLL Release - DLL Windows SSPI
- ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
- ConfigName.10 = LIB Debug
- ConfigName.11 = LIB Debug - DLL OpenSSL
- ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
- ConfigName.13 = LIB Debug - DLL Windows SSPI
- ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
- ConfigName.15 = LIB Debug - LIB OpenSSL
- ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
- ConfigName.17 = LIB Release
- ConfigName.18 = LIB Release - DLL OpenSSL
- ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
- ConfigName.20 = LIB Release - DLL Windows SSPI
- ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
- ConfigName.22 = LIB Release - LIB OpenSSL
- ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.0 = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ ConfigName.0 = DLL Debug
+ ConfigName.1 = DLL Debug - DLL OpenSSL
+ ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
+ ConfigName.3 = DLL Debug - DLL Windows SSPI
+ ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
+ ConfigName.5 = DLL Release
+ ConfigName.6 = DLL Release - DLL OpenSSL
+ ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
+ ConfigName.8 = DLL Release - DLL Windows SSPI
+ ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
+ ConfigName.10 = LIB Debug
+ ConfigName.11 = LIB Debug - DLL OpenSSL
+ ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
+ ConfigName.13 = LIB Debug - DLL Windows SSPI
+ ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
+ ConfigName.15 = LIB Debug - LIB OpenSSL
+ ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
+ ConfigName.17 = LIB Release
+ ConfigName.18 = LIB Release - DLL OpenSSL
+ ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
+ ConfigName.20 = LIB Release - DLL Windows SSPI
+ ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
+ ConfigName.22 = LIB Release - LIB OpenSSL
+ ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.0 = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC7/lib/libcurl.sln b/projects/Windows/VC7/lib/libcurl.sln
index f092661d0..cc375bb53 100644
--- a/projects/Windows/VC7/lib/libcurl.sln
+++ b/projects/Windows/VC7/lib/libcurl.sln
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- ConfigName.0 = DLL Debug
- ConfigName.1 = DLL Debug - DLL OpenSSL
- ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
- ConfigName.3 = DLL Debug - DLL Windows SSPI
- ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
- ConfigName.5 = DLL Release
- ConfigName.6 = DLL Release - DLL OpenSSL
- ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
- ConfigName.8 = DLL Release - DLL Windows SSPI
- ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
- ConfigName.10 = LIB Debug
- ConfigName.11 = LIB Debug - DLL OpenSSL
- ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
- ConfigName.13 = LIB Debug - DLL Windows SSPI
- ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
- ConfigName.15 = LIB Debug - LIB OpenSSL
- ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
- ConfigName.17 = LIB Release
- ConfigName.18 = LIB Release - DLL OpenSSL
- ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
- ConfigName.20 = LIB Release - DLL Windows SSPI
- ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
- ConfigName.22 = LIB Release - LIB OpenSSL
- ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ ConfigName.0 = DLL Debug
+ ConfigName.1 = DLL Debug - DLL OpenSSL
+ ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
+ ConfigName.3 = DLL Debug - DLL Windows SSPI
+ ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
+ ConfigName.5 = DLL Release
+ ConfigName.6 = DLL Release - DLL OpenSSL
+ ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
+ ConfigName.8 = DLL Release - DLL Windows SSPI
+ ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
+ ConfigName.10 = LIB Debug
+ ConfigName.11 = LIB Debug - DLL OpenSSL
+ ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
+ ConfigName.13 = LIB Debug - DLL Windows SSPI
+ ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
+ ConfigName.15 = LIB Debug - LIB OpenSSL
+ ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
+ ConfigName.17 = LIB Release
+ ConfigName.18 = LIB Release - DLL OpenSSL
+ ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
+ ConfigName.20 = LIB Release - DLL Windows SSPI
+ ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
+ ConfigName.22 = LIB Release - LIB OpenSSL
+ ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC7/lib/libcurl.vcproj b/projects/Windows/VC7/lib/libcurl.vcproj
index ce38525fb..d8a45a176 100644
--- a/projects/Windows/VC7/lib/libcurl.vcproj
+++ b/projects/Windows/VC7/lib/libcurl.vcproj
@@ -35,7 +35,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -87,7 +87,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -592,7 +592,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -849,7 +849,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -1200,9 +1200,18 @@
RelativePath="..\..\..\..\lib\dotdot.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easy.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c">
</File>
<File
@@ -1314,6 +1323,9 @@
RelativePath="..\..\..\..\lib\mprintf.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multi.c">
</File>
<File
@@ -1347,10 +1359,10 @@
RelativePath="..\..\..\..\lib\rand.c">
</File>
<File
- RelativePath="..\..\..\..\lib\rtsp.c">
+ RelativePath="..\..\..\..\lib\rename.c">
</File>
<File
- RelativePath="..\..\..\..\lib\security.c">
+ RelativePath="..\..\..\..\lib\rtsp.c">
</File>
<File
RelativePath="..\..\..\..\lib\select.c">
@@ -1434,6 +1446,9 @@
RelativePath="..\..\..\..\lib\version.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c">
</File>
<File
@@ -1504,6 +1519,9 @@
RelativePath="..\..\..\..\lib\curl_hmac.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h">
</File>
<File
@@ -1543,9 +1561,6 @@
RelativePath="..\..\..\..\lib\curl_sasl.h">
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
@@ -1573,9 +1588,15 @@
RelativePath="..\..\..\..\lib\dotdot.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easyif.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h">
</File>
<File
@@ -1651,6 +1672,9 @@
RelativePath="..\..\..\..\lib\mime.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h">
</File>
<File
@@ -1687,6 +1711,9 @@
RelativePath="..\..\..\..\lib\rand.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\rename.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\rtsp.h">
</File>
<File
@@ -1732,9 +1759,6 @@
RelativePath="..\..\..\..\lib\splay.h">
</File>
<File
- RelativePath="..\..\..\..\lib\ssh.h">
- </File>
- <File
RelativePath="..\..\..\..\lib\strcase.h">
</File>
<File
@@ -1774,6 +1798,9 @@
RelativePath="..\..\..\..\lib\url.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h">
</File>
<File
@@ -1848,34 +1875,91 @@
</Filter>
</Filter>
<Filter
+ Name="vquic"
+ Filter="">
+ <Filter
+ Name="Source Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.h">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.h">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="vssh"
+ Filter="">
+ <Filter
+ Name="Source Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh2.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\wolfssh.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\..\lib\vssh\ssh.h">
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
Name="vtls"
Filter="">
<Filter
Name="Source Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\gtls.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.c">
+ RelativePath="..\..\..\..\lib\vtls\keylog.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.c">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nss.c">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.c">
+ RelativePath="..\..\..\..\lib\vtls\mesalink.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.c">
+ RelativePath="..\..\..\..\lib\vtls\nss.c">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c">
+ RelativePath="..\..\..\..\lib\vtls\openssl.c">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\schannel.c">
@@ -1897,28 +1981,31 @@
Name="Header Files"
Filter="">
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\gtls.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.h">
+ RelativePath="..\..\..\..\lib\vtls\keylog.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.h">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nssg.h">
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.h">
+ RelativePath="..\..\..\..\lib\vtls\mesalink.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.h">
+ RelativePath="..\..\..\..\lib\vtls\nssg.h">
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h">
+ RelativePath="..\..\..\..\lib\vtls\openssl.h">
</File>
<File
RelativePath="..\..\..\..\lib\vtls\schannel.h">
diff --git a/projects/Windows/VC7/src/curl.sln b/projects/Windows/VC7/src/curl.sln
index 69554619d..8e17f81eb 100644
--- a/projects/Windows/VC7/src/curl.sln
+++ b/projects/Windows/VC7/src/curl.sln
@@ -1,87 +1,87 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- ConfigName.0 = DLL Debug
- ConfigName.1 = DLL Debug - DLL OpenSSL
- ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
- ConfigName.3 = DLL Debug - DLL Windows SSPI
- ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
- ConfigName.5 = DLL Release
- ConfigName.6 = DLL Release - DLL OpenSSL
- ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
- ConfigName.8 = DLL Release - DLL Windows SSPI
- ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
- ConfigName.10 = LIB Debug
- ConfigName.11 = LIB Debug - DLL OpenSSL
- ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
- ConfigName.13 = LIB Debug - DLL Windows SSPI
- ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
- ConfigName.15 = LIB Debug - LIB OpenSSL
- ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
- ConfigName.17 = LIB Release
- ConfigName.18 = LIB Release - DLL OpenSSL
- ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
- ConfigName.20 = LIB Release - DLL Windows SSPI
- ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
- ConfigName.22 = LIB Release - LIB OpenSSL
- ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ ConfigName.0 = DLL Debug
+ ConfigName.1 = DLL Debug - DLL OpenSSL
+ ConfigName.2 = DLL Debug - DLL OpenSSL - DLL LibSSH2
+ ConfigName.3 = DLL Debug - DLL Windows SSPI
+ ConfigName.4 = DLL Debug - DLL Windows SSPI - DLL WinIDN
+ ConfigName.5 = DLL Release
+ ConfigName.6 = DLL Release - DLL OpenSSL
+ ConfigName.7 = DLL Release - DLL OpenSSL - DLL LibSSH2
+ ConfigName.8 = DLL Release - DLL Windows SSPI
+ ConfigName.9 = DLL Release - DLL Windows SSPI - DLL WinIDN
+ ConfigName.10 = LIB Debug
+ ConfigName.11 = LIB Debug - DLL OpenSSL
+ ConfigName.12 = LIB Debug - DLL OpenSSL - DLL LibSSH2
+ ConfigName.13 = LIB Debug - DLL Windows SSPI
+ ConfigName.14 = LIB Debug - DLL Windows SSPI - DLL WinIDN
+ ConfigName.15 = LIB Debug - LIB OpenSSL
+ ConfigName.16 = LIB Debug - LIB OpenSSL - LIB LibSSH2
+ ConfigName.17 = LIB Release
+ ConfigName.18 = LIB Release - DLL OpenSSL
+ ConfigName.19 = LIB Release - DLL OpenSSL - DLL LibSSH2
+ ConfigName.20 = LIB Release - DLL Windows SSPI
+ ConfigName.21 = LIB Release - DLL Windows SSPI - DLL WinIDN
+ ConfigName.22 = LIB Release - LIB OpenSSL
+ ConfigName.23 = LIB Release - LIB OpenSSL - LIB LibSSH2
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC7/src/curl.vcproj b/projects/Windows/VC7/src/curl.vcproj
index fe5a6a8fb..8e2a1ddf4 100644
--- a/projects/Windows/VC7/src/curl.vcproj
+++ b/projects/Windows/VC7/src/curl.vcproj
@@ -181,7 +181,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -385,7 +385,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -434,7 +434,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -581,7 +581,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386 /FIXED:NO"
- AdditionalDependencies="wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib wldap32.lib ws2_32.lib libcurld.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
@@ -1219,12 +1219,21 @@
RelativePath="..\..\..\..\lib\curl_ctype.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.c">
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\dynbuf.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c">
</File>
<File
RelativePath="..\..\..\..\lib\strtoofft.c">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c">
</File>
<File
@@ -1345,6 +1354,9 @@
RelativePath="..\..\..\..\src\tool_writeout.c">
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.c">
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.c">
</File>
</Filter>
@@ -1358,15 +1370,24 @@
RelativePath="..\..\..\..\lib\curl_ctype.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_setup.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h">
</File>
<File
RelativePath="..\..\..\..\lib\strtoofft.h">
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h">
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h">
</File>
<File
@@ -1496,6 +1517,9 @@
RelativePath="..\..\..\..\src\tool_writeout.h">
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.h">
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.h">
</File>
</Filter>
diff --git a/projects/Windows/VC8/curl-all.sln b/projects/Windows/VC8/curl-all.sln
index 9e2c22df4..02961e033 100644
--- a/projects/Windows/VC8/curl-all.sln
+++ b/projects/Windows/VC8/curl-all.sln
@@ -1,258 +1,258 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC8/lib/libcurl.sln b/projects/Windows/VC8/lib/libcurl.sln
index f844fdff1..b9cd13e77 100644
--- a/projects/Windows/VC8/lib/libcurl.sln
+++ b/projects/Windows/VC8/lib/libcurl.sln
@@ -1,157 +1,157 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC8/lib/libcurl.vcproj b/projects/Windows/VC8/lib/libcurl.vcproj
index d572cc851..2d12151cb 100644
--- a/projects/Windows/VC8/lib/libcurl.vcproj
+++ b/projects/Windows/VC8/lib/libcurl.vcproj
@@ -682,7 +682,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC8\DLL Debug"
@@ -770,7 +770,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC8\DLL Debug"
@@ -857,7 +857,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC8\DLL Release"
@@ -943,7 +943,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC8\DLL Release"
@@ -1374,7 +1374,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC8\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC8\DLL Debug"
@@ -1462,7 +1462,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC8\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC8\DLL Debug"
@@ -1549,7 +1549,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC8\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC8\DLL Release"
@@ -1635,7 +1635,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC8\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC8\DLL Release"
@@ -3737,10 +3737,22 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easy.c"
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c"
>
</File>
@@ -3889,6 +3901,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multi.c"
>
</File>
@@ -3933,11 +3949,11 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\rtsp.c"
+ RelativePath="..\..\..\..\lib\rename.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\security.c"
+ RelativePath="..\..\..\..\lib\rtsp.c"
>
</File>
<File
@@ -4049,6 +4065,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c"
>
</File>
@@ -4141,6 +4161,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h"
>
</File>
@@ -4193,10 +4217,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h"
>
</File>
@@ -4233,10 +4253,18 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easyif.h"
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h"
>
</File>
@@ -4337,6 +4365,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h"
>
</File>
@@ -4385,6 +4417,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\rename.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\rtsp.h"
>
</File>
@@ -4445,10 +4481,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\ssh.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\strcase.h"
>
</File>
@@ -4501,6 +4533,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h"
>
</File>
@@ -4594,12 +4630,80 @@
</Filter>
</Filter>
<Filter
+ Name="vquic"
+ >
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="vssh"
+ >
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh2.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\wolfssh.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vssh\ssh.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
Name="vtls"
>
<Filter
Name="Source Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c"
>
</File>
@@ -4608,27 +4712,27 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.c"
+ RelativePath="..\..\..\..\lib\vtls\keylog.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.c"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nss.c"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.c"
+ RelativePath="..\..\..\..\lib\vtls\mesalink.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.c"
+ RelativePath="..\..\..\..\lib\vtls\nss.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c"
+ RelativePath="..\..\..\..\lib\vtls\openssl.c"
>
</File>
<File
@@ -4656,6 +4760,10 @@
Name="Header Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h"
>
</File>
@@ -4664,27 +4772,27 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.h"
+ RelativePath="..\..\..\..\lib\vtls\keylog.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.h"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nssg.h"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.h"
+ RelativePath="..\..\..\..\lib\vtls\mesalink.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.h"
+ RelativePath="..\..\..\..\lib\vtls\nssg.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h"
+ RelativePath="..\..\..\..\lib\vtls\openssl.h"
>
</File>
<File
diff --git a/projects/Windows/VC8/src/curl.sln b/projects/Windows/VC8/src/curl.sln
index 0c43cbe24..088d133a9 100644
--- a/projects/Windows/VC8/src/curl.sln
+++ b/projects/Windows/VC8/src/curl.sln
@@ -1,157 +1,157 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC8/src/curl.vcproj b/projects/Windows/VC8/src/curl.vcproj
index 7b554c788..61fa593bb 100644
--- a/projects/Windows/VC8/src/curl.vcproj
+++ b/projects/Windows/VC8/src/curl.vcproj
@@ -2434,7 +2434,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC8\DLL Debug"
@@ -2520,7 +2520,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC8\DLL Debug"
@@ -2605,7 +2605,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC8\DLL Release"
@@ -2689,7 +2689,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC8\DLL Release"
@@ -2772,7 +2772,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC8\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC8\DLL Debug"
@@ -2858,7 +2858,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC8\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC8\DLL Debug"
@@ -2943,7 +2943,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC8\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC8\DLL Release"
@@ -3027,7 +3027,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libssh2.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libssh2.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC8\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC8\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC8\DLL Release"
@@ -4085,6 +4085,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\dynbuf.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c"
>
</File>
@@ -4093,6 +4101,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c"
>
</File>
@@ -4253,6 +4265,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.c"
>
</File>
@@ -4269,10 +4285,18 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_setup.h"
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h"
>
</File>
@@ -4281,6 +4305,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h"
>
</File>
@@ -4453,6 +4481,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.h"
>
</File>
diff --git a/projects/Windows/VC9/curl-all.sln b/projects/Windows/VC9/curl-all.sln
index 2007cf7ed..e15213a62 100644
--- a/projects/Windows/VC9/curl-all.sln
+++ b/projects/Windows/VC9/curl-all.sln
@@ -1,258 +1,258 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
- ProjectSection(ProjectDependencies) = postProject
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "src\curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB} = {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "lib\libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC9/lib/libcurl.sln b/projects/Windows/VC9/lib/libcurl.sln
index a6619d50e..7e010739a 100644
--- a/projects/Windows/VC9/lib/libcurl.sln
+++ b/projects/Windows/VC9/lib/libcurl.sln
@@ -1,157 +1,157 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcproj", "{DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.DLL Release|x64.Build.0 = DLL Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {DA6F56B4-06A4-441D-AD70-AC5A7D51FADB}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC9/lib/libcurl.vcproj b/projects/Windows/VC9/lib/libcurl.vcproj
index 77c2e8bc3..34575137d 100644
--- a/projects/Windows/VC9/lib/libcurl.vcproj
+++ b/projects/Windows/VC9/lib/libcurl.vcproj
@@ -671,7 +671,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC9\DLL Debug"
@@ -756,7 +756,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC9\DLL Debug"
@@ -840,7 +840,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC9\DLL Release"
@@ -923,7 +923,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC9\DLL Release"
@@ -1339,7 +1339,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC9\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC9\DLL Debug"
@@ -1424,7 +1424,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC9\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC9\DLL Debug"
@@ -1508,7 +1508,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win32\VC9\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC9\DLL Release"
@@ -1591,7 +1591,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\..\openssl\build\Win64\VC9\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC9\DLL Release"
@@ -3678,10 +3678,22 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easy.c"
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easygetopt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\easyoptions.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.c"
>
</File>
@@ -3830,6 +3842,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multi.c"
>
</File>
@@ -3874,11 +3890,11 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\rtsp.c"
+ RelativePath="..\..\..\..\lib\rename.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\security.c"
+ RelativePath="..\..\..\..\lib\rtsp.c"
>
</File>
<File
@@ -3990,6 +4006,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c"
>
</File>
@@ -4082,6 +4102,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_krb5.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_ldap.h"
>
</File>
@@ -4134,10 +4158,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\curl_sec.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\curl_setup.h"
>
</File>
@@ -4174,10 +4194,18 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\easyif.h"
>
</File>
<File
+ RelativePath="..\..\..\..\lib\easyoptions.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\escape.h"
>
</File>
@@ -4278,6 +4306,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\mqtt.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\multihandle.h"
>
</File>
@@ -4326,6 +4358,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\rename.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\rtsp.h"
>
</File>
@@ -4386,10 +4422,6 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\ssh.h"
- >
- </File>
- <File
RelativePath="..\..\..\..\lib\strcase.h"
>
</File>
@@ -4442,6 +4474,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h"
>
</File>
@@ -4535,12 +4571,80 @@
</Filter>
</Filter>
<Filter
+ Name="vquic"
+ >
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vquic\ngtcp2.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\quiche.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vquic\vquic.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="vssh"
+ >
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh2.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\libssh.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\vssh\wolfssh.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ >
+ <File
+ RelativePath="..\..\..\..\lib\vssh\ssh.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
Name="vtls"
>
<Filter
Name="Source Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.c"
>
</File>
@@ -4549,27 +4653,27 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.c"
+ RelativePath="..\..\..\..\lib\vtls\keylog.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.c"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nss.c"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.c"
+ RelativePath="..\..\..\..\lib\vtls\mesalink.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.c"
+ RelativePath="..\..\..\..\lib\vtls\nss.c"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c"
+ RelativePath="..\..\..\..\lib\vtls\openssl.c"
>
</File>
<File
@@ -4597,6 +4701,10 @@
Name="Header Files"
>
<File
+ RelativePath="..\..\..\..\lib\vtls\bearssl.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\vtls\gskit.h"
>
</File>
@@ -4605,27 +4713,27 @@
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mbedtls.h"
+ RelativePath="..\..\..\..\lib\vtls\keylog.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\mesalink.h"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\nssg.h"
+ RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\openssl.h"
+ RelativePath="..\..\..\..\lib\vtls\mesalink.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl.h"
+ RelativePath="..\..\..\..\lib\vtls\nssg.h"
>
</File>
<File
- RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h"
+ RelativePath="..\..\..\..\lib\vtls\openssl.h"
>
</File>
<File
diff --git a/projects/Windows/VC9/src/curl.sln b/projects/Windows/VC9/src/curl.sln
index 0fb0586fa..7a41e7aa2 100644
--- a/projects/Windows/VC9/src/curl.sln
+++ b/projects/Windows/VC9/src/curl.sln
@@ -1,157 +1,157 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
- DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
- DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
- DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
- DLL Debug|Win32 = DLL Debug|Win32
- DLL Debug|x64 = DLL Debug|x64
- DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
- DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
- DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
- DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
- DLL Release|Win32 = DLL Release|Win32
- DLL Release|x64 = DLL Release|x64
- LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
- LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
- LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
- LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
- LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
- LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
- LIB Debug|Win32 = LIB Debug|Win32
- LIB Debug|x64 = LIB Debug|x64
- LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
- LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
- LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
- LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
- LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
- LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
- LIB Release|Win32 = LIB Release|Win32
- LIB Release|x64 = LIB Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
- {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "curl.vcproj", "{5228E9CE-A216-422F-A5E6-58E95E2DD71D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Debug - DLL OpenSSL - DLL LibSSH2|x64 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Debug - DLL OpenSSL|Win32 = DLL Debug - DLL OpenSSL|Win32
+ DLL Debug - DLL OpenSSL|x64 = DLL Debug - DLL OpenSSL|x64
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Debug - DLL Windows SSPI - DLL WinIDN|x64 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Debug - DLL Windows SSPI|Win32 = DLL Debug - DLL Windows SSPI|Win32
+ DLL Debug - DLL Windows SSPI|x64 = DLL Debug - DLL Windows SSPI|x64
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Debug|x64 = DLL Debug|x64
+ DLL Release - DLL OpenSSL - DLL LibSSH2|Win32 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ DLL Release - DLL OpenSSL - DLL LibSSH2|x64 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ DLL Release - DLL OpenSSL|Win32 = DLL Release - DLL OpenSSL|Win32
+ DLL Release - DLL OpenSSL|x64 = DLL Release - DLL OpenSSL|x64
+ DLL Release - DLL Windows SSPI - DLL WinIDN|Win32 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ DLL Release - DLL Windows SSPI - DLL WinIDN|x64 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ DLL Release - DLL Windows SSPI|Win32 = DLL Release - DLL Windows SSPI|Win32
+ DLL Release - DLL Windows SSPI|x64 = DLL Release - DLL Windows SSPI|x64
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Release|x64 = DLL Release|x64
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Debug - DLL OpenSSL - DLL LibSSH2|x64 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Debug - DLL OpenSSL|Win32 = LIB Debug - DLL OpenSSL|Win32
+ LIB Debug - DLL OpenSSL|x64 = LIB Debug - DLL OpenSSL|x64
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Debug - DLL Windows SSPI - DLL WinIDN|x64 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Debug - DLL Windows SSPI|Win32 = LIB Debug - DLL Windows SSPI|Win32
+ LIB Debug - DLL Windows SSPI|x64 = LIB Debug - DLL Windows SSPI|x64
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Debug - LIB OpenSSL - LIB LibSSH2|x64 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Debug - LIB OpenSSL|Win32 = LIB Debug - LIB OpenSSL|Win32
+ LIB Debug - LIB OpenSSL|x64 = LIB Debug - LIB OpenSSL|x64
+ LIB Debug|Win32 = LIB Debug|Win32
+ LIB Debug|x64 = LIB Debug|x64
+ LIB Release - DLL OpenSSL - DLL LibSSH2|Win32 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ LIB Release - DLL OpenSSL - DLL LibSSH2|x64 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ LIB Release - DLL OpenSSL|Win32 = LIB Release - DLL OpenSSL|Win32
+ LIB Release - DLL OpenSSL|x64 = LIB Release - DLL OpenSSL|x64
+ LIB Release - DLL Windows SSPI - DLL WinIDN|Win32 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ LIB Release - DLL Windows SSPI - DLL WinIDN|x64 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ LIB Release - DLL Windows SSPI|Win32 = LIB Release - DLL Windows SSPI|Win32
+ LIB Release - DLL Windows SSPI|x64 = LIB Release - DLL Windows SSPI|x64
+ LIB Release - LIB OpenSSL - LIB LibSSH2|Win32 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ LIB Release - LIB OpenSSL - LIB LibSSH2|x64 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ LIB Release - LIB OpenSSL|Win32 = LIB Release - LIB OpenSSL|Win32
+ LIB Release - LIB OpenSSL|x64 = LIB Release - LIB OpenSSL|x64
+ LIB Release|Win32 = LIB Release|Win32
+ LIB Release|x64 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.ActiveCfg = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|Win32.Build.0 = DLL Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.ActiveCfg = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL OpenSSL|x64.Build.0 = DLL Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.ActiveCfg = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|Win32.Build.0 = DLL Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.ActiveCfg = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug - DLL Windows SSPI|x64.Build.0 = DLL Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.ActiveCfg = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Debug|x64.Build.0 = DLL Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = DLL Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.ActiveCfg = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|Win32.Build.0 = DLL Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.ActiveCfg = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL OpenSSL|x64.Build.0 = DLL Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = DLL Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.ActiveCfg = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|Win32.Build.0 = DLL Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.ActiveCfg = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release - DLL Windows SSPI|x64.Build.0 = DLL Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.ActiveCfg = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.DLL Release|x64.Build.0 = DLL Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Debug - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.ActiveCfg = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|Win32.Build.0 = LIB Debug - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.ActiveCfg = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL OpenSSL|x64.Build.0 = LIB Debug - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Debug - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.ActiveCfg = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|Win32.Build.0 = LIB Debug - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.ActiveCfg = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - DLL Windows SSPI|x64.Build.0 = LIB Debug - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Debug - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.ActiveCfg = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|Win32.Build.0 = LIB Debug - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.ActiveCfg = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug - LIB OpenSSL|x64.Build.0 = LIB Debug - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.ActiveCfg = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|Win32.Build.0 = LIB Debug|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.ActiveCfg = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Debug|x64.Build.0 = LIB Debug|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|Win32.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL - DLL LibSSH2|x64.Build.0 = LIB Release - DLL OpenSSL - DLL LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.ActiveCfg = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|Win32.Build.0 = LIB Release - DLL OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.ActiveCfg = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL OpenSSL|x64.Build.0 = LIB Release - DLL OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|Win32.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.ActiveCfg = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI - DLL WinIDN|x64.Build.0 = LIB Release - DLL Windows SSPI - DLL WinIDN|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.ActiveCfg = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|Win32.Build.0 = LIB Release - DLL Windows SSPI|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.ActiveCfg = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - DLL Windows SSPI|x64.Build.0 = LIB Release - DLL Windows SSPI|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|Win32.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.ActiveCfg = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL - LIB LibSSH2|x64.Build.0 = LIB Release - LIB OpenSSL - LIB LibSSH2|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.ActiveCfg = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|Win32.Build.0 = LIB Release - LIB OpenSSL|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.ActiveCfg = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release - LIB OpenSSL|x64.Build.0 = LIB Release - LIB OpenSSL|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.ActiveCfg = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|Win32.Build.0 = LIB Release|Win32
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.ActiveCfg = LIB Release|x64
+ {5228E9CE-A216-422F-A5E6-58E95E2DD71D}.LIB Release|x64.Build.0 = LIB Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/projects/Windows/VC9/src/curl.vcproj b/projects/Windows/VC9/src/curl.vcproj
index 6e702f497..d32db51ce 100644
--- a/projects/Windows/VC9/src/curl.vcproj
+++ b/projects/Windows/VC9/src/curl.vcproj
@@ -2351,7 +2351,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC9\DLL Debug"
@@ -2434,7 +2434,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC9\DLL Debug"
@@ -2516,7 +2516,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC9\DLL Release"
@@ -2597,7 +2597,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC9\DLL Release"
@@ -2677,7 +2677,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC9\DLL Debug;..\..\..\..\..\libssh2\build\Win32\VC9\DLL Debug"
@@ -2760,7 +2760,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurld.lib libeay32.lib ssleay32.lib libssh2d.lib"
OutputFile="$(OutDir)\$(ProjectName)d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC9\DLL Debug;..\..\..\..\..\libssh2\build\Win64\VC9\DLL Debug"
@@ -2842,7 +2842,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libeay32.lib ssleay32.lib libssh2.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win32\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win32\VC9\DLL Release;..\..\..\..\..\libssh2\build\Win32\VC9\DLL Release"
@@ -2923,7 +2923,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib wldap32.lib libcurl.lib libssh2.lib libeay32.lib ssleay32.lib"
+ AdditionalDependencies="crypt32.lib ws2_32.lib wldap32.lib libcurl.lib libssh2.lib libeay32.lib ssleay32.lib"
OutputFile="$(OutDir)\$(ProjectName).exe"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\build\Win64\VC9\$(ConfigurationName);..\..\..\..\..\openssl\build\Win64\VC9\DLL Release;..\..\..\..\..\libssh2\build\Win64\VC9\DLL Release"
@@ -3942,6 +3942,14 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\..\lib\dynbuf.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.c"
>
</File>
@@ -3950,6 +3958,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.c"
>
</File>
@@ -4110,6 +4122,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.c"
>
</File>
@@ -4126,10 +4142,18 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\curl_multibyte.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\curl_setup.h"
>
</File>
<File
+ RelativePath="..\..\..\..\lib\dynbuf.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\nonblock.h"
>
</File>
@@ -4138,6 +4162,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\lib\version_win32.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\lib\warnless.h"
>
</File>
@@ -4310,6 +4338,10 @@
>
</File>
<File
+ RelativePath="..\..\..\..\src\tool_writeout_json.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\..\src\tool_xattr.h"
>
</File>
diff --git a/projects/build-wolfssl.bat b/projects/build-wolfssl.bat
index 9a7d67b79..8c6c8ed2f 100644
--- a/projects/build-wolfssl.bat
+++ b/projects/build-wolfssl.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 2012 - 2018, Steve Holme, <steve_holme@hotmail.com>.
+rem * Copyright (C) 2012 - 2020, Steve Holme, <steve_holme@hotmail.com>.
rem * Copyright (C) 2015, Jay Satiro, <raysatiro@yahoo.com>.
rem *
rem * This software is licensed as described in the file COPYING, which
@@ -82,6 +82,20 @@ rem ***************************************************************************
) else (
set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
)
+ ) else if /i "%~1" == "vc14.2" (
+ set VC_VER=14.2
+ set VC_DESC=VC14.2
+ set VC_TOOLSET=v142
+
+ rem Determine the VC14.2 path based on the installed edition in descending
+ rem order (Enterprise, then Professional and finally Community)
+ if exist "%PF%\Microsoft Visual Studio\2019\Enterprise\VC" (
+ set "VC_PATH=Microsoft Visual Studio\2019\Enterprise\VC"
+ ) else if exist "%PF%\Microsoft Visual Studio\2019\Professional\VC" (
+ set "VC_PATH=Microsoft Visual Studio\2019\Professional\VC"
+ ) else (
+ set "VC_PATH=Microsoft Visual Studio\2019\Community\VC"
+ )
) else if /i "%~1" == "x86" (
set BUILD_PLATFORM=x86
) else if /i "%~1" == "x64" (
@@ -133,6 +147,7 @@ rem ***************************************************************************
if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64
+ if "%VC_VER%" == "14.2" set VCVARS_PLATFORM=amd64
)
:start
@@ -141,6 +156,8 @@ rem ***************************************************************************
if "%VC_VER%" == "14.1" (
call "%PF%\%VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
+ ) else if "%VC_VER%" == "14.2" (
+ call "%PF%\%VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
) else (
call "%PF%\%VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
)
@@ -308,6 +325,7 @@ rem ***************************************************************************
echo vc12 - Use Visual Studio 2013
echo vc14 - Use Visual Studio 2015
echo vc14.1 - Use Visual Studio 2017
+ echo vc14.2 - Use Visual Studio 2019
echo.
echo Platform:
echo.
diff --git a/projects/checksrc.bat b/projects/checksrc.bat
index 54c976ad1..2ca90d033 100644
--- a/projects/checksrc.bat
+++ b/projects/checksrc.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 2014 - 2016, Steve Holme, <steve_holme@hotmail.com>.
+rem * Copyright (C) 2014 - 2020, Steve Holme, <steve_holme@hotmail.com>.
rem *
rem * This software is licensed as described in the file COPYING, which
rem * you should have received as part of this distribution. The terms
@@ -31,6 +31,9 @@ rem ***************************************************************************
set CHECK_SRC=TRUE
set CHECK_TESTS=TRUE
set CHECK_EXAMPLES=TRUE
+ set SRC_DIR=
+ set CUR_DIR=%cd%
+ set ARG0_DIR=%~dp0
:parseArgs
if "%~1" == "" goto prerequisites
@@ -88,7 +91,22 @@ rem ***************************************************************************
)
:configure
- if "%SRC_DIR%" == "" set SRC_DIR=..
+ if "%SRC_DIR%" == "" (
+ rem Are we being executed from the "projects" or main directory?
+ if "%CUR_DIR%\" == "%ARG0_DIR%" (
+ set SRC_DIR=..
+ ) else if exist projects (
+ if exist docs (
+ if exist lib (
+ if exist src (
+ if exist tests (
+ set SRC_DIR=.
+ )
+ )
+ )
+ )
+ )
+ )
if not exist "%SRC_DIR%" goto nosrc
:start
@@ -113,6 +131,18 @@ rem ***************************************************************************
for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vauth\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vauth" "%%i"
)
+ rem Check the lib\vquic directory
+ if exist %SRC_DIR%\lib\vquic (
+ for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vquic\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vquic" "%%i"
+ for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vquic\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vquic" "%%i"
+ )
+
+ rem Check the lib\vssh directory
+ if exist %SRC_DIR%\lib\vssh (
+ for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vssh\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vssh" "%%i"
+ for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vssh\*.h.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vssh" "%%i"
+ )
+
rem Check the lib\vtls directory
if exist %SRC_DIR%\lib\vtls (
for /f "delims=" %%i in ('dir "%SRC_DIR%\lib\vtls\*.c.*" /b 2^>NUL') do @perl "%SRC_DIR%\lib\checksrc.pl" "-D%SRC_DIR%\lib\vtls" "%%i"
diff --git a/projects/generate.bat b/projects/generate.bat
index 32a88f51b..bc50245e8 100644
--- a/projects/generate.bat
+++ b/projects/generate.bat
@@ -6,7 +6,7 @@ rem * / __| | | | |_) | |
rem * | (__| |_| | _ <| |___
rem * \___|\___/|_| \_\_____|
rem *
-rem * Copyright (C) 2014 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+rem * Copyright (C) 2014 - 2020, Steve Holme, <steve_holme@hotmail.com>.
rem *
rem * This software is licensed as described in the file COPYING, which
rem * you should have received as part of this distribution. The terms
@@ -285,6 +285,9 @@ rem
call :element %1 lib "nonblock.c" %3
call :element %1 lib "warnless.c" %3
call :element %1 lib "curl_ctype.c" %3
+ call :element %1 lib "curl_multibyte.c" %3
+ call :element %1 lib "version_win32.c" %3
+ call :element %1 lib "dynbuf.c" %3
) else if "!var!" == "CURL_SRC_X_H_FILES" (
call :element %1 lib "config-win32.h" %3
call :element %1 lib "curl_setup.h" %3
@@ -292,6 +295,9 @@ rem
call :element %1 lib "nonblock.h" %3
call :element %1 lib "warnless.h" %3
call :element %1 lib "curl_ctype.h" %3
+ call :element %1 lib "curl_multibyte.h" %3
+ call :element %1 lib "version_win32.h" %3
+ call :element %1 lib "dynbuf.h" %3
) else if "!var!" == "CURL_LIB_C_FILES" (
for /f "delims=" %%c in ('dir /b ..\lib\*.c') do call :element %1 lib "%%c" %3
) else if "!var!" == "CURL_LIB_H_FILES" (
@@ -303,6 +309,14 @@ rem
for /f "delims=" %%c in ('dir /b ..\lib\vauth\*.c') do call :element %1 lib\vauth "%%c" %3
) else if "!var!" == "CURL_LIB_VAUTH_H_FILES" (
for /f "delims=" %%h in ('dir /b ..\lib\vauth\*.h') do call :element %1 lib\vauth "%%h" %3
+ ) else if "!var!" == "CURL_LIB_VQUIC_C_FILES" (
+ for /f "delims=" %%c in ('dir /b ..\lib\vquic\*.c') do call :element %1 lib\vquic "%%c" %3
+ ) else if "!var!" == "CURL_LIB_VQUIC_H_FILES" (
+ for /f "delims=" %%h in ('dir /b ..\lib\vquic\*.h') do call :element %1 lib\vquic "%%h" %3
+ ) else if "!var!" == "CURL_LIB_VSSH_C_FILES" (
+ for /f "delims=" %%c in ('dir /b ..\lib\vssh\*.c') do call :element %1 lib\vssh "%%c" %3
+ ) else if "!var!" == "CURL_LIB_VSSH_H_FILES" (
+ for /f "delims=" %%h in ('dir /b ..\lib\vssh\*.h') do call :element %1 lib\vssh "%%h" %3
) else if "!var!" == "CURL_LIB_VTLS_C_FILES" (
for /f "delims=" %%c in ('dir /b ..\lib\vtls\*.c') do call :element %1 lib\vtls "%%c" %3
) else if "!var!" == "CURL_LIB_VTLS_H_FILES" (
@@ -319,7 +333,7 @@ rem Generates a single file xml element.
rem
rem %1 - Project Type (dsp for VC6, vcproj1 for VC7 and VC7.1, vcproj2 for VC8 and VC9
rem or vcxproj for VC10, VC11, VC12, VC14 and VC15)
-rem %2 - Directory (src, lib, lib\vauth or lib\vtls)
+rem %2 - Directory (src, lib, lib\vauth, lib\vquic, lib\vssh, lib\vtls)
rem %3 - Source filename
rem %4 - Output project file
rem
@@ -327,6 +341,10 @@ rem
set "SPACES= "
if "%2" == "lib\vauth" (
set "TABS= "
+ ) else if "%2" == "lib\vquic" (
+ set "TABS= "
+ ) else if "%2" == "lib\vssh" (
+ set "TABS= "
) else if "%2" == "lib\vtls" (
set "TABS= "
) else (
diff --git a/projects/wolfssl_options.h b/projects/wolfssl_options.h
index 946e1000d..b8022cfd8 100644
--- a/projects/wolfssl_options.h
+++ b/projects/wolfssl_options.h
@@ -1,3 +1,24 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
/*
By default wolfSSL has a very conservative configuration that can result in
connections to servers failing due to certificate or algorithm problems.
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 297b8d29b..e56938da9 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/scripts/completion.pl b/scripts/completion.pl
index 1c41755b4..c717c6d43 100755
--- a/scripts/completion.pl
+++ b/scripts/completion.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
use strict;
use warnings;
diff --git a/scripts/coverage.sh b/scripts/coverage.sh
index 86cd7a122..cae5e028f 100755
--- a/scripts/coverage.sh
+++ b/scripts/coverage.sh
@@ -1,4 +1,25 @@
#!/bin/sh
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
./buildconf
mkdir -p cvr
diff --git a/scripts/updatemanpages.pl b/scripts/updatemanpages.pl
index e144bad11..21a7df174 100755
--- a/scripts/updatemanpages.pl
+++ b/scripts/updatemanpages.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 63e2b943d..b994ae961 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
set(EXE_NAME curl)
if(USE_MANUAL)
@@ -46,6 +67,23 @@ add_executable(
${CURL_FILES}
)
+add_executable(
+ ${PROJECT_NAME}::${EXE_NAME}
+ ALIAS ${EXE_NAME}
+ )
+
+if(CURL_HAS_LTO)
+ set_target_properties(${EXE_NAME} PROPERTIES
+ INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE
+ INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
+endif()
+
+if(ENABLE_UNICODE AND MINGW)
+ target_link_libraries(${EXE_NAME} -municode)
+ # GCC doesn't know about wmain
+ set_source_files_properties(tool_main.c PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes -Wno-missing-declarations")
+endif()
+
source_group("curlX source files" FILES ${CURLX_CFILES})
source_group("curl source files" FILES ${CURL_CFILES})
source_group("curl header files" FILES ${CURL_HFILES})
@@ -72,5 +110,5 @@ target_link_libraries(${EXE_NAME} libcurl ${CURL_LIBS})
install(TARGETS ${EXE_NAME} EXPORT ${TARGETS_EXPORT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR})
export(TARGETS ${EXE_NAME}
APPEND FILE ${PROJECT_BINARY_DIR}/curl-target.cmake
- NAMESPACE CURL::
+ NAMESPACE ${PROJECT_NAME}::
)
diff --git a/src/Makefile.Watcom b/src/Makefile.Watcom
deleted file mode 100644
index 25cd3bf88..000000000
--- a/src/Makefile.Watcom
+++ /dev/null
@@ -1,234 +0,0 @@
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) 2005 - 2008, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2005 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.haxx.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-#***************************************************************************
-
-#
-# Watcom / OpenWatcom / Win32 makefile for curl.
-#
-
-.ERASE
-
-!if $(__VERSION__) < 1280
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!message ! This Open Watcom version is too old and is no longer supported !
-!message ! Please download latest version from www.openwatcom.org !
-!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!error Unsupported version of Open Watcom
-!endif
-
-!ifndef %watcom
-!error WATCOM environment variable not set!
-!endif
-
-# In order to process Makefile.inc wmake must be called with -u switch!
-!ifndef %MAKEFLAGS
-!error You MUST call wmake with the -u switch!
-!endif
-
-!ifdef %libname
-LIBNAME = $(%libname)
-!else
-LIBNAME = libcurl
-!endif
-
-TARGETS = curl.exe
-
-CC = wcc386
-LD = wlink
-AR = wlib
-RC = wrc
-
-!ifdef __LOADDLL__
-! loaddll wcc386 wccd386
-! loaddll wpp386 wppd386
-! loaddll wlib wlibd
-! loaddll wlink wlinkd
-!endif
-
-!ifdef __UNIX__
-CP = cp
-MD = mkdir -p
-!else
-CP = copy 2>NUL
-MD = mkdir
-!endif
-!if $(__VERSION__) > 1290
-RD = rm -rf
-!else ifdef __UNIX__
-RD = rm -rf
-!else
-RD = rmdir /q /s 2>NUL
-!endif
-
-SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h"
-
-CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm &
- -wcd=201 -bt=nt -bc -d+ -dWIN32 -dHAVE_STRTOLL &
- -I"../include" -I"../lib" $(SYS_INCL)
-
-!ifdef %debug
-DEBUG = -dDEBUG=1 -dDEBUGBUILD
-CFLAGS += -d3 $(DEBUG)
-!else
-CFLAGS += -d0
-!endif
-
-!ifdef %use_ipv6
-CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6
-!endif
-
-!ifdef %use_ssl
-CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32"
-!endif
-
-!ifdef %curl_static
-CFLAGS += -DCURL_STATICLIB
-!else
-CFLAGS += -br
-!endif
-
-#
-# Change to suite.
-#
-!ifdef %zlib_root
-ZLIB_ROOT = $(%zlib_root)
-!else
-ZLIB_ROOT = ../../zlib-1.2.8
-!endif
-
-!ifdef %libssh2_root
-LIBSSH2_ROOT = $(%libssh2_root)
-!else
-LIBSSH2_ROOT = ../../libssh2-1.5.0
-!endif
-
-!ifdef %librtmp_root
-LIBRTMP_ROOT = $(%librtmp_root)
-!else
-LIBRTMP_ROOT = ../../rtmpdump-2.3
-!endif
-
-!ifdef %openssl_root
-OPENSSL_ROOT = $(%openssl_root)
-!else
-OPENSSL_ROOT = ../../openssl-1.0.2a
-!endif
-
-!ifdef %ares_root
-ARES_ROOT = $(%ares_root)
-!else
-ARES_ROOT = ../ares
-!endif
-
-OBJ_DIR = WC_Win32.obj
-LINK_ARG = $(OBJ_DIR)/wlink.arg
-
-!include Makefile.inc
-
-OBJS1 = $(OBJ_DIR)/$(CURL_CFILES)
-!ifndef %curl_static
-OBJS1 += $(CURLX_CFILES:../lib/=)
-!endif
-OBJS2 = $(OBJS1: = $(OBJ_DIR)/)
-OBJS = $(OBJS2:.c=.obj)
-
-RESOURCE = $(OBJ_DIR)/curl.res
-
-DIRS = $(OBJ_DIR)
-
-all: tool_hugehelp.c $(DIRS) $(TARGETS) .SYMBOLIC
- @echo Welcome to curl
-
-clean: .SYMBOLIC
- -rm -f $(OBJS)
- -rm -f $(RESOURCE) $(LINK_ARG)
-
-vclean distclean: clean .SYMBOLIC
- -$(RD) $(OBJ_DIR)
- -rm -f curl.exe curl.sym tool_hugehelp.c
-
-tool_hugehelp.c: tool_hugehelp.c.cvs
- $(CP) $[@ $^@
-
-tool_hugehelp.c.cvs: .EXISTSONLY
- $(CP) tool_hugehelp.c $^@
-
-$(DIRS):
- -$(MD) $^@
-
-curl.exe: $(OBJS) $(RESOURCE)
- %create $(LINK_ARG)
- @%append $(LINK_ARG) system nt
-!ifdef %debug
- @%append $(LINK_ARG) debug all
- @%append $(LINK_ARG) option symfile
-!endif
- @%append $(LINK_ARG) option quiet, caseexact, eliminate
- @%append $(LINK_ARG) option map=$(OBJ_DIR)/$^&.map
- @%append $(LINK_ARG) option res=$(RESOURCE)
- @%append $(LINK_ARG) file { $(OBJS) }
-!ifndef %curl_static
- @%append $(LINK_ARG) library ../lib/$(LIBNAME)_imp.lib
-!else
- @%append $(LINK_ARG) library ../lib/$(LIBNAME).lib
- @%append $(LINK_ARG) library wldap32.lib
-! ifdef %use_zlib
- @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib'
-! endif
-! ifdef %use_rtmp
- @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib'
- @%append $(LINK_ARG) library winmm.lib
-! endif
-! ifdef %use_ssh2
- @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib'
-! endif
-! ifdef %use_ssl
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib'
- @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib'
-! endif
-! ifdef %use_ares
- @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib'
-! endif
-! ifdef %use_winidn
-! if $(__VERSION__) > 1290
- @%append $(LINK_ARG) library normaliz.lib
-! else
- @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii'
- @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode'
-! endif
-! endif
-!endif
-!ifeq USE_WATT32 1
- @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib'
-!else
- @%append $(LINK_ARG) library ws2_32.lib
-!endif
- $(LD) name $^@ @$(LINK_ARG)
-
-$(RESOURCE): curl.rc
- $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@
-
-# suffix search path - vpath-like hack
-.c: ../lib
-
-.c{$(OBJ_DIR)}.obj:
- $(CC) $(CFLAGS) $[@ -fo=$^@
diff --git a/src/Makefile.am b/src/Makefile.am
index 90f156248..029a49285 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -87,7 +87,7 @@ NROFF=env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script
EXTRA_DIST = mkhelp.pl makefile.dj \
Makefile.m32 macos/curl.mcp.xml.sit.hqx macos/MACINSTALL.TXT \
macos/src/curl_GUSIConfig.cpp macos/src/macos_main.cpp makefile.amiga \
- curl.rc Makefile.netware Makefile.inc Makefile.Watcom CMakeLists.txt
+ curl.rc Makefile.netware Makefile.inc CMakeLists.txt
# Use absolute directory to disable VPATH
MANPAGE=$(abs_top_builddir)/docs/curl.1
diff --git a/src/Makefile.inc b/src/Makefile.inc
index dd6b9d336..6f236fecc 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# ./src/Makefile.inc
# Using the backslash as line continuation character might be problematic
# with some make flavours, as Watcom's wmake showed us already. If we
@@ -13,14 +34,20 @@ CURLX_CFILES = \
../lib/strtoofft.c \
../lib/nonblock.c \
../lib/warnless.c \
- ../lib/curl_ctype.c
+ ../lib/curl_ctype.c \
+ ../lib/curl_multibyte.c \
+ ../lib/version_win32.c \
+ ../lib/dynbuf.c
CURLX_HFILES = \
../lib/curl_setup.h \
../lib/strtoofft.h \
../lib/nonblock.h \
../lib/warnless.h \
- ../lib/curl_ctype.h
+ ../lib/curl_ctype.h \
+ ../lib/curl_multibyte.h \
+ ../lib/version_win32.h \
+ ../lib/dynbuf.h
CURL_CFILES = \
slist_wc.c \
@@ -62,6 +89,7 @@ CURL_CFILES = \
tool_util.c \
tool_vms.c \
tool_writeout.c \
+ tool_writeout_json.c \
tool_xattr.c
CURL_HFILES = \
@@ -107,6 +135,7 @@ CURL_HFILES = \
tool_version.h \
tool_vms.h \
tool_writeout.h \
+ tool_writeout_json.h \
tool_xattr.h
CURL_RCFILES = curl.rc
diff --git a/src/Makefile.m32 b/src/Makefile.m32
index e13db04b9..b3fcae5cf 100644
--- a/src/Makefile.m32
+++ b/src/Makefile.m32
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
#
## Makefile for building curl.exe with MingW (GCC-3.2 or later or LLVM/Clang)
## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4),
-## brotli (1.0.1)
+## brotli (1.0.1), zstd (1.4.5)
##
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
@@ -39,6 +39,10 @@
ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.8
endif
+# Edit the path below to point to the base of your Zstandard sources.
+ifndef ZSTD_PATH
+ZSTD_PATH = ../../zstd-1.4.5
+endif
# Edit the path below to point to the base of your Brotli sources.
ifndef BROTLI_PATH
BROTLI_PATH = ../../brotli-1.0.1
@@ -107,7 +111,7 @@ CFLAGS += -fno-strict-aliasing
LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE) -s
AR = $(CURL_AR)
RC = $(CROSSPREFIX)windres
-RCFLAGS = --include-dir=$(PROOT)/include -O COFF -DCURL_EMBED_MANIFEST
+RCFLAGS = --include-dir=$(PROOT)/include -O coff -DCURL_EMBED_MANIFEST
STRIP = $(CROSSPREFIX)strip -g
# We may need these someday
@@ -189,6 +193,9 @@ endif
ifeq ($(findstring -zlib,$(CFG)),-zlib)
ZLIB = 1
endif
+ifeq ($(findstring -zstd,$(CFG)),-zstd)
+ZSTD = 1
+endif
ifeq ($(findstring -brotli,$(CFG)),-brotli)
BROTLI = 1
endif
@@ -302,6 +309,16 @@ ifdef ZLIB
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
curl_LDADD += -L"$(ZLIB_PATH)" -lz
endif
+ifdef ZSTD
+ INCLUDES += -I"$(ZSTD_PATH)/include"
+ CFLAGS += -DHAVE_ZSTD
+ curl_LDADD += -L"$(ZSTD_PATH)/lib"
+ ifdef ZSTD_LIBS
+ curl_LDADD += $(ZSTD_LIBS)
+ else
+ curl_LDADD += -lzstd
+ endif
+endif
ifdef BROTLI
INCLUDES += -I"$(BROTLI_PATH)/include"
CFLAGS += -DHAVE_BROTLI
@@ -363,10 +380,8 @@ include Makefile.inc
curl_PROGRAMS = curl.exe
curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES)))
curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES))))
-ifdef DYN
curl_OBJECTS += $(curlx_OBJECTS)
vpath %.c $(PROOT)/lib
-endif
RESOURCE = curl.res
diff --git a/src/macos/src/macos_main.cpp b/src/macos/src/macos_main.cpp
index cf3075ffc..51cf894b1 100644
--- a/src/macos/src/macos_main.cpp
+++ b/src/macos/src/macos_main.cpp
@@ -1 +1 @@
-/* ========================================================================= Copyright (C) 2001 Eric Lavigne Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: - The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. - The origin of this software must not be misrepresented, either by explicit claim or by omission. - You are allowed to distributed modified copies of the software, in source and binary form, provided they are marked plainly as altered versions, and are not misrepresented as being the original software. ========================================================================= */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <Memory.h> #include <GUSICommandLine.h> #include <stdlib.h> /* ========================================================================= */ DECLARE_MAIN(curl) REGISTER_MAIN_START REGISTER_MAIN(curl) REGISTER_MAIN_END /* ========================================================================= */ int main() { ::MaxApplZone(); for (int i = 1; i <= 10; i++) ::MoreMasters(); (void) exec_commands(); return 0; } \ No newline at end of file
+/* ========================================================================= Copyright (C) 2001 - 2020, Eric Lavigne Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: - The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. - The origin of this software must not be misrepresented, either by explicit claim or by omission. - You are allowed to distributed modified copies of the software, in source and binary form, provided they are marked plainly as altered versions, and are not misrepresented as being the original software. ========================================================================= */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <Memory.h> #include <GUSICommandLine.h> #include <stdlib.h> /* ========================================================================= */ DECLARE_MAIN(curl) REGISTER_MAIN_START REGISTER_MAIN(curl) REGISTER_MAIN_END /* ========================================================================= */ int main() { ::MaxApplZone(); for (int i = 1; i <= 10; i++) ::MoreMasters(); (void) exec_commands(); return 0; } \ No newline at end of file
diff --git a/src/makefile.amiga b/src/makefile.amiga
index 3bc0080f8..38c426834 100644
--- a/src/makefile.amiga
+++ b/src/makefile.amiga
@@ -1,5 +1,26 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
#
-# $VER: curl Makefile for AmigaOS ...
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# curl Makefile for AmigaOS ...
#
# change the follow to where you have the AmiTCP SDK v4.3 includes:
diff --git a/src/makefile.dj b/src/makefile.dj
index a9f5d3a5e..259d4c908 100644
--- a/src/makefile.dj
+++ b/src/makefile.dj
@@ -6,7 +6,7 @@
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2003 - 2007, Gisle Vanem <gvanem@yahoo.no>.
-# Copyright (C) 2003 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2003 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/src/slist_wc.c b/src/slist_wc.c
index 5233b1b3b..da25632d1 100644
--- a/src/slist_wc.c
+++ b/src/slist_wc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/slist_wc.h b/src/slist_wc.h
index 9bd6993db..54f871bfe 100644
--- a/src/slist_wc.h
+++ b/src/slist_wc.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_binmode.c b/src/tool_binmode.c
index f70015641..b88a0fd26 100644
--- a/src/tool_binmode.c
+++ b/src/tool_binmode.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_binmode.h b/src/tool_binmode.h
index 07b7ffedf..1ff0f76a8 100644
--- a/src/tool_binmode.h
+++ b/src/tool_binmode.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_bname.c b/src/tool_bname.c
index 761192fe9..6014c6bd8 100644
--- a/src/tool_bname.c
+++ b/src/tool_bname.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_bname.h b/src/tool_bname.h
index 66e7c1733..dfde5897c 100644
--- a/src/tool_bname.h
+++ b/src/tool_bname.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_cb_dbg.c b/src/tool_cb_dbg.c
index bb8c2635b..1c42db8a5 100644
--- a/src/tool_cb_dbg.c
+++ b/src/tool_cb_dbg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -65,6 +65,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type,
known_offset = 1;
}
secs = epoch_offset + tv.tv_sec;
+ /* !checksrc! disable BANNEDFUNC 1 */
now = localtime(&secs); /* not thread safe but we don't care */
msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ",
now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
diff --git a/src/tool_cb_dbg.h b/src/tool_cb_dbg.h
index 433e74616..8883bb162 100644
--- a/src/tool_cb_dbg.h
+++ b/src/tool_cb_dbg.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
index b0880f186..6c6c095c7 100644
--- a/src/tool_cb_hdr.c
+++ b/src/tool_cb_hdr.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,6 +59,7 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
struct HdrCbData *hdrcbdata = &per->hdrcbdata;
struct OutStruct *outs = &per->outs;
struct OutStruct *heads = &per->heads;
+ struct OutStruct *etag_save = &per->etag_save;
const char *str = ptr;
const size_t cb = size * nmemb;
const char *end = (char *)ptr + cb;
@@ -72,12 +73,12 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
*/
size_t failure = (size && nmemb) ? 0 : 1;
- if(!heads->config)
+ if(!per->config)
return failure;
#ifdef DEBUGBUILD
if(size * nmemb > (size_t)CURL_MAX_HTTP_HEADER) {
- warnf(heads->config->global, "Header data exceeds single call write "
+ warnf(per->config->global, "Header data exceeds single call write "
"limit!\n");
return failure;
}
@@ -87,7 +88,7 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
* Write header data when curl option --dump-header (-D) is given.
*/
- if(heads->config->headerfile && heads->stream) {
+ if(per->config->headerfile && heads->stream) {
size_t rc = fwrite(ptr, size, nmemb, heads->stream);
if(rc != cb)
return rc;
@@ -96,6 +97,31 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
}
/*
+ * Write etag to file when --etag-save option is given.
+ */
+ if(per->config->etag_save_file && etag_save->stream) {
+ /* match only header that start with etag (case insensitive) */
+ if(curl_strnequal(str, "etag:", 5)) {
+ const char *etag_h = &str[5];
+ const char *eot = end - 1;
+ if(*eot == '\n') {
+ while(ISSPACE(*etag_h) && (etag_h < eot))
+ etag_h++;
+ while(ISSPACE(*eot))
+ eot--;
+
+ if(eot >= etag_h) {
+ size_t etag_length = eot - etag_h + 1;
+ fwrite(etag_h, size, etag_length, etag_save->stream);
+ /* terminate with newline */
+ fputc('\n', etag_save->stream);
+ (void)fflush(etag_save->stream);
+ }
+ }
+ }
+ }
+
+ /*
* This callback sets the filename where output shall be written when
* curl options --remote-name (-O) and --remote-header-name (-J) have
* been simultaneously given and additionally server returns an HTTP
@@ -134,47 +160,43 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
filename = parse_filename(p, len);
if(filename) {
if(outs->stream) {
- int rc;
- /* already opened and possibly written to */
- if(outs->fopened)
- fclose(outs->stream);
- outs->stream = NULL;
-
- /* rename the initial file name to the new file name */
- rc = rename(outs->filename, filename);
- if(rc != 0) {
- warnf(outs->config->global, "Failed to rename %s -> %s: %s\n",
- outs->filename, filename, strerror(errno));
- }
- if(outs->alloc_filename)
- Curl_safefree(outs->filename);
- if(rc != 0) {
- free(filename);
- return failure;
- }
+ /* indication of problem, get out! */
+ free(filename);
+ return failure;
}
+
outs->is_cd_filename = TRUE;
outs->s_isreg = TRUE;
outs->fopened = FALSE;
outs->filename = filename;
outs->alloc_filename = TRUE;
hdrcbdata->honor_cd_filename = FALSE; /* done now! */
- if(!tool_create_output_file(outs))
+ if(!tool_create_output_file(outs, per->config))
return failure;
}
break;
}
- if(!outs->stream && !tool_create_output_file(outs))
+ if(!outs->stream && !tool_create_output_file(outs, per->config))
return failure;
}
-
+ if(hdrcbdata->config->writeout) {
+ char *value = memchr(ptr, ':', cb);
+ if(value) {
+ if(per->was_last_header_empty)
+ per->num_headers = 0;
+ per->was_last_header_empty = FALSE;
+ per->num_headers++;
+ }
+ else if(ptr[0] == '\r' || ptr[0] == '\n')
+ per->was_last_header_empty = TRUE;
+ }
if(hdrcbdata->config->show_headers &&
(protocol &
(CURLPROTO_HTTP|CURLPROTO_HTTPS|CURLPROTO_RTSP|CURLPROTO_FILE))) {
/* bold headers only for selected protocols */
char *value = NULL;
- if(!outs->stream && !tool_create_output_file(outs))
+ if(!outs->stream && !tool_create_output_file(outs, per->config))
return failure;
if(hdrcbdata->global->isatty && hdrcbdata->global->styled_output)
diff --git a/src/tool_cb_hdr.h b/src/tool_cb_hdr.h
index cf544dfcb..ec5772f55 100644
--- a/src/tool_cb_hdr.h
+++ b/src/tool_cb_hdr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,6 +43,7 @@ struct HdrCbData {
struct OperationConfig *config;
struct OutStruct *outs;
struct OutStruct *heads;
+ struct OutStruct *etag_save;
bool honor_cd_filename;
};
diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c
index a18827c8b..aad451b87 100644
--- a/src/tool_cb_prg.c
+++ b/src/tool_cb_prg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,6 +32,7 @@
#include "tool_cfgable.h"
#include "tool_cb_prg.h"
#include "tool_util.h"
+#include "tool_operate.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -45,25 +46,32 @@
my $pi = 3.1415;
foreach my $i (1 .. 200) {
- printf "%d, ", sin($i/200 * 2 * $pi) * 5000 + 5000;
+ printf "%d, ", sin($i/200 * 2 * $pi) * 500000 + 500000;
}
*/
static const unsigned int sinus[] = {
- 5157, 5313, 5470, 5626, 5782, 5936, 6090, 6243, 6394, 6545, 6693, 6840, 6985,
- 7128, 7269, 7408, 7545, 7679, 7810, 7938, 8064, 8187, 8306, 8422, 8535, 8644,
- 8750, 8852, 8950, 9045, 9135, 9221, 9303, 9381, 9454, 9524, 9588, 9648, 9704,
- 9755, 9801, 9842, 9879, 9911, 9938, 9960, 9977, 9990, 9997, 9999, 9997, 9990,
- 9977, 9960, 9938, 9911, 9879, 9842, 9801, 9755, 9704, 9648, 9588, 9524, 9455,
- 9381, 9303, 9221, 9135, 9045, 8950, 8852, 8750, 8645, 8535, 8422, 8306, 8187,
- 8064, 7939, 7810, 7679, 7545, 7409, 7270, 7129, 6986, 6841, 6694, 6545, 6395,
- 6243, 6091, 5937, 5782, 5627, 5470, 5314, 5157, 5000, 4843, 4686, 4529, 4373,
- 4218, 4063, 3909, 3757, 3605, 3455, 3306, 3159, 3014, 2871, 2730, 2591, 2455,
- 2321, 2190, 2061, 1935, 1813, 1693, 1577, 1464, 1355, 1249, 1147, 1049, 955,
- 864, 778, 696, 618, 545, 476, 411, 351, 295, 244, 198, 157, 120, 88, 61, 39,
- 22, 9, 2, 0, 2, 9, 22, 39, 61, 88, 120, 156, 198, 244, 295, 350, 410, 475,
- 544, 618, 695, 777, 864, 954, 1048, 1146, 1248, 1354, 1463, 1576, 1692, 1812,
- 1934, 2060, 2188, 2320, 2454, 2590, 2729, 2870, 3013, 3158, 3305, 3454, 3604,
- 3755, 3908, 4062, 4216, 4372, 4528, 4685, 4842, 4999
+ 515704, 531394, 547052, 562664, 578214, 593687, 609068, 624341, 639491,
+ 654504, 669364, 684057, 698568, 712883, 726989, 740870, 754513, 767906,
+ 781034, 793885, 806445, 818704, 830647, 842265, 853545, 864476, 875047,
+ 885248, 895069, 904500, 913532, 922156, 930363, 938145, 945495, 952406,
+ 958870, 964881, 970434, 975522, 980141, 984286, 987954, 991139, 993840,
+ 996054, 997778, 999011, 999752, 999999, 999754, 999014, 997783, 996060,
+ 993848, 991148, 987964, 984298, 980154, 975536, 970449, 964898, 958888,
+ 952426, 945516, 938168, 930386, 922180, 913558, 904527, 895097, 885277,
+ 875077, 864507, 853577, 842299, 830682, 818739, 806482, 793922, 781072,
+ 767945, 754553, 740910, 727030, 712925, 698610, 684100, 669407, 654548,
+ 639536, 624386, 609113, 593733, 578260, 562710, 547098, 531440, 515751,
+ 500046, 484341, 468651, 452993, 437381, 421830, 406357, 390976, 375703,
+ 360552, 345539, 330679, 315985, 301474, 287158, 273052, 259170, 245525,
+ 232132, 219003, 206152, 193590, 181331, 169386, 157768, 146487, 135555,
+ 124983, 114781, 104959, 95526, 86493, 77868, 69660, 61876, 54525, 47613,
+ 41147, 35135, 29581, 24491, 19871, 15724, 12056, 8868, 6166, 3951, 2225,
+ 990, 248, 0, 244, 982, 2212, 3933, 6144, 8842, 12025, 15690, 19832, 24448,
+ 29534, 35084, 41092, 47554, 54462, 61809, 69589, 77794, 86415, 95445,
+ 104873, 114692, 124891, 135460, 146389, 157667, 169282, 181224, 193480,
+ 206039, 218888, 232015, 245406, 259048, 272928, 287032, 301346, 315856,
+ 330548, 345407, 360419, 375568, 390841, 406221, 421693, 437243, 452854,
+ 468513, 484202, 499907
};
static void fly(struct ProgressData *bar, bool moved)
@@ -75,13 +83,13 @@ static void fly(struct ProgressData *bar, bool moved)
msnprintf(buf, sizeof(buf), "%*s\r", bar->width-1, " ");
memcpy(&buf[bar->bar], "-=O=-", 5);
- pos = sinus[bar->tick%200] / (10000 / check);
+ pos = sinus[bar->tick%200] / (1000000 / check);
buf[pos] = '#';
- pos = sinus[(bar->tick + 5)%200] / (10000 / check);
+ pos = sinus[(bar->tick + 5)%200] / (1000000 / check);
buf[pos] = '#';
- pos = sinus[(bar->tick + 10)%200] / (10000 / check);
+ pos = sinus[(bar->tick + 10)%200] / (1000000 / check);
buf[pos] = '#';
- pos = sinus[(bar->tick + 15)%200] / (10000 / check);
+ pos = sinus[(bar->tick + 15)%200] / (1000000 / check);
buf[pos] = '#';
fputs(buf, bar->out);
@@ -121,7 +129,9 @@ int tool_progress_cb(void *clientp,
and this new edition inherits some of his concepts. */
struct timeval now = tvnow();
- struct ProgressData *bar = (struct ProgressData *)clientp;
+ struct per_transfer *per = clientp;
+ struct OperationConfig *config = per->config;
+ struct ProgressData *bar = &per->progressbar;
curl_off_t total;
curl_off_t point;
@@ -191,6 +201,11 @@ int tool_progress_cb(void *clientp,
bar->prev = point;
bar->prevtime = now;
+ if(config->readbusy) {
+ config->readbusy = FALSE;
+ curl_easy_pause(per->curl, CURLPAUSE_CONT);
+ }
+
return 0;
}
@@ -243,7 +258,8 @@ void progressbarinit(struct ProgressData *bar,
}
}
#endif /* TIOCGSIZE */
- bar->width = cols;
+ if(cols > 20)
+ bar->width = cols;
}
if(!bar->width)
diff --git a/src/tool_cb_rea.c b/src/tool_cb_rea.c
index 8a33c847b..78a169fb0 100644
--- a/src/tool_cb_rea.c
+++ b/src/tool_cb_rea.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,6 +27,7 @@
#include "tool_cfgable.h"
#include "tool_cb_rea.h"
+#include "tool_operate.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -52,3 +53,27 @@ size_t tool_read_cb(void *buffer, size_t sz, size_t nmemb, void *userdata)
in->config->readbusy = FALSE;
return (size_t)rc;
}
+
+/*
+** callback for CURLOPT_XFERINFOFUNCTION used to unpause busy reads
+*/
+
+int tool_readbusy_cb(void *clientp,
+ curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow)
+{
+ struct per_transfer *per = clientp;
+ struct OperationConfig *config = per->config;
+
+ (void)dltotal; /* unused */
+ (void)dlnow; /* unused */
+ (void)ultotal; /* unused */
+ (void)ulnow; /* unused */
+
+ if(config->readbusy) {
+ config->readbusy = FALSE;
+ curl_easy_pause(per->curl, CURLPAUSE_CONT);
+ }
+
+ return per->noprogress? 0 : CURL_PROGRESSFUNC_CONTINUE;
+}
diff --git a/src/tool_cb_rea.h b/src/tool_cb_rea.h
index 475f0b1c3..5f7e483a3 100644
--- a/src/tool_cb_rea.h
+++ b/src/tool_cb_rea.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -29,4 +29,12 @@
size_t tool_read_cb(void *buffer, size_t sz, size_t nmemb, void *userdata);
+/*
+** callback for CURLOPT_XFERINFOFUNCTION used to unpause busy reads
+*/
+
+int tool_readbusy_cb(void *clientp,
+ curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow);
+
#endif /* HEADER_CURL_TOOL_CB_REA_H */
diff --git a/src/tool_cb_see.c b/src/tool_cb_see.c
index 891dc458a..9d660313e 100644
--- a/src/tool_cb_see.c
+++ b/src/tool_cb_see.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -88,7 +88,7 @@ int tool_seek_cb(void *userdata, curl_off_t offset, int whence)
return CURL_SEEKFUNC_OK;
}
-#if defined(WIN32) && !defined(__MINGW64__)
+#ifdef USE_TOOL_FTRUNCATE
#ifdef __BORLANDC__
/* 64-bit lseek-like function unavailable */
@@ -129,4 +129,4 @@ int tool_ftruncate64(int fd, curl_off_t where)
return 0;
}
-#endif /* WIN32 && ! __MINGW64__ */
+#endif /* USE_TOOL_FTRUNCATE */
diff --git a/src/tool_cb_see.h b/src/tool_cb_see.h
index ff8de0e9a..b5b787ed0 100644
--- a/src/tool_cb_see.h
+++ b/src/tool_cb_see.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,18 +23,17 @@
***************************************************************************/
#include "tool_setup.h"
-#if defined(WIN32) && !defined(__MINGW64__)
+#if defined(WIN32) && !defined(HAVE_FTRUNCATE)
int tool_ftruncate64(int fd, curl_off_t where);
#undef ftruncate
#define ftruncate(fd,where) tool_ftruncate64(fd,where)
-#ifndef HAVE_FTRUNCATE
-# define HAVE_FTRUNCATE 1
-#endif
+#define HAVE_FTRUNCATE 1
+#define USE_TOOL_FTRUNCATE 1
-#endif /* WIN32 && ! __MINGW64__ */
+#endif /* WIN32 && ! HAVE_FTRUNCATE */
/*
** callback for CURLOPT_SEEKFUNCTION
diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c
index 0f47b4d0f..6fc51f9a5 100644
--- a/src/tool_cb_wrt.c
+++ b/src/tool_cb_wrt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,6 +21,13 @@
***************************************************************************/
#include "tool_setup.h"
+#ifdef HAVE_FCNTL_H
+/* for open() */
+#include <fcntl.h>
+#endif
+
+#include <sys/stat.h>
+
#define ENABLE_CURLX_PRINTF
/* use our own printf() functions */
#include "curlx.h"
@@ -32,12 +39,24 @@
#include "memdebug.h" /* keep this as LAST include */
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+#ifdef WIN32
+#define OPENMODE S_IREAD | S_IWRITE
+#else
+#define OPENMODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
+#endif
+
/* create a local file for writing, return TRUE on success */
-bool tool_create_output_file(struct OutStruct *outs)
+bool tool_create_output_file(struct OutStruct *outs,
+ struct OperationConfig *config)
{
- struct GlobalConfig *global = outs->config->global;
- FILE *file;
-
+ struct GlobalConfig *global;
+ FILE *file = NULL;
+ DEBUGASSERT(outs);
+ DEBUGASSERT(config);
+ global = config->global;
if(!outs->filename || !*outs->filename) {
warnf(global, "Remote filename has no length!\n");
return FALSE;
@@ -45,17 +64,29 @@ bool tool_create_output_file(struct OutStruct *outs)
if(outs->is_cd_filename) {
/* don't overwrite existing files */
- file = fopen(outs->filename, "rb");
- if(file) {
- fclose(file);
- warnf(global, "Refusing to overwrite %s: %s\n", outs->filename,
- strerror(EEXIST));
- return FALSE;
+ int fd;
+ char *name = outs->filename;
+ char *aname = NULL;
+ if(config->output_dir) {
+ aname = aprintf("%s/%s", config->output_dir, name);
+ if(!aname) {
+ errorf(global, "out of memory\n");
+ return FALSE;
+ }
+ name = aname;
}
+ fd = open(name, O_CREAT | O_WRONLY | O_EXCL | O_BINARY, OPENMODE);
+ if(fd != -1) {
+ file = fdopen(fd, "wb");
+ if(!file)
+ close(fd);
+ }
+ free(aname);
}
+ else
+ /* open file for writing */
+ file = fopen(outs->filename, "wb");
- /* open file for writing */
- file = fopen(outs->filename, "wb");
if(!file) {
warnf(global, "Failed to create the file %s: %s\n", outs->filename,
strerror(errno));
@@ -78,7 +109,7 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
size_t rc;
struct per_transfer *per = userdata;
struct OutStruct *outs = &per->outs;
- struct OperationConfig *config = outs->config;
+ struct OperationConfig *config = per->config;
size_t bytes = sz * nmemb;
bool is_tty = config->global->isatty;
#ifdef WIN32
@@ -147,7 +178,7 @@ size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
}
#endif
- if(!outs->stream && !tool_create_output_file(outs))
+ if(!outs->stream && !tool_create_output_file(outs, per->config))
return failure;
if(is_tty && (outs->bytes < 2000) && !config->terminal_binary_ok) {
diff --git a/src/tool_cb_wrt.h b/src/tool_cb_wrt.h
index 188d3ea7d..e49d8f35d 100644
--- a/src/tool_cb_wrt.h
+++ b/src/tool_cb_wrt.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,6 +30,7 @@
size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata);
/* create a local file for writing, return TRUE on success */
-bool tool_create_output_file(struct OutStruct *outs);
+bool tool_create_output_file(struct OutStruct *outs,
+ struct OperationConfig *config);
#endif /* HEADER_CURL_TOOL_CB_WRT_H */
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index efa8c50b2..e99602c4f 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,7 +26,7 @@
#include "memdebug.h" /* keep this as LAST include */
-void config_init(struct OperationConfig* config)
+void config_init(struct OperationConfig *config)
{
memset(config, 0, sizeof(struct OperationConfig));
@@ -89,6 +89,7 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->mail_auth);
Curl_safefree(config->netrc_file);
+ Curl_safefree(config->output_dir);
urlnode = config->url_list;
while(urlnode) {
@@ -112,6 +113,7 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->cert_type);
Curl_safefree(config->proxy_cert_type);
Curl_safefree(config->cacert);
+ Curl_safefree(config->login_options);
Curl_safefree(config->proxy_cacert);
Curl_safefree(config->capath);
Curl_safefree(config->proxy_capath);
@@ -128,6 +130,8 @@ static void free_config_fields(struct OperationConfig *config)
Curl_safefree(config->pubkey);
Curl_safefree(config->hostpubmd5);
Curl_safefree(config->engine);
+ Curl_safefree(config->etag_save_file);
+ Curl_safefree(config->etag_compare_file);
Curl_safefree(config->request_target);
Curl_safefree(config->customrequest);
Curl_safefree(config->krblevel);
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 7232c35e3..489f9ca0e 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -37,8 +37,8 @@ struct GlobalConfig;
struct State {
struct getout *urlnode;
- URLGlob *inglob;
- URLGlob *urls;
+ struct URLGlob *inglob;
+ struct URLGlob *urls;
char *outfiles;
char *httpgetfields;
char *uploadfile;
@@ -80,6 +80,7 @@ struct OperationConfig {
double connecttimeout;
long maxredirs;
curl_off_t max_filesize;
+ char *output_dir;
char *headerfile;
char *ftpport;
char *iface;
@@ -108,6 +109,7 @@ struct OperationConfig {
char *mail_from;
struct curl_slist *mail_rcpt;
char *mail_auth;
+ bool mail_rcpt_allowfails; /* --mail-rcpt-allowfails */
char *sasl_authzid; /* Authorisation identity (identity to use) */
bool sasl_ir; /* Enable/disable SASL initial response */
bool proxytunnel;
@@ -156,8 +158,11 @@ struct OperationConfig {
char *pubkey;
char *hostpubmd5;
char *engine;
+ char *etag_save_file;
+ char *etag_compare_file;
bool crlf;
char *customrequest;
+ char *ssl_ec_curves;
char *krblevel;
char *request_target;
long httpversion;
@@ -191,8 +196,8 @@ struct OperationConfig {
curl_off_t condtime;
struct curl_slist *headers;
struct curl_slist *proxyheaders;
- tool_mime *mimeroot;
- tool_mime *mimecurrent;
+ struct tool_mime *mimeroot;
+ struct tool_mime *mimecurrent;
curl_mime *mimepost;
struct curl_slist *telnet_options;
struct curl_slist *resolve;
@@ -220,6 +225,7 @@ struct OperationConfig {
bool tcp_nodelay;
bool tcp_fastopen;
long req_retry; /* number of retries */
+ bool retry_all_errors; /* retry on any error */
bool retry_connrefused; /* set connection refused as a transient error */
long retry_delay; /* delay between retries (in seconds) */
long retry_maxtime; /* maximum time to keep retrying */
@@ -251,9 +257,14 @@ struct OperationConfig {
bool ssl_no_revoke; /* disable SSL certificate revocation checks */
/*bool proxy_ssl_no_revoke; */
+ bool ssl_revoke_best_effort; /* ignore SSL revocation offline/missing
+ revocation list errors */
+
+ bool native_ca_store; /* use the native os ca store */
+
bool use_metalink; /* process given URLs as metalink XML file */
- metalinkfile *metalinkfile_list; /* point to the first node */
- metalinkfile *metalinkfile_last; /* point to the last/current node */
+ struct metalinkfile *metalinkfile_list; /* point to the first node */
+ struct metalinkfile *metalinkfile_last; /* point to the last/current node */
char *oauth_bearer; /* OAuth 2.0 bearer token */
bool nonpn; /* enable/disable TLS NPN extension */
bool noalpn; /* enable/disable TLS ALPN extension */
@@ -300,6 +311,8 @@ struct GlobalConfig {
#endif
bool parallel;
long parallel_max;
+ bool parallel_connect;
+ char *help_category; /* The help category, if set */
struct OperationConfig *first;
struct OperationConfig *current;
struct OperationConfig *last; /* Always last in the struct */
diff --git a/src/tool_convert.h b/src/tool_convert.h
index 27b4ce90f..6d78ecf9d 100644
--- a/src/tool_convert.h
+++ b/src/tool_convert.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_dirhie.c b/src/tool_dirhie.c
index 06b3c03e8..320fb3688 100644
--- a/src/tool_dirhie.c
+++ b/src/tool_dirhie.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -125,6 +125,7 @@ CURLcode create_dir_hierarchy(const char *outfile, FILE *errors)
tempdir = strtok(outdup, PATH_DELIMITERS);
while(tempdir != NULL) {
+ bool skip = false;
tempdir2 = strtok(NULL, PATH_DELIMITERS);
/* since strtok returns a token for the last word even
if not ending with DIR_CHAR, we need to prune it */
@@ -133,13 +134,27 @@ CURLcode create_dir_hierarchy(const char *outfile, FILE *errors)
if(dlen)
msnprintf(&dirbuildup[dlen], outlen - dlen, "%s%s", DIR_CHAR, tempdir);
else {
- if(outdup == tempdir)
+ if(outdup == tempdir) {
+#if defined(MSDOS) || defined(WIN32)
+ /* Skip creating a drive's current directory.
+ It may seem as though that would harmlessly fail but it could be
+ a corner case if X: did not exist, since we would be creating it
+ erroneously.
+ eg if outfile is X:\foo\bar\filename then don't mkdir X:
+ This logic takes into account unsupported drives !:, 1:, etc. */
+ char *p = strchr(tempdir, ':');
+ if(p && !p[1])
+ skip = true;
+#endif
/* the output string doesn't start with a separator */
strcpy(dirbuildup, tempdir);
+ }
else
msnprintf(dirbuildup, outlen, "%s%s", DIR_CHAR, tempdir);
}
- if((-1 == mkdir(dirbuildup, (mode_t)0000750)) && (errno != EEXIST)) {
+ /* Create directory. Ignore access denied error to allow traversal. */
+ if(!skip && (-1 == mkdir(dirbuildup, (mode_t)0000750)) &&
+ (errno != EACCES) && (errno != EEXIST)) {
show_dir_errno(errors, dirbuildup);
result = CURLE_WRITE_ERROR;
break; /* get out of loop */
diff --git a/src/tool_dirhie.h b/src/tool_dirhie.h
index 011a5774f..96fae9ebf 100644
--- a/src/tool_dirhie.h
+++ b/src/tool_dirhie.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_doswin.c b/src/tool_doswin.c
index 779a3cb8f..dd8341ae3 100644
--- a/src/tool_doswin.c
+++ b/src/tool_doswin.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,35 +36,9 @@
#include "tool_bname.h"
#include "tool_doswin.h"
+#include "curlx.h"
#include "memdebug.h" /* keep this as LAST include */
-/*
- * Macros ALWAYS_TRUE and ALWAYS_FALSE are used to avoid compiler warnings.
- */
-
-#define ALWAYS_TRUE (1)
-#define ALWAYS_FALSE (0)
-
-#if defined(_MSC_VER) && !defined(__POCC__)
-# undef ALWAYS_TRUE
-# undef ALWAYS_FALSE
-# if (_MSC_VER < 1500)
-# define ALWAYS_TRUE (0, 1)
-# define ALWAYS_FALSE (1, 0)
-# else
-# define ALWAYS_TRUE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-(1) \
-__pragma(warning(pop))
-# define ALWAYS_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-(0) \
-__pragma(warning(pop))
-# endif
-#endif
-
#ifdef WIN32
# undef PATH_MAX
# define PATH_MAX MAX_PATH
@@ -79,9 +53,9 @@ __pragma(warning(pop))
#endif
#ifdef WIN32
-# define _use_lfn(f) ALWAYS_TRUE /* long file names always available */
+# define _use_lfn(f) (1) /* long file names always available */
#elif !defined(__DJGPP__) || (__DJGPP__ < 2) /* DJGPP 2.0 has _use_lfn() */
-# define _use_lfn(f) ALWAYS_FALSE /* long file names never available */
+# define _use_lfn(f) (0) /* long file names never available */
#elif defined(__DJGPP__)
# include <fcntl.h> /* _use_lfn(f) prototype */
#endif
@@ -639,7 +613,7 @@ char **__crt0_glob_function(char *arg)
CURLcode FindWin32CACert(struct OperationConfig *config,
curl_sslbackend backend,
- const char *bundle_file)
+ const TCHAR *bundle_file)
{
CURLcode result = CURLE_OK;
@@ -653,15 +627,19 @@ CURLcode FindWin32CACert(struct OperationConfig *config,
backend != CURLSSLBACKEND_SCHANNEL) {
DWORD res_len;
- char buf[PATH_MAX];
- char *ptr = NULL;
+ TCHAR buf[PATH_MAX];
+ TCHAR *ptr = NULL;
- buf[0] = '\0';
+ buf[0] = TEXT('\0');
- res_len = SearchPathA(NULL, bundle_file, NULL, PATH_MAX, buf, &ptr);
+ res_len = SearchPath(NULL, bundle_file, NULL, PATH_MAX, buf, &ptr);
if(res_len > 0) {
Curl_safefree(config->cacert);
+#ifdef UNICODE
+ config->cacert = curlx_convert_wchar_to_UTF8(buf);
+#else
config->cacert = strdup(buf);
+#endif
if(!config->cacert)
result = CURLE_OUT_OF_MEMORY;
}
@@ -724,6 +702,21 @@ cleanup:
return slist;
}
+LARGE_INTEGER tool_freq;
+bool tool_isVistaOrGreater;
+
+CURLcode win32_init(void)
+{
+ if(curlx_verify_windows_version(6, 0, PLATFORM_WINNT,
+ VERSION_GREATER_THAN_EQUAL))
+ tool_isVistaOrGreater = true;
+ else
+ tool_isVistaOrGreater = false;
+
+ QueryPerformanceFrequency(&tool_freq);
+ return CURLE_OK;
+}
+
#endif /* WIN32 */
#endif /* MSDOS || WIN32 */
diff --git a/src/tool_doswin.h b/src/tool_doswin.h
index 415fac27e..ab23f8d65 100644
--- a/src/tool_doswin.h
+++ b/src/tool_doswin.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -59,8 +59,9 @@ char **__crt0_glob_function(char *arg);
CURLcode FindWin32CACert(struct OperationConfig *config,
curl_sslbackend backend,
- const char *bundle_file);
+ const TCHAR *bundle_file);
struct curl_slist *GetLoadedModulePaths(void);
+CURLcode win32_init(void);
#endif /* WIN32 */
diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c
index cb30e404b..7343f7d15 100644
--- a/src/tool_easysrc.c
+++ b/src/tool_easysrc.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -113,7 +113,7 @@ CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
va_start(ap, fmt);
bufp = curlx_mvaprintf(fmt, ap);
va_end(ap);
- if(! bufp) {
+ if(!bufp) {
ret = CURLE_OUT_OF_MEMORY;
}
else {
@@ -123,7 +123,7 @@ CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
return ret;
}
-#define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} WHILE_FALSE
+#define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} while(0)
CURLcode easysrc_init(void)
{
diff --git a/src/tool_filetime.c b/src/tool_filetime.c
index 6071e44d2..1ffc981fe 100644
--- a/src/tool_filetime.c
+++ b/src/tool_filetime.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,6 +21,8 @@
***************************************************************************/
#include "tool_filetime.h"
+#include "curlx.h"
+
#ifdef HAVE_UTIME_H
# include <utime.h>
#elif defined(HAVE_SYS_UTIME_H)
@@ -36,11 +38,13 @@ curl_off_t getfiletime(const char *filename, FILE *error_stream)
access to a 64-bit type we can bypass stat and get the times directly. */
#if defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8)
HANDLE hfile;
+ TCHAR *tchar_filename = curlx_convert_UTF8_to_tchar((char *)filename);
- hfile = CreateFileA(filename, FILE_READ_ATTRIBUTES,
+ hfile = CreateFile(tchar_filename, FILE_READ_ATTRIBUTES,
(FILE_SHARE_READ | FILE_SHARE_WRITE |
FILE_SHARE_DELETE),
NULL, OPEN_EXISTING, 0, NULL);
+ curlx_unicodefree(tchar_filename);
if(hfile != INVALID_HANDLE_VALUE) {
FILETIME ft;
if(GetFileTime(hfile, NULL, NULL, &ft)) {
@@ -93,6 +97,7 @@ void setfiletime(curl_off_t filetime, const char *filename,
access to a 64-bit type we can bypass utime and set the times directly. */
#if defined(WIN32) && (SIZEOF_CURL_OFF_T >= 8)
HANDLE hfile;
+ TCHAR *tchar_filename = curlx_convert_UTF8_to_tchar((char *)filename);
/* 910670515199 is the maximum unix filetime that can be used as a
Windows FILETIME without overflow: 30827-12-31T23:59:59. */
@@ -100,13 +105,15 @@ void setfiletime(curl_off_t filetime, const char *filename,
fprintf(error_stream,
"Failed to set filetime %" CURL_FORMAT_CURL_OFF_T
" on outfile: overflow\n", filetime);
+ curlx_unicodefree(tchar_filename);
return;
}
- hfile = CreateFileA(filename, FILE_WRITE_ATTRIBUTES,
+ hfile = CreateFile(tchar_filename, FILE_WRITE_ATTRIBUTES,
(FILE_SHARE_READ | FILE_SHARE_WRITE |
FILE_SHARE_DELETE),
NULL, OPEN_EXISTING, 0, NULL);
+ curlx_unicodefree(tchar_filename);
if(hfile != INVALID_HANDLE_VALUE) {
curl_off_t converted = ((curl_off_t)filetime * 10000000) +
CURL_OFF_T_C(116444736000000000);
diff --git a/src/tool_formparse.c b/src/tool_formparse.c
index 74d1533e4..8e8fe874e 100644
--- a/src/tool_formparse.c
+++ b/src/tool_formparse.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -42,9 +42,10 @@
#define CONST_SAFEFREE(x) Curl_safefree(*((void **) &(x)))
/* tool_mime functions. */
-static tool_mime *tool_mime_new(tool_mime *parent, toolmimekind kind)
+static struct tool_mime *tool_mime_new(struct tool_mime *parent,
+ toolmimekind kind)
{
- tool_mime *m = (tool_mime *) calloc(1, sizeof(*m));
+ struct tool_mime *m = (struct tool_mime *) calloc(1, sizeof(*m));
if(m) {
m->kind = kind;
@@ -57,14 +58,15 @@ static tool_mime *tool_mime_new(tool_mime *parent, toolmimekind kind)
return m;
}
-static tool_mime *tool_mime_new_parts(tool_mime *parent)
+static struct tool_mime *tool_mime_new_parts(struct tool_mime *parent)
{
return tool_mime_new(parent, TOOLMIME_PARTS);
}
-static tool_mime *tool_mime_new_data(tool_mime *parent, const char *data)
+static struct tool_mime *tool_mime_new_data(struct tool_mime *parent,
+ const char *data)
{
- tool_mime *m = NULL;
+ struct tool_mime *m = NULL;
data = strdup(data);
if(data) {
@@ -77,13 +79,13 @@ static tool_mime *tool_mime_new_data(tool_mime *parent, const char *data)
return m;
}
-static tool_mime *tool_mime_new_filedata(tool_mime *parent,
- const char *filename,
- bool isremotefile,
- CURLcode *errcode)
+static struct tool_mime *tool_mime_new_filedata(struct tool_mime *parent,
+ const char *filename,
+ bool isremotefile,
+ CURLcode *errcode)
{
CURLcode result = CURLE_OK;
- tool_mime *m = NULL;
+ struct tool_mime *m = NULL;
*errcode = CURLE_OUT_OF_MEMORY;
if(strcmp(filename, "-")) {
@@ -159,7 +161,7 @@ static tool_mime *tool_mime_new_filedata(tool_mime *parent,
return m;
}
-void tool_mime_free(tool_mime *mime)
+void tool_mime_free(struct tool_mime *mime)
{
if(mime) {
if(mime->subparts)
@@ -181,7 +183,7 @@ void tool_mime_free(tool_mime *mime)
size_t tool_mime_stdin_read(char *buffer,
size_t size, size_t nitems, void *arg)
{
- tool_mime *sip = (tool_mime *) arg;
+ struct tool_mime *sip = (struct tool_mime *) arg;
curl_off_t bytesleft;
(void) size; /* Always 1: ignored. */
@@ -216,7 +218,7 @@ size_t tool_mime_stdin_read(char *buffer,
int tool_mime_stdin_seek(void *instream, curl_off_t offset, int whence)
{
- tool_mime *sip = (tool_mime *) instream;
+ struct tool_mime *sip = (struct tool_mime *) instream;
switch(whence) {
case SEEK_CUR:
@@ -238,7 +240,8 @@ int tool_mime_stdin_seek(void *instream, curl_off_t offset, int whence)
/* Translate an internal mime tree into a libcurl mime tree. */
-static CURLcode tool2curlparts(CURL *curl, tool_mime *m, curl_mime *mime)
+static CURLcode tool2curlparts(CURL *curl, struct tool_mime *m,
+ curl_mime *mime)
{
CURLcode ret = CURLE_OK;
curl_mimepart *part = NULL;
@@ -323,7 +326,7 @@ static CURLcode tool2curlparts(CURL *curl, tool_mime *m, curl_mime *mime)
return ret;
}
-CURLcode tool2curlmime(CURL *curl, tool_mime *m, curl_mime **mime)
+CURLcode tool2curlmime(CURL *curl, struct tool_mime *m, curl_mime **mime)
{
CURLcode ret = CURLE_OK;
@@ -733,8 +736,8 @@ static int get_param_part(struct OperationConfig *config, char endchar,
int formparse(struct OperationConfig *config,
const char *input,
- tool_mime **mimeroot,
- tool_mime **mimecurrent,
+ struct tool_mime **mimeroot,
+ struct tool_mime **mimecurrent,
bool literal_value)
{
/* input MUST be a string in the format 'name=contents' and we'll
@@ -747,7 +750,7 @@ int formparse(struct OperationConfig *config,
char *filename = NULL;
char *encoder = NULL;
struct curl_slist *headers = NULL;
- tool_mime *part = NULL;
+ struct tool_mime *part = NULL;
CURLcode res;
/* Allocate the main mime structure if needed. */
@@ -794,7 +797,7 @@ int formparse(struct OperationConfig *config,
/* we use the @-letter to indicate file name(s) */
- tool_mime *subparts = NULL;
+ struct tool_mime *subparts = NULL;
do {
/* since this was a file, it may have a content-type specifier
diff --git a/src/tool_formparse.h b/src/tool_formparse.h
index 750fe451f..5c1525e67 100644
--- a/src/tool_formparse.h
+++ b/src/tool_formparse.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,12 +35,11 @@ typedef enum {
TOOLMIME_STDINDATA
} toolmimekind;
-typedef struct tool_mime tool_mime;
struct tool_mime {
/* Structural fields. */
toolmimekind kind; /* Part kind. */
- tool_mime *parent; /* Parent item. */
- tool_mime *prev; /* Previous sibling (reverse order link). */
+ struct tool_mime *parent; /* Parent item. */
+ struct tool_mime *prev; /* Previous sibling (reverse order link). */
/* Common fields. */
const char *data; /* Actual data or data filename. */
const char *name; /* Part name. */
@@ -49,7 +48,7 @@ struct tool_mime {
const char *encoder; /* Part's requested encoding. */
struct curl_slist *headers; /* User-defined headers. */
/* TOOLMIME_PARTS fields. */
- tool_mime *subparts; /* Part's subparts. */
+ struct tool_mime *subparts; /* Part's subparts. */
/* TOOLMIME_STDIN/TOOLMIME_STDINDATA fields. */
curl_off_t origin; /* Stdin read origin offset. */
curl_off_t size; /* Stdin data size. */
@@ -63,10 +62,10 @@ int tool_mime_stdin_seek(void *instream, curl_off_t offset, int whence);
int formparse(struct OperationConfig *config,
const char *input,
- tool_mime **mimeroot,
- tool_mime **mimecurrent,
+ struct tool_mime **mimeroot,
+ struct tool_mime **mimecurrent,
bool literal_value);
-CURLcode tool2curlmime(CURL *curl, tool_mime *m, curl_mime **mime);
-void tool_mime_free(tool_mime *mime);
+CURLcode tool2curlmime(CURL *curl, struct tool_mime *m, curl_mime **mime);
+void tool_mime_free(struct tool_mime *mime);
#endif /* HEADER_CURL_TOOL_FORMPARSE_H */
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 3882cb97e..910a5a2f9 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -58,7 +58,7 @@
if(!(*(str))) \
return PARAM_NO_MEM; \
} \
-} WHILE_FALSE
+} while(0)
struct LongShort {
const char *letter; /* short name option */
@@ -197,6 +197,7 @@ static const struct LongShort aliases[]= {
{"$Y", "suppress-connect-headers", ARG_BOOL},
{"$Z", "compressed-ssh", ARG_BOOL},
{"$~", "happy-eyeballs-timeout-ms", ARG_STRING},
+ {"$!", "retry-all-errors", ARG_BOOL},
{"0", "http1.0", ARG_NONE},
{"01", "http1.1", ARG_NONE},
{"02", "http2", ARG_NONE},
@@ -249,6 +250,7 @@ static const struct LongShort aliases[]= {
{"Eq", "cert-status", ARG_BOOL},
{"Er", "false-start", ARG_BOOL},
{"Es", "ssl-no-revoke", ARG_BOOL},
+ {"ES", "ssl-revoke-best-effort", ARG_BOOL},
{"Et", "tcp-fastopen", ARG_BOOL},
{"Eu", "proxy-tlsuser", ARG_STRING},
{"Ev", "proxy-tlspassword", ARG_STRING},
@@ -268,9 +270,13 @@ static const struct LongShort aliases[]= {
{"E9", "proxy-tlsv1", ARG_NONE},
{"EA", "socks5-basic", ARG_BOOL},
{"EB", "socks5-gssapi", ARG_BOOL},
+ {"EC", "etag-save", ARG_FILENAME},
+ {"ED", "etag-compare", ARG_FILENAME},
+ {"EE", "curves", ARG_STRING},
{"f", "fail", ARG_BOOL},
{"fa", "fail-early", ARG_BOOL},
{"fb", "styled-output", ARG_BOOL},
+ {"fc", "mail-rcpt-allowfails", ARG_BOOL},
{"F", "form", ARG_STRING},
{"Fs", "form-string", ARG_STRING},
{"g", "globoff", ARG_BOOL},
@@ -298,6 +304,7 @@ static const struct LongShort aliases[]= {
{"o", "output", ARG_FILENAME},
{"O", "remote-name", ARG_NONE},
{"Oa", "remote-name-all", ARG_BOOL},
+ {"Ob", "output-dir", ARG_STRING},
{"p", "proxytunnel", ARG_BOOL},
{"P", "ftp-port", ARG_STRING},
{"q", "disable", ARG_BOOL},
@@ -321,6 +328,7 @@ static const struct LongShort aliases[]= {
{"z", "time-cond", ARG_STRING},
{"Z", "parallel", ARG_BOOL},
{"Zb", "parallel-max", ARG_STRING},
+ {"Zc", "parallel-immediate", ARG_BOOL},
{"#", "progress-bar", ARG_BOOL},
{"#m", "progress-meter", ARG_BOOL},
{":", "next", ARG_NONE},
@@ -418,7 +426,7 @@ void parse_cert_parameter(const char *cert_parameter,
/* escaped colons and Windows drive letter colons were handled
* above; if we're still here, this is a separating colon */
param_place++;
- if(strlen(param_place) > 0) {
+ if(*param_place) {
*passphrase = strdup(param_place);
}
goto done;
@@ -689,7 +697,8 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'j': /* --compressed */
if(toggle &&
- !(curlinfo->features & (CURL_VERSION_LIBZ | CURL_VERSION_BROTLI)))
+ !(curlinfo->features & (CURL_VERSION_LIBZ |
+ CURL_VERSION_BROTLI | CURL_VERSION_ZSTD)))
return PARAM_LIBCURL_DOESNT_SUPPORT;
config->encoding = toggle;
break;
@@ -807,7 +816,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case 'x': /* --krb */
/* kerberos level string */
- if(curlinfo->features & CURL_VERSION_KERBEROS4)
+ if(curlinfo->features & CURL_VERSION_SPNEGO)
GetStr(&config->krblevel, nextarg);
else
return PARAM_LIBCURL_DOESNT_SUPPORT;
@@ -922,6 +931,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(err)
return err;
break;
+ case '!': /* --retry-all-errors */
+ config->retry_all_errors = toggle;
+ break;
case 'k': /* --proxy-negotiate */
if(curlinfo->features & CURL_VERSION_SPNEGO)
@@ -957,7 +969,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
if(*p) {
/* if there's anything more than a plain decimal number */
rc = sscanf(p, " - %6s", lrange);
- *p = 0; /* zero terminate to make str2unum() work below */
+ *p = 0; /* null-terminate to make str2unum() work below */
}
else
rc = 0;
@@ -1206,7 +1218,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case '4': /* --http3 */
/* HTTP version 3 go over QUIC - at once */
- config->httpversion = CURL_HTTP_VERSION_3;
+ if(curlinfo->features & CURL_VERSION_HTTP3)
+ config->httpversion = CURL_HTTP_VERSION_3;
+ else
+ return PARAM_LIBCURL_DOESNT_SUPPORT;
break;
case '9':
/* Allow HTTP/0.9 responses! */
@@ -1254,11 +1269,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
case '4':
/* IPv4 */
- config->ip_version = 4;
+ config->ip_version = CURL_IPRESOLVE_V4;
break;
case '6':
/* IPv6 */
- config->ip_version = 6;
+ config->ip_version = CURL_IPRESOLVE_V6;
break;
case 'a':
/* This makes the FTP sessions use APPE instead of STOR */
@@ -1271,7 +1286,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'b':
switch(subletter) {
case 'a': /* --alt-svc */
- GetStr(&config->altsvc, nextarg);
+ if(curlinfo->features & CURL_VERSION_ALTSVC)
+ GetStr(&config->altsvc, nextarg);
+ else
+ return PARAM_LIBCURL_DOESNT_SUPPORT;
break;
default: /* --cookie string coming up: */
if(nextarg[0] == '@') {
@@ -1502,7 +1520,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
/* Automatic referer requested, this may be combined with a
set initial one */
config->autoreferer = TRUE;
- *ptr = 0; /* zero terminate here */
+ *ptr = 0; /* null-terminate here */
}
else
config->autoreferer = FALSE;
@@ -1596,6 +1614,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->ssl_no_revoke = TRUE;
break;
+ case 'S': /* --ssl-revoke-best-effort */
+ if(curlinfo->features & CURL_VERSION_SSL)
+ config->ssl_revoke_best_effort = TRUE;
+ break;
+
case 't': /* --tcp-fastopen */
config->tcp_fastopen = TRUE;
break;
@@ -1696,6 +1719,18 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->socks5_auth &= ~CURLAUTH_GSSAPI;
break;
+ case 'C':
+ GetStr(&config->etag_save_file, nextarg);
+ break;
+
+ case 'D':
+ GetStr(&config->etag_compare_file, nextarg);
+ break;
+
+ case 'E':
+ GetStr(&config->ssl_ec_curves, nextarg);
+ break;
+
default: /* unknown flag */
return PARAM_OPTION_UNKNOWN;
}
@@ -1708,6 +1743,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'b': /* --styled-output */
global->styled_output = toggle;
break;
+ case 'c': /* --mail-rcpt-allowfails */
+ config->mail_rcpt_allowfails = toggle;
+ break;
default: /* --fail (hard on errors) */
config->failonerror = toggle;
}
@@ -1739,6 +1777,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'h': /* h for help */
if(toggle) {
+ if(nextarg) {
+ global->help_category = strdup(nextarg);
+ if(!global->help_category)
+ return PARAM_NO_MEM;
+ }
return PARAM_HELP_REQUESTED;
}
/* we now actually support --no-help too! */
@@ -1786,6 +1829,11 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
}
break;
case 'i':
+ if(config->content_disposition) {
+ warnf(global,
+ "--include and --remote-header-name cannot be combined.\n");
+ return PARAM_BAD_USE;
+ }
config->show_headers = toggle; /* show the headers as well in the
general output stream */
break;
@@ -1874,6 +1922,10 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
config->default_node_flags = toggle?GETOUT_USEREMOTE:0;
break;
}
+ else if(subletter == 'b') { /* --output-dir */
+ GetStr(&config->output_dir, nextarg);
+ break;
+ }
/* FALLTHROUGH */
case 'o': /* --output */
/* output file */
@@ -1974,8 +2026,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
}
{
/* byte range requested */
- char *tmp_range;
- tmp_range = nextarg;
+ const char *tmp_range = nextarg;
while(*tmp_range != '\0') {
if(!ISDIGIT(*tmp_range) && *tmp_range != '-' && *tmp_range != ',') {
warnf(global, "Invalid character is found in given range. "
@@ -2154,6 +2205,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
(global->parallel_max < 1))
global->parallel_max = PARALLEL_DEFAULT;
break;
+ case 'c': /* --parallel-connect */
+ global->parallel_connect = toggle;
+ break;
}
break;
case 'z': /* time condition coming up */
@@ -2215,20 +2269,23 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
struct OperationConfig *config = global->first;
for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
- orig_opt = argv[i];
+ orig_opt = curlx_convert_tchar_to_UTF8(argv[i]);
- if(stillflags && ('-' == argv[i][0])) {
+ if(stillflags && ('-' == orig_opt[0])) {
bool passarg;
- char *flag = argv[i];
- if(!strcmp("--", argv[i]))
+ if(!strcmp("--", orig_opt))
/* This indicates the end of the flags and thus enables the
following (URL) argument to start with -. */
stillflags = FALSE;
else {
- char *nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL;
+ char *nextarg = (i < (argc - 1))
+ ? curlx_convert_tchar_to_UTF8(argv[i + 1])
+ : NULL;
- result = getparameter(flag, nextarg, &passarg, global, config);
+ result = getparameter(orig_opt, nextarg, &passarg, global, config);
+ curlx_unicodefree(nextarg);
+ config = global->last;
if(result == PARAM_NEXT_OPERATION) {
/* Reset result as PARAM_NEXT_OPERATION is only used here and not
returned from this function */
@@ -2263,9 +2320,12 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
bool used;
/* Just add the URL please */
- result = getparameter((char *)"--url", argv[i], &used, global,
+ result = getparameter("--url", orig_opt, &used, global,
config);
}
+
+ if(!result)
+ curlx_unicodefree(orig_opt);
}
if(result && result != PARAM_HELP_REQUESTED &&
@@ -2280,5 +2340,6 @@ ParameterError parse_args(struct GlobalConfig *global, int argc,
helpf(global->errors, "%s\n", reason);
}
+ curlx_unicodefree(orig_opt);
return result;
}
diff --git a/src/tool_getpass.c b/src/tool_getpass.c
index dfe363b21..35e7c73b3 100644
--- a/src/tool_getpass.c
+++ b/src/tool_getpass.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -100,11 +100,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
#define DONE
#endif /* __VMS */
-#ifdef __SYMBIAN32__
-# define getch() getchar()
-#endif
-
-#if defined(WIN32) || defined(__SYMBIAN32__)
+#if defined(WIN32)
char *getpass_r(const char *prompt, char *buffer, size_t buflen)
{
@@ -123,10 +119,8 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
previous one as well */
i = i - (i >= 1 ? 2 : 1);
}
-#ifndef __SYMBIAN32__
/* since echo is disabled, print a newline */
fputs("\n", stderr);
-#endif
/* if user didn't hit ENTER, terminate buffer */
if(i == buflen)
buffer[buflen-1] = '\0';
@@ -134,7 +128,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen)
return buffer; /* we always return success */
}
#define DONE
-#endif /* WIN32 || __SYMBIAN32__ */
+#endif /* WIN32 */
#ifdef NETWARE
/* NetWare implementation */
@@ -238,7 +232,7 @@ char *getpass_r(const char *prompt, /* prompt to display */
fputs(prompt, stderr);
nread = read(fd, password, buflen);
if(nread > 0)
- password[--nread] = '\0'; /* zero terminate where enter is stored */
+ password[--nread] = '\0'; /* null-terminate where enter is stored */
else
password[0] = '\0'; /* got nothing */
diff --git a/src/tool_help.c b/src/tool_help.c
index 022956676..c7af101e2 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,482 +36,800 @@
#endif
/*
+ * The bitmask output is generated with the following command
+ ------------------------------------------------------------
+ cd $srcroot/docs/cmdline-opts
+ ./gen.pl listcats *.d
+ */
+
+#define CURLHELP_HIDDEN 1u << 0u
+#define CURLHELP_AUTH 1u << 1u
+#define CURLHELP_CONNECTION 1u << 2u
+#define CURLHELP_CURL 1u << 3u
+#define CURLHELP_DNS 1u << 4u
+#define CURLHELP_FILE 1u << 5u
+#define CURLHELP_FTP 1u << 6u
+#define CURLHELP_HTTP 1u << 7u
+#define CURLHELP_IMAP 1u << 8u
+#define CURLHELP_IMPORTANT 1u << 9u
+#define CURLHELP_MISC 1u << 10u
+#define CURLHELP_OUTPUT 1u << 11u
+#define CURLHELP_POP3 1u << 12u
+#define CURLHELP_POST 1u << 13u
+#define CURLHELP_PROXY 1u << 14u
+#define CURLHELP_SCP 1u << 15u
+#define CURLHELP_SFTP 1u << 16u
+#define CURLHELP_SMTP 1u << 17u
+#define CURLHELP_SSH 1u << 18u
+#define CURLHELP_TELNET 1u << 19u
+#define CURLHELP_TFTP 1u << 20u
+#define CURLHELP_TLS 1u << 21u
+#define CURLHELP_UPLOAD 1u << 22u
+#define CURLHELP_VERBOSE 1u << 23u
+
+typedef unsigned int curlhelp_t;
+
+struct category_descriptors {
+ const char *opt;
+ const char *desc;
+ curlhelp_t category;
+};
+
+static const struct category_descriptors categories[] = {
+ {"auth", "Different types of authentication methods", CURLHELP_AUTH},
+ {"connection", "Low level networking operations",
+ CURLHELP_CONNECTION},
+ {"curl", "The command line tool itself", CURLHELP_CURL},
+ {"dns", "General DNS options", CURLHELP_DNS},
+ {"file", "FILE protocol options", CURLHELP_FILE},
+ {"ftp", "FTP protocol options", CURLHELP_FTP},
+ {"http", "HTTP and HTTPS protocol options", CURLHELP_HTTP},
+ {"imap", "IMAP protocol options", CURLHELP_IMAP},
+ /* important is left out because it is the default help page */
+ {"misc", "Options that don't fit into any other category", CURLHELP_MISC},
+ {"output", "The output of curl", CURLHELP_OUTPUT},
+ {"pop3", "POP3 protocol options", CURLHELP_POP3},
+ {"post", "HTTP Post specific options", CURLHELP_POST},
+ {"proxy", "All options related to proxies", CURLHELP_PROXY},
+ {"scp", "SCP protocol options", CURLHELP_SCP},
+ {"sftp", "SFTP protocol options", CURLHELP_SFTP},
+ {"smtp", "SMTP protocol options", CURLHELP_SMTP},
+ {"ssh", "SSH protocol options", CURLHELP_SSH},
+ {"telnet", "TELNET protocol options", CURLHELP_TELNET},
+ {"tftp", "TFTP protocol options", CURLHELP_TFTP},
+ {"tls", "All TLS/SSL related options", CURLHELP_TLS},
+ {"upload", "All options for uploads",
+ CURLHELP_UPLOAD},
+ {"verbose", "Options related to any kind of command line output of curl",
+ CURLHELP_VERBOSE},
+ {NULL, NULL, CURLHELP_HIDDEN}
+};
+
+/*
* The help output is generated with the following command
---------------------------------------------------------
cd $srcroot/docs/cmdline-opts
- ./gen.pl listhelp
+ ./gen.pl listhelp *.d
*/
struct helptxt {
const char *opt;
const char *desc;
+ curlhelp_t categories;
};
+
static const struct helptxt helptext[] = {
{" --abstract-unix-socket <path>",
- "Connect via abstract Unix domain socket"},
+ "Connect via abstract Unix domain socket",
+ CURLHELP_CONNECTION},
{" --alt-svc <file name>",
- "Enable alt-svc with this cache file"},
+ "Enable alt-svc with this cache file",
+ CURLHELP_HTTP},
{" --anyauth",
- "Pick any authentication method"},
+ "Pick any authentication method",
+ CURLHELP_HTTP | CURLHELP_PROXY | CURLHELP_AUTH},
{"-a, --append",
- "Append to target file when uploading"},
+ "Append to target file when uploading",
+ CURLHELP_FTP | CURLHELP_SFTP},
{" --basic",
- "Use HTTP Basic Authentication"},
+ "Use HTTP Basic Authentication",
+ CURLHELP_AUTH},
{" --cacert <file>",
- "CA certificate to verify peer against"},
+ "CA certificate to verify peer against",
+ CURLHELP_TLS},
{" --capath <dir>",
- "CA directory to verify peer against"},
+ "CA directory to verify peer against",
+ CURLHELP_TLS},
{"-E, --cert <certificate[:password]>",
- "Client certificate file and password"},
+ "Client certificate file and password",
+ CURLHELP_TLS},
{" --cert-status",
- "Verify the status of the server certificate"},
+ "Verify the status of the server certificate",
+ CURLHELP_TLS},
{" --cert-type <type>",
- "Certificate file type (DER/PEM/ENG)"},
+ "Certificate type (DER/PEM/ENG)",
+ CURLHELP_TLS},
{" --ciphers <list of ciphers>",
- "SSL ciphers to use"},
+ "SSL ciphers to use",
+ CURLHELP_TLS},
{" --compressed",
- "Request compressed response"},
+ "Request compressed response",
+ CURLHELP_HTTP},
{" --compressed-ssh",
- "Enable SSH compression"},
+ "Enable SSH compression",
+ CURLHELP_SCP | CURLHELP_SSH},
{"-K, --config <file>",
- "Read config from a file"},
+ "Read config from a file",
+ CURLHELP_CURL},
{" --connect-timeout <seconds>",
- "Maximum time allowed for connection"},
+ "Maximum time allowed for connection",
+ CURLHELP_CONNECTION},
{" --connect-to <HOST1:PORT1:HOST2:PORT2>",
- "Connect to host"},
+ "Connect to host",
+ CURLHELP_CONNECTION},
{"-C, --continue-at <offset>",
- "Resumed transfer offset"},
+ "Resumed transfer offset",
+ CURLHELP_CONNECTION},
{"-b, --cookie <data|filename>",
- "Send cookies from string/file"},
+ "Send cookies from string/file",
+ CURLHELP_HTTP},
{"-c, --cookie-jar <filename>",
- "Write cookies to <filename> after operation"},
+ "Write cookies to <filename> after operation",
+ CURLHELP_HTTP},
{" --create-dirs",
- "Create necessary local directory hierarchy"},
+ "Create necessary local directory hierarchy",
+ CURLHELP_CURL},
{" --crlf",
- "Convert LF to CRLF in upload"},
+ "Convert LF to CRLF in upload",
+ CURLHELP_FTP | CURLHELP_SMTP},
{" --crlfile <file>",
- "Get a CRL list in PEM format from the given file"},
+ "Get a CRL list in PEM format from the given file",
+ CURLHELP_TLS},
+ {" --curves <algorithm list>",
+ "(EC) TLS key exchange algorithm(s) to request",
+ CURLHELP_TLS},
{"-d, --data <data>",
- "HTTP POST data"},
+ "HTTP POST data",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-ascii <data>",
- "HTTP POST ASCII data"},
+ "HTTP POST ASCII data",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-binary <data>",
- "HTTP POST binary data"},
+ "HTTP POST binary data",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-raw <data>",
- "HTTP POST data, '@' allowed"},
+ "HTTP POST data, '@' allowed",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-urlencode <data>",
- "HTTP POST data url encoded"},
+ "HTTP POST data url encoded",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --delegation <LEVEL>",
- "GSS-API delegation permission"},
+ "GSS-API delegation permission",
+ CURLHELP_AUTH},
{" --digest",
- "Use HTTP Digest Authentication"},
+ "Use HTTP Digest Authentication",
+ CURLHELP_PROXY | CURLHELP_AUTH | CURLHELP_HTTP},
{"-q, --disable",
- "Disable .curlrc"},
+ "Disable .curlrc",
+ CURLHELP_CURL},
{" --disable-eprt",
- "Inhibit using EPRT or LPRT"},
+ "Inhibit using EPRT or LPRT",
+ CURLHELP_FTP},
{" --disable-epsv",
- "Inhibit using EPSV"},
+ "Inhibit using EPSV",
+ CURLHELP_FTP},
{" --disallow-username-in-url",
- "Disallow username in url"},
+ "Disallow username in url",
+ CURLHELP_CURL | CURLHELP_HTTP},
{" --dns-interface <interface>",
- "Interface to use for DNS requests"},
+ "Interface to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-ipv4-addr <address>",
- "IPv4 address to use for DNS requests"},
+ "IPv4 address to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-ipv6-addr <address>",
- "IPv6 address to use for DNS requests"},
+ "IPv6 address to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-servers <addresses>",
- "DNS server addrs to use"},
+ "DNS server addrs to use",
+ CURLHELP_DNS},
{" --doh-url <URL>",
- "Resolve host names over DOH"},
+ "Resolve host names over DOH",
+ CURLHELP_DNS},
{"-D, --dump-header <filename>",
- "Write the received headers to <filename>"},
+ "Write the received headers to <filename>",
+ CURLHELP_HTTP | CURLHELP_FTP},
{" --egd-file <file>",
- "EGD socket path for random data"},
+ "EGD socket path for random data",
+ CURLHELP_TLS},
{" --engine <name>",
- "Crypto engine to use"},
+ "Crypto engine to use",
+ CURLHELP_TLS},
+ {" --etag-compare <file>",
+ "Pass an ETag from a file as a custom header",
+ CURLHELP_HTTP},
+ {" --etag-save <file>",
+ "Parse ETag from a request and save it to a file",
+ CURLHELP_HTTP},
{" --expect100-timeout <seconds>",
- "How long to wait for 100-continue"},
+ "How long to wait for 100-continue",
+ CURLHELP_HTTP},
{"-f, --fail",
- "Fail silently (no output at all) on HTTP errors"},
+ "Fail silently (no output at all) on HTTP errors",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP},
{" --fail-early",
- "Fail on first transfer error, do not continue"},
+ "Fail on first transfer error, do not continue",
+ CURLHELP_CURL},
{" --false-start",
- "Enable TLS False Start"},
+ "Enable TLS False Start",
+ CURLHELP_TLS},
{"-F, --form <name=content>",
- "Specify multipart MIME data"},
+ "Specify multipart MIME data",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{" --form-string <name=string>",
- "Specify multipart MIME data"},
+ "Specify multipart MIME data",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{" --ftp-account <data>",
- "Account data string"},
+ "Account data string",
+ CURLHELP_FTP | CURLHELP_AUTH},
{" --ftp-alternative-to-user <command>",
- "String to replace USER [name]"},
+ "String to replace USER [name]",
+ CURLHELP_FTP},
{" --ftp-create-dirs",
- "Create the remote dirs if not present"},
+ "Create the remote dirs if not present",
+ CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_CURL},
{" --ftp-method <method>",
- "Control CWD usage"},
+ "Control CWD usage",
+ CURLHELP_FTP},
{" --ftp-pasv",
- "Use PASV/EPSV instead of PORT"},
+ "Use PASV/EPSV instead of PORT",
+ CURLHELP_FTP},
{"-P, --ftp-port <address>",
- "Use PORT instead of PASV"},
+ "Use PORT instead of PASV",
+ CURLHELP_FTP},
{" --ftp-pret",
- "Send PRET before PASV"},
+ "Send PRET before PASV",
+ CURLHELP_FTP},
{" --ftp-skip-pasv-ip",
- "Skip the IP address for PASV"},
+ "Skip the IP address for PASV",
+ CURLHELP_FTP},
{" --ftp-ssl-ccc",
- "Send CCC after authenticating"},
+ "Send CCC after authenticating",
+ CURLHELP_FTP | CURLHELP_TLS},
{" --ftp-ssl-ccc-mode <active/passive>",
- "Set CCC mode"},
+ "Set CCC mode",
+ CURLHELP_FTP | CURLHELP_TLS},
{" --ftp-ssl-control",
- "Require SSL/TLS for FTP login, clear for transfer"},
+ "Require SSL/TLS for FTP login, clear for transfer",
+ CURLHELP_FTP | CURLHELP_TLS},
{"-G, --get",
- "Put the post data in the URL and use GET"},
+ "Put the post data in the URL and use GET",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{"-g, --globoff",
- "Disable URL sequences and ranges using {} and []"},
+ "Disable URL sequences and ranges using {} and []",
+ CURLHELP_CURL},
{" --happy-eyeballs-timeout-ms <milliseconds>",
- "How long to wait in milliseconds for IPv6 before trying IPv4"},
+ "Time for IPv6 before trying IPv4",
+ CURLHELP_CONNECTION},
{" --haproxy-protocol",
- "Send HAProxy PROXY protocol v1 header"},
+ "Send HAProxy PROXY protocol v1 header",
+ CURLHELP_HTTP | CURLHELP_PROXY},
{"-I, --head",
- "Show document info only"},
+ "Show document info only",
+ CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_FILE},
{"-H, --header <header/@file>",
- "Pass custom header(s) to server"},
- {"-h, --help",
- "This help text"},
+ "Pass custom header(s) to server",
+ CURLHELP_HTTP},
+ {"-h, --help <category>",
+ "Get help for commands",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{" --hostpubmd5 <md5>",
- "Acceptable MD5 hash of the host public key"},
+ "Acceptable MD5 hash of the host public key",
+ CURLHELP_SFTP | CURLHELP_SCP},
{" --http0.9",
- "Allow HTTP 0.9 responses"},
+ "Allow HTTP 0.9 responses",
+ CURLHELP_HTTP},
{"-0, --http1.0",
- "Use HTTP 1.0"},
+ "Use HTTP 1.0",
+ CURLHELP_HTTP},
{" --http1.1",
- "Use HTTP 1.1"},
+ "Use HTTP 1.1",
+ CURLHELP_HTTP},
{" --http2",
- "Use HTTP 2"},
+ "Use HTTP 2",
+ CURLHELP_HTTP},
{" --http2-prior-knowledge",
- "Use HTTP 2 without HTTP/1.1 Upgrade"},
+ "Use HTTP 2 without HTTP/1.1 Upgrade",
+ CURLHELP_HTTP},
{" --http3",
- "Use HTTP v3"},
+ "Use HTTP v3",
+ CURLHELP_HTTP},
{" --ignore-content-length",
- "Ignore the size of the remote resource"},
+ "Ignore the size of the remote resource",
+ CURLHELP_HTTP | CURLHELP_FTP},
{"-i, --include",
- "Include protocol response headers in the output"},
+ "Include protocol response headers in the output",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{"-k, --insecure",
- "Allow insecure server connections when using SSL"},
+ "Allow insecure server connections when using SSL",
+ CURLHELP_TLS},
{" --interface <name>",
- "Use network INTERFACE (or address)"},
+ "Use network INTERFACE (or address)",
+ CURLHELP_CONNECTION},
{"-4, --ipv4",
- "Resolve names to IPv4 addresses"},
+ "Resolve names to IPv4 addresses",
+ CURLHELP_CONNECTION | CURLHELP_DNS},
{"-6, --ipv6",
- "Resolve names to IPv6 addresses"},
+ "Resolve names to IPv6 addresses",
+ CURLHELP_CONNECTION | CURLHELP_DNS},
{"-j, --junk-session-cookies",
- "Ignore session cookies read from file"},
+ "Ignore session cookies read from file",
+ CURLHELP_HTTP},
{" --keepalive-time <seconds>",
- "Interval time for keepalive probes"},
+ "Interval time for keepalive probes",
+ CURLHELP_CONNECTION},
{" --key <key>",
- "Private key file name"},
+ "Private key file name",
+ CURLHELP_TLS | CURLHELP_SSH},
{" --key-type <type>",
- "Private key file type (DER/PEM/ENG)"},
+ "Private key file type (DER/PEM/ENG)",
+ CURLHELP_TLS},
{" --krb <level>",
- "Enable Kerberos with security <level>"},
+ "Enable Kerberos with security <level>",
+ CURLHELP_FTP},
{" --libcurl <file>",
- "Dump libcurl equivalent code of this command line"},
+ "Dump libcurl equivalent code of this command line",
+ CURLHELP_CURL},
{" --limit-rate <speed>",
- "Limit transfer speed to RATE"},
+ "Limit transfer speed to RATE",
+ CURLHELP_CONNECTION},
{"-l, --list-only",
- "List only mode"},
+ "List only mode",
+ CURLHELP_FTP | CURLHELP_POP3},
{" --local-port <num/range>",
- "Force use of RANGE for local port numbers"},
+ "Force use of RANGE for local port numbers",
+ CURLHELP_CONNECTION},
{"-L, --location",
- "Follow redirects"},
+ "Follow redirects",
+ CURLHELP_HTTP},
{" --location-trusted",
- "Like --location, and send auth to other hosts"},
+ "Like --location, and send auth to other hosts",
+ CURLHELP_HTTP | CURLHELP_AUTH},
{" --login-options <options>",
- "Server login options"},
+ "Server login options",
+ CURLHELP_IMAP | CURLHELP_POP3 | CURLHELP_SMTP | CURLHELP_AUTH},
{" --mail-auth <address>",
- "Originator address of the original email"},
+ "Originator address of the original email",
+ CURLHELP_SMTP},
{" --mail-from <address>",
- "Mail from this address"},
+ "Mail from this address",
+ CURLHELP_SMTP},
{" --mail-rcpt <address>",
- "Mail to this address"},
+ "Mail to this address",
+ CURLHELP_SMTP},
+ {" --mail-rcpt-allowfails",
+ "Allow RCPT TO command to fail for some recipients",
+ CURLHELP_SMTP},
{"-M, --manual",
- "Display the full manual"},
+ "Display the full manual",
+ CURLHELP_CURL},
{" --max-filesize <bytes>",
- "Maximum file size to download"},
+ "Maximum file size to download",
+ CURLHELP_CONNECTION},
{" --max-redirs <num>",
- "Maximum number of redirects allowed"},
+ "Maximum number of redirects allowed",
+ CURLHELP_HTTP},
{"-m, --max-time <seconds>",
- "Maximum time allowed for the transfer"},
+ "Maximum time allowed for the transfer",
+ CURLHELP_CONNECTION},
{" --metalink",
- "Process given URLs as metalink XML file"},
+ "Process given URLs as metalink XML file",
+ CURLHELP_MISC},
{" --negotiate",
- "Use HTTP Negotiate (SPNEGO) authentication"},
+ "Use HTTP Negotiate (SPNEGO) authentication",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{"-n, --netrc",
- "Must read .netrc for user name and password"},
+ "Must read .netrc for user name and password",
+ CURLHELP_CURL},
{" --netrc-file <filename>",
- "Specify FILE for netrc"},
+ "Specify FILE for netrc",
+ CURLHELP_CURL},
{" --netrc-optional",
- "Use either .netrc or URL"},
+ "Use either .netrc or URL",
+ CURLHELP_CURL},
{"-:, --next",
- "Make next URL use its separate set of options"},
+ "Make next URL use its separate set of options",
+ CURLHELP_CURL},
{" --no-alpn",
- "Disable the ALPN TLS extension"},
+ "Disable the ALPN TLS extension",
+ CURLHELP_TLS | CURLHELP_HTTP},
{"-N, --no-buffer",
- "Disable buffering of the output stream"},
+ "Disable buffering of the output stream",
+ CURLHELP_CURL},
{" --no-keepalive",
- "Disable TCP keepalive on the connection"},
+ "Disable TCP keepalive on the connection",
+ CURLHELP_CONNECTION},
{" --no-npn",
- "Disable the NPN TLS extension"},
+ "Disable the NPN TLS extension",
+ CURLHELP_TLS | CURLHELP_HTTP},
{" --no-progress-meter",
- "Do not show the progress meter"},
+ "Do not show the progress meter",
+ CURLHELP_VERBOSE},
{" --no-sessionid",
- "Disable SSL session-ID reusing"},
+ "Disable SSL session-ID reusing",
+ CURLHELP_TLS},
{" --noproxy <no-proxy-list>",
- "List of hosts which do not use proxy"},
+ "List of hosts which do not use proxy",
+ CURLHELP_PROXY},
{" --ntlm",
- "Use HTTP NTLM authentication"},
+ "Use HTTP NTLM authentication",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{" --ntlm-wb",
- "Use HTTP NTLM authentication with winbind"},
+ "Use HTTP NTLM authentication with winbind",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{" --oauth2-bearer <token>",
- "OAuth 2 Bearer Token"},
+ "OAuth 2 Bearer Token",
+ CURLHELP_AUTH},
{"-o, --output <file>",
- "Write to file instead of stdout"},
+ "Write to file instead of stdout",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
+ {" --output-dir <dir>",
+ "Directory to save files in",
+ CURLHELP_CURL},
{"-Z, --parallel",
- "Perform transfers in parallel"},
+ "Perform transfers in parallel",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
+ {" --parallel-immediate",
+ "Do not wait for multiplexing (with --parallel)",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --parallel-max",
- "Maximum concurrency for parallel transfers"},
+ "Maximum concurrency for parallel transfers",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --pass <phrase>",
- "Pass phrase for the private key"},
+ "Pass phrase for the private key",
+ CURLHELP_SSH | CURLHELP_TLS | CURLHELP_AUTH},
{" --path-as-is",
- "Do not squash .. sequences in URL path"},
+ "Do not squash .. sequences in URL path",
+ CURLHELP_CURL},
{" --pinnedpubkey <hashes>",
- "FILE/HASHES Public key to verify peer against"},
+ "FILE/HASHES Public key to verify peer against",
+ CURLHELP_TLS},
{" --post301",
- "Do not switch to GET after following a 301"},
+ "Do not switch to GET after following a 301",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --post302",
- "Do not switch to GET after following a 302"},
+ "Do not switch to GET after following a 302",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --post303",
- "Do not switch to GET after following a 303"},
+ "Do not switch to GET after following a 303",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --preproxy [protocol://]host[:port]",
- "Use this proxy first"},
+ "Use this proxy first",
+ CURLHELP_PROXY},
{"-#, --progress-bar",
- "Display transfer progress as a bar"},
+ "Display transfer progress as a bar",
+ CURLHELP_VERBOSE},
{" --proto <protocols>",
- "Enable/disable PROTOCOLS"},
+ "Enable/disable PROTOCOLS",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --proto-default <protocol>",
- "Use PROTOCOL for any URL missing a scheme"},
+ "Use PROTOCOL for any URL missing a scheme",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --proto-redir <protocols>",
- "Enable/disable PROTOCOLS on redirect"},
+ "Enable/disable PROTOCOLS on redirect",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{"-x, --proxy [protocol://]host[:port]",
- "Use this proxy"},
+ "Use this proxy",
+ CURLHELP_PROXY},
{" --proxy-anyauth",
- "Pick any proxy authentication method"},
+ "Pick any proxy authentication method",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-basic",
- "Use Basic authentication on the proxy"},
+ "Use Basic authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-cacert <file>",
- "CA certificate to verify peer against for proxy"},
+ "CA certificate to verify peer against for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-capath <dir>",
- "CA directory to verify peer against for proxy"},
+ "CA directory to verify peer against for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-cert <cert[:passwd]>",
- "Set client certificate for proxy"},
+ "Set client certificate for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-cert-type <type>",
- "Client certificate type for HTTPS proxy"},
+ "Client certificate type for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-ciphers <list>",
- "SSL ciphers to use for proxy"},
+ "SSL ciphers to use for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-crlfile <file>",
- "Set a CRL list for proxy"},
+ "Set a CRL list for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-digest",
- "Use Digest authentication on the proxy"},
+ "Use Digest authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-header <header/@file>",
- "Pass custom header(s) to proxy"},
+ "Pass custom header(s) to proxy",
+ CURLHELP_PROXY},
{" --proxy-insecure",
- "Do HTTPS proxy connections without verifying the proxy"},
+ "Do HTTPS proxy connections without verifying the proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-key <key>",
- "Private key for HTTPS proxy"},
+ "Private key for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-key-type <type>",
- "Private key file type for proxy"},
+ "Private key file type for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-negotiate",
- "Use HTTP Negotiate (SPNEGO) authentication on the proxy"},
+ "Use HTTP Negotiate (SPNEGO) authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-ntlm",
- "Use NTLM authentication on the proxy"},
+ "Use NTLM authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-pass <phrase>",
- "Pass phrase for the private key for HTTPS proxy"},
+ "Pass phrase for the private key for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-pinnedpubkey <hashes>",
- "FILE/HASHES public key to verify proxy with"},
+ "FILE/HASHES public key to verify proxy with",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-service-name <name>",
- "SPNEGO proxy service name"},
+ "SPNEGO proxy service name",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-ssl-allow-beast",
- "Allow security flaw for interop for HTTPS proxy"},
- {" --proxy-tls13-ciphers <list>",
- "TLS 1.3 ciphersuites for proxy (OpenSSL)"},
+ "Allow security flaw for interop for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
+ {" --proxy-tls13-ciphers <ciphersuite list>",
+ "TLS 1.3 proxy cipher suites",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-tlsauthtype <type>",
- "TLS authentication type for HTTPS proxy"},
+ "TLS authentication type for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlspassword <string>",
- "TLS password for HTTPS proxy"},
+ "TLS password for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlsuser <name>",
- "TLS username for HTTPS proxy"},
+ "TLS username for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlsv1",
- "Use TLSv1 for HTTPS proxy"},
+ "Use TLSv1 for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{"-U, --proxy-user <user:password>",
- "Proxy user and password"},
+ "Proxy user and password",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy1.0 <host[:port]>",
- "Use HTTP/1.0 proxy on given port"},
+ "Use HTTP/1.0 proxy on given port",
+ CURLHELP_PROXY},
{"-p, --proxytunnel",
- "Operate through an HTTP proxy tunnel (using CONNECT)"},
+ "Operate through an HTTP proxy tunnel (using CONNECT)",
+ CURLHELP_PROXY},
{" --pubkey <key>",
- "SSH Public key file name"},
+ "SSH Public key file name",
+ CURLHELP_SFTP | CURLHELP_SCP | CURLHELP_AUTH},
{"-Q, --quote",
- "Send command(s) to server before transfer"},
+ "Send command(s) to server before transfer",
+ CURLHELP_FTP | CURLHELP_SFTP},
{" --random-file <file>",
- "File for reading random data from"},
+ "File for reading random data from",
+ CURLHELP_MISC},
{"-r, --range <range>",
- "Retrieve only the bytes within RANGE"},
+ "Retrieve only the bytes within RANGE",
+ CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_FILE},
{" --raw",
- "Do HTTP \"raw\"; no transfer decoding"},
+ "Do HTTP \"raw\"; no transfer decoding",
+ CURLHELP_HTTP},
{"-e, --referer <URL>",
- "Referrer URL"},
+ "Referrer URL",
+ CURLHELP_HTTP},
{"-J, --remote-header-name",
- "Use the header-provided filename"},
+ "Use the header-provided filename",
+ CURLHELP_OUTPUT},
{"-O, --remote-name",
- "Write output to a file named as the remote file"},
+ "Write output to a file named as the remote file",
+ CURLHELP_IMPORTANT | CURLHELP_OUTPUT},
{" --remote-name-all",
- "Use the remote file name for all URLs"},
+ "Use the remote file name for all URLs",
+ CURLHELP_OUTPUT},
{"-R, --remote-time",
- "Set the remote file's time on the local output"},
+ "Set the remote file's time on the local output",
+ CURLHELP_OUTPUT},
{"-X, --request <command>",
- "Specify request command to use"},
+ "Specify request command to use",
+ CURLHELP_CONNECTION},
{" --request-target",
- "Specify the target for this request"},
- {" --resolve <host:port:address[,address]...>",
- "Resolve the host+port to this address"},
+ "Specify the target for this request",
+ CURLHELP_HTTP},
+ {" --resolve <host:port:addr[,addr]...>",
+ "Resolve the host+port to this address",
+ CURLHELP_CONNECTION},
{" --retry <num>",
- "Retry request if transient problems occur"},
+ "Retry request if transient problems occur",
+ CURLHELP_CURL},
+ {" --retry-all-errors",
+ "Retry all errors (use with --retry)",
+ CURLHELP_CURL},
{" --retry-connrefused",
- "Retry on connection refused (use with --retry)"},
+ "Retry on connection refused (use with --retry)",
+ CURLHELP_CURL},
{" --retry-delay <seconds>",
- "Wait time between retries"},
+ "Wait time between retries",
+ CURLHELP_CURL},
{" --retry-max-time <seconds>",
- "Retry only within this period"},
- {" --sasl-authzid <identity> ",
- "Use this identity to act as during SASL PLAIN authentication"},
+ "Retry only within this period",
+ CURLHELP_CURL},
+ {" --sasl-authzid <identity>",
+ "Identity for SASL PLAIN authentication",
+ CURLHELP_AUTH},
{" --sasl-ir",
- "Enable initial response in SASL authentication"},
+ "Enable initial response in SASL authentication",
+ CURLHELP_AUTH},
{" --service-name <name>",
- "SPNEGO service name"},
+ "SPNEGO service name",
+ CURLHELP_MISC},
{"-S, --show-error",
- "Show error even when -s is used"},
+ "Show error even when -s is used",
+ CURLHELP_CURL},
{"-s, --silent",
- "Silent mode"},
+ "Silent mode",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{" --socks4 <host[:port]>",
- "SOCKS4 proxy on given host + port"},
+ "SOCKS4 proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks4a <host[:port]>",
- "SOCKS4a proxy on given host + port"},
+ "SOCKS4a proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks5 <host[:port]>",
- "SOCKS5 proxy on given host + port"},
+ "SOCKS5 proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks5-basic",
- "Enable username/password auth for SOCKS5 proxies"},
+ "Enable username/password auth for SOCKS5 proxies",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi",
- "Enable GSS-API auth for SOCKS5 proxies"},
+ "Enable GSS-API auth for SOCKS5 proxies",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi-nec",
- "Compatibility with NEC SOCKS5 server"},
+ "Compatibility with NEC SOCKS5 server",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi-service <name>",
- "SOCKS5 proxy service name for GSS-API"},
+ "SOCKS5 proxy service name for GSS-API",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-hostname <host[:port]>",
- "SOCKS5 proxy, pass host name to proxy"},
+ "SOCKS5 proxy, pass host name to proxy",
+ CURLHELP_PROXY},
{"-Y, --speed-limit <speed>",
- "Stop transfers slower than this"},
+ "Stop transfers slower than this",
+ CURLHELP_CONNECTION},
{"-y, --speed-time <seconds>",
- "Trigger 'speed-limit' abort after this time"},
+ "Trigger 'speed-limit' abort after this time",
+ CURLHELP_CONNECTION},
{" --ssl",
- "Try SSL/TLS"},
+ "Try SSL/TLS",
+ CURLHELP_TLS},
{" --ssl-allow-beast",
- "Allow security flaw to improve interop"},
+ "Allow security flaw to improve interop",
+ CURLHELP_TLS},
{" --ssl-no-revoke",
- "Disable cert revocation checks (Schannel)"},
+ "Disable cert revocation checks (Schannel)",
+ CURLHELP_TLS},
{" --ssl-reqd",
- "Require SSL/TLS"},
+ "Require SSL/TLS",
+ CURLHELP_TLS},
+ {" --ssl-revoke-best-effort",
+ "Ignore missing/offline cert CRL dist points",
+ CURLHELP_TLS},
{"-2, --sslv2",
- "Use SSLv2"},
+ "Use SSLv2",
+ CURLHELP_TLS},
{"-3, --sslv3",
- "Use SSLv3"},
+ "Use SSLv3",
+ CURLHELP_TLS},
{" --stderr",
- "Where to redirect stderr"},
+ "Where to redirect stderr",
+ CURLHELP_VERBOSE},
{" --styled-output",
- "Enable styled output for HTTP headers"},
+ "Enable styled output for HTTP headers",
+ CURLHELP_VERBOSE},
{" --suppress-connect-headers",
- "Suppress proxy CONNECT response headers"},
+ "Suppress proxy CONNECT response headers",
+ CURLHELP_PROXY},
{" --tcp-fastopen",
- "Use TCP Fast Open"},
+ "Use TCP Fast Open",
+ CURLHELP_CONNECTION},
{" --tcp-nodelay",
- "Use the TCP_NODELAY option"},
+ "Use the TCP_NODELAY option",
+ CURLHELP_CONNECTION},
{"-t, --telnet-option <opt=val>",
- "Set telnet option"},
+ "Set telnet option",
+ CURLHELP_TELNET},
{" --tftp-blksize <value>",
- "Set TFTP BLKSIZE option"},
+ "Set TFTP BLKSIZE option",
+ CURLHELP_TFTP},
{" --tftp-no-options",
- "Do not send any TFTP options"},
+ "Do not send any TFTP options",
+ CURLHELP_TFTP},
{"-z, --time-cond <time>",
- "Transfer based on a time condition"},
+ "Transfer based on a time condition",
+ CURLHELP_HTTP | CURLHELP_FTP},
{" --tls-max <VERSION>",
- "Set maximum allowed TLS version"},
- {" --tls13-ciphers <list>",
- "TLS 1.3 ciphersuites (OpenSSL)"},
+ "Set maximum allowed TLS version",
+ CURLHELP_TLS},
+ {" --tls13-ciphers <ciphersuite list>",
+ "TLS 1.3 cipher suites to use",
+ CURLHELP_TLS},
{" --tlsauthtype <type>",
- "TLS authentication type"},
+ "TLS authentication type",
+ CURLHELP_TLS | CURLHELP_AUTH},
{" --tlspassword",
- "TLS password"},
+ "TLS password",
+ CURLHELP_TLS | CURLHELP_AUTH},
{" --tlsuser <name>",
- "TLS user name"},
+ "TLS user name",
+ CURLHELP_TLS | CURLHELP_AUTH},
{"-1, --tlsv1",
- "Use TLSv1.0 or greater"},
+ "Use TLSv1.0 or greater",
+ CURLHELP_TLS},
{" --tlsv1.0",
- "Use TLSv1.0 or greater"},
+ "Use TLSv1.0 or greater",
+ CURLHELP_TLS},
{" --tlsv1.1",
- "Use TLSv1.1 or greater"},
+ "Use TLSv1.1 or greater",
+ CURLHELP_TLS},
{" --tlsv1.2",
- "Use TLSv1.2 or greater"},
+ "Use TLSv1.2 or greater",
+ CURLHELP_TLS},
{" --tlsv1.3",
- "Use TLSv1.3 or greater"},
+ "Use TLSv1.3 or greater",
+ CURLHELP_TLS},
{" --tr-encoding",
- "Request compressed transfer encoding"},
+ "Request compressed transfer encoding",
+ CURLHELP_HTTP},
{" --trace <file>",
- "Write a debug trace to FILE"},
+ "Write a debug trace to FILE",
+ CURLHELP_VERBOSE},
{" --trace-ascii <file>",
- "Like --trace, but without hex output"},
+ "Like --trace, but without hex output",
+ CURLHELP_VERBOSE},
{" --trace-time",
- "Add time stamps to trace/verbose output"},
+ "Add time stamps to trace/verbose output",
+ CURLHELP_VERBOSE},
{" --unix-socket <path>",
- "Connect through this Unix domain socket"},
+ "Connect through this Unix domain socket",
+ CURLHELP_CONNECTION},
{"-T, --upload-file <file>",
- "Transfer local FILE to destination"},
+ "Transfer local FILE to destination",
+ CURLHELP_IMPORTANT | CURLHELP_UPLOAD},
{" --url <url>",
- "URL to work with"},
+ "URL to work with",
+ CURLHELP_CURL},
{"-B, --use-ascii",
- "Use ASCII/text transfer"},
+ "Use ASCII/text transfer",
+ CURLHELP_MISC},
{"-u, --user <user:password>",
- "Server user and password"},
+ "Server user and password",
+ CURLHELP_IMPORTANT | CURLHELP_AUTH},
{"-A, --user-agent <name>",
- "Send User-Agent <name> to server"},
+ "Send User-Agent <name> to server",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP},
{"-v, --verbose",
- "Make the operation more talkative"},
+ "Make the operation more talkative",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{"-V, --version",
- "Show version number and quit"},
+ "Show version number and quit",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{"-w, --write-out <format>",
- "Use output FORMAT after completion"},
+ "Use output FORMAT after completion",
+ CURLHELP_VERBOSE},
{" --xattr",
- "Store metadata in extended file attributes"},
- { NULL, NULL }
+ "Store metadata in extended file attributes",
+ CURLHELP_MISC},
+ { NULL, NULL, CURLHELP_HIDDEN }
};
#ifdef NETWARE
# define PRINT_LINES_PAUSE 23
#endif
-#ifdef __SYMBIAN32__
-# define PRINT_LINES_PAUSE 16
-#endif
-
struct feat {
const char *name;
int bitmask;
@@ -524,6 +842,7 @@ static const struct feat feats[] = {
{"IDN", CURL_VERSION_IDN},
{"IPv6", CURL_VERSION_IPV6},
{"Largefile", CURL_VERSION_LARGEFILE},
+ {"Unicode", CURL_VERSION_UNICODE},
{"SSPI", CURL_VERSION_SSPI},
{"GSS-API", CURL_VERSION_GSSAPI},
{"Kerberos", CURL_VERSION_KERBEROS5},
@@ -533,6 +852,7 @@ static const struct feat feats[] = {
{"SSL", CURL_VERSION_SSL},
{"libz", CURL_VERSION_LIBZ},
{"brotli", CURL_VERSION_BROTLI},
+ {"zstd", CURL_VERSION_ZSTD},
{"CharConv", CURL_VERSION_CONV},
{"TLS-SRP", CURL_VERSION_TLSAUTH_SRP},
{"HTTP2", CURL_VERSION_HTTP2},
@@ -542,20 +862,64 @@ static const struct feat feats[] = {
{"MultiSSL", CURL_VERSION_MULTI_SSL},
{"PSL", CURL_VERSION_PSL},
{"alt-svc", CURL_VERSION_ALTSVC},
- {"ESNI", CURL_VERSION_ESNI},
};
-void tool_help(void)
+static void print_category(curlhelp_t category)
+{
+ unsigned int i;
+ for(i = 0; helptext[i].opt; ++i)
+ if(helptext[i].categories & category) {
+ printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
+ }
+}
+
+/* Prints category if found. If not, it returns 1 */
+static int get_category_content(const char *category)
+{
+ unsigned int i;
+ for(i = 0; categories[i].opt; ++i)
+ if(curl_strequal(categories[i].opt, category)) {
+ printf("%s: %s\n", categories[i].opt, categories[i].desc);
+ print_category(categories[i].category);
+ return 0;
+ }
+ return 1;
+}
+
+/* Prints all categories and their description */
+static void get_categories(void)
+{
+ unsigned int i;
+ for(i = 0; categories[i].opt; ++i)
+ printf(" %-11s %s\n", categories[i].opt, categories[i].desc);
+}
+
+
+void tool_help(char *category)
{
- int i;
puts("Usage: curl [options...] <url>");
- for(i = 0; helptext[i].opt; i++) {
- printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
-#ifdef PRINT_LINES_PAUSE
- if(i && ((i % PRINT_LINES_PAUSE) == 0))
- tool_pressanykey();
-#endif
+ /* If no category was provided */
+ if(!category) {
+ const char *category_note = "\nThis is not the full help, this "
+ "menu is stripped into categories.\nUse \"--help category\" to get "
+ "an overview of all categories.\nFor all options use the manual"
+ " or \"--help all\".";
+ print_category(CURLHELP_IMPORTANT);
+ puts(category_note);
+ }
+ /* Lets print everything if "all" was provided */
+ else if(curl_strequal(category, "all"))
+ /* Print everything except hidden */
+ print_category(~(CURLHELP_HIDDEN));
+ /* Lets handle the string "category" differently to not print an errormsg */
+ else if(curl_strequal(category, "category"))
+ get_categories();
+ /* Otherwise print category and handle the case if the cat was not found */
+ else if(get_category_content(category)) {
+ puts("Invalid category provided, here is a list of all categories:\n");
+ get_categories();
}
+ free(category);
}
static int
diff --git a/src/tool_help.h b/src/tool_help.h
index bfb5dcdf3..1da23cc54 100644
--- a/src/tool_help.h
+++ b/src/tool_help.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,7 +23,7 @@
***************************************************************************/
#include "tool_setup.h"
-void tool_help(void);
+void tool_help(char *category);
void tool_list_engines(void);
void tool_version_info(void);
diff --git a/src/tool_helpers.h b/src/tool_helpers.h
index 33483ebc3..67d28be2a 100644
--- a/src/tool_helpers.h
+++ b/src/tool_helpers.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_homedir.c b/src/tool_homedir.c
index 483553d59..3529672d6 100644
--- a/src/tool_homedir.c
+++ b/src/tool_homedir.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,50 +25,78 @@
# include <pwd.h>
#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <curl/mprintf.h>
+
#include "tool_homedir.h"
#include "memdebug.h" /* keep this as LAST include */
-static char *GetEnv(const char *variable, char do_expand)
+static char *GetEnv(const char *variable)
{
- char *env = NULL;
-#ifdef WIN32
- char buf1[1024], buf2[1024];
- DWORD rc;
+ char *dupe, *env;
- /* Don't use getenv(); it doesn't find variable added after program was
- * started. Don't accept truncated results (i.e. rc >= sizeof(buf1)). */
+ env = curl_getenv(variable);
+ if(!env)
+ return NULL;
- rc = GetEnvironmentVariableA(variable, buf1, sizeof(buf1));
- if(rc > 0 && rc < sizeof(buf1)) {
- env = buf1;
- variable = buf1;
- }
- if(do_expand && strchr(variable, '%')) {
- /* buf2 == variable if not expanded */
- rc = ExpandEnvironmentStringsA(variable, buf2, sizeof(buf2));
- if(rc > 0 && rc < sizeof(buf2) &&
- !strchr(buf2, '%')) /* no vars still unexpanded */
- env = buf2;
- }
-#else
- (void)do_expand;
- /* no length control */
- env = getenv(variable);
-#endif
- return (env && env[0]) ? strdup(env) : NULL;
+ dupe = strdup(env);
+ curl_free(env);
+ return dupe;
}
/* return the home directory of the current user as an allocated string */
-char *homedir(void)
+
+/*
+ * The original logic found a home dir to use (by checking a range of
+ * environment variables and last using getpwuid) and returned that for the
+ * parent to use.
+ *
+ * With the XDG_CONFIG_HOME support (added much later than the other), this
+ * variable is treated differently in order to not ruin existing installations
+ * even if this environment variable is set. If this variable is set, and a
+ * file name is set to check, then only if that file name exists in that
+ * directory will it be returned as a "home directory".
+ *
+ * 1. use CURL_HOME if set
+ * 2. use XDG_CONFIG_HOME if set and fname is present
+ * 3. use HOME if set
+ * 4. Non-windows: use getpwuid
+ * 5. Windows: use APPDATA if set
+ * 6. Windows: use "USERPROFILE\Application Data" is set
+ */
+
+char *homedir(const char *fname)
{
char *home;
- home = GetEnv("CURL_HOME", FALSE);
+ home = GetEnv("CURL_HOME");
if(home)
return home;
- home = GetEnv("HOME", FALSE);
+ if(fname) {
+ home = GetEnv("XDG_CONFIG_HOME");
+ if(home) {
+ char *c = curl_maprintf("%s" DIR_CHAR "%s", home, fname);
+ if(c) {
+ int fd = open(c, O_RDONLY);
+ curl_free(c);
+ if(fd >= 0) {
+ close(fd);
+ return home;
+ }
+ }
+ free(home);
+ }
+ }
+
+ home = GetEnv("HOME");
if(home)
return home;
@@ -86,10 +114,18 @@ char *homedir(void)
}
#endif /* PWD-stuff */
#ifdef WIN32
- home = GetEnv("APPDATA", TRUE);
- if(!home)
- home = GetEnv("%USERPROFILE%\\Application Data", TRUE); /* Normally only
- on Win-2K/XP */
+ home = GetEnv("APPDATA");
+ if(!home) {
+ char *env = GetEnv("USERPROFILE");
+ if(env) {
+ char *path = curl_maprintf("%s\\Application Data", env);
+ if(path) {
+ home = strdup(path);
+ curl_free(path);
+ }
+ free(env);
+ }
+ }
#endif /* WIN32 */
return home;
}
diff --git a/src/tool_homedir.h b/src/tool_homedir.h
index 98d94b8e5..66defc200 100644
--- a/src/tool_homedir.h
+++ b/src/tool_homedir.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,6 @@
***************************************************************************/
#include "tool_setup.h"
-char *homedir(void);
+char *homedir(const char *fname);
#endif /* HEADER_CURL_TOOL_HOMEDIR_H */
diff --git a/src/tool_hugehelp.c b/src/tool_hugehelp.c
index 1a4c4983f..a0859d693 100644
--- a/src/tool_hugehelp.c
+++ b/src/tool_hugehelp.c
@@ -25,9 +25,9 @@ void hugehelp(void)
" supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP,\n"
, stdout);
fputs(
-" IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS,\n"
-" SMTP, SMTPS, TELNET and TFTP). The command is designed to work without\n"
-" user interaction.\n"
+" IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP,\n"
+" SMB, SMBS, SMTP, SMTPS, TELNET and TFTP). The command is designed to\n"
+" work without user interaction.\n"
"\n"
" curl offers a busload of useful tricks like proxy support, user authen-\n"
" tication, FTP upload, HTTP post, SSL connections, cookies, file trans-\n"
@@ -44,55 +44,55 @@ void hugehelp(void)
" tion in RFC 3986.\n"
"\n"
" You can specify multiple URLs or parts of URLs by writing part sets\n"
-" within braces as in:\n"
+" within braces and quoting the URL as in:\n"
"\n"
-" http://site.{one,two,three}.com\n"
+" \"http://site.{one,two,three}.com\"\n"
"\n"
" or you can get sequences of alphanumeric series by using [] as in:\n"
"\n"
-" ftp://ftp.example.com/file[1-100].txt\n"
-"\n"
, stdout);
fputs(
-" ftp://ftp.example.com/file[001-100].txt (with leading zeros)\n"
+" \"ftp://ftp.example.com/file[1-100].txt\"\n"
+"\n"
+" \"ftp://ftp.example.com/file[001-100].txt\" (with leading zeros)\n"
"\n"
-" ftp://ftp.example.com/file[a-z].txt\n"
+" \"ftp://ftp.example.com/file[a-z].txt\"\n"
"\n"
" Nested sequences are not supported, but you can use several ones next\n"
" to each other:\n"
"\n"
-" http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html\n"
+" \"http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html\"\n"
"\n"
" You can specify any amount of URLs on the command line. They will be\n"
-" fetched in a sequential manner in the specified order. You can specify\n"
, stdout);
fputs(
+" fetched in a sequential manner in the specified order. You can specify\n"
" command line options and URLs mixed and in any order on the command\n"
" line.\n"
"\n"
" You can specify a step counter for the ranges to get every Nth number\n"
" or letter:\n"
"\n"
-" http://example.com/file[1-100:10].txt\n"
+" \"http://example.com/file[1-100:10].txt\"\n"
"\n"
-" http://example.com/file[a-z:2].txt\n"
+" \"http://example.com/file[a-z:2].txt\"\n"
"\n"
" When using [] or {} sequences when invoked from a command line prompt,\n"
-" you probably have to put the full URL within double quotes to avoid the\n"
, stdout);
fputs(
+" you probably have to put the full URL within double quotes to avoid the\n"
" shell from interfering with it. This also goes for other characters\n"
" treated special, like for example '&', '?' and '*'.\n"
"\n"
" Provide the IPv6 zone index in the URL with an escaped percentage sign\n"
" and the interface name. Like in\n"
"\n"
-" http://[fe80::3%25eth0]/\n"
+" \"http://[fe80::3%25eth0]/\"\n"
"\n"
" If you specify URL without protocol:// prefix, curl will attempt to\n"
-" guess what protocol you might want. It will then default to HTTP but\n"
, stdout);
fputs(
+" guess what protocol you might want. It will then default to HTTP but\n"
" try other protocols based on often-used host name prefixes. For exam-\n"
" ple, for host names starting with \"ftp.\" curl will assume you want to\n"
" speak FTP.\n"
@@ -101,133 +101,201 @@ void hugehelp(void)
" trying to validate it as a syntactically correct URL by any means but\n"
" is instead very liberal with what it accepts.\n"
"\n"
-" curl will attempt to re-use connections for multiple file transfers, so\n"
, stdout);
fputs(
+" curl will attempt to re-use connections for multiple file transfers, so\n"
" that getting many files from the same server will not do multiple con-\n"
" nects / handshakes. This improves speed. Of course this is only done on\n"
" files specified on a single command line and cannot be used between\n"
" separate curl invokes.\n"
"\n"
+"PROTOCOLS\n"
+" curl supports numerous protocols, or put in URL terms: schemes. Your\n"
+" particular build may not support them all.\n"
+"\n"
+, stdout);
+ fputs(
+" DICT Lets you lookup words using online dictionaries.\n"
+"\n"
+" FILE Read or write local files. curl does not support accessing\n"
+" file:// URL remotely, but when running on Microsft Windows using\n"
+" the native UNC approach will work.\n"
+"\n"
+" FTP(S) curl supports the File Transfer Protocol with a lot of tweaks\n"
+" and levers. With or without using TLS.\n"
+"\n"
+" GOPHER Retrieve files.\n"
+"\n"
+" HTTP(S)\n"
+, stdout);
+ fputs(
+" curl supports HTTP with numerous options and variations. It can\n"
+" speak HTTP version 0.9, 1.0, 1.1, 2 and 3 depending on build op-\n"
+" tions and the correct command line options.\n"
+"\n"
+" IMAP(S)\n"
+" Using the mail reading protocol, curl can \"download\" emails for\n"
+" you. With or without using TLS.\n"
+"\n"
+" LDAP(S)\n"
+" curl can do directory lookups for you, with or without TLS.\n"
+"\n"
+, stdout);
+ fputs(
+" MQTT curl supports MQTT version 3. Downloading over MQTT equals \"sub-\n"
+" scribe\" to a topic while uploading/posting equals \"publish\" on a\n"
+" topic. MQTT support is experimental and TLS based MQTT is not\n"
+" supported (yet).\n"
+"\n"
+" POP3(S)\n"
+" Downloading from a pop3 server means getting a mail. With or\n"
+" without using TLS.\n"
+"\n"
+" RTMP(S)\n"
+" The Realtime Messaging Protocol is primarily used to server\n"
+, stdout);
+ fputs(
+" streaming media and curl can download it.\n"
+"\n"
+" RTSP curl supports RTSP 1.0 downloads.\n"
+"\n"
+" SCP curl supports SSH version 2 scp transfers.\n"
+"\n"
+" SFTP curl supports SFTP (draft 5) done over SSH version 2.\n"
+"\n"
+" SMB(S) curl supports SMB version 1 for upload and download.\n"
+"\n"
+" SMTP(S)\n"
+" Uploading contents to an SMTP server means sending an email.\n"
+" With or without TLS.\n"
+"\n"
+, stdout);
+ fputs(
+" TELNET Telling curl to fetch a telnet URL starts an interactive session\n"
+" where it sends what it reads on stdin and outputs what the\n"
+" server sends it.\n"
+"\n"
+" TFTP curl can do TFTP downloads and uploads.\n"
+"\n"
"PROGRESS METER\n"
-" curl normally displays a progress meter during operations, indicating\n"
-" the amount of transferred data, transfer speeds and estimated time\n"
+" curl normally displays a progress meter during operations, indicating\n"
+" the amount of transferred data, transfer speeds and estimated time\n"
+" left, etc. The progress meter displays number of bytes and the speeds\n"
, stdout);
fputs(
-" left, etc. The progress meter displays number of bytes and the speeds\n"
-" are in bytes per second. The suffixes (k, M, G, T, P) are 1024 based.\n"
+" are in bytes per second. The suffixes (k, M, G, T, P) are 1024 based.\n"
" For example 1k is 1024 bytes. 1M is 1048576 bytes.\n"
"\n"
-" curl displays this data to the terminal by default, so if you invoke\n"
-" curl to do an operation and it is about to write data to the terminal,\n"
+" curl displays this data to the terminal by default, so if you invoke\n"
+" curl to do an operation and it is about to write data to the terminal,\n"
" it disables the progress meter as otherwise it would mess up the output\n"
-, stdout);
- fputs(
" mixing progress meter and response data.\n"
"\n"
+, stdout);
+ fputs(
" If you want a progress meter for HTTP POST or PUT requests, you need to\n"
-" redirect the response output to a file, using shell redirect (>), -o,\n"
+" redirect the response output to a file, using shell redirect (>), -o,\n"
" --output or similar.\n"
"\n"
-" It is not the same case for FTP upload as that operation does not spit\n"
+" It is not the same case for FTP upload as that operation does not spit\n"
" out any response data to the terminal.\n"
"\n"
-" If you prefer a progress \"bar\" instead of the regular meter, -#,\n"
+" If you prefer a progress \"bar\" instead of the regular meter, -#,\n"
+" --progress-bar is your friend. You can also disable the progress meter\n"
, stdout);
fputs(
-" --progress-bar is your friend. You can also disable the progress meter\n"
" completely with the -s, --silent option.\n"
"\n"
"OPTIONS\n"
-" Options start with one or two dashes. Many of the options require an\n"
+" Options start with one or two dashes. Many of the options require an\n"
" additional value next to them.\n"
"\n"
-" The short \"single-dash\" form of the options, -d for example, may be\n"
+" The short \"single-dash\" form of the options, -d for example, may be\n"
" used with or without a space between it and its value, although a space\n"
" is a recommended separator. The long \"double-dash\" form, -d, --data for\n"
-, stdout);
- fputs(
" example, requires a space between it and its value.\n"
"\n"
+, stdout);
+ fputs(
" Short version options that don't need any additional values can be used\n"
-" immediately next to each other, like for example you can specify all\n"
+" immediately next to each other, like for example you can specify all\n"
" the options -O, -L and -v at once as -OLv.\n"
"\n"
" In general, all boolean options are enabled with --option and yet again\n"
-" disabled with --no-option. That is, you use the exact same option name\n"
+" disabled with --no-option. That is, you use the exact same option name\n"
+" but prefix it with \"no-\". However, in this list we mostly only list and\n"
, stdout);
fputs(
-" but prefix it with \"no-\". However, in this list we mostly only list and\n"
-" show the --option version of them. (This concept with --no options was\n"
-" added in 7.19.0. Previously most options were toggled on/off on re-\n"
+" show the --option version of them. (This concept with --no options was\n"
+" added in 7.19.0. Previously most options were toggled on/off on re-\n"
" peated use of the same command line option.)\n"
"\n"
" --abstract-unix-socket <path>\n"
-" (HTTP) Connect through an abstract Unix domain socket, instead\n"
-" of using the network. Note: netstat shows the path of an ab-\n"
+" (HTTP) Connect through an abstract Unix domain socket, instead\n"
+" of using the network. Note: netstat shows the path of an ab-\n"
+" stract socket prefixed with '@', however the <path> argument\n"
, stdout);
fputs(
-" stract socket prefixed with '@', however the <path> argument\n"
" should not have this leading character.\n"
"\n"
" Added in 7.53.0.\n"
"\n"
" --alt-svc <file name>\n"
-" (HTTPS) WARNING: this option is experiemental. Do not use in\n"
-" production.\n"
+" (HTTPS) WARNING: this option is experimental. Do not use in pro-\n"
+" duction.\n"
"\n"
" This option enables the alt-svc parser in curl. If the file name\n"
" points to an existing alt-svc cache file, that will be used. Af-\n"
+" ter a completed transfer, the cache will be saved to the file\n"
, stdout);
fputs(
-" ter a completed transfer, the cache will be saved to the file\n"
" name again if it has been modified.\n"
"\n"
" Specify a \"\" file name (zero length) to avoid loading/saving and\n"
" make curl just handle the cache in memory.\n"
"\n"
-" If this option is used several times, curl will load contents\n"
-" from all the files but the the last one will be used for saving.\n"
+" If this option is used several times, curl will load contents\n"
+" from all the files but the last one will be used for saving.\n"
"\n"
" Added in 7.64.1.\n"
"\n"
" --anyauth\n"
-, stdout);
- fputs(
" (HTTP) Tells curl to figure out authentication method by itself,\n"
-" and use the most secure one the remote site claims to support.\n"
-" This is done by first doing a request and checking the response-\n"
-" headers, thus possibly inducing an extra network round-trip.\n"
-" This is used instead of setting a specific authentication\n"
-" method, which you can do with --basic, --digest, --ntlm, and\n"
, stdout);
fputs(
+" and use the most secure one the remote site claims to support.\n"
+" This is done by first doing a request and checking the response-\n"
+" headers, thus possibly inducing an extra network round-trip.\n"
+" This is used instead of setting a specific authentication\n"
+" method, which you can do with --basic, --digest, --ntlm, and\n"
" --negotiate.\n"
"\n"
+, stdout);
+ fputs(
" Using --anyauth is not recommended if you do uploads from stdin,\n"
-" since it may require data to be sent twice and then the client\n"
-" must be able to rewind. If the need should arise when uploading\n"
+" since it may require data to be sent twice and then the client\n"
+" must be able to rewind. If the need should arise when uploading\n"
" from stdin, the upload operation will fail.\n"
"\n"
" Used together with -u, --user.\n"
"\n"
-" See also --proxy-anyauth and --basic and --digest.\n"
+" See also --proxy-anyauth, --basic and --digest.\n"
"\n"
" -a, --append\n"
, stdout);
fputs(
" (FTP SFTP) When used in an upload, this makes curl append to the\n"
-" target file instead of overwriting it. If the remote file\n"
-" doesn't exist, it will be created. Note that this flag is ig-\n"
+" target file instead of overwriting it. If the remote file\n"
+" doesn't exist, it will be created. Note that this flag is ig-\n"
" nored by some SFTP servers (including OpenSSH).\n"
"\n"
" --basic\n"
-" (HTTP) Tells curl to use HTTP Basic authentication with the re-\n"
+" (HTTP) Tells curl to use HTTP Basic authentication with the re-\n"
" mote host. This is the default and this option is usually point-\n"
, stdout);
fputs(
" less, unless you use it to override a previously set option that\n"
-" sets a different authentication method (such as --ntlm, --di-\n"
+" sets a different authentication method (such as --ntlm, --di-\n"
" gest, or --negotiate).\n"
"\n"
" Used together with -u, --user.\n"
@@ -236,57 +304,57 @@ void hugehelp(void)
"\n"
" --cacert <file>\n"
" (TLS) Tells curl to use the specified certificate file to verify\n"
-" the peer. The file may contain multiple CA certificates. The\n"
+" the peer. The file may contain multiple CA certificates. The\n"
, stdout);
fputs(
-" certificate(s) must be in PEM format. Normally curl is built to\n"
+" certificate(s) must be in PEM format. Normally curl is built to\n"
" use a default file for this, so this option is typically used to\n"
" alter that default file.\n"
"\n"
-" curl recognizes the environment variable named 'CURL_CA_BUNDLE'\n"
-" if it is set, and uses the given path as a path to a CA cert\n"
+" curl recognizes the environment variable named 'CURL_CA_BUNDLE'\n"
+" if it is set, and uses the given path as a path to a CA cert\n"
" bundle. This option overrides that variable.\n"
"\n"
-" The windows version of curl will automatically look for a CA\n"
+" The windows version of curl will automatically look for a CA\n"
, stdout);
fputs(
" certs file named 'curl-ca-bundle.crt', either in the same direc-\n"
" tory as curl.exe, or in the Current Working Directory, or in any\n"
" folder along your PATH.\n"
"\n"
-" If curl is built against the NSS SSL library, the NSS PEM\n"
+" If curl is built against the NSS SSL library, the NSS PEM\n"
" PKCS#11 module (libnsspem.so) needs to be available for this op-\n"
" tion to work properly.\n"
"\n"
-" (iOS and macOS only) If curl is built against Secure Transport,\n"
+" (iOS and macOS only) If curl is built against Secure Transport,\n"
, stdout);
fputs(
-" then this option is supported for backward compatibility with\n"
-" other SSL engines, but it should not be set. If the option is\n"
-" not set, then curl will use the certificates in the system and\n"
-" user Keychain to verify the peer, which is the preferred method\n"
+" then this option is supported for backward compatibility with\n"
+" other SSL engines, but it should not be set. If the option is\n"
+" not set, then curl will use the certificates in the system and\n"
+" user Keychain to verify the peer, which is the preferred method\n"
" of verifying the peer's certificate chain.\n"
"\n"
" (Schannel only) This option is supported for Schannel in Windows\n"
, stdout);
fputs(
-" 7 or later with libcurl 7.60 or later. This option is supported\n"
+" 7 or later with libcurl 7.60 or later. This option is supported\n"
" for backward compatibility with other SSL engines; instead it is\n"
-" recommended to use Windows' store of root certificates (the de-\n"
+" recommended to use Windows' store of root certificates (the de-\n"
" fault for Schannel).\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --capath <dir>\n"
-" (TLS) Tells curl to use the specified certificate directory to\n"
+" (TLS) Tells curl to use the specified certificate directory to\n"
, stdout);
fputs(
-" verify the peer. Multiple paths can be provided by separating\n"
+" verify the peer. Multiple paths can be provided by separating\n"
" them with \":\" (e.g. \"path1:path2:path3\"). The certificates must\n"
-" be in PEM format, and if curl is built against OpenSSL, the di-\n"
+" be in PEM format, and if curl is built against OpenSSL, the di-\n"
" rectory must have been processed using the c_rehash utility sup-\n"
-" plied with OpenSSL. Using --capath can allow OpenSSL-powered\n"
-" curl to make SSL-connections much more efficiently than using\n"
+" plied with OpenSSL. Using --capath can allow OpenSSL-powered\n"
+" curl to make SSL-connections much more efficiently than using\n"
, stdout);
fputs(
" --cacert if the --cacert file contains many CA certificates.\n"
@@ -295,18 +363,18 @@ void hugehelp(void)
" and if it is used several times, the last one will be used.\n"
"\n"
" --cert-status\n"
-" (TLS) Tells curl to verify the status of the server certificate\n"
+" (TLS) Tells curl to verify the status of the server certificate\n"
" by using the Certificate Status Request (aka. OCSP stapling) TLS\n"
" extension.\n"
"\n"
, stdout);
fputs(
-" If this option is enabled and the server sends an invalid (e.g.\n"
+" If this option is enabled and the server sends an invalid (e.g.\n"
" expired) response, if the response suggests that the server cer-\n"
-" tificate has been revoked, or no response at all is received,\n"
+" tificate has been revoked, or no response at all is received,\n"
" the verification fails.\n"
"\n"
-" This is currently only implemented in the OpenSSL, GnuTLS and\n"
+" This is currently only implemented in the OpenSSL, GnuTLS and\n"
" NSS backends.\n"
"\n"
" Added in 7.41.0.\n"
@@ -314,85 +382,85 @@ void hugehelp(void)
" --cert-type <type>\n"
, stdout);
fputs(
-" (TLS) Tells curl what type the provided client certificate is\n"
+" (TLS) Tells curl what type the provided client certificate is\n"
" using. PEM, DER, ENG and P12 are recognized types. If not spec-\n"
" ified, PEM is assumed.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
-" See also -E, --cert and --key and --key-type.\n"
+" See also -E, --cert, --key and --key-type.\n"
"\n"
" -E, --cert <certificate[:password]>\n"
-" (TLS) Tells curl to use the specified client certificate file\n"
+" (TLS) Tells curl to use the specified client certificate file\n"
, stdout);
fputs(
" when getting a file with HTTPS, FTPS or another SSL-based proto-\n"
-" col. The certificate must be in PKCS#12 format if using Secure\n"
-" Transport, or PEM format if using any other engine. If the op-\n"
-" tional password isn't specified, it will be queried for on the\n"
-" terminal. Note that this option assumes a \"certificate\" file\n"
+" col. The certificate must be in PKCS#12 format if using Secure\n"
+" Transport, or PEM format if using any other engine. If the op-\n"
+" tional password isn't specified, it will be queried for on the\n"
+" terminal. Note that this option assumes a \"certificate\" file\n"
" that is the private key and the client certificate concatenated!\n"
, stdout);
fputs(
" See -E, --cert and --key to specify them independently.\n"
"\n"
-" If curl is built against the NSS SSL library then this option\n"
-" can tell curl the nickname of the certificate to use within the\n"
-" NSS database defined by the environment variable SSL_DIR (or by\n"
-" default /etc/pki/nssdb). If the NSS PEM PKCS#11 module (lib-\n"
-" nsspem.so) is available then PEM files may be loaded. If you\n"
+" If curl is built against the NSS SSL library then this option\n"
+" can tell curl the nickname of the certificate to use within the\n"
+" NSS database defined by the environment variable SSL_DIR (or by\n"
+" default /etc/pki/nssdb). If the NSS PEM PKCS#11 module (lib-\n"
+" nsspem.so) is available then PEM files may be loaded. If you\n"
, stdout);
fputs(
" want to use a file from the current directory, please precede it\n"
-" with \"./\" prefix, in order to avoid confusion with a nickname.\n"
-" If the nickname contains \":\", it needs to be preceded by \"\\\" so\n"
-" that it is not recognized as password delimiter. If the nick-\n"
-" name contains \"\\\", it needs to be escaped as \"\\\\\" so that it is\n"
+" with \"./\" prefix, in order to avoid confusion with a nickname.\n"
+" If the nickname contains \":\", it needs to be preceded by \"\\\" so\n"
+" that it is not recognized as password delimiter. If the nick-\n"
+" name contains \"\\\", it needs to be escaped as \"\\\\\" so that it is\n"
" not recognized as an escape character.\n"
"\n"
, stdout);
fputs(
-" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" If curl is built against OpenSSL library, and the engine pkcs11\n"
" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
-" ify a certificate located in a PKCS#11 device. A string begin-\n"
-" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
+" ify a certificate located in a PKCS#11 device. A string begin-\n"
+" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
" PKCS#11 URI is provided, then the --engine option will be set as\n"
" \"pkcs11\" if none was provided and the --cert-type option will be\n"
, stdout);
fputs(
" set as \"ENG\" if none was provided.\n"
"\n"
-" (iOS and macOS only) If curl is built against Secure Transport,\n"
+" (iOS and macOS only) If curl is built against Secure Transport,\n"
" then the certificate string can either be the name of a certifi-\n"
-" cate/private key in the system or user keychain, or the path to\n"
-" a PKCS#12-encoded certificate and private key. If you want to\n"
-" use a file from the current directory, please precede it with\n"
+" cate/private key in the system or user keychain, or the path to\n"
+" a PKCS#12-encoded certificate and private key. If you want to\n"
+" use a file from the current directory, please precede it with\n"
, stdout);
fputs(
" \"./\" prefix, in order to avoid confusion with a nickname.\n"
"\n"
-" (Schannel only) Client certificates must be specified by a path\n"
-" expression to a certificate store. (Loading PFX is not sup-\n"
+" (Schannel only) Client certificates must be specified by a path\n"
+" expression to a certificate store. (Loading PFX is not sup-\n"
" ported; you can import it to a store first). You can use \"<store\n"
-" location>\\<store name>\\<thumbprint>\" to refer to a certificate\n"
-" in the system certificates store, for example, \"Curren-\n"
+" location>\\<store name>\\<thumbprint>\" to refer to a certificate\n"
+" in the system certificates store, for example, \"Curren-\n"
, stdout);
fputs(
" tUser\\MY\\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a\". Thumbprint\n"
-" is usually a SHA-1 hex string which you can see in certificate\n"
-" details. Following store locations are supported: CurrentUser,\n"
-" LocalMachine, CurrentService, Services, CurrentUserGroupPolicy,\n"
+" is usually a SHA-1 hex string which you can see in certificate\n"
+" details. Following store locations are supported: CurrentUser,\n"
+" LocalMachine, CurrentService, Services, CurrentUserGroupPolicy,\n"
" LocalMachineGroupPolicy, LocalMachineEnterprise.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
, stdout);
fputs(
-" See also --cert-type and --key and --key-type.\n"
+" See also --cert-type, --key and --key-type.\n"
"\n"
" --ciphers <list of ciphers>\n"
" (TLS) Specifies which ciphers to use in the connection. The list\n"
-" of ciphers must specify valid ciphers. Read up on SSL cipher\n"
+" of ciphers must specify valid ciphers. Read up on SSL cipher\n"
" list details on this URL:\n"
"\n"
" https://curl.haxx.se/docs/ssl-ciphers.html\n"
@@ -409,76 +477,84 @@ void hugehelp(void)
"\n"
" --compressed\n"
" (HTTP) Request a compressed response using one of the algorithms\n"
-" curl supports, and save the uncompressed document. If this op-\n"
-" tion is used and the server sends an unsupported encoding, curl\n"
-" will report an error.\n"
-"\n"
-" -K, --config <file>\n"
+" curl supports, and automatically decompress the content. Headers\n"
+" are not modified.\n"
"\n"
+" If this option is used and the server sends an unsupported en-\n"
, stdout);
fputs(
-" Specify a text file to read curl arguments from. The command\n"
-" line arguments found in the text file will be used as if they\n"
+" coding, curl will report an error.\n"
+"\n"
+" -K, --config <file>\n"
+"\n"
+" Specify a text file to read curl arguments from. The command\n"
+" line arguments found in the text file will be used as if they\n"
" were provided on the command line.\n"
"\n"
-" Options and their parameters must be specified on the same line\n"
+" Options and their parameters must be specified on the same line\n"
" in the file, separated by whitespace, colon, or the equals sign.\n"
-" Long option names can optionally be given in the config file\n"
, stdout);
fputs(
+" Long option names can optionally be given in the config file\n"
" without the initial double dashes and if so, the colon or equals\n"
" characters can be used as separators. If the option is specified\n"
-" with one or two dashes, there can be no colon or equals charac-\n"
+" with one or two dashes, there can be no colon or equals charac-\n"
" ter between the option and its parameter.\n"
"\n"
-" If the parameter contains whitespace (or starts with : or =),\n"
-" the parameter must be enclosed within quotes. Within double\n"
+" If the parameter contains whitespace (or starts with : or =),\n"
, stdout);
fputs(
-" quotes, the following escape sequences are available: \\\\, \\\",\n"
+" the parameter must be enclosed within quotes. Within double\n"
+" quotes, the following escape sequences are available: \\\\, \\\",\n"
" \\t, \\n, \\r and \\v. A backslash preceding any other letter is ig-\n"
-" nored. If the first column of a config line is a '#' character,\n"
-" the rest of the line will be treated as a comment. Only write\n"
+" nored. If the first column of a config line is a '#' character,\n"
+" the rest of the line will be treated as a comment. Only write\n"
" one option per physical line in the config file.\n"
"\n"
-" Specify the filename to -K, --config as '-' to make curl read\n"
-" the file from stdin.\n"
-"\n"
, stdout);
fputs(
-" Note that to be able to specify a URL in the config file, you\n"
-" need to specify it using the --url option, and not by simply\n"
-" writing the URL on its own line. So, it could look similar to\n"
+" Specify the filename to -K, --config as '-' to make curl read\n"
+" the file from stdin.\n"
+"\n"
+" Note that to be able to specify a URL in the config file, you\n"
+" need to specify it using the --url option, and not by simply\n"
+" writing the URL on its own line. So, it could look similar to\n"
" this:\n"
"\n"
" url = \"https://curl.haxx.se/docs/\"\n"
"\n"
-" When curl is invoked, it (unless -q, --disable is used) checks\n"
-" for a default config file and uses it if found. The default con-\n"
, stdout);
fputs(
+" When curl is invoked, it (unless -q, --disable is used) checks\n"
+" for a default config file and uses it if found. The default con-\n"
" fig file is checked for in the following places in this order:\n"
"\n"
-" 1) curl tries to find the \"home dir\": It first checks for the\n"
-" CURL_HOME and then the HOME environment variables. Failing that,\n"
-" it uses getpwuid() on Unix-like systems (which returns the home\n"
-" dir given the current user in your system). On Windows, it then\n"
-" checks for the APPDATA variable, or as a last resort the '%USER-\n"
+" 1) Use the CURL_HOME environment variable if set\n"
+"\n"
+" 2) Use the XDG_CONFIG_HOME environment variable if set (Added in\n"
+" 7.73.0)\n"
+"\n"
+" 3) Use the HOME environment variable if set\n"
+"\n"
, stdout);
fputs(
-" PROFILE%\\Application Data'.\n"
+" 4) Non-windows: use getpwuid to find the home directory\n"
"\n"
-" 2) On windows, if there is no .curlrc file in the home dir, it\n"
+" 5) Windows: use APPDATA if set\n"
+"\n"
+" 6) Windows: use \"USERPROFILE0lication Data\" if set\n"
+"\n"
+" 7) On windows, if there is no .curlrc file in the home dir, it\n"
" checks for one in the same dir the curl executable is placed. On\n"
-" Unix-like systems, it will simply try to load .curlrc from the\n"
+" Unix-like systems, it will simply try to load .curlrc from the\n"
" determined home dir.\n"
"\n"
" # --- Example file ---\n"
+, stdout);
+ fputs(
" # this is a comment\n"
" url = \"example.com\"\n"
" output = \"curlhere.html\"\n"
-, stdout);
- fputs(
" user-agent = \"superagent/1.0\"\n"
"\n"
" # and fetch another URL too\n"
@@ -487,160 +563,161 @@ void hugehelp(void)
" referer = \"http://nowhereatall.example.com/\"\n"
" # --- End of example file ---\n"
"\n"
-" This option can be used multiple times to load multiple config\n"
+" This option can be used multiple times to load multiple config\n"
" files.\n"
"\n"
-" --connect-timeout <seconds>\n"
-" Maximum time in seconds that you allow curl's connection to\n"
, stdout);
fputs(
-" take. This only limits the connection phase, so if curl con-\n"
-" nects within the given period it will continue - if not it will\n"
+" --connect-timeout <seconds>\n"
+" Maximum time in seconds that you allow curl's connection to\n"
+" take. This only limits the connection phase, so if curl con-\n"
+" nects within the given period it will continue - if not it will\n"
" exit. Since version 7.32.0, this option accepts decimal values.\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -m, --max-time.\n"
"\n"
+, stdout);
+ fputs(
" --connect-to <HOST1:PORT1:HOST2:PORT2>\n"
"\n"
" For a request to the given HOST1:PORT1 pair, connect to\n"
-, stdout);
- fputs(
" HOST2:PORT2 instead. This option is suitable to direct requests\n"
" at a specific server, e.g. at a specific cluster node in a clus-\n"
-" ter of servers. This option is only used to establish the net-\n"
-" work connection. It does NOT affect the hostname/port that is\n"
-" used for TLS/SSL (e.g. SNI, certificate verification) or for the\n"
-" application protocols. \"HOST1\" and \"PORT1\" may be the empty\n"
+" ter of servers. This option is only used to establish the net-\n"
+" work connection. It does NOT affect the hostname/port that is\n"
, stdout);
fputs(
+" used for TLS/SSL (e.g. SNI, certificate verification) or for the\n"
+" application protocols. \"HOST1\" and \"PORT1\" may be the empty\n"
" string, meaning \"any host/port\". \"HOST2\" and \"PORT2\" may also be\n"
-" the empty string, meaning \"use the request's original\n"
+" the empty string, meaning \"use the request's original\n"
" host/port\".\n"
"\n"
" A \"host\" specified to this option is compared as a string, so it\n"
-" needs to match the name used in request URL. It can be either\n"
+, stdout);
+ fputs(
+" needs to match the name used in request URL. It can be either\n"
" numerical such as \"127.0.0.1\" or the full host name such as \"ex-\n"
" ample.org\".\n"
"\n"
-, stdout);
- fputs(
" This option can be used many times to add many connect rules.\n"
"\n"
" See also --resolve and -H, --header. Added in 7.49.0.\n"
"\n"
" -C, --continue-at <offset>\n"
-" Continue/Resume a previous file transfer at the given offset.\n"
-" The given offset is the exact number of bytes that will be\n"
-" skipped, counting from the beginning of the source file before\n"
-" it is transferred to the destination. If used with uploads, the\n"
+" Continue/Resume a previous file transfer at the given offset.\n"
, stdout);
fputs(
+" The given offset is the exact number of bytes that will be\n"
+" skipped, counting from the beginning of the source file before\n"
+" it is transferred to the destination. If used with uploads, the\n"
" FTP server command SIZE will not be used by curl.\n"
"\n"
-" Use \"-C -\" to tell curl to automatically find out where/how to\n"
-" resume the transfer. It then uses the given output/input files\n"
+" Use \"-C -\" to tell curl to automatically find out where/how to\n"
+" resume the transfer. It then uses the given output/input files\n"
" to figure that out.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -r, --range.\n"
"\n"
" -c, --cookie-jar <filename>\n"
-" (HTTP) Specify to which file you want curl to write all cookies\n"
+" (HTTP) Specify to which file you want curl to write all cookies\n"
+" after a completed operation. Curl writes all cookies from its\n"
+" in-memory cookie storage to the given file at the end of opera-\n"
+" tions. If no cookies are known, no data will be written. The\n"
, stdout);
fputs(
-" after a completed operation. Curl writes all cookies from its\n"
-" in-memory cookie storage to the given file at the end of opera-\n"
-" tions. If no cookies are known, no data will be written. The\n"
-" file will be written using the Netscape cookie file format. If\n"
+" file will be written using the Netscape cookie file format. If\n"
" you set the file name to a single dash, \"-\", the cookies will be\n"
" written to stdout.\n"
"\n"
-, stdout);
- fputs(
-" This command line option will activate the cookie engine that\n"
+" This command line option will activate the cookie engine that\n"
" makes curl record and use cookies. Another way to activate it is\n"
" to use the -b, --cookie option.\n"
"\n"
" If the cookie jar can't be created or written to, the whole curl\n"
-" operation won't fail or even report an error clearly. Using -v,\n"
-" --verbose will get a warning displayed, but that is the only\n"
, stdout);
fputs(
+" operation won't fail or even report an error clearly. Using -v,\n"
+" --verbose will get a warning displayed, but that is the only\n"
" visible feedback you get about this possibly lethal situation.\n"
"\n"
-" If this option is used several times, the last specified file\n"
+" If this option is used several times, the last specified file\n"
" name will be used.\n"
"\n"
" -b, --cookie <data|filename>\n"
" (HTTP) Pass the data to the HTTP server in the Cookie header. It\n"
-" is supposedly the data previously received from the server in a\n"
-" \"Set-Cookie:\" line. The data should be in the format\n"
, stdout);
fputs(
+" is supposedly the data previously received from the server in a\n"
+" \"Set-Cookie:\" line. The data should be in the format\n"
" \"NAME1=VALUE1; NAME2=VALUE2\".\n"
"\n"
-" If no '=' symbol is used in the argument, it is instead treated\n"
+" If no '=' symbol is used in the argument, it is instead treated\n"
" as a filename to read previously stored cookie from. This option\n"
" also activates the cookie engine which will make curl record in-\n"
-" coming cookies, which may be handy if you're using this in com-\n"
-" bination with the -L, --location option or do multiple URL\n"
, stdout);
fputs(
-" transfers on the same invoke. If the file name is exactly a mi-\n"
-" nus (\"-\"), curl will instead the contents from stdin.\n"
+" coming cookies, which may be handy if you're using this in com-\n"
+" bination with the -L, --location option or do multiple URL\n"
+" transfers on the same invoke. If the file name is exactly a mi-\n"
+" nus (\"-\"), curl will instead read the contents from stdin.\n"
"\n"
" The file format of the file to read cookies from should be plain\n"
-" HTTP headers (Set-Cookie style) or the Netscape/Mozilla cookie\n"
+" HTTP headers (Set-Cookie style) or the Netscape/Mozilla cookie\n"
" file format.\n"
"\n"
-" The file specified with -b, --cookie is only used as input. No\n"
-" cookies will be written to the file. To store cookies, use the\n"
, stdout);
fputs(
+" The file specified with -b, --cookie is only used as input. No\n"
+" cookies will be written to the file. To store cookies, use the\n"
" -c, --cookie-jar option.\n"
"\n"
-" Exercise caution if you are using this option and multiple\n"
+" Exercise caution if you are using this option and multiple\n"
" transfers may occur. If you use the NAME1=VALUE1; format, or in\n"
-" a file use the Set-Cookie format and don't specify a domain,\n"
-" then the cookie is sent for any domain (even after redirects are\n"
-" followed) and cannot be modified by a server-set cookie. If the\n"
+" a file use the Set-Cookie format and don't specify a domain,\n"
, stdout);
fputs(
-" cookie engine is enabled and a server sets a cookie of the same\n"
+" then the cookie is sent for any domain (even after redirects are\n"
+" followed) and cannot be modified by a server-set cookie. If the\n"
+" cookie engine is enabled and a server sets a cookie of the same\n"
" name then both will be sent on a future transfer to that server,\n"
" likely not what you intended. To address these issues set a do-\n"
-" main in Set-Cookie (doing that will include sub domains) or use\n"
+" main in Set-Cookie (doing that will include sub domains) or use\n"
+, stdout);
+ fputs(
" the Netscape format.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
-, stdout);
- fputs(
" Users very often want to both read cookies from a file and write\n"
-" updated cookies back to a file, so using both -b, --cookie and\n"
+" updated cookies back to a file, so using both -b, --cookie and\n"
" -c, --cookie-jar in the same command line is common.\n"
"\n"
" --create-dirs\n"
" When used in conjunction with the -o, --output option, curl will\n"
-" create the necessary local directory hierarchy as needed. This\n"
-" option creates the dirs mentioned with the -o, --output option,\n"
, stdout);
fputs(
-" nothing else. If the --output file name uses no dir or if the\n"
+" create the necessary local directory hierarchy as needed. This\n"
+" option creates the dirs mentioned with the -o, --output option,\n"
+" nothing else. If the --output file name uses no dir or if the\n"
" dirs it mentions already exist, no dir will be created.\n"
"\n"
-" To create remote directories when using FTP or SFTP, try --ftp-\n"
+" Created dirs are made with mode 0750 on unix style file systems.\n"
+" To create remote directories when using FTP or SFTP, try --ftp-\n"
" create-dirs.\n"
"\n"
-" --crlf (FTP SMTP) Convert LF to CRLF in upload. Useful for MVS\n"
+, stdout);
+ fputs(
+" --crlf (FTP SMTP) Convert LF to CRLF in upload. Useful for MVS\n"
" (OS/390).\n"
"\n"
" (SMTP added in 7.40.0)\n"
"\n"
" --crlfile <file>\n"
-, stdout);
- fputs(
" (TLS) Provide a file using PEM format with a Certificate Revoca-\n"
" tion List that may specify peer certificates that are to be con-\n"
" sidered revoked.\n"
@@ -649,6 +726,26 @@ void hugehelp(void)
"\n"
" Added in 7.19.7.\n"
"\n"
+, stdout);
+ fputs(
+" --curves <algorithm list>\n"
+" (TLS) Tells curl to request specific curves to use during SSL\n"
+" session establishment according to RFC 8422, 5.1. Multiple al-\n"
+" gorithms can be provided by separating them with \":\" (e.g.\n"
+" \"X25519:P-521\"). The parameter is available identically in the\n"
+" \"openssl s_client/s_server\" utilities.\n"
+"\n"
+" --curves allows a OpenSSL powered curl to make SSL-connections\n"
+, stdout);
+ fputs(
+" with exactly the (EC) curve requested by the client, avoiding\n"
+" intransparent client/server negotiations.\n"
+"\n"
+" If this option is set, the default curves list built into\n"
+" openssl will be ignored.\n"
+"\n"
+" Added in 7.73.0.\n"
+"\n"
" --data-ascii <data>\n"
" (HTTP) This is just an alias for -d, --data.\n"
"\n"
@@ -727,8 +824,8 @@ void hugehelp(void)
" -d, --data <data>\n"
, stdout);
fputs(
-" (HTTP) Sends the specified data in a POST request to the HTTP\n"
-" server, in the same way that a browser does when a user has\n"
+" (HTTP MQTT) Sends the specified data in a POST request to the\n"
+" HTTP server, in the same way that a browser does when a user has\n"
" filled in an HTML form and presses the submit button. This will\n"
" cause curl to pass the data to the server using the content-type\n"
" application/x-www-form-urlencoded. Compare to -F, --form.\n"
@@ -750,29 +847,28 @@ void hugehelp(void)
"\n"
" If you start the data with the letter @, the rest should be a\n"
" file name to read the data from, or - if you want curl to read\n"
-" the data from stdin. Multiple files can also be specified. Post-\n"
-" ing data from a file named 'foobar' would thus be done with -d,\n"
+" the data from stdin. Posting data from a file named 'foobar'\n"
+" would thus be done with -d, --data @foobar. When -d, --data is\n"
, stdout);
fputs(
-" --data @foobar. When --data is told to read from a file like\n"
-" that, carriage returns and newlines will be stripped out. If you\n"
-" don't want the @ character to have a special interpretation use\n"
-" --data-raw instead.\n"
+" told to read from a file like that, carriage returns and new-\n"
+" lines will be stripped out. If you don't want the @ character to\n"
+" have a special interpretation use --data-raw instead.\n"
"\n"
-" See also --data-binary and --data-urlencode and --data-raw. This\n"
-" option overrides -F, --form and -I, --head and -T, --upload-\n"
+" See also --data-binary, --data-urlencode and --data-raw. This\n"
+" option overrides -F, --form and -I, --head and -T, --upload-\n"
" file.\n"
"\n"
" --delegation <LEVEL>\n"
, stdout);
fputs(
-" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
+" (GSS/kerberos) Set LEVEL to tell the server what it is allowed\n"
" to delegate when it comes to user credentials.\n"
"\n"
" none Don't allow any delegation.\n"
"\n"
-" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
-" in the Kerberos service ticket, which is a matter of\n"
+" policy Delegates if and only if the OK-AS-DELEGATE flag is set\n"
+" in the Kerberos service ticket, which is a matter of\n"
" realm policy.\n"
"\n"
" always Unconditionally allow the server to delegate.\n"
@@ -780,25 +876,25 @@ void hugehelp(void)
" --digest\n"
, stdout);
fputs(
-" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
-" cation scheme that prevents the password from being sent over\n"
-" the wire in clear text. Use this in combination with the normal\n"
+" (HTTP) Enables HTTP Digest authentication. This is an authenti-\n"
+" cation scheme that prevents the password from being sent over\n"
+" the wire in clear text. Use this in combination with the normal\n"
" -u, --user option to set user name and password.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
" used.\n"
"\n"
-" See also -u, --user and --proxy-digest and --anyauth. This op-\n"
+" See also -u, --user, --proxy-digest and --anyauth. This option\n"
, stdout);
fputs(
-" tion overrides --basic and --ntlm and --negotiate.\n"
+" overrides --basic and --ntlm and --negotiate.\n"
"\n"
" --disable-eprt\n"
" (FTP) Tell curl to disable the use of the EPRT and LPRT commands\n"
" when doing active FTP transfers. Curl will normally always first\n"
-" attempt to use EPRT, then LPRT before using PORT, but with this\n"
-" option, it will use PORT right away. EPRT and LPRT are exten-\n"
-" sions to the original FTP protocol, and may not work on all\n"
+" attempt to use EPRT, then LPRT before using PORT, but with this\n"
+" option, it will use PORT right away. EPRT and LPRT are exten-\n"
+" sions to the original FTP protocol, and may not work on all\n"
, stdout);
fputs(
" servers, but they enable more functionality in a better way than\n"
@@ -807,19 +903,19 @@ void hugehelp(void)
" --eprt can be used to explicitly enable EPRT again and --no-eprt\n"
" is an alias for --disable-eprt.\n"
"\n"
-" If the server is accessed using IPv6, this option will have no\n"
+" If the server is accessed using IPv6, this option will have no\n"
" effect as EPRT is necessary then.\n"
"\n"
-" Disabling EPRT only changes the active behavior. If you want to\n"
+" Disabling EPRT only changes the active behavior. If you want to\n"
, stdout);
fputs(
-" switch to passive mode you need to not use -P, --ftp-port or\n"
+" switch to passive mode you need to not use -P, --ftp-port or\n"
" force it with --ftp-pasv.\n"
"\n"
" --disable-epsv\n"
-" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
-" when doing passive FTP transfers. Curl will normally always\n"
-" first attempt to use EPSV before PASV, but with this option, it\n"
+" (FTP) (FTP) Tell curl to disable the use of the EPSV command\n"
+" when doing passive FTP transfers. Curl will normally always\n"
+" first attempt to use EPSV before PASV, but with this option, it\n"
" will not try using EPSV.\n"
"\n"
" --epsv can be used to explicitly enable EPSV again and --no-epsv\n"
@@ -827,73 +923,73 @@ void hugehelp(void)
fputs(
" is an alias for --disable-epsv.\n"
"\n"
-" If the server is an IPv6 host, this option will have no effect\n"
+" If the server is an IPv6 host, this option will have no effect\n"
" as EPSV is necessary then.\n"
"\n"
" Disabling EPSV only changes the passive behavior. If you want to\n"
" switch to active mode you need to use -P, --ftp-port.\n"
"\n"
" -q, --disable\n"
-" If used as the first parameter on the command line, the curlrc\n"
-" config file will not be read and used. See the -K, --config for\n"
+" If used as the first parameter on the command line, the curlrc\n"
+" config file will not be read and used. See the -K, --config for\n"
, stdout);
fputs(
" details on the default config file search path.\n"
"\n"
" --disallow-username-in-url\n"
-" (HTTP) This tells curl to exit if passed a url containing a\n"
+" (HTTP) This tells curl to exit if passed a url containing a\n"
" username.\n"
"\n"
" See also --proto. Added in 7.61.0.\n"
"\n"
" --dns-interface <interface>\n"
-" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
-" face>. This option is a counterpart to --interface (which does\n"
+" (DNS) Tell curl to send outgoing DNS requests through <inter-\n"
+" face>. This option is a counterpart to --interface (which does\n"
, stdout);
fputs(
-" not affect DNS). The supplied string must be an interface name\n"
+" not affect DNS). The supplied string must be an interface name\n"
" (not an address).\n"
"\n"
-" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-ipv4-addr and --dns-ipv6-addr. --dns-interface\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv4-addr <address>\n"
" (DNS) Tell curl to bind to <ip-address> when making IPv4 DNS re-\n"
-" quests, so that the DNS requests originate from this address.\n"
+" quests, so that the DNS requests originate from this address.\n"
, stdout);
fputs(
" The argument should be a single IPv4 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv6-addr. --dns-ipv4-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-ipv6-addr <address>\n"
" (DNS) Tell curl to bind to <ip-address> when making IPv6 DNS re-\n"
-" quests, so that the DNS requests originate from this address.\n"
+" quests, so that the DNS requests originate from this address.\n"
, stdout);
fputs(
" The argument should be a single IPv6 address.\n"
"\n"
-" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
-" requires that the underlying libcurl was built to support c-\n"
+" See also --dns-interface and --dns-ipv4-addr. --dns-ipv6-addr\n"
+" requires that the underlying libcurl was built to support c-\n"
" ares. Added in 7.33.0.\n"
"\n"
" --dns-servers <addresses>\n"
" Set the list of DNS servers to be used instead of the system de-\n"
-" fault. The list of IP addresses should be separated with com-\n"
+" fault. The list of IP addresses should be separated with com-\n"
, stdout);
fputs(
" mas. Port numbers may also optionally be given as :<port-number>\n"
" after each IP address.\n"
"\n"
-" --dns-servers requires that the underlying libcurl was built to\n"
+" --dns-servers requires that the underlying libcurl was built to\n"
" support c-ares. Added in 7.33.0.\n"
"\n"
" --doh-url <URL>\n"
-" (all) Specifies which DNS-over-HTTPS (DOH) server to use to re-\n"
-" solve hostnames, instead of using the default name resolver\n"
+" (all) Specifies which DNS-over-HTTPS (DOH) server to use to re-\n"
+" solve hostnames, instead of using the default name resolver\n"
" mechanism. The URL must be HTTPS.\n"
"\n"
, stdout);
@@ -903,21 +999,21 @@ void hugehelp(void)
" Added in 7.62.0.\n"
"\n"
" -D, --dump-header <filename>\n"
-" (HTTP FTP) Write the received protocol headers to the specified\n"
+" (HTTP FTP) Write the received protocol headers to the specified\n"
" file.\n"
"\n"
-" This option is handy to use when you want to store the headers\n"
-" that an HTTP site sends to you. Cookies from the headers could\n"
-" then be read in a second curl invocation by using the -b,\n"
+" This option is handy to use when you want to store the headers\n"
+" that an HTTP site sends to you. Cookies from the headers could\n"
+" then be read in a second curl invocation by using the -b,\n"
, stdout);
fputs(
-" --cookie option! The -c, --cookie-jar option is a better way to\n"
+" --cookie option! The -c, --cookie-jar option is a better way to\n"
" store cookies.\n"
"\n"
-" If no headers are received, the use of this option will create\n"
+" If no headers are received, the use of this option will create\n"
" an empty file.\n"
"\n"
-" When used in FTP, the FTP server response lines are considered\n"
+" When used in FTP, the FTP server response lines are considered\n"
" being \"headers\" and thus are saved there.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -927,214 +1023,254 @@ void hugehelp(void)
" --egd-file <file>\n"
, stdout);
fputs(
-" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
-" socket. The socket is used to seed the random engine for SSL\n"
+" (TLS) Specify the path name to the Entropy Gathering Daemon\n"
+" socket. The socket is used to seed the random engine for SSL\n"
" connections.\n"
"\n"
" See also --random-file.\n"
"\n"
" --engine <name>\n"
-" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
+" (TLS) Select the OpenSSL crypto engine to use for cipher opera-\n"
" tions. Use --engine list to print a list of build-time supported\n"
-" engines. Note that not all (or none) of the engines may be\n"
+" engines. Note that not all (or none) of the engines may be\n"
, stdout);
fputs(
" available at run-time.\n"
"\n"
+" --etag-compare <file>\n"
+" (HTTP) This option makes a conditional HTTP request for the spe-\n"
+" cific ETag read from the given file by sending a custom If-None-\n"
+" Match header using the extracted ETag.\n"
+"\n"
+" For correct results, make sure that specified file contains only\n"
+" a single line with a desired ETag. An empty file is parsed as an\n"
+" empty ETag.\n"
+"\n"
+, stdout);
+ fputs(
+" Use the option --etag-save to first save the ETag from a re-\n"
+" sponse, and then use this option to compare using the saved ETag\n"
+" in a subsequent request.\n"
+"\n"
+" OMPARISON: There are 2 types of comparison or ETags, Weak and\n"
+" Strong. This option expects, and uses a strong comparison.\n"
+"\n"
+" Added in 7.68.0.\n"
+"\n"
+" --etag-save <file>\n"
+" (HTTP) This option saves an HTTP ETag to the specified file.\n"
+, stdout);
+ fputs(
+" Etag is usually part of headers returned by a request. When\n"
+" server sends an ETag, it must be enveloped by a double quote.\n"
+" This option extracts the ETag without the double quotes and\n"
+" saves it into the <file>.\n"
+"\n"
+" A server can send a week ETag which is prefixed by \"W/\". This\n"
+" identifier is not considered, and only relevant ETag between\n"
+" quotation marks is parsed.\n"
+"\n"
+, stdout);
+ fputs(
+" It an ETag wasn't send by the server or it cannot be parsed, and\n"
+" empty file is created.\n"
+"\n"
+" Added in 7.68.0.\n"
+"\n"
" --expect100-timeout <seconds>\n"
" (HTTP) Maximum time in seconds that you allow curl to wait for a\n"
-" 100-continue response when curl emits an Expects: 100-continue\n"
-" header in its request. By default curl will wait one second.\n"
-" This option accepts decimal values! When curl stops waiting, it\n"
-" will continue as if the response has been received.\n"
-"\n"
+" 100-continue response when curl emits an Expects: 100-continue\n"
+" header in its request. By default curl will wait one second.\n"
, stdout);
fputs(
+" This option accepts decimal values! When curl stops waiting, it\n"
+" will continue as if the response has been received.\n"
+"\n"
" See also --connect-timeout. Added in 7.47.0.\n"
"\n"
" --fail-early\n"
" Fail and exit on the first detected transfer error.\n"
"\n"
-" When curl is used to do multiple transfers on the command line,\n"
+" When curl is used to do multiple transfers on the command line,\n"
" it will attempt to operate on each given URL, one by one. By de-\n"
-" fault, it will ignore errors if there are more URLs given and\n"
-" the last URL's success will determine the error code curl re-\n"
, stdout);
fputs(
+" fault, it will ignore errors if there are more URLs given and\n"
+" the last URL's success will determine the error code curl re-\n"
" turns. So early failures will be \"hidden\" by subsequent success-\n"
" ful transfers.\n"
"\n"
-" Using this option, curl will instead return an error on the\n"
-" first transfer that fails, independent of the amount of URLs\n"
-" that are given on the command line. This way, no transfer fail-\n"
+" Using this option, curl will instead return an error on the\n"
+" first transfer that fails, independent of the amount of URLs\n"
+, stdout);
+ fputs(
+" that are given on the command line. This way, no transfer fail-\n"
" ures go undetected by scripts and similar.\n"
"\n"
" This option is global and does not need to be specified for each\n"
-, stdout);
- fputs(
" use of -:, --next.\n"
"\n"
" This option does not imply -f, --fail, which causes transfers to\n"
-" fail due to the server's HTTP status code. You can combine the\n"
+" fail due to the server's HTTP status code. You can combine the\n"
" two options, however note -f, --fail is not global and is there-\n"
+, stdout);
+ fputs(
" fore contained by -:, --next.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -f, --fail\n"
-" (HTTP) Fail silently (no output at all) on server errors. This\n"
+" (HTTP) Fail silently (no output at all) on server errors. This\n"
+" is mostly done to better enable scripts etc to better deal with\n"
+" failed attempts. In normal cases when an HTTP server fails to\n"
+" deliver a document, it returns an HTML document stating so\n"
+" (which often also describes why and more). This flag will pre-\n"
, stdout);
fputs(
-" is mostly done to better enable scripts etc to better deal with\n"
-" failed attempts. In normal cases when an HTTP server fails to\n"
-" deliver a document, it returns an HTML document stating so\n"
-" (which often also describes why and more). This flag will pre-\n"
" vent curl from outputting that and return error 22.\n"
"\n"
-" This method is not fail-safe and there are occasions where non-\n"
-, stdout);
- fputs(
+" This method is not fail-safe and there are occasions where non-\n"
" successful response codes will slip through, especially when au-\n"
" thentication is involved (response codes 401 and 407).\n"
"\n"
" --false-start\n"
-" (TLS) Tells curl to use false start during the TLS handshake.\n"
-" False start is a mode where a TLS client will start sending ap-\n"
-" plication data before verifying the server's Finished message,\n"
-" thus saving a round trip when performing a full handshake.\n"
-"\n"
+" (TLS) Tells curl to use false start during the TLS handshake.\n"
+" False start is a mode where a TLS client will start sending ap-\n"
, stdout);
fputs(
-" This is currently only implemented in the NSS and Secure Trans-\n"
+" plication data before verifying the server's Finished message,\n"
+" thus saving a round trip when performing a full handshake.\n"
+"\n"
+" This is currently only implemented in the NSS and Secure Trans-\n"
" port (on iOS 7.0 or later, or OS X 10.9 or later) backends.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
" --form-string <name=string>\n"
-" (HTTP SMTP IMAP) Similar to -F, --form except that the value\n"
-" string for the named parameter is used literally. Leading '@'\n"
-" and '<' characters, and the ';type=' string in the value have no\n"
+" (HTTP SMTP IMAP) Similar to -F, --form except that the value\n"
, stdout);
fputs(
+" string for the named parameter is used literally. Leading '@'\n"
+" and '<' characters, and the ';type=' string in the value have no\n"
" special meaning. Use this in preference to -F, --form if there's\n"
-" any possibility that the string value may accidentally trigger\n"
+" any possibility that the string value may accidentally trigger\n"
" the '@' or '<' features of -F, --form.\n"
"\n"
" See also -F, --form.\n"
"\n"
" -F, --form <name=content>\n"
-" (HTTP SMTP IMAP) For HTTP protocol family, this lets curl emu-\n"
-" late a filled-in form in which a user has pressed the submit\n"
, stdout);
fputs(
-" button. This causes curl to POST data using the Content-Type\n"
+" (HTTP SMTP IMAP) For HTTP protocol family, this lets curl emu-\n"
+" late a filled-in form in which a user has pressed the submit\n"
+" button. This causes curl to POST data using the Content-Type\n"
" multipart/form-data according to RFC 2388.\n"
"\n"
-" For SMTP and IMAP protocols, this is the mean to compose a mul-\n"
+" For SMTP and IMAP protocols, this is the mean to compose a mul-\n"
" tipart mail message to transmit.\n"
"\n"
-" This enables uploading of binary files etc. To force the 'con-\n"
-" tent' part to be a file, prefix the file name with an @ sign. To\n"
, stdout);
fputs(
+" This enables uploading of binary files etc. To force the 'con-\n"
+" tent' part to be a file, prefix the file name with an @ sign. To\n"
" just get the content part from a file, prefix the file name with\n"
-" the symbol <. The difference between @ and < is then that @\n"
-" makes a file get attached in the post as a file upload, while\n"
+" the symbol <. The difference between @ and < is then that @\n"
+" makes a file get attached in the post as a file upload, while\n"
" the < makes a text field and just get the contents for that text\n"
-" field from a file.\n"
-"\n"
-" Tell curl to read content from stdin instead of a file by using\n"
, stdout);
fputs(
+" field from a file.\n"
+"\n"
+" Tell curl to read content from stdin instead of a file by using\n"
" - as filename. This goes for both @ and < constructs. When stdin\n"
" is used, the contents is buffered in memory first by curl to de-\n"
" termine its size and allow a possible resend. Defining a part's\n"
" data from a named non-regular file (such as a named pipe or sim-\n"
-" ilar) is unfortunately not subject to buffering and will be ef-\n"
-" fectively read at transmission time; since the full size is un-\n"
, stdout);
fputs(
+" ilar) is unfortunately not subject to buffering and will be ef-\n"
+" fectively read at transmission time; since the full size is un-\n"
" known before the transfer starts, such data is sent as chunks by\n"
" HTTP and rejected by IMAP.\n"
"\n"
" Example: send an image to an HTTP server, where 'profile' is the\n"
-" name of the form-field to which the file portrait.jpg will be\n"
+" name of the form-field to which the file portrait.jpg will be\n"
" the input:\n"
"\n"
+, stdout);
+ fputs(
" curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
"\n"
-" Example: send a your name and shoe size in two text fields to\n"
-" the server:\n"
+" Example: send your name and shoe size in two text fields to the\n"
+" server:\n"
"\n"
-, stdout);
- fputs(
" curl -F name=John -F shoesize=11 https://example.com/\n"
"\n"
-" Example: send a your essay in a text field to the server. Send\n"
-" it as a plain text field, but get the contents for it from a lo-\n"
-" cal file:\n"
+" Example: send your essay in a text field to the server. Send it\n"
+" as a plain text field, but get the contents for it from a local\n"
+" file:\n"
"\n"
" curl -F \"story=<hugefile.txt\" https://example.com/\n"
"\n"
-" You can also tell curl what Content-Type to use by using\n"
-" 'type=', in a manner similar to:\n"
-"\n"
, stdout);
fputs(
+" You can also tell curl what Content-Type to use by using\n"
+" 'type=', in a manner similar to:\n"
+"\n"
" curl -F \"web=@index.html;type=text/html\" example.com\n"
"\n"
" or\n"
"\n"
" curl -F \"name=daniel;type=text/foo\" example.com\n"
"\n"
-" You can also explicitly change the name field of a file upload\n"
+" You can also explicitly change the name field of a file upload\n"
" part by setting filename=, like this:\n"
"\n"
" curl -F \"file=@localfile;filename=nameinpost\" example.com\n"
"\n"
-" If filename/path contains ',' or ';', it must be quoted by dou-\n"
-" ble-quotes like:\n"
-"\n"
, stdout);
fputs(
-" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
+" If filename/path contains ',' or ';', it must be quoted by dou-\n"
+" ble-quotes like:\n"
+"\n"
+" curl -F \"file=@\\\"localfile\\\";filename=\\\"nameinpost\\\"\" exam-\n"
" ple.com\n"
"\n"
" or\n"
"\n"
" curl -F 'file=@\"localfile\";filename=\"nameinpost\"' example.com\n"
"\n"
-" Note that if a filename/path is quoted by double-quotes, any\n"
+" Note that if a filename/path is quoted by double-quotes, any\n"
" double-quote or backslash within the filename must be escaped by\n"
" backslash.\n"
"\n"
-" Quoting must also be applied to non-file data if it contains\n"
, stdout);
fputs(
+" Quoting must also be applied to non-file data if it contains\n"
" semicolons, leading/trailing spaces or leading double quotes:\n"
"\n"
-" curl -F 'colors=\"red; green; blue\";type=text/x-myapp' exam-\n"
+" curl -F 'colors=\"red; green; blue\";type=text/x-myapp' exam-\n"
" ple.com\n"
"\n"
-" You can add custom headers to the field by setting headers=,\n"
+" You can add custom headers to the field by setting headers=,\n"
" like\n"
"\n"
" curl -F \"submit=OK;headers=\\\"X-submit-type: OK\\\"\" example.com\n"
"\n"
" or\n"
"\n"
-" curl -F \"submit=OK;headers=@headerfile\" example.com\n"
-"\n"
, stdout);
fputs(
-" The headers= keyword may appear more that once and above notes\n"
-" about quoting apply. When headers are read from a file, Empty\n"
+" curl -F \"submit=OK;headers=@headerfile\" example.com\n"
+"\n"
+" The headers= keyword may appear more that once and above notes\n"
+" about quoting apply. When headers are read from a file, Empty\n"
" lines and lines starting with '#' are comments and ignored; each\n"
" header can be folded by splitting between two words and starting\n"
-" the continuation line with a space; embedded carriage-returns\n"
-" and trailing spaces are stripped. Here is an example of a\n"
+" the continuation line with a space; embedded carriage-returns\n"
, stdout);
fputs(
+" and trailing spaces are stripped. Here is an example of a\n"
" header file contents:\n"
"\n"
" # This file contain two headers.\n"
@@ -1144,75 +1280,75 @@ void hugehelp(void)
" X-header-2: this is\n"
" another header\n"
"\n"
-" To support sending multipart mail messages, the syntax is ex-\n"
+" To support sending multipart mail messages, the syntax is ex-\n"
" tended as follows:\n"
-" - name can be omitted: the equal sign is the first character of\n"
-" the argument,\n"
, stdout);
fputs(
-" - if data starts with '(', this signals to start a new multi-\n"
+" - name can be omitted: the equal sign is the first character of\n"
+" the argument,\n"
+" - if data starts with '(', this signals to start a new multi-\n"
" part: it can be followed by a content type specification.\n"
" - a multipart can be terminated with a '=)' argument.\n"
"\n"
-" Example: the following command sends an SMTP mime e-mail con-\n"
+" Example: the following command sends an SMTP mime e-mail con-\n"
" sisting in an inline part in two alternative formats: plain text\n"
+, stdout);
+ fputs(
" and HTML. It attaches a text file:\n"
"\n"
" curl -F '=(;type=multipart/alternative' \\\n"
-, stdout);
- fputs(
" -F '=plain text message' \\\n"
" -F '= <body>HTML message</body>;type=text/html' \\\n"
" -F '=)' -F '=@textfile.txt' ... smtp://example.com\n"
"\n"
-" Data can be encoded for transfer using encoder=. Available en-\n"
+" Data can be encoded for transfer using encoder=. Available en-\n"
" codings are binary and 8bit that do nothing else than adding the\n"
-" corresponding Content-Transfer-Encoding header, 7bit that only\n"
, stdout);
fputs(
+" corresponding Content-Transfer-Encoding header, 7bit that only\n"
" rejects 8-bit characters with a transfer error, quoted-printable\n"
-" and base64 that encodes data according to the corresponding\n"
+" and base64 that encodes data according to the corresponding\n"
" schemes, limiting lines length to 76 characters.\n"
"\n"
-" Example: send multipart mail with a quoted-printable text mes-\n"
+" Example: send multipart mail with a quoted-printable text mes-\n"
" sage and a base64 attached file:\n"
"\n"
" curl -F '=text message;encoder=quoted-printable' \\\n"
-" -F '=@localfile;encoder=base64' ... smtp://example.com\n"
-"\n"
, stdout);
fputs(
+" -F '=@localfile;encoder=base64' ... smtp://example.com\n"
+"\n"
" See further examples and details in the MANUAL.\n"
"\n"
" This option can be used multiple times.\n"
"\n"
-" This option overrides -d, --data and -I, --head and -T, --up-\n"
+" This option overrides -d, --data and -I, --head and -T, --up-\n"
" load-file.\n"
"\n"
" --ftp-account <data>\n"
" (FTP) When an FTP server asks for \"account data\" after user name\n"
-" and password has been provided, this data is sent off using the\n"
-" ACCT command.\n"
-"\n"
+" and password has been provided, this data is sent off using the\n"
, stdout);
fputs(
+" ACCT command.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.13.0.\n"
"\n"
" --ftp-alternative-to-user <command>\n"
-" (FTP) If authenticating with the USER and PASS commands fails,\n"
-" send this command. When connecting to Tumbleweed's Secure\n"
-" Transport server over FTPS using a client certificate, using\n"
-" \"SITE AUTH\" will tell the server to retrieve the username from\n"
+" (FTP) If authenticating with the USER and PASS commands fails,\n"
+" send this command. When connecting to Tumbleweed's Secure\n"
+" Transport server over FTPS using a client certificate, using\n"
+" \"SITE AUTH\" will tell the server to retrieve the username from\n"
, stdout);
fputs(
" the certificate.\n"
" Added in 7.15.5.\n"
"\n"
" --ftp-create-dirs\n"
-" (FTP SFTP) When an FTP or SFTP URL/operation uses a path that\n"
-" doesn't currently exist on the server, the standard behavior of\n"
+" (FTP SFTP) When an FTP or SFTP URL/operation uses a path that\n"
+" doesn't currently exist on the server, the standard behavior of\n"
" curl is to fail. Using this option, curl will instead attempt to\n"
" create missing directories.\n"
"\n"
@@ -1221,41 +1357,41 @@ void hugehelp(void)
" --ftp-method <method>\n"
, stdout);
fputs(
-" (FTP) Control what method curl should use to reach a file on an\n"
-" FTP(S) server. The method argument should be one of the follow-\n"
+" (FTP) Control what method curl should use to reach a file on an\n"
+" FTP(S) server. The method argument should be one of the follow-\n"
" ing alternatives:\n"
"\n"
" multicwd\n"
-" curl does a single CWD operation for each path part in\n"
-" the given URL. For deep hierarchies this means very many\n"
-" commands. This is how RFC 1738 says it should be done.\n"
+" curl does a single CWD operation for each path part in\n"
+" the given URL. For deep hierarchies this means very many\n"
+" commands. This is how RFC 1738 says it should be done.\n"
, stdout);
fputs(
" This is the default but the slowest behavior.\n"
"\n"
-" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n"
+" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n"
" etc and give a full path to the server for all these com-\n"
" mands. This is the fastest behavior.\n"
"\n"
" singlecwd\n"
" curl does one CWD with the full target directory and then\n"
-" operates on the file \"normally\" (like in the multicwd\n"
+" operates on the file \"normally\" (like in the multicwd\n"
, stdout);
fputs(
-" case). This is somewhat more standards compliant than\n"
+" case). This is somewhat more standards compliant than\n"
" 'nocwd' but without the full penalty of 'multicwd'.\n"
"\n"
" Added in 7.15.1.\n"
"\n"
" --ftp-pasv\n"
-" (FTP) Use passive mode for the data connection. Passive is the\n"
-" internal default behavior, but using this option can be used to\n"
+" (FTP) Use passive mode for the data connection. Passive is the\n"
+" internal default behavior, but using this option can be used to\n"
" override a previous -P, --ftp-port option.\n"
"\n"
-" If this option is used several times, only the first one is\n"
+" If this option is used several times, only the first one is\n"
, stdout);
fputs(
-" used. Undoing an enforced passive really isn't doable but you\n"
+" used. Undoing an enforced passive really isn't doable but you\n"
" must then instead enforce the correct -P, --ftp-port again.\n"
"\n"
" Passive mode means that curl will try the EPSV command first and\n"
@@ -1263,17 +1399,17 @@ void hugehelp(void)
" See also --disable-epsv. Added in 7.11.0.\n"
"\n"
" -P, --ftp-port <address>\n"
-" (FTP) Reverses the default initiator/listener roles when con-\n"
+" (FTP) Reverses the default initiator/listener roles when con-\n"
, stdout);
fputs(
-" necting with FTP. This option makes curl use active mode. curl\n"
-" then tells the server to connect back to the client's specified\n"
+" necting with FTP. This option makes curl use active mode. curl\n"
+" then tells the server to connect back to the client's specified\n"
" address and port, while passive mode asks the server to setup an\n"
-" IP address and port for it to connect to. <address> should be\n"
+" IP address and port for it to connect to. <address> should be\n"
" one of:\n"
"\n"
" interface\n"
-" e.g. \"eth0\" to specify which interface's IP address you\n"
+" e.g. \"eth0\" to specify which interface's IP address you\n"
" want to use (Unix only)\n"
"\n"
, stdout);
@@ -1284,20 +1420,20 @@ void hugehelp(void)
" host name\n"
" e.g. \"my.host.domain\" to specify the machine\n"
"\n"
-" - make curl pick the same IP address that is already used\n"
+" - make curl pick the same IP address that is already used\n"
" for the control connection\n"
"\n"
-" If this option is used several times, the last one will be used. Dis-\n"
-" able the use of PORT with --ftp-pasv. Disable the attempt to use the\n"
+" If this option is used several times, the last one will be used. Dis-\n"
+" able the use of PORT with --ftp-pasv. Disable the attempt to use the\n"
, stdout);
fputs(
-" EPRT command instead of PORT by using --disable-eprt. EPRT is really\n"
+" EPRT command instead of PORT by using --disable-eprt. EPRT is really\n"
" PORT++.\n"
"\n"
-" Since 7.19.5, you can append \":[start]-[end]\" to the right of the ad-\n"
-" dress, to tell curl what TCP port range to use. That means you specify\n"
+" Since 7.19.5, you can append \":[start]-[end]\" to the right of the ad-\n"
+" dress, to tell curl what TCP port range to use. That means you specify\n"
" a port range, from a lower to a higher number. A single number works as\n"
-" well, but do note that it increases the risk of failure since the port\n"
+" well, but do note that it increases the risk of failure since the port\n"
" may not be available.\n"
"\n"
" See also --ftp-pasv and --disable-eprt.\n"
@@ -1305,28 +1441,28 @@ void hugehelp(void)
, stdout);
fputs(
" --ftp-pret\n"
-" (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n"
-" Certain FTP servers, mainly drftpd, require this non-standard\n"
-" command for directory listings as well as up and downloads in\n"
+" (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n"
+" Certain FTP servers, mainly drftpd, require this non-standard\n"
+" command for directory listings as well as up and downloads in\n"
" PASV mode.\n"
"\n"
" Added in 7.20.0.\n"
"\n"
" --ftp-skip-pasv-ip\n"
" (FTP) Tell curl to not use the IP address the server suggests in\n"
-" its response to curl's PASV command when curl connects the data\n"
+" its response to curl's PASV command when curl connects the data\n"
, stdout);
fputs(
-" connection. Instead curl will re-use the same IP address it al-\n"
+" connection. Instead curl will re-use the same IP address it al-\n"
" ready uses for the control connection.\n"
"\n"
-" This option has no effect if PORT, EPRT or EPSV is used instead\n"
+" This option has no effect if PORT, EPRT or EPSV is used instead\n"
" of PASV.\n"
"\n"
" See also --ftp-pasv. Added in 7.14.2.\n"
"\n"
" --ftp-ssl-ccc-mode <active/passive>\n"
-" (FTP) Sets the CCC mode. The passive mode will not initiate the\n"
+" (FTP) Sets the CCC mode. The passive mode will not initiate the\n"
" shutdown, but instead wait for the server to do it, and will not\n"
, stdout);
fputs(
@@ -1336,9 +1472,9 @@ void hugehelp(void)
" See also --ftp-ssl-ccc. Added in 7.16.2.\n"
"\n"
" --ftp-ssl-ccc\n"
-" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n"
+" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n"
" layer after authenticating. The rest of the control channel com-\n"
-" munication will be unencrypted. This allows NAT routers to fol-\n"
+" munication will be unencrypted. This allows NAT routers to fol-\n"
, stdout);
fputs(
" low the FTP transaction. The default mode is passive.\n"
@@ -1346,9 +1482,9 @@ void hugehelp(void)
" See also --ssl and --ftp-ssl-ccc-mode. Added in 7.16.1.\n"
"\n"
" --ftp-ssl-control\n"
-" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n"
-" Allows secure authentication, but non-encrypted data transfers\n"
-" for efficiency. Fails the transfer if the server doesn't sup-\n"
+" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n"
+" Allows secure authentication, but non-encrypted data transfers\n"
+" for efficiency. Fails the transfer if the server doesn't sup-\n"
" port SSL/TLS.\n"
"\n"
" Added in 7.16.0.\n"
@@ -1356,44 +1492,44 @@ void hugehelp(void)
" -G, --get\n"
, stdout);
fputs(
-" When used, this option will make all data specified with -d,\n"
-" --data, --data-binary or --data-urlencode to be used in an HTTP\n"
-" GET request instead of the POST request that otherwise would be\n"
+" When used, this option will make all data specified with -d,\n"
+" --data, --data-binary or --data-urlencode to be used in an HTTP\n"
+" GET request instead of the POST request that otherwise would be\n"
" used. The data will be appended to the URL with a '?' separator.\n"
-" If used in combination with -I, --head, the POST data will in-\n"
+" If used in combination with -I, --head, the POST data will in-\n"
" stead be appended to the URL with a HEAD request.\n"
"\n"
, stdout);
fputs(
-" If this option is used several times, only the first one is\n"
-" used. This is because undoing a GET doesn't make sense, but you\n"
+" If this option is used several times, only the first one is\n"
+" used. This is because undoing a GET doesn't make sense, but you\n"
" should then instead enforce the alternative method you prefer.\n"
"\n"
" -g, --globoff\n"
" This option switches off the \"URL globbing parser\". When you set\n"
-" this option, you can specify URLs that contain the letters {}[]\n"
-" without having them being interpreted by curl itself. Note that\n"
+" this option, you can specify URLs that contain the letters {}[]\n"
+" without having them being interpreted by curl itself. Note that\n"
, stdout);
fputs(
-" these letters are not normal legal URL contents but they should\n"
+" these letters are not normal legal URL contents but they should\n"
" be encoded according to the URI standard.\n"
"\n"
" --happy-eyeballs-timeout-ms <milliseconds>\n"
-" Happy eyeballs is an algorithm that attempts to connect to both\n"
-" IPv4 and IPv6 addresses for dual-stack hosts, preferring IPv6\n"
+" Happy eyeballs is an algorithm that attempts to connect to both\n"
+" IPv4 and IPv6 addresses for dual-stack hosts, preferring IPv6\n"
" first for the number of milliseconds. If the IPv6 address cannot\n"
, stdout);
fputs(
-" be connected to within that time then a connection attempt is\n"
+" be connected to within that time then a connection attempt is\n"
" made to the IPv4 address in parallel. The first connection to be\n"
" established is the one that is used.\n"
"\n"
-" The range of suggested useful values is limited. Happy Eyeballs\n"
-" RFC 6555 says \"It is RECOMMENDED that connection attempts be\n"
-" paced 150-250 ms apart to balance human factors against network\n"
+" The range of suggested useful values is limited. Happy Eyeballs\n"
+" RFC 6555 says \"It is RECOMMENDED that connection attempts be\n"
+" paced 150-250 ms apart to balance human factors against network\n"
, stdout);
fputs(
-" load.\" libcurl currently defaults to 200 ms. Firefox and Chrome\n"
+" load.\" libcurl currently defaults to 200 ms. Firefox and Chrome\n"
" currently default to 300 ms.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -1401,51 +1537,51 @@ void hugehelp(void)
" Added in 7.59.0.\n"
"\n"
" --haproxy-protocol\n"
-" (HTTP) Send a HAProxy PROXY protocol v1 header at the beginning\n"
-" of the connection. This is used by some load balancers and re-\n"
+" (HTTP) Send a HAProxy PROXY protocol v1 header at the beginning\n"
+" of the connection. This is used by some load balancers and re-\n"
" verse proxies to indicate the client's true IP address and port.\n"
, stdout);
fputs(
-" This option is primarily useful when sending test requests to a\n"
+" This option is primarily useful when sending test requests to a\n"
" service that expects this header.\n"
"\n"
" Added in 7.60.0.\n"
"\n"
" -I, --head\n"
" (HTTP FTP FILE) Fetch the headers only! HTTP-servers feature the\n"
-" command HEAD which this uses to get nothing but the header of a\n"
-" document. When used on an FTP or FILE file, curl displays the\n"
+" command HEAD which this uses to get nothing but the header of a\n"
+" document. When used on an FTP or FILE file, curl displays the\n"
" file size and last modification time only.\n"
"\n"
, stdout);
fputs(
" -H, --header <header/@file>\n"
-" (HTTP) Extra header to include in the request when sending HTTP\n"
-" to a server. You may specify any number of extra headers. Note\n"
+" (HTTP) Extra header to include in the request when sending HTTP\n"
+" to a server. You may specify any number of extra headers. Note\n"
" that if you should add a custom header that has the same name as\n"
-" one of the internal ones curl would use, your externally set\n"
+" one of the internal ones curl would use, your externally set\n"
" header will be used instead of the internal one. This allows you\n"
, stdout);
fputs(
-" to make even trickier stuff than curl would normally do. You\n"
-" should not replace internally set headers without knowing per-\n"
+" to make even trickier stuff than curl would normally do. You\n"
+" should not replace internally set headers without knowing per-\n"
" fectly well what you're doing. Remove an internal header by giv-\n"
-" ing a replacement without content on the right side of the\n"
+" ing a replacement without content on the right side of the\n"
" colon, as in: -H \"Host:\". If you send the custom header with no-\n"
-" value then its header must be terminated with a semicolon, such\n"
+" value then its header must be terminated with a semicolon, such\n"
, stdout);
fputs(
" as -H \"X-Custom-Header;\" to send \"X-Custom-Header:\".\n"
"\n"
-" curl will make sure that each header you add/replace is sent\n"
+" curl will make sure that each header you add/replace is sent\n"
" with the proper end-of-line marker, you should thus not add that\n"
" as a part of the header content: do not add newlines or carriage\n"
" returns, they will only mess things up for you.\n"
"\n"
-" Starting in 7.55.0, this option can take an argument in @file-\n"
+" Starting in 7.55.0, this option can take an argument in @file-\n"
, stdout);
fputs(
-" name style, which then adds a header for each line in the input\n"
+" name style, which then adds a header for each line in the input\n"
" file. Using @- will make curl read the header file from stdin.\n"
"\n"
" See also the -A, --user-agent and -e, --referer options.\n"
@@ -1459,349 +1595,359 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" WARNING: headers set with this option will be set in all re-\n"
-" quests - even after redirects are followed, like when told with\n"
-" -L, --location. This can lead to the header being sent to other\n"
-" hosts than the original host, so sensitive headers should be\n"
+" WARNING: headers set with this option will be set in all re-\n"
+" quests - even after redirects are followed, like when told with\n"
+" -L, --location. This can lead to the header being sent to other\n"
+" hosts than the original host, so sensitive headers should be\n"
" used with caution combined with following redirects.\n"
"\n"
-" This option can be used multiple times to add/replace/remove\n"
+" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
, stdout);
fputs(
-" -h, --help\n"
-" Usage help. This lists all current command line options with a\n"
-" short description.\n"
+" -h, --help <category>\n"
+" Usage help. This lists all commands of the <category>. If no\n"
+" arg was provided, curl will display the most important command\n"
+" line arguments and the list of categories. If the argument\n"
+" \"all\" was provided, curl will display all options available. If\n"
+" the argument \"category\" was provided, curl will display all cat-\n"
+" egories and their meanings.\n"
+"\n"
" --hostpubmd5 <md5>\n"
-" (SFTP SCP) Pass a string containing 32 hexadecimal digits. The\n"
-" string should be the 128 bit MD5 checksum of the remote host's\n"
+, stdout);
+ fputs(
+" (SFTP SCP) Pass a string containing 32 hexadecimal digits. The\n"
+" string should be the 128 bit MD5 checksum of the remote host's\n"
" public key, curl will refuse the connection with the host unless\n"
" the md5sums match.\n"
"\n"
" Added in 7.17.1.\n"
"\n"
" --http0.9\n"
-, stdout);
- fputs(
" (HTTP) Tells curl to be fine with HTTP version 0.9 response.\n"
"\n"
-" HTTP/0.9 is a completely headerless response and therefore you\n"
-" can also connect with this to non-HTTP servers and still get a\n"
+" HTTP/0.9 is a completely headerless response and therefore you\n"
+, stdout);
+ fputs(
+" can also connect with this to non-HTTP servers and still get a\n"
" response since curl will simply transparently downgrade - if al-\n"
" lowed.\n"
"\n"
" Since curl 7.66.0, HTTP/0.9 is disabled by default.\n"
"\n"
" -0, --http1.0\n"
-, stdout);
- fputs(
-" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
+" (HTTP) Tells curl to use HTTP version 1.0 instead of using its\n"
" internally preferred HTTP version.\n"
"\n"
" This option overrides --http1.1 and --http2.\n"
"\n"
" --http1.1\n"
+, stdout);
+ fputs(
" (HTTP) Tells curl to use HTTP version 1.1.\n"
"\n"
-" This option overrides -0, --http1.0 and --http2. Added in\n"
+" This option overrides -0, --http1.0 and --http2. Added in\n"
" 7.33.0.\n"
"\n"
" --http2-prior-knowledge\n"
-" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
+" (HTTP) Tells curl to issue its non-TLS HTTP requests using\n"
+" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
+" that the server supports HTTP/2 straight away. HTTPS requests\n"
, stdout);
fputs(
-" HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge\n"
-" that the server supports HTTP/2 straight away. HTTPS requests\n"
-" will still do HTTP/2 the standard way with negotiated protocol\n"
+" will still do HTTP/2 the standard way with negotiated protocol\n"
" version in the TLS handshake.\n"
"\n"
" --http2-prior-knowledge requires that the underlying libcurl was\n"
" built to support HTTP/2. This option overrides --http1.1 and -0,\n"
" --http1.0 and --http2. Added in 7.49.0.\n"
"\n"
-, stdout);
- fputs(
" --http2\n"
" (HTTP) Tells curl to use HTTP version 2.\n"
"\n"
" See also --http1.1 and --http3. --http2 requires that the under-\n"
+, stdout);
+ fputs(
" lying libcurl was built to support HTTP/2. This option overrides\n"
-" --http1.1 and -0, --http1.0 and --http2-prior-knowledge. Added\n"
+" --http1.1 and -0, --http1.0 and --http2-prior-knowledge. Added\n"
" in 7.33.0.\n"
"\n"
" --http3\n"
-" (HTTP) WARNING: this option is experiemental. Do not use in pro-\n"
+" (HTTP) WARNING: this option is experimental. Do not use in pro-\n"
" duction.\n"
"\n"
+" Tells curl to use HTTP version 3 directly to the host and port\n"
+" number used in the URL. A normal HTTP/3 transaction will be done\n"
, stdout);
fputs(
-" Tells curl to use HTTP version 3 directly to the host and port\n"
-" number used in the URL. A normal HTTP/3 transaction will be done\n"
-" to a host and then get redirected via Alt-SVc, but this option\n"
-" allows a user to circumvent that when you know that the target\n"
+" to a host and then get redirected via Alt-SVc, but this option\n"
+" allows a user to circumvent that when you know that the target\n"
" speaks HTTP/3 on the given host and port.\n"
"\n"
-" This option will make curl fail if a QUIC connection cannot be\n"
-, stdout);
- fputs(
-" established, it cannot fall back to a lower HTTP version on its\n"
+" This option will make curl fail if a QUIC connection cannot be\n"
+" established, it cannot fall back to a lower HTTP version on its\n"
" own.\n"
"\n"
" See also --http1.1 and --http2. --http3 requires that the under-\n"
+, stdout);
+ fputs(
" lying libcurl was built to support HTTP/3. This option overrides\n"
" --http1.1 and -0, --http1.0 and --http2 and --http2-prior-knowl-\n"
" edge. Added in 7.66.0.\n"
"\n"
" --ignore-content-length\n"
-" (FTP HTTP) For HTTP, Ignore the Content-Length header. This is\n"
-, stdout);
- fputs(
-" particularly useful for servers running Apache 1.x, which will\n"
-" report incorrect Content-Length for files larger than 2 giga-\n"
+" (FTP HTTP) For HTTP, Ignore the Content-Length header. This is\n"
+" particularly useful for servers running Apache 1.x, which will\n"
+" report incorrect Content-Length for files larger than 2 giga-\n"
" bytes.\n"
"\n"
-" For FTP (since 7.46.0), skip the RETR command to figure out the\n"
+, stdout);
+ fputs(
+" For FTP (since 7.46.0), skip the RETR command to figure out the\n"
" size before downloading a file.\n"
"\n"
" -i, --include\n"
-" Include the HTTP response headers in the output. The HTTP re-\n"
-" sponse headers can include things like server name, cookies,\n"
-, stdout);
- fputs(
+" Include the HTTP response headers in the output. The HTTP re-\n"
+" sponse headers can include things like server name, cookies,\n"
" date of the document, HTTP version and more...\n"
"\n"
" To view the request headers, consider the -v, --verbose option.\n"
"\n"
" See also -v, --verbose.\n"
"\n"
+, stdout);
+ fputs(
" -k, --insecure\n"
" (TLS) By default, every SSL connection curl makes is verified to\n"
-" be secure. This option allows curl to proceed and operate even\n"
+" be secure. This option allows curl to proceed and operate even\n"
" for server connections otherwise considered insecure.\n"
"\n"
-, stdout);
- fputs(
-" The server connection is verified by making sure the server's\n"
-" certificate contains the right name and verifies successfully\n"
+" The server connection is verified by making sure the server's\n"
+" certificate contains the right name and verifies successfully\n"
" using the cert store.\n"
"\n"
+, stdout);
+ fputs(
" See this online resource for further details:\n"
" https://curl.haxx.se/docs/sslcerts.html\n"
" See also --proxy-insecure and --cacert.\n"
"\n"
" --interface <name>\n"
"\n"
-" Perform an operation using a specified interface. You can enter\n"
-, stdout);
- fputs(
-" interface name, IP address or host name. An example could look\n"
+" Perform an operation using a specified interface. You can enter\n"
+" interface name, IP address or host name. An example could look\n"
" like:\n"
"\n"
" curl --interface eth0:1 https://www.example.com/\n"
"\n"
-" If this option is used several times, the last one will be used.\n"
-" On Linux it can be used to specify a VRF, but the binary needs\n"
-" to either have CAP_NET_RAW or to be run as root. More informa-\n"
-" tion about Linux VRF: https://www.kernel.org/doc/Documenta-\n"
, stdout);
fputs(
+" If this option is used several times, the last one will be used.\n"
+" On Linux it can be used to specify a VRF, but the binary needs\n"
+" to either have CAP_NET_RAW or to be run as root. More informa-\n"
+" tion about Linux VRF: https://www.kernel.org/doc/Documenta-\n"
" tion/networking/vrf.txt\n"
"\n"
" See also --dns-interface.\n"
"\n"
" -4, --ipv4\n"
-" This option tells curl to resolve names to IPv4 addresses only,\n"
+" This option tells curl to resolve names to IPv4 addresses only,\n"
+, stdout);
+ fputs(
" and not for example try IPv6.\n"
"\n"
-" See also --http1.1 and --http2. This option overrides -6,\n"
+" See also --http1.1 and --http2. This option overrides -6,\n"
" --ipv6.\n"
"\n"
" -6, --ipv6\n"
-" This option tells curl to resolve names to IPv6 addresses only,\n"
+" This option tells curl to resolve names to IPv6 addresses only,\n"
" and not for example try IPv4.\n"
"\n"
-, stdout);
- fputs(
-" See also --http1.1 and --http2. This option overrides -4,\n"
+" See also --http1.1 and --http2. This option overrides -4,\n"
" --ipv4.\n"
"\n"
" -j, --junk-session-cookies\n"
+, stdout);
+ fputs(
" (HTTP) When curl is told to read cookies from a given file, this\n"
" option will make it discard all \"session cookies\". This will ba-\n"
-" sically have the same effect as if a new session is started.\n"
-" Typical browsers always discard session cookies when they're\n"
+" sically have the same effect as if a new session is started.\n"
+" Typical browsers always discard session cookies when they're\n"
" closed down.\n"
"\n"
-, stdout);
- fputs(
" See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
" --keepalive-time <seconds>\n"
-" This option sets the time a connection needs to remain idle be-\n"
-" fore sending keepalive probes and the time between individual\n"
-" keepalive probes. It is currently effective on operating systems\n"
-" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
-" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
, stdout);
fputs(
+" This option sets the time a connection needs to remain idle be-\n"
+" fore sending keepalive probes and the time between individual\n"
+" keepalive probes. It is currently effective on operating systems\n"
+" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n"
+" (meaning Linux, recent AIX, HP-UX and more). This option has no\n"
" effect if --no-keepalive is used.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
" If unspecified, the option defaults to 60 seconds.\n"
"\n"
" Added in 7.18.0.\n"
"\n"
" --key-type <type>\n"
-" (TLS) Private key file type. Specify which type your --key pro-\n"
-" vided private key is. DER, PEM, and ENG are supported. If not\n"
+" (TLS) Private key file type. Specify which type your --key pro-\n"
+" vided private key is. DER, PEM, and ENG are supported. If not\n"
" specified, PEM is assumed.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" --key <key>\n"
" (TLS SSH) Private key file name. Allows you to provide your pri-\n"
-" vate key in this separate file. For SSH, if not specified, curl\n"
-" tries the following candidates in order: '~/.ssh/id_rsa',\n"
+" vate key in this separate file. For SSH, if not specified, curl\n"
+" tries the following candidates in order: '~/.ssh/id_rsa',\n"
" '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n"
"\n"
-" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" If curl is built against OpenSSL library, and the engine pkcs11\n"
+" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
, stdout);
fputs(
-" is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
-" ify a private key located in a PKCS#11 device. A string begin-\n"
-" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
+" ify a private key located in a PKCS#11 device. A string begin-\n"
+" ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI. If a\n"
" PKCS#11 URI is provided, then the --engine option will be set as\n"
-" \"pkcs11\" if none was provided and the --key-type option will be\n"
+" \"pkcs11\" if none was provided and the --key-type option will be\n"
" set as \"ENG\" if none was provided.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --krb <level>\n"
-" (FTP) Enable Kerberos authentication and use. The level must be\n"
+, stdout);
+ fputs(
+" (FTP) Enable Kerberos authentication and use. The level must be\n"
" entered and should be one of 'clear', 'safe', 'confidential', or\n"
-" 'private'. Should you use a level that is not one of these,\n"
+" 'private'. Should you use a level that is not one of these,\n"
" 'private' will instead be used.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
-, stdout);
- fputs(
-" --krb requires that the underlying libcurl was built to support\n"
+" --krb requires that the underlying libcurl was built to support\n"
" Kerberos.\n"
"\n"
" --libcurl <file>\n"
-" Append this option to any ordinary curl command line, and you\n"
-" will get a libcurl-using C source code written to the file that\n"
+, stdout);
+ fputs(
+" Append this option to any ordinary curl command line, and you\n"
+" will get a libcurl-using C source code written to the file that\n"
" does the equivalent of what your command-line operation does!\n"
"\n"
-" If this option is used several times, the last given file name\n"
+" If this option is used several times, the last given file name\n"
" will be used.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.16.1.\n"
"\n"
" --limit-rate <speed>\n"
-" Specify the maximum transfer rate you want curl to use - for\n"
+" Specify the maximum transfer rate you want curl to use - for\n"
+, stdout);
+ fputs(
" both downloads and uploads. This feature is useful if you have a\n"
" limited pipe and you'd like your transfer not to use your entire\n"
" bandwidth. To make it slower than it otherwise would be.\n"
"\n"
-" The given speed is measured in bytes/second, unless a suffix is\n"
+" The given speed is measured in bytes/second, unless a suffix is\n"
+" appended. Appending 'k' or 'K' will count the number as kilo-\n"
+" bytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
, stdout);
fputs(
-" appended. Appending 'k' or 'K' will count the number as kilo-\n"
-" bytes, 'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
" gigabytes. Examples: 200K, 3m and 1G.\n"
"\n"
-" If you also use the -Y, --speed-limit option, that option will\n"
+" If you also use the -Y, --speed-limit option, that option will\n"
" take precedence and might cripple the rate-limiting slightly, to\n"
" help keeping the speed-limit logic working.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -l, --list-only\n"
-" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
-" forces a name-only view. This is especially useful if the user\n"
-" wants to machine-parse the contents of an FTP directory since\n"
-" the normal directory view doesn't use a standard look or format.\n"
-" When used like this, the option causes a NLST command to be sent\n"
+" (FTP POP3) (FTP) When listing an FTP directory, this switch\n"
, stdout);
fputs(
+" forces a name-only view. This is especially useful if the user\n"
+" wants to machine-parse the contents of an FTP directory since\n"
+" the normal directory view doesn't use a standard look or format.\n"
+" When used like this, the option causes a NLST command to be sent\n"
" to the server instead of LIST.\n"
"\n"
-" Note: Some FTP servers list only files in their response to\n"
-" NLST; they do not include sub-directories and symbolic links.\n"
-"\n"
-" (POP3) When retrieving a specific email from POP3, this switch\n"
-" forces a LIST command to be performed instead of RETR. This is\n"
-" particularly useful if the user wants to see if a specific mes-\n"
+" Note: Some FTP servers list only files in their response to\n"
, stdout);
fputs(
+" NLST; they do not include sub-directories and symbolic links.\n"
+"\n"
+" (POP3) When retrieving a specific email from POP3, this switch\n"
+" forces a LIST command to be performed instead of RETR. This is\n"
+" particularly useful if the user wants to see if a specific mes-\n"
" sage id exists on the server and what size it is.\n"
"\n"
-" Note: When combined with -X, --request, this option can be used\n"
+" Note: When combined with -X, --request, this option can be used\n"
+, stdout);
+ fputs(
" to send an UIDL command instead, so the user may use the email's\n"
-" unique identifier rather than it's message id to make the re-\n"
+" unique identifier rather than it's message id to make the re-\n"
" quest.\n"
"\n"
-" Added in 7.21.5.\n"
+" Added in 4.0.\n"
"\n"
" --local-port <num/range>\n"
-" Set a preferred single number or range (FROM-TO) of local port\n"
+" Set a preferred single number or range (FROM-TO) of local port\n"
+" numbers to use for the connection(s). Note that port numbers by\n"
+" nature are a scarce resource that will be busy at times so set-\n"
, stdout);
fputs(
-" numbers to use for the connection(s). Note that port numbers by\n"
-" nature are a scarce resource that will be busy at times so set-\n"
-" ting this range to something too narrow might cause unnecessary\n"
+" ting this range to something too narrow might cause unnecessary\n"
" connection setup failures.\n"
"\n"
" Added in 7.15.2.\n"
"\n"
" --location-trusted\n"
-" (HTTP) Like -L, --location, but will allow sending the name +\n"
+" (HTTP) Like -L, --location, but will allow sending the name +\n"
" password to all hosts that the site may redirect to. This may or\n"
+" may not introduce a security breach if the site redirects you to\n"
+" a site to which you'll send your authentication info (which is\n"
, stdout);
fputs(
-" may not introduce a security breach if the site redirects you to\n"
-" a site to which you'll send your authentication info (which is\n"
" plaintext in the case of HTTP Basic authentication).\n"
"\n"
" See also -u, --user.\n"
"\n"
" -L, --location\n"
-" (HTTP) If the server reports that the requested page has moved\n"
+" (HTTP) If the server reports that the requested page has moved\n"
" to a different location (indicated with a Location: header and a\n"
+" 3XX response code), this option will make curl redo the request\n"
+" on the new place. If used together with -i, --include or -I,\n"
, stdout);
fputs(
-" 3XX response code), this option will make curl redo the request\n"
-" on the new place. If used together with -i, --include or -I,\n"
" --head, headers from all requested pages will be shown. When au-\n"
-" thentication is used, curl only sends its credentials to the\n"
-" initial host. If a redirect takes curl to a different host, it\n"
-" won't be able to intercept the user+password. See also --loca-\n"
+" thentication is used, curl only sends its credentials to the\n"
+" initial host. If a redirect takes curl to a different host, it\n"
+" won't be able to intercept the user+password. See also --loca-\n"
+" tion-trusted on how to change this. You can limit the amount of\n"
+" redirects to follow by using the --max-redirs option.\n"
+"\n"
, stdout);
fputs(
-" tion-trusted on how to change this. You can limit the amount of\n"
-" redirects to follow by using the --max-redirs option.\n"
+" When curl follows a redirect and if the request is a POST, it\n"
+" will do the following request with a GET if the HTTP response\n"
+" was 301, 302, or 303. If the response code was any other 3xx\n"
+" code, curl will re-send the following request using the same un-\n"
+" modified method.\n"
"\n"
-" When curl follows a redirect and the request is not a plain GET\n"
-" (for example POST or PUT), it will do the following request with\n"
-" a GET if the HTTP response was 301, 302, or 303. If the response\n"
-" code was any other 3xx code, curl will re-send the following re-\n"
+" You can tell curl to not change POST requests to GET after a 30x\n"
, stdout);
fputs(
-" quest using the same unmodified method.\n"
+" response by using the dedicated options for that: --post301,\n"
+" --post302 and --post303.\n"
"\n"
-" You can tell curl to not change the non-GET request method to\n"
-" GET after a 30x response by using the dedicated options for\n"
-" that: --post301, --post302 and --post303.\n"
+" The method set with -X, --request overrides the method curl\n"
+" would otherwise select to use.\n"
"\n"
" --login-options <options>\n"
" (IMAP POP3 SMTP) Specify the login options to use during server\n"
@@ -1836,20 +1982,37 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
+" --mail-rcpt-allowfails\n"
+" (SMTP) When sending data to multiple recipients, by default curl\n"
+" will abort SMTP conversation if at least one of the recipients\n"
+" causes RCPT TO command to return an error.\n"
+"\n"
+" The default behavior can be changed by passing --mail-rcpt-al-\n"
+" lowfails command-line option which will make curl ignore errors\n"
+" and proceed with the remaining valid recipients.\n"
+"\n"
+, stdout);
+ fputs(
+" In case when all recipients cause RCPT TO command to fail, curl\n"
+" will abort SMTP conversation and return the error received from\n"
+" to the last RCPT TO command. Added in 7.69.0.\n"
+"\n"
" --mail-rcpt <address>\n"
" (SMTP) Specify a single address, user name or mailing list name.\n"
" Repeat this option several times to send to multiple recipients.\n"
" When performing a mail transfer, the recipient should specify a\n"
+, stdout);
+ fputs(
" valid email address to send the mail to.\n"
"\n"
" When performing an address verification (VRFY command), the re-\n"
" cipient should be specified as the user name or user name and\n"
-, stdout);
- fputs(
" domain (as per Section 3.5 of RFC5321). (Added in 7.34.0)\n"
"\n"
" When performing a mailing list expand (EXPN command), the recip-\n"
" ient should be specified using the mailing list name, such as\n"
+, stdout);
+ fputs(
" \"Friends\" or \"London-Office\". (Added in 7.34.0)\n"
"\n"
" Added in 7.20.0.\n"
@@ -1858,21 +2021,21 @@ void hugehelp(void)
" Manual. Display the huge help text.\n"
"\n"
" --max-filesize <bytes>\n"
-, stdout);
- fputs(
" Specify the maximum size (in bytes) of a file to download. If\n"
" the file requested is larger than this value, the transfer will\n"
" not start and curl will return with exit code 63.\n"
"\n"
+, stdout);
+ fputs(
" A size modifier may be used. For example, Appending 'k' or 'K'\n"
" will count the number as kilobytes, 'm' or 'M' makes it\n"
" megabytes, while 'g' or 'G' makes it gigabytes. Examples: 200K,\n"
-, stdout);
- fputs(
" 3m and 1G. (Added in 7.58.0)\n"
"\n"
" NOTE: The file size is not always known prior to download, and\n"
" for such files this option has no effect even if the file trans-\n"
+, stdout);
+ fputs(
" fer ends up being larger than this given limit. This concerns\n"
" both FTP and HTTP transfers.\n"
"\n"
@@ -1880,21 +2043,21 @@ void hugehelp(void)
"\n"
" --max-redirs <num>\n"
" (HTTP) Set maximum number of redirection-followings allowed.\n"
-, stdout);
- fputs(
" When -L, --location is used, is used to prevent curl from fol-\n"
" lowing redirections too much. By default, the limit is set to 50\n"
" redirections. Set this option to -1 to make it unlimited.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" -m, --max-time <seconds>\n"
" Maximum time in seconds that you allow the whole operation to\n"
-, stdout);
- fputs(
" take. This is useful for preventing your batch jobs from hang-\n"
" ing for hours due to slow networks or links going down. Since\n"
" 7.32.0, this option accepts decimal values, but the actual time-\n"
+, stdout);
+ fputs(
" out will decrease in accuracy as the specified timeout increases\n"
" in decimal precision.\n"
"\n"
@@ -1903,70 +2066,70 @@ void hugehelp(void)
" See also --connect-timeout.\n"
"\n"
" --metalink\n"
-, stdout);
- fputs(
" This option can tell curl to parse and process a given URI as\n"
" Metalink file (both version 3 and 4 (RFC 5854) are supported)\n"
" and make use of the mirrors listed within for failover if there\n"
+, stdout);
+ fputs(
" are errors (such as the file or server not being available). It\n"
" will also verify the hash of the file after the download com-\n"
" pletes. The Metalink file itself is downloaded and processed in\n"
-, stdout);
- fputs(
" memory and not stored in the local file system.\n"
"\n"
" Example to use a remote Metalink file:\n"
"\n"
" curl --metalink http://www.example.com/example.metalink\n"
"\n"
+, stdout);
+ fputs(
" To use a Metalink file in the local file system, use FILE proto-\n"
" col (file://):\n"
"\n"
" curl --metalink file://example.metalink\n"
"\n"
" Please note that if FILE protocol is disabled, there is no way\n"
-, stdout);
- fputs(
" to use a local Metalink file at the time of this writing. Also\n"
" note that if --metalink and -i, --include are used together,\n"
" --include will be ignored. This is because including headers in\n"
+, stdout);
+ fputs(
" the response will break Metalink parser and if the headers are\n"
" included in the file described in Metalink file, hash check will\n"
" fail.\n"
"\n"
" --metalink requires that the underlying libcurl was built to\n"
-, stdout);
- fputs(
" support metalink. Added in 7.27.0.\n"
"\n"
" --negotiate\n"
" (HTTP) Enables Negotiate (SPNEGO) authentication.\n"
"\n"
" This option requires a library built with GSS-API or SSPI sup-\n"
+, stdout);
+ fputs(
" port. Use -V, --version to see if your curl supports GSS-\n"
" API/SSPI or SPNEGO.\n"
"\n"
" When using this option, you must also provide a fake -u, --user\n"
" option to activate the authentication code properly. Sending a\n"
-, stdout);
- fputs(
" '-u :' is enough as the user name and password from the -u,\n"
" --user option aren't actually used.\n"
"\n"
" If this option is used several times, only the first one is\n"
+, stdout);
+ fputs(
" used.\n"
"\n"
-" See also --basic and --ntlm and --anyauth and --proxy-negotiate.\n"
+" See also --basic, --ntlm, --anyauth and --proxy-negotiate.\n"
"\n"
" --netrc-file <filename>\n"
" This option is similar to -n, --netrc, except that you provide\n"
" the path (absolute or relative) to the netrc file that curl\n"
-, stdout);
- fputs(
" should use. You can only specify one netrc file per invocation.\n"
" If several --netrc-file options are provided, the last one will\n"
" be used.\n"
"\n"
+, stdout);
+ fputs(
" It will abide by --netrc-optional if specified.\n"
"\n"
" This option overrides -n, --netrc. Added in 7.21.5.\n"
@@ -1975,22 +2138,22 @@ void hugehelp(void)
" Very similar to -n, --netrc, but this option makes the .netrc\n"
" usage optional and not mandatory as the -n, --netrc option does.\n"
"\n"
-, stdout);
- fputs(
" See also --netrc-file. This option overrides -n, --netrc.\n"
"\n"
" -n, --netrc\n"
" Makes curl scan the .netrc (_netrc on Windows) file in the\n"
+, stdout);
+ fputs(
" user's home directory for login name and password. This is typi-\n"
" cally used for FTP on Unix. If used with HTTP, curl will enable\n"
" user authentication. See netrc(5) ftp(1) for details on the file\n"
" format. Curl will not complain if that file doesn't have the\n"
-, stdout);
- fputs(
" right permissions (it should not be either world- or group-read-\n"
" able). The environment variable \"HOME\" is used to find the home\n"
" directory.\n"
"\n"
+, stdout);
+ fputs(
" A quick and very simple example of how to setup a .netrc to al-\n"
" low curl to FTP to the machine host.domain.com with user name\n"
" 'myself' and password 'secret' should look similar to:\n"
@@ -1998,20 +2161,20 @@ void hugehelp(void)
" machine host.domain.com login myself password secret\n"
"\n"
" -:, --next\n"
-, stdout);
- fputs(
" Tells curl to use a separate operation for the following URL and\n"
" associated options. This allows you to send several URL re-\n"
+, stdout);
+ fputs(
" quests, each with their own specific options, for example, such\n"
" as different user names or custom requests for each.\n"
"\n"
" -:, --next will reset all local options and only global ones\n"
" will have their values survive over to the operation following\n"
-, stdout);
- fputs(
" the -:, --next instruction. Global options include -v, --ver-\n"
" bose, --trace, --trace-ascii and --fail-early.\n"
"\n"
+, stdout);
+ fputs(
" For example, you can do both a GET and a POST in a single com-\n"
" mand line:\n"
"\n"
@@ -2021,10 +2184,10 @@ void hugehelp(void)
"\n"
" --no-alpn\n"
" (HTTPS) Disable the ALPN TLS extension. ALPN is enabled by de-\n"
-, stdout);
- fputs(
" fault if libcurl was built with an SSL library that supports\n"
" ALPN. ALPN is used by a libcurl that supports HTTP/2 to negoti-\n"
+, stdout);
+ fputs(
" ate HTTP/2 support with the server during https sessions.\n"
"\n"
" See also --no-npn and --http2. --no-alpn requires that the un-\n"
@@ -2032,10 +2195,10 @@ void hugehelp(void)
"\n"
" -N, --no-buffer\n"
" Disables the buffering of the output stream. In normal work sit-\n"
-, stdout);
- fputs(
" uations, curl will use a standard buffered output stream that\n"
" will have the effect that it will output the data in chunks, not\n"
+, stdout);
+ fputs(
" necessarily exactly when the data arrives. Using this option\n"
" will disable that buffering.\n"
"\n"
@@ -2043,66 +2206,66 @@ void hugehelp(void)
" thus use --buffer to enforce the buffering.\n"
"\n"
" --no-keepalive\n"
-, stdout);
- fputs(
" Disables the use of keepalive messages on the TCP connection.\n"
" curl otherwise enables them by default.\n"
"\n"
" Note that this is the negated option name documented. You can\n"
+, stdout);
+ fputs(
" thus use --keepalive to enforce keepalive.\n"
"\n"
" --no-npn\n"
" (HTTPS) Disable the NPN TLS extension. NPN is enabled by default\n"
" if libcurl was built with an SSL library that supports NPN. NPN\n"
-, stdout);
- fputs(
" is used by a libcurl that supports HTTP/2 to negotiate HTTP/2\n"
" support with the server during https sessions.\n"
"\n"
" See also --no-alpn and --http2. --no-npn requires that the un-\n"
+, stdout);
+ fputs(
" derlying libcurl was built to support TLS. Added in 7.36.0.\n"
"\n"
" --no-progress-meter\n"
" Option to switch off the progress meter output without muting or\n"
" otherwise affecting warning and informational messages like -s,\n"
-, stdout);
- fputs(
" --silent does.\n"
"\n"
" Note that this is the negated option name documented. You can\n"
" thus use --progress-meter to enable the progress meter again.\n"
"\n"
+, stdout);
+ fputs(
" See also -v, --verbose and -s, --silent. Added in 7.67.0.\n"
"\n"
" --no-sessionid\n"
" (TLS) Disable curl's use of SSL session-ID caching. By default\n"
" all transfers are done using the cache. Note that while nothing\n"
-, stdout);
- fputs(
" should ever get hurt by attempting to reuse SSL session-IDs,\n"
" there seem to be broken SSL implementations in the wild that may\n"
" require you to disable this in order for you to succeed.\n"
"\n"
+, stdout);
+ fputs(
" Note that this is the negated option name documented. You can\n"
" thus use --sessionid to enforce session-ID caching.\n"
"\n"
" Added in 7.16.0.\n"
"\n"
" --noproxy <no-proxy-list>\n"
-, stdout);
- fputs(
" Comma-separated list of hosts which do not use a proxy, if one\n"
" is specified. The only wildcard is a single * character, which\n"
" matches all hosts, and effectively disables the proxy. Each name\n"
+, stdout);
+ fputs(
" in this list is matched as either a domain which contains the\n"
" hostname, or the hostname itself. For example, local.com would\n"
" match local.com, local.com:80, and www.local.com, but not\n"
-, stdout);
- fputs(
" www.notlocal.com.\n"
"\n"
" Since 7.53.0, This option overrides the environment variables\n"
" that disable the proxy. If there's an environment variable dis-\n"
+, stdout);
+ fputs(
" abling a proxy, you can set noproxy list to \"\" to override it.\n"
"\n"
" Added in 7.19.4.\n"
@@ -2110,22 +2273,22 @@ void hugehelp(void)
" --ntlm-wb\n"
" (HTTP) Enables NTLM much in the style --ntlm does, but hand over\n"
" the authentication to the separate binary ntlmauth application\n"
-, stdout);
- fputs(
" that is executed when needed.\n"
"\n"
" See also --ntlm and --proxy-ntlm.\n"
"\n"
" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n"
+, stdout);
+ fputs(
" method was designed by Microsoft and is used by IIS web servers.\n"
" It is a proprietary protocol, reverse-engineered by clever peo-\n"
" ple and implemented in curl based on their efforts. This kind of\n"
" behavior should not be endorsed, you should encourage everyone\n"
-, stdout);
- fputs(
" who uses NTLM to switch to a public and documented authentica-\n"
" tion method instead, such as Digest.\n"
"\n"
+, stdout);
+ fputs(
" If you want to enable NTLM for your proxy authentication, then\n"
" use --proxy-ntlm.\n"
"\n"
@@ -2133,44 +2296,64 @@ void hugehelp(void)
" used.\n"
"\n"
" See also --proxy-ntlm. --ntlm requires that the underlying\n"
-, stdout);
- fputs(
" libcurl was built to support TLS. This option overrides --basic\n"
" and --negotiate and --digest and --anyauth.\n"
"\n"
" --oauth2-bearer <token>\n"
-" (IMAP POP3 SMTP) Specify the Bearer Token for OAUTH 2.0 server\n"
-" authentication. The Bearer Token is used in conjunction with the\n"
-" user name which can be specified as part of the --url or -u,\n"
-" --user options.\n"
-"\n"
, stdout);
fputs(
+" (IMAP POP3 SMTP HTTP) Specify the Bearer Token for OAUTH 2.0\n"
+" server authentication. The Bearer Token is used in conjunction\n"
+" with the user name which can be specified as part of the --url\n"
+" or -u, --user options.\n"
+"\n"
" The Bearer Token and user name are formatted according to RFC\n"
" 6750.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
+" --output-dir <dir>\n"
+"\n"
+, stdout);
+ fputs(
+" This option specifies the directory in which files should be\n"
+" stored, when -O, --remote-name or -o, --output are used.\n"
+"\n"
+" The given output directory is used for all URLs and output op-\n"
+" tions on the command line, up until the first -:, --next.\n"
+"\n"
+" If the specified target directory doesn't exist, the operation\n"
+" will fail unless --create-dirs is also used.\n"
+"\n"
+, stdout);
+ fputs(
+" If this option is used multiple times, the last specified direc-\n"
+" tory will be used.\n"
+"\n"
+" See also -O, --remote-name and -J, --remote-header-name. Added\n"
+" in 7.73.0.\n"
+"\n"
" -o, --output <file>\n"
" Write output to <file> instead of stdout. If you are using {} or\n"
-" [] to fetch multiple documents, you can use '#' followed by a\n"
-" number in the <file> specifier. That variable will be replaced\n"
+" [] to fetch multiple documents, you should quote the URL and you\n"
+" can use '#' followed by a number in the <file> specifier. That\n"
, stdout);
fputs(
-" with the current string for the URL being fetched. Like in:\n"
+" variable will be replaced with the current string for the URL\n"
+" being fetched. Like in:\n"
"\n"
-" curl http://{one,two}.example.com -o \"file_#1.txt\"\n"
+" curl \"http://{one,two}.example.com\" -o \"file_#1.txt\"\n"
"\n"
" or use several variables like:\n"
"\n"
-" curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
+" curl \"http://{site,host}.host[1-5].com\" -o \"#1_#2\"\n"
"\n"
" You may use this option as many times as the number of URLs you\n"
" have. For example, if you specify two URLs on the same command\n"
-" line, you can use it like this:\n"
-"\n"
, stdout);
fputs(
+" line, you can use it like this:\n"
+"\n"
" curl -o aa example.com -o bb example.net\n"
"\n"
" and the order of the -o options and the URLs doesn't matter,\n"
@@ -2180,27 +2363,37 @@ void hugehelp(void)
" curl example.com example.net -o aa -o bb\n"
"\n"
" See also the --create-dirs option to create the local directo-\n"
-" ries dynamically. Specifying the output as '-' (a single dash)\n"
, stdout);
fputs(
+" ries dynamically. Specifying the output as '-' (a single dash)\n"
" will force the output to be done to stdout.\n"
"\n"
-" See also -O, --remote-name and --remote-name-all and -J, --re-\n"
-" mote-header-name.\n"
+" See also -O, --remote-name, --remote-name-all and -J, --remote-\n"
+" header-name.\n"
+"\n"
+" --parallel-immediate\n"
+" When doing parallel transfers, this option will instruct curl\n"
+" that it should rather prefer opening up more connections in par-\n"
+, stdout);
+ fputs(
+" allel at once rather than waiting to see if new transfers can be\n"
+" added as multiplexed streams on another connection.\n"
+"\n"
+" See also -Z, --parallel and --parallel-max. Added in 7.68.0.\n"
"\n"
" --parallel-max\n"
-" When asked to do parallel transfers, using -Z, --parallel, this\n"
+" When asked to do parallel transfers, using -Z, --parallel, this\n"
" option controls the maximum amount of transfers to do simultane-\n"
" ously.\n"
"\n"
" The default is 50.\n"
"\n"
+, stdout);
+ fputs(
" See also -Z, --parallel. Added in 7.66.0.\n"
"\n"
" -Z, --parallel\n"
-, stdout);
- fputs(
-" Makes curl perform its transfers in parallel as compared to the\n"
+" Makes curl perform its transfers in parallel as compared to the\n"
" regular serial manner.\n"
"\n"
" Added in 7.66.0.\n"
@@ -2211,34 +2404,34 @@ void hugehelp(void)
" If this option is used several times, the last one will be used.\n"
"\n"
" --path-as-is\n"
-" Tell curl to not handle sequences of /../ or /./ in the given\n"
-" URL path. Normally curl will squash or merge them according to\n"
+" Tell curl to not handle sequences of /../ or /./ in the given\n"
, stdout);
fputs(
+" URL path. Normally curl will squash or merge them according to\n"
" standards but with this option set you tell it not to do that.\n"
"\n"
" Added in 7.42.0.\n"
"\n"
" --pinnedpubkey <hashes>\n"
-" (TLS) Tells curl to use the specified public key file (or\n"
-" hashes) to verify the peer. This can be a path to a file which\n"
+" (TLS) Tells curl to use the specified public key file (or\n"
+" hashes) to verify the peer. This can be a path to a file which\n"
" contains a single public key in PEM or DER format, or any number\n"
+, stdout);
+ fputs(
" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
" rated by ';'\n"
"\n"
-, stdout);
- fputs(
-" When negotiating a TLS or SSL connection, the server sends a\n"
-" certificate indicating its identity. A public key is extracted\n"
-" from this certificate and if it does not exactly match the pub-\n"
-" lic key provided to this option, curl will abort the connection\n"
+" When negotiating a TLS or SSL connection, the server sends a\n"
+" certificate indicating its identity. A public key is extracted\n"
+" from this certificate and if it does not exactly match the pub-\n"
+" lic key provided to this option, curl will abort the connection\n"
" before sending or receiving any data.\n"
"\n"
+, stdout);
+ fputs(
" PEM/DER support:\n"
" 7.39.0: OpenSSL, GnuTLS and GSKit\n"
" 7.43.0: NSS and wolfSSL\n"
-, stdout);
- fputs(
" 7.47.0: mbedtls sha256 support:\n"
" 7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL\n"
" 7.47.0: mbedtls Other SSL backends not supported.\n"
@@ -2247,66 +2440,66 @@ void hugehelp(void)
"\n"
" --post301\n"
" (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"
-" requests into GET requests when following a 301 redirection. The\n"
, stdout);
fputs(
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
-" rection. This option is meaningful only when using -L, --loca-\n"
+" requests into GET requests when following a 301 redirection. The\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
" tion.\n"
"\n"
-" See also --post302 and --post303 and -L, --location. Added in\n"
+" See also --post302, --post303 and -L, --location. Added in\n"
+, stdout);
+ fputs(
" 7.17.1.\n"
"\n"
" --post302\n"
-, stdout);
- fputs(
" (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
" requests into GET requests when following a 302 redirection. The\n"
-" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
-" the conversion by default to maintain consistency. However, a\n"
-" server may require a POST to remain a POST after such a redi-\n"
-" rection. This option is meaningful only when using -L, --loca-\n"
-" tion.\n"
-"\n"
+" non-RFC behaviour is ubiquitous in web browsers, so curl does\n"
+" the conversion by default to maintain consistency. However, a\n"
+" server may require a POST to remain a POST after such a redi-\n"
, stdout);
fputs(
-" See also --post301 and --post303 and -L, --location. Added in\n"
+" rection. This option is meaningful only when using -L, --loca-\n"
+" tion.\n"
+"\n"
+" See also --post301, --post303 and -L, --location. Added in\n"
" 7.19.1.\n"
"\n"
" --post303\n"
" (HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST\n"
-" requests into GET requests when following 303 redirections. A\n"
+" requests into GET requests when following 303 redirections. A\n"
" server may require a POST to remain a POST after a 303 redirect-\n"
-" ion. This option is meaningful only when using -L, --location.\n"
-"\n"
, stdout);
fputs(
-" See also --post302 and --post301 and -L, --location. Added in\n"
+" ion. This option is meaningful only when using -L, --location.\n"
+"\n"
+" See also --post302, --post301 and -L, --location. Added in\n"
" 7.26.0.\n"
"\n"
" --preproxy [protocol://]host[:port]\n"
-" Use the specified SOCKS proxy before connecting to an HTTP or\n"
-" HTTPS -x, --proxy. In such a case curl first connects to the\n"
-" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
-" HTTPS proxy. Hence pre proxy.\n"
-"\n"
+" Use the specified SOCKS proxy before connecting to an HTTP or\n"
+" HTTPS -x, --proxy. In such a case curl first connects to the\n"
+" SOCKS proxy and then connects (through SOCKS) to the HTTP or\n"
, stdout);
fputs(
+" HTTPS proxy. Hence pre proxy.\n"
+"\n"
" The pre proxy string should be specified with a protocol:// pre-\n"
-" fix to specify alternative proxy protocols. Use socks4://,\n"
-" socks4a://, socks5:// or socks5h:// to request the specific\n"
-" SOCKS version to be used. No protocol specified will make curl\n"
+" fix to specify alternative proxy protocols. Use socks4://,\n"
+" socks4a://, socks5:// or socks5h:// to request the specific\n"
+" SOCKS version to be used. No protocol specified will make curl\n"
" default to SOCKS4.\n"
"\n"
-" If the port number is not specified in the proxy string, it is\n"
-" assumed to be 1080.\n"
-"\n"
+" If the port number is not specified in the proxy string, it is\n"
, stdout);
fputs(
+" assumed to be 1080.\n"
+"\n"
" User and password that might be provided in the proxy string are\n"
-" URL decoded by curl. This allows you to pass in special charac-\n"
+" URL decoded by curl. This allows you to pass in special charac-\n"
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2319,10 +2512,10 @@ void hugehelp(void)
fputs(
" stead of the standard, more informational, meter.\n"
"\n"
-" This progress bar draws a single line of '#' characters across\n"
+" This progress bar draws a single line of '#' characters across\n"
" the screen and shows a percentage if the transfer size is known.\n"
-" For transfers without a known size, there will be space ship\n"
-" (-=o=-) that moves back and forth but only while data is being\n"
+" For transfers without a known size, there will be space ship\n"
+" (-=o=-) that moves back and forth but only while data is being\n"
" transferred, with a set of flying hash sign symbols on top.\n"
"\n"
" --proto-default <protocol>\n"
@@ -2334,12 +2527,12 @@ void hugehelp(void)
"\n"
" curl --proto-default https ftp.mozilla.org\n"
"\n"
-" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
+" An unknown or unsupported protocol causes error CURLE_UNSUP-\n"
" PORTED_PROTOCOL (1).\n"
"\n"
" This option does not change the default proxy protocol (http).\n"
"\n"
-" Without this option curl would make a guess based on the host,\n"
+" Without this option curl would make a guess based on the host,\n"
" see --url for details.\n"
"\n"
, stdout);
@@ -2347,8 +2540,8 @@ void hugehelp(void)
" Added in 7.45.0.\n"
"\n"
" --proto-redir <protocols>\n"
-" Tells curl to limit what protocols it may use on redirect. Pro-\n"
-" tocols denied by --proto are not overridden by this option. See\n"
+" Tells curl to limit what protocols it may use on redirect. Pro-\n"
+" tocols denied by --proto are not overridden by this option. See\n"
" --proto for how protocols are represented.\n"
"\n"
" Example, allow only HTTP and HTTPS on redirect:\n"
@@ -2359,9 +2552,9 @@ void hugehelp(void)
, stdout);
fputs(
" (7.65.2). Older versions of curl allowed all protocols on redi-\n"
-" rect except several disabled for security reasons: Since 7.19.4\n"
-" FILE and SCP are disabled, and since 7.40.0 SMB and SMBS are\n"
-" also disabled. Specifying all or +all enables all protocols on\n"
+" rect except several disabled for security reasons: Since 7.19.4\n"
+" FILE and SCP are disabled, and since 7.40.0 SMB and SMBS are\n"
+" also disabled. Specifying all or +all enables all protocols on\n"
" redirect, including those disabled for security.\n"
"\n"
" Added in 7.20.2.\n"
@@ -2369,9 +2562,9 @@ void hugehelp(void)
" --proto <protocols>\n"
, stdout);
fputs(
-" Tells curl to limit what protocols it may use in the transfer.\n"
-" Protocols are evaluated left to right, are comma separated, and\n"
-" are each a protocol name or 'all', optionally prefixed by zero\n"
+" Tells curl to limit what protocols it may use in the transfer.\n"
+" Protocols are evaluated left to right, are comma separated, and\n"
+" are each a protocol name or 'all', optionally prefixed by zero\n"
" or more modifiers. Available modifiers are:\n"
"\n"
" + Permit this protocol in addition to protocols already permit-\n"
@@ -2379,11 +2572,11 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" - Deny this protocol, removing it from the list of protocols\n"
+" - Deny this protocol, removing it from the list of protocols\n"
" already permitted.\n"
"\n"
-" = Permit only this protocol (ignoring the list already permit-\n"
-" ted), though subject to later modification by subsequent en-\n"
+" = Permit only this protocol (ignoring the list already permit-\n"
+" ted), though subject to later modification by subsequent en-\n"
" tries in the comma separated list.\n"
"\n"
" For example:\n"
@@ -2400,7 +2593,7 @@ void hugehelp(void)
"\n"
" Unknown protocols produce a warning. This allows scripts to safely rely\n"
" on being able to disable potentially dangerous protocols, without rely-\n"
-" ing upon support for that protocol being built into curl to avoid an\n"
+" ing upon support for that protocol being built into curl to avoid an\n"
" error.\n"
"\n"
" This option can be used multiple times, in which case the effect is the\n"
@@ -2411,35 +2604,35 @@ void hugehelp(void)
" See also --proto-redir and --proto-default. Added in 7.20.2.\n"
"\n"
" --proxy-anyauth\n"
-" Tells curl to pick a suitable authentication method when commu-\n"
-" nicating with the given HTTP proxy. This might cause an extra\n"
+" Tells curl to pick a suitable authentication method when commu-\n"
+" nicating with the given HTTP proxy. This might cause an extra\n"
" request/response round-trip.\n"
"\n"
-" See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
-" in 7.13.2.\n"
+" See also -x, --proxy, --proxy-basic and --proxy-digest. Added in\n"
+" 7.13.2.\n"
"\n"
" --proxy-basic\n"
, stdout);
fputs(
-" Tells curl to use HTTP Basic authentication when communicating\n"
+" Tells curl to use HTTP Basic authentication when communicating\n"
" with the given proxy. Use --basic for enabling HTTP Basic with a\n"
-" remote host. Basic is the default authentication method curl\n"
+" remote host. Basic is the default authentication method curl\n"
" uses with proxies.\n"
"\n"
-" See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
+" See also -x, --proxy, --proxy-anyauth and --proxy-digest.\n"
"\n"
" --proxy-cacert <file>\n"
" Same as --cacert but used in HTTPS proxy context.\n"
"\n"
, stdout);
fputs(
-" See also --proxy-capath and --cacert and --capath and -x,\n"
-" --proxy. Added in 7.52.0.\n"
+" See also --proxy-capath, --cacert, --capath and -x, --proxy.\n"
+" Added in 7.52.0.\n"
"\n"
" --proxy-capath <dir>\n"
" Same as --capath but used in HTTPS proxy context.\n"
"\n"
-" See also --proxy-cacert and -x, --proxy and --capath. Added in\n"
+" See also --proxy-cacert, -x, --proxy and --capath. Added in\n"
" 7.52.0.\n"
"\n"
" --proxy-cert-type <type>\n"
@@ -2465,39 +2658,39 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-digest\n"
-" Tells curl to use HTTP Digest authentication when communicating\n"
+" Tells curl to use HTTP Digest authentication when communicating\n"
, stdout);
fputs(
" with the given proxy. Use --digest for enabling HTTP Digest with\n"
" a remote host.\n"
"\n"
-" See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
+" See also -x, --proxy, --proxy-anyauth and --proxy-basic.\n"
"\n"
" --proxy-header <header/@file>\n"
-" (HTTP) Extra header to include in the request when sending HTTP\n"
+" (HTTP) Extra header to include in the request when sending HTTP\n"
" to a proxy. You may specify any number of extra headers. This is\n"
-" the equivalent option to -H, --header but is for proxy communi-\n"
+" the equivalent option to -H, --header but is for proxy communi-\n"
, stdout);
fputs(
-" cation only like in CONNECT requests when you want a separate\n"
-" header sent to the proxy to what is sent to the actual remote\n"
+" cation only like in CONNECT requests when you want a separate\n"
+" header sent to the proxy to what is sent to the actual remote\n"
" host.\n"
"\n"
-" curl will make sure that each header you add/replace is sent\n"
+" curl will make sure that each header you add/replace is sent\n"
" with the proper end-of-line marker, you should thus not add that\n"
" as a part of the header content: do not add newlines or carriage\n"
" returns, they will only mess things up for you.\n"
"\n"
, stdout);
fputs(
-" Headers specified with this option will not be included in re-\n"
+" Headers specified with this option will not be included in re-\n"
" quests that curl knows will not be sent to a proxy.\n"
"\n"
-" Starting in 7.55.0, this option can take an argument in @file-\n"
-" name style, which then adds a header for each line in the input\n"
+" Starting in 7.55.0, this option can take an argument in @file-\n"
+" name style, which then adds a header for each line in the input\n"
" file. Using @- will make curl read the header file from stdin.\n"
"\n"
-" This option can be used multiple times to add/replace/remove\n"
+" This option can be used multiple times to add/replace/remove\n"
" multiple headers.\n"
"\n"
, stdout);
@@ -2517,7 +2710,7 @@ void hugehelp(void)
" Same as --key but used in HTTPS proxy context.\n"
"\n"
" --proxy-negotiate\n"
-" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n"
+" Tells curl to use HTTP Negotiate (SPNEGO) authentication when\n"
, stdout);
fputs(
" communicating with the given proxy. Use --negotiate for enabling\n"
@@ -2526,7 +2719,7 @@ void hugehelp(void)
" See also --proxy-anyauth and --proxy-basic. Added in 7.17.1.\n"
"\n"
" --proxy-ntlm\n"
-" Tells curl to use HTTP NTLM authentication when communicating\n"
+" Tells curl to use HTTP NTLM authentication when communicating\n"
" with the given proxy. Use --ntlm for enabling NTLM with a remote\n"
" host.\n"
"\n"
@@ -2540,18 +2733,18 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-pinnedpubkey <hashes>\n"
-" (TLS) Tells curl to use the specified public key file (or\n"
-" hashes) to verify the proxy. This can be a path to a file which\n"
+" (TLS) Tells curl to use the specified public key file (or\n"
+" hashes) to verify the proxy. This can be a path to a file which\n"
" contains a single public key in PEM or DER format, or any number\n"
" of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
, stdout);
fputs(
" rated by ';'\n"
"\n"
-" When negotiating a TLS or SSL connection, the server sends a\n"
-" certificate indicating its identity. A public key is extracted\n"
-" from this certificate and if it does not exactly match the pub-\n"
-" lic key provided to this option, curl will abort the connection\n"
+" When negotiating a TLS or SSL connection, the server sends a\n"
+" certificate indicating its identity. A public key is extracted\n"
+" from this certificate and if it does not exactly match the pub-\n"
+" lic key provided to this option, curl will abort the connection\n"
" before sending or receiving any data.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -2559,7 +2752,7 @@ void hugehelp(void)
, stdout);
fputs(
" --proxy-service-name <name>\n"
-" This option allows you to change the service name for proxy ne-\n"
+" This option allows you to change the service name for proxy ne-\n"
" gotiation.\n"
"\n"
" Added in 7.43.0.\n"
@@ -2570,18 +2763,18 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" --proxy-tls13-ciphers <ciphersuite list>\n"
-" (TLS) Specifies which cipher suites to use in the connection to\n"
+" (TLS) Specifies which cipher suites to use in the connection to\n"
, stdout);
fputs(
" your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
-" suites must specify valid ciphers. Read up on TLS 1.3 cipher\n"
+" suites must specify valid ciphers. Read up on TLS 1.3 cipher\n"
" suite details on this URL:\n"
"\n"
" https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
-" This option is currently used only when curl is built to use\n"
+" This option is currently used only when curl is built to use\n"
" OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
-" you can try setting TLS 1.3 cipher suites by using the --proxy-\n"
+" you can try setting TLS 1.3 cipher suites by using the --proxy-\n"
, stdout);
fputs(
" ciphers option.\n"
@@ -2611,20 +2804,20 @@ void hugehelp(void)
" Added in 7.52.0.\n"
"\n"
" -U, --proxy-user <user:password>\n"
-" Specify the user name and password to use for proxy authentica-\n"
+" Specify the user name and password to use for proxy authentica-\n"
" tion.\n"
"\n"
-" If you use a Windows SSPI-enabled curl binary and do either Ne-\n"
-" gotiate or NTLM authentication then you can tell curl to select\n"
+" If you use a Windows SSPI-enabled curl binary and do either Ne-\n"
+" gotiate or NTLM authentication then you can tell curl to select\n"
, stdout);
fputs(
" the user name and password from your environment by specifying a\n"
" single colon with this option: \"-U :\".\n"
"\n"
" On systems where it works, curl will hide the given option argu-\n"
-" ment from process listings. This is not enough to protect cre-\n"
-" dentials from possibly getting seen by other users on the same\n"
-" system as they will still be visible for a brief moment before\n"
+" ment from process listings. This is not enough to protect cre-\n"
+" dentials from possibly getting seen by other users on the same\n"
+" system as they will still be visible for a brief moment before\n"
, stdout);
fputs(
" cleared. Such sensitive data should be retrieved from a file in-\n"
@@ -2634,7 +2827,7 @@ void hugehelp(void)
" -x, --proxy [protocol://]host[:port]\n"
" Use the specified proxy.\n"
"\n"
-" The proxy string can be specified with a protocol:// prefix. No\n"
+" The proxy string can be specified with a protocol:// prefix. No\n"
" protocol specified or http:// will be treated as HTTP proxy. Use\n"
, stdout);
fputs(
@@ -2642,62 +2835,62 @@ void hugehelp(void)
" cific SOCKS version to be used. (The protocol support was added\n"
" in curl 7.21.7)\n"
"\n"
-" HTTPS proxy support via https:// protocol prefix was added in\n"
+" HTTPS proxy support via https:// protocol prefix was added in\n"
" 7.52.0 for OpenSSL, GnuTLS and NSS.\n"
"\n"
-" Unrecognized and unsupported proxy protocols cause an error\n"
-" since 7.52.0. Prior versions may ignore the protocol and use\n"
+" Unrecognized and unsupported proxy protocols cause an error\n"
+" since 7.52.0. Prior versions may ignore the protocol and use\n"
, stdout);
fputs(
" http:// instead.\n"
"\n"
-" If the port number is not specified in the proxy string, it is\n"
+" If the port number is not specified in the proxy string, it is\n"
" assumed to be 1080.\n"
"\n"
-" This option overrides existing environment variables that set\n"
-" the proxy to use. If there's an environment variable setting a\n"
+" This option overrides existing environment variables that set\n"
+" the proxy to use. If there's an environment variable setting a\n"
" proxy, you can set proxy to \"\" to override it.\n"
"\n"
" All operations that are performed over an HTTP proxy will trans-\n"
, stdout);
fputs(
-" parently be converted to HTTP. It means that certain protocol\n"
+" parently be converted to HTTP. It means that certain protocol\n"
" specific operations might not be available. This is not the case\n"
" if you can tunnel through the proxy, as one with the -p, --prox-\n"
" ytunnel option.\n"
"\n"
" User and password that might be provided in the proxy string are\n"
-" URL decoded by curl. This allows you to pass in special charac-\n"
+" URL decoded by curl. This allows you to pass in special charac-\n"
" ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
, stdout);
fputs(
-" The proxy host can be specified the exact same way as the proxy\n"
-" environment variables, including the protocol prefix (http://)\n"
+" The proxy host can be specified the exact same way as the proxy\n"
+" environment variables, including the protocol prefix (http://)\n"
" and the embedded user + password.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --proxy1.0 <host[:port]>\n"
-" Use the specified HTTP 1.0 proxy. If the port number is not\n"
+" Use the specified HTTP 1.0 proxy. If the port number is not\n"
" specified, it is assumed at port 1080.\n"
"\n"
, stdout);
fputs(
-" The only difference between this and the HTTP proxy option -x,\n"
-" --proxy, is that attempts to use CONNECT through the proxy will\n"
+" The only difference between this and the HTTP proxy option -x,\n"
+" --proxy, is that attempts to use CONNECT through the proxy will\n"
" specify an HTTP 1.0 protocol instead of the default HTTP 1.1.\n"
"\n"
" -p, --proxytunnel\n"
-" When an HTTP proxy is used -x, --proxy, this option will make\n"
-" curl tunnel through the proxy. The tunnel approach is made with\n"
-" the HTTP proxy CONNECT request and requires that the proxy al-\n"
+" When an HTTP proxy is used -x, --proxy, this option will make\n"
+" curl tunnel through the proxy. The tunnel approach is made with\n"
+" the HTTP proxy CONNECT request and requires that the proxy al-\n"
, stdout);
fputs(
" lows direct connect to the remote port number curl wants to tun-\n"
" nel through to.\n"
"\n"
-" To suppress proxy CONNECT response headers when curl is set to\n"
+" To suppress proxy CONNECT response headers when curl is set to\n"
" output headers use --suppress-connect-headers.\n"
"\n"
" See also -x, --proxy.\n"
@@ -2710,92 +2903,106 @@ void hugehelp(void)
fputs(
" If this option is used several times, the last one will be used.\n"
" (As of 7.39.0, curl attempts to automatically extract the public\n"
-" key from the private key file, so passing this option is gener-\n"
+" key from the private key file, so passing this option is gener-\n"
" ally not required. Note that this public key extraction requires\n"
-" libcurl to be linked against a copy of libssh2 1.2.8 or higher\n"
+" libcurl to be linked against a copy of libssh2 1.2.8 or higher\n"
" that is itself linked against OpenSSL.)\n"
"\n"
" -Q, --quote\n"
, stdout);
fputs(
-" (FTP SFTP) Send an arbitrary command to the remote FTP or SFTP\n"
-" server. Quote commands are sent BEFORE the transfer takes place\n"
-" (just after the initial PWD command in an FTP transfer, to be\n"
+" (FTP SFTP) Send an arbitrary command to the remote FTP or SFTP\n"
+" server. Quote commands are sent BEFORE the transfer takes place\n"
+" (just after the initial PWD command in an FTP transfer, to be\n"
" exact). To make commands take place after a successful transfer,\n"
-" prefix them with a dash '-'. To make commands be sent after\n"
+" prefix them with a dash '-'. To make commands be sent after\n"
" curl has changed the working directory, just before the transfer\n"
, stdout);
fputs(
-" command(s), prefix the command with a '+' (this is only sup-\n"
+" command(s), prefix the command with a '+' (this is only sup-\n"
" ported for FTP). You may specify any number of commands.\n"
"\n"
-" If the server returns failure for one of the commands, the en-\n"
+" If the server returns failure for one of the commands, the en-\n"
" tire operation will be aborted. You must send syntactically cor-\n"
-" rect FTP commands as RFC 959 defines to FTP servers, or one of\n"
+" rect FTP commands as RFC 959 defines to FTP servers, or one of\n"
" the commands listed below to SFTP servers.\n"
"\n"
, stdout);
fputs(
-" Prefix the command with an asterisk (*) to make curl continue\n"
-" even if the command fails as by default curl will stop at first\n"
+" Prefix the command with an asterisk (*) to make curl continue\n"
+" even if the command fails as by default curl will stop at first\n"
" failure.\n"
"\n"
" This option can be used multiple times.\n"
"\n"
-" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
-" quote commands itself before sending them to the server. File\n"
+" SFTP is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
+" quote commands itself before sending them to the server. File\n"
" names may be quoted shell-style to embed spaces or special char-\n"
, stdout);
fputs(
-" acters. Following is the list of all supported SFTP quote com-\n"
+" acters. Following is the list of all supported SFTP quote com-\n"
" mands:\n"
"\n"
+" atime date file\n"
+" The atime command sets the last access time of the file\n"
+" named by the file operand. The <date expression> can be\n"
+" all sorts of date strings, see the curl_getdate(3) man\n"
+" page for date expression details. (Added in 7.73.0)\n"
+"\n"
" chgrp group file\n"
+, stdout);
+ fputs(
" The chgrp command sets the group ID of the file named by\n"
" the file operand to the group ID specified by the group\n"
" operand. The group operand is a decimal integer group ID.\n"
"\n"
" chmod mode file\n"
" The chmod command modifies the file mode bits of the\n"
-, stdout);
- fputs(
" specified file. The mode operand is an octal integer mode\n"
" number.\n"
"\n"
" chown user file\n"
+, stdout);
+ fputs(
" The chown command sets the owner of the file named by the\n"
" file operand to the user ID specified by the user oper-\n"
" and. The user operand is a decimal integer user ID.\n"
"\n"
" ln source_file target_file\n"
" The ln and symlink commands create a symbolic link at the\n"
-, stdout);
- fputs(
" target_file location pointing to the source_file loca-\n"
" tion.\n"
"\n"
" mkdir directory_name\n"
+, stdout);
+ fputs(
" The mkdir command creates the directory named by the di-\n"
" rectory_name operand.\n"
"\n"
+" mtime date file\n"
+" The mtime command sets the last modification time of the\n"
+" file named by the file operand. The <date expression> can\n"
+" be all sorts of date strings, see the curl_getdate(3) man\n"
+" page for date expression details. (Added in 7.73.0)\n"
+"\n"
+, stdout);
+ fputs(
" pwd The pwd command returns the absolute pathname of the cur-\n"
" rent working directory.\n"
"\n"
" rename source target\n"
-, stdout);
- fputs(
" The rename command renames the file or directory named by\n"
-" the source operand to the destination path named by the\n"
+" the source operand to the destination path named by the\n"
" target operand.\n"
"\n"
" rm file\n"
" The rm command removes the file specified by the file op-\n"
" erand.\n"
"\n"
-" rmdir directory\n"
-" The rmdir command removes the directory entry specified\n"
, stdout);
fputs(
+" rmdir directory\n"
+" The rmdir command removes the directory entry specified\n"
" by the directory operand, provided it is empty.\n"
"\n"
" symlink source_file target_file\n"
@@ -2803,14 +3010,14 @@ void hugehelp(void)
"\n"
" --random-file <file>\n"
" Specify the path name to file containing what will be considered\n"
-" as random data. The data may be used to seed the random engine\n"
+" as random data. The data may be used to seed the random engine\n"
+, stdout);
+ fputs(
" for SSL connections. See also the --egd-file option.\n"
"\n"
" -r, --range <range>\n"
-, stdout);
- fputs(
" (HTTP FTP SFTP FILE) Retrieve a byte range (i.e. a partial docu-\n"
-" ment) from an HTTP/1.1, FTP or SFTP server or a local FILE.\n"
+" ment) from an HTTP/1.1, FTP or SFTP server or a local FILE.\n"
" Ranges can be specified in a number of ways.\n"
"\n"
" 0-499 specifies the first 500 bytes\n"
@@ -2819,165 +3026,165 @@ void hugehelp(void)
"\n"
" -500 specifies the last 500 bytes\n"
"\n"
-" 9500- specifies the bytes from offset 9500 and forward\n"
-"\n"
, stdout);
fputs(
+" 9500- specifies the bytes from offset 9500 and forward\n"
+"\n"
" 0-0,-1 specifies the first and last byte only(*)(HTTP)\n"
"\n"
" 100-199,500-599\n"
" specifies two separate 100-byte ranges(*) (HTTP)\n"
"\n"
-" (*) = NOTE that this will cause the server to reply with a mul-\n"
+" (*) = NOTE that this will cause the server to reply with a mul-\n"
" tipart response!\n"
"\n"
-" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
-" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
+" Only digit characters (0-9) are valid in the 'start' and 'stop'\n"
, stdout);
fputs(
+" fields of the 'start-stop' range syntax. If a non-digit charac-\n"
" ter is given in the range, the server's response will be unspec-\n"
" ified, depending on the server's configuration.\n"
"\n"
-" You should also be aware that many HTTP/1.1 servers do not have\n"
-" this feature enabled, so that when you attempt to get a range,\n"
+" You should also be aware that many HTTP/1.1 servers do not have\n"
+" this feature enabled, so that when you attempt to get a range,\n"
" you'll instead get the whole document.\n"
"\n"
-" FTP and SFTP range downloads only support the simple 'start-\n"
, stdout);
fputs(
-" stop' syntax (optionally with one of the numbers omitted). FTP\n"
+" FTP and SFTP range downloads only support the simple 'start-\n"
+" stop' syntax (optionally with one of the numbers omitted). FTP\n"
" use depends on the extended FTP command SIZE.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --raw (HTTP) When used, it disables all internal HTTP decoding of con-\n"
-" tent or transfer encodings and instead makes them passed on un-\n"
+" tent or transfer encodings and instead makes them passed on un-\n"
" altered, raw.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.16.2.\n"
"\n"
" -e, --referer <URL>\n"
-, stdout);
- fputs(
" (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
" This can also be set with the -H, --header flag of course. When\n"
-" used with -L, --location you can append \";auto\" to the -e,\n"
-" --referer URL to make curl automatically set the previous URL\n"
-" when it follows a Location: header. The \";auto\" string can be\n"
-" used alone, even if you don't set an initial -e, --referer.\n"
-"\n"
+" used with -L, --location you can append \";auto\" to the -e,\n"
+" --referer URL to make curl automatically set the previous URL\n"
+" when it follows a Location: header. The \";auto\" string can be\n"
, stdout);
fputs(
+" used alone, even if you don't set an initial -e, --referer.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -A, --user-agent and -H, --header.\n"
"\n"
" -J, --remote-header-name\n"
" (HTTP) This option tells the -O, --remote-name option to use the\n"
-" server-specified Content-Disposition filename instead of ex-\n"
+" server-specified Content-Disposition filename instead of ex-\n"
" tracting a filename from the URL.\n"
"\n"
-" If the server specifies a file name and a file with that name\n"
, stdout);
fputs(
-" already exists in the current working directory it will not be\n"
+" If the server specifies a file name and a file with that name\n"
+" already exists in the current working directory it will not be\n"
" overwritten and an error will occur. If the server doesn't spec-\n"
" ify a file name then this option has no effect.\n"
"\n"
-" There's no attempt to decode %-sequences (yet) in the provided\n"
+" There's no attempt to decode %-sequences (yet) in the provided\n"
" file name, so this option may provide you with rather unexpected\n"
" file names.\n"
"\n"
-" WARNING: Exercise judicious use of this option, especially on\n"
, stdout);
fputs(
-" Windows. A rogue server could send you the name of a DLL or\n"
-" other file that could possibly be loaded automatically by Win-\n"
+" WARNING: Exercise judicious use of this option, especially on\n"
+" Windows. A rogue server could send you the name of a DLL or\n"
+" other file that could possibly be loaded automatically by Win-\n"
" dows or some third party software.\n"
"\n"
" --remote-name-all\n"
-" This option changes the default action for all given URLs to be\n"
+" This option changes the default action for all given URLs to be\n"
" dealt with as if -O, --remote-name were used for each one. So if\n"
-" you want to disable that for a specific URL after --remote-name-\n"
, stdout);
fputs(
+" you want to disable that for a specific URL after --remote-name-\n"
" all has been used, you must use \"-o -\" or --no-remote-name.\n"
"\n"
" Added in 7.19.0.\n"
"\n"
" -O, --remote-name\n"
-" Write output to a local file named like the remote file we get.\n"
-" (Only the file part of the remote file is used, the path is cut\n"
+" Write output to a local file named like the remote file we get.\n"
+" (Only the file part of the remote file is used, the path is cut\n"
" off.)\n"
"\n"
-" The file will be saved in the current working directory. If you\n"
-" want the file saved in a different directory, make sure you\n"
+" The file will be saved in the current working directory. If you\n"
, stdout);
fputs(
-" change the current working directory before invoking curl with\n"
+" want the file saved in a different directory, make sure you\n"
+" change the current working directory before invoking curl with\n"
" this option.\n"
"\n"
-" The remote file name to use for saving is extracted from the\n"
-" given URL, nothing else, and if it already exists it will be\n"
-" overwritten. If you want the server to be able to choose the\n"
-" file name refer to -J, --remote-header-name which can be used in\n"
+" The remote file name to use for saving is extracted from the\n"
+" given URL, nothing else, and if it already exists it will be\n"
+" overwritten. If you want the server to be able to choose the\n"
, stdout);
fputs(
-" addition to this option. If the server chooses a file name and\n"
+" file name refer to -J, --remote-header-name which can be used in\n"
+" addition to this option. If the server chooses a file name and\n"
" that name already exists it will not be overwritten.\n"
"\n"
" There is no URL decoding done on the file name. If it has %20 or\n"
-" other URL encoded parts of the name, they will end up as-is as\n"
+" other URL encoded parts of the name, they will end up as-is as\n"
" file name.\n"
"\n"
-" You may use this option as many times as the number of URLs you\n"
+" You may use this option as many times as the number of URLs you\n"
+, stdout);
+ fputs(
" have.\n"
"\n"
" -R, --remote-time\n"
-, stdout);
- fputs(
-" When used, this will make curl attempt to figure out the time-\n"
-" stamp of the remote file, and if that is available make the lo-\n"
+" When used, this will make curl attempt to figure out the time-\n"
+" stamp of the remote file, and if that is available make the lo-\n"
" cal file get that same timestamp.\n"
"\n"
" --request-target\n"
-" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
-" of using the path as provided in the URL. Particularly useful\n"
-" when wanting to issue HTTP requests without leading slash or\n"
+" (HTTP) Tells curl to use an alternative \"target\" (path) instead\n"
+" of using the path as provided in the URL. Particularly useful\n"
, stdout);
fputs(
-" other data that doesn't follow the regular URL pattern, like\n"
+" when wanting to issue HTTP requests without leading slash or\n"
+" other data that doesn't follow the regular URL pattern, like\n"
" \"OPTIONS *\".\n"
"\n"
" Added in 7.55.0.\n"
"\n"
" -X, --request <command>\n"
" (HTTP) Specifies a custom request method to use when communicat-\n"
-" ing with the HTTP server. The specified request method will be\n"
-" used instead of the method otherwise used (which defaults to\n"
-" GET). Read the HTTP 1.1 specification for details and explana-\n"
+" ing with the HTTP server. The specified request method will be\n"
+" used instead of the method otherwise used (which defaults to\n"
, stdout);
fputs(
-" tions. Common additional HTTP requests include PUT and DELETE,\n"
+" GET). Read the HTTP 1.1 specification for details and explana-\n"
+" tions. Common additional HTTP requests include PUT and DELETE,\n"
" but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
" and more.\n"
"\n"
-" Normally you don't need this option. All sorts of GET, HEAD,\n"
+" Normally you don't need this option. All sorts of GET, HEAD,\n"
" POST and PUT requests are rather invoked by using dedicated com-\n"
" mand line options.\n"
"\n"
-" This option only changes the actual word used in the HTTP re-\n"
, stdout);
fputs(
+" This option only changes the actual word used in the HTTP re-\n"
" quest, it does not alter the way curl behaves. So for example if\n"
-" you want to make a proper HEAD request, using -X HEAD will not\n"
+" you want to make a proper HEAD request, using -X HEAD will not\n"
" suffice. You need to use the -I, --head option.\n"
"\n"
-" The method string you set with -X, --request will be used for\n"
-" all requests, which if you for example use -L, --location may\n"
-" cause unintended side-effects when curl doesn't change request\n"
+" The method string you set with -X, --request will be used for\n"
+" all requests, which if you for example use -L, --location may\n"
, stdout);
fputs(
+" cause unintended side-effects when curl doesn't change request\n"
" method according to the HTTP 30x response codes - and similar.\n"
"\n"
" (FTP) Specifies a custom FTP command to use instead of LIST when\n"
@@ -2986,43 +3193,43 @@ void hugehelp(void)
" (POP3) Specifies a custom POP3 command to use instead of LIST or\n"
" RETR. (Added in 7.26.0)\n"
"\n"
-" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
-" (Added in 7.30.0)\n"
-"\n"
+" (IMAP) Specifies a custom IMAP command to use instead of LIST.\n"
, stdout);
fputs(
+" (Added in 7.30.0)\n"
+"\n"
" (SMTP) Specifies a custom SMTP command to use instead of HELP or\n"
" VRFY. (Added in 7.34.0)\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
-" --resolve <host:port:address[,address]...>\n"
-" Provide a custom address for a specific host and port pair. Us-\n"
-" ing this, you can make the curl requests(s) use a specified ad-\n"
-" dress and prevent the otherwise normally resolved address to be\n"
+" --resolve <host:port:addr[,addr]...>\n"
+" Provide a custom address for a specific host and port pair. Us-\n"
+" ing this, you can make the curl requests(s) use a specified ad-\n"
, stdout);
fputs(
-" used. Consider it a sort of /etc/hosts alternative provided on\n"
-" the command line. The port number should be the number used for\n"
-" the specific protocol the host will be used for. It means you\n"
+" dress and prevent the otherwise normally resolved address to be\n"
+" used. Consider it a sort of /etc/hosts alternative provided on\n"
+" the command line. The port number should be the number used for\n"
+" the specific protocol the host will be used for. It means you\n"
" need several entries if you want to provide address for the same\n"
" host but different ports.\n"
"\n"
-" By specifying '*' as host you can tell curl to resolve any host\n"
, stdout);
fputs(
+" By specifying '*' as host you can tell curl to resolve any host\n"
" and specific port pair to the specified address. Wildcard is re-\n"
-" solved last so any --resolve with a specific host and port will\n"
+" solved last so any --resolve with a specific host and port will\n"
" be used first.\n"
"\n"
" The provided address set by this option will be used even if -4,\n"
" --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
+, stdout);
+ fputs(
" Support for providing the IP address within [brackets] was added\n"
" in 7.57.0.\n"
"\n"
-, stdout);
- fputs(
-" Support for providing multiple IP addresses per entry was added\n"
+" Support for providing multiple IP addresses per entry was added\n"
" in 7.59.0.\n"
"\n"
" Support for resolving with wildcard was added in 7.64.0.\n"
@@ -3032,15 +3239,43 @@ void hugehelp(void)
"\n"
" Added in 7.21.3.\n"
"\n"
+" --retry-all-errors\n"
+, stdout);
+ fputs(
+" Retry on any error. This option is used together with --retry.\n"
+"\n"
+" This option is the \"sledgehammer\" of retrying. Do not use this\n"
+" option by default (eg in curlrc), there may be unintended conse-\n"
+" quences such as sending or receiving duplicate data. Do not use\n"
+" with redirected input or output. You'd be much better off han-\n"
+" dling your unique problems in shell script. Please read the ex-\n"
+" ample below.\n"
+, stdout);
+ fputs(
+"\n"
+" Warning: For server compatibility curl attempts to retry failed\n"
+" flaky transfers as close as possible to how they were started,\n"
+" but this is not possible with redirected input or output. For\n"
+" example, before retrying it removes output data from a failed\n"
+" partial transfer that was written to an output file. However\n"
+" this is not true of data redirected to a | pipe or > file, which\n"
+, stdout);
+ fputs(
+" are not reset. We strongly suggest don't parse or record output\n"
+" via redirect in combination with this option, since you may re-\n"
+" ceive duplicate data.\n"
+"\n"
+" Added in 7.71.0.\n"
+"\n"
" --retry-connrefused\n"
" In addition to the other conditions, consider ECONNREFUSED as a\n"
" transient error too for --retry. This option is used together\n"
-, stdout);
- fputs(
" with --retry.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
+, stdout);
+ fputs(
" --retry-delay <seconds>\n"
" Make curl sleep this amount of time before each retry when a\n"
" transfer has failed with a transient error (it changes the de-\n"
@@ -3048,10 +3283,10 @@ void hugehelp(void)
" only interesting if --retry is also used. Setting this delay to\n"
" zero will make curl use the default backoff time.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.12.3.\n"
"\n"
" --retry-max-time <seconds>\n"
@@ -3059,9 +3294,9 @@ void hugehelp(void)
" tries will be done as usual (see --retry) as long as the timer\n"
" hasn't reached this given limit. Notice that if the timer hasn't\n"
" reached the limit, the request will be made and while perform-\n"
+" ing, it may take longer than this given time period. To limit a\n"
, stdout);
fputs(
-" ing, it may take longer than this given time period. To limit a\n"
" single request's maximum time, use -m, --max-time. Set this op-\n"
" tion to zero to not timeout retries.\n"
"\n"
@@ -3071,18 +3306,18 @@ void hugehelp(void)
"\n"
" --retry <num>\n"
" If a transient error is returned when curl tries to perform a\n"
+" transfer, it will retry this number of times before giving up.\n"
, stdout);
fputs(
-" transfer, it will retry this number of times before giving up.\n"
" Setting the number to 0 makes curl do no retries (which is the\n"
" default). Transient error means either: a timeout, an FTP 4xx\n"
" response code or an HTTP 408 or 5xx response code.\n"
"\n"
" When curl is about to retry a transfer, it will first wait one\n"
" second and then for all forthcoming retries it will double the\n"
+" waiting time until it reaches 10 minutes which then will be the\n"
, stdout);
fputs(
-" waiting time until it reaches 10 minutes which then will be the\n"
" delay between the rest of the retries. By using --retry-delay\n"
" you disable this exponential backoff algorithm. See also\n"
" --retry-max-time to limit the total time allowed for retries.\n"
@@ -3091,13 +3326,13 @@ void hugehelp(void)
" sponse header if one was present to know when to issue the next\n"
" retry.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.12.3.\n"
"\n"
-" --sasl-authzid\n"
+" --sasl-authzid <identity>\n"
" Use this authorisation identity (authzid), during SASL PLAIN au-\n"
" thentication, in addition to the authentication identity (auth-\n"
" cid) as specified by -u, --user.\n"
@@ -3129,6 +3364,9 @@ void hugehelp(void)
" -S, --show-error\n"
" When used with -s, --silent, it makes curl show an error message\n"
" if it fails.\n"
+"\n"
+" See also --no-progress-meter.\n"
+"\n"
" -s, --silent\n"
" Silent or quiet mode. Don't show progress meter or error mes-\n"
" sages. Makes Curl mute. It will still output the data you ask\n"
@@ -3140,7 +3378,7 @@ void hugehelp(void)
" Use -S, --show-error in addition to this option to disable\n"
" progress meter but still show error messages.\n"
"\n"
-" See also -v, --verbose and --stderr.\n"
+" See also -v, --verbose, --stderr and --no-progress-meter.\n"
"\n"
" --socks4 <host[:port]>\n"
" Use the specified SOCKS4 proxy. If the port number is not speci-\n"
@@ -3332,55 +3570,62 @@ void hugehelp(void)
"\n"
" Added in 7.20.0.\n"
"\n"
+" --ssl-revoke-best-effort\n"
, stdout);
fputs(
+" (Schannel) This option tells curl to ignore certificate revoca-\n"
+" tion checks when they failed due to missing/offline distribution\n"
+" points for the revocation check lists.\n"
+"\n"
+" Added in 7.70.0.\n"
+"\n"
" --ssl (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection. Re-\n"
" verts to a non-secure connection if the server doesn't support\n"
" SSL/TLS. See also --ftp-ssl-control and --ssl-reqd for differ-\n"
+, stdout);
+ fputs(
" ent levels of encryption required.\n"
"\n"
" This option was formerly known as --ftp-ssl (Added in 7.11.0).\n"
" That option name can still be used but will be removed in a fu-\n"
" ture version.\n"
"\n"
-, stdout);
- fputs(
" Added in 7.20.0.\n"
"\n"
" -2, --sslv2\n"
" (SSL) Forces curl to use SSL version 2 when negotiating with a\n"
" remote SSL server. Sometimes curl is built without SSLv2 sup-\n"
+, stdout);
+ fputs(
" port. SSLv2 is widely considered insecure (see RFC 6176).\n"
"\n"
" See also --http1.1 and --http2. -2, --sslv2 requires that the\n"
" underlying libcurl was built to support TLS. This option over-\n"
-, stdout);
- fputs(
" rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" -3, --sslv3\n"
" (SSL) Forces curl to use SSL version 3 when negotiating with a\n"
" remote SSL server. Sometimes curl is built without SSLv3 sup-\n"
+, stdout);
+ fputs(
" port. SSLv3 is widely considered insecure (see RFC 7568).\n"
"\n"
" See also --http1.1 and --http2. -3, --sslv3 requires that the\n"
" underlying libcurl was built to support TLS. This option over-\n"
-, stdout);
- fputs(
" rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
" --stderr\n"
" Redirect all writes to stderr to the specified file instead. If\n"
" the file name is a plain '-', it is instead written to stdout.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" See also -v, --verbose and -s, --silent.\n"
"\n"
" --styled-output\n"
" Enables the automatic use of bold font styles when writing HTTP\n"
-, stdout);
- fputs(
" headers to the terminal. Use --no-styled-output to switch them\n"
" off.\n"
"\n"
@@ -3388,29 +3633,28 @@ void hugehelp(void)
"\n"
" --suppress-connect-headers\n"
" When -p, --proxytunnel is used and a CONNECT request is made\n"
+, stdout);
+ fputs(
" don't output proxy CONNECT response headers. This option is\n"
" meant to be used with -D, --dump-header or -i, --include which\n"
" are used to show protocol headers in the output. It has no ef-\n"
-, stdout);
- fputs(
" fect on debug options such as -v, --verbose or --trace, or any\n"
" statistics.\n"
"\n"
-" See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
-" nel.\n"
+" See also -D, --dump-header, -i, --include and -p, --proxytunnel.\n"
"\n"
" --tcp-fastopen\n"
" Enable use of TCP Fast Open (RFC7413).\n"
"\n"
+, stdout);
+ fputs(
" Added in 7.49.0.\n"
"\n"
" --tcp-nodelay\n"
-" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
+" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
" page for details about this option.\n"
"\n"
-, stdout);
- fputs(
-" Since 7.50.2, curl sets this option by default and you need to\n"
+" Since 7.50.2, curl sets this option by default and you need to\n"
" explicitly switch it off if you don't want it on.\n"
"\n"
" Added in 7.11.2.\n"
@@ -3418,6 +3662,8 @@ void hugehelp(void)
" -t, --telnet-option <opt=val>\n"
" Pass options to the telnet protocol. Supported options are:\n"
"\n"
+, stdout);
+ fputs(
" TTYPE=<term> Sets the terminal type.\n"
"\n"
" XDISPLOC=<X display> Sets the X display location.\n"
@@ -3425,12 +3671,12 @@ void hugehelp(void)
" NEW_ENV=<var,val> Sets an environment variable.\n"
"\n"
" --tftp-blksize <value>\n"
-, stdout);
- fputs(
" (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
" size that curl will try to use when transferring data to or from\n"
" a TFTP server. By default 512 bytes will be used.\n"
"\n"
+, stdout);
+ fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" Added in 7.20.0.\n"
@@ -3438,95 +3684,102 @@ void hugehelp(void)
" --tftp-no-options\n"
" (TFTP) Tells curl not to send TFTP options requests.\n"
"\n"
-, stdout);
- fputs(
-" This option improves interop with some legacy servers that do\n"
-" not acknowledge or properly implement TFTP options. When this\n"
+" This option improves interop with some legacy servers that do\n"
+" not acknowledge or properly implement TFTP options. When this\n"
" option is used --tftp-blksize is ignored.\n"
"\n"
" Added in 7.48.0.\n"
"\n"
" -z, --time-cond <time>\n"
-" (HTTP FTP) Request a file that has been modified later than the\n"
-" given time and date, or one that has been modified before that\n"
, stdout);
fputs(
-" time. The <date expression> can be all sorts of date strings or\n"
+" (HTTP FTP) Request a file that has been modified later than the\n"
+" given time and date, or one that has been modified before that\n"
+" time. The <date expression> can be all sorts of date strings or\n"
" if it doesn't match any internal ones, it is taken as a filename\n"
-" and tries to get the modification date (mtime) from <file> in-\n"
+" and tries to get the modification date (mtime) from <file> in-\n"
" stead. See the curl_getdate(3) man pages for date expression de-\n"
" tails.\n"
"\n"
-" Start the date expression with a dash (-) to make it request for\n"
-" a document that is older than the given date/time, default is a\n"
, stdout);
fputs(
+" Start the date expression with a dash (-) to make it request for\n"
+" a document that is older than the given date/time, default is a\n"
" document that is newer than the specified date/time.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --tls-max <VERSION>\n"
" (SSL) VERSION defines maximum supported TLS version. The minimum\n"
-" acceptable version is set by tlsv1.0, tlsv1.1, tlsv1.2 or\n"
+" acceptable version is set by tlsv1.0, tlsv1.1, tlsv1.2 or\n"
+, stdout);
+ fputs(
" tlsv1.3.\n"
"\n"
+" If the connection is done without TLS, this option has no ef-\n"
+" fect. This includes QUIC-using (HTTP/3) transfers.\n"
+"\n"
" default\n"
" Use up to recommended TLS version.\n"
"\n"
" 1.0 Use up to TLSv1.0.\n"
-, stdout);
- fputs(
" 1.1 Use up to TLSv1.1.\n"
" 1.2 Use up to TLSv1.2.\n"
" 1.3 Use up to TLSv1.3.\n"
"\n"
-" See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2 and --tlsv1.3. --tls-max\n"
-" requires that the underlying libcurl was built to support TLS. Added in\n"
+" See also --tlsv1.0, --tlsv1.1, --tlsv1.2 and --tlsv1.3. --tls-max re-\n"
+, stdout);
+ fputs(
+" quires that the underlying libcurl was built to support TLS. Added in\n"
" 7.54.0.\n"
"\n"
-" --tls13-ciphers <list of TLS 1.3 ciphersuites>\n"
+" --tls13-ciphers <ciphersuite list>\n"
" (TLS) Specifies which cipher suites to use in the connection if\n"
-, stdout);
- fputs(
" it negotiates TLS 1.3. The list of ciphers suites must specify\n"
" valid ciphers. Read up on TLS 1.3 cipher suite details on this\n"
" URL:\n"
"\n"
" https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
+, stdout);
+ fputs(
" This option is currently used only when curl is built to use\n"
" OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
" you can try setting TLS 1.3 cipher suites by using the --ciphers\n"
" option.\n"
"\n"
-, stdout);
- fputs(
" If this option is used several times, the last one will be used.\n"
"\n"
" --tlsauthtype <type>\n"
" Set TLS authentication type. Currently, the only supported op-\n"
+, stdout);
+ fputs(
" tion is \"SRP\", for TLS-SRP (RFC 5054). If --tlsuser and\n"
" --tlspassword are specified but --tlsauthtype is not, then this\n"
" option defaults to \"SRP\". This option works only if the under-\n"
-, stdout);
- fputs(
" lying libcurl is built with TLS-SRP support, which requires\n"
" OpenSSL or GnuTLS with TLS-SRP support.\n"
"\n"
" Added in 7.21.4.\n"
"\n"
" --tlspassword\n"
+, stdout);
+ fputs(
" Set password for use with the TLS authentication method speci-\n"
" fied with --tlsauthtype. Requires that --tlsuser also be set.\n"
"\n"
+" This doesn't work with TLS 1.3.\n"
+"\n"
" Added in 7.21.4.\n"
" --tlsuser <name>\n"
" Set username for use with the TLS authentication method speci-\n"
-, stdout);
- fputs(
" fied with --tlsauthtype. Requires that --tlspassword also is\n"
" set.\n"
"\n"
+" This doesn't work with TLS 1.3.\n"
+"\n"
+, stdout);
+ fputs(
" Added in 7.21.4.\n"
"\n"
" --tlsv1.0\n"
@@ -3535,78 +3788,79 @@ void hugehelp(void)
"\n"
" In old versions of curl this option was documented to allow\n"
" _only_ TLS 1.0, but behavior was inconsistent depending on the\n"
-, stdout);
- fputs(
" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
" sion.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.1\n"
+, stdout);
+ fputs(
" (TLS) Forces curl to use TLS version 1.1 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
" In old versions of curl this option was documented to allow\n"
" _only_ TLS 1.1, but behavior was inconsistent depending on the\n"
-, stdout);
- fputs(
" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
" sion.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.2\n"
+, stdout);
+ fputs(
" (TLS) Forces curl to use TLS version 1.2 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
" In old versions of curl this option was documented to allow\n"
" _only_ TLS 1.2, but behavior was inconsistent depending on the\n"
-, stdout);
- fputs(
" TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
" sion.\n"
"\n"
" Added in 7.34.0.\n"
"\n"
" --tlsv1.3\n"
+, stdout);
+ fputs(
" (TLS) Forces curl to use TLS version 1.3 or later when connect-\n"
" ing to a remote TLS server.\n"
"\n"
-" Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
-" At the time of this writing, they are BoringSSL, NSS, and Secure\n"
-, stdout);
- fputs(
-" Transport (on iOS 11 or later, and macOS 10.13 or later).\n"
+" If the connection is done without TLS, this option has no ef-\n"
+" fect. This includes QUIC-using (HTTP/3) transfers.\n"
+"\n"
+" Note that TLS 1.3 is not supported by all TLS backends.\n"
"\n"
" Added in 7.52.0.\n"
"\n"
" -1, --tlsv1\n"
-" (SSL) Tells curl to use at least TLS version 1.x when negotiat-\n"
-" ing with a remote TLS server. That means TLS version 1.0 or\n"
-" higher\n"
-"\n"
-" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
-" underlying libcurl was built to support TLS. This option over-\n"
+" (SSL) Tells curl to use at least TLS version 1.x when negotiat-\n"
, stdout);
fputs(
+" ing with a remote TLS server. That means TLS version 1.0 or\n"
+" higher\n"
+"\n"
+" See also --http1.1 and --http2. -1, --tlsv1 requires that the\n"
+" underlying libcurl was built to support TLS. This option over-\n"
" rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
"\n"
" --tr-encoding\n"
" (HTTP) Request a compressed Transfer-Encoding response using one\n"
-" of the algorithms curl supports, and uncompress the data while\n"
+" of the algorithms curl supports, and uncompress the data while\n"
+, stdout);
+ fputs(
" receiving it.\n"
"\n"
" Added in 7.21.6.\n"
"\n"
" --trace-ascii <file>\n"
" Enables a full trace dump of all incoming and outgoing data, in-\n"
-" cluding descriptive information, to the given output file. Use\n"
-, stdout);
- fputs(
+" cluding descriptive information, to the given output file. Use\n"
" \"-\" as filename to have the output sent to stdout.\n"
"\n"
" This is very similar to --trace, but leaves out the hex part and\n"
-" only shows the ASCII part of the dump. It makes smaller output\n"
+" only shows the ASCII part of the dump. It makes smaller output\n"
+, stdout);
+ fputs(
" that might be easier to read for untrained humans.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
@@ -3614,111 +3868,118 @@ void hugehelp(void)
" This option overrides --trace and -v, --verbose.\n"
"\n"
" --trace-time\n"
-, stdout);
- fputs(
-" Prepends a time stamp to each trace or verbose line that curl\n"
+" Prepends a time stamp to each trace or verbose line that curl\n"
" displays.\n"
"\n"
" Added in 7.14.0.\n"
"\n"
" --trace <file>\n"
" Enables a full trace dump of all incoming and outgoing data, in-\n"
-" cluding descriptive information, to the given output file. Use\n"
-" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
-" filename to have the output sent to stderr.\n"
-"\n"
, stdout);
fputs(
+" cluding descriptive information, to the given output file. Use\n"
+" \"-\" as filename to have the output sent to stdout. Use \"%\" as\n"
+" filename to have the output sent to stderr.\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" This option overrides -v, --verbose and --trace-ascii.\n"
"\n"
" --unix-socket <path>\n"
" (HTTP) Connect through this Unix domain socket, instead of using\n"
+, stdout);
+ fputs(
" the network.\n"
"\n"
" Added in 7.40.0.\n"
"\n"
" -T, --upload-file <file>\n"
-" This transfers the specified local file to the remote URL. If\n"
-, stdout);
- fputs(
+" This transfers the specified local file to the remote URL. If\n"
" there is no file part in the specified URL, curl will append the\n"
" local file name. NOTE that you must use a trailing / on the last\n"
-" directory to really prove to Curl that there is no file name or\n"
+" directory to really prove to Curl that there is no file name or\n"
" curl will think that your last directory name is the remote file\n"
+, stdout);
+ fputs(
" name to use. That will most likely cause the upload operation to\n"
" fail. If this is used on an HTTP(S) server, the PUT command will\n"
" be used.\n"
"\n"
+" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
+" given file. Alternately, the file name \".\" (a single period)\n"
+" may be specified instead of \"-\" to use stdin in non-blocking\n"
+" mode to allow reading server output while stdin is being up-\n"
, stdout);
fputs(
-" Use the file name \"-\" (a single dash) to use stdin instead of a\n"
-" given file. Alternately, the file name \".\" (a single period)\n"
-" may be specified instead of \"-\" to use stdin in non-blocking\n"
-" mode to allow reading server output while stdin is being up-\n"
" loaded.\n"
"\n"
-" You can specify one -T, --upload-file for each URL on the com-\n"
-" mand line. Each -T, --upload-file + URL pair specifies what to\n"
-, stdout);
- fputs(
-" upload and to where. curl also supports \"globbing\" of the -T,\n"
-" --upload-file argument, meaning that you can upload multiple\n"
-" files to a single URL by using the same URL globbing style sup-\n"
+" You can specify one -T, --upload-file for each URL on the com-\n"
+" mand line. Each -T, --upload-file + URL pair specifies what to\n"
+" upload and to where. curl also supports \"globbing\" of the -T,\n"
+" --upload-file argument, meaning that you can upload multiple\n"
+" files to a single URL by using the same URL globbing style sup-\n"
" ported in the URL, like this:\n"
"\n"
+, stdout);
+ fputs(
" curl --upload-file \"{file1,file2}\" http://www.example.com\n"
"\n"
" or even\n"
"\n"
" curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"
-, stdout);
- fputs(
-" When uploading to an SMTP server: the uploaded data is assumed\n"
+" When uploading to an SMTP server: the uploaded data is assumed\n"
" to be RFC 5322 formatted. It has to feature the necessary set of\n"
-" headers and mail body formatted correctly by the user as curl\n"
+" headers and mail body formatted correctly by the user as curl\n"
" will not transcode nor encode it further in any way.\n"
"\n"
" --url <url>\n"
-" Specify a URL to fetch. This option is mostly handy when you\n"
+, stdout);
+ fputs(
+" Specify a URL to fetch. This option is mostly handy when you\n"
" want to specify URL(s) in a config file.\n"
"\n"
+" If the given URL is missing a scheme name (such as \"http://\" or\n"
+" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
+" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
+" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
, stdout);
fputs(
-" If the given URL is missing a scheme name (such as \"http://\" or\n"
-" \"ftp://\" etc) then curl will make a guess based on the host. If\n"
-" the outermost sub-domain name matches DICT, FTP, IMAP, LDAP,\n"
-" POP3 or SMTP then that protocol will be used, otherwise HTTP\n"
" will be used. Since 7.45.0 guessing can be disabled by setting a\n"
" default protocol, see --proto-default for details.\n"
"\n"
-, stdout);
- fputs(
-" This option may be used any number of times. To control where\n"
-" this URL is written, use the -o, --output or the -O, --remote-\n"
+" This option may be used any number of times. To control where\n"
+" this URL is written, use the -o, --output or the -O, --remote-\n"
" name options.\n"
"\n"
+" Warning: On Windows, particular file:// accesses can be con-\n"
+" verted to network accesses by the operating system. Beware!\n"
+"\n"
+, stdout);
+ fputs(
" -B, --use-ascii\n"
" (FTP LDAP) Enable ASCII transfer. For FTP, this can also be en-\n"
" forced by using a URL that ends with \";type=A\". This option\n"
" causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
" -A, --user-agent <name>\n"
-, stdout);
- fputs(
" (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
" To encode blanks in the string, surround the string with single\n"
+, stdout);
+ fputs(
" quote marks. This header can also be set with the -H, --header\n"
" or the --proxy-header options.\n"
"\n"
+" If you give an empty argument to -A, --user-agent (\"\"), it will\n"
+" remove the header completely from the request. If you prefer a\n"
+" blank header, you can set it to a single space (\" \").\n"
+"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" -u, --user <user:password>\n"
-" Specify the user name and password to use for server authentica-\n"
, stdout);
fputs(
+" Specify the user name and password to use for server authentica-\n"
" tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
" If you simply specify the user name, curl will prompt for a\n"
@@ -3728,27 +3989,27 @@ void hugehelp(void)
" which makes it impossible to use a colon in the user name with\n"
" this option. The password can, still.\n"
"\n"
-" On systems where it works, curl will hide the given option argu-\n"
, stdout);
fputs(
+" On systems where it works, curl will hide the given option argu-\n"
" ment from process listings. This is not enough to protect cre-\n"
" dentials from possibly getting seen by other users on the same\n"
" system as they will still be visible for a brief moment before\n"
" cleared. Such sensitive data should be retrieved from a file in-\n"
" stead or similar and never used in clear text in a command line.\n"
-" When using Kerberos V5 with a Windows based server you should\n"
, stdout);
fputs(
+" When using Kerberos V5 with a Windows based server you should\n"
" include the Windows domain name in the user name, in order for\n"
" the server to successfully obtain a Kerberos Ticket. If you\n"
" don't then the initial authentication handshake may fail.\n"
"\n"
" When using NTLM, the user name can be specified simply as the\n"
" user name, without the domain, if there is a single domain and\n"
-" forest in your setup for example.\n"
-"\n"
, stdout);
fputs(
+" forest in your setup for example.\n"
+"\n"
" To specify the domain name use either Down-Level Logon Name or\n"
" UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
" user@example.com respectively.\n"
@@ -3797,96 +4058,104 @@ void hugehelp(void)
fputs(
" libcurl reports to offer. Available features include:\n"
"\n"
-" IPv6 You can use IPv6 with this.\n"
-"\n"
-" krb4 Krb4 for FTP is supported.\n"
-"\n"
-" SSL SSL versions of various protocols are supported, such as\n"
-" HTTPS, FTPS, POP3S and so on.\n"
-"\n"
-" libz Automatic decompression of compressed files over HTTP is\n"
-" supported.\n"
-"\n"
-" NTLM NTLM authentication is supported.\n"
-"\n"
-, stdout);
- fputs(
-" Debug This curl uses a libcurl built with Debug. This enables\n"
-" more error-tracking and memory debugging etc. For curl-\n"
-" developers only!\n"
+" alt-svc\n"
+" Support for the Alt-Svc: header is provided.\n"
"\n"
" AsynchDNS\n"
" This curl uses asynchronous name resolves. Asynchronous\n"
" name resolves can be done using either the c-ares or the\n"
" threaded resolver backends.\n"
"\n"
-" SPNEGO SPNEGO authentication is supported.\n"
+" brotli Support for automatic brotli compression over HTTP(S).\n"
"\n"
+" CharConv\n"
, stdout);
fputs(
-" Largefile\n"
-" This curl supports transfers of large files, files larger\n"
-" than 2GB.\n"
+" curl was built with support for character set conversions\n"
+" (like EBCDIC)\n"
"\n"
-" IDN This curl supports IDN - international domain names.\n"
+" Debug This curl uses a libcurl built with Debug. This enables\n"
+" more error-tracking and memory debugging etc. For curl-\n"
+" developers only!\n"
"\n"
" GSS-API\n"
" GSS-API is supported.\n"
"\n"
-" SSPI SSPI is supported.\n"
-"\n"
-" TLS-SRP\n"
-" SRP (Secure Remote Password) authentication is supported\n"
-" for TLS.\n"
+" HTTP2 HTTP/2 support has been built-in.\n"
+" HTTP3 HTTP/3 support has been built-in.\n"
"\n"
, stdout);
fputs(
-" HTTP2 HTTP/2 support has been built-in.\n"
-"\n"
-" UnixSockets\n"
-" Unix sockets support is provided.\n"
-"\n"
" HTTPS-proxy\n"
" This curl is built to support HTTPS proxy.\n"
"\n"
-" Metalink\n"
-" This curl supports Metalink (both version 3 and 4 (RFC\n"
-" 5854)), which describes mirrors and hashes. curl will\n"
-" use mirrors for failover if there are errors (such as the\n"
+" IDN This curl supports IDN - international domain names.\n"
+"\n"
+" IPv6 You can use IPv6 with this.\n"
+"\n"
+" krb4 Krb4 for FTP is supported.\n"
+"\n"
+" Largefile\n"
+" This curl supports transfers of large files, files larger\n"
+" than 2GB.\n"
+"\n"
+" libz Automatic decompression of compressed files over HTTP is\n"
, stdout);
fputs(
-" file or server not being available).\n"
+" supported.\n"
+"\n"
+" Metalink\n"
+" This curl supports Metalink\n"
+"\n"
+" MultiSSL\n"
+" This curl supports multiple TLS backends.\n"
+"\n"
+" NTLM NTLM authentication is supported.\n"
+" NTLM NTLM authentication is supported.\n"
"\n"
" PSL PSL is short for Public Suffix List and means that this\n"
" curl has been built with knowledge about \"public suf-\n"
" fixes\".\n"
"\n"
-" MultiSSL\n"
-" This curl supports multiple TLS backends.\n"
+, stdout);
+ fputs(
+" SPNEGO SPNEGO authentication is supported.\n"
+"\n"
+" SSL SSL versions of various protocols are supported, such as\n"
+" HTTPS, FTPS, POP3S and so on.\n"
+"\n"
+" SSPI SSPI is supported.\n"
+"\n"
+" TLS-SRP\n"
+" SRP (Secure Remote Password) authentication is supported\n"
+" for TLS.\n"
+"\n"
+" UnixSockets\n"
+" Unix sockets support is provided.\n"
"\n"
" -w, --write-out <format>\n"
-" Make curl display information on stdout after a completed trans-\n"
, stdout);
fputs(
+" Make curl display information on stdout after a completed trans-\n"
" fer. The format is a string that may contain plain text mixed\n"
" with any number of variables. The format can be specified as a\n"
" literal \"string\", or you can have curl read the format from a\n"
" file with \"@filename\" and to tell curl to read the format from\n"
" stdin you write \"@-\".\n"
"\n"
-" The variables present in the output format will be substituted\n"
, stdout);
fputs(
+" The variables present in the output format will be substituted\n"
" by the value or text that curl thinks fit, as described below.\n"
" All variables are specified as %{variable_name} and to output a\n"
" normal % you just write them as %%. You can output a newline by\n"
" using \\n, a carriage return with \\r and a tab space with \\t.\n"
"\n"
" The output will be written to standard output, but this can be\n"
-" switched to standard error by using %{stderr}.\n"
-"\n"
, stdout);
fputs(
+" switched to standard error by using %{stderr}.\n"
+"\n"
" NOTE: The %-symbol is a special symbol in the win32-environment,\n"
" where all occurrences of % must be doubled when using this op-\n"
" tion.\n"
@@ -3897,18 +4166,18 @@ void hugehelp(void)
" there was any.\n"
"\n"
" filename_effective\n"
-" The ultimate filename that curl writes out to.\n"
, stdout);
fputs(
+" The ultimate filename that curl writes out to.\n"
" This is only meaningful if curl is told to write\n"
" to a file with the -O, --remote-name or -o,\n"
" --output option. It's most useful in combination\n"
" with the -J, --remote-header-name option. (Added\n"
" in 7.26.0)\n"
"\n"
-" ftp_entry_path The initial path curl ended up in when logging on\n"
, stdout);
fputs(
+" ftp_entry_path The initial path curl ended up in when logging on\n"
" to the remote FTP server. (Added in 7.15.4)\n"
"\n"
" http_code The numerical response code that was found in the\n"
@@ -3916,27 +4185,39 @@ void hugehelp(void)
" 7.18.2 the alias response_code was added to show\n"
" the same info.\n"
"\n"
-" http_connect The numerical code that was found in the last re-\n"
, stdout);
fputs(
+" http_connect The numerical code that was found in the last re-\n"
" sponse (from a proxy) to a curl CONNECT request.\n"
" (Added in 7.12.4)\n"
"\n"
" http_version The http version that was effectively used.\n"
" (Added in 7.50.0)\n"
"\n"
+" json A JSON object with all available keys.\n"
+"\n"
" local_ip The IP address of the local end of the most re-\n"
+, stdout);
+ fputs(
" cently done connection - can be either IPv4 or\n"
" IPv6 (Added in 7.29.0)\n"
"\n"
-, stdout);
- fputs(
" local_port The local port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-" num_connects Number of new connects made in the recent trans-\n"
+" method The http method used in the most recent HTTP re-\n"
+" quest (Added in 7.72.0)\n"
+"\n"
+" num_connects Number of new connects made in the recent trans-\n"
+, stdout);
+ fputs(
" fer. (Added in 7.12.3)\n"
"\n"
+" num_headers The number of response headers in the most recent\n"
+" request (restarted at each\n"
+" redirect). Note that the status line IS NOT a\n"
+" header. (Added in 7.73.0)\n"
+"\n"
" num_redirects Number of redirects that were followed in the re-\n"
" quest. (Added in 7.12.3)\n"
"\n"
@@ -3948,22 +4229,26 @@ void hugehelp(void)
" verification was successful. (Added in 7.52.0)\n"
"\n"
" redirect_url When an HTTP request was made without -L, --loca-\n"
-" tion to follow redirects (or when --max-redir is\n"
-" met), this variable will show the actual URL a\n"
+" tion to follow redirects (or when --max-redir is\n"
+" met), this variable will show the actual URL a\n"
, stdout);
fputs(
" redirect would have gone to. (Added in 7.18.2)\n"
"\n"
-" remote_ip The remote IP address of the most recently done\n"
+" remote_ip The remote IP address of the most recently done\n"
" connection - can be either IPv4 or IPv6 (Added in\n"
" 7.29.0)\n"
"\n"
-" remote_port The remote port number of the most recently done\n"
+" remote_port The remote port number of the most recently done\n"
" connection (Added in 7.29.0)\n"
"\n"
-" scheme The URL scheme (sometimes called protocol) that\n"
+" response_code The numerical response code that was found in the\n"
, stdout);
fputs(
+" last transfer (formerly known as \"http_code\").\n"
+" (Added in 7.18.2)\n"
+"\n"
+" scheme The URL scheme (sometimes called protocol) that\n"
" was effectively used (Added in 7.52.0)\n"
"\n"
" size_download The total amount of bytes that were downloaded.\n"
@@ -3971,102 +4256,102 @@ void hugehelp(void)
" size_header The total amount of bytes of the downloaded head-\n"
" ers.\n"
"\n"
-" size_request The total amount of bytes that were sent in the\n"
+, stdout);
+ fputs(
+" size_request The total amount of bytes that were sent in the\n"
" HTTP request.\n"
"\n"
" size_upload The total amount of bytes that were uploaded.\n"
"\n"
-, stdout);
- fputs(
" speed_download The average download speed that curl measured for\n"
" the complete download. Bytes per second.\n"
"\n"
-" speed_upload The average upload speed that curl measured for\n"
+" speed_upload The average upload speed that curl measured for\n"
" the complete upload. Bytes per second.\n"
"\n"
-" ssl_verify_result\n"
-" The result of the SSL peer certificate verifica-\n"
-" tion that was requested. 0 means the verification\n"
, stdout);
fputs(
+" ssl_verify_result\n"
+" The result of the SSL peer certificate verifica-\n"
+" tion that was requested. 0 means the verification\n"
" was successful. (Added in 7.19.0)\n"
"\n"
-" stderr From this point on, the -w, --write-out output\n"
-" will be written to standard error. (Added in\n"
+" stderr From this point on, the -w, --write-out output\n"
+" will be written to standard error. (Added in\n"
" 7.63.0)\n"
"\n"
-" stdout From this point on, the -w, --write-out output\n"
-" will be written to standard output. This is the\n"
-" default, but can be used to switch back after\n"
, stdout);
fputs(
+" stdout From this point on, the -w, --write-out output\n"
+" will be written to standard output. This is the\n"
+" default, but can be used to switch back after\n"
" switching to stderr. (Added in 7.63.0)\n"
"\n"
" time_appconnect\n"
-" The time, in seconds, it took from the start un-\n"
-" til the SSL/SSH/etc connect/handshake to the re-\n"
+" The time, in seconds, it took from the start un-\n"
+" til the SSL/SSH/etc connect/handshake to the re-\n"
+, stdout);
+ fputs(
" mote host was completed. (Added in 7.19.0)\n"
"\n"
-" time_connect The time, in seconds, it took from the start un-\n"
+" time_connect The time, in seconds, it took from the start un-\n"
" til the TCP connect to the remote host (or proxy)\n"
-, stdout);
- fputs(
" was completed.\n"
"\n"
" time_namelookup\n"
-" The time, in seconds, it took from the start un-\n"
+" The time, in seconds, it took from the start un-\n"
" til the name resolving was completed.\n"
"\n"
" time_pretransfer\n"
-" The time, in seconds, it took from the start un-\n"
-" til the file transfer was just about to begin.\n"
-" This includes all pre-transfer commands and nego-\n"
, stdout);
fputs(
+" The time, in seconds, it took from the start un-\n"
+" til the file transfer was just about to begin.\n"
+" This includes all pre-transfer commands and nego-\n"
" tiations that are specific to the particular pro-\n"
" tocol(s) involved.\n"
"\n"
" time_redirect The time, in seconds, it took for all redirection\n"
-" steps including name lookup, connect, pretransfer\n"
-" and transfer before the final transaction was\n"
-" started. time_redirect shows the complete execu-\n"
, stdout);
fputs(
-" tion time for multiple redirections. (Added in\n"
+" steps including name lookup, connect, pretransfer\n"
+" and transfer before the final transaction was\n"
+" started. time_redirect shows the complete execu-\n"
+" tion time for multiple redirections. (Added in\n"
" 7.12.3)\n"
"\n"
" time_starttransfer\n"
-" The time, in seconds, it took from the start un-\n"
-" til the first byte was just about to be trans-\n"
-" ferred. This includes time_pretransfer and also\n"
-" the time the server needed to calculate the re-\n"
+" The time, in seconds, it took from the start un-\n"
, stdout);
fputs(
+" til the first byte was just about to be trans-\n"
+" ferred. This includes time_pretransfer and also\n"
+" the time the server needed to calculate the re-\n"
" sult.\n"
"\n"
-" time_total The total time, in seconds, that the full opera-\n"
+" time_total The total time, in seconds, that the full opera-\n"
" tion lasted.\n"
"\n"
" url_effective The URL that was fetched last. This is most mean-\n"
-" ingful if you've told curl to follow location:\n"
+, stdout);
+ fputs(
+" ingful if you've told curl to follow location:\n"
" headers.\n"
"\n"
" If this option is used several times, the last one will be used.\n"
"\n"
" --xattr\n"
+" When saving output to a file, this option tells curl to store\n"
+" certain file metadata in extended file attributes. Currently,\n"
+" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
, stdout);
fputs(
-" When saving output to a file, this option tells curl to store\n"
-" certain file metadata in extended file attributes. Currently,\n"
-" the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
-" the content type is stored in the mime_type attribute. If the\n"
-" file system does not support extended attributes, a warning is\n"
+" the content type is stored in the mime_type attribute. If the\n"
+" file system does not support extended attributes, a warning is\n"
" issued.\n"
"\n"
"FILES\n"
" ~/.curlrc\n"
-, stdout);
- fputs(
" Default config file, see -K, --config for details.\n"
"\n"
"ENVIRONMENT\n"
@@ -4074,63 +4359,98 @@ void hugehelp(void)
" The lower case version has precedence. http_proxy is an exception as it\n"
" is only available in lower case.\n"
"\n"
-" Using an environment variable to set the proxy has the same effect as\n"
+, stdout);
+ fputs(
+" Using an environment variable to set the proxy has the same effect as\n"
" using the -x, --proxy option.\n"
"\n"
" http_proxy [protocol://]<host>[:port]\n"
" Sets the proxy server to use for HTTP.\n"
-, stdout);
- fputs(
" HTTPS_PROXY [protocol://]<host>[:port]\n"
" Sets the proxy server to use for HTTPS.\n"
"\n"
" [url-protocol]_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use for [url-protocol], where the pro-\n"
-" tocol is a protocol that curl supports and as specified in a\n"
+" Sets the proxy server to use for [url-protocol], where the pro-\n"
+, stdout);
+ fputs(
+" tocol is a protocol that curl supports and as specified in a\n"
" URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
"\n"
" ALL_PROXY [protocol://]<host>[:port]\n"
-" Sets the proxy server to use if no protocol-specific proxy is\n"
-, stdout);
- fputs(
+" Sets the proxy server to use if no protocol-specific proxy is\n"
" set.\n"
"\n"
" NO_PROXY <comma-separated list of hosts/domains>\n"
-" list of host names that shouldn't go through any proxy. If set\n"
+" list of host names that shouldn't go through any proxy. If set\n"
" to an asterisk '*' only, it matches all hosts. Each name in this\n"
+, stdout);
+ fputs(
" list is matched as either a domain name which contains the host-\n"
" name, or the hostname itself.\n"
"\n"
-" This environment variable disables use of the proxy even when\n"
+" This environment variable disables use of the proxy even when\n"
+" specified with the -x, --proxy option. That is NO_PROXY=di-\n"
+" rect.example.com curl -x http://proxy.example.com http://di-\n"
+" rect.example.com accesses the target URL directly, and\n"
, stdout);
fputs(
-" specified with the -x, --proxy option. That is NO_PROXY=di-\n"
-" rect.example.com curl -x http://proxy.example.com http://di-\n"
-" rect.example.com accesses the target URL directly, and\n"
-" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
+" NO_PROXY=direct.example.com curl -x http://proxy.example.com\n"
" http://somewhere.example.com accesses the target URL through the\n"
" proxy.\n"
"\n"
-" The list of host names can also be include numerical IP ad-\n"
+" The list of host names can also be include numerical IP ad-\n"
+" dresses, and IPv6 versions should then be given without enclos-\n"
+" ing brackets.\n"
+"\n"
+" IPv6 numerical addresses are compared as strings, so they will\n"
, stdout);
fputs(
-" dresses, and IPv6 versions should then be given without enclos-\n"
-" ing brackets.\n"
+" only match if the representations are the same: \"::1\" is the\n"
+" same as \"::0:1\" but they don't match.\n"
+"\n"
+" CURL_SSL_BACKEND <TLS backend>\n"
+" If curl was built with support for \"MultiSSL\", meaning that it\n"
+" has built-in support for more than one TLS backend, this envi-\n"
+" ronment variable can be set to the case insensitive name of the\n"
+" particular backend to use when curl is invoked. Setting a name\n"
+, stdout);
+ fputs(
+" that isn't a built-in alternative, will make curl stay with the\n"
+" default.\n"
+"\n"
+" QLOGDIR <directory name>\n"
+" If curl was built with HTTP/3 support, setting this environment\n"
+" variable to a local directory will make curl produce qlogs in\n"
+" that directory, using file names named after the destination\n"
+" connection id (in hex). Do note that these files can become\n"
+, stdout);
+ fputs(
+" rather large. Works with both QUIC backends.\n"
+"\n"
+" SSLKEYLOGFILE <file name>\n"
+" If you set this environment variable to a file name, curl will\n"
+" store TLS secrets from its connections in that file when invoked\n"
+" to enable you to analyze the TLS traffic in real time using net-\n"
+" work analyzing tools such as Wireshark. This works with the fol-\n"
+" lowing TLS backends: OpenSSL, libressl, BoringSSL, GnuTLS, NSS\n"
+, stdout);
+ fputs(
+" and wolfSSL.\n"
"\n"
"PROXY PROTOCOL PREFIXES\n"
-" Since curl version 7.21.7, the proxy string may be specified with a\n"
+" Since curl version 7.21.7, the proxy string may be specified with a\n"
" protocol:// prefix to specify alternative proxy protocols.\n"
"\n"
-" If no protocol is specified in the proxy string or if the string\n"
-" doesn't match a supported one, the proxy will be treated as an HTTP\n"
+" If no protocol is specified in the proxy string or if the string\n"
+" doesn't match a supported one, the proxy will be treated as an HTTP\n"
" proxy.\n"
"\n"
-, stdout);
- fputs(
" The supported proxy protocol prefixes are as follows:\n"
"\n"
" http://\n"
-" Makes it use it as an HTTP proxy. The default if no scheme pre-\n"
+, stdout);
+ fputs(
+" Makes it use it as an HTTP proxy. The default if no scheme pre-\n"
" fix is used.\n"
"\n"
" https://\n"
@@ -4146,12 +4466,12 @@ void hugehelp(void)
" Makes it the equivalent of --socks5\n"
"\n"
" socks5h://\n"
-, stdout);
- fputs(
" Makes it the equivalent of --socks5-hostname\n"
"\n"
"EXIT CODES\n"
-" There are a bunch of different error codes and their corresponding er-\n"
+, stdout);
+ fputs(
+" There are a bunch of different error codes and their corresponding er-\n"
" ror messages that may appear during bad conditions. At the time of this\n"
" writing, the exit codes are:\n"
"\n"
@@ -4162,77 +4482,77 @@ void hugehelp(void)
"\n"
" 3 URL malformed. The syntax was not correct.\n"
"\n"
+" 4 A feature or option that was needed to perform the desired re-\n"
, stdout);
fputs(
-" 4 A feature or option that was needed to perform the desired re-\n"
-" quest was not enabled or was explicitly disabled at build-time.\n"
+" quest was not enabled or was explicitly disabled at build-time.\n"
" To make curl able to do this, you probably need another build of\n"
" libcurl!\n"
"\n"
-" 5 Couldn't resolve proxy. The given proxy host could not be re-\n"
+" 5 Couldn't resolve proxy. The given proxy host could not be re-\n"
" solved.\n"
"\n"
" 6 Couldn't resolve host. The given remote host was not resolved.\n"
"\n"
" 7 Failed to connect to host.\n"
"\n"
-, stdout);
- fputs(
" 8 Weird server reply. The server sent data curl couldn't parse.\n"
"\n"
-" 9 FTP access denied. The server denied login or denied access to\n"
-" the particular resource or directory you wanted to reach. Most\n"
-" often you tried to change to a directory that doesn't exist on\n"
-" the server.\n"
-"\n"
-" 10 FTP accept failed. While waiting for the server to connect back\n"
-" when an active FTP session is used, an error code was sent over\n"
, stdout);
fputs(
+" 9 FTP access denied. The server denied login or denied access to\n"
+" the particular resource or directory you wanted to reach. Most\n"
+" often you tried to change to a directory that doesn't exist on\n"
+" the server.\n"
+"\n"
+" 10 FTP accept failed. While waiting for the server to connect back\n"
+" when an active FTP session is used, an error code was sent over\n"
" the control connection or similar.\n"
"\n"
-" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
+, stdout);
+ fputs(
+" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n"
" PASS request.\n"
"\n"
-" 12 During an active FTP session while waiting for the server to\n"
+" 12 During an active FTP session while waiting for the server to\n"
" connect back to curl, the timeout expired.\n"
"\n"
-" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
+" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n"
" PASV request.\n"
"\n"
-" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
-, stdout);
- fputs(
+" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n"
" server sent.\n"
"\n"
-" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
+, stdout);
+ fputs(
+" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n"
" 227-line.\n"
"\n"
" 16 HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
" This is somewhat generic and can be one out of several problems,\n"
" see the error message for details.\n"
"\n"
-" 17 FTP couldn't set binary. Couldn't change transfer method to bi-\n"
+" 17 FTP couldn't set binary. Couldn't change transfer method to bi-\n"
" nary.\n"
"\n"
-, stdout);
- fputs(
" 18 Partial file. Only a part of the file was transferred.\n"
"\n"
-" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
+, stdout);
+ fputs(
+" 19 FTP couldn't download/access the given file, the RETR (or simi-\n"
" lar) command failed.\n"
"\n"
" 21 FTP quote error. A quote command returned error from the server.\n"
-" 22 HTTP page not retrieved. The requested url was not found or re-\n"
-" turned another error with the HTTP error code being 400 or\n"
+" 22 HTTP page not retrieved. The requested url was not found or re-\n"
+" turned another error with the HTTP error code being 400 or\n"
" above. This return code only appears if -f, --fail is used.\n"
"\n"
, stdout);
fputs(
-" 23 Write error. Curl couldn't write data to a local filesystem or\n"
+" 23 Write error. Curl couldn't write data to a local filesystem or\n"
" similar.\n"
"\n"
-" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
+" 25 FTP couldn't STOR file. The server denied the STOR operation,\n"
" used for FTP uploading.\n"
"\n"
" 26 Read error. Various reading problems.\n"
@@ -4244,11 +4564,11 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
-" support the PORT command, try doing a transfer using PASV in-\n"
+" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n"
+" support the PORT command, try doing a transfer using PASV in-\n"
" stead!\n"
"\n"
-" 31 FTP couldn't use REST. The REST command failed. This command is\n"
+" 31 FTP couldn't use REST. The REST command failed. This command is\n"
" used for resumed FTP transfers.\n"
"\n"
" 33 HTTP range error. The range \"command\" didn't work.\n"
@@ -4259,7 +4579,7 @@ void hugehelp(void)
fputs(
" 35 SSL connect error. The SSL handshaking failed.\n"
"\n"
-" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
+" 36 Bad download resume. Couldn't continue an earlier aborted down-\n"
" load.\n"
"\n"
" 37 FILE couldn't read file. Failed to open the file. Permissions?\n"
@@ -4277,14 +4597,14 @@ void hugehelp(void)
"\n"
" 43 Internal error. A function was called with a bad parameter.\n"
"\n"
-" 45 Interface error. A specified outgoing interface could not be\n"
+" 45 Interface error. A specified outgoing interface could not be\n"
" used.\n"
"\n"
" 47 Too many redirects. When following redirects, curl hit the maxi-\n"
" mum amount.\n"
"\n"
-" 48 Unknown option specified to libcurl. This indicates that you\n"
-" passed a weird option to curl that was passed on to libcurl and\n"
+" 48 Unknown option specified to libcurl. This indicates that you\n"
+" passed a weird option to curl that was passed on to libcurl and\n"
, stdout);
fputs(
" rejected. Read up in the manual!\n"
@@ -4293,7 +4613,7 @@ void hugehelp(void)
"\n"
" 51 The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
"\n"
-" 52 The server didn't reply anything, which here is considered an\n"
+" 52 The server didn't reply anything, which here is considered an\n"
" error.\n"
"\n"
" 53 SSL crypto engine not found.\n"
@@ -4310,7 +4630,7 @@ void hugehelp(void)
"\n"
" 59 Couldn't use specified SSL cipher.\n"
"\n"
-" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
+" 60 Peer certificate cannot be authenticated with known CA certifi-\n"
" cates.\n"
"\n"
" 61 Unrecognized transfer encoding.\n"
@@ -4327,7 +4647,7 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
-" 67 The user name, password, or similar was not accepted and curl\n"
+" 67 The user name, password, or similar was not accepted and curl\n"
" failed to log in.\n"
"\n"
" 68 File not found on TFTP server.\n"
@@ -4358,7 +4678,7 @@ void hugehelp(void)
"\n"
" 80 Failed to shut down the SSL connection.\n"
"\n"
-" 82 Could not load CRL file, missing or wrong format (added in\n"
+" 82 Could not load CRL file, missing or wrong format (added in\n"
" 7.19.0).\n"
"\n"
" 83 Issuer check failed (added in 7.19.0).\n"
@@ -4385,6 +4705,19 @@ void hugehelp(void)
"\n"
, stdout);
fputs(
+" 93 An API function was called from inside a callback.\n"
+"\n"
+" 94 An authentication function returned an error.\n"
+"\n"
+" 95 A problem was detected in the HTTP/3 layer. This is somewhat\n"
+" generic and can be one out of several problems, see the error\n"
+" message for details.\n"
+"\n"
+" 96 QUIC connection error. This error may be caused by an SSL li-\n"
+" brary error. QUIC is the protocol used for HTTP/3 transfers.\n"
+"\n"
+, stdout);
+ fputs(
" XX More error codes will appear here in future releases. The exist-\n"
" ing ones are meant to never change.\n"
"\n"
@@ -4415,3984 +4748,4285 @@ void hugehelp(void) {}
#include "memdebug.h" /* keep this as LAST include */
static const unsigned char hugehelpgz[] = {
/* This mumbo-jumbo is the huge help text compressed with gzip.
- Thanks to this operation, the size of this data shrank from 170223
- to 47691 bytes. You can disable the use of compressed help
+ Thanks to this operation, the size of this data shrank from 182728
+ to 51301 bytes. You can disable the use of compressed help
texts by NOT passing -c to the mkhelp.pl tool. */
0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd,
- 0x6b, 0x77, 0xdc, 0xc6, 0xb1, 0x2e, 0xfc, 0xdd, 0xbf, 0x02, 0x9b, 0x59,
- 0x39, 0x24, 0x4f, 0x66, 0x86, 0x37, 0x5d, 0x2c, 0x45, 0xce, 0xb6, 0x22,
- 0x51, 0x36, 0xb7, 0x29, 0x91, 0x47, 0x43, 0xd9, 0xce, 0x89, 0xbd, 0xb4,
- 0x30, 0x33, 0x18, 0x12, 0xd1, 0x0c, 0x30, 0x01, 0x30, 0xbc, 0x64, 0x9f,
- 0x9c, 0xdf, 0xfe, 0x76, 0x3d, 0x55, 0xd5, 0xdd, 0x40, 0x37, 0x86, 0xb4,
- 0x63, 0xfb, 0xdc, 0xde, 0xec, 0xb5, 0x2d, 0x89, 0x04, 0x1a, 0x7d, 0xa9,
- 0xae, 0x7b, 0x3d, 0x95, 0x24, 0xf7, 0xfd, 0xef, 0x23, 0xfe, 0xff, 0xa3,
- 0xf9, 0x9f, 0xf9, 0xf3, 0xb3, 0x24, 0x39, 0xaf, 0xca, 0xbf, 0x65, 0xd3,
- 0x26, 0xfe, 0xec, 0xc7, 0x8f, 0xff, 0x23, 0xe1, 0xff, 0x33, 0xef, 0xfc,
- 0x60, 0xfe, 0xfc, 0x6c, 0xe3, 0xd8, 0x7b, 0x89, 0x7b, 0xe1, 0x7f, 0x7c,
- 0xdc, 0x4d, 0xee, 0x7b, 0xe1, 0x7f, 0x24, 0x3b, 0x78, 0xe1, 0xa3, 0x7c,
- 0xe1, 0x05, 0xfd, 0xfd, 0xe3, 0xc7, 0xcd, 0x1f, 0xf9, 0x81, 0x66, 0x45,
- 0xff, 0xd9, 0xa3, 0xf7, 0x7e, 0xf8, 0x48, 0x7f, 0x35, 0x3f, 0xf9, 0xec,
- 0xb3, 0x77, 0x2f, 0xdf, 0x1e, 0xeb, 0xab, 0xd3, 0x75, 0xb5, 0x48, 0x86,
- 0x49, 0x53, 0xa5, 0x45, 0x3d, 0xcf, 0xaa, 0x24, 0x4d, 0x3e, 0xbc, 0x3f,
- 0xfd, 0xec, 0xb3, 0xf1, 0x5f, 0xde, 0x9d, 0x9d, 0x8f, 0x4f, 0xc6, 0xad,
- 0xc7, 0xfe, 0x5a, 0xae, 0x9a, 0xbc, 0x2c, 0x6a, 0x33, 0x7d, 0xf3, 0x50,
- 0xfd, 0xe3, 0x67, 0x9f, 0xbd, 0x3e, 0x1e, 0xbf, 0x7a, 0x7f, 0x72, 0x7e,
- 0x71, 0x72, 0xf6, 0xae, 0xf5, 0x64, 0x92, 0xd7, 0x89, 0x19, 0xaa, 0x29,
- 0xcb, 0x85, 0xf9, 0x8f, 0x1b, 0x7d, 0x96, 0x36, 0x69, 0x32, 0xaf, 0xca,
- 0x65, 0x52, 0x56, 0xf4, 0x8b, 0x34, 0xa9, 0xb3, 0xea, 0x3a, 0xab, 0x06,
- 0xc9, 0xba, 0xce, 0x8b, 0xcb, 0xa4, 0x2c, 0xb2, 0xa4, 0x9c, 0x27, 0xcd,
- 0x55, 0xa6, 0xc3, 0xd5, 0xeb, 0xd5, 0xaa, 0xac, 0x9a, 0x6c, 0x96, 0xac,
- 0xaa, 0xb2, 0x29, 0xa7, 0xe5, 0xa2, 0x4e, 0x76, 0x5e, 0x9f, 0xbc, 0xba,
- 0x18, 0x24, 0x6f, 0x4e, 0x4e, 0x8f, 0xcd, 0x7f, 0x2f, 0xce, 0xf1, 0x9f,
- 0xf1, 0x20, 0xf9, 0xea, 0xec, 0xfc, 0xeb, 0xe3, 0xf7, 0x83, 0xe4, 0xeb,
- 0x0b, 0xfa, 0x19, 0xfd, 0xd7, 0xfc, 0x30, 0x39, 0x79, 0xfb, 0xf2, 0x7c,
- 0xa0, 0xc3, 0xd1, 0x3f, 0xe8, 0x87, 0xa7, 0xaf, 0xcd, 0x0f, 0xf9, 0x0f,
- 0xfa, 0xe7, 0xf9, 0xd9, 0xf9, 0x91, 0xfc, 0x41, 0xff, 0x7c, 0x7f, 0xf1,
- 0xd6, 0xfc, 0xf6, 0xfd, 0xc5, 0xd8, 0xfc, 0x77, 0xfc, 0x8a, 0xfe, 0x83,
- 0xaf, 0x8c, 0xdf, 0xfe, 0x19, 0xff, 0x19, 0xdb, 0xe1, 0xc6, 0x6f, 0xf9,
- 0xe7, 0xf8, 0xd2, 0xc5, 0xf1, 0xe9, 0xbb, 0xe3, 0x8b, 0x24, 0x2d, 0x66,
- 0xc9, 0x85, 0x79, 0x7e, 0x77, 0x94, 0x5c, 0x5c, 0x65, 0xc9, 0xb4, 0x5c,
- 0x2e, 0xe9, 0x47, 0x66, 0x47, 0x66, 0x59, 0x9d, 0x5f, 0x16, 0x66, 0x29,
- 0x66, 0xe5, 0x37, 0x65, 0xf5, 0x29, 0x49, 0x6e, 0xf2, 0xe6, 0xaa, 0x5c,
- 0x37, 0x3a, 0xdc, 0xda, 0xec, 0x46, 0x92, 0x17, 0x4d, 0x56, 0xa5, 0x53,
- 0xda, 0xe9, 0xd1, 0x67, 0xad, 0x5d, 0x2d, 0xe7, 0x66, 0x0f, 0x6b, 0xb3,
- 0x69, 0x93, 0x75, 0xbd, 0x28, 0xd3, 0x19, 0x6d, 0x95, 0x79, 0x65, 0xbe,
- 0x36, 0x9b, 0x5c, 0xe5, 0xd3, 0x4f, 0x75, 0xb2, 0xc8, 0x3f, 0x65, 0xb4,
- 0x51, 0xb7, 0x77, 0xba, 0x71, 0x03, 0x1e, 0x34, 0x5d, 0x9b, 0x3d, 0x2d,
- 0x86, 0x3a, 0x5c, 0x93, 0x4f, 0x53, 0xfa, 0x00, 0x76, 0x2e, 0x59, 0xaf,
- 0x68, 0x34, 0xde, 0xb1, 0x64, 0x55, 0xd6, 0xe6, 0xa5, 0xf1, 0xf8, 0xd4,
- 0xcc, 0xbc, 0x28, 0x32, 0xcc, 0xa3, 0x1e, 0x98, 0x7f, 0x94, 0x9f, 0xf2,
- 0xcc, 0xfc, 0x65, 0x9e, 0x2f, 0xb2, 0x84, 0x4f, 0xd4, 0x0e, 0x47, 0x47,
- 0x9b, 0x54, 0x59, 0xbd, 0x5e, 0x66, 0x66, 0xf7, 0xde, 0x66, 0x4d, 0xba,
- 0xc8, 0x8b, 0x4f, 0xe6, 0xaf, 0xb4, 0xf0, 0x65, 0x59, 0x65, 0xa3, 0xe4,
- 0x65, 0x9d, 0xdc, 0x95, 0x6b, 0xb3, 0xe0, 0xc5, 0xc2, 0x9c, 0x79, 0x96,
- 0x4c, 0xb2, 0x45, 0x79, 0x33, 0xa0, 0x93, 0x4e, 0x8a, 0xf5, 0x72, 0x62,
- 0x06, 0x28, 0xe7, 0x6e, 0xb8, 0xb4, 0x59, 0x9b, 0xe1, 0xf8, 0xe9, 0x65,
- 0x6a, 0xd6, 0x64, 0xde, 0xad, 0x92, 0xab, 0xcc, 0xac, 0xb9, 0x5e, 0xe5,
- 0xc5, 0xbf, 0xb5, 0xf7, 0xc5, 0x6c, 0xed, 0xaa, 0xbc, 0xc9, 0x2a, 0xb3,
- 0xb3, 0x93, 0xbb, 0xc4, 0x6c, 0xc2, 0x84, 0x89, 0x70, 0x6e, 0x88, 0x2c,
- 0x49, 0xcd, 0x10, 0x96, 0x00, 0x87, 0x55, 0xb6, 0x48, 0x89, 0x98, 0xec,
- 0x37, 0x46, 0xe6, 0x10, 0x33, 0x4b, 0x6d, 0xf2, 0xea, 0xce, 0xd1, 0x2e,
- 0x5e, 0x9e, 0x99, 0x95, 0xe4, 0x8b, 0xda, 0x1c, 0x03, 0x5d, 0x0a, 0x79,
- 0x86, 0x0e, 0x95, 0xe8, 0xdf, 0xd0, 0xe6, 0x5d, 0xd1, 0xa4, 0xb7, 0xf8,
- 0xbc, 0xd0, 0xe6, 0x70, 0x96, 0xad, 0xb2, 0x62, 0x96, 0x15, 0xcd, 0x28,
- 0xf9, 0x4b, 0xb9, 0xde, 0x36, 0xdf, 0x9e, 0xe7, 0x66, 0x0f, 0x52, 0x19,
- 0xca, 0x7c, 0xd9, 0x10, 0xc1, 0xb4, 0xca, 0x57, 0xde, 0x51, 0x94, 0x85,
- 0x39, 0xf3, 0xe4, 0xfd, 0x9b, 0x57, 0xc9, 0xd1, 0xb3, 0xcf, 0x9f, 0xb8,
- 0x33, 0x37, 0x03, 0x24, 0xd3, 0xb4, 0x30, 0x2b, 0xce, 0xa6, 0xf9, 0xfc,
- 0x2e, 0x59, 0xae, 0x17, 0x4d, 0xbe, 0x32, 0xbb, 0x4f, 0x97, 0x8f, 0x2e,
- 0xd0, 0x2a, 0xad, 0x9a, 0x9a, 0x88, 0x00, 0x3f, 0xc0, 0xda, 0x6f, 0xaa,
- 0xbc, 0xa1, 0x8b, 0x84, 0xdf, 0x99, 0x19, 0x66, 0x4d, 0xad, 0xc3, 0x11,
- 0xad, 0x99, 0xef, 0x4c, 0x0c, 0x6d, 0x99, 0xad, 0x4d, 0x6b, 0xf3, 0xd1,
- 0xe7, 0x9f, 0x39, 0x0e, 0x72, 0xd5, 0x34, 0xab, 0xe7, 0x7b, 0x7b, 0x75,
- 0xde, 0x64, 0xa3, 0xff, 0x34, 0xf7, 0x70, 0xd0, 0xdc, 0x94, 0x83, 0xe6,
- 0xaa, 0xca, 0xb2, 0x7f, 0x8e, 0x0c, 0x0d, 0xdb, 0x27, 0xcd, 0x77, 0xef,
- 0x64, 0x62, 0x97, 0x59, 0x63, 0xbe, 0xf0, 0xf7, 0x75, 0x56, 0xd0, 0x88,
- 0x66, 0x1e, 0xe9, 0x62, 0x75, 0x95, 0x9a, 0xe3, 0xcc, 0x0c, 0x35, 0xd2,
- 0xcd, 0x36, 0x04, 0x43, 0xb3, 0xe2, 0xbb, 0xfd, 0xd7, 0x1f, 0xc3, 0x8f,
- 0xce, 0xf1, 0x4d, 0xf3, 0xdf, 0x51, 0x76, 0x9b, 0x2e, 0xcd, 0xda, 0xe8,
- 0x53, 0x7b, 0x44, 0x62, 0x7f, 0x3d, 0x18, 0x1e, 0xec, 0xef, 0xff, 0x38,
- 0x6a, 0x6e, 0x9b, 0x87, 0x3d, 0xbf, 0xbf, 0xef, 0xde, 0xa0, 0x47, 0x77,
- 0x68, 0xbd, 0xc9, 0xc2, 0x90, 0x0c, 0x7d, 0xfc, 0x1f, 0x59, 0x55, 0xd6,
- 0xbb, 0x0f, 0x1b, 0x29, 0x1d, 0xfe, 0xa3, 0xfd, 0xdd, 0x77, 0x59, 0x0d,
- 0x9a, 0x71, 0x6b, 0x4d, 0xd2, 0xca, 0xd0, 0x6d, 0xd9, 0x38, 0xf6, 0x34,
- 0x30, 0x97, 0xb2, 0xb1, 0x3b, 0x63, 0xee, 0x9c, 0x79, 0xda, 0x30, 0xb6,
- 0x74, 0x41, 0x3c, 0xad, 0x4e, 0x8a, 0xec, 0xd6, 0xde, 0x72, 0x73, 0xfb,
- 0xb3, 0x74, 0x7a, 0x95, 0x94, 0x86, 0xf8, 0xab, 0xc8, 0x11, 0xf8, 0x13,
- 0x4a, 0xab, 0xe9, 0x55, 0x7e, 0x6d, 0x76, 0xe3, 0xd9, 0xb3, 0x27, 0x43,
- 0xf3, 0x9f, 0x67, 0x3f, 0xee, 0x5d, 0x97, 0x0b, 0xb3, 0x39, 0x8f, 0x7e,
- 0xdc, 0xa3, 0x23, 0xfe, 0xcf, 0x74, 0x30, 0x19, 0x4c, 0xff, 0x39, 0xba,
- 0x6a, 0x96, 0x8b, 0x5e, 0xc2, 0x49, 0x0b, 0xf3, 0xff, 0xcb, 0x72, 0x5d,
- 0x34, 0x96, 0x58, 0x0c, 0xcd, 0x35, 0x1e, 0x73, 0x32, 0xd7, 0xd5, 0xdc,
- 0x51, 0x22, 0x6d, 0xa2, 0x21, 0xba, 0x75, 0xe6, 0x82, 0xba, 0xeb, 0xd8,
- 0x4c, 0xaf, 0x68, 0xfd, 0x86, 0x7a, 0x52, 0xd9, 0x84, 0x26, 0x4f, 0xe9,
- 0x66, 0x1a, 0x06, 0x41, 0x0c, 0x0b, 0x63, 0xf1, 0xd7, 0x72, 0xf3, 0x60,
- 0x59, 0xcd, 0xb2, 0x6a, 0xd4, 0x9d, 0x86, 0xbd, 0xb2, 0xde, 0x37, 0x13,
- 0x95, 0x28, 0xf4, 0x03, 0x4c, 0x6c, 0x99, 0xdf, 0x9a, 0x11, 0xc0, 0x30,
- 0x0b, 0x4c, 0x9c, 0x47, 0x4b, 0x68, 0xc6, 0xf8, 0x8c, 0xbe, 0xef, 0xae,
- 0xac, 0x99, 0x7a, 0x6b, 0xe9, 0xf8, 0xa8, 0x5b, 0x7c, 0x62, 0x0e, 0x6f,
- 0x65, 0xde, 0x5a, 0x13, 0x5f, 0xc5, 0xb5, 0xa6, 0x61, 0x0c, 0x43, 0xb8,
- 0x34, 0xe7, 0x62, 0xce, 0x82, 0xa8, 0x98, 0x8e, 0xea, 0x2e, 0x79, 0x67,
- 0x08, 0x86, 0x99, 0x91, 0x47, 0xec, 0x8b, 0xac, 0x69, 0xee, 0x3d, 0x26,
- 0x47, 0xb1, 0xcf, 0x0f, 0x02, 0xa2, 0xed, 0x7b, 0xde, 0xd0, 0xd9, 0xf3,
- 0xc3, 0xf6, 0xc3, 0xdf, 0x19, 0x26, 0xed, 0xae, 0x8b, 0xf9, 0xfa, 0x7f,
- 0xfe, 0xd3, 0xa3, 0xba, 0x1b, 0xfa, 0x6d, 0x5e, 0x5c, 0x97, 0x9f, 0xcc,
- 0x16, 0x41, 0x8a, 0xa6, 0xed, 0xdd, 0x24, 0x3e, 0xb4, 0x5c, 0x35, 0x56,
- 0x3c, 0x11, 0x39, 0x9a, 0x1f, 0x4d, 0xd2, 0xc9, 0xe2, 0x2e, 0xb9, 0x4a,
- 0xaf, 0x33, 0x5a, 0xef, 0xca, 0xd0, 0x29, 0xed, 0x80, 0x11, 0x1b, 0x0b,
- 0xf0, 0x31, 0x61, 0x0c, 0xb3, 0x72, 0x3d, 0x31, 0xcc, 0xe5, 0xef, 0xeb,
- 0xb2, 0xe1, 0x8d, 0x49, 0xaf, 0xcb, 0x7c, 0xd6, 0x92, 0xc5, 0x57, 0x19,
- 0x31, 0x34, 0xfa, 0x30, 0x84, 0x94, 0x61, 0xa8, 0x34, 0x53, 0x5c, 0xb4,
- 0xbc, 0x21, 0x71, 0x67, 0x58, 0x61, 0xba, 0xa8, 0xcb, 0x24, 0xb9, 0x2c,
- 0xe9, 0x96, 0x80, 0x01, 0x83, 0xcc, 0xcd, 0xa1, 0x5c, 0xa5, 0x24, 0xd5,
- 0x8c, 0x00, 0xb3, 0xf7, 0xa0, 0xca, 0xc0, 0x8b, 0x71, 0x52, 0xe9, 0x62,
- 0xc0, 0xd2, 0x8b, 0xde, 0x91, 0xad, 0x4a, 0xb6, 0xff, 0xcb, 0xf6, 0x20,
- 0xd9, 0xfe, 0xf7, 0x6d, 0xd0, 0xc3, 0xf6, 0x7f, 0xdd, 0x76, 0xe7, 0x6c,
- 0x94, 0xb1, 0xeb, 0x7c, 0x96, 0x31, 0x49, 0x9c, 0x9c, 0x5f, 0x3f, 0x49,
- 0xfe, 0x41, 0xba, 0x83, 0xe1, 0xb5, 0xd9, 0xad, 0x12, 0xa4, 0xae, 0xcd,
- 0xbc, 0x9d, 0x18, 0xa6, 0x9b, 0xae, 0x48, 0x89, 0xc8, 0xaa, 0xa9, 0xa1,
- 0xde, 0xf4, 0xd2, 0xd0, 0xab, 0x91, 0xc5, 0x3a, 0x1c, 0x8d, 0x4f, 0xaf,
- 0xf0, 0xb2, 0x0c, 0x83, 0x4c, 0x8a, 0x74, 0x69, 0x6e, 0xc4, 0x29, 0xcd,
- 0x28, 0x2f, 0xc2, 0xc3, 0xfc, 0xeb, 0x3c, 0xfb, 0x7c, 0xff, 0xf9, 0xf3,
- 0xa3, 0xdf, 0x1f, 0x3e, 0xce, 0x9a, 0xab, 0xfd, 0x1f, 0xf7, 0xec, 0x23,
- 0x27, 0x73, 0x6c, 0xbb, 0x92, 0x9f, 0x4e, 0xc2, 0x48, 0x79, 0x2b, 0x25,
- 0xcc, 0xfb, 0xe6, 0xef, 0xd9, 0x3c, 0xbf, 0x1d, 0xa8, 0xbe, 0xc4, 0x77,
- 0x2e, 0x35, 0xa4, 0x66, 0xce, 0x8f, 0x58, 0x84, 0x0e, 0x77, 0xb9, 0xce,
- 0x6a, 0xb3, 0x93, 0x37, 0x57, 0x69, 0x93, 0xd8, 0x01, 0xf8, 0x64, 0x97,
- 0xf9, 0xe5, 0x55, 0x93, 0xdc, 0xa4, 0x24, 0x6c, 0x4e, 0x1a, 0x1e, 0x82,
- 0xa4, 0xbc, 0x11, 0x31, 0xf3, 0xd4, 0xc8, 0x0a, 0x3a, 0x43, 0x88, 0xf4,
- 0x89, 0xd3, 0x30, 0x1a, 0x43, 0xe6, 0x7c, 0x20, 0x4e, 0x9d, 0x9a, 0xa4,
- 0x35, 0x5d, 0xda, 0xc2, 0x30, 0x87, 0xc6, 0xe8, 0x08, 0x6b, 0xfa, 0xd7,
- 0x95, 0xd1, 0x02, 0xb0, 0x07, 0x32, 0x51, 0x08, 0xca, 0x37, 0x74, 0x9c,
- 0x74, 0x36, 0x56, 0x78, 0x99, 0x43, 0x1a, 0xc8, 0x31, 0xdb, 0x37, 0x6a,
- 0x73, 0xe1, 0x0c, 0x67, 0xb2, 0x94, 0xb1, 0x45, 0x4c, 0x76, 0x8b, 0xd7,
- 0x89, 0x39, 0xa6, 0x35, 0x29, 0x0a, 0xac, 0x0e, 0x98, 0xc9, 0x7b, 0x8b,
- 0x35, 0x9b, 0x96, 0x7e, 0x22, 0x95, 0xa4, 0xa3, 0xf8, 0xe0, 0xb5, 0x59,
- 0x69, 0x88, 0xcc, 0xcc, 0xd6, 0x30, 0x63, 0x5a, 0x19, 0xb1, 0x58, 0xec,
- 0x0a, 0x88, 0xdc, 0x8c, 0x49, 0x3f, 0xcc, 0x1b, 0x92, 0x31, 0xd0, 0x61,
- 0xcd, 0x7c, 0xcd, 0xa6, 0x40, 0x11, 0x35, 0x8c, 0xda, 0x5b, 0x3f, 0xc4,
- 0xa3, 0x79, 0x36, 0xb9, 0x36, 0x5a, 0x8a, 0x51, 0x48, 0x33, 0xfb, 0x16,
- 0xe4, 0xf9, 0x94, 0x74, 0xa3, 0x85, 0xb9, 0x2f, 0xd3, 0xb2, 0xaa, 0x48,
- 0xdf, 0xa7, 0x13, 0x9c, 0x30, 0x13, 0x5d, 0x66, 0x46, 0x8d, 0xf0, 0xb7,
- 0x33, 0x27, 0x81, 0x66, 0xf8, 0x8b, 0xd1, 0x4b, 0xc0, 0x41, 0x8c, 0xfe,
- 0x00, 0x9e, 0x8f, 0x85, 0x63, 0x76, 0x34, 0xf6, 0x74, 0x9a, 0xad, 0x9a,
- 0x3a, 0xb6, 0x26, 0x3d, 0x70, 0x33, 0x9d, 0x2a, 0xa3, 0x9d, 0xf7, 0x95,
- 0x2e, 0xec, 0xab, 0x15, 0xfa, 0xd0, 0xbb, 0x54, 0x8f, 0x31, 0x7a, 0x58,
- 0x6d, 0x77, 0xad, 0x01, 0x6d, 0x18, 0x36, 0x86, 0x3d, 0x5f, 0xd2, 0x44,
- 0xe9, 0xe1, 0x9a, 0x6f, 0x2a, 0x58, 0x33, 0x1d, 0x24, 0x6b, 0xda, 0xfc,
- 0x5d, 0x12, 0x5d, 0x66, 0x3f, 0xed, 0xe0, 0xe6, 0xab, 0xf6, 0x4c, 0xe9,
- 0xf3, 0xa4, 0xe2, 0x1b, 0x49, 0x3e, 0xab, 0xaf, 0x8c, 0xf2, 0x55, 0xcb,
- 0xcd, 0xce, 0x97, 0x86, 0x66, 0xae, 0xe9, 0x7c, 0x57, 0x59, 0x36, 0x1b,
- 0x25, 0x67, 0x73, 0xe2, 0xaa, 0x95, 0x99, 0x74, 0x83, 0x5f, 0x93, 0x54,
- 0x31, 0xfb, 0x36, 0x83, 0x12, 0x6f, 0xaf, 0x16, 0x4f, 0xc5, 0x93, 0x0e,
- 0xe0, 0xe4, 0xa9, 0xf9, 0x89, 0x99, 0xed, 0xa2, 0x2d, 0x82, 0x70, 0x0f,
- 0x0d, 0xf7, 0xa6, 0xe9, 0x4d, 0xb2, 0x04, 0x94, 0x38, 0xc9, 0x9a, 0x9b,
- 0x2c, 0xb3, 0xc3, 0xd5, 0x99, 0x11, 0x7b, 0x74, 0x68, 0xac, 0xf9, 0x81,
- 0x19, 0xd2, 0xd6, 0x9e, 0xbf, 0x3f, 0xfb, 0xea, 0xfd, 0xf1, 0x78, 0x9c,
- 0xbc, 0x3d, 0xbe, 0x38, 0x7e, 0xdf, 0xda, 0xe9, 0xa2, 0xac, 0x96, 0x38,
- 0xd1, 0x59, 0x5e, 0xaf, 0x16, 0xe9, 0x1d, 0x1d, 0xb5, 0x59, 0xc9, 0x65,
- 0x45, 0x37, 0x6b, 0x99, 0x91, 0x54, 0x98, 0xad, 0xc1, 0xc9, 0x8c, 0x38,
- 0x32, 0xc7, 0x27, 0x1a, 0x2f, 0x31, 0x13, 0xa8, 0xc9, 0xc5, 0xa5, 0xdb,
- 0x69, 0xc3, 0x71, 0x44, 0x92, 0x92, 0x28, 0xb5, 0xe7, 0x41, 0xaa, 0x27,
- 0x8c, 0x9b, 0x81, 0xfb, 0x19, 0x6f, 0x13, 0x8b, 0x36, 0x43, 0xb3, 0xf9,
- 0x12, 0xcc, 0xce, 0xfc, 0xe9, 0xb4, 0xcd, 0x6c, 0x6e, 0x54, 0x6d, 0x23,
- 0x5d, 0xd9, 0x52, 0xe8, 0xce, 0x49, 0x67, 0x6b, 0xf5, 0x63, 0x43, 0x86,
- 0xc4, 0x9a, 0x69, 0x40, 0x9e, 0x0a, 0x7f, 0xc1, 0x32, 0x31, 0xa3, 0x93,
- 0x10, 0xef, 0x93, 0xc7, 0x56, 0x34, 0x85, 0xcc, 0x9c, 0xec, 0x8c, 0x87,
- 0xaf, 0xd7, 0x73, 0x5c, 0xe4, 0x64, 0xc7, 0x68, 0xe6, 0x6f, 0x8d, 0xb5,
- 0x64, 0x2c, 0x96, 0x41, 0x72, 0xbe, 0x8b, 0xf7, 0x0e, 0xf6, 0x0f, 0x1f,
- 0x31, 0x23, 0x18, 0xe9, 0x70, 0x6f, 0x3c, 0x46, 0x7c, 0xf0, 0x89, 0x8e,
- 0x97, 0x1f, 0xa2, 0xc1, 0x47, 0xc9, 0xc1, 0x5b, 0xfe, 0xc9, 0xa3, 0xcf,
- 0x1f, 0x3f, 0x7d, 0x22, 0x3f, 0x6c, 0x13, 0xb8, 0x9d, 0x3f, 0xa8, 0x03,
- 0x96, 0x1f, 0x99, 0x82, 0x66, 0x26, 0x66, 0x75, 0xcb, 0xbc, 0x30, 0xd7,
- 0xc4, 0x5c, 0x2b, 0xe1, 0x55, 0x44, 0xcf, 0x66, 0xf2, 0x73, 0xe6, 0x6c,
- 0x72, 0xae, 0x6d, 0x93, 0xd2, 0xbc, 0x6c, 0x48, 0xd6, 0xf0, 0x72, 0x7b,
- 0x48, 0xac, 0x26, 0x34, 0x34, 0x91, 0x74, 0x42, 0x0c, 0x96, 0xec, 0x2a,
- 0xa3, 0x00, 0x67, 0xd1, 0xaf, 0x59, 0xa9, 0x68, 0xde, 0x30, 0x73, 0x33,
- 0x32, 0x91, 0xc4, 0x5c, 0xb8, 0xef, 0x86, 0x15, 0x80, 0x43, 0xde, 0xe4,
- 0x35, 0x58, 0xc3, 0x4d, 0xb9, 0x5e, 0x18, 0x2b, 0x86, 0x1e, 0x58, 0xaf,
- 0xf0, 0x82, 0xf9, 0xd4, 0xca, 0xf1, 0x00, 0xa3, 0xb1, 0x10, 0xed, 0x74,
- 0x47, 0x31, 0x53, 0x33, 0xff, 0x5c, 0x19, 0x52, 0xe2, 0xe9, 0x8c, 0xba,
- 0x12, 0x02, 0xbc, 0x2f, 0xa0, 0x44, 0xba, 0xf3, 0x60, 0xda, 0xe7, 0x67,
- 0xe3, 0x0b, 0xd2, 0x00, 0xce, 0x3f, 0x5c, 0x98, 0x81, 0x8c, 0x0a, 0x50,
- 0x37, 0x86, 0x28, 0xe9, 0xc5, 0x22, 0x83, 0x09, 0xa9, 0xc3, 0x19, 0xda,
- 0xcb, 0xc1, 0xa8, 0xa0, 0xd6, 0xe8, 0x27, 0x79, 0x8e, 0x6c, 0x63, 0xd3,
- 0x15, 0x54, 0x0b, 0x9b, 0x65, 0xb8, 0x7d, 0x27, 0xd9, 0xf9, 0xd3, 0xae,
- 0xa1, 0xd9, 0x61, 0x69, 0x77, 0x67, 0x38, 0x94, 0x57, 0xcd, 0xb7, 0xeb,
- 0x7c, 0x99, 0x2f, 0xd2, 0xca, 0x9b, 0x3a, 0x73, 0x54, 0xba, 0x9f, 0x96,
- 0xaf, 0x4c, 0x0d, 0xd5, 0x60, 0xda, 0xce, 0x94, 0xa4, 0x3d, 0x04, 0x57,
- 0x72, 0x47, 0x35, 0x23, 0x85, 0x00, 0x1a, 0xf3, 0x2a, 0xb7, 0x5b, 0x47,
- 0x67, 0x46, 0xec, 0xaa, 0xb5, 0x51, 0xdd, 0x73, 0x0b, 0x36, 0x8e, 0x24,
- 0x12, 0x3c, 0x15, 0x76, 0xeb, 0x92, 0xad, 0x49, 0x5a, 0x6d, 0x25, 0x96,
- 0x17, 0xf3, 0xdd, 0xa4, 0x1b, 0x52, 0x65, 0x97, 0x6b, 0xb3, 0x82, 0x84,
- 0x77, 0x97, 0x56, 0xfa, 0x3b, 0x6f, 0xa5, 0x3a, 0xc0, 0x70, 0x42, 0x8f,
- 0xe4, 0x35, 0x9b, 0x99, 0x73, 0x63, 0xb7, 0xd0, 0xa5, 0x51, 0xfd, 0x15,
- 0x1a, 0x8d, 0x50, 0x4c, 0x84, 0x60, 0x3c, 0xbd, 0xd6, 0x5c, 0x95, 0x26,
- 0x33, 0x8c, 0x06, 0xec, 0x9f, 0x9e, 0x1c, 0x9a, 0x23, 0x1b, 0x0e, 0x6b,
- 0xb3, 0xff, 0xa4, 0x7b, 0xaf, 0xc4, 0xa6, 0x3f, 0x83, 0xc3, 0xc4, 0xfa,
- 0x56, 0xce, 0x44, 0x07, 0x86, 0xd8, 0xe4, 0x77, 0xc1, 0x42, 0x8d, 0xa2,
- 0x7a, 0x63, 0x3e, 0x9c, 0x9a, 0x23, 0x33, 0x17, 0xee, 0x2d, 0x6d, 0x14,
- 0xfb, 0x46, 0x12, 0xab, 0x36, 0x83, 0x32, 0x72, 0xba, 0xf7, 0xa9, 0xd3,
- 0x65, 0x66, 0xb3, 0x9c, 0x7e, 0x6b, 0xee, 0x97, 0x91, 0x70, 0xeb, 0x0c,
- 0xb6, 0x87, 0x6c, 0xea, 0xd2, 0x6d, 0x26, 0xcc, 0xd8, 0xfa, 0xaa, 0x24,
- 0x33, 0x71, 0x8b, 0x79, 0xf1, 0x90, 0xbe, 0xb5, 0x05, 0x79, 0xbe, 0x4c,
- 0xf4, 0x5b, 0xf2, 0x29, 0xb3, 0x8e, 0x99, 0xaf, 0x9b, 0x0d, 0x8c, 0xa0,
- 0xb9, 0xf3, 0x8c, 0x04, 0xf0, 0x6a, 0x9e, 0x7b, 0x65, 0x15, 0x1e, 0x23,
- 0x52, 0x57, 0xa4, 0x4c, 0x09, 0x0f, 0x87, 0x30, 0xc4, 0x95, 0xad, 0x79,
- 0x6a, 0x03, 0xb3, 0xb7, 0xf4, 0xe4, 0xe5, 0x95, 0x3e, 0xea, 0x09, 0xd6,
- 0xd4, 0x2c, 0x8e, 0x84, 0x03, 0xd9, 0xd3, 0x33, 0xe5, 0xfb, 0x65, 0xc5,
- 0xcc, 0x6c, 0x51, 0x1a, 0x5a, 0xde, 0x62, 0x95, 0x55, 0xa6, 0x4d, 0xb3,
- 0xa6, 0x59, 0xd2, 0x8e, 0xb3, 0x9f, 0xa9, 0xb4, 0x67, 0x63, 0x27, 0x2d,
- 0xfb, 0x55, 0xdf, 0x3b, 0x35, 0xb7, 0x51, 0x63, 0xec, 0x91, 0x11, 0x9d,
- 0x35, 0xd1, 0xb1, 0xee, 0x3c, 0xc8, 0xdb, 0x88, 0xba, 0xed, 0x86, 0xef,
- 0x23, 0x6c, 0xac, 0xce, 0xce, 0xd7, 0x20, 0x1f, 0x11, 0x64, 0x76, 0x65,
- 0x66, 0x45, 0xb3, 0x3c, 0x05, 0x9d, 0xf0, 0xd1, 0x40, 0x19, 0x71, 0x16,
- 0x61, 0x44, 0x0f, 0xbe, 0xeb, 0x1a, 0x74, 0x8b, 0x85, 0x2f, 0x92, 0x74,
- 0x4e, 0xc3, 0x33, 0xb3, 0xf6, 0x53, 0xac, 0x63, 0x78, 0x9d, 0xd0, 0xf5,
- 0x33, 0x66, 0x03, 0xdd, 0xc5, 0xe1, 0xd9, 0xe9, 0xb5, 0x77, 0x8d, 0xc8,
- 0x72, 0x2f, 0x48, 0x4f, 0x19, 0xc0, 0x3b, 0x32, 0x29, 0x4b, 0x63, 0x26,
- 0xbb, 0xa5, 0x91, 0x3c, 0xc8, 0x0a, 0xa2, 0x76, 0x39, 0x51, 0xc3, 0x12,
- 0x56, 0x96, 0xdf, 0xde, 0x19, 0x73, 0x29, 0xbd, 0x4c, 0x73, 0x4b, 0x6f,
- 0x72, 0x33, 0x66, 0x89, 0x3e, 0x5c, 0x94, 0xf2, 0x3c, 0x1d, 0x15, 0xa9,
- 0x40, 0xc2, 0xb7, 0xd6, 0x35, 0x5f, 0x1f, 0xb3, 0x2a, 0xc3, 0x79, 0xc0,
- 0x3b, 0x64, 0x5c, 0x52, 0x1b, 0x75, 0xb8, 0x09, 0x14, 0x65, 0xd2, 0x39,
- 0xc1, 0x7c, 0xa1, 0x41, 0x9a, 0x11, 0xb7, 0x46, 0xc9, 0xd7, 0xe5, 0x4d,
- 0x06, 0x5f, 0x21, 0xf4, 0xfb, 0x9c, 0xbc, 0x5d, 0x46, 0x15, 0xbc, 0xc9,
- 0x92, 0xa5, 0x51, 0x3d, 0xcd, 0x6e, 0x42, 0xfb, 0xc0, 0xcf, 0x3c, 0xf3,
- 0xd0, 0x50, 0xf8, 0x0d, 0xef, 0x92, 0x5d, 0x85, 0x3d, 0xca, 0x39, 0x5f,
- 0x89, 0x64, 0x07, 0xea, 0xcd, 0x94, 0x76, 0x6b, 0xd5, 0xb8, 0x55, 0xd8,
- 0x0d, 0xb9, 0x49, 0x6b, 0xef, 0x72, 0x65, 0x30, 0x4d, 0x9f, 0x8e, 0x0e,
- 0x9e, 0x8d, 0xf6, 0x47, 0xc6, 0x10, 0xc9, 0xae, 0xf3, 0x72, 0x5d, 0x9b,
- 0x4f, 0xd3, 0x34, 0xdc, 0x3b, 0x19, 0xdd, 0xca, 0xa6, 0xbc, 0xbc, 0x5c,
- 0xb0, 0xce, 0xb3, 0x57, 0xce, 0xe7, 0xac, 0xfb, 0x18, 0x4d, 0xcf, 0xea,
- 0xcf, 0x6c, 0x01, 0xd1, 0xce, 0xc8, 0x75, 0x63, 0x96, 0x1a, 0x9a, 0xc8,
- 0x23, 0xe7, 0xbc, 0x18, 0x0e, 0xd3, 0x49, 0xdd, 0x90, 0x31, 0x35, 0x5c,
- 0x17, 0xf9, 0xed, 0xb0, 0x2e, 0xa7, 0x9f, 0xcc, 0xa1, 0xbc, 0x58, 0xa5,
- 0xcd, 0xd5, 0x9f, 0x3a, 0x2e, 0xe1, 0x1d, 0x92, 0x25, 0xbb, 0x49, 0xf2,
- 0x8a, 0xd5, 0x4a, 0xda, 0x89, 0x8a, 0xef, 0x9b, 0x39, 0x4d, 0x19, 0x25,
- 0xf9, 0x60, 0x46, 0x31, 0xb4, 0xbc, 0x34, 0x87, 0x9a, 0xf0, 0x60, 0x03,
- 0x65, 0xa5, 0x9d, 0xe1, 0xe0, 0x70, 0x24, 0x31, 0x02, 0xbf, 0x9d, 0xb9,
- 0x3a, 0x65, 0xf5, 0xc9, 0x28, 0xda, 0xef, 0x8c, 0xc9, 0xf8, 0x9c, 0xfe,
- 0x6d, 0x58, 0x58, 0x83, 0x2d, 0x17, 0xc9, 0x6a, 0x66, 0xc4, 0xcc, 0x98,
- 0x2c, 0xf2, 0x74, 0x32, 0xec, 0x0c, 0x27, 0xdf, 0x97, 0x8f, 0x26, 0x6a,
- 0x6b, 0x28, 0x29, 0x25, 0xdb, 0x5f, 0x1a, 0xfb, 0xef, 0x8a, 0x8f, 0x1d,
- 0x03, 0xf2, 0x1a, 0x0d, 0x85, 0x5e, 0x1a, 0x0b, 0xa2, 0x68, 0xba, 0xc3,
- 0x5d, 0x41, 0x54, 0x93, 0x94, 0x61, 0x63, 0x17, 0x44, 0x22, 0x1e, 0x20,
- 0x6b, 0x7f, 0x8e, 0x3e, 0xeb, 0xbc, 0xf6, 0xd2, 0x9d, 0xe9, 0xe3, 0x23,
- 0x73, 0xa6, 0xfe, 0x46, 0x2f, 0x9a, 0x61, 0x7d, 0x3d, 0x4d, 0x5e, 0x40,
- 0xfb, 0x26, 0x32, 0x8d, 0x6e, 0xf0, 0x78, 0x37, 0xf9, 0xee, 0xe5, 0xfb,
- 0x77, 0x27, 0xef, 0xbe, 0x7a, 0xce, 0x1f, 0x15, 0x4a, 0x33, 0x7f, 0xcb,
- 0x6e, 0x57, 0xe4, 0x07, 0xa3, 0xd9, 0x1a, 0x51, 0x96, 0x24, 0xaf, 0x4b,
- 0xd8, 0x23, 0x60, 0x98, 0x24, 0xb0, 0x3a, 0xc3, 0x19, 0xd1, 0x32, 0x5b,
- 0x77, 0x7c, 0xbf, 0x96, 0x61, 0xbb, 0x81, 0xf9, 0x7a, 0xf2, 0x26, 0xeb,
- 0x1c, 0x0d, 0x7f, 0x64, 0xf7, 0x31, 0xf4, 0xa5, 0x11, 0x49, 0x4b, 0x98,
- 0xf9, 0x3a, 0xf3, 0xee, 0x97, 0x4a, 0x63, 0xec, 0xb2, 0x9d, 0x6f, 0xc6,
- 0xbb, 0x35, 0xd7, 0x86, 0x76, 0x49, 0x07, 0x9b, 0x1a, 0x76, 0x94, 0x89,
- 0xe2, 0x00, 0x56, 0x07, 0xb3, 0x41, 0x58, 0xd9, 0x28, 0x79, 0x39, 0xef,
- 0x1e, 0x25, 0xe9, 0x2e, 0xa4, 0xd5, 0xab, 0x14, 0x9c, 0x39, 0x45, 0x98,
- 0xbd, 0xbc, 0x3c, 0xa2, 0x0e, 0x53, 0x9b, 0xf3, 0x99, 0xa9, 0xa4, 0xa7,
- 0xcf, 0x74, 0x86, 0x83, 0xe9, 0x09, 0x36, 0x43, 0x4a, 0x61, 0x4e, 0x07,
- 0x4a, 0xa6, 0x9f, 0x61, 0xd4, 0xcb, 0x72, 0x06, 0x3b, 0x22, 0xd8, 0x9f,
- 0xb1, 0x75, 0xf8, 0x6c, 0x6d, 0xb9, 0x55, 0x27, 0x3b, 0xe4, 0xfa, 0x33,
- 0x54, 0x50, 0x5c, 0x36, 0x57, 0xbb, 0xce, 0xad, 0x41, 0x6a, 0x8a, 0x59,
- 0xf0, 0x9e, 0x99, 0x08, 0xd6, 0x5d, 0x74, 0x49, 0x1d, 0x6e, 0x67, 0x68,
- 0x9e, 0x7f, 0x5b, 0xd7, 0x0d, 0xac, 0x21, 0x11, 0xff, 0xbc, 0x12, 0x33,
- 0xb3, 0x65, 0xb6, 0x2c, 0xab, 0xbb, 0x60, 0x22, 0x27, 0x50, 0x3e, 0xc8,
- 0xf0, 0x94, 0xd3, 0x22, 0x3a, 0x80, 0x7c, 0x54, 0x97, 0x20, 0x19, 0x01,
- 0xe4, 0x53, 0xb7, 0x76, 0x20, 0x94, 0x26, 0xc3, 0x80, 0x8c, 0xfd, 0xed,
- 0x1c, 0xb6, 0x6a, 0x40, 0xc1, 0xd1, 0xc3, 0xb6, 0xbd, 0x58, 0x53, 0x13,
- 0x71, 0xe1, 0xd0, 0xff, 0x2f, 0x52, 0xe2, 0x3a, 0x45, 0xd6, 0x3a, 0x21,
- 0x48, 0x0f, 0x5e, 0xda, 0x26, 0x72, 0x7f, 0xf2, 0x68, 0x74, 0xd0, 0x22,
- 0xf7, 0xe2, 0x8e, 0x02, 0x05, 0x71, 0x1e, 0x72, 0x61, 0x14, 0xc7, 0x9a,
- 0xe7, 0x6c, 0x76, 0x71, 0x9e, 0x5f, 0xae, 0xab, 0x8c, 0x35, 0x38, 0xc4,
- 0x16, 0x34, 0xa4, 0x40, 0x4a, 0xd1, 0x55, 0x09, 0x4f, 0xbc, 0x11, 0xa6,
- 0xd9, 0x62, 0x3e, 0xe8, 0x0c, 0x07, 0xf3, 0x05, 0xd4, 0x4f, 0xd3, 0x07,
- 0xd3, 0x34, 0x66, 0x0a, 0x06, 0x2b, 0x32, 0x51, 0x62, 0x97, 0x86, 0xa1,
- 0x24, 0xe4, 0x8a, 0x4e, 0xa6, 0x8b, 0x34, 0x5f, 0x82, 0x4c, 0xc5, 0xd5,
- 0x3a, 0x8a, 0x5d, 0x0b, 0x32, 0x30, 0xe8, 0xed, 0x09, 0x99, 0xbe, 0x55,
- 0x4d, 0x92, 0x19, 0xa7, 0xaa, 0x9a, 0x33, 0x1b, 0x96, 0x57, 0xd9, 0xf4,
- 0x93, 0x32, 0x2f, 0x55, 0x39, 0xbb, 0x74, 0x4c, 0x31, 0x06, 0xd8, 0xd7,
- 0xe6, 0xa9, 0x75, 0x4d, 0xd7, 0xa4, 0xae, 0x73, 0x72, 0x9f, 0x91, 0x39,
- 0xb8, 0x9e, 0xc2, 0x4a, 0xc4, 0x85, 0x31, 0xd4, 0xad, 0x1c, 0x30, 0x31,
- 0x2c, 0xb5, 0x98, 0x0d, 0x9b, 0x2a, 0x5f, 0xf5, 0xcd, 0x8e, 0x4f, 0xa5,
- 0xad, 0xa0, 0xd6, 0x62, 0xb1, 0xc3, 0x18, 0x66, 0xf3, 0x78, 0x9a, 0x74,
- 0x76, 0xb3, 0x4b, 0x94, 0xd8, 0xdb, 0x01, 0xf9, 0x83, 0x72, 0xa3, 0x2f,
- 0xb0, 0xb1, 0x04, 0x77, 0xa7, 0x31, 0x8d, 0x44, 0x70, 0x19, 0x2b, 0x2e,
- 0x9f, 0x42, 0x09, 0xca, 0x2f, 0x33, 0x8a, 0xe5, 0x18, 0x59, 0xd6, 0x2c,
- 0x8c, 0x6a, 0x14, 0xd2, 0xb8, 0xf9, 0x4d, 0x76, 0x59, 0x36, 0xa4, 0x8d,
- 0x04, 0x64, 0xf2, 0x01, 0x7c, 0xde, 0xd2, 0x84, 0xaa, 0xfd, 0xbe, 0x4e,
- 0x96, 0xb3, 0x3e, 0x6e, 0x3e, 0xcd, 0x6a, 0xbf, 0x78, 0x1c, 0xea, 0xc6,
- 0xdc, 0xac, 0xee, 0xa9, 0x9b, 0xd1, 0xa6, 0x19, 0x6c, 0x2f, 0x28, 0x8e,
- 0xaa, 0xb7, 0xaa, 0xc2, 0x4f, 0x2c, 0x81, 0x74, 0xe4, 0xe6, 0x26, 0x9f,
- 0x66, 0xea, 0x8e, 0x13, 0x1f, 0xf5, 0x22, 0x0f, 0x59, 0xfd, 0x92, 0xee,
- 0xa4, 0x79, 0x89, 0x75, 0x72, 0xf2, 0x9e, 0xdc, 0xe4, 0xa4, 0xb3, 0x0b,
- 0xd3, 0x83, 0x4a, 0x26, 0xe2, 0x20, 0xad, 0x72, 0xb8, 0x8a, 0xcc, 0x70,
- 0x32, 0x4f, 0xcf, 0xa2, 0xf7, 0xef, 0x18, 0xcf, 0x1b, 0xef, 0x8b, 0x19,
- 0xe3, 0xcc, 0x17, 0x5c, 0xae, 0x79, 0x9a, 0x2f, 0x22, 0xfb, 0x04, 0x46,
- 0x76, 0x99, 0xc1, 0xab, 0xc6, 0x67, 0xb0, 0xa6, 0x4d, 0xa7, 0xb8, 0x5b,
- 0xc8, 0xa4, 0xb2, 0x8c, 0xed, 0x09, 0x18, 0x1f, 0xb7, 0x77, 0x76, 0x7b,
- 0xa1, 0xb4, 0xf1, 0xd9, 0xc9, 0xdf, 0xf9, 0xf8, 0xbc, 0xeb, 0x99, 0xd2,
- 0xa8, 0xe9, 0x8a, 0x02, 0x4c, 0xdd, 0x1b, 0x4a, 0xa6, 0x17, 0xc5, 0x28,
- 0x77, 0xd5, 0x83, 0x9c, 0x89, 0xff, 0xdc, 0xc6, 0xf6, 0xc0, 0x90, 0x88,
- 0xa7, 0xc9, 0x15, 0xe6, 0x71, 0x84, 0x03, 0x77, 0x79, 0xb9, 0x91, 0xaf,
- 0x46, 0x1c, 0x83, 0x87, 0xb6, 0x28, 0xb6, 0x34, 0xec, 0xcb, 0x46, 0x98,
- 0xc8, 0xe3, 0x2b, 0xbc, 0x0e, 0x86, 0x16, 0xee, 0x6c, 0x8c, 0x97, 0x93,
- 0xe9, 0x47, 0x7a, 0x32, 0x4b, 0x99, 0x41, 0xc2, 0x7a, 0x1d, 0x33, 0xab,
- 0x29, 0xfb, 0x80, 0x45, 0x87, 0x60, 0x51, 0x83, 0xa9, 0xce, 0x17, 0xe9,
- 0x25, 0xdc, 0x6b, 0x97, 0xdd, 0x1b, 0x5a, 0x94, 0x12, 0xe8, 0xab, 0x4b,
- 0xc3, 0xde, 0x69, 0xd5, 0xe2, 0xda, 0xaa, 0x93, 0x1d, 0x43, 0x64, 0x8b,
- 0x35, 0xc4, 0xfd, 0x99, 0x59, 0xde, 0x78, 0xfc, 0xf5, 0xae, 0xcf, 0xde,
- 0xb0, 0xbb, 0x0f, 0x61, 0x6e, 0xc4, 0x9d, 0x60, 0x84, 0xff, 0x99, 0xcf,
- 0xa3, 0xcd, 0xe0, 0xac, 0x75, 0xe7, 0x6b, 0x72, 0x4a, 0x97, 0xb4, 0x0a,
- 0x72, 0x85, 0x8e, 0xec, 0xd5, 0xa7, 0x27, 0xd5, 0x23, 0xcb, 0x84, 0xdd,
- 0x52, 0x10, 0xd6, 0xf5, 0x1a, 0xce, 0x29, 0xc8, 0xe3, 0xee, 0x70, 0x86,
- 0xd9, 0x1b, 0x56, 0xb4, 0x2e, 0xe8, 0x4f, 0xab, 0x43, 0xe7, 0xb0, 0xe6,
- 0xe8, 0x2c, 0x2a, 0x72, 0x81, 0x93, 0x1d, 0x6c, 0x75, 0x50, 0xc3, 0x53,
- 0x74, 0x6c, 0xda, 0xcb, 0xee, 0x25, 0x34, 0x1a, 0x1a, 0xd8, 0x8d, 0x11,
- 0xa1, 0x46, 0x30, 0xd3, 0x85, 0xeb, 0xe1, 0xde, 0x3b, 0xf5, 0xda, 0xf0,
- 0x17, 0x32, 0x1d, 0x84, 0x79, 0x10, 0x3d, 0x76, 0x67, 0xc7, 0xec, 0xc5,
- 0x48, 0x1a, 0x8f, 0x8f, 0xec, 0xfe, 0xd2, 0x17, 0x04, 0x87, 0xe6, 0x9f,
- 0xa2, 0x11, 0xbf, 0x99, 0x31, 0xc8, 0xa0, 0x92, 0x05, 0xda, 0xd8, 0xc5,
- 0xe9, 0x38, 0x76, 0x98, 0xed, 0xf8, 0x14, 0xbd, 0x4f, 0xcc, 0x96, 0xdc,
- 0x88, 0xec, 0x56, 0x2d, 0xc9, 0x28, 0xf0, 0x62, 0x54, 0xbe, 0xbf, 0x6f,
- 0x95, 0x51, 0x30, 0x8b, 0xed, 0x65, 0x0e, 0x7e, 0x13, 0x03, 0x23, 0x61,
- 0x4d, 0xda, 0x89, 0x75, 0xa1, 0xbe, 0x7a, 0xe9, 0x8f, 0x0b, 0x9f, 0x69,
- 0xf7, 0x22, 0x78, 0xbf, 0xdf, 0xa9, 0x77, 0x2d, 0x0f, 0x33, 0xa3, 0x9c,
- 0x1f, 0xbf, 0x85, 0xfd, 0x9a, 0x1a, 0xba, 0x79, 0xa7, 0xee, 0x4a, 0x8d,
- 0x6d, 0x4f, 0xd6, 0xf9, 0xa2, 0x15, 0x13, 0x70, 0x26, 0x37, 0x02, 0xcb,
- 0x4c, 0x5a, 0x98, 0x1a, 0x47, 0xb7, 0x72, 0xb8, 0x87, 0xbb, 0x84, 0xd6,
- 0xdc, 0xad, 0xc4, 0xb3, 0xbd, 0xae, 0x5b, 0x0e, 0x24, 0x95, 0xcb, 0x8b,
- 0x06, 0x5a, 0x36, 0xd9, 0xb5, 0xde, 0x98, 0xc1, 0x09, 0x61, 0x5a, 0x24,
- 0x06, 0x2e, 0x8b, 0xfc, 0x1f, 0xa2, 0x83, 0x66, 0xc5, 0x75, 0x5e, 0x95,
- 0x05, 0x69, 0xb9, 0xc6, 0xf4, 0xad, 0x72, 0xb0, 0x65, 0x52, 0xbf, 0x0c,
- 0xe3, 0xd8, 0x7e, 0xf5, 0xe1, 0xfd, 0xe9, 0xc7, 0x57, 0x2f, 0x3f, 0xfe,
- 0xf9, 0xc3, 0xbb, 0xd7, 0xa7, 0xc7, 0xdb, 0x9d, 0xe1, 0xc8, 0xe7, 0x97,
- 0x8b, 0xa3, 0xbe, 0x26, 0xcb, 0x03, 0x97, 0xc4, 0x4c, 0x91, 0x47, 0xbe,
- 0xcc, 0xaf, 0x0d, 0x43, 0x83, 0x21, 0x01, 0x1f, 0x3d, 0xfe, 0x06, 0xaf,
- 0x96, 0x6c, 0x78, 0x67, 0xb8, 0xc9, 0x9a, 0xf4, 0xb4, 0x51, 0x4b, 0x5b,
- 0xd6, 0xab, 0x22, 0x56, 0xbb, 0x4e, 0x30, 0xa2, 0x61, 0x93, 0x16, 0x55,
- 0xcc, 0xc8, 0x7c, 0xf1, 0x8c, 0x44, 0xcf, 0x5d, 0xbf, 0x6e, 0x8c, 0x95,
- 0xa4, 0x01, 0x02, 0xa3, 0xb5, 0x95, 0x9f, 0x34, 0xcb, 0xc0, 0x98, 0x58,
- 0x2f, 0x23, 0xc7, 0x5d, 0x3b, 0x4d, 0x74, 0x96, 0x6c, 0xd3, 0x48, 0x86,
- 0x7e, 0x87, 0x32, 0xc9, 0x69, 0xd5, 0x18, 0xfb, 0x26, 0xcb, 0x71, 0x31,
- 0x34, 0x8a, 0x4a, 0x3a, 0x2b, 0x9c, 0x73, 0x81, 0x86, 0x6d, 0x74, 0x4d,
- 0xda, 0x03, 0x68, 0xf7, 0xd9, 0x6d, 0x86, 0x9b, 0x27, 0x6f, 0xbd, 0x5a,
- 0x57, 0xb8, 0xcd, 0xdf, 0x19, 0x6d, 0x84, 0xb8, 0xdf, 0x6b, 0x78, 0xf7,
- 0xcc, 0x0b, 0xfa, 0x90, 0x11, 0x33, 0x5d, 0x91, 0x57, 0x2e, 0x28, 0xae,
- 0x9a, 0xc2, 0x93, 0x02, 0xbf, 0xd7, 0xf9, 0xcb, 0x8b, 0xaf, 0xa3, 0xca,
- 0xac, 0x4b, 0xe9, 0x11, 0x52, 0x84, 0x62, 0x5e, 0x37, 0x72, 0x41, 0xde,
- 0x8d, 0xc7, 0x09, 0x12, 0x46, 0x16, 0xf9, 0xa4, 0x4a, 0xe9, 0x9b, 0xf4,
- 0x63, 0xfa, 0xa9, 0x21, 0xeb, 0xce, 0x70, 0xe7, 0xdf, 0xbc, 0x1a, 0xff,
- 0xee, 0xe0, 0x80, 0xb4, 0xf8, 0xb5, 0xd9, 0x97, 0x1d, 0xf3, 0x4a, 0x51,
- 0x9b, 0x9b, 0xb9, 0x1c, 0xd5, 0xe5, 0x2e, 0xc4, 0x76, 0x2d, 0xea, 0x40,
- 0x7a, 0x6d, 0xa4, 0x2d, 0xe8, 0x48, 0x89, 0xda, 0x1c, 0x67, 0xb0, 0x27,
- 0x60, 0x74, 0x92, 0x4d, 0x63, 0xf8, 0x85, 0x91, 0xd7, 0x8b, 0x50, 0x21,
- 0xdf, 0xc9, 0xcf, 0xc6, 0x92, 0x8b, 0x92, 0x4e, 0xcd, 0x5f, 0xc9, 0x51,
- 0xb0, 0x4b, 0x2b, 0x6b, 0xdf, 0x30, 0x5d, 0xd5, 0x98, 0xb5, 0xd1, 0x0b,
- 0x32, 0x5f, 0x90, 0x42, 0x13, 0x72, 0x85, 0xa2, 0x7b, 0xb9, 0x5c, 0x9a,
- 0x12, 0xc8, 0x61, 0x92, 0x4e, 0x3f, 0xdd, 0xa4, 0xd5, 0x8c, 0xed, 0x21,
- 0x43, 0x31, 0x93, 0x7c, 0x91, 0x37, 0x77, 0x6c, 0xd7, 0x76, 0x6d, 0x6a,
- 0x8e, 0x8f, 0xd2, 0x06, 0x9a, 0x7b, 0x74, 0x69, 0x4c, 0x7e, 0xd2, 0x3e,
- 0x49, 0xc5, 0xcf, 0x1b, 0xdf, 0xa4, 0x85, 0x8a, 0xd4, 0x58, 0x15, 0xc7,
- 0x7e, 0x3b, 0x10, 0x8f, 0x0d, 0xdf, 0x23, 0x4c, 0xd3, 0xd1, 0xae, 0xb2,
- 0x41, 0x9f, 0x49, 0x29, 0xf9, 0x24, 0xf5, 0x9d, 0x91, 0xf2, 0xcb, 0x24,
- 0xa2, 0x22, 0x22, 0x7b, 0x28, 0xf9, 0x26, 0xbb, 0x33, 0xf6, 0x73, 0x5e,
- 0x38, 0x4e, 0xc9, 0xf6, 0x7d, 0x46, 0xd6, 0x1d, 0xeb, 0xa2, 0xb9, 0x3a,
- 0xd3, 0x33, 0x89, 0x87, 0xb0, 0x24, 0x09, 0x1d, 0x08, 0xfc, 0xbe, 0xea,
- 0xe1, 0x34, 0xc4, 0x76, 0xdd, 0x62, 0xc9, 0xf8, 0x52, 0x78, 0x88, 0x63,
- 0xf3, 0xf3, 0xa2, 0xc8, 0x16, 0x72, 0x7c, 0x17, 0x9b, 0x0e, 0xc0, 0x3e,
- 0x6b, 0xa6, 0xfc, 0x1d, 0xdf, 0xe8, 0xce, 0x70, 0x4f, 0x39, 0xb8, 0x9f,
- 0x36, 0x2a, 0x93, 0x34, 0x6b, 0xc8, 0x58, 0x45, 0xfb, 0xf6, 0x57, 0xa3,
- 0xde, 0xcf, 0x04, 0xb7, 0xa9, 0x72, 0x87, 0xde, 0x3e, 0x73, 0x76, 0x8a,
- 0xe2, 0x90, 0xe9, 0x8c, 0xe5, 0x88, 0xff, 0x68, 0x35, 0x2b, 0x04, 0x30,
- 0x3a, 0xc3, 0xf9, 0x5a, 0xb6, 0xca, 0x30, 0x59, 0xc7, 0xb6, 0xd1, 0x53,
- 0xcb, 0x0a, 0xfe, 0xa2, 0xaa, 0x34, 0x67, 0xdd, 0x3a, 0xcf, 0x1d, 0x56,
- 0x36, 0xba, 0xd7, 0x44, 0xb8, 0xb9, 0xb7, 0x31, 0xbb, 0xb1, 0x8b, 0x1e,
- 0x68, 0x26, 0xa1, 0xc9, 0xda, 0x6b, 0x71, 0xb6, 0x25, 0x34, 0xb8, 0xf4,
- 0x0b, 0xc3, 0xc6, 0xfe, 0x75, 0x01, 0xcd, 0xcc, 0x10, 0xcc, 0x2f, 0x94,
- 0x59, 0x42, 0x8b, 0x2d, 0x41, 0xfd, 0x56, 0x25, 0x32, 0x4d, 0xc2, 0xba,
- 0x60, 0x57, 0x9c, 0x30, 0xc0, 0x8a, 0x23, 0xfb, 0x92, 0x43, 0x33, 0x80,
- 0xdc, 0x81, 0xe2, 0x72, 0x7c, 0xbe, 0x95, 0xec, 0x64, 0xa3, 0x4b, 0x33,
- 0xde, 0x16, 0x8d, 0x73, 0xf0, 0x9c, 0xfe, 0x7b, 0x88, 0xff, 0x1e, 0x6d,
- 0x69, 0x6a, 0x9f, 0xbf, 0xf5, 0x24, 0xcd, 0xbb, 0xb2, 0x88, 0xe3, 0x71,
- 0x4e, 0xb8, 0x0f, 0xd8, 0xc7, 0xdc, 0xc7, 0x78, 0x58, 0x67, 0x3d, 0xe5,
- 0x5d, 0x0e, 0xd5, 0x2d, 0xdd, 0x86, 0x25, 0xfb, 0x23, 0xae, 0x33, 0x76,
- 0x88, 0x98, 0x95, 0x4d, 0x8d, 0x7a, 0x08, 0x37, 0xa2, 0xde, 0xaa, 0xe9,
- 0xc7, 0x2a, 0xbb, 0x4a, 0xeb, 0xab, 0x64, 0xdd, 0x30, 0x11, 0x1a, 0xba,
- 0xed, 0x0e, 0xb7, 0x5a, 0xe4, 0xce, 0xd3, 0x26, 0x9f, 0x1e, 0xa9, 0xdd,
- 0xe7, 0x4e, 0x91, 0x23, 0x20, 0x8b, 0xf2, 0x46, 0x9f, 0x19, 0x4a, 0xae,
- 0x5d, 0x4c, 0x2d, 0x30, 0xa7, 0x09, 0xbf, 0x09, 0x3d, 0xe6, 0x47, 0xb2,
- 0x97, 0xa4, 0x4d, 0x52, 0x22, 0xa0, 0x61, 0x71, 0x73, 0xb3, 0x63, 0x64,
- 0xd1, 0x2d, 0x70, 0x6e, 0x64, 0xbb, 0x62, 0xde, 0x81, 0x69, 0x2a, 0x7a,
- 0x5e, 0x3e, 0x17, 0xef, 0xad, 0xfc, 0x1b, 0xf2, 0x54, 0xb4, 0xaf, 0x9a,
- 0xa3, 0xdd, 0x5d, 0xd5, 0xeb, 0x7e, 0xd2, 0x56, 0x06, 0x69, 0x35, 0x1d,
- 0x59, 0x2c, 0x07, 0x4c, 0x94, 0xae, 0xf3, 0x4b, 0xd8, 0x1a, 0x31, 0x07,
- 0x06, 0x3b, 0xa5, 0xfe, 0xa5, 0x4b, 0x62, 0x66, 0x3c, 0x24, 0x7f, 0xe9,
- 0xba, 0x7e, 0xc0, 0x1d, 0xf1, 0x98, 0x2e, 0xbf, 0x63, 0xfd, 0xc5, 0x1c,
- 0xd5, 0xf7, 0x37, 0xa0, 0x4b, 0x85, 0x77, 0x1e, 0x61, 0xbc, 0xf2, 0x6e,
- 0xd6, 0x98, 0x07, 0x7a, 0x2f, 0x2e, 0x92, 0x9d, 0xf4, 0x53, 0x3a, 0x4a,
- 0xce, 0x5e, 0x8d, 0xcf, 0xe9, 0x13, 0x86, 0x3a, 0x8a, 0x4b, 0x33, 0x8b,
- 0xd3, 0x71, 0x67, 0xb8, 0xec, 0xb6, 0xc9, 0x8a, 0x3a, 0xe6, 0xa0, 0x0c,
- 0xb7, 0x59, 0xa3, 0x08, 0x9a, 0x5e, 0x23, 0x93, 0x35, 0x96, 0x3e, 0xe2,
- 0xe2, 0x14, 0xe6, 0xa5, 0x1c, 0x8c, 0x84, 0xaf, 0x5a, 0xf0, 0xa1, 0x95,
- 0xb9, 0xf9, 0xb3, 0x5d, 0xeb, 0xaa, 0x19, 0x28, 0x2d, 0xd8, 0x70, 0x61,
- 0xbd, 0xbe, 0x24, 0x1b, 0xa4, 0x56, 0xbb, 0xd1, 0x7e, 0xc1, 0xec, 0x46,
- 0xa8, 0x2a, 0xc8, 0xb2, 0xad, 0x27, 0xd1, 0x58, 0x4d, 0x94, 0x49, 0x05,
- 0x15, 0xa9, 0x28, 0xdd, 0xa8, 0x94, 0x4d, 0x81, 0xac, 0xd1, 0x1c, 0x01,
- 0xb6, 0x69, 0x66, 0x54, 0xd0, 0x59, 0x44, 0x09, 0xe0, 0x43, 0x51, 0xc3,
- 0x69, 0x2e, 0x99, 0xa2, 0x11, 0xff, 0x0f, 0x06, 0x9a, 0xb2, 0x8a, 0x46,
- 0x54, 0x8f, 0x40, 0x45, 0x4e, 0x7e, 0x52, 0x52, 0x98, 0xd9, 0x54, 0xa7,
- 0xf1, 0xec, 0xfd, 0xff, 0xaa, 0x58, 0x9b, 0x8d, 0x8f, 0x48, 0x63, 0x52,
- 0xaa, 0x48, 0xcc, 0xd0, 0x06, 0x6e, 0x72, 0xec, 0x3d, 0x3a, 0x68, 0xfb,
- 0xb1, 0x41, 0x6c, 0xc6, 0x00, 0xc8, 0x92, 0x17, 0xf4, 0xdf, 0x7b, 0xb9,
- 0x32, 0x52, 0x57, 0xf0, 0xbc, 0xc4, 0x3b, 0x99, 0x77, 0x8a, 0x2f, 0x26,
- 0x69, 0x33, 0xe8, 0x40, 0x7a, 0x81, 0xdc, 0x46, 0xc4, 0xf7, 0x06, 0xc9,
- 0x6b, 0x4a, 0xc8, 0x3e, 0x7e, 0xf7, 0x15, 0x68, 0xe0, 0xfc, 0xe0, 0x10,
- 0xd1, 0x25, 0x6b, 0x3d, 0xcc, 0xf0, 0x91, 0x9a, 0x1d, 0x09, 0x1c, 0x1d,
- 0x0e, 0x15, 0x5f, 0xc8, 0x84, 0x01, 0xd8, 0x28, 0x85, 0x05, 0x91, 0x3d,
- 0x34, 0xfb, 0xf5, 0xe4, 0x57, 0x60, 0x88, 0x1e, 0x0f, 0x64, 0x07, 0xc5,
- 0x31, 0xf3, 0x29, 0xbb, 0x73, 0x7f, 0xc3, 0xae, 0x7a, 0x5b, 0xed, 0x1e,
- 0x7e, 0xe1, 0x6d, 0xd2, 0x5f, 0x9f, 0x53, 0x86, 0x92, 0xd1, 0x52, 0x67,
- 0x3f, 0xfe, 0x3c, 0x89, 0x18, 0xdf, 0xf9, 0x88, 0xb3, 0x05, 0x7e, 0x2e,
- 0xcd, 0x05, 0xe2, 0xd0, 0x3f, 0xb3, 0x78, 0x49, 0x87, 0xa7, 0x4c, 0x79,
- 0x22, 0xf8, 0xb4, 0xb0, 0x2a, 0xc9, 0x90, 0x13, 0xc0, 0x90, 0x10, 0xd6,
- 0xdd, 0xfb, 0x69, 0xb9, 0x08, 0x64, 0x5d, 0xcb, 0x70, 0x85, 0x3e, 0x7f,
- 0x28, 0xf2, 0x0d, 0xc6, 0x1c, 0x33, 0x1b, 0xd1, 0xa2, 0xbb, 0xd7, 0xc1,
- 0xea, 0xd4, 0x50, 0xbf, 0x9c, 0x64, 0xa4, 0x37, 0xf9, 0x45, 0x84, 0xb9,
- 0x31, 0x35, 0xd6, 0x94, 0x46, 0x89, 0xd3, 0x78, 0x63, 0xea, 0xbf, 0x39,
- 0x5b, 0xdd, 0x5b, 0x73, 0xe8, 0xe4, 0x67, 0xb2, 0xbb, 0x36, 0xf0, 0x3d,
- 0x4d, 0x86, 0xc9, 0x55, 0xb9, 0xea, 0xe7, 0x92, 0x4c, 0x1a, 0xc6, 0x30,
- 0x38, 0xe3, 0x40, 0xbc, 0x51, 0x92, 0x59, 0xd5, 0xf2, 0xe5, 0x33, 0xf9,
- 0x91, 0x25, 0xba, 0xe5, 0x6d, 0xc9, 0x56, 0xec, 0x28, 0x1a, 0x0e, 0x7e,
- 0xca, 0x15, 0xca, 0xaf, 0x69, 0xeb, 0x94, 0x76, 0x9c, 0x63, 0xb3, 0xad,
- 0xfa, 0x96, 0x05, 0xfd, 0x59, 0x90, 0x4f, 0xec, 0xdf, 0x22, 0x04, 0x19,
- 0xa5, 0x45, 0xf2, 0x8d, 0x4b, 0xec, 0x03, 0x0a, 0x0c, 0x25, 0x41, 0x4a,
- 0x16, 0xfa, 0xe2, 0xee, 0x41, 0x06, 0x9d, 0x2a, 0x20, 0x6a, 0xb7, 0x79,
- 0xc6, 0x5c, 0x60, 0xed, 0x74, 0x09, 0xc4, 0xb0, 0xf1, 0x86, 0x52, 0x4a,
- 0x98, 0x76, 0xc9, 0xf7, 0x9a, 0x4f, 0x3f, 0x21, 0xf2, 0x22, 0x12, 0xca,
- 0x5f, 0x9f, 0xe6, 0xed, 0x71, 0xc6, 0x69, 0xe4, 0x08, 0x60, 0x4b, 0x92,
- 0x53, 0x98, 0x68, 0x92, 0xa4, 0x73, 0x5e, 0xb0, 0xce, 0xd6, 0xeb, 0x65,
- 0x30, 0x73, 0xfd, 0xf8, 0xfa, 0xe4, 0x7d, 0xb2, 0x43, 0x1a, 0x78, 0xd7,
- 0xc8, 0x55, 0xf1, 0xbe, 0x97, 0x35, 0xd3, 0xbd, 0xd5, 0xa7, 0x7c, 0xcf,
- 0x18, 0x9b, 0xb3, 0xc9, 0xae, 0x35, 0xa2, 0xf0, 0x39, 0xa2, 0x42, 0x6b,
- 0x98, 0xaa, 0x65, 0x0a, 0xd3, 0x34, 0x70, 0x3d, 0x3a, 0x53, 0x95, 0x2b,
- 0x5c, 0xac, 0x8d, 0xca, 0xdb, 0xc4, 0x04, 0x8d, 0x10, 0x0d, 0x67, 0x47,
- 0x20, 0xb0, 0x93, 0xb1, 0x5f, 0xda, 0xd8, 0xd8, 0xdd, 0xbb, 0xca, 0xd9,
- 0x8f, 0xe2, 0xc8, 0x61, 0x07, 0x8e, 0xa6, 0xec, 0x89, 0xb8, 0x70, 0xda,
- 0xef, 0x80, 0x92, 0x2d, 0x69, 0x53, 0x56, 0x24, 0x92, 0x66, 0xe4, 0x06,
- 0xec, 0x0e, 0x07, 0x4d, 0x6e, 0x6b, 0xb4, 0xb7, 0x95, 0xd8, 0xf4, 0x52,
- 0xb3, 0xcb, 0x9c, 0x3f, 0x6d, 0x03, 0x5f, 0x86, 0xc4, 0xe6, 0xeb, 0xda,
- 0xfa, 0x31, 0x53, 0x7b, 0x5e, 0xa3, 0x18, 0x43, 0xf5, 0x8e, 0xd3, 0xea,
- 0x5c, 0x46, 0x37, 0xc6, 0xcd, 0xf2, 0xad, 0x75, 0x99, 0x14, 0x8e, 0x6a,
- 0xeb, 0x87, 0xad, 0xc4, 0x4b, 0x4f, 0x6c, 0x65, 0x29, 0xe6, 0x2e, 0x81,
- 0xc8, 0x13, 0x02, 0x46, 0x22, 0xdb, 0x3b, 0x3c, 0xcb, 0x16, 0xf9, 0x32,
- 0x87, 0xed, 0xe5, 0x4f, 0x61, 0x18, 0x0b, 0x10, 0xba, 0x29, 0xfd, 0x10,
- 0x4e, 0x49, 0x53, 0x7e, 0x53, 0xfa, 0xb5, 0x99, 0x12, 0x3c, 0x62, 0x9c,
- 0x91, 0x19, 0xb7, 0x9a, 0xdb, 0x13, 0xb2, 0x49, 0xc3, 0x1b, 0x22, 0xc7,
- 0xf6, 0x2e, 0xf5, 0xa9, 0xf2, 0xce, 0x25, 0xa2, 0x97, 0x9e, 0x99, 0x5a,
- 0xb2, 0xfa, 0x34, 0xad, 0x0f, 0x0e, 0xba, 0x82, 0xae, 0x76, 0x14, 0x25,
- 0xf6, 0x7b, 0x6a, 0x09, 0xf3, 0xc3, 0xfb, 0x93, 0x64, 0x87, 0x8a, 0x44,
- 0x9e, 0x3e, 0x3e, 0x38, 0xdc, 0xf5, 0x33, 0x4b, 0x94, 0x01, 0x84, 0x72,
- 0xf3, 0x8e, 0x43, 0xb2, 0xde, 0x05, 0x5c, 0x94, 0xd3, 0x54, 0x34, 0x0e,
- 0x37, 0xf4, 0x2c, 0xbb, 0xce, 0xa7, 0x54, 0xa3, 0x43, 0x01, 0x79, 0xe2,
- 0xc1, 0x93, 0xcc, 0x4c, 0x32, 0xd8, 0x71, 0x97, 0xd1, 0xcb, 0xb3, 0x37,
- 0x26, 0x92, 0xd5, 0x94, 0x29, 0x6f, 0xda, 0xd0, 0x40, 0x23, 0x7b, 0xe7,
- 0xcf, 0x5a, 0xa2, 0x04, 0x69, 0x8f, 0x27, 0x88, 0xd6, 0xc5, 0x15, 0x34,
- 0xd0, 0x31, 0x06, 0x2e, 0xf0, 0x33, 0x1c, 0xca, 0x66, 0x09, 0xeb, 0xb5,
- 0xb1, 0x63, 0xca, 0x40, 0xe9, 0x1e, 0xa0, 0xcc, 0x69, 0x8b, 0x04, 0x49,
- 0x01, 0xe1, 0x9e, 0xba, 0x41, 0xed, 0xee, 0xfb, 0x9a, 0x50, 0x7b, 0xd4,
- 0xd0, 0x53, 0x0e, 0xc2, 0x31, 0x9a, 0x4b, 0x7c, 0xc8, 0xdf, 0xc8, 0xc9,
- 0xd4, 0x66, 0x9f, 0x72, 0x3c, 0x74, 0xf6, 0xe2, 0x35, 0x9c, 0xb0, 0xa2,
- 0xa0, 0xfc, 0x36, 0xd5, 0xc7, 0x03, 0x39, 0x6e, 0x5e, 0xdf, 0x53, 0x21,
- 0x04, 0x29, 0xa4, 0xfe, 0x46, 0xf6, 0xfc, 0x18, 0xe6, 0x09, 0x4f, 0xcf,
- 0x27, 0x71, 0xf4, 0x40, 0x29, 0xb6, 0x29, 0x1c, 0xa1, 0xaf, 0x58, 0x05,
- 0xbf, 0x39, 0xa2, 0x69, 0x39, 0xeb, 0x98, 0xec, 0xb4, 0x09, 0x9e, 0xc0,
- 0x03, 0xf7, 0xe3, 0x50, 0x25, 0x38, 0x5e, 0xdc, 0x93, 0x4d, 0x94, 0xca,
- 0xee, 0xf5, 0x9f, 0xc4, 0x03, 0x63, 0x1e, 0x35, 0xb0, 0xc0, 0x9f, 0xc5,
- 0x01, 0xef, 0xf1, 0x39, 0xbd, 0x0a, 0x24, 0x76, 0x6d, 0x95, 0x21, 0xa7,
- 0xab, 0x51, 0xb2, 0x78, 0x82, 0x8d, 0x0b, 0x2d, 0x1a, 0x4a, 0x1b, 0x44,
- 0x4a, 0x00, 0xe5, 0x7c, 0x75, 0xee, 0x26, 0x3b, 0x76, 0xcc, 0x75, 0xd9,
- 0x39, 0xe5, 0x20, 0x65, 0x72, 0xfe, 0xe6, 0x7b, 0xe5, 0x96, 0x31, 0x03,
- 0x1e, 0x8e, 0xa8, 0x3f, 0xda, 0xec, 0x30, 0x63, 0x51, 0x50, 0xa6, 0x5a,
- 0x2e, 0x59, 0x9f, 0xec, 0x26, 0x42, 0x38, 0x7c, 0xd7, 0x25, 0x33, 0xd2,
- 0x56, 0x6f, 0xbd, 0xc0, 0xef, 0xba, 0xb1, 0xa6, 0x92, 0x2d, 0x99, 0x3f,
- 0xfd, 0xc0, 0xbf, 0x66, 0x1e, 0x6b, 0xfe, 0xd5, 0x5c, 0xad, 0x97, 0x13,
- 0x73, 0x9e, 0x45, 0xf3, 0xa7, 0xad, 0x84, 0x83, 0xad, 0x73, 0xd9, 0xcf,
- 0x0d, 0x66, 0x67, 0xae, 0xf5, 0x3a, 0xea, 0x5b, 0x6c, 0xed, 0x1a, 0xcf,
- 0x4e, 0x6b, 0x07, 0x5c, 0x7e, 0x9e, 0x39, 0x3c, 0xf6, 0x65, 0x07, 0xaa,
- 0xde, 0x07, 0x43, 0x9e, 0x3f, 0xbc, 0xfd, 0xcb, 0x0f, 0xcf, 0x8e, 0x1e,
- 0xa5, 0x4f, 0xd3, 0xe9, 0x93, 0xf9, 0xe7, 0xe9, 0xe3, 0xd9, 0xe3, 0xa7,
- 0xcf, 0x0e, 0x3f, 0x7f, 0x9c, 0x3e, 0x7d, 0x34, 0x4f, 0x9f, 0x1c, 0x64,
- 0x07, 0xcf, 0xe6, 0x87, 0x47, 0xb3, 0xd9, 0x3c, 0xfb, 0x7c, 0xf6, 0x34,
- 0xdd, 0x1a, 0xc1, 0xfc, 0xd2, 0xa9, 0x87, 0xac, 0x56, 0x03, 0x6f, 0x69,
- 0x32, 0xfe, 0xfa, 0xe5, 0xf0, 0x20, 0xb9, 0xca, 0x6e, 0xf5, 0x82, 0xb1,
- 0x47, 0xd3, 0x66, 0xdd, 0x65, 0x92, 0x57, 0xdd, 0xbf, 0x58, 0x2d, 0x14,
- 0xa4, 0xac, 0x69, 0xf2, 0x95, 0x40, 0x03, 0xe6, 0x5d, 0xd4, 0x6d, 0xe5,
- 0xbc, 0x3a, 0xeb, 0x3f, 0x7c, 0xae, 0x3e, 0x7b, 0x5a, 0x57, 0xf7, 0xf2,
- 0x9f, 0x9a, 0x77, 0x16, 0x6f, 0xd3, 0xa9, 0x51, 0x92, 0xcc, 0x9e, 0xc8,
- 0x83, 0x63, 0x63, 0xda, 0x1a, 0x36, 0x3d, 0x48, 0xe4, 0x2f, 0xe4, 0x25,
- 0xf6, 0xc6, 0xf8, 0xaa, 0x2a, 0xd7, 0xab, 0xf3, 0x72, 0x91, 0x4f, 0xef,
- 0x36, 0x0d, 0xe7, 0x3f, 0xd6, 0xfa, 0xc5, 0x31, 0xb3, 0xf0, 0xbc, 0xce,
- 0x7e, 0x43, 0xd3, 0xca, 0x63, 0xc7, 0x0f, 0xb0, 0xad, 0x86, 0xd3, 0x7c,
- 0x75, 0x45, 0x71, 0xde, 0x17, 0xc8, 0xf2, 0xa3, 0xd0, 0x0c, 0xff, 0x20,
- 0x6e, 0x53, 0x8d, 0xe5, 0x46, 0xd6, 0x72, 0x9e, 0xfa, 0xb6, 0x68, 0x5c,
- 0xb9, 0x96, 0xc0, 0xa9, 0x9b, 0x4a, 0x32, 0x4b, 0xf3, 0xc0, 0x8f, 0xe7,
- 0x3e, 0xc4, 0xb7, 0x5d, 0xb5, 0x6d, 0x76, 0x5e, 0xc8, 0xaf, 0x46, 0xc9,
- 0x7b, 0xc4, 0xc9, 0xd7, 0x2b, 0x36, 0x2f, 0xe0, 0xcf, 0xe7, 0xdf, 0x75,
- 0x2f, 0x1a, 0x4d, 0x5e, 0x28, 0x86, 0x0b, 0xf1, 0xcc, 0x8e, 0x7e, 0x78,
- 0x7f, 0xfa, 0xbc, 0xbb, 0x4f, 0x28, 0x36, 0xaa, 0x9f, 0xef, 0xed, 0x21,
- 0xe4, 0x73, 0x95, 0xde, 0xde, 0x8e, 0xea, 0x6c, 0x6f, 0x56, 0x4e, 0xeb,
- 0xbd, 0xba, 0x5e, 0xe8, 0x6e, 0xb4, 0x6b, 0xff, 0x7e, 0x05, 0x6f, 0x6e,
- 0xb9, 0x04, 0xdb, 0xca, 0x66, 0xc3, 0xba, 0x0e, 0x72, 0x83, 0xc6, 0xaf,
- 0x34, 0xf3, 0xe0, 0x58, 0x72, 0xd2, 0x20, 0xe7, 0x86, 0x66, 0x77, 0xc7,
- 0xe3, 0xaf, 0x13, 0x7d, 0x19, 0xdb, 0x6b, 0x43, 0xe2, 0x36, 0x2f, 0x67,
- 0x10, 0x51, 0xc3, 0x52, 0x61, 0xd8, 0x7f, 0xf4, 0x1d, 0x3a, 0xa4, 0x4e,
- 0x97, 0xfc, 0x87, 0xd4, 0xae, 0xe4, 0xcd, 0xc6, 0x44, 0xbe, 0x27, 0x1d,
- 0x07, 0x88, 0x5d, 0x44, 0x3c, 0xfe, 0xaf, 0x4e, 0xb0, 0x34, 0x71, 0x4f,
- 0x3a, 0x8f, 0x50, 0xb7, 0x38, 0xdd, 0x50, 0xef, 0x65, 0x59, 0x19, 0xe1,
- 0xb1, 0xac, 0x63, 0x5e, 0x50, 0xbd, 0xe5, 0x35, 0xab, 0x7d, 0x35, 0xe7,
- 0x22, 0x9a, 0x61, 0x0a, 0x6f, 0x70, 0x73, 0x8c, 0xc8, 0x61, 0x1c, 0xf9,
- 0x87, 0x15, 0x8d, 0x6f, 0xe9, 0xe1, 0xf5, 0x79, 0xd1, 0xd6, 0x85, 0x0b,
- 0x7e, 0x40, 0x1c, 0x9b, 0xc9, 0x4a, 0x61, 0x59, 0x60, 0x21, 0x20, 0xf7,
- 0x1f, 0x62, 0x82, 0x74, 0x88, 0xaa, 0x2a, 0x3d, 0xa5, 0x76, 0xf8, 0x0d,
- 0x8c, 0x4b, 0x23, 0x1d, 0xf3, 0x4b, 0x0d, 0xaf, 0xf7, 0xe4, 0xd8, 0x91,
- 0xe8, 0x6a, 0x90, 0xbb, 0x2c, 0xe5, 0xe0, 0x24, 0x14, 0x28, 0x85, 0x0d,
- 0xa9, 0x25, 0x92, 0x9d, 0xc9, 0xe9, 0x40, 0xad, 0x2a, 0xf8, 0xe0, 0x26,
- 0x50, 0xcd, 0x8f, 0x7b, 0x9c, 0xd2, 0xa8, 0xf4, 0x5e, 0x62, 0x78, 0x71,
- 0x5f, 0x78, 0x89, 0x6d, 0xa4, 0x95, 0xc1, 0xcd, 0x60, 0x9e, 0xe9, 0x5a,
- 0x7b, 0xc8, 0xb9, 0xb5, 0x3a, 0x5f, 0xac, 0xc4, 0xb5, 0xbb, 0x1e, 0x4d,
- 0xbd, 0xd7, 0xbd, 0xcd, 0x51, 0x54, 0x9d, 0x22, 0xaf, 0x3f, 0x26, 0xda,
- 0x4b, 0x2f, 0x48, 0x4b, 0x03, 0x86, 0x32, 0xaf, 0xb1, 0x69, 0x93, 0x5a,
- 0xa9, 0x04, 0x85, 0xc0, 0x70, 0x20, 0x23, 0xf6, 0x28, 0xe3, 0x9c, 0x4a,
- 0xe9, 0x17, 0xa5, 0x53, 0xb0, 0x0c, 0xe1, 0x19, 0x5e, 0x88, 0x6a, 0xc4,
- 0x51, 0xc0, 0xb7, 0xb9, 0x26, 0x89, 0x93, 0x08, 0xb9, 0xb6, 0x8e, 0xb3,
- 0xbd, 0xf8, 0x67, 0x10, 0x5f, 0x13, 0x8d, 0x91, 0x3b, 0x7e, 0x46, 0xe7,
- 0x17, 0x73, 0x0d, 0x49, 0x56, 0x3e, 0x17, 0x3a, 0xe6, 0x28, 0xe1, 0x95,
- 0xa2, 0x4f, 0x2e, 0x32, 0x50, 0xcf, 0x76, 0x5d, 0x4a, 0xca, 0x26, 0x4d,
- 0x94, 0xe6, 0xc9, 0x73, 0xec, 0x92, 0xba, 0x2d, 0xe8, 0x6c, 0x19, 0x23,
- 0x69, 0xed, 0x72, 0xf5, 0xeb, 0x30, 0x5a, 0xe9, 0x36, 0x33, 0x66, 0xbd,
- 0x06, 0x75, 0x0f, 0x98, 0x48, 0x95, 0xe9, 0x17, 0x8a, 0xb2, 0x3b, 0x29,
- 0x9d, 0x47, 0x2c, 0x1f, 0x55, 0x73, 0xfb, 0xbd, 0x09, 0x68, 0x8e, 0xbf,
- 0x3d, 0xe5, 0x9e, 0xec, 0xcd, 0x2c, 0x71, 0x8f, 0x24, 0xce, 0xce, 0x74,
- 0xc7, 0x08, 0x7f, 0x03, 0x2a, 0x36, 0x6a, 0x9e, 0xfa, 0x73, 0x9a, 0xd3,
- 0x17, 0xbb, 0x31, 0x3f, 0xb1, 0x1b, 0x49, 0x29, 0x8a, 0xee, 0xe9, 0xa2,
- 0xac, 0x35, 0xfe, 0x42, 0xca, 0x05, 0xd7, 0xdd, 0x1a, 0x6e, 0xf0, 0x9d,
- 0xfc, 0x80, 0x8f, 0xa6, 0x33, 0x1c, 0x3f, 0x35, 0x90, 0x29, 0xce, 0x9d,
- 0xb2, 0x21, 0xb6, 0xaa, 0x2b, 0x16, 0x26, 0x6d, 0xc3, 0x5a, 0x93, 0xcf,
- 0x93, 0x1f, 0x7e, 0x18, 0x24, 0xc6, 0x48, 0xee, 0x0c, 0xf7, 0x43, 0x63,
- 0x7e, 0x6a, 0x68, 0xf1, 0x07, 0x2e, 0x58, 0xfa, 0xe1, 0x9a, 0x8c, 0x40,
- 0x72, 0x30, 0xd7, 0x0b, 0x8a, 0x1e, 0xb1, 0x9a, 0xdd, 0xf6, 0xca, 0x71,
- 0x3d, 0xf4, 0x86, 0xd4, 0x2c, 0x67, 0xb7, 0x73, 0x2a, 0xa6, 0x39, 0xb0,
- 0xf5, 0xb2, 0x10, 0xeb, 0x84, 0x89, 0x13, 0xf7, 0x1e, 0x72, 0x60, 0xfb,
- 0x77, 0xdb, 0x8e, 0x90, 0x62, 0x7b, 0x57, 0x65, 0x2c, 0xe9, 0x21, 0xaa,
- 0x72, 0x4f, 0x4c, 0x69, 0xf5, 0x30, 0xcc, 0xcd, 0x84, 0xc3, 0xa5, 0xc4,
- 0x4c, 0xcf, 0xc8, 0xb9, 0xce, 0x65, 0x60, 0x5d, 0x31, 0xee, 0x4c, 0x49,
- 0xaa, 0x8d, 0x5b, 0x5d, 0xdd, 0xd5, 0x94, 0xc9, 0x21, 0xb3, 0x09, 0x6e,
- 0x4f, 0x6f, 0x82, 0xb1, 0xec, 0x3d, 0x15, 0xf5, 0x10, 0x1f, 0x20, 0xe6,
- 0xd7, 0x62, 0x9d, 0x66, 0x46, 0xdb, 0xc3, 0x6d, 0x1b, 0x0b, 0x93, 0x7c,
- 0x99, 0x20, 0x97, 0xde, 0x26, 0x67, 0xbb, 0xe4, 0xc3, 0xe0, 0x93, 0x5e,
- 0x52, 0x5c, 0xe9, 0xa7, 0x3b, 0xba, 0xe2, 0x76, 0xaa, 0x4e, 0xd5, 0x28,
- 0xbe, 0x7c, 0x5f, 0xf8, 0x4f, 0xc4, 0xe1, 0x84, 0xb4, 0x48, 0x98, 0x1e,
- 0x3a, 0x00, 0xbc, 0x21, 0x2e, 0x3c, 0x34, 0x1c, 0x02, 0x67, 0x64, 0xc5,
- 0xd8, 0x20, 0x44, 0x12, 0xc8, 0x3c, 0xb8, 0xa3, 0x4a, 0xb0, 0xd5, 0x22,
- 0xe0, 0xb7, 0x92, 0x0a, 0xa8, 0xc5, 0xd6, 0x74, 0xc1, 0x09, 0x90, 0xe2,
- 0xa6, 0x10, 0x40, 0x81, 0x71, 0x09, 0xaf, 0xcc, 0x14, 0x39, 0x0c, 0x92,
- 0x2e, 0x23, 0x35, 0x65, 0x11, 0x2b, 0x90, 0x64, 0x60, 0xa0, 0x03, 0xd1,
- 0x7c, 0xbe, 0x48, 0xb6, 0xfa, 0x35, 0xa1, 0xad, 0xee, 0x1b, 0xc8, 0x80,
- 0x74, 0x2e, 0x4e, 0xa9, 0x97, 0xc7, 0x44, 0x76, 0x24, 0x93, 0x6e, 0xf8,
- 0x77, 0x4e, 0x68, 0xe3, 0x92, 0x2e, 0x91, 0xaf, 0xbb, 0x9c, 0x20, 0x5c,
- 0x47, 0x22, 0xfb, 0x2e, 0xcb, 0xca, 0xa3, 0x0f, 0x97, 0xa7, 0x94, 0xc3,
- 0x7d, 0x0d, 0xe9, 0xc5, 0xd2, 0xce, 0x7b, 0x3a, 0x08, 0xc5, 0xeb, 0xdb,
- 0x54, 0x71, 0x42, 0xdf, 0x13, 0x97, 0xb4, 0x8a, 0x0e, 0x7b, 0xa3, 0x57,
- 0x0b, 0xe0, 0x74, 0x68, 0xad, 0x0b, 0x54, 0xa2, 0x60, 0x77, 0x0e, 0x76,
- 0x6d, 0x75, 0x24, 0xc0, 0x36, 0x38, 0x33, 0x5b, 0xf4, 0x84, 0xad, 0xab,
- 0x92, 0x73, 0x89, 0xb6, 0x9e, 0x53, 0xe1, 0x9e, 0xdc, 0x46, 0xac, 0x51,
- 0x61, 0x10, 0x3a, 0xc3, 0x21, 0x53, 0xeb, 0xeb, 0xb3, 0xb7, 0xc7, 0xed,
- 0x0c, 0x5c, 0xfc, 0x24, 0xe6, 0x7c, 0x35, 0xec, 0xea, 0x8d, 0xe1, 0x30,
- 0x4c, 0x03, 0x69, 0xa0, 0xcd, 0x31, 0x6d, 0x99, 0x69, 0x5d, 0x66, 0xcd,
- 0xea, 0x66, 0x9d, 0xcf, 0x76, 0x76, 0x89, 0x46, 0xa8, 0xdc, 0x64, 0x88,
- 0x1a, 0x27, 0x36, 0x0d, 0xeb, 0x64, 0x87, 0x15, 0xf4, 0x2a, 0x6b, 0xd6,
- 0x55, 0xc1, 0x0e, 0x73, 0x9a, 0x7b, 0xd7, 0xc8, 0x32, 0xd2, 0x99, 0x45,
- 0x9d, 0xef, 0x1c, 0x10, 0xcc, 0x1c, 0x4e, 0x61, 0xe2, 0x01, 0x8d, 0xb9,
- 0x7b, 0x66, 0xf3, 0x3e, 0x70, 0xf0, 0x58, 0x4b, 0x20, 0xbf, 0xfc, 0x9d,
- 0x48, 0x5e, 0x9e, 0x9f, 0xbf, 0x7e, 0x79, 0xf1, 0xd2, 0xae, 0x0d, 0x02,
- 0x1a, 0xcc, 0x05, 0x1a, 0xb2, 0xe1, 0x43, 0xa4, 0x35, 0xd1, 0x93, 0xdb,
- 0xbf, 0xff, 0x30, 0x3e, 0x7e, 0xdf, 0x3d, 0xd8, 0xf3, 0xf7, 0x67, 0x04,
- 0x48, 0xf4, 0xfb, 0x1f, 0x5e, 0xae, 0x56, 0x0b, 0x0d, 0x0a, 0xbe, 0x4e,
- 0x9b, 0x74, 0x3b, 0xb8, 0xd5, 0x87, 0xbb, 0x34, 0xbf, 0x1b, 0x3b, 0xbf,
- 0xb9, 0x08, 0x39, 0x98, 0xfa, 0xc9, 0x88, 0x0e, 0xb4, 0x9a, 0x6a, 0xfa,
- 0xad, 0xdd, 0x0d, 0x6c, 0x00, 0xb2, 0x67, 0xfb, 0x17, 0x52, 0x3a, 0x4e,
- 0xa6, 0x89, 0x64, 0xba, 0x59, 0x0b, 0x63, 0x64, 0x67, 0xd3, 0x75, 0xa3,
- 0x24, 0x0f, 0xfa, 0xa2, 0x2a, 0xee, 0xee, 0xbe, 0x04, 0xc7, 0xe3, 0xc2,
- 0x28, 0xcc, 0x05, 0x00, 0x22, 0x60, 0x08, 0x0d, 0x29, 0xd2, 0x3a, 0x5b,
- 0xe6, 0x62, 0x11, 0x9a, 0x9a, 0x65, 0x1c, 0x56, 0x01, 0xa8, 0x00, 0x4f,
- 0x29, 0xd8, 0x90, 0xdf, 0x99, 0xdb, 0x38, 0x4c, 0x8e, 0xa5, 0xda, 0x0d,
- 0x0b, 0x37, 0x3f, 0x08, 0x1e, 0x6a, 0xac, 0xf9, 0x20, 0xec, 0x3e, 0xce,
- 0x2b, 0x3c, 0xa0, 0x8d, 0xad, 0xae, 0x08, 0xe0, 0xd2, 0x56, 0xf3, 0x10,
- 0x4d, 0x9b, 0x36, 0x1d, 0xd6, 0xd3, 0x56, 0x24, 0xe9, 0x69, 0x98, 0x5e,
- 0x12, 0x79, 0x99, 0x47, 0x8d, 0x76, 0x6d, 0x8c, 0x26, 0xfa, 0xd7, 0xde,
- 0xc1, 0x68, 0x7f, 0x2b, 0x9c, 0x3c, 0x5d, 0x16, 0x80, 0xa4, 0xd8, 0xa8,
- 0x1a, 0x71, 0xc3, 0xa6, 0x2c, 0xef, 0x9d, 0x1f, 0xb3, 0x30, 0xa3, 0x9f,
- 0xae, 0xcc, 0xf8, 0xd1, 0xa9, 0x0c, 0xcf, 0x82, 0x2c, 0x10, 0xca, 0xdc,
- 0xad, 0x94, 0x29, 0x1a, 0x9e, 0x58, 0x94, 0x37, 0xb4, 0x12, 0x43, 0x6a,
- 0x8b, 0x45, 0x0b, 0xcd, 0x66, 0x2b, 0xbe, 0xcd, 0x05, 0x80, 0xa3, 0xb2,
- 0xee, 0x6e, 0x47, 0x23, 0xd7, 0xaa, 0x7c, 0xfa, 0x1a, 0x9e, 0x4d, 0x79,
- 0x85, 0x15, 0x69, 0x29, 0xc1, 0x07, 0x13, 0x30, 0x5c, 0x2e, 0xe0, 0x7b,
- 0x0b, 0x3f, 0x33, 0x63, 0xa8, 0xe9, 0x21, 0x43, 0x1a, 0x84, 0xb4, 0xd2,
- 0x17, 0x5c, 0xab, 0x1e, 0xd8, 0xf2, 0x6f, 0xd3, 0xdb, 0x7c, 0xb9, 0x5e,
- 0xe2, 0x63, 0x44, 0xdb, 0xf2, 0x98, 0xc4, 0x13, 0xe0, 0x55, 0xe4, 0xf4,
- 0x14, 0x10, 0xf9, 0x76, 0x9d, 0x78, 0x16, 0x7d, 0x4c, 0xc8, 0x18, 0x91,
- 0x3c, 0x72, 0xcb, 0x83, 0xb2, 0x80, 0x80, 0x43, 0xdd, 0xf1, 0x06, 0x18,
- 0xfd, 0x20, 0xa5, 0x9c, 0x83, 0xba, 0xb4, 0x09, 0x3b, 0x11, 0x76, 0xce,
- 0x60, 0x09, 0xa2, 0xc3, 0x79, 0xf9, 0xaa, 0x59, 0x95, 0x97, 0x33, 0x7b,
- 0x6f, 0x48, 0x7f, 0xcc, 0x8b, 0xb5, 0xd9, 0x67, 0xf6, 0x25, 0x73, 0x10,
- 0x82, 0x7e, 0x15, 0x78, 0x08, 0x91, 0x55, 0x3f, 0x46, 0xb1, 0x84, 0xa6,
- 0xa0, 0x3e, 0x1d, 0x1d, 0x1d, 0x8e, 0xf6, 0x07, 0x2d, 0x83, 0x5e, 0x30,
- 0x25, 0xcc, 0xed, 0x9a, 0xe6, 0x4b, 0x5b, 0x6f, 0x3a, 0xfa, 0xcd, 0x1c,
- 0x37, 0xc8, 0x08, 0x5f, 0xa6, 0xb7, 0x38, 0xbe, 0xe8, 0xb1, 0x96, 0xc9,
- 0x8b, 0xaf, 0xcf, 0xc6, 0x17, 0x07, 0xcf, 0xcf, 0xcf, 0xde, 0x9b, 0xff,
- 0xd2, 0xdf, 0x0f, 0xf1, 0xf7, 0xc3, 0xc0, 0xaa, 0x7c, 0x23, 0x19, 0xb4,
- 0x5a, 0xac, 0x03, 0x0d, 0x05, 0x1a, 0x0d, 0xef, 0x66, 0xe2, 0x0d, 0x44,
- 0x7a, 0x39, 0xd8, 0xe0, 0xd4, 0x56, 0x34, 0x76, 0x8f, 0xd8, 0xfb, 0x94,
- 0x26, 0xd9, 0x8d, 0x92, 0x30, 0x91, 0x2f, 0x6f, 0x54, 0x9b, 0x92, 0x5a,
- 0x78, 0xad, 0xb2, 0xef, 0xfa, 0xba, 0xb9, 0x8e, 0x59, 0xea, 0x73, 0x14,
- 0xaf, 0x0e, 0xb9, 0x61, 0xed, 0x5f, 0x4d, 0x17, 0x46, 0xbb, 0xcf, 0x28,
- 0x97, 0x64, 0x96, 0x71, 0x80, 0x85, 0x7e, 0x12, 0x33, 0x4c, 0xcc, 0xf5,
- 0x93, 0x92, 0x85, 0x20, 0xc1, 0x10, 0x14, 0xa9, 0x51, 0x1d, 0x33, 0x1b,
- 0x33, 0xc7, 0xdc, 0x68, 0xe2, 0xbc, 0x1d, 0x45, 0x16, 0x54, 0x08, 0x30,
- 0x8e, 0x9c, 0xef, 0xc4, 0x42, 0x91, 0x3e, 0xca, 0xed, 0xdf, 0x9d, 0x5d,
- 0x24, 0xe9, 0x7c, 0xae, 0xd8, 0x00, 0x54, 0x96, 0x40, 0x1a, 0xeb, 0xde,
- 0x8a, 0x25, 0x59, 0xda, 0xc4, 0x52, 0x37, 0x44, 0x1f, 0xb9, 0x38, 0x1d,
- 0xef, 0x91, 0x0b, 0x8b, 0x93, 0xe0, 0xc6, 0xef, 0x4e, 0x06, 0x2d, 0x5f,
- 0xb5, 0x9f, 0xfa, 0xb2, 0x4b, 0x92, 0x32, 0xae, 0x50, 0xa4, 0x9e, 0x2c,
- 0x74, 0x88, 0x33, 0x94, 0x54, 0x87, 0x23, 0xdd, 0x92, 0x6a, 0xb0, 0x2d,
- 0x1c, 0xed, 0x56, 0xa2, 0x51, 0x53, 0xd8, 0xc5, 0xcb, 0x55, 0x73, 0x17,
- 0xd6, 0x8b, 0xc2, 0xb7, 0x41, 0x38, 0x2c, 0xa4, 0x74, 0x6c, 0x91, 0x59,
- 0x42, 0xcb, 0xc2, 0x92, 0xb6, 0x46, 0x3c, 0xec, 0xe1, 0x16, 0x46, 0xc5,
- 0xa0, 0xe6, 0xef, 0x34, 0x26, 0x88, 0x76, 0x92, 0xc5, 0xd2, 0xfb, 0xf9,
- 0x43, 0xde, 0xe0, 0x89, 0x1d, 0xde, 0x4c, 0xcc, 0xd6, 0xa9, 0x29, 0x75,
- 0x10, 0x83, 0x29, 0xab, 0xfc, 0x92, 0xf2, 0x04, 0xba, 0xa5, 0x63, 0x6e,
- 0x22, 0x81, 0x67, 0x8a, 0x94, 0xb1, 0xba, 0xd9, 0xf2, 0x5c, 0x09, 0x4d,
- 0x90, 0xa0, 0x8f, 0xb4, 0xd1, 0x4a, 0x4d, 0x1a, 0x9d, 0x0e, 0xf1, 0x9f,
- 0x26, 0xa2, 0xc7, 0xb3, 0xb2, 0x67, 0x56, 0x47, 0x72, 0xc7, 0x05, 0x81,
- 0xb4, 0xf4, 0x47, 0xef, 0x12, 0x90, 0x70, 0x4e, 0x1a, 0x65, 0xe0, 0x1c,
- 0x36, 0xea, 0x0e, 0xc7, 0x88, 0x6d, 0x86, 0x23, 0x68, 0xd5, 0xc7, 0xd6,
- 0xc1, 0xe1, 0xd3, 0xd1, 0xbe, 0xf9, 0x3f, 0x73, 0x28, 0xa2, 0x1f, 0x01,
- 0x2e, 0xca, 0xc1, 0x02, 0xd9, 0x27, 0xb3, 0xdb, 0x2e, 0x49, 0xb2, 0x00,
- 0x2a, 0xab, 0xcb, 0xad, 0x8d, 0x35, 0xac, 0x2d, 0x91, 0x42, 0x07, 0x69,
- 0xc5, 0x49, 0x3a, 0x93, 0x9f, 0xe8, 0x1d, 0xaf, 0xd6, 0x8b, 0x48, 0x5a,
- 0x9f, 0xe7, 0x46, 0x26, 0xed, 0x6c, 0x71, 0x2d, 0x4e, 0xe4, 0xaf, 0x89,
- 0x37, 0x71, 0x1d, 0xdf, 0xa8, 0x95, 0x14, 0xf5, 0xac, 0xe5, 0x13, 0x7c,
- 0x25, 0x26, 0x1b, 0x38, 0xf3, 0xd0, 0x5c, 0x86, 0x17, 0xe5, 0x7c, 0x5e,
- 0x67, 0x4d, 0x57, 0x00, 0xbd, 0x92, 0x47, 0xf6, 0xde, 0x03, 0xe0, 0x10,
- 0x9c, 0x4a, 0x2b, 0x6e, 0x92, 0x36, 0x2c, 0x4f, 0x22, 0x59, 0x68, 0xcc,
- 0xb6, 0x78, 0xb8, 0x51, 0xa4, 0xc8, 0xc0, 0xff, 0xbd, 0x66, 0x88, 0x70,
- 0x55, 0xbc, 0x82, 0xbd, 0xa0, 0xdc, 0x8a, 0x71, 0x5c, 0x44, 0xd2, 0x75,
- 0x51, 0xd9, 0xf4, 0x4a, 0x7c, 0xca, 0x57, 0x2b, 0x32, 0x6f, 0x18, 0xe1,
- 0x0c, 0x64, 0x6b, 0x03, 0x68, 0x88, 0xe3, 0x82, 0x94, 0x35, 0x5b, 0xd0,
- 0x28, 0xc9, 0x53, 0x91, 0xf9, 0x93, 0x6c, 0x1e, 0x06, 0x81, 0x38, 0xa9,
- 0xd1, 0x87, 0xb5, 0x91, 0x1a, 0xdd, 0x19, 0x41, 0xd8, 0x14, 0xa9, 0xb2,
- 0x98, 0xb9, 0x07, 0xf8, 0x20, 0xc5, 0x7f, 0x83, 0xc8, 0xfd, 0x77, 0xc5,
- 0x59, 0xd6, 0x0f, 0x37, 0x3e, 0xf9, 0xef, 0xc7, 0x0e, 0x84, 0xc8, 0xa2,
- 0xfc, 0x70, 0xb9, 0x4b, 0xac, 0x78, 0xc8, 0xdc, 0xc2, 0xe1, 0x2b, 0x73,
- 0x5e, 0x5b, 0x98, 0x8a, 0x4b, 0x35, 0x29, 0x3b, 0xe5, 0x18, 0xb0, 0x7b,
- 0x48, 0x93, 0x80, 0x36, 0xb4, 0x47, 0x75, 0xff, 0x81, 0x68, 0x60, 0x8c,
- 0x4a, 0xf6, 0x2f, 0xca, 0x1a, 0x71, 0x3b, 0x1a, 0xa9, 0x9a, 0xf3, 0x6b,
- 0x4e, 0x44, 0x59, 0xdc, 0xcb, 0x0b, 0x52, 0x19, 0x59, 0x81, 0x09, 0x4a,
- 0x32, 0xb4, 0x0e, 0x96, 0xd1, 0x4e, 0xd6, 0xcd, 0x6f, 0x18, 0x3b, 0xa9,
- 0x88, 0x7e, 0x01, 0x63, 0xe7, 0x11, 0xf5, 0x94, 0x89, 0x9a, 0xb0, 0x3a,
- 0x87, 0x7f, 0x33, 0x56, 0xf6, 0x0b, 0x75, 0x53, 0xf4, 0x01, 0x03, 0xa8,
- 0x53, 0x83, 0x8a, 0x28, 0x60, 0x84, 0x81, 0x36, 0x2c, 0x3e, 0x8d, 0x6e,
- 0x35, 0xc3, 0xea, 0xa4, 0xd0, 0x65, 0x00, 0x04, 0xda, 0xbd, 0xf3, 0x73,
- 0x80, 0xde, 0x78, 0xe5, 0xdf, 0xb6, 0x76, 0x72, 0x44, 0x51, 0xaa, 0x05,
- 0x8f, 0x50, 0x73, 0x62, 0xa5, 0x8c, 0xa1, 0x46, 0x43, 0x1e, 0xc8, 0xdc,
- 0xbc, 0x18, 0x72, 0x71, 0xb5, 0x3e, 0x8b, 0x60, 0x1a, 0xa1, 0xb6, 0x09,
- 0x39, 0xf2, 0x11, 0xb1, 0x19, 0xde, 0x48, 0x62, 0x05, 0xd4, 0x5a, 0x7c,
- 0x36, 0xe6, 0x46, 0x67, 0x5f, 0x24, 0x1c, 0x88, 0xfc, 0x71, 0x72, 0x90,
- 0x7d, 0x32, 0xba, 0x73, 0x31, 0xa0, 0x9f, 0xa2, 0x10, 0xd5, 0x5e, 0x32,
- 0xf6, 0x6d, 0x34, 0x19, 0x07, 0x2d, 0xb2, 0x88, 0x2e, 0xeb, 0x3d, 0x2b,
- 0x8f, 0x7a, 0x6e, 0x94, 0x77, 0x59, 0x23, 0xa9, 0x23, 0x3c, 0x79, 0xad,
- 0xcd, 0x42, 0x7d, 0xd7, 0xc9, 0xbc, 0x33, 0x1c, 0xe0, 0xe2, 0xb2, 0xa6,
- 0x5d, 0xad, 0x2f, 0x31, 0x5c, 0xc6, 0xc8, 0x22, 0x5f, 0xe8, 0xc0, 0x5c,
- 0x83, 0x2d, 0xf5, 0xcb, 0xf2, 0x0a, 0xe2, 0xa9, 0x0b, 0x3a, 0x1d, 0x72,
- 0x13, 0x35, 0xb3, 0x18, 0x4d, 0xb2, 0xee, 0xab, 0x17, 0x52, 0xa0, 0x03,
- 0xfd, 0x74, 0x08, 0x02, 0x41, 0x43, 0xf4, 0xde, 0x7d, 0x4d, 0x13, 0x57,
- 0x22, 0x55, 0x85, 0x5e, 0x55, 0x29, 0xa5, 0xd0, 0x54, 0x33, 0xf5, 0x8c,
- 0xe8, 0x44, 0x0d, 0x17, 0x16, 0xbb, 0xe8, 0x26, 0x05, 0xa5, 0xd9, 0xf1,
- 0x63, 0xb5, 0x0f, 0x5e, 0xfe, 0xe3, 0x70, 0xe2, 0xc8, 0xd9, 0xc1, 0xe7,
- 0x44, 0xd3, 0x94, 0xe4, 0x21, 0xa2, 0x79, 0x23, 0x58, 0xb6, 0x1b, 0xaf,
- 0xb8, 0x14, 0x88, 0x34, 0x76, 0x53, 0x78, 0x0b, 0x6f, 0xae, 0xca, 0x45,
- 0x16, 0x0b, 0x91, 0x78, 0x25, 0xbf, 0x00, 0x77, 0xa1, 0xb4, 0x5e, 0x78,
- 0x9b, 0xaf, 0x91, 0x31, 0xdc, 0x0a, 0x9d, 0x18, 0xfd, 0x2e, 0x4b, 0xa9,
- 0xe0, 0xc8, 0x26, 0xcd, 0x5f, 0x0f, 0x82, 0x34, 0x76, 0x73, 0xcf, 0x27,
- 0x65, 0x6d, 0xe9, 0x85, 0x0a, 0x6b, 0x49, 0x82, 0xdc, 0xa4, 0x15, 0x18,
- 0xb3, 0xa0, 0x64, 0x29, 0x80, 0xa8, 0x9f, 0x33, 0x48, 0xaa, 0x60, 0xb7,
- 0xde, 0x21, 0xa7, 0x62, 0x74, 0x43, 0x26, 0x46, 0x01, 0x20, 0x37, 0x2d,
- 0x68, 0x87, 0x86, 0x14, 0xfc, 0xab, 0x2b, 0x40, 0xe1, 0x4a, 0xc5, 0xba,
- 0xb9, 0x87, 0x57, 0x24, 0xd3, 0xf3, 0x66, 0x9d, 0x36, 0x0f, 0x4b, 0xd8,
- 0xee, 0xe3, 0x4d, 0xcc, 0x9c, 0xfc, 0x7c, 0xd4, 0x3e, 0xcc, 0x86, 0x9e,
- 0x28, 0xa2, 0x7f, 0x90, 0x2f, 0xe8, 0xae, 0xfd, 0x8f, 0x7b, 0x18, 0xd3,
- 0x39, 0x10, 0xfd, 0xae, 0xda, 0x90, 0x50, 0xa8, 0xc9, 0x15, 0x79, 0xa2,
- 0x95, 0x6f, 0x3c, 0xa6, 0x8a, 0xfb, 0x93, 0x48, 0xa0, 0x1f, 0xd1, 0x31,
- 0x33, 0x9d, 0xc5, 0x9d, 0x1b, 0xd0, 0x2b, 0x99, 0xd5, 0x0c, 0x6f, 0x0f,
- 0x2e, 0xcf, 0x7e, 0x21, 0xc8, 0x5a, 0xda, 0x1a, 0x1b, 0x15, 0x9c, 0xbf,
- 0xf9, 0x7c, 0x4b, 0xd1, 0x47, 0x2d, 0x9c, 0x92, 0x70, 0x11, 0x29, 0xda,
- 0xd2, 0xfa, 0x0f, 0xf5, 0xd5, 0xd3, 0xf5, 0xef, 0x0e, 0x47, 0x50, 0xdc,
- 0x07, 0x5f, 0x7c, 0xfb, 0xf2, 0xf4, 0xc3, 0xf1, 0xc1, 0x1f, 0x13, 0xfa,
- 0xd7, 0x21, 0xff, 0xeb, 0x70, 0x2b, 0x76, 0x5c, 0x86, 0x51, 0x6d, 0x7f,
- 0xb1, 0x9d, 0xd4, 0x77, 0xcb, 0x49, 0xb9, 0xb0, 0x07, 0x26, 0x5b, 0xa1,
- 0x81, 0xb4, 0x81, 0x48, 0x71, 0x5b, 0xba, 0x2d, 0xae, 0xf2, 0x2e, 0xcb,
- 0xae, 0x25, 0xe9, 0x50, 0xd9, 0x0d, 0x22, 0x78, 0x7e, 0x2d, 0x71, 0x83,
- 0x4a, 0x6b, 0xe5, 0x61, 0x12, 0xcb, 0xeb, 0x4b, 0x04, 0x85, 0x50, 0xd2,
- 0x8b, 0x5d, 0x47, 0x38, 0x07, 0x8b, 0x17, 0x07, 0xe9, 0xec, 0x33, 0x8c,
- 0x30, 0xdb, 0xcc, 0x70, 0x27, 0x5c, 0x29, 0x8b, 0x3b, 0xcd, 0xaf, 0x8b,
- 0x81, 0x40, 0x68, 0x1c, 0x77, 0x82, 0x3f, 0xb0, 0x5d, 0x65, 0x96, 0xf5,
- 0x62, 0xd5, 0xf4, 0x6e, 0x77, 0xb8, 0x89, 0xe8, 0x2e, 0x1e, 0x34, 0xd7,
- 0x29, 0xa1, 0x81, 0x0d, 0x35, 0x3d, 0xc3, 0xb9, 0x3a, 0xc8, 0x18, 0x9d,
- 0x91, 0x66, 0xad, 0xfe, 0x8c, 0xc4, 0x03, 0x7f, 0xb6, 0x30, 0x92, 0x82,
- 0xc3, 0x98, 0xb4, 0x42, 0x82, 0xec, 0x6b, 0x0e, 0xa1, 0x57, 0x18, 0x08,
- 0xc6, 0x6c, 0x0e, 0xd2, 0x4d, 0x96, 0x41, 0x76, 0x56, 0x61, 0x34, 0xc9,
- 0x1d, 0xc3, 0xde, 0x77, 0x7d, 0x4c, 0x10, 0x3d, 0x3e, 0x71, 0x4b, 0x34,
- 0x36, 0xa2, 0xda, 0x13, 0x2b, 0xb8, 0xb8, 0x6a, 0x09, 0x1a, 0x55, 0xf9,
- 0xb4, 0xc0, 0x99, 0xe3, 0xb3, 0x22, 0x39, 0x78, 0x18, 0x26, 0x53, 0xca,
- 0xde, 0x5c, 0xa4, 0x01, 0x12, 0x0d, 0xee, 0x9a, 0xc2, 0x61, 0x50, 0xa0,
- 0xdf, 0x12, 0xbe, 0xf9, 0xfe, 0xdd, 0x22, 0xdb, 0x55, 0xc3, 0x40, 0x85,
- 0xdd, 0xde, 0xdb, 0xf2, 0x1f, 0x66, 0xde, 0xa9, 0x7c, 0x24, 0x26, 0x33,
- 0x45, 0x04, 0xf6, 0xce, 0xdc, 0xf1, 0x17, 0x2e, 0x13, 0xf7, 0xb9, 0x46,
- 0xcb, 0x36, 0x46, 0x10, 0x98, 0xf4, 0x32, 0xa4, 0x6a, 0x07, 0xa4, 0x23,
- 0xda, 0x45, 0x20, 0xa1, 0x3d, 0xbc, 0x19, 0x43, 0xca, 0xa5, 0x64, 0xe8,
- 0x58, 0x12, 0x13, 0xb1, 0xd3, 0x65, 0xe1, 0x5d, 0x9d, 0xaa, 0x47, 0x10,
- 0x1d, 0xdf, 0x66, 0xd5, 0x94, 0xa0, 0x26, 0xa6, 0x46, 0x2f, 0x05, 0x3f,
- 0x9d, 0x8b, 0x7b, 0x8a, 0x72, 0xa9, 0x24, 0x2b, 0xbe, 0x8d, 0x0b, 0x03,
- 0xf1, 0xab, 0x74, 0xd6, 0x4b, 0x62, 0xc8, 0x7d, 0x98, 0x1a, 0xc2, 0x18,
- 0x59, 0x08, 0x3c, 0x15, 0x90, 0x6d, 0xf6, 0xa1, 0x45, 0x66, 0x08, 0x27,
- 0x04, 0x19, 0x7b, 0xd8, 0x61, 0x7d, 0xd1, 0x3b, 0x4d, 0x21, 0x17, 0xcc,
- 0x85, 0x01, 0xcd, 0x5c, 0x74, 0x88, 0xa0, 0x02, 0x80, 0x0b, 0xd5, 0x9f,
- 0x9e, 0x68, 0x4f, 0x07, 0xf8, 0x1d, 0x88, 0x96, 0x14, 0x77, 0x8a, 0x26,
- 0xb5, 0x03, 0xb1, 0xc9, 0xca, 0xa1, 0x62, 0x0e, 0x42, 0xf3, 0x0a, 0x8b,
- 0x91, 0x17, 0xe5, 0x0d, 0xc5, 0x60, 0xda, 0x08, 0xa0, 0x0a, 0xf6, 0xc3,
- 0x39, 0x75, 0xcc, 0x97, 0x87, 0xa4, 0x2b, 0xf1, 0x67, 0x47, 0x1a, 0xad,
- 0x8d, 0x52, 0x80, 0x96, 0xd3, 0x76, 0x2b, 0x91, 0x52, 0x97, 0x41, 0xd1,
- 0xb0, 0x33, 0x99, 0xf5, 0x0b, 0x07, 0xc0, 0x15, 0x13, 0x6c, 0x58, 0xf1,
- 0xa4, 0x6c, 0xae, 0xbc, 0x3c, 0x54, 0x02, 0xf5, 0x23, 0x3f, 0xcf, 0x7c,
- 0xdd, 0xc0, 0x08, 0x50, 0x33, 0xb0, 0x91, 0x54, 0x63, 0x71, 0x16, 0x05,
- 0x59, 0x0f, 0x9f, 0x08, 0xfc, 0x8d, 0x96, 0x68, 0x01, 0x6c, 0x29, 0x81,
- 0xb6, 0x40, 0xa6, 0x38, 0xd1, 0xa5, 0x31, 0x80, 0x81, 0x2f, 0x68, 0xbe,
- 0x49, 0x89, 0x4a, 0x75, 0x4d, 0x58, 0x72, 0x48, 0x49, 0x35, 0x1b, 0x1b,
- 0x40, 0x4e, 0x00, 0x24, 0xa9, 0xf0, 0x8f, 0x74, 0x87, 0xe1, 0x6f, 0x1c,
- 0x70, 0x13, 0xe3, 0x62, 0x90, 0xd5, 0x3e, 0x91, 0xa3, 0xa9, 0x71, 0x7f,
- 0x89, 0x1e, 0x22, 0x4e, 0x11, 0xab, 0xbf, 0xf6, 0x5c, 0xd8, 0x7f, 0xd9,
- 0xa8, 0x09, 0x8c, 0xbc, 0xaa, 0x66, 0x00, 0x5d, 0x40, 0x10, 0xdb, 0xc4,
- 0x78, 0x6c, 0x77, 0xc8, 0xb8, 0x52, 0x17, 0x7f, 0x8b, 0xc5, 0x79, 0xd7,
- 0xab, 0x19, 0xd4, 0x3e, 0x7d, 0x07, 0x8a, 0x92, 0x07, 0x84, 0x59, 0x97,
- 0x72, 0x1b, 0x31, 0x3c, 0x31, 0x19, 0xc7, 0x65, 0x62, 0x20, 0x39, 0xdd,
- 0xfb, 0xef, 0x07, 0x58, 0x5a, 0x48, 0x6d, 0xec, 0xc3, 0x59, 0xfa, 0xbc,
- 0xc1, 0xbc, 0x08, 0xe1, 0x3b, 0x34, 0xb4, 0x5f, 0xc7, 0x02, 0x95, 0x2a,
- 0xc0, 0x0d, 0x87, 0xff, 0xdb, 0xba, 0x98, 0x76, 0x64, 0x54, 0x39, 0xf0,
- 0xf0, 0x38, 0x25, 0x2a, 0x6b, 0x25, 0x44, 0x97, 0xe8, 0xf1, 0x21, 0x81,
- 0xbf, 0xa1, 0x8a, 0x50, 0xaa, 0xde, 0x20, 0xf1, 0xb6, 0xf0, 0x4a, 0x68,
- 0xaf, 0x72, 0x73, 0x42, 0xd5, 0xf4, 0x0a, 0x48, 0x02, 0xf0, 0x23, 0x65,
- 0xea, 0x1c, 0x0d, 0x14, 0x61, 0xf1, 0xfc, 0x63, 0x58, 0xd1, 0xc5, 0x72,
- 0x62, 0x47, 0x84, 0x16, 0x52, 0x16, 0xca, 0xa4, 0xfb, 0xe6, 0x19, 0x66,
- 0x76, 0x5d, 0xd1, 0x9e, 0x67, 0x8b, 0xda, 0x09, 0x48, 0xfb, 0x8e, 0x93,
- 0x94, 0x30, 0xc2, 0x0b, 0xf8, 0x64, 0x59, 0x14, 0xe7, 0xd1, 0x1b, 0x8e,
- 0x99, 0x18, 0x35, 0x47, 0x26, 0x43, 0x76, 0x25, 0xd1, 0xc9, 0x9d, 0x62,
- 0xcc, 0xc8, 0x08, 0x5d, 0x98, 0x99, 0x40, 0xf2, 0x94, 0x76, 0xdf, 0x04,
- 0xc0, 0x46, 0xb7, 0x2a, 0x57, 0xbc, 0x75, 0x26, 0x15, 0x72, 0x64, 0x50,
- 0xf9, 0x34, 0xfa, 0x80, 0x50, 0xfc, 0x6b, 0x38, 0x9c, 0x37, 0x41, 0xba,
- 0x96, 0x77, 0xd6, 0x6d, 0x12, 0x58, 0xcc, 0x05, 0xa3, 0xe7, 0xad, 0xa2,
- 0xf1, 0x5d, 0x53, 0x0d, 0x4f, 0x72, 0xfa, 0x86, 0xbd, 0x78, 0xaf, 0xde,
- 0xd3, 0xdf, 0x72, 0x8b, 0x50, 0x84, 0x3a, 0x5c, 0x34, 0xf6, 0xe0, 0x04,
- 0xd9, 0xb7, 0xdf, 0x76, 0xcb, 0x30, 0x77, 0xce, 0xc6, 0x7b, 0x47, 0xcf,
- 0xf6, 0x77, 0x23, 0x39, 0xcb, 0xe6, 0x1b, 0x3e, 0x4e, 0xe1, 0xa3, 0xfd,
- 0xd1, 0xfe, 0x6e, 0x67, 0x36, 0xb4, 0xdd, 0x1b, 0x00, 0x54, 0x14, 0x5d,
- 0xdd, 0x0a, 0x0d, 0x24, 0x23, 0xbb, 0x62, 0x2d, 0xc9, 0x9b, 0xf6, 0x8b,
- 0x49, 0xdf, 0x67, 0xd7, 0x86, 0xd4, 0xa2, 0xf9, 0x6b, 0xa7, 0x79, 0x2d,
- 0x86, 0x0d, 0x49, 0x32, 0x95, 0x2d, 0x54, 0xad, 0xdd, 0xce, 0x09, 0xc6,
- 0x23, 0x24, 0x2c, 0x39, 0xd7, 0x21, 0x12, 0x6d, 0xa9, 0xcd, 0xa4, 0x2a,
- 0x24, 0xe6, 0x21, 0xa6, 0xff, 0xab, 0x3b, 0x5b, 0x5e, 0xb6, 0xd0, 0x1e,
- 0x9f, 0xfa, 0x67, 0x4a, 0x9a, 0xfe, 0x30, 0xad, 0xa7, 0x79, 0xce, 0xf6,
- 0x4c, 0x8f, 0x19, 0xa3, 0x19, 0x8f, 0xc0, 0x90, 0x43, 0x25, 0x75, 0x9e,
- 0x72, 0xa8, 0xd6, 0x01, 0x95, 0x06, 0xc3, 0x92, 0xb2, 0x6a, 0x48, 0x6c,
- 0xd3, 0xb8, 0x62, 0xc3, 0x53, 0xb3, 0x16, 0xc1, 0x56, 0xb6, 0xfa, 0x65,
- 0xdd, 0x55, 0xa3, 0xcc, 0x5d, 0x60, 0xb8, 0xb2, 0x55, 0x15, 0xd6, 0xf7,
- 0x51, 0x6e, 0x26, 0x32, 0x9e, 0xd3, 0xa6, 0x2e, 0x69, 0x9f, 0x62, 0x9b,
- 0x0a, 0x0f, 0x05, 0xd0, 0x69, 0xad, 0x01, 0x65, 0xef, 0xbe, 0xe4, 0x03,
- 0x7d, 0x39, 0x70, 0xe9, 0x3a, 0x2d, 0x03, 0x28, 0x8d, 0x28, 0x82, 0x0c,
- 0xae, 0x9f, 0x20, 0x3c, 0xce, 0x95, 0x54, 0xb4, 0x10, 0x69, 0x31, 0x01,
- 0xb7, 0x07, 0xe7, 0x88, 0x48, 0x83, 0x09, 0x82, 0x21, 0xb2, 0xbb, 0x15,
- 0x01, 0x97, 0x1a, 0x98, 0xf5, 0x01, 0xba, 0x13, 0x14, 0x54, 0x64, 0x37,
- 0xc4, 0x8d, 0x6b, 0x51, 0x25, 0xaa, 0x2a, 0x27, 0xbf, 0x91, 0x4d, 0x2e,
- 0x60, 0x75, 0x8c, 0xb2, 0x30, 0x49, 0x38, 0xcf, 0x22, 0xb5, 0xdd, 0x53,
- 0xdc, 0xce, 0xda, 0xe6, 0x6c, 0x17, 0x80, 0x9f, 0x24, 0x7c, 0xb9, 0x60,
- 0x6f, 0xd0, 0x1f, 0x00, 0x93, 0x53, 0xd0, 0xd9, 0xa6, 0x9d, 0xfe, 0x41,
- 0x5a, 0x3b, 0xe7, 0x37, 0x33, 0xbc, 0x59, 0xd9, 0x32, 0x30, 0xeb, 0xfe,
- 0x70, 0xc9, 0xde, 0xed, 0xf0, 0xe6, 0xe6, 0x66, 0x48, 0x17, 0x8e, 0x72,
- 0x72, 0xa4, 0xcc, 0x62, 0xd4, 0x02, 0x8f, 0x86, 0x5d, 0xc9, 0x26, 0x27,
- 0x31, 0x91, 0x30, 0xbe, 0xe1, 0xa5, 0x48, 0x55, 0x93, 0xbc, 0x41, 0x3d,
- 0x9f, 0x10, 0x17, 0x5e, 0x93, 0xba, 0x3a, 0x99, 0x0e, 0x34, 0x1c, 0x75,
- 0x44, 0x45, 0x6e, 0x9f, 0x5b, 0x0b, 0xc1, 0x4f, 0x4d, 0x9b, 0x8c, 0xea,
- 0xd7, 0xcd, 0x27, 0x96, 0xcf, 0x93, 0xe1, 0xd7, 0xc9, 0xd6, 0x2b, 0x59,
- 0xed, 0x85, 0x79, 0xe2, 0x79, 0x7b, 0x2d, 0xfc, 0x70, 0x18, 0xcc, 0x31,
- 0xef, 0x6e, 0x3d, 0x0c, 0x3e, 0xb1, 0xf7, 0x22, 0xa3, 0xbb, 0x8a, 0xcb,
- 0x9a, 0x69, 0x22, 0xce, 0x3a, 0x4a, 0x7b, 0x61, 0xb7, 0x16, 0x63, 0x9e,
- 0x61, 0xe9, 0x69, 0x2d, 0x9d, 0x78, 0x26, 0x7c, 0xc3, 0x37, 0x5c, 0xc7,
- 0x2a, 0xbd, 0xb9, 0xff, 0x8e, 0x7b, 0x37, 0x51, 0xa8, 0x77, 0x01, 0x57,
- 0x97, 0x87, 0x47, 0x4c, 0xfe, 0x1d, 0x9b, 0x84, 0x19, 0x99, 0xa9, 0xf4,
- 0xc1, 0x70, 0xc5, 0x54, 0x6c, 0x98, 0x8a, 0x5e, 0xfa, 0xe5, 0x86, 0x3a,
- 0x34, 0xe7, 0x14, 0x76, 0xab, 0x68, 0x45, 0x3e, 0x3a, 0xb0, 0xa6, 0x58,
- 0x96, 0xa5, 0xaa, 0x07, 0x30, 0x1a, 0xb7, 0xba, 0x81, 0xbd, 0x9c, 0x42,
- 0xcb, 0xec, 0xd8, 0xf3, 0x96, 0x29, 0x08, 0xb8, 0xb1, 0xf4, 0x4e, 0x8e,
- 0x73, 0xd0, 0x55, 0x55, 0x80, 0x32, 0x71, 0x59, 0x65, 0x15, 0x11, 0x3a,
- 0xb2, 0xe0, 0x87, 0x9a, 0xc2, 0x1c, 0x13, 0xd6, 0x86, 0xa1, 0xbc, 0xfa,
- 0xea, 0x04, 0xd9, 0xdc, 0x86, 0x91, 0x16, 0x02, 0xe2, 0xc0, 0xf3, 0xe7,
- 0x96, 0x47, 0xd6, 0xa8, 0xbd, 0x24, 0x56, 0xc2, 0x25, 0x91, 0x69, 0x12,
- 0x03, 0x40, 0x55, 0x9b, 0x23, 0x51, 0xe3, 0x42, 0x92, 0x56, 0xc5, 0x46,
- 0x90, 0xcb, 0x6b, 0xc3, 0xbb, 0xa9, 0x2b, 0x11, 0x88, 0xee, 0x17, 0xbe,
- 0xae, 0x60, 0x23, 0x69, 0x2d, 0x11, 0x5c, 0x28, 0x6b, 0x41, 0xfa, 0xb8,
- 0xa3, 0x57, 0x6e, 0x21, 0x95, 0x85, 0x79, 0x6f, 0xf2, 0xf9, 0x78, 0x87,
- 0x37, 0x9c, 0x49, 0xc7, 0x93, 0x62, 0xb7, 0x2e, 0xf3, 0x3d, 0x06, 0x5c,
- 0x8b, 0x45, 0xbe, 0xb4, 0x98, 0xe7, 0xd6, 0x26, 0x46, 0x1a, 0x66, 0xfc,
- 0x1f, 0x24, 0xa1, 0x20, 0x77, 0x0d, 0xcf, 0x23, 0xcd, 0x43, 0xeb, 0x25,
- 0xfd, 0xd1, 0x14, 0xca, 0x4f, 0x12, 0x62, 0xe3, 0xc3, 0x91, 0xfd, 0xf7,
- 0x05, 0x69, 0x4b, 0x5f, 0x8a, 0xa3, 0x8a, 0xf2, 0xe0, 0x6b, 0xcf, 0x1a,
- 0x91, 0x62, 0x59, 0xcc, 0x5d, 0x6b, 0x84, 0x68, 0x1b, 0xe2, 0xc3, 0x71,
- 0x84, 0xd3, 0xdb, 0x3d, 0xa6, 0x38, 0x82, 0x9d, 0xaf, 0xb9, 0x8d, 0xd8,
- 0xbf, 0x75, 0x37, 0xef, 0x8b, 0xfb, 0x77, 0xef, 0xa7, 0x6e, 0xdf, 0xe6,
- 0xdd, 0xe3, 0xf6, 0x0d, 0x9a, 0x2c, 0xfb, 0x85, 0xe7, 0xa0, 0x43, 0xb2,
- 0x07, 0x5b, 0x5f, 0xd6, 0x51, 0xd7, 0xe6, 0x32, 0x9e, 0x91, 0xf9, 0xc5,
- 0x2f, 0x75, 0xea, 0x20, 0x46, 0x58, 0xf4, 0x34, 0xf9, 0xf8, 0x70, 0x1c,
- 0x56, 0xc4, 0xd9, 0xfb, 0xd8, 0x8b, 0xa2, 0x87, 0x63, 0x04, 0xc1, 0x2f,
- 0x9e, 0x36, 0x4c, 0xcc, 0x13, 0xa4, 0x79, 0x0e, 0xe3, 0xc3, 0x69, 0x21,
- 0xa0, 0x28, 0xe2, 0xc1, 0xfa, 0xbe, 0x54, 0xc1, 0xff, 0xf0, 0xc5, 0x21,
- 0xad, 0xc8, 0xb5, 0x0c, 0xf4, 0x33, 0x42, 0x38, 0x04, 0xb3, 0x13, 0xfa,
- 0x0d, 0xf5, 0xfa, 0x08, 0x0c, 0x24, 0xb7, 0x90, 0x52, 0x95, 0x60, 0x77,
- 0xd0, 0xde, 0x30, 0x82, 0xba, 0x83, 0x30, 0xd0, 0x53, 0xce, 0x7b, 0xcf,
- 0x58, 0xcf, 0x8e, 0xda, 0x32, 0x44, 0xcf, 0xee, 0xff, 0xa6, 0xf5, 0x81,
- 0x9e, 0x1d, 0x19, 0x50, 0x84, 0xa1, 0x66, 0x0c, 0x6f, 0x24, 0xdd, 0x27,
- 0xa8, 0x56, 0x20, 0x11, 0xdf, 0x33, 0x3b, 0xa0, 0x0f, 0x90, 0x52, 0x44,
- 0xf1, 0xd6, 0x85, 0xc0, 0x85, 0x32, 0xcc, 0xfb, 0x17, 0x4e, 0x99, 0x19,
- 0xd2, 0x22, 0x87, 0x42, 0xb2, 0x23, 0x10, 0xe1, 0x06, 0x4a, 0xb5, 0x94,
- 0x19, 0x27, 0xca, 0x80, 0xfc, 0xfa, 0x45, 0xa3, 0xe2, 0xab, 0x8a, 0x6c,
- 0x6f, 0x49, 0xca, 0x83, 0xcf, 0x5b, 0x92, 0xd2, 0xbd, 0xb3, 0x49, 0x46,
- 0x8e, 0x33, 0x4e, 0x48, 0xf3, 0x1d, 0x98, 0x78, 0x89, 0xab, 0xac, 0xa9,
- 0x91, 0x47, 0x98, 0xda, 0x44, 0xaf, 0x06, 0x45, 0xc7, 0x9c, 0x5b, 0xe4,
- 0xd5, 0x4e, 0x22, 0xc1, 0x9c, 0xa2, 0x66, 0x62, 0x1d, 0x25, 0x93, 0xaa,
- 0xbc, 0xa9, 0xa1, 0x8e, 0xaa, 0x81, 0x9a, 0x72, 0x0a, 0xec, 0x55, 0x50,
- 0x12, 0x6d, 0xb6, 0x77, 0x61, 0x71, 0x60, 0xbf, 0xbe, 0x78, 0x7b, 0xca,
- 0x8d, 0x1d, 0xb8, 0x3a, 0x97, 0x8a, 0x90, 0x64, 0xce, 0xeb, 0xc9, 0xd2,
- 0x58, 0xd2, 0x46, 0x3b, 0x69, 0x98, 0x95, 0x29, 0x77, 0x0c, 0x4a, 0x88,
- 0x11, 0xd2, 0x93, 0x80, 0xf0, 0x2a, 0x16, 0x9f, 0x11, 0x45, 0xd2, 0xc3,
- 0xa1, 0xf2, 0x34, 0xe0, 0x9f, 0xae, 0xeb, 0x1a, 0x3b, 0x19, 0x19, 0x31,
- 0xd0, 0xa3, 0xde, 0xd0, 0x51, 0xd0, 0x23, 0xc1, 0xed, 0xf3, 0xd4, 0x34,
- 0xf4, 0x1f, 0x03, 0xa4, 0xb4, 0xf5, 0xd0, 0x90, 0xd6, 0x65, 0x9b, 0x8f,
- 0x00, 0x35, 0x2b, 0x6d, 0x6b, 0x5a, 0x41, 0x59, 0xad, 0xd5, 0xbc, 0x5c,
- 0x1b, 0x11, 0x5f, 0xf9, 0x22, 0x3d, 0x84, 0xf4, 0x21, 0x09, 0x24, 0xad,
- 0x2b, 0x72, 0xe6, 0xb1, 0x56, 0x3d, 0x88, 0xe4, 0xdc, 0x8b, 0x42, 0xa2,
- 0xde, 0x7c, 0x1b, 0xda, 0x6c, 0x99, 0x7a, 0xda, 0x2f, 0x81, 0xc6, 0xf6,
- 0x6e, 0x70, 0x44, 0x49, 0x64, 0x84, 0x2a, 0x14, 0x53, 0xe0, 0x34, 0x0d,
- 0xb1, 0x99, 0xd1, 0xd1, 0x0e, 0x2c, 0x85, 0x73, 0x3c, 0x50, 0xef, 0xa2,
- 0x0a, 0xb6, 0x6b, 0x26, 0x52, 0xbb, 0xfe, 0x11, 0x6a, 0x2f, 0x03, 0xa8,
- 0x0b, 0xd0, 0x5c, 0x68, 0x20, 0x51, 0xb6, 0xfd, 0x5d, 0xa1, 0xff, 0x51,
- 0xfc, 0x5f, 0x03, 0x2f, 0xbc, 0x96, 0x93, 0x07, 0xca, 0x8f, 0x17, 0xba,
- 0xc8, 0xfa, 0x32, 0xab, 0x2e, 0xb9, 0x0c, 0x81, 0x21, 0x61, 0xa3, 0x28,
- 0x16, 0x69, 0xe2, 0xa1, 0xb4, 0x25, 0xc9, 0x7f, 0x19, 0xb2, 0x44, 0x85,
- 0xab, 0x6a, 0x4d, 0xf5, 0x2f, 0xe2, 0x4f, 0xdf, 0x1e, 0xce, 0x98, 0xad,
- 0xcc, 0xd2, 0xc2, 0xec, 0x84, 0xb9, 0xb1, 0x61, 0x7e, 0xcc, 0x62, 0xf1,
- 0xc5, 0xa2, 0x5c, 0xd7, 0x77, 0xdb, 0x89, 0xf4, 0xf2, 0x91, 0xf6, 0x17,
- 0x8d, 0xe4, 0xf2, 0xd0, 0x59, 0x9a, 0xf3, 0x5d, 0x17, 0x9f, 0x54, 0x28,
- 0x52, 0xa5, 0x42, 0xcd, 0x8e, 0xda, 0xce, 0x70, 0xdb, 0xde, 0xc7, 0xfe,
- 0x8b, 0x3f, 0x76, 0x74, 0x97, 0xe1, 0xfe, 0x67, 0xc3, 0xf9, 0x61, 0x96,
- 0xb3, 0x0b, 0xc9, 0xc4, 0xcc, 0xe6, 0xa4, 0x15, 0xa9, 0xb3, 0x03, 0x92,
- 0xf0, 0x60, 0x18, 0x5e, 0x0d, 0x39, 0xb8, 0xd4, 0x0d, 0xf0, 0x9b, 0x9e,
- 0xe2, 0x13, 0x27, 0x79, 0x38, 0xa0, 0xe4, 0x90, 0xf3, 0x18, 0xc2, 0xc4,
- 0xf6, 0xbe, 0xf1, 0x4b, 0xe0, 0x46, 0xc9, 0xb9, 0xd9, 0xaf, 0x00, 0x6a,
- 0x82, 0x22, 0xd9, 0x76, 0xb8, 0xb4, 0x05, 0x7a, 0x3a, 0x2f, 0xcb, 0x49,
- 0x5a, 0x6d, 0xcb, 0xde, 0x03, 0x55, 0xdd, 0x0c, 0x38, 0x63, 0xe7, 0x0b,
- 0x9d, 0xf5, 0x70, 0x36, 0x88, 0xde, 0x68, 0xd2, 0x19, 0xf0, 0xee, 0x48,
- 0x8b, 0x3a, 0xf4, 0xe7, 0x14, 0x20, 0x2f, 0x17, 0x33, 0xbb, 0x15, 0xfe,
- 0x57, 0x23, 0x87, 0x86, 0xda, 0x04, 0xe7, 0x0a, 0x50, 0x4f, 0x00, 0xca,
- 0x5b, 0xd4, 0x59, 0x60, 0x9d, 0xfa, 0x84, 0xe2, 0x4e, 0xb0, 0x21, 0x94,
- 0x38, 0x11, 0x87, 0x6d, 0x91, 0x20, 0x89, 0x35, 0xc1, 0x3d, 0xe6, 0x40,
- 0x33, 0x8a, 0xf1, 0x18, 0xc7, 0x53, 0x42, 0x87, 0xbb, 0xcf, 0xbe, 0x24,
- 0x5b, 0x75, 0x43, 0xa6, 0x9b, 0xcf, 0x35, 0x3c, 0x39, 0xe6, 0x8c, 0xb9,
- 0xae, 0x70, 0xdb, 0xe0, 0xda, 0x75, 0xb8, 0xb8, 0x60, 0xaf, 0xc2, 0x5f,
- 0xd9, 0x09, 0x32, 0x3c, 0xd1, 0x2c, 0x3a, 0xfe, 0xe7, 0x05, 0x10, 0x9b,
- 0xe1, 0x9c, 0x1c, 0x46, 0x48, 0xb3, 0x65, 0x5d, 0x66, 0x8b, 0xec, 0x92,
- 0x57, 0xfb, 0xe2, 0xf4, 0xf8, 0xdb, 0xe3, 0xd3, 0x40, 0x6c, 0x7e, 0x35,
- 0x1e, 0xef, 0x7d, 0xca, 0xaa, 0x09, 0x9a, 0xb2, 0x52, 0xe0, 0x22, 0xc1,
- 0x73, 0x36, 0xc1, 0xcb, 0x93, 0x25, 0x37, 0x0e, 0xb2, 0x45, 0x12, 0xbd,
- 0x03, 0x9f, 0x0d, 0x65, 0xf0, 0xf2, 0x27, 0x05, 0xe6, 0x1d, 0x25, 0x47,
- 0x92, 0x4b, 0x08, 0xd9, 0x38, 0xad, 0xb2, 0x19, 0xf7, 0x2c, 0x0d, 0xb3,
- 0x08, 0x81, 0xec, 0x41, 0x7d, 0x39, 0xe8, 0x50, 0x39, 0x93, 0x1c, 0x01,
- 0x2c, 0xbb, 0x88, 0xe0, 0x8d, 0x15, 0xaa, 0xe7, 0x93, 0xd7, 0xf2, 0x4d,
- 0xa9, 0x47, 0xa5, 0x5d, 0x62, 0x60, 0x37, 0xb6, 0x52, 0xce, 0xbe, 0x19,
- 0xbe, 0x1c, 0x0f, 0x5f, 0x1f, 0x9f, 0x1e, 0x7f, 0xf5, 0xf2, 0xe2, 0xd8,
- 0xe2, 0x99, 0xd7, 0x59, 0x8f, 0x0a, 0x26, 0xfa, 0xd7, 0x37, 0xb2, 0x2d,
- 0x58, 0x3f, 0x61, 0xe1, 0x37, 0x39, 0x37, 0x64, 0x51, 0xc8, 0x7f, 0xee,
- 0xac, 0x4d, 0x56, 0x51, 0xc3, 0x79, 0x82, 0xf1, 0xe1, 0xcc, 0xbd, 0x58,
- 0x2c, 0x65, 0xaa, 0xc1, 0x0a, 0xd2, 0xc5, 0x0d, 0x35, 0x66, 0xfb, 0x50,
- 0x50, 0x2a, 0x7d, 0x6e, 0x4b, 0x49, 0x79, 0xf5, 0xbe, 0x47, 0xc8, 0xed,
- 0x6c, 0xeb, 0x80, 0x81, 0x4c, 0xdf, 0xe3, 0x2f, 0xd0, 0x32, 0x70, 0xc4,
- 0x8f, 0x5f, 0xe3, 0xc9, 0x0e, 0xc6, 0xb8, 0x83, 0x46, 0x27, 0x06, 0x23,
- 0xbf, 0x8a, 0x00, 0x96, 0x10, 0x01, 0xd5, 0xd3, 0xab, 0x6c, 0x29, 0xaa,
- 0x2c, 0xa5, 0x26, 0x20, 0x08, 0xce, 0x35, 0x95, 0x82, 0x17, 0xc4, 0x29,
- 0x64, 0x93, 0x8c, 0x21, 0x17, 0x80, 0x91, 0x46, 0x74, 0x1d, 0x4b, 0xf5,
- 0xbd, 0xa1, 0x8e, 0x03, 0x14, 0x6b, 0xa1, 0xb4, 0x1d, 0x14, 0x18, 0x8f,
- 0x90, 0x60, 0xe8, 0xe5, 0x0d, 0x84, 0x79, 0x02, 0xdc, 0x3d, 0xb0, 0x7b,
- 0x67, 0x2d, 0x80, 0xb9, 0x45, 0x5b, 0x2f, 0xe1, 0x3a, 0xc3, 0x8f, 0xb8,
- 0x79, 0x89, 0xe8, 0xdc, 0x34, 0xc9, 0x9f, 0xe9, 0xa8, 0x96, 0xf2, 0x04,
- 0x29, 0x37, 0x24, 0x37, 0x16, 0xcc, 0xe0, 0x78, 0xd6, 0x76, 0x94, 0x69,
- 0x48, 0x37, 0x56, 0x6f, 0xba, 0xcc, 0x1e, 0x18, 0x5a, 0x7d, 0x26, 0xa7,
- 0x83, 0x1f, 0x49, 0x23, 0x02, 0x9b, 0xe2, 0x11, 0x75, 0xe5, 0x3b, 0x8e,
- 0xd1, 0xee, 0x55, 0x40, 0x18, 0xf1, 0xfa, 0xd7, 0xb0, 0xa3, 0x84, 0x2d,
- 0xb5, 0x1b, 0x66, 0xab, 0x00, 0xb0, 0x7b, 0xe7, 0x8d, 0xe2, 0xef, 0x5b,
- 0xdd, 0xd2, 0xef, 0xb5, 0xe6, 0xb5, 0x46, 0x3a, 0x3e, 0x7f, 0xcf, 0xdd,
- 0xd5, 0x4f, 0xe9, 0x2f, 0x12, 0x79, 0xab, 0x63, 0xf8, 0x77, 0xd2, 0xfd,
- 0x83, 0x92, 0x51, 0x32, 0x84, 0x6e, 0x6c, 0x30, 0x5d, 0x93, 0x11, 0x39,
- 0xff, 0x54, 0x80, 0xd6, 0xe5, 0x3a, 0x60, 0x8b, 0x83, 0xe4, 0x7f, 0xdb,
- 0xa0, 0x93, 0x66, 0x42, 0x53, 0x10, 0x84, 0x22, 0x4c, 0x82, 0x73, 0x68,
- 0x35, 0x40, 0x72, 0x46, 0xbf, 0x24, 0x7d, 0x93, 0xe5, 0x5a, 0xd3, 0xc7,
- 0x79, 0xb9, 0x05, 0x82, 0xa8, 0x44, 0x34, 0x2c, 0xbd, 0x99, 0x54, 0x68,
- 0xe7, 0x9a, 0x9a, 0xa9, 0x8c, 0x3a, 0x4b, 0x45, 0x43, 0x2e, 0x82, 0xdd,
- 0x0c, 0xe3, 0x21, 0x68, 0x45, 0x26, 0x8e, 0x38, 0xc9, 0x4a, 0xc7, 0x82,
- 0x35, 0xd7, 0x7e, 0x20, 0x39, 0x06, 0x64, 0x41, 0xa0, 0xed, 0x10, 0xd7,
- 0x0b, 0x20, 0xf9, 0x20, 0xd0, 0xf0, 0xa5, 0x26, 0x41, 0x33, 0xd1, 0xb2,
- 0x3b, 0x09, 0x9b, 0xb3, 0x42, 0x38, 0x97, 0xf0, 0x64, 0x0a, 0x40, 0x59,
- 0x98, 0x36, 0x13, 0xd6, 0x60, 0x90, 0xd5, 0x77, 0x95, 0x16, 0x91, 0x3b,
- 0x67, 0x36, 0xde, 0xf6, 0x44, 0xc3, 0x2a, 0xe5, 0xd8, 0x22, 0x4a, 0x3c,
- 0xd1, 0x46, 0x17, 0xd6, 0xca, 0x18, 0x7a, 0x86, 0x81, 0xe5, 0x14, 0xd7,
- 0x90, 0xa9, 0xf0, 0xce, 0xa0, 0x31, 0x90, 0xd0, 0x5b, 0x19, 0xa3, 0x2a,
- 0x61, 0x2e, 0x2e, 0xda, 0xd2, 0x22, 0xc1, 0xfe, 0xa2, 0x6f, 0xeb, 0x99,
- 0x47, 0x85, 0x8d, 0x87, 0xaa, 0x4b, 0x3d, 0x86, 0xdb, 0x25, 0x38, 0x38,
- 0x3e, 0x08, 0xfb, 0xa2, 0x9b, 0x81, 0x92, 0x71, 0xd1, 0x85, 0xf9, 0x36,
- 0xa6, 0x4b, 0x6e, 0x20, 0x1b, 0x91, 0x25, 0xe2, 0x09, 0xbe, 0xff, 0x1a,
- 0x93, 0xa3, 0xef, 0xe0, 0x05, 0xdc, 0x7b, 0x82, 0x1e, 0xba, 0xd4, 0x1e,
- 0x4f, 0x4c, 0xca, 0x93, 0xcc, 0x7c, 0x2f, 0xa7, 0x1e, 0x78, 0x7e, 0x18,
- 0x20, 0x4c, 0x73, 0xae, 0x0d, 0x01, 0xa2, 0x2a, 0xa0, 0x64, 0x07, 0x10,
- 0xbd, 0x4b, 0xb9, 0x14, 0x59, 0xe2, 0x37, 0x90, 0x04, 0x41, 0xc0, 0x62,
- 0x38, 0x1f, 0x48, 0x3c, 0x13, 0xe9, 0x8d, 0x65, 0x15, 0x96, 0xc0, 0x4e,
- 0x2d, 0xd6, 0x92, 0x3e, 0x99, 0xd6, 0xd7, 0xf1, 0x1b, 0x5e, 0x5f, 0x47,
- 0x6f, 0xf8, 0x03, 0xee, 0xb9, 0xb3, 0xb7, 0x8e, 0xcf, 0xc7, 0xdf, 0x26,
- 0x3d, 0xa0, 0x11, 0xdc, 0xc9, 0x85, 0xaf, 0xb8, 0x5b, 0x1d, 0x11, 0xbd,
- 0x7f, 0xcd, 0xfb, 0xef, 0x79, 0x34, 0x3e, 0x10, 0xdc, 0x73, 0xf3, 0x7d,
- 0xb9, 0xdc, 0xe7, 0x2f, 0xc7, 0xdf, 0x7a, 0xd7, 0xda, 0x23, 0x81, 0x58,
- 0x31, 0xa6, 0xcd, 0x6c, 0xa7, 0x20, 0x31, 0x93, 0x0e, 0x0d, 0x16, 0xa5,
- 0xf7, 0xfa, 0xfa, 0x21, 0xf4, 0x6e, 0x66, 0x12, 0xd0, 0x7b, 0xb0, 0xc7,
- 0x9b, 0xe8, 0xdd, 0x3f, 0xa8, 0x76, 0xd2, 0xac, 0x47, 0xed, 0x05, 0x77,
- 0xd1, 0xa6, 0x02, 0x8f, 0x3e, 0x32, 0xa7, 0x40, 0xa2, 0x90, 0x76, 0x98,
- 0x4a, 0x88, 0x79, 0xfe, 0x34, 0x42, 0x37, 0x2f, 0x04, 0x84, 0xae, 0xe7,
- 0x19, 0xa7, 0xf4, 0x3e, 0x42, 0xd7, 0x94, 0xe2, 0x8c, 0x89, 0xdc, 0xa7,
- 0xf1, 0x90, 0xbe, 0x3d, 0xaa, 0xf5, 0xcb, 0xc0, 0xc3, 0x1d, 0xd2, 0x4c,
- 0x33, 0x07, 0x65, 0xe0, 0x80, 0x1c, 0x22, 0xe0, 0x22, 0x0a, 0xca, 0xc0,
- 0x05, 0xb1, 0xa1, 0x3b, 0xdf, 0x96, 0xe6, 0xb7, 0xaa, 0x1f, 0x2a, 0xd5,
- 0xb0, 0xb9, 0xb1, 0x1a, 0x09, 0x6d, 0xb8, 0x07, 0x7c, 0x40, 0x81, 0x79,
- 0x70, 0x23, 0x5b, 0xe8, 0x41, 0x59, 0xb4, 0x3a, 0xbd, 0xce, 0x28, 0xcf,
- 0x03, 0x30, 0x64, 0xdd, 0x7b, 0x4a, 0x6a, 0x1e, 0xb4, 0x01, 0x52, 0x54,
- 0x86, 0x79, 0x31, 0x0c, 0xd3, 0xa0, 0xfd, 0xd0, 0x56, 0xd3, 0xc2, 0xa6,
- 0xa5, 0x12, 0x45, 0x28, 0xbc, 0x12, 0xe4, 0x20, 0x65, 0x14, 0x96, 0xa6,
- 0xc4, 0x04, 0xd8, 0x2b, 0x19, 0x29, 0xa8, 0x8d, 0x22, 0xac, 0xb5, 0xdb,
- 0xbd, 0x34, 0x65, 0xcb, 0x19, 0xf7, 0xa4, 0x83, 0x62, 0x3c, 0x2b, 0xea,
- 0xa1, 0xeb, 0xd0, 0xfe, 0xc2, 0xfe, 0x35, 0xb0, 0x2f, 0x5e, 0xbf, 0x1b,
- 0x53, 0xe4, 0x2a, 0x43, 0xad, 0x81, 0x9a, 0xc1, 0x75, 0xc6, 0xf5, 0x21,
- 0x97, 0xe0, 0x1c, 0xe6, 0x11, 0x5b, 0xf0, 0x67, 0x9b, 0x22, 0xbe, 0x88,
- 0x3a, 0x84, 0xf0, 0x89, 0xa0, 0x50, 0x2f, 0xe5, 0x82, 0x1b, 0x63, 0xdb,
- 0x21, 0x2e, 0x4e, 0x2b, 0x70, 0x73, 0xd3, 0x8a, 0x76, 0x78, 0x9e, 0x22,
- 0x18, 0x47, 0x5a, 0x96, 0x47, 0xd3, 0xd8, 0xd5, 0xf6, 0xcc, 0x2b, 0x46,
- 0x64, 0x17, 0x0c, 0x32, 0xdb, 0xe1, 0xaa, 0xe8, 0x74, 0xa5, 0xef, 0x2e,
- 0x56, 0x30, 0x93, 0x24, 0x67, 0x6c, 0x77, 0xa3, 0xf1, 0x48, 0x1b, 0xb8,
- 0xba, 0x7e, 0x34, 0xa4, 0x87, 0x25, 0xfd, 0xd0, 0xfe, 0xf4, 0x09, 0x7e,
- 0x3a, 0x0a, 0x36, 0x3a, 0x28, 0xa1, 0x91, 0x0e, 0xaa, 0x16, 0x1d, 0x97,
- 0xb2, 0x1b, 0x8b, 0x19, 0x75, 0xde, 0xc0, 0xd9, 0x6b, 0x23, 0x05, 0x42,
- 0x4b, 0x64, 0xcc, 0x43, 0xd7, 0xbc, 0x2d, 0x09, 0x70, 0x5a, 0x8c, 0x6e,
- 0x53, 0xb7, 0x0e, 0xfd, 0xe8, 0x28, 0x72, 0xe8, 0x76, 0xce, 0x2f, 0x64,
- 0x99, 0xf1, 0x23, 0x6f, 0x49, 0x97, 0x49, 0xce, 0xfd, 0xad, 0x5e, 0xe4,
- 0xab, 0xa1, 0xbe, 0xc5, 0xc2, 0x63, 0x99, 0x7e, 0x12, 0x91, 0xfe, 0x48,
- 0xe8, 0x60, 0x18, 0xc0, 0xac, 0x70, 0xbb, 0x65, 0x74, 0xa5, 0x76, 0xeb,
- 0x6c, 0x11, 0x8d, 0xe8, 0x5b, 0x8d, 0x05, 0x6d, 0x25, 0xa2, 0xe0, 0xef,
- 0xc4, 0x6a, 0xbe, 0x34, 0x3b, 0xdb, 0xf7, 0xf1, 0x68, 0x7d, 0x07, 0x66,
- 0x62, 0xdf, 0xbd, 0xe7, 0xfc, 0x1c, 0x91, 0x6d, 0x3e, 0x3f, 0xdd, 0xb3,
- 0xff, 0x3d, 0xce, 0xef, 0xc9, 0xaf, 0x72, 0x7e, 0x4f, 0xfe, 0xb7, 0x39,
- 0xbf, 0x27, 0xff, 0xf2, 0xf9, 0x3d, 0x0a, 0xce, 0xef, 0xc9, 0xff, 0x2e,
- 0xe7, 0xa7, 0xfd, 0xd5, 0xf4, 0xf4, 0xb2, 0xe0, 0xfc, 0xc6, 0x92, 0x36,
- 0xa2, 0xc0, 0x7c, 0xb4, 0xd3, 0xfa, 0x16, 0x07, 0x69, 0x24, 0xd1, 0x91,
- 0xbd, 0xe0, 0x9a, 0x6b, 0xcb, 0xd0, 0x90, 0x3d, 0x0d, 0x4b, 0x46, 0x5a,
- 0x56, 0xa1, 0x83, 0x9e, 0x9c, 0x27, 0x76, 0x02, 0xde, 0x31, 0x38, 0xa0,
- 0x2d, 0x28, 0x68, 0x51, 0x17, 0x75, 0x4d, 0x7e, 0x4b, 0xb3, 0x7e, 0x2e,
- 0xaf, 0xac, 0x5d, 0x51, 0x70, 0x0c, 0x49, 0xcb, 0x6c, 0xdc, 0xf3, 0x17,
- 0xb4, 0x5d, 0x43, 0x7e, 0xfc, 0x4f, 0xd1, 0x62, 0x37, 0x74, 0x6c, 0x76,
- 0x53, 0x8a, 0x85, 0x25, 0xbc, 0xad, 0x73, 0xe7, 0x66, 0xa3, 0x59, 0xde,
- 0xa1, 0xc5, 0xce, 0xac, 0xab, 0xea, 0xd8, 0x13, 0xbc, 0xff, 0xc8, 0xca,
- 0x2b, 0xe0, 0xf8, 0xbc, 0xf8, 0xf0, 0x3e, 0xf4, 0xbd, 0x99, 0xa5, 0x86,
- 0xd0, 0x88, 0xe6, 0xb8, 0x86, 0x64, 0xdb, 0x0f, 0x81, 0x12, 0x6f, 0x6e,
- 0xe3, 0xd9, 0xd7, 0xbb, 0x9e, 0x13, 0x08, 0x41, 0x8b, 0x32, 0xd6, 0xef,
- 0x8e, 0xcb, 0x6e, 0x6d, 0x69, 0x79, 0x3d, 0xe8, 0xf4, 0xb8, 0xb4, 0x69,
- 0xef, 0x4e, 0x49, 0x81, 0x77, 0x44, 0x0a, 0x76, 0xab, 0xa0, 0xbf, 0x25,
- 0x29, 0x83, 0x79, 0x2d, 0xa8, 0x71, 0x04, 0xa3, 0xa1, 0x72, 0x10, 0x33,
- 0xfb, 0x2d, 0x33, 0xfe, 0x9e, 0x1c, 0xb6, 0x76, 0xf5, 0x35, 0x74, 0xc5,
- 0xf5, 0x72, 0x25, 0xa5, 0xc5, 0xf7, 0x94, 0x56, 0x26, 0xdc, 0x8d, 0x11,
- 0x65, 0x93, 0xec, 0xde, 0x97, 0x2a, 0x23, 0xb5, 0xcc, 0x6d, 0x69, 0x85,
- 0x98, 0xef, 0xbd, 0xc0, 0x68, 0x51, 0x2c, 0xaa, 0x8b, 0x6e, 0x82, 0x14,
- 0x57, 0xc4, 0x28, 0xbe, 0x3a, 0x71, 0x49, 0x4f, 0x6b, 0x96, 0x42, 0x07,
- 0x80, 0x00, 0xf0, 0x57, 0x63, 0xe0, 0xdc, 0x88, 0x12, 0x52, 0x81, 0x15,
- 0xcd, 0x99, 0xd1, 0x05, 0xcd, 0xab, 0x66, 0x98, 0x91, 0x54, 0x59, 0xd5,
- 0x5e, 0x9c, 0xda, 0x16, 0x86, 0x00, 0xdc, 0x29, 0x56, 0x1d, 0x80, 0x60,
- 0x0f, 0xd4, 0x5b, 0xc9, 0xea, 0x13, 0xe8, 0x0e, 0x8b, 0xcd, 0x54, 0x5c,
- 0x6b, 0xed, 0x4d, 0xab, 0x45, 0xc9, 0x70, 0x12, 0x86, 0x03, 0x5a, 0x25,
- 0x80, 0xff, 0x06, 0xda, 0xe8, 0x29, 0xcb, 0x60, 0xd5, 0xcc, 0x73, 0x4c,
- 0x44, 0x6e, 0x92, 0x5f, 0xf5, 0x11, 0x75, 0x05, 0x90, 0xa1, 0xa3, 0x0b,
- 0x94, 0x7e, 0x15, 0xdc, 0x04, 0xa4, 0xed, 0x92, 0xea, 0x18, 0x49, 0x9c,
- 0xfd, 0x1b, 0x24, 0x14, 0x0a, 0xc0, 0x40, 0xf4, 0x18, 0x5b, 0x29, 0xe0,
- 0x9c, 0x5b, 0x7c, 0x95, 0xf9, 0x55, 0xd3, 0x16, 0x82, 0x92, 0xa3, 0x14,
- 0x9c, 0xbc, 0x68, 0x76, 0x51, 0x32, 0x61, 0x83, 0x86, 0x43, 0x40, 0x45,
- 0x90, 0xa9, 0x6f, 0x09, 0x8a, 0xd3, 0x5a, 0xa0, 0x67, 0xb9, 0xe5, 0x32,
- 0x40, 0x6f, 0x7e, 0xbb, 0x2a, 0x65, 0x2f, 0x33, 0xdc, 0x67, 0x51, 0xd9,
- 0x25, 0x87, 0xff, 0x37, 0x65, 0x21, 0x77, 0x00, 0xd7, 0xb8, 0x99, 0xb8,
- 0x85, 0x5c, 0x83, 0x47, 0xb0, 0x68, 0xaa, 0x72, 0x75, 0x97, 0x7c, 0x95,
- 0xd2, 0xb2, 0xa0, 0xd6, 0xa7, 0xd9, 0x32, 0x28, 0x4d, 0xe3, 0xf6, 0xe2,
- 0xa2, 0x66, 0x73, 0xab, 0x71, 0x5d, 0x21, 0xec, 0x02, 0xde, 0x16, 0x43,
- 0xac, 0x66, 0xbf, 0xc8, 0x99, 0x2c, 0x65, 0x23, 0x9c, 0x7a, 0x3d, 0x1e,
- 0x9f, 0x86, 0xb6, 0x9c, 0x36, 0x36, 0xda, 0x88, 0x49, 0x80, 0xd1, 0x86,
- 0xdd, 0xe8, 0x88, 0x0c, 0xfe, 0x22, 0xca, 0x39, 0x64, 0xdd, 0xd9, 0x42,
- 0x31, 0x3b, 0x14, 0x47, 0x7e, 0x5a, 0xdd, 0xad, 0xc8, 0xf8, 0x92, 0x22,
- 0x5c, 0xbe, 0xe6, 0x34, 0x3f, 0x06, 0x81, 0xdd, 0x58, 0xf6, 0xfc, 0xa1,
- 0xf6, 0xb0, 0xd4, 0x21, 0x4b, 0x29, 0x7e, 0x4f, 0xa0, 0xc8, 0x04, 0x6e,
- 0x25, 0xb2, 0x95, 0xa4, 0xce, 0x0c, 0x68, 0x2e, 0xbd, 0x3d, 0xce, 0xa4,
- 0x73, 0x59, 0xa7, 0x3b, 0x06, 0x9b, 0x33, 0x64, 0x69, 0x11, 0x22, 0x22,
- 0xc2, 0x29, 0xbb, 0x2a, 0xdf, 0xe5, 0x0d, 0xa9, 0xda, 0xeb, 0xde, 0x0c,
- 0xdb, 0x3c, 0x21, 0x25, 0x84, 0x87, 0x22, 0x80, 0x92, 0xe1, 0x2c, 0x8f,
- 0x83, 0xfd, 0xfd, 0x7b, 0x31, 0x82, 0xc4, 0x5a, 0xdd, 0x08, 0x15, 0x44,
- 0xec, 0x90, 0x03, 0x1c, 0xb6, 0xa6, 0x3d, 0xcd, 0xa5, 0x60, 0xa9, 0x8b,
- 0xaa, 0x66, 0x3e, 0x69, 0x21, 0x7b, 0xdc, 0x15, 0x64, 0xb6, 0xca, 0x50,
- 0x5a, 0x00, 0x0c, 0x32, 0x77, 0xfb, 0x18, 0x73, 0xac, 0x9f, 0xb7, 0xde,
- 0x89, 0xb6, 0x94, 0xa6, 0x09, 0xd1, 0x4b, 0xa2, 0x7f, 0x8e, 0x92, 0x3f,
- 0xdf, 0x39, 0xbb, 0x1d, 0x0c, 0x91, 0xfd, 0xc1, 0x98, 0x15, 0xfb, 0xf9,
- 0x79, 0xfe, 0xa3, 0x4d, 0xac, 0x3f, 0x8e, 0x03, 0xf4, 0x6f, 0xcc, 0x58,
- 0x30, 0xac, 0xe1, 0x76, 0xab, 0x1a, 0xa3, 0x02, 0x4e, 0x24, 0xee, 0xb0,
- 0xb2, 0xab, 0x35, 0xfa, 0x47, 0xb7, 0xc9, 0x92, 0xd7, 0x2f, 0x89, 0xb9,
- 0xe0, 0x46, 0x3c, 0xe7, 0x36, 0xaa, 0x53, 0x3b, 0x0b, 0xf5, 0x69, 0x5b,
- 0x4d, 0xa1, 0xd2, 0xea, 0x21, 0x0a, 0xa8, 0xbb, 0xa8, 0x11, 0x54, 0x73,
- 0x4d, 0xbc, 0x0b, 0xbe, 0x86, 0xb2, 0xf0, 0x3c, 0x30, 0x84, 0x26, 0xc6,
- 0x99, 0x3f, 0x5a, 0x6b, 0xd5, 0x01, 0xb1, 0xf5, 0x19, 0xab, 0x22, 0xef,
- 0xeb, 0x4d, 0x9f, 0x95, 0x1e, 0x76, 0x95, 0x2d, 0xaf, 0xeb, 0xb8, 0x72,
- 0xd8, 0x97, 0x13, 0xc2, 0x62, 0x70, 0x06, 0xb1, 0x73, 0x13, 0x72, 0xa1,
- 0x38, 0xb2, 0x23, 0xa0, 0x09, 0xb2, 0xea, 0x68, 0x34, 0x96, 0x41, 0x22,
- 0x9d, 0xc8, 0x29, 0x61, 0x9c, 0x4f, 0x39, 0xaa, 0xde, 0x3a, 0x58, 0x35,
- 0xee, 0x33, 0xc6, 0x2b, 0xa9, 0x1d, 0x1c, 0x1c, 0x31, 0x6d, 0xee, 0x99,
- 0x66, 0x46, 0xad, 0x6d, 0x6a, 0x58, 0xe8, 0x11, 0xf5, 0x2a, 0xb4, 0xcd,
- 0x93, 0x84, 0x50, 0x53, 0xaf, 0xe1, 0xbd, 0xe6, 0xe1, 0x2d, 0x02, 0x1b,
- 0xdf, 0x49, 0xae, 0x5c, 0x27, 0x3f, 0x99, 0x54, 0xe0, 0x06, 0x6c, 0x83,
- 0xa2, 0xe3, 0x04, 0xde, 0x98, 0xe0, 0x70, 0x50, 0x02, 0xbf, 0xae, 0xbc,
- 0x18, 0xf9, 0xd6, 0x55, 0x6e, 0x4e, 0xb5, 0xd8, 0x02, 0x30, 0xe4, 0x7a,
- 0xc2, 0x98, 0xa3, 0x8d, 0x7e, 0x34, 0x58, 0xec, 0x7a, 0xe1, 0x39, 0x66,
- 0xe3, 0x6d, 0xc6, 0x5b, 0x09, 0xdf, 0x83, 0xa4, 0x75, 0x21, 0x54, 0x9f,
- 0xe4, 0xb0, 0xbd, 0x2b, 0xbe, 0xe7, 0x73, 0x8b, 0x7a, 0x73, 0x5d, 0x21,
- 0x1e, 0xdd, 0x7c, 0x74, 0xe6, 0x1a, 0xf8, 0x6d, 0x71, 0x9c, 0xa3, 0x39,
- 0x5d, 0x92, 0x13, 0x87, 0x75, 0x55, 0xda, 0xe5, 0x68, 0xd3, 0x12, 0x3a,
- 0x08, 0x81, 0x6c, 0x89, 0x60, 0x0a, 0x4b, 0x6a, 0x5f, 0x7a, 0x87, 0xaa,
- 0x23, 0xfb, 0x69, 0x50, 0x77, 0x00, 0x00, 0x47, 0x60, 0x88, 0x25, 0x34,
- 0x7f, 0xa1, 0x63, 0xda, 0xc2, 0x69, 0x95, 0xaf, 0x1a, 0xce, 0x47, 0x90,
- 0xe4, 0xea, 0x8d, 0xc0, 0x39, 0xe6, 0x6f, 0x97, 0x8b, 0x72, 0x92, 0xf2,
- 0x1d, 0xb1, 0xb9, 0x4d, 0xea, 0xf1, 0x6c, 0x01, 0x16, 0x13, 0x7b, 0x23,
- 0xf2, 0x8c, 0x34, 0x5c, 0x30, 0x4b, 0x1e, 0x3e, 0x47, 0x77, 0x78, 0x0a,
- 0x84, 0x6e, 0xfa, 0xa0, 0xfd, 0x04, 0xc3, 0xff, 0x0d, 0xe7, 0x03, 0xb9,
- 0xbd, 0x5a, 0x95, 0x8d, 0xd4, 0xb0, 0xda, 0xbb, 0x53, 0x81, 0xce, 0x05,
- 0x18, 0x85, 0xd9, 0x3a, 0x6b, 0x67, 0x8a, 0x6d, 0x4b, 0x98, 0x58, 0x5a,
- 0xda, 0x21, 0x5b, 0xc9, 0x76, 0x2a, 0x90, 0x70, 0x6c, 0x34, 0x0b, 0x8a,
- 0x00, 0x82, 0x25, 0x6b, 0x69, 0x60, 0x8c, 0x8f, 0x1b, 0x54, 0x68, 0x14,
- 0x24, 0x95, 0xdc, 0xe4, 0x34, 0xfb, 0xd6, 0xdb, 0x2b, 0x06, 0x56, 0x08,
- 0x29, 0x7e, 0xce, 0x0a, 0x21, 0xfc, 0x97, 0x7c, 0x26, 0x1b, 0x76, 0xc6,
- 0x47, 0x19, 0x6f, 0x9b, 0x08, 0xf6, 0xd3, 0x71, 0xf1, 0x04, 0xb6, 0x56,
- 0x93, 0xd1, 0x40, 0xfe, 0xfd, 0x1d, 0x43, 0x2c, 0x52, 0xfd, 0x96, 0x22,
- 0xf1, 0x00, 0xd8, 0x98, 0xda, 0xce, 0x8f, 0x79, 0x41, 0xbc, 0x32, 0x8f,
- 0x6e, 0x0a, 0xe5, 0xb8, 0x2d, 0xee, 0x38, 0x8b, 0x06, 0x67, 0x0e, 0x7d,
- 0x57, 0x62, 0x06, 0x4a, 0x50, 0x59, 0x33, 0xf5, 0x7e, 0x39, 0xcb, 0xd2,
- 0x45, 0xac, 0x5b, 0x06, 0x4d, 0x98, 0x1c, 0xdd, 0xcc, 0xda, 0x08, 0x26,
- 0xa5, 0x90, 0x90, 0x89, 0xe4, 0x58, 0x73, 0x96, 0xa1, 0x18, 0x07, 0x76,
- 0x86, 0xb8, 0x55, 0x11, 0xed, 0x9a, 0xfa, 0xf7, 0xe0, 0x01, 0xd4, 0x0e,
- 0x4f, 0x05, 0x91, 0x00, 0x01, 0x4f, 0x57, 0x82, 0x43, 0x98, 0x6e, 0x94,
- 0x90, 0xa8, 0x0f, 0x80, 0x02, 0x90, 0x0f, 0xdf, 0x1d, 0x4e, 0x1c, 0xa9,
- 0x5c, 0x17, 0x0a, 0x21, 0xa3, 0x65, 0x1b, 0x34, 0x31, 0xce, 0x81, 0x21,
- 0x26, 0xb9, 0x2b, 0xf7, 0x10, 0x79, 0x16, 0xc2, 0x39, 0x56, 0xe1, 0x49,
- 0x5f, 0x67, 0x9a, 0x19, 0x05, 0x53, 0x86, 0x0f, 0xa0, 0xb1, 0xc5, 0xb2,
- 0x34, 0x9a, 0xf0, 0x19, 0x66, 0x32, 0x87, 0x87, 0x3d, 0xa6, 0x97, 0xf4,
- 0x49, 0x17, 0x1a, 0xc3, 0x65, 0xaf, 0xd3, 0x79, 0xa6, 0xc0, 0xa9, 0xc2,
- 0xbe, 0xcb, 0xa9, 0xd9, 0x42, 0x04, 0x69, 0x01, 0x4a, 0x44, 0xda, 0x51,
- 0x60, 0x41, 0x33, 0xd7, 0x24, 0x2e, 0x69, 0x45, 0x2e, 0x5d, 0x04, 0x61,
- 0xb7, 0xf5, 0x22, 0x5f, 0xa9, 0x7f, 0x7a, 0x90, 0x64, 0x92, 0x55, 0xb4,
- 0xb8, 0x93, 0x53, 0x59, 0x0f, 0x23, 0xa6, 0x97, 0x6d, 0xe6, 0x2e, 0xf0,
- 0xb7, 0x0b, 0x52, 0xfc, 0x77, 0x3a, 0xa3, 0x3f, 0xda, 0x3f, 0xc0, 0x64,
- 0x1f, 0xed, 0x3f, 0xdd, 0x6d, 0x4b, 0xe5, 0x45, 0x9d, 0x0d, 0x91, 0xb4,
- 0x16, 0xd7, 0x4e, 0xb9, 0x55, 0x9d, 0xf3, 0xab, 0x43, 0x13, 0xa5, 0x97,
- 0x24, 0xd3, 0x6d, 0xb6, 0xae, 0xd4, 0x94, 0xa3, 0x26, 0x86, 0x64, 0x98,
- 0xd6, 0x57, 0x84, 0xba, 0x18, 0x48, 0x79, 0xf7, 0x0e, 0x8c, 0x36, 0xc4,
- 0x6e, 0x78, 0x9f, 0x52, 0xbc, 0x2a, 0x0d, 0xd2, 0x78, 0x1f, 0xf0, 0x1c,
- 0x59, 0xa5, 0x1c, 0x60, 0x88, 0xb5, 0x33, 0x55, 0x24, 0x07, 0x4e, 0x12,
- 0x93, 0xf0, 0x5d, 0xbb, 0xdd, 0xb0, 0xe5, 0x3b, 0x6f, 0xf2, 0x22, 0xaf,
- 0xaf, 0xd0, 0xa6, 0xb8, 0xae, 0xd3, 0xcb, 0x2c, 0x2c, 0x70, 0x37, 0x0c,
- 0xc9, 0x98, 0x4c, 0xdc, 0x46, 0xaf, 0x02, 0x32, 0x3d, 0xa5, 0x86, 0xf1,
- 0xbe, 0x4b, 0xc1, 0x8a, 0xf4, 0xd8, 0x03, 0x32, 0x9a, 0x5b, 0x66, 0x8c,
- 0x5e, 0xf2, 0xda, 0x6b, 0x00, 0xd9, 0xd7, 0xff, 0x91, 0xba, 0x91, 0x01,
- 0x22, 0x8b, 0x7b, 0x03, 0x71, 0x73, 0xa0, 0x58, 0xd7, 0x17, 0xa3, 0x6a,
- 0x9b, 0xc3, 0x3d, 0x1b, 0x1b, 0x16, 0xe4, 0x7a, 0x15, 0x23, 0x05, 0xd0,
- 0xfc, 0xec, 0x7b, 0xa3, 0x8b, 0x8e, 0x9e, 0xd9, 0x1f, 0xef, 0x3e, 0xac,
- 0x61, 0xe4, 0x61, 0x47, 0x37, 0xa3, 0x5c, 0x5c, 0x89, 0x44, 0xc0, 0x54,
- 0xf9, 0x82, 0xff, 0x11, 0xf7, 0x75, 0xa0, 0xae, 0xd5, 0x58, 0x91, 0x6f,
- 0x5f, 0x02, 0x52, 0xca, 0x21, 0x3c, 0x7b, 0x69, 0xbb, 0xad, 0x1a, 0x3d,
- 0x74, 0xcf, 0x24, 0x55, 0x35, 0x0a, 0xf0, 0x67, 0x31, 0x79, 0x39, 0x83,
- 0xd0, 0x45, 0xdd, 0x54, 0x97, 0x33, 0x82, 0xb7, 0x21, 0xc3, 0x94, 0xa0,
- 0x77, 0x92, 0xd3, 0x8c, 0x9b, 0xe5, 0x24, 0xdb, 0x5f, 0x6e, 0x47, 0xaa,
- 0xf9, 0xb6, 0x5f, 0x78, 0x08, 0xe3, 0xb5, 0x6b, 0xc4, 0xb5, 0xfd, 0x47,
- 0x4a, 0x4a, 0x26, 0x30, 0x15, 0xfe, 0xa6, 0x9c, 0x01, 0xe7, 0xd7, 0xc6,
- 0xc3, 0xfa, 0x9a, 0xd2, 0x27, 0xf8, 0x80, 0xed, 0xe4, 0x21, 0x6e, 0x7c,
- 0x4d, 0xd8, 0xeb, 0x9d, 0x75, 0xab, 0x3e, 0xb7, 0x1d, 0x54, 0xfb, 0x51,
- 0xea, 0x3e, 0xa3, 0xf5, 0x48, 0x77, 0x70, 0xd7, 0xc6, 0x94, 0xe7, 0xc4,
- 0x93, 0x81, 0xaf, 0x72, 0x3a, 0xcd, 0x49, 0x73, 0xc1, 0xd5, 0x37, 0xbf,
- 0xbc, 0xbc, 0x8c, 0xa6, 0x38, 0x99, 0x2d, 0xa0, 0x83, 0xa7, 0x35, 0xcf,
- 0xb3, 0xb4, 0x81, 0xbe, 0x41, 0x72, 0xbe, 0x3f, 0x79, 0xda, 0xe9, 0xee,
- 0x91, 0x67, 0xbc, 0x55, 0xbc, 0xf0, 0xeb, 0x53, 0xe2, 0x54, 0x00, 0x22,
- 0x60, 0x1a, 0x20, 0x44, 0x4f, 0xfc, 0xcc, 0x7a, 0xbb, 0xe6, 0xa9, 0x21,
- 0x8a, 0x3b, 0x09, 0x2d, 0x2f, 0x50, 0x4f, 0xc0, 0x1c, 0x24, 0x5b, 0x06,
- 0x3c, 0x6c, 0xa1, 0xa9, 0xb9, 0x9c, 0xc1, 0x4e, 0xbd, 0x44, 0x38, 0xd9,
- 0x99, 0xf6, 0x99, 0xe5, 0x81, 0x4b, 0x7a, 0x4f, 0xb4, 0xa1, 0x86, 0xcb,
- 0x65, 0xef, 0x7a, 0x45, 0xfc, 0xcc, 0x76, 0x51, 0x55, 0xd4, 0x06, 0x44,
- 0x72, 0xbe, 0x30, 0x0c, 0xcf, 0x57, 0x99, 0xf8, 0xc5, 0x8c, 0x5d, 0x1f,
- 0x25, 0x4c, 0x08, 0xc3, 0x8d, 0xf6, 0x70, 0x49, 0xb8, 0xa2, 0x60, 0x4a,
- 0x30, 0x36, 0x60, 0x32, 0x65, 0x42, 0x4d, 0xda, 0x0e, 0x8f, 0x3e, 0xff,
- 0x7c, 0x14, 0xc5, 0x39, 0xe5, 0xf2, 0x6c, 0x43, 0x84, 0xb4, 0x53, 0x0e,
- 0x13, 0x73, 0x60, 0xd1, 0x8d, 0xe9, 0xfb, 0x44, 0x61, 0x28, 0x1f, 0x2b,
- 0x97, 0x04, 0x5d, 0x44, 0xcc, 0x71, 0xbd, 0x08, 0xcd, 0x7b, 0x84, 0x1e,
- 0x97, 0xa4, 0x56, 0x08, 0x17, 0x83, 0x7a, 0x45, 0x5c, 0x63, 0x99, 0xf7,
- 0xa8, 0x74, 0x99, 0xa4, 0xe7, 0x71, 0x2a, 0xa7, 0x40, 0x03, 0x4a, 0x3e,
- 0x29, 0xa7, 0xfd, 0x1a, 0xad, 0x01, 0x39, 0xee, 0x9c, 0xf5, 0xc1, 0xdb,
- 0xb1, 0xdd, 0x53, 0x0e, 0xba, 0x9d, 0x68, 0xf4, 0x73, 0x92, 0x59, 0x7c,
- 0x05, 0xee, 0xbc, 0xd5, 0x41, 0xc0, 0xe1, 0x92, 0xf1, 0x82, 0x6a, 0xc2,
- 0xa8, 0xd3, 0x85, 0xf9, 0x40, 0x67, 0x38, 0x54, 0x48, 0x5f, 0x66, 0x4d,
- 0x58, 0xc7, 0xe4, 0x65, 0xf7, 0x6e, 0x18, 0x3c, 0x66, 0x13, 0x49, 0x19,
- 0x56, 0xf2, 0x62, 0x24, 0x91, 0x84, 0x59, 0x3e, 0xd7, 0x4b, 0x6a, 0xbb,
- 0x43, 0x7c, 0x89, 0xd3, 0x78, 0x21, 0x5b, 0x2f, 0x65, 0x89, 0x5f, 0x46,
- 0x31, 0xce, 0x24, 0xc5, 0x18, 0x80, 0x5b, 0x4d, 0x63, 0xd4, 0x6a, 0xc7,
- 0xbb, 0x91, 0x45, 0xce, 0xbd, 0x08, 0xb8, 0x76, 0x87, 0x37, 0x98, 0xf3,
- 0x36, 0x17, 0x31, 0x90, 0x8d, 0x17, 0x76, 0x50, 0x69, 0x75, 0x42, 0x89,
- 0xfc, 0x34, 0x95, 0xd8, 0x4e, 0x28, 0x4e, 0x39, 0xf1, 0x07, 0xf3, 0x74,
- 0x60, 0xf5, 0xd0, 0xbb, 0xde, 0x3e, 0x85, 0x67, 0xef, 0x47, 0xd6, 0x04,
- 0x51, 0x83, 0xb7, 0xd8, 0x25, 0x80, 0xfb, 0xd1, 0x19, 0x59, 0xa9, 0xd1,
- 0x84, 0xe3, 0xdd, 0xb9, 0x69, 0xa9, 0xae, 0x92, 0x1b, 0x94, 0x75, 0x59,
- 0x66, 0x3c, 0x4b, 0xc0, 0x6a, 0xe8, 0xae, 0x92, 0xaf, 0xb2, 0xa9, 0xd6,
- 0x53, 0x52, 0x2c, 0x61, 0x94, 0xe3, 0x53, 0xb1, 0x6e, 0x5c, 0xea, 0x5e,
- 0xb5, 0x2b, 0x46, 0xcf, 0x3c, 0x9c, 0x17, 0x76, 0x59, 0x00, 0x01, 0xd9,
- 0xc2, 0x13, 0xbc, 0x48, 0xce, 0x50, 0x1d, 0x46, 0xfb, 0xb8, 0x66, 0x70,
- 0xb7, 0xd4, 0xf9, 0x3f, 0x58, 0x29, 0x93, 0xd4, 0x5e, 0x85, 0x47, 0x83,
- 0x83, 0x23, 0x23, 0xc0, 0xfe, 0xe4, 0x35, 0x75, 0x19, 0x65, 0x51, 0x4e,
- 0xf4, 0x16, 0xf0, 0x69, 0x3f, 0xb1, 0x9d, 0x25, 0x12, 0xa9, 0x71, 0x55,
- 0x76, 0xb9, 0x26, 0x29, 0x87, 0x7d, 0xda, 0x51, 0x38, 0x54, 0x7d, 0x62,
- 0x95, 0xaf, 0xd0, 0xc9, 0xc4, 0xd8, 0x73, 0x41, 0xae, 0xbc, 0x79, 0x8b,
- 0xfb, 0x87, 0xae, 0x0b, 0xb3, 0x5d, 0xcd, 0x9a, 0x62, 0x90, 0x82, 0x07,
- 0x63, 0xf8, 0xd7, 0xdf, 0xe0, 0xfa, 0x2b, 0x65, 0xe9, 0xdc, 0x7b, 0x63,
- 0x66, 0x4d, 0xef, 0x6c, 0x1e, 0xd8, 0x2e, 0x19, 0x32, 0x5f, 0x00, 0x64,
- 0x46, 0xa9, 0x24, 0x8d, 0x32, 0x00, 0x6e, 0x34, 0x47, 0x8e, 0x98, 0x3f,
- 0x52, 0x9c, 0x72, 0x9a, 0x39, 0x18, 0x57, 0x6c, 0x0a, 0xaa, 0xaa, 0x83,
- 0x5b, 0x0d, 0x44, 0x44, 0xd5, 0x9d, 0x7c, 0x9c, 0x4c, 0x69, 0x76, 0x32,
- 0x60, 0xe4, 0x57, 0x2e, 0x6f, 0x12, 0xd0, 0x9f, 0xb4, 0xe6, 0xf2, 0x89,
- 0x3a, 0x6c, 0xc0, 0x0a, 0x21, 0xc0, 0x5a, 0xf5, 0xdf, 0xac, 0xc1, 0x4b,
- 0x9c, 0x2f, 0x02, 0x9f, 0x04, 0xdc, 0xd8, 0xe7, 0x9c, 0xa7, 0x81, 0x76,
- 0x76, 0xc2, 0xd0, 0x6c, 0x5c, 0x42, 0xca, 0xa3, 0x58, 0x45, 0xdc, 0x36,
- 0xac, 0x93, 0xf6, 0x7e, 0x5b, 0x2e, 0x6e, 0x0c, 0xb3, 0xc7, 0xd9, 0xf9,
- 0x60, 0xd5, 0x7c, 0x4d, 0x2c, 0xd2, 0xa5, 0xe5, 0x21, 0xa4, 0x52, 0x55,
- 0xa9, 0xe1, 0x98, 0x7f, 0x5b, 0x5d, 0xf6, 0x80, 0x2a, 0x72, 0xcf, 0x1c,
- 0x63, 0x2b, 0x84, 0x4d, 0xba, 0x40, 0x87, 0xc3, 0x37, 0x89, 0xcc, 0xe7,
- 0x8b, 0x2f, 0x5b, 0xc3, 0x69, 0xe3, 0x0a, 0x1f, 0x97, 0x5d, 0x30, 0x3e,
- 0xa6, 0x97, 0xf9, 0x3d, 0x9b, 0xc0, 0x4d, 0x0d, 0x6c, 0x3a, 0x71, 0x7d,
- 0x55, 0x66, 0x72, 0x76, 0x05, 0x4c, 0x60, 0xdb, 0x83, 0xc9, 0xac, 0xab,
- 0x8e, 0x76, 0xd4, 0x50, 0x8d, 0xb7, 0x7f, 0xda, 0x90, 0xeb, 0xff, 0x51,
- 0x5e, 0x15, 0xf4, 0x0f, 0xfa, 0x02, 0x7d, 0xe0, 0x8b, 0x83, 0x83, 0xe8,
- 0xcc, 0x7b, 0xe7, 0xcb, 0x13, 0xd6, 0x19, 0x93, 0x30, 0x92, 0x14, 0x51,
- 0x8f, 0xb7, 0xb5, 0x4c, 0xff, 0x11, 0xaa, 0xe6, 0x42, 0x37, 0x1b, 0xee,
- 0x10, 0xf0, 0xc8, 0xbc, 0x57, 0x39, 0xfd, 0x2e, 0xca, 0x12, 0x73, 0x2b,
- 0x1f, 0x16, 0x21, 0xb8, 0x85, 0xd1, 0xd5, 0xe8, 0x48, 0xfa, 0x17, 0xbf,
- 0x45, 0xb1, 0xa0, 0xbb, 0x2f, 0x5e, 0x5c, 0xad, 0x2f, 0x33, 0xf0, 0xcd,
- 0xe6, 0xb6, 0xd9, 0x7a, 0xd0, 0xca, 0xc9, 0x4b, 0xc1, 0x6e, 0x0a, 0x4e,
- 0xb1, 0x6e, 0xbc, 0x64, 0x23, 0xd4, 0x2c, 0xb4, 0x54, 0x08, 0x4e, 0xc5,
- 0x24, 0x4b, 0x49, 0x43, 0x5d, 0xdd, 0xba, 0x22, 0x56, 0x46, 0x07, 0xbc,
- 0x69, 0x82, 0x7b, 0xe1, 0x2a, 0xed, 0x37, 0xac, 0xe0, 0x26, 0x9b, 0x7c,
- 0xf1, 0x25, 0xf9, 0xb6, 0x6e, 0xd1, 0x3f, 0x80, 0xb5, 0x5a, 0xda, 0xba,
- 0x3d, 0xb4, 0x13, 0x48, 0xbc, 0x45, 0x74, 0x07, 0x29, 0xab, 0xfe, 0x61,
- 0xbd, 0x3a, 0x27, 0x6f, 0xc8, 0x79, 0x59, 0x6e, 0x1c, 0x51, 0x7d, 0x37,
- 0xd8, 0x13, 0x2f, 0x99, 0x91, 0x53, 0xfc, 0x5c, 0x0d, 0x27, 0x13, 0x04,
- 0xe4, 0x4c, 0x4b, 0x5c, 0xc6, 0x6a, 0xea, 0xc9, 0x43, 0x26, 0xfd, 0xcc,
- 0x55, 0xe2, 0x7c, 0x31, 0x40, 0x99, 0x4f, 0xbc, 0x63, 0x8c, 0x5b, 0x03,
- 0x5f, 0x47, 0x40, 0x20, 0xd1, 0x5f, 0xff, 0x68, 0x5f, 0xa7, 0xff, 0x98,
- 0xdb, 0x0c, 0x44, 0xee, 0x0d, 0xab, 0xa1, 0x50, 0xa0, 0xbe, 0xb3, 0x87,
- 0xf0, 0x93, 0x6d, 0x04, 0xb5, 0x3d, 0x60, 0x45, 0xfb, 0x8f, 0xdb, 0x70,
- 0xe3, 0x6a, 0x90, 0x1a, 0xed, 0x99, 0xc0, 0xe3, 0x66, 0x65, 0xa0, 0xd6,
- 0x52, 0x36, 0x26, 0xf7, 0x6f, 0xc2, 0xec, 0x7b, 0x26, 0x4e, 0x33, 0xd7,
- 0xa9, 0xff, 0xb0, 0x65, 0x27, 0xff, 0xc3, 0x96, 0x9b, 0xfe, 0x0f, 0x5b,
- 0x6e, 0x01, 0x3f, 0x6c, 0x11, 0x0c, 0x25, 0x2d, 0x22, 0x34, 0x88, 0x7f,
- 0xea, 0xa1, 0x6f, 0xf3, 0x57, 0xdd, 0x47, 0xbd, 0x6f, 0x7a, 0x9f, 0xdc,
- 0xda, 0xde, 0xb4, 0x69, 0x7e, 0x6c, 0x08, 0x75, 0x31, 0xdd, 0x3d, 0x34,
- 0xec, 0xba, 0xb5, 0x4d, 0x6e, 0x5b, 0xc8, 0x38, 0x0b, 0x3a, 0x78, 0x7b,
- 0x0f, 0xd0, 0x8e, 0xbb, 0xe6, 0x54, 0x5e, 0xd3, 0x05, 0x8b, 0x62, 0xa9,
- 0xe7, 0xa0, 0xbd, 0x9f, 0x03, 0x79, 0x64, 0x5f, 0x0f, 0xe4, 0xcf, 0x7f,
- 0x33, 0x5f, 0x80, 0xfe, 0x8f, 0x31, 0xe4, 0x56, 0x03, 0xc0, 0x46, 0xf2,
- 0xf2, 0x90, 0x30, 0x5d, 0x70, 0xd4, 0x92, 0xc5, 0xdf, 0x9c, 0x2b, 0x8d,
- 0x98, 0x24, 0x82, 0x5c, 0xfa, 0x65, 0x8e, 0x56, 0x65, 0x66, 0x55, 0x0b,
- 0xb6, 0x50, 0xf7, 0x48, 0x2a, 0x20, 0xf7, 0x15, 0x1d, 0xc4, 0x6a, 0x98,
- 0xe8, 0x62, 0xbc, 0x4a, 0x1f, 0x36, 0xde, 0x87, 0x7e, 0x92, 0x26, 0x45,
- 0x7c, 0x51, 0x56, 0xf5, 0x17, 0x5b, 0x15, 0x75, 0x7e, 0x4d, 0x2e, 0x2b,
- 0xa3, 0xc1, 0xfe, 0x91, 0x48, 0x6b, 0x6d, 0x0e, 0xcb, 0xdd, 0xd3, 0xdb,
- 0xe1, 0xf2, 0xce, 0xcc, 0x7b, 0xfb, 0x27, 0x51, 0x86, 0xc7, 0xd2, 0x66,
- 0x88, 0xd2, 0x1b, 0xe6, 0xb8, 0x4c, 0xba, 0x79, 0x0a, 0x7c, 0x75, 0xbd,
- 0x4b, 0x29, 0xbf, 0xff, 0x22, 0x06, 0x73, 0x17, 0x2c, 0xc4, 0xe3, 0xbc,
- 0x30, 0xd5, 0xbe, 0x38, 0xfb, 0xe6, 0x8f, 0x3a, 0xc0, 0x0f, 0x5b, 0xdf,
- 0x0f, 0xf9, 0xa7, 0xa8, 0x17, 0x7e, 0x9e, 0x9c, 0x7d, 0x43, 0xd4, 0xfd,
- 0xd3, 0x18, 0xd8, 0xa6, 0x0f, 0x7c, 0xc9, 0x7f, 0x01, 0x65, 0x6f, 0x1a,
- 0xf6, 0xc2, 0xe5, 0x49, 0x7c, 0x41, 0x0d, 0x8c, 0x51, 0x67, 0x04, 0x2b,
- 0x7c, 0xb5, 0xa2, 0xca, 0x21, 0xad, 0x8f, 0x6d, 0xb8, 0x3e, 0x16, 0x51,
- 0xa3, 0x74, 0x52, 0x72, 0x8a, 0x74, 0x13, 0x62, 0x63, 0x03, 0x9b, 0x17,
- 0x67, 0x2b, 0xbe, 0xab, 0x15, 0x1c, 0x17, 0x50, 0x87, 0xdb, 0x69, 0x06,
- 0xed, 0x5a, 0xc6, 0x41, 0x72, 0x1c, 0x69, 0x82, 0xe0, 0xc0, 0x8d, 0xf8,
- 0x6f, 0xd0, 0xcb, 0x6c, 0x6f, 0x6e, 0x6a, 0xa8, 0x96, 0x56, 0x99, 0x76,
- 0xc8, 0x91, 0x9e, 0x7e, 0x08, 0x30, 0x19, 0x82, 0x89, 0x84, 0x02, 0x24,
- 0x3a, 0x29, 0x89, 0xe8, 0xf3, 0x72, 0x21, 0x5d, 0xdc, 0x6b, 0x43, 0xf5,
- 0x7c, 0xc0, 0xb6, 0x8d, 0x9e, 0xd1, 0x38, 0x68, 0x2b, 0x24, 0x52, 0x21,
- 0x9f, 0x8d, 0xa8, 0x1c, 0x12, 0x4d, 0x64, 0x6f, 0x9c, 0x34, 0x6d, 0x03,
- 0x60, 0x18, 0x13, 0xfe, 0x1f, 0xc9, 0xe8, 0x9f, 0x64, 0x70, 0x3e, 0xd9,
- 0xaa, 0xcc, 0xa1, 0x38, 0x87, 0x23, 0x1e, 0x9c, 0xc4, 0xde, 0x1b, 0xbd,
- 0x38, 0x9c, 0x06, 0xa1, 0xa5, 0x9a, 0x94, 0x27, 0xf6, 0x35, 0xa9, 0x84,
- 0x92, 0xc8, 0xae, 0x9d, 0x6d, 0x48, 0xbc, 0xc4, 0x17, 0x8b, 0x3b, 0xac,
- 0x6a, 0x44, 0x78, 0xdb, 0x92, 0xdf, 0x89, 0x2f, 0x59, 0x1f, 0x4b, 0x45,
- 0xdf, 0x92, 0xc3, 0x1a, 0x05, 0x2f, 0x7c, 0x2f, 0x49, 0x41, 0xc3, 0x83,
- 0xe7, 0x5e, 0x97, 0x22, 0xfe, 0x59, 0x7c, 0x78, 0x1f, 0x04, 0x46, 0x03,
- 0xc4, 0xb5, 0x6c, 0xff, 0x86, 0xf1, 0x0f, 0xed, 0xf8, 0x9f, 0x45, 0x70,
- 0x57, 0x18, 0x19, 0x25, 0xfe, 0xd9, 0x0b, 0x97, 0x04, 0xa8, 0x5e, 0x54,
- 0xeb, 0xc9, 0x68, 0xf9, 0x10, 0x14, 0xf2, 0x99, 0x31, 0x59, 0x38, 0xdc,
- 0x10, 0x36, 0x79, 0x60, 0xb8, 0x4a, 0x98, 0x81, 0x58, 0x87, 0xd9, 0xc6,
- 0xae, 0x89, 0xc8, 0xa2, 0x5e, 0x08, 0xab, 0x5c, 0x12, 0x04, 0xeb, 0xec,
- 0xb9, 0xeb, 0x79, 0xc9, 0x20, 0x12, 0xb9, 0x9f, 0x5f, 0xef, 0xea, 0x68,
- 0x83, 0xb2, 0xc6, 0x16, 0xc0, 0x71, 0xf0, 0x29, 0xc3, 0x8a, 0x19, 0x7a,
- 0xc9, 0x6b, 0xc8, 0xb8, 0xbd, 0xb3, 0x2d, 0x4e, 0x15, 0xfa, 0x10, 0xb5,
- 0x8a, 0x44, 0x22, 0x14, 0x8a, 0xb1, 0x53, 0x60, 0x66, 0x88, 0x2f, 0x67,
- 0x18, 0xd1, 0x3a, 0x9e, 0x83, 0xb5, 0xdb, 0x3b, 0xc1, 0x40, 0x41, 0xc0,
- 0x09, 0x52, 0xbb, 0x99, 0x41, 0xbd, 0x5a, 0xe0, 0x40, 0xa1, 0x91, 0xec,
- 0x6d, 0xb1, 0x0c, 0xc6, 0xb6, 0xa9, 0xcb, 0x56, 0x4c, 0x93, 0xed, 0x2f,
- 0x76, 0xb7, 0xed, 0xd2, 0xfa, 0xcd, 0xa2, 0xa0, 0xe3, 0xa3, 0x06, 0x21,
- 0x6d, 0x1f, 0x58, 0x78, 0x96, 0x96, 0x94, 0xfb, 0x90, 0x0d, 0x71, 0xa0,
- 0x51, 0x04, 0xbd, 0xba, 0x11, 0x6f, 0x27, 0x12, 0xcb, 0x71, 0x3b, 0x19,
- 0xeb, 0x85, 0x49, 0x3c, 0x5d, 0x34, 0x94, 0xaa, 0x8f, 0x62, 0x0a, 0x46,
- 0xfb, 0xab, 0x9f, 0x7b, 0xfa, 0x78, 0xe4, 0x7a, 0x52, 0x20, 0x07, 0x4d,
- 0x14, 0xc4, 0x25, 0xe2, 0x79, 0x34, 0x36, 0xa9, 0xde, 0xdb, 0x5f, 0xec,
- 0xb0, 0xc0, 0x72, 0xfe, 0x34, 0xef, 0xdb, 0xdb, 0xc9, 0x0f, 0xf1, 0xba,
- 0xd6, 0x84, 0xdf, 0xf5, 0x2c, 0x04, 0x21, 0xdb, 0xfb, 0xde, 0x48, 0x5e,
- 0x4c, 0xca, 0xd9, 0xdd, 0x9f, 0x10, 0x76, 0x92, 0x57, 0x5e, 0xec, 0xe1,
- 0x47, 0x1d, 0x95, 0xb9, 0x6f, 0x20, 0x8c, 0x62, 0x8e, 0x0a, 0x7f, 0x7e,
- 0x49, 0x8f, 0xab, 0xc5, 0xb0, 0x9d, 0x8c, 0x46, 0x86, 0x09, 0xd5, 0x4b,
- 0xb4, 0xe3, 0xda, 0x20, 0x58, 0x18, 0xef, 0x0e, 0x22, 0x96, 0x94, 0x14,
- 0x81, 0x2c, 0x81, 0x67, 0x47, 0xad, 0x6c, 0x76, 0x42, 0xf2, 0xaf, 0xaa,
- 0x2f, 0x46, 0xc9, 0x4b, 0x9b, 0x25, 0x93, 0x45, 0x30, 0xb2, 0xe9, 0x1a,
- 0xb3, 0xec, 0xf0, 0x4a, 0xc2, 0x3f, 0x9f, 0xe4, 0xe2, 0x66, 0x9f, 0x95,
- 0x2d, 0xdc, 0x4d, 0xc6, 0x74, 0x30, 0xc2, 0x3d, 0x8e, 0x94, 0x36, 0x2d,
- 0x2b, 0x8e, 0x11, 0xb1, 0x3b, 0xdd, 0xda, 0x2f, 0x32, 0xb5, 0xe1, 0xb1,
- 0x00, 0x73, 0x29, 0x1b, 0x1d, 0x24, 0x4f, 0xed, 0x97, 0x22, 0x58, 0xf5,
- 0x6c, 0xf1, 0xd7, 0xc9, 0xe7, 0x43, 0x7a, 0xca, 0xeb, 0x16, 0x2b, 0x74,
- 0xdf, 0xce, 0xe0, 0x18, 0x88, 0x52, 0x38, 0x44, 0x62, 0x52, 0xa4, 0x20,
- 0x07, 0x92, 0x60, 0x92, 0xd6, 0xd9, 0x93, 0x47, 0xaa, 0x5e, 0xf2, 0x2e,
- 0xd5, 0xea, 0xbf, 0x6d, 0x39, 0x61, 0x59, 0x0e, 0x79, 0x0b, 0xea, 0x5e,
- 0x04, 0x14, 0x16, 0x93, 0x72, 0x46, 0xcd, 0xbf, 0x38, 0x07, 0x97, 0xa4,
- 0xa9, 0x51, 0x24, 0x2f, 0x1b, 0x54, 0x14, 0x3d, 0x7d, 0xe2, 0x4d, 0xfa,
- 0x1e, 0x77, 0x45, 0x87, 0x93, 0xca, 0x0a, 0xbb, 0x2b, 0x52, 0x7b, 0xdd,
- 0x7c, 0x37, 0xb8, 0x97, 0xe4, 0xeb, 0x60, 0xe0, 0x31, 0x59, 0xa3, 0x75,
- 0x30, 0xde, 0x77, 0x8d, 0xfc, 0x4b, 0xf0, 0x47, 0x25, 0x9c, 0xee, 0xa7,
- 0x37, 0x12, 0xb5, 0x67, 0x22, 0xe9, 0xfb, 0x3c, 0x09, 0x26, 0xec, 0xfb,
- 0xe9, 0x9a, 0x82, 0x08, 0xf3, 0x75, 0x05, 0xe9, 0x23, 0x8f, 0xb1, 0x92,
- 0xa0, 0x75, 0x4a, 0xa2, 0xa7, 0xbf, 0x7d, 0xf9, 0xee, 0xc3, 0xcb, 0xd3,
- 0x87, 0x77, 0x05, 0x6a, 0x35, 0x9a, 0xbb, 0x27, 0x07, 0xd6, 0x07, 0x33,
- 0xe8, 0x40, 0xfd, 0xc4, 0xa1, 0x0c, 0x82, 0xa8, 0x03, 0x41, 0x1b, 0x74,
- 0xb3, 0xf5, 0xa8, 0x68, 0x8c, 0xe8, 0x8a, 0x92, 0x44, 0xe2, 0x10, 0x40,
- 0x9c, 0xe7, 0x2b, 0x21, 0x72, 0x2f, 0x73, 0x33, 0xad, 0xa5, 0x27, 0xe3,
- 0x96, 0xbe, 0x4f, 0xaf, 0x6f, 0x49, 0xf2, 0xb8, 0xad, 0x13, 0x8f, 0x51,
- 0xb9, 0xad, 0x6d, 0xb7, 0xa9, 0x57, 0xda, 0xd4, 0x5a, 0x04, 0x5a, 0xcb,
- 0xfb, 0x56, 0xce, 0xe7, 0x2e, 0x7b, 0xb6, 0x1b, 0xe1, 0x7b, 0xf5, 0xaa,
- 0xbf, 0xe4, 0xf6, 0xd7, 0x44, 0x4b, 0xed, 0x64, 0xa4, 0x63, 0x1b, 0x1d,
- 0x77, 0x1f, 0x36, 0x25, 0x57, 0xa3, 0xbf, 0x90, 0xb9, 0xc5, 0x77, 0xd5,
- 0x4c, 0xd0, 0x47, 0x0e, 0x50, 0x15, 0x17, 0xed, 0x66, 0xc7, 0xc7, 0xef,
- 0xb1, 0x59, 0xe7, 0x2f, 0xc7, 0x63, 0x2b, 0x0b, 0x6b, 0x49, 0x4b, 0x18,
- 0x04, 0xc6, 0x18, 0xd4, 0x48, 0xbf, 0xed, 0xc9, 0x28, 0xb1, 0x9d, 0x62,
- 0x25, 0x9d, 0x13, 0xb1, 0x1f, 0x63, 0xf3, 0x5d, 0xac, 0x97, 0xe6, 0xc2,
- 0x18, 0x8d, 0x77, 0xb6, 0x5d, 0x4b, 0x28, 0xb6, 0x4b, 0x78, 0xc4, 0xb9,
- 0x44, 0x93, 0xc2, 0x59, 0x13, 0xed, 0xd1, 0xd9, 0x8f, 0x35, 0x86, 0x44,
- 0x5c, 0x9e, 0x83, 0xd7, 0x3e, 0xc4, 0xed, 0x20, 0xee, 0x4c, 0xdf, 0x1a,
- 0x9f, 0x5c, 0x1c, 0x9b, 0xed, 0xfb, 0x70, 0xf1, 0xf5, 0x96, 0xa4, 0x2e,
- 0x74, 0x51, 0x30, 0xe0, 0xb4, 0xa7, 0x16, 0xaf, 0xd7, 0xb6, 0x5a, 0xb6,
- 0x62, 0x47, 0x8a, 0xb1, 0x16, 0x62, 0x1a, 0xb8, 0xfb, 0xe8, 0x68, 0xc3,
- 0x29, 0x3d, 0x1e, 0x3d, 0xee, 0x9e, 0x52, 0x3f, 0x5c, 0x35, 0x03, 0x18,
- 0x07, 0xe4, 0x2e, 0xa8, 0xc8, 0x94, 0x3d, 0xb5, 0xe7, 0x9a, 0xa7, 0x20,
- 0xc8, 0x06, 0x74, 0x9d, 0x94, 0x4b, 0xe1, 0x03, 0xf4, 0x3c, 0x85, 0x12,
- 0xf4, 0xe2, 0xe2, 0xc0, 0x6e, 0xb6, 0x70, 0x43, 0xe2, 0xed, 0xe5, 0x70,
- 0xa8, 0x39, 0xb1, 0xb4, 0x9a, 0xd9, 0xb2, 0xd0, 0x50, 0x3f, 0xd4, 0x5c,
- 0x3f, 0x6a, 0xc9, 0x64, 0x48, 0x40, 0x5b, 0xb2, 0xb4, 0xaa, 0x75, 0xc3,
- 0xde, 0x0a, 0x2e, 0x9f, 0x2f, 0x0e, 0xa6, 0x0d, 0x2f, 0x3a, 0xba, 0xb4,
- 0x58, 0x54, 0xe8, 0x8d, 0xd9, 0x8f, 0x71, 0xfc, 0x67, 0xda, 0x57, 0xc9,
- 0x17, 0x79, 0xc1, 0x7f, 0xc6, 0xe9, 0x1d, 0x22, 0xb7, 0x2a, 0x17, 0xec,
- 0x40, 0x94, 0x37, 0x38, 0x89, 0x93, 0x8b, 0x5d, 0xa4, 0x0e, 0xa3, 0x42,
- 0xc2, 0xa1, 0x84, 0x68, 0xd0, 0xd4, 0x3c, 0x6c, 0xbb, 0xb5, 0x33, 0xde,
- 0xb5, 0x9e, 0xd6, 0x0b, 0x44, 0x14, 0x31, 0x5a, 0xa4, 0x8a, 0xc9, 0x43,
- 0x56, 0x14, 0xf5, 0x32, 0x86, 0xee, 0xe3, 0xdd, 0xde, 0xd0, 0x62, 0x02,
- 0xa3, 0x9e, 0xde, 0xcc, 0x7a, 0xb0, 0xea, 0xe0, 0xd6, 0x42, 0x12, 0x19,
- 0x6c, 0x40, 0xae, 0x99, 0x7a, 0xf5, 0xdd, 0x6b, 0xaf, 0xd9, 0x8e, 0xe6,
- 0xa9, 0x31, 0xbd, 0x88, 0x42, 0xda, 0x87, 0x06, 0x97, 0xb9, 0x64, 0xcb,
- 0x11, 0x82, 0xaa, 0xb3, 0x2c, 0x5b, 0x59, 0x68, 0xf3, 0x1c, 0x35, 0x36,
- 0x79, 0x8d, 0x20, 0xaa, 0xc0, 0xca, 0xa3, 0x9d, 0x5c, 0xcf, 0xec, 0x84,
- 0x75, 0x68, 0x8b, 0x48, 0xd8, 0x3b, 0xd4, 0x3c, 0x8c, 0xc2, 0xb8, 0x07,
- 0x4f, 0x8f, 0x3e, 0x37, 0xb2, 0xf9, 0x0e, 0x58, 0xe3, 0x6e, 0xcb, 0x18,
- 0x0b, 0xb8, 0x1f, 0xe7, 0x4f, 0x8c, 0x1a, 0x4d, 0xef, 0x15, 0x38, 0x85,
- 0xa4, 0x26, 0x33, 0x02, 0x0e, 0x2a, 0x29, 0x6e, 0x0e, 0xb1, 0x68, 0xcc,
- 0x26, 0xca, 0x86, 0x49, 0xd2, 0x1d, 0xf6, 0x89, 0x13, 0xc4, 0x46, 0x1e,
- 0x01, 0x53, 0x83, 0x12, 0xea, 0xa4, 0x66, 0x58, 0xca, 0xfb, 0xe3, 0x8b,
- 0xf7, 0xe6, 0x8f, 0xf1, 0xc5, 0xd9, 0xfb, 0x1e, 0x64, 0xc6, 0x86, 0x61,
- 0x3a, 0x68, 0xd3, 0x34, 0x5d, 0x05, 0xdb, 0xdc, 0x46, 0x6d, 0x43, 0x26,
- 0x34, 0xb3, 0x9d, 0x3a, 0x0a, 0xf4, 0xe5, 0xe1, 0x7d, 0xd5, 0xa3, 0xd6,
- 0x42, 0xe7, 0x46, 0x3e, 0x6c, 0x5c, 0x18, 0x9f, 0xf9, 0x66, 0x0a, 0xc1,
- 0x82, 0x89, 0x18, 0x69, 0xc5, 0x96, 0xd1, 0x63, 0xb6, 0xc6, 0x68, 0x23,
- 0xe7, 0xbf, 0x83, 0xb1, 0xd7, 0xf6, 0xd4, 0x3d, 0x68, 0x86, 0x9c, 0x9a,
- 0xcb, 0xcd, 0x59, 0x5c, 0xb7, 0x76, 0xc3, 0x69, 0x15, 0x0a, 0x60, 0x2b,
- 0xd9, 0x81, 0x03, 0x59, 0xf4, 0x92, 0x7b, 0xe8, 0xd7, 0xe8, 0x42, 0xbb,
- 0x6e, 0xc1, 0x75, 0xb9, 0xcc, 0xd8, 0xc3, 0xcf, 0xc9, 0xb9, 0xca, 0x9c,
- 0x58, 0xb6, 0x30, 0x2e, 0x6d, 0x12, 0xc3, 0xc3, 0xb0, 0x10, 0x62, 0x74,
- 0xca, 0xdb, 0x16, 0x51, 0xa0, 0x14, 0xea, 0xe0, 0x73, 0xc9, 0x8c, 0xa5,
- 0xda, 0x00, 0x9b, 0x6d, 0x5b, 0x67, 0xe5, 0x61, 0x8b, 0xb5, 0x99, 0xf7,
- 0x41, 0x97, 0xc9, 0x10, 0x28, 0x43, 0x9c, 0xb3, 0xa0, 0x8f, 0x9e, 0x16,
- 0xd7, 0x23, 0xd1, 0x4a, 0x73, 0x6c, 0xa0, 0x4b, 0xf8, 0xfd, 0x43, 0xcf,
- 0xe5, 0xa9, 0x68, 0x58, 0x0d, 0xd5, 0x8b, 0x04, 0xe6, 0x61, 0x69, 0x5b,
- 0x8e, 0x9c, 0x43, 0x34, 0xeb, 0x2e, 0xd3, 0x6d, 0xe9, 0x73, 0x21, 0x9b,
- 0x55, 0xa5, 0x2d, 0x71, 0x1d, 0x99, 0x02, 0x34, 0x8a, 0xde, 0xb6, 0x5f,
- 0x7d, 0x28, 0xd1, 0x5d, 0x0d, 0x06, 0xe9, 0x56, 0xce, 0xc9, 0x80, 0x1e,
- 0xd9, 0x51, 0x04, 0x9d, 0xe4, 0x43, 0x21, 0xc8, 0x31, 0x85, 0xb1, 0x2d,
- 0x90, 0xff, 0x30, 0xb3, 0x9b, 0x46, 0x80, 0x4a, 0x94, 0xb6, 0xc5, 0x42,
- 0x6b, 0x56, 0xb2, 0x42, 0x0f, 0x4c, 0xe7, 0x10, 0x22, 0x0c, 0x3e, 0x64,
- 0x64, 0x13, 0xa8, 0xa4, 0x91, 0xf1, 0x9c, 0x5d, 0x32, 0x6d, 0xba, 0x2b,
- 0x05, 0xca, 0x43, 0xb0, 0xd0, 0x73, 0xff, 0xd0, 0x98, 0xa5, 0xc1, 0xfa,
- 0x71, 0xbc, 0xa0, 0x61, 0xb0, 0x05, 0x46, 0x54, 0x50, 0xaf, 0x80, 0xc0,
- 0x5a, 0x14, 0xd1, 0xd2, 0x2c, 0x86, 0xb4, 0x58, 0x17, 0x0b, 0xca, 0x11,
- 0x6f, 0x43, 0x45, 0xa8, 0x1a, 0x38, 0xda, 0x50, 0xc5, 0xea, 0x23, 0x4b,
- 0xb4, 0x48, 0xb2, 0x5d, 0xaf, 0xdf, 0x5e, 0x5d, 0x6f, 0xe5, 0x2f, 0x08,
- 0xf4, 0x3d, 0x1d, 0x99, 0x22, 0x52, 0x2a, 0x6d, 0xe5, 0x45, 0x4e, 0x48,
- 0x42, 0x65, 0xb5, 0x47, 0x55, 0x2a, 0x84, 0xd9, 0x67, 0xac, 0xca, 0x72,
- 0x81, 0xd6, 0x3e, 0xaa, 0xba, 0xc5, 0x1a, 0x32, 0x43, 0x05, 0x63, 0x0c,
- 0x1e, 0x33, 0x78, 0xbb, 0x72, 0xdf, 0x6b, 0x56, 0x47, 0xd2, 0xd4, 0x83,
- 0x8d, 0x18, 0xc5, 0xda, 0xc1, 0x71, 0x46, 0x08, 0x32, 0x1e, 0xdb, 0xea,
- 0x98, 0xb6, 0x26, 0xd5, 0xe6, 0x22, 0x38, 0x57, 0xa8, 0x7c, 0xc8, 0xbf,
- 0xef, 0xa9, 0xe5, 0xd3, 0xc6, 0x2e, 0x00, 0x87, 0x32, 0xbb, 0x32, 0xe0,
- 0xec, 0x90, 0xf6, 0xcd, 0x84, 0xe5, 0xd0, 0xfe, 0x5a, 0x9d, 0x35, 0xeb,
- 0x55, 0x28, 0xe7, 0x5d, 0xf5, 0xa9, 0x1d, 0x51, 0x83, 0xa2, 0xde, 0x14,
- 0x09, 0x55, 0xc1, 0x6d, 0xbf, 0x8f, 0xce, 0xdf, 0xbd, 0x8d, 0xd0, 0x04,
- 0x02, 0xe9, 0xde, 0x87, 0x04, 0xa0, 0xe2, 0x85, 0x1a, 0x04, 0x27, 0x5b,
- 0x46, 0xbf, 0xd8, 0xdf, 0x62, 0xa0, 0x05, 0x29, 0xdb, 0xe2, 0x28, 0xbb,
- 0x7d, 0xdb, 0xec, 0x8b, 0x37, 0xdf, 0xf0, 0xce, 0x68, 0x3d, 0x8a, 0x94,
- 0x2c, 0xd2, 0xe9, 0xec, 0x50, 0x2f, 0x7a, 0xdc, 0xdf, 0xdd, 0xcf, 0x7a,
- 0x97, 0xbe, 0x61, 0x56, 0x5b, 0x07, 0xcf, 0x0e, 0x47, 0x07, 0x4f, 0x3e,
- 0x1f, 0x1d, 0xa0, 0x93, 0xad, 0x37, 0x37, 0xd7, 0x71, 0xd5, 0x1b, 0x28,
- 0xd2, 0xcf, 0x37, 0xe9, 0x47, 0xf4, 0xe5, 0x2f, 0x2c, 0xef, 0x46, 0xf4,
- 0xdc, 0x88, 0xbb, 0xea, 0x04, 0xdf, 0x58, 0x1a, 0x9d, 0x26, 0x2f, 0x82,
- 0x38, 0xc8, 0xd0, 0x65, 0x15, 0x31, 0x2d, 0xae, 0x72, 0x22, 0x23, 0x45,
- 0xd9, 0xf4, 0xf6, 0x49, 0x1b, 0x02, 0xda, 0x06, 0x27, 0xb8, 0x9d, 0xf1,
- 0x19, 0x29, 0x4b, 0x9f, 0x8a, 0x1a, 0xe9, 0xb8, 0xba, 0xfd, 0x7e, 0xc0,
- 0x36, 0x7f, 0xb2, 0xd5, 0x47, 0x10, 0x2e, 0xf6, 0xd2, 0x75, 0x61, 0xba,
- 0x00, 0xf1, 0xd4, 0x45, 0x09, 0x12, 0xd0, 0x17, 0x7e, 0x50, 0x35, 0x6e,
- 0x1b, 0x10, 0xf7, 0x85, 0x0c, 0xc0, 0x8f, 0x5c, 0x25, 0x8e, 0x5f, 0x49,
- 0x8c, 0x91, 0x6d, 0x9d, 0x68, 0x07, 0xce, 0xc9, 0xc2, 0x2c, 0x31, 0x93,
- 0xd6, 0xe1, 0xe8, 0x9d, 0x3f, 0xfc, 0xc1, 0x71, 0x24, 0x6e, 0xab, 0x8e,
- 0x5e, 0x1e, 0x8f, 0x01, 0xd5, 0xca, 0xb1, 0x6a, 0xee, 0x0a, 0xb0, 0xf5,
- 0xfc, 0xaf, 0x70, 0x0e, 0xff, 0x38, 0xfc, 0xab, 0xf9, 0xe7, 0x8f, 0x5b,
- 0x7a, 0xa9, 0x19, 0x96, 0xcb, 0x15, 0x8c, 0x38, 0xf8, 0x43, 0x1c, 0xd0,
- 0x20, 0x69, 0xb7, 0xa5, 0x85, 0x66, 0x70, 0xf1, 0xea, 0x9c, 0x2f, 0x63,
- 0xc5, 0x61, 0x6f, 0x50, 0x33, 0xf1, 0x21, 0xa8, 0xf5, 0xc4, 0xc2, 0xd1,
- 0x51, 0x83, 0xe9, 0xc4, 0xee, 0xa5, 0xf7, 0xca, 0xc0, 0x25, 0x35, 0xdc,
- 0x30, 0x07, 0x48, 0x8d, 0x7e, 0x7b, 0x49, 0xfe, 0x15, 0x2e, 0x49, 0x37,
- 0x7c, 0x57, 0x15, 0x69, 0xe9, 0x18, 0x4c, 0xc0, 0x5e, 0x86, 0x0d, 0xd8,
- 0xeb, 0x70, 0x63, 0xa6, 0x34, 0x48, 0x04, 0xfe, 0x96, 0x6b, 0x23, 0x1a,
- 0xc1, 0x52, 0x34, 0xdb, 0x60, 0x36, 0x4a, 0xb9, 0x6d, 0x95, 0xd7, 0x9f,
- 0x68, 0x7d, 0x52, 0xe6, 0xe3, 0xe5, 0x0a, 0xd1, 0x7c, 0x3e, 0xb3, 0x5a,
- 0xdf, 0x9d, 0x42, 0xd6, 0xd8, 0xc2, 0x3d, 0x6f, 0x67, 0x9d, 0x74, 0xd0,
- 0x63, 0x57, 0x20, 0xca, 0x28, 0xec, 0x96, 0x3c, 0x56, 0x65, 0x0f, 0x40,
- 0x83, 0x93, 0x54, 0x98, 0x73, 0xa3, 0xe7, 0x5a, 0xd2, 0xf0, 0xa0, 0x99,
- 0xa8, 0xa4, 0x9d, 0x88, 0x85, 0xa4, 0xdf, 0x6e, 0x57, 0x6a, 0x51, 0x87,
- 0x1a, 0x72, 0x14, 0x33, 0x3c, 0x94, 0xc5, 0x37, 0x43, 0xcf, 0x2c, 0x2a,
- 0x9f, 0xa8, 0xcc, 0x34, 0x66, 0x03, 0xad, 0xcd, 0xe7, 0x9b, 0x41, 0x41,
- 0x5e, 0xd5, 0xe9, 0x3e, 0x8b, 0xda, 0x0a, 0xb8, 0x68, 0x4e, 0x19, 0x5d,
- 0xb0, 0x4f, 0x9d, 0x36, 0x1f, 0xbb, 0x4e, 0x7f, 0x1a, 0x6e, 0xad, 0x1d,
- 0xd5, 0x6e, 0x0a, 0xb4, 0x47, 0x4e, 0x42, 0x83, 0x06, 0xd3, 0x5f, 0xc6,
- 0x20, 0x7a, 0x3d, 0xa1, 0x7a, 0xb8, 0x1f, 0xba, 0x52, 0xa8, 0xe9, 0x33,
- 0x36, 0x79, 0x98, 0xaf, 0xee, 0xdf, 0x40, 0x85, 0xf9, 0xa2, 0x23, 0x6d,
- 0x71, 0x16, 0x2b, 0x61, 0xea, 0xf5, 0xe5, 0x25, 0x30, 0x31, 0xc2, 0xcc,
- 0x3c, 0x54, 0x2c, 0x4a, 0xe1, 0x80, 0xf4, 0x33, 0x30, 0x8c, 0x1c, 0x33,
- 0xd7, 0xdd, 0x70, 0x65, 0x91, 0xc2, 0x70, 0x6a, 0xd7, 0x99, 0xa4, 0xb7,
- 0x74, 0x96, 0x7a, 0xd9, 0xc9, 0xf5, 0x76, 0x9a, 0x4c, 0x95, 0x0d, 0x75,
- 0xa2, 0x5d, 0x3e, 0x48, 0xa9, 0x41, 0x41, 0x06, 0x2c, 0x73, 0x44, 0xf8,
- 0x1a, 0xfa, 0x79, 0xdf, 0x46, 0x77, 0x23, 0x79, 0xd8, 0xa8, 0x3f, 0x0e,
- 0xc3, 0xf1, 0xe4, 0x73, 0x01, 0xf1, 0x63, 0x14, 0xb6, 0xca, 0xa2, 0x5a,
- 0xb1, 0x5e, 0x29, 0xfc, 0xa8, 0x2b, 0x35, 0xe7, 0xd8, 0x8e, 0x4d, 0x7e,
- 0x01, 0xc7, 0x0a, 0x7d, 0x6d, 0xe9, 0xd1, 0xe8, 0x30, 0x38, 0xd8, 0x7a,
- 0x31, 0x9c, 0x4e, 0xa7, 0x43, 0xe8, 0x01, 0x2f, 0x58, 0x39, 0xd9, 0x13,
- 0xe5, 0xa0, 0xc7, 0x67, 0x30, 0xce, 0x64, 0xbf, 0x5f, 0xbd, 0x7a, 0x25,
- 0x7a, 0xcc, 0xc5, 0x55, 0x47, 0xa3, 0xb0, 0x80, 0x53, 0xa2, 0x51, 0xc5,
- 0xda, 0x1c, 0xd6, 0x57, 0xeb, 0x66, 0x86, 0x6e, 0xc8, 0xc4, 0x32, 0x94,
- 0xf5, 0xda, 0x1a, 0xd9, 0x0e, 0x2a, 0x28, 0x35, 0xa5, 0x1f, 0xb8, 0xcc,
- 0x44, 0x33, 0x76, 0x70, 0x34, 0x2b, 0x6e, 0x80, 0x82, 0x17, 0x65, 0xec,
- 0x6e, 0x8b, 0x55, 0x9e, 0xaa, 0x0f, 0xdd, 0xa5, 0x13, 0xac, 0x63, 0x99,
- 0x6c, 0x3a, 0x0a, 0x3e, 0x9b, 0xe6, 0x92, 0x01, 0x96, 0xca, 0xb7, 0xba,
- 0x63, 0xdf, 0x73, 0x1e, 0xb2, 0xd5, 0xed, 0x23, 0x79, 0xd2, 0x7b, 0x24,
- 0xd1, 0xcd, 0x27, 0xab, 0x8a, 0xb6, 0x7d, 0xe7, 0x15, 0x10, 0x45, 0x5f,
- 0xc9, 0x85, 0x78, 0x75, 0x45, 0xf9, 0x5b, 0x0b, 0x3a, 0x1c, 0x33, 0xe5,
- 0x9a, 0x99, 0x80, 0xc8, 0x8f, 0xf1, 0xf8, 0x74, 0xef, 0xe2, 0x74, 0x1c,
- 0x64, 0xbc, 0xdf, 0x91, 0xcb, 0x98, 0x9b, 0x68, 0xb7, 0x5c, 0x9e, 0xbc,
- 0x45, 0x00, 0x87, 0x2e, 0xe7, 0x6d, 0x0a, 0xe7, 0xaf, 0x44, 0xf1, 0x4e,
- 0xd6, 0x85, 0x16, 0xc3, 0x58, 0xd9, 0x5d, 0x64, 0x05, 0x8a, 0xc8, 0x49,
- 0x84, 0xe3, 0x06, 0x20, 0x21, 0xb6, 0x4e, 0xde, 0xbd, 0xbc, 0xa0, 0xf2,
- 0x96, 0x46, 0x52, 0x3c, 0xc8, 0x05, 0x14, 0x7a, 0xc6, 0x6f, 0x2c, 0x2e,
- 0x01, 0xa2, 0x36, 0xe9, 0xd4, 0x35, 0x43, 0x51, 0x65, 0x9d, 0x8f, 0xaf,
- 0x56, 0xc2, 0xdb, 0xb4, 0xfd, 0x66, 0x4b, 0x45, 0x3a, 0x74, 0x69, 0xbe,
- 0x7b, 0x1a, 0x07, 0xd1, 0xd3, 0xe0, 0x0d, 0x88, 0x5f, 0x87, 0xf7, 0xc2,
- 0xca, 0x75, 0xa3, 0xa5, 0x8a, 0x5f, 0xa7, 0xbf, 0x28, 0x2f, 0x73, 0xf2,
- 0x04, 0xe2, 0xbc, 0xfc, 0xc0, 0x5b, 0xe0, 0x26, 0xe5, 0xdd, 0xa9, 0xb9,
- 0x14, 0xa7, 0x0d, 0x60, 0xcb, 0x57, 0x84, 0xe4, 0x84, 0xdd, 0x53, 0xdb,
- 0x87, 0x49, 0x4b, 0x20, 0xc3, 0x0a, 0x43, 0x60, 0xe7, 0xe5, 0x53, 0x63,
- 0x22, 0x4c, 0x29, 0xfb, 0x03, 0xe5, 0x80, 0x75, 0x3b, 0xc5, 0x36, 0x6f,
- 0xc1, 0xf2, 0xa9, 0x87, 0xb4, 0x0e, 0x63, 0x15, 0xd0, 0x14, 0x64, 0x85,
- 0x1b, 0xfd, 0xf0, 0x4f, 0x5a, 0xc2, 0xe3, 0x2b, 0xb2, 0xc8, 0x2e, 0x03,
- 0xa1, 0x6b, 0x51, 0x28, 0x22, 0xc8, 0x7f, 0x50, 0x51, 0x51, 0xde, 0x2f,
- 0xbd, 0x8d, 0x7d, 0x48, 0xf7, 0x4d, 0xe8, 0xdd, 0x83, 0x6e, 0x3b, 0x33,
- 0x46, 0x25, 0x6c, 0x83, 0x55, 0xb7, 0xa0, 0x81, 0x34, 0xd1, 0xb7, 0x33,
- 0xdc, 0x57, 0xc7, 0xae, 0x7d, 0x42, 0x07, 0x3f, 0xa8, 0xd5, 0x5a, 0x81,
- 0xe3, 0x90, 0x14, 0x83, 0xba, 0xa1, 0x2e, 0xac, 0x37, 0x3d, 0x46, 0x0e,
- 0x2b, 0xb1, 0x17, 0x0e, 0x8d, 0x9d, 0xef, 0x07, 0x6b, 0x81, 0x99, 0xcd,
- 0x52, 0x25, 0xe8, 0x19, 0x0d, 0xd0, 0xff, 0xfb, 0xb6, 0xeb, 0x0e, 0x34,
- 0x8a, 0xf8, 0x21, 0x54, 0x3a, 0x84, 0x00, 0xc2, 0x2e, 0xf4, 0x34, 0x70,
- 0x13, 0x76, 0xdf, 0x0d, 0xdb, 0x7b, 0xf0, 0xf2, 0x36, 0xcf, 0xe7, 0xeb,
- 0xe3, 0x97, 0xaf, 0x2d, 0x8c, 0xc0, 0x6f, 0x81, 0x2c, 0xec, 0xbc, 0x9a,
- 0x93, 0x8c, 0xbb, 0x40, 0xac, 0xd5, 0x51, 0x82, 0xd3, 0x51, 0x42, 0x05,
- 0xad, 0x18, 0x75, 0xad, 0xce, 0xf8, 0x86, 0xf4, 0x36, 0x43, 0xe8, 0xf5,
- 0x8c, 0xf8, 0xd9, 0x07, 0xe2, 0xb1, 0x26, 0x4d, 0x99, 0x6b, 0xab, 0x3c,
- 0x42, 0xbe, 0x04, 0x21, 0x2f, 0xca, 0x49, 0x39, 0x9f, 0x6f, 0x90, 0xee,
- 0x0c, 0x0f, 0x89, 0x1a, 0x28, 0x26, 0x98, 0x2d, 0xda, 0x46, 0x7a, 0x6f,
- 0x42, 0xb3, 0x37, 0x47, 0x6a, 0xae, 0xda, 0x96, 0x14, 0x26, 0x40, 0x25,
- 0x0f, 0xee, 0x46, 0xbb, 0x30, 0x5d, 0x6d, 0x06, 0x35, 0xf1, 0x50, 0x98,
- 0xcf, 0xee, 0x18, 0x4d, 0x13, 0xb2, 0xc0, 0xfe, 0x75, 0xf2, 0x9f, 0xff,
- 0xfc, 0xeb, 0x8f, 0x91, 0xee, 0x06, 0xe4, 0xf0, 0xbb, 0xe2, 0xca, 0x42,
- 0xf3, 0xf4, 0x52, 0x50, 0x5b, 0x2c, 0x4e, 0x3c, 0x27, 0x9a, 0x70, 0x3c,
- 0xa3, 0xa9, 0xb3, 0xc5, 0x7c, 0xe4, 0xe5, 0x54, 0x86, 0x62, 0x91, 0x4c,
- 0x28, 0xfd, 0x20, 0xba, 0xd5, 0x51, 0x29, 0x38, 0x97, 0xef, 0x12, 0x72,
- 0x37, 0x5a, 0x04, 0xb9, 0x94, 0x69, 0x8b, 0xec, 0xcb, 0x27, 0x11, 0xe0,
- 0xc7, 0xb8, 0x36, 0x3e, 0xdd, 0x60, 0xfa, 0x87, 0xf7, 0x27, 0xd6, 0xd5,
- 0xe9, 0x73, 0xe5, 0x2b, 0x43, 0xa9, 0x77, 0xc3, 0xec, 0x2e, 0x9b, 0x18,
- 0x2e, 0x51, 0x2b, 0xf0, 0xc3, 0x70, 0x59, 0x27, 0x2f, 0x96, 0x86, 0xc6,
- 0xf3, 0x1e, 0xc8, 0x8e, 0xaf, 0xe9, 0xb5, 0x44, 0x5f, 0xb3, 0xf8, 0xa5,
- 0x97, 0x65, 0x65, 0x76, 0x68, 0x29, 0xd5, 0xb8, 0x52, 0x92, 0xdc, 0x76,
- 0x66, 0x24, 0x28, 0x30, 0x09, 0xdc, 0x01, 0xd7, 0x8f, 0x44, 0xe3, 0x06,
- 0x18, 0x9b, 0x07, 0x14, 0x06, 0x65, 0x7d, 0x6d, 0x94, 0x47, 0x33, 0x7b,
- 0x63, 0x64, 0x93, 0xb5, 0x5e, 0x0f, 0x84, 0xa4, 0x2a, 0xc5, 0x91, 0x8b,
- 0xc2, 0x08, 0xd8, 0x32, 0x44, 0xb6, 0xb0, 0x0c, 0xd3, 0xf1, 0x57, 0x64,
- 0xbb, 0x98, 0xfa, 0xe8, 0x6f, 0xd2, 0xbb, 0x38, 0xdc, 0x57, 0x5d, 0x00,
- 0xbb, 0x41, 0x13, 0x97, 0xbd, 0x4a, 0x05, 0x1b, 0xb9, 0xf6, 0x17, 0xf6,
- 0x3d, 0xb1, 0xd6, 0x54, 0x0e, 0x2e, 0xe5, 0x32, 0x9d, 0xd9, 0x42, 0x7a,
- 0x1f, 0x3a, 0x10, 0x65, 0x88, 0x29, 0xd5, 0x45, 0x66, 0x8b, 0x91, 0x74,
- 0xd5, 0x46, 0x5a, 0x95, 0x1b, 0x13, 0x0c, 0xb7, 0x8b, 0xeb, 0x52, 0x53,
- 0x8a, 0x00, 0x57, 0xc3, 0x8a, 0x43, 0x1f, 0x65, 0xe5, 0xe2, 0x79, 0x88,
- 0xc6, 0x7a, 0x2f, 0x04, 0x2f, 0xe7, 0x12, 0x66, 0xbf, 0xd8, 0x0f, 0x00,
- 0x4b, 0x46, 0xef, 0x30, 0x86, 0x21, 0xa1, 0xb7, 0x91, 0x5e, 0x41, 0x3c,
- 0x84, 0x0f, 0xfc, 0x58, 0x0e, 0xbc, 0x33, 0x1c, 0xc5, 0x5a, 0x9e, 0x3c,
- 0x7e, 0xfc, 0x98, 0x63, 0x2d, 0x5b, 0x27, 0xf8, 0xf0, 0xfb, 0xe3, 0x57,
- 0x67, 0x6f, 0xdf, 0x1e, 0xbf, 0x7b, 0x7d, 0xfc, 0x5a, 0x33, 0x3e, 0xbc,
- 0x95, 0x38, 0xea, 0x08, 0x57, 0x44, 0x59, 0x82, 0x66, 0x9f, 0x0f, 0x1e,
- 0xef, 0x0f, 0x0f, 0x1f, 0xef, 0x27, 0x86, 0x16, 0x53, 0x5b, 0xa7, 0x96,
- 0x2e, 0x52, 0xb2, 0x6f, 0xaf, 0xd6, 0x46, 0x55, 0x23, 0x68, 0xcf, 0x86,
- 0x30, 0x37, 0xe0, 0x7a, 0x25, 0x6f, 0x4f, 0xd6, 0x90, 0x1d, 0x1d, 0xc9,
- 0x0c, 0x18, 0x6d, 0x59, 0x90, 0x36, 0x17, 0xb0, 0x14, 0xdd, 0x07, 0x04,
- 0x7a, 0xb8, 0x4f, 0x1f, 0x1a, 0x25, 0x6f, 0x8c, 0xf6, 0x31, 0x2f, 0x6f,
- 0x99, 0x16, 0x5f, 0x5d, 0x19, 0xa5, 0x34, 0x0b, 0x43, 0x95, 0xed, 0xf7,
- 0xe9, 0xf5, 0x23, 0x7e, 0xfd, 0x37, 0x8c, 0xd1, 0x3f, 0x7e, 0xd6, 0x36,
- 0x2c, 0xcd, 0x45, 0x06, 0x2a, 0xbc, 0x96, 0x24, 0xf6, 0xe0, 0xfb, 0x8f,
- 0xd9, 0x1c, 0xff, 0xfa, 0xe5, 0x39, 0x3d, 0x6d, 0xcc, 0xf2, 0xb3, 0xef,
- 0xff, 0xe2, 0xca, 0x3c, 0xaf, 0x0f, 0x34, 0x9b, 0x51, 0x2a, 0x59, 0xd1,
- 0x88, 0xaf, 0x08, 0x83, 0xde, 0x4e, 0x99, 0xb5, 0x06, 0xa1, 0x0a, 0x19,
- 0xac, 0x90, 0x32, 0x50, 0xcd, 0xd6, 0x71, 0x8f, 0x2c, 0x39, 0xb4, 0xaa,
- 0x96, 0x2b, 0x1e, 0xab, 0xeb, 0x37, 0xac, 0x9c, 0xa6, 0x71, 0x9b, 0x73,
- 0xdf, 0x87, 0xbc, 0x98, 0x71, 0x63, 0xda, 0x96, 0x63, 0xb6, 0xa9, 0xd6,
- 0x59, 0xcc, 0x6b, 0xba, 0x11, 0x63, 0x87, 0x94, 0xda, 0x2a, 0x5f, 0xa6,
- 0x55, 0xce, 0xed, 0xe7, 0x89, 0xc0, 0x6f, 0xb8, 0x57, 0x26, 0xa7, 0x4a,
- 0x21, 0xf6, 0xe5, 0xc0, 0x64, 0xcb, 0x20, 0xed, 0xd4, 0xf6, 0x72, 0x20,
- 0x22, 0x66, 0x58, 0x23, 0x89, 0x51, 0xf2, 0x66, 0x6d, 0x84, 0xa1, 0x6b,
- 0xdb, 0xff, 0x56, 0xa1, 0xe8, 0x03, 0x9d, 0x4b, 0xde, 0x9c, 0x9c, 0x1e,
- 0xef, 0x26, 0x6f, 0xb2, 0x46, 0x4a, 0x9c, 0x34, 0xc3, 0x98, 0x44, 0xfe,
- 0xbf, 0x41, 0xc1, 0xb2, 0xa0, 0x84, 0x52, 0x23, 0x1c, 0xcd, 0x05, 0x13,
- 0x1f, 0x1c, 0x94, 0x0d, 0xad, 0x97, 0xe2, 0xc3, 0xc1, 0x12, 0x29, 0x1e,
- 0xa7, 0xb9, 0x65, 0x1a, 0xdf, 0x94, 0x93, 0x8f, 0xe4, 0xdd, 0x2a, 0xce,
- 0xc3, 0xc8, 0x43, 0x3c, 0x2b, 0xfd, 0x14, 0x02, 0x9a, 0xb4, 0xe4, 0x3c,
- 0x6b, 0xbc, 0x38, 0xaf, 0x57, 0x0b, 0xe2, 0x06, 0x51, 0x94, 0x97, 0x45,
- 0xe6, 0x2a, 0xfb, 0x40, 0xf9, 0xdc, 0x29, 0x5e, 0x8c, 0x1e, 0x30, 0x54,
- 0x5a, 0xaf, 0xb7, 0x71, 0x5f, 0xeb, 0xc6, 0x51, 0xda, 0x09, 0xff, 0xb9,
- 0xf7, 0x65, 0x14, 0x7c, 0x4c, 0x1b, 0x59, 0xa0, 0x67, 0xae, 0xbc, 0x01,
- 0x8a, 0xe2, 0x1e, 0xea, 0x22, 0xe4, 0x55, 0xed, 0x6c, 0x51, 0x42, 0x44,
- 0x7d, 0x85, 0xef, 0x4e, 0xcd, 0xdd, 0xbf, 0x48, 0x9f, 0x26, 0xd5, 0x1f,
- 0xa8, 0x04, 0xdc, 0x49, 0x17, 0xee, 0xd2, 0x6b, 0xb3, 0x8c, 0x93, 0x58,
- 0x4b, 0x34, 0xe6, 0xca, 0xd2, 0x92, 0x97, 0xb5, 0x29, 0xca, 0xd6, 0x4f,
- 0x35, 0x5d, 0x5f, 0xe7, 0x4b, 0x8f, 0x5d, 0x09, 0x78, 0x35, 0x7c, 0x29,
- 0x5c, 0x45, 0x56, 0x47, 0x5d, 0xfe, 0x52, 0xde, 0x26, 0xa1, 0x3d, 0xb4,
- 0x54, 0x65, 0xa7, 0x0c, 0xeb, 0xd0, 0x6b, 0x52, 0xe8, 0xb8, 0xb2, 0x0b,
- 0x7d, 0x08, 0x2a, 0xc6, 0xcb, 0x8c, 0x68, 0x4b, 0xf2, 0x75, 0x9f, 0x05,
- 0x75, 0x75, 0x76, 0xff, 0x33, 0x6d, 0x4b, 0x34, 0x54, 0x17, 0xcd, 0xde,
- 0x41, 0xa7, 0xa4, 0xbe, 0x1f, 0x54, 0xf5, 0x3e, 0xfd, 0x94, 0xa3, 0x10,
- 0x71, 0x0d, 0x75, 0x2e, 0x2d, 0xb4, 0xde, 0x8a, 0xa7, 0x69, 0x71, 0xde,
- 0x0d, 0xb9, 0x8d, 0x50, 0xce, 0x10, 0xd7, 0x3e, 0x19, 0xb2, 0x8c, 0x9c,
- 0x06, 0x84, 0xc2, 0xaa, 0xf3, 0x59, 0xa0, 0xa2, 0xc1, 0xde, 0x16, 0x55,
- 0xd4, 0xa8, 0x1e, 0x12, 0xba, 0x62, 0x04, 0x17, 0x3a, 0x43, 0xc3, 0x65,
- 0xb8, 0xfc, 0x6e, 0x04, 0x62, 0x6c, 0xbb, 0xca, 0x18, 0x9a, 0x7e, 0x64,
- 0x2c, 0xd1, 0x25, 0x95, 0x04, 0x28, 0x7e, 0x33, 0x2d, 0x59, 0xb6, 0xc7,
- 0xf0, 0xb6, 0xcb, 0xfc, 0x3a, 0x96, 0x65, 0x41, 0xf9, 0x11, 0x32, 0x31,
- 0x64, 0x69, 0xb8, 0x76, 0xb1, 0x9a, 0x76, 0x6c, 0x43, 0xda, 0xec, 0x97,
- 0x26, 0x1c, 0x40, 0xd9, 0xd9, 0xe0, 0x06, 0x2f, 0x48, 0x63, 0x25, 0x40,
- 0xaf, 0x82, 0x1b, 0xf4, 0x7e, 0x6d, 0x34, 0x9f, 0xe7, 0x5b, 0x16, 0x51,
- 0x1d, 0x7e, 0x55, 0x70, 0xc7, 0x16, 0xe5, 0x48, 0xcb, 0xe8, 0x61, 0xb4,
- 0xef, 0x98, 0x68, 0xee, 0x8d, 0x32, 0x2e, 0x5b, 0x70, 0x13, 0xa6, 0x35,
- 0xdb, 0x02, 0x18, 0xae, 0x18, 0x0d, 0x11, 0xe3, 0x69, 0x4a, 0xdf, 0x0f,
- 0x5f, 0xe1, 0xe3, 0xc3, 0xaf, 0x31, 0xdc, 0x1f, 0xb7, 0xac, 0xc3, 0xb7,
- 0xfb, 0xab, 0xe7, 0x61, 0xa3, 0x60, 0xe7, 0x37, 0x64, 0xc3, 0x63, 0xad,
- 0x55, 0x19, 0x48, 0x24, 0x91, 0x09, 0x72, 0x0f, 0x2e, 0x73, 0x45, 0xf6,
- 0xf4, 0xc0, 0x11, 0x4d, 0xa9, 0xc3, 0x2e, 0x9b, 0x36, 0xe5, 0xc0, 0x48,
- 0x91, 0x15, 0xc0, 0x74, 0x66, 0xc3, 0x72, 0x3e, 0x44, 0x86, 0xb4, 0x61,
- 0xfe, 0x9f, 0x28, 0x19, 0xc9, 0xbb, 0x75, 0x00, 0x08, 0x01, 0xf6, 0xf6,
- 0x6c, 0x16, 0x53, 0xcd, 0xb9, 0x90, 0x91, 0xb4, 0x0e, 0x21, 0x7c, 0x2d,
- 0xb4, 0xe0, 0x83, 0x7c, 0x2e, 0x5e, 0x79, 0xbc, 0x6e, 0xbb, 0x50, 0x11,
- 0x32, 0x97, 0x14, 0x44, 0x04, 0xfe, 0x34, 0x94, 0x47, 0x0c, 0x58, 0x7b,
- 0xc7, 0xaa, 0x61, 0xc3, 0x2d, 0xd9, 0x95, 0x0b, 0xff, 0xf3, 0x7a, 0x05,
- 0x95, 0x95, 0x10, 0x3b, 0x03, 0xef, 0x8b, 0x16, 0x89, 0x00, 0x8b, 0xd3,
- 0x08, 0xff, 0xc7, 0xa3, 0xfd, 0x41, 0x10, 0xa8, 0x6f, 0x60, 0xec, 0x17,
- 0x2e, 0x4b, 0xc8, 0x3c, 0x0c, 0x1e, 0x39, 0x8c, 0x55, 0xd7, 0xd6, 0xcd,
- 0x1d, 0xf1, 0x6b, 0x5b, 0x4c, 0x8b, 0xd4, 0x62, 0x57, 0xf7, 0xe0, 0x72,
- 0x7a, 0xb0, 0x85, 0xc2, 0x36, 0xb9, 0x8a, 0x36, 0x06, 0x71, 0x2a, 0x19,
- 0x5b, 0x5f, 0x0e, 0xbb, 0x6d, 0x32, 0x6d, 0xb7, 0x33, 0xbf, 0x7a, 0xc3,
- 0xeb, 0x5b, 0xd6, 0xeb, 0x69, 0x02, 0x9a, 0xe8, 0x4b, 0x6d, 0x7d, 0x33,
- 0x34, 0x9b, 0x2a, 0x1d, 0x5d, 0x87, 0x19, 0xfd, 0x90, 0x01, 0x3b, 0x14,
- 0x38, 0xb4, 0xee, 0xdf, 0x33, 0x06, 0xd9, 0x7d, 0x4a, 0x3b, 0x66, 0x5b,
- 0x0b, 0x68, 0x0f, 0x1d, 0x27, 0x1f, 0x40, 0xb6, 0xde, 0x5d, 0xea, 0xee,
- 0x19, 0x71, 0x15, 0xe2, 0x04, 0x85, 0xe6, 0x7c, 0xa3, 0x21, 0xfb, 0xed,
- 0x5d, 0x6f, 0x6a, 0x71, 0x4f, 0xce, 0x2f, 0xae, 0xcd, 0x1b, 0x52, 0xec,
- 0x87, 0xef, 0xcc, 0x31, 0x3c, 0x4f, 0xfe, 0xa3, 0xcc, 0xb8, 0x66, 0xf5,
- 0x9e, 0x92, 0xd5, 0xef, 0x5e, 0xbe, 0x7f, 0x77, 0xf2, 0xee, 0xab, 0xe7,
- 0x96, 0xc7, 0x11, 0xbf, 0xeb, 0xf6, 0xb4, 0xb0, 0xbc, 0x1b, 0xbf, 0x65,
- 0xe4, 0x56, 0xf2, 0xfe, 0xf4, 0x61, 0x6c, 0x53, 0x2c, 0x13, 0xec, 0x99,
- 0x9d, 0x97, 0x55, 0xc6, 0x71, 0x11, 0xb6, 0x45, 0xb5, 0x72, 0x42, 0xca,
- 0x35, 0x21, 0x2a, 0xd1, 0xb8, 0x2d, 0x02, 0xd8, 0x30, 0x3c, 0xa5, 0x33,
- 0x59, 0x94, 0xad, 0x1e, 0x51, 0x44, 0x94, 0x0b, 0x1c, 0x7f, 0xe9, 0x53,
- 0x00, 0x5b, 0xcc, 0xda, 0x51, 0x9d, 0x9d, 0x3e, 0x91, 0xe0, 0x2d, 0x63,
- 0x64, 0xab, 0xe7, 0xd5, 0xf6, 0xc7, 0x91, 0x26, 0x17, 0x35, 0x8e, 0xac,
- 0xce, 0xe1, 0x6c, 0xb0, 0x5b, 0xa2, 0x39, 0x5e, 0x11, 0x3f, 0x88, 0xc0,
- 0x4b, 0xa7, 0x6b, 0xbe, 0x2f, 0x8c, 0x4e, 0x26, 0x3f, 0x75, 0x75, 0x19,
- 0x76, 0x07, 0x1e, 0x9c, 0xe6, 0xec, 0xf2, 0x9c, 0x59, 0x9f, 0x67, 0x03,
- 0xd1, 0x63, 0x59, 0xe6, 0x4f, 0x12, 0x25, 0x51, 0x1c, 0x92, 0x45, 0xe6,
- 0xaa, 0x92, 0xac, 0xae, 0x73, 0xc5, 0xba, 0xce, 0x62, 0x15, 0x80, 0xed,
- 0x51, 0x9a, 0x79, 0x42, 0xbf, 0x51, 0xa7, 0x0e, 0x05, 0xaf, 0x20, 0x81,
- 0xd5, 0x2c, 0x69, 0x81, 0xdb, 0xd9, 0xd6, 0x90, 0xcc, 0xd4, 0x43, 0x79,
- 0x4a, 0x78, 0x4f, 0x19, 0xe3, 0x8d, 0xf9, 0x15, 0x30, 0xe6, 0xeb, 0x66,
- 0x8f, 0x57, 0xeb, 0xc9, 0x72, 0xf6, 0x38, 0x79, 0x61, 0xfe, 0x13, 0x28,
- 0x59, 0xc8, 0x19, 0x1d, 0xbf, 0x32, 0x8a, 0x16, 0x25, 0xb8, 0x90, 0xbc,
- 0x60, 0xc8, 0x1b, 0xaf, 0x8b, 0xc4, 0xd1, 0xa1, 0x99, 0xe9, 0x6d, 0xaa,
- 0xd0, 0x96, 0x46, 0x23, 0xbc, 0xcc, 0x1b, 0xce, 0xd3, 0xeb, 0xc1, 0x0d,
- 0xf2, 0x52, 0x1b, 0x70, 0xe6, 0x07, 0x87, 0x9f, 0x27, 0x54, 0x7c, 0xf0,
- 0xf6, 0xf5, 0xe3, 0x64, 0x7a, 0x95, 0x4d, 0x3f, 0xd5, 0xeb, 0xa5, 0xb2,
- 0x63, 0xda, 0x53, 0x63, 0x1e, 0xd0, 0x3c, 0x03, 0xc4, 0x07, 0x33, 0xf1,
- 0x45, 0x3e, 0xa5, 0xd2, 0xbf, 0x41, 0x2b, 0x3a, 0x35, 0xd7, 0xe8, 0x94,
- 0x67, 0x87, 0x5a, 0xb1, 0x81, 0x74, 0x01, 0xce, 0xa9, 0x89, 0x04, 0x2f,
- 0xcc, 0x1e, 0x98, 0x8f, 0xd7, 0xdc, 0xcd, 0x7a, 0xa3, 0xcb, 0xf6, 0x69,
- 0xdb, 0xeb, 0x4d, 0x17, 0x7b, 0x7f, 0xf4, 0xac, 0xa7, 0x3f, 0x47, 0xab,
- 0x35, 0x07, 0xd5, 0x2a, 0xd9, 0x6a, 0x3b, 0xd8, 0x03, 0xa4, 0xe5, 0xd3,
- 0x24, 0x09, 0x10, 0x4a, 0xc3, 0x78, 0xc1, 0xc7, 0xe9, 0xc9, 0x3d, 0x7a,
- 0x42, 0x7a, 0xcb, 0x21, 0x8b, 0x2d, 0x03, 0x26, 0x05, 0x93, 0x16, 0xd2,
- 0x84, 0x6c, 0x14, 0xd0, 0x22, 0x9c, 0x21, 0x04, 0x1b, 0x2a, 0x6d, 0xb6,
- 0xfe, 0x5b, 0x5d, 0x36, 0x8e, 0xc5, 0x48, 0x09, 0xad, 0x87, 0xe6, 0xa0,
- 0xb5, 0x84, 0xc0, 0x6b, 0x23, 0x9b, 0x22, 0x20, 0x32, 0xfb, 0x5d, 0x8e,
- 0x4b, 0xbb, 0xe3, 0xa8, 0x19, 0x8d, 0x10, 0xce, 0x73, 0xea, 0x12, 0xcb,
- 0x16, 0x75, 0x79, 0x53, 0x5c, 0x56, 0xe4, 0x1f, 0x41, 0x51, 0x58, 0x1a,
- 0x8b, 0x65, 0xc4, 0x10, 0x4c, 0xdd, 0xd8, 0xc6, 0xe2, 0x7a, 0x42, 0x9c,
- 0xde, 0xee, 0x0a, 0xe5, 0xdb, 0x73, 0x10, 0x9b, 0x2b, 0x96, 0xd9, 0x66,
- 0xf7, 0x8e, 0x68, 0x7f, 0x20, 0xc7, 0x74, 0x30, 0xda, 0x7f, 0xc8, 0x31,
- 0x11, 0x11, 0xb5, 0x4e, 0xc7, 0xbc, 0xe7, 0x6b, 0xc9, 0x9a, 0x44, 0x6e,
- 0x88, 0xbd, 0x27, 0xfb, 0xce, 0x2c, 0x54, 0xfc, 0x57, 0xd9, 0xac, 0x35,
- 0xd4, 0x46, 0x9e, 0xe3, 0x37, 0x6f, 0xe3, 0xe9, 0x1e, 0x48, 0x18, 0x86,
- 0xfe, 0x75, 0xd8, 0x25, 0x3a, 0xf3, 0xeb, 0x9f, 0xb9, 0x9a, 0x83, 0x9f,
- 0x50, 0xaa, 0xb1, 0x3f, 0x70, 0xdf, 0xdb, 0xb7, 0x2d, 0x11, 0x78, 0x42,
- 0xee, 0x5e, 0x74, 0x86, 0x0b, 0x21, 0xef, 0xf1, 0x02, 0x95, 0xbb, 0x94,
- 0xd5, 0x90, 0x54, 0x76, 0x73, 0x58, 0x81, 0x0a, 0x15, 0x9d, 0xbe, 0x39,
- 0xde, 0x9a, 0x14, 0x5b, 0xd2, 0x69, 0x41, 0x9c, 0x88, 0x19, 0x31, 0xaa,
- 0x99, 0x35, 0xe9, 0xa3, 0x69, 0xfb, 0x20, 0x90, 0x43, 0x4f, 0x45, 0xc7,
- 0x0f, 0x68, 0x53, 0x93, 0x0f, 0x2b, 0xd0, 0x20, 0xc5, 0xb8, 0x1b, 0x07,
- 0xfc, 0x8f, 0xd9, 0x25, 0x7d, 0xb3, 0x73, 0xd8, 0x5f, 0x1a, 0x93, 0x47,
- 0xb1, 0x66, 0xad, 0xdf, 0xa9, 0xa9, 0x0a, 0x96, 0x54, 0x7e, 0x69, 0x11,
- 0xc7, 0x80, 0xf8, 0x6e, 0x92, 0x31, 0x58, 0x5f, 0xbd, 0x58, 0x46, 0xd5,
- 0x94, 0x51, 0x5a, 0xd9, 0xf4, 0x04, 0x8f, 0xce, 0xea, 0xbe, 0xf6, 0xec,
- 0x73, 0xf0, 0xf4, 0x11, 0xff, 0x4a, 0xee, 0xba, 0x84, 0x77, 0x80, 0xfd,
- 0x82, 0x00, 0x50, 0xf4, 0x38, 0x1e, 0xdc, 0x02, 0x21, 0xc0, 0xef, 0xea,
- 0x34, 0xb1, 0xe0, 0xb5, 0x8c, 0x1e, 0x46, 0xdc, 0xfb, 0x83, 0xe8, 0xec,
- 0x88, 0xda, 0x7c, 0xe2, 0x6f, 0x81, 0xe1, 0x3d, 0x8b, 0x10, 0xd7, 0xcf,
- 0xba, 0x0b, 0x87, 0x9b, 0xc2, 0xa0, 0xe1, 0x1d, 0x3c, 0x1a, 0xe9, 0xd7,
- 0xfa, 0xf6, 0x2a, 0x60, 0x67, 0xbd, 0xed, 0x23, 0x1e, 0xb6, 0x5b, 0x3d,
- 0x7b, 0x63, 0xf7, 0xae, 0xb3, 0x5b, 0x7d, 0x47, 0xab, 0x57, 0x35, 0xe0,
- 0x57, 0x3d, 0x57, 0xf5, 0x28, 0xbe, 0x9b, 0x56, 0x43, 0xed, 0xf8, 0x3c,
- 0xc9, 0x65, 0x56, 0xe5, 0x30, 0x89, 0xd3, 0xc5, 0x28, 0x79, 0xed, 0x72,
- 0x5a, 0x00, 0xbc, 0x17, 0x18, 0xab, 0xb3, 0x75, 0x4f, 0xe6, 0xc7, 0xe6,
- 0xd3, 0x3a, 0x92, 0xa4, 0x1e, 0x97, 0xb8, 0x00, 0x99, 0x2e, 0x45, 0x59,
- 0x65, 0x00, 0x88, 0x29, 0x9e, 0x1b, 0x0d, 0x5f, 0x4a, 0x98, 0x8e, 0x52,
- 0xb3, 0x24, 0x00, 0x83, 0xad, 0x3f, 0xf2, 0x63, 0xe6, 0x56, 0xbd, 0xa6,
- 0x12, 0x82, 0x98, 0xa7, 0x08, 0x5f, 0xd4, 0xf4, 0x76, 0x48, 0x44, 0x55,
- 0x28, 0xcd, 0x47, 0xae, 0xf3, 0x34, 0x79, 0xb9, 0x68, 0x86, 0xe3, 0x6f,
- 0xa7, 0x1c, 0x61, 0x6b, 0x85, 0xa7, 0x82, 0x26, 0xaf, 0xf0, 0xaa, 0xa0,
- 0x3f, 0x57, 0x2d, 0x49, 0xab, 0x79, 0x35, 0x5d, 0x2f, 0x81, 0x81, 0x0a,
- 0xb2, 0xb2, 0x7d, 0x22, 0xe8, 0x20, 0x1d, 0xa5, 0x71, 0xba, 0x7d, 0x08,
- 0x7e, 0x98, 0x7e, 0xaa, 0x75, 0x49, 0x52, 0xa4, 0xc3, 0x75, 0x18, 0x76,
- 0xce, 0xed, 0xf6, 0x6a, 0x11, 0x11, 0xd4, 0xb1, 0xec, 0x18, 0xa6, 0x97,
- 0x50, 0x60, 0xfe, 0xdb, 0x87, 0x93, 0x57, 0x2d, 0xef, 0x3e, 0xc7, 0x51,
- 0x92, 0x8d, 0xd1, 0x0a, 0x86, 0x95, 0x95, 0x27, 0xe7, 0xa4, 0xc3, 0x6a,
- 0x36, 0xae, 0x26, 0xce, 0xb5, 0x8e, 0xb7, 0x2c, 0x22, 0x22, 0xd5, 0xe8,
- 0x0b, 0x3f, 0xed, 0x8e, 0x1e, 0xea, 0x1d, 0x3d, 0xfa, 0xa5, 0xef, 0xe8,
- 0xd1, 0x2f, 0x73, 0x47, 0x95, 0x83, 0x78, 0x7f, 0xf7, 0xaf, 0x6b, 0x60,
- 0x96, 0xe2, 0xfa, 0xfa, 0x0e, 0xe7, 0x76, 0xce, 0xc0, 0x90, 0xc1, 0x23,
- 0x86, 0xe2, 0xb7, 0x18, 0x72, 0x81, 0x6c, 0xac, 0x36, 0x2c, 0x11, 0xc7,
- 0xa9, 0x82, 0x3f, 0x0e, 0x92, 0x13, 0x06, 0x36, 0x47, 0x76, 0x92, 0xbc,
- 0x7e, 0xca, 0xf5, 0xb5, 0xe2, 0xf7, 0x56, 0x9f, 0x7f, 0xa4, 0x02, 0x3f,
- 0x9f, 0x12, 0xbc, 0x9a, 0xf3, 0xb8, 0x93, 0xc5, 0xac, 0x3a, 0x63, 0xb5,
- 0x46, 0x48, 0x21, 0x79, 0xb9, 0xa2, 0x12, 0x59, 0xa3, 0x71, 0xdc, 0xba,
- 0xfe, 0xc8, 0x44, 0x62, 0x61, 0x2e, 0x12, 0x6d, 0x32, 0x79, 0x70, 0x25,
- 0xf3, 0xbe, 0x3b, 0x1d, 0x8c, 0xce, 0xf0, 0x87, 0x0b, 0x22, 0xfe, 0x8a,
- 0x0d, 0xc7, 0x43, 0x43, 0xe0, 0x97, 0x41, 0x5b, 0x85, 0xc9, 0x5d, 0x13,
- 0x29, 0x03, 0xa3, 0x55, 0xd3, 0x2e, 0xec, 0xd4, 0x92, 0x65, 0xfa, 0xc8,
- 0xec, 0xe3, 0xee, 0x80, 0x1a, 0xd0, 0xaf, 0xb0, 0x03, 0x54, 0xa7, 0x63,
- 0x8d, 0x2b, 0x2a, 0x53, 0xcb, 0x2f, 0xc9, 0x63, 0x55, 0xf2, 0x35, 0x0e,
- 0x2c, 0x1a, 0xf2, 0x6e, 0x4b, 0x9a, 0xa3, 0xe6, 0x10, 0x0a, 0xdc, 0x6c,
- 0xbb, 0x44, 0x35, 0x1f, 0xa0, 0xf3, 0x1c, 0x7c, 0xd3, 0xdd, 0xe0, 0x91,
- 0x78, 0xac, 0xd9, 0xfe, 0x55, 0x9d, 0x46, 0x61, 0xfd, 0xc5, 0xe2, 0x15,
- 0xc6, 0x25, 0x2d, 0x3a, 0x10, 0xd8, 0xc3, 0x93, 0x91, 0x5e, 0x3f, 0xed,
- 0x17, 0xa7, 0xf0, 0x6c, 0xf2, 0x17, 0xc4, 0x01, 0xc5, 0x66, 0xbe, 0x85,
- 0x88, 0x26, 0x2f, 0x11, 0xf9, 0xf3, 0xb9, 0xd3, 0xca, 0x20, 0x84, 0xd5,
- 0xb3, 0xbe, 0x67, 0x07, 0x14, 0xdd, 0xba, 0xb1, 0x0a, 0xee, 0x3c, 0x1a,
- 0x8d, 0x22, 0x70, 0x16, 0xd7, 0x79, 0x76, 0xd3, 0x72, 0xc5, 0xcb, 0xcc,
- 0x06, 0xb6, 0x41, 0x0a, 0x7b, 0x80, 0xae, 0x69, 0x87, 0xcc, 0x90, 0x13,
- 0x42, 0xd2, 0xec, 0x29, 0x27, 0x71, 0x57, 0xde, 0x7f, 0xda, 0xdb, 0xe6,
- 0x4f, 0xbc, 0xcd, 0x75, 0xac, 0x1e, 0x94, 0x81, 0x91, 0x5d, 0x3f, 0x87,
- 0x01, 0x79, 0x44, 0xaa, 0xbb, 0x04, 0x8d, 0x3b, 0x1c, 0x4f, 0xc3, 0xf5,
- 0xe7, 0xfa, 0x83, 0xbc, 0x66, 0x5c, 0x62, 0xc6, 0x15, 0x0a, 0xa3, 0xc5,
- 0xfc, 0x99, 0x36, 0x3f, 0x10, 0x7e, 0xae, 0xd2, 0xcb, 0x88, 0xbd, 0x29,
- 0x39, 0xa2, 0x20, 0x9c, 0xb4, 0x19, 0x01, 0x5c, 0x31, 0x91, 0xd4, 0x23,
- 0x39, 0x11, 0xaf, 0x73, 0x89, 0x97, 0x29, 0xe3, 0xda, 0xc9, 0x24, 0xba,
- 0xc0, 0x78, 0xbc, 0x57, 0xcf, 0xd5, 0xe7, 0xd3, 0xfe, 0x4a, 0x8c, 0x75,
- 0x24, 0xad, 0xd9, 0xc4, 0x17, 0xeb, 0xf0, 0x96, 0xbb, 0x36, 0xa2, 0xab,
- 0x4f, 0x75, 0x98, 0x5a, 0xce, 0xab, 0xcd, 0xe0, 0x7d, 0x58, 0x99, 0x0c,
- 0x5e, 0xfb, 0x40, 0xd9, 0x01, 0xd4, 0x80, 0x6b, 0x1e, 0x44, 0x03, 0x73,
- 0x83, 0x9f, 0xe8, 0x11, 0xb3, 0x5e, 0xc1, 0xa8, 0x17, 0xd4, 0x82, 0x6a,
- 0x4d, 0x89, 0x27, 0xb8, 0xfb, 0x52, 0xbd, 0x2e, 0x05, 0xeb, 0x5d, 0x30,
- 0x13, 0x0b, 0x09, 0x47, 0xbb, 0x3f, 0xba, 0x4a, 0x6f, 0x6f, 0x47, 0x75,
- 0xb6, 0x67, 0xa8, 0xb6, 0xde, 0xab, 0xeb, 0x05, 0x7d, 0xb4, 0x06, 0xfa,
- 0xda, 0xc6, 0xee, 0x96, 0xb7, 0x77, 0x96, 0x80, 0x84, 0x39, 0x4f, 0x53,
- 0x7a, 0xb5, 0xc5, 0x6c, 0x5d, 0x7b, 0x4b, 0x6e, 0x10, 0xd3, 0x4d, 0x19,
- 0x66, 0xe0, 0x69, 0x40, 0xa8, 0xfb, 0xd5, 0xb6, 0xcc, 0x1a, 0x5c, 0x72,
- 0x96, 0x1d, 0xc7, 0xe1, 0xe9, 0x13, 0xd4, 0x74, 0xd5, 0x57, 0xda, 0x21,
- 0x77, 0xd5, 0x0b, 0x8d, 0x9a, 0x4d, 0xb1, 0x05, 0x10, 0x46, 0x3e, 0x38,
- 0x58, 0x1d, 0xee, 0xf8, 0x44, 0x96, 0x74, 0xf9, 0x29, 0x02, 0xf9, 0xd4,
- 0xe7, 0xb6, 0xf4, 0x96, 0x46, 0xa5, 0x22, 0xcf, 0x1d, 0xc0, 0xe0, 0xcd,
- 0xcd, 0xcd, 0x68, 0x93, 0xdf, 0xf2, 0x5f, 0x8e, 0x81, 0xb7, 0x87, 0x3b,
- 0x33, 0x54, 0x7b, 0x9a, 0x17, 0xeb, 0xdb, 0xc4, 0xc3, 0x78, 0xb1, 0xcd,
- 0x80, 0x34, 0x30, 0x97, 0x7c, 0xfb, 0xfe, 0x8d, 0x6d, 0x84, 0xad, 0xe8,
- 0x1a, 0xe4, 0xf9, 0xad, 0x43, 0xad, 0x2d, 0xcb, 0x19, 0x77, 0x87, 0x40,
- 0xa3, 0x5f, 0xbd, 0x3c, 0xff, 0xf8, 0xee, 0xf8, 0xe2, 0xe3, 0xfb, 0x97,
- 0xdf, 0xd1, 0x16, 0xb2, 0x57, 0xc6, 0xc8, 0x2b, 0x8a, 0x07, 0x54, 0x65,
- 0x49, 0x4d, 0xed, 0xde, 0xa2, 0x6c, 0x30, 0x2f, 0x00, 0xaf, 0x12, 0x6d,
- 0xb3, 0x6e, 0x31, 0xa3, 0x64, 0x9e, 0x66, 0x2e, 0xcf, 0x93, 0xd6, 0x7e,
- 0x7d, 0xca, 0xaa, 0x22, 0x5b, 0x8c, 0xca, 0xea, 0x92, 0xa8, 0x70, 0xef,
- 0xb5, 0xf0, 0xcf, 0xe8, 0x70, 0x7b, 0x92, 0xd5, 0x40, 0x10, 0x64, 0xd7,
- 0xd5, 0x9c, 0x10, 0x4b, 0x1e, 0xda, 0xa3, 0xd0, 0x23, 0xcd, 0x47, 0x60,
- 0x80, 0xab, 0xeb, 0x47, 0x1b, 0xd4, 0xbb, 0x76, 0xa7, 0x58, 0xe9, 0xf1,
- 0x06, 0x0a, 0x82, 0xef, 0xc7, 0xcf, 0x55, 0xe1, 0xea, 0xcc, 0xc5, 0xdd,
- 0x20, 0x02, 0x80, 0x00, 0x75, 0xae, 0xb4, 0x50, 0x12, 0x28, 0x70, 0xa3,
- 0x24, 0x9b, 0x8d, 0x2d, 0xee, 0xad, 0x56, 0xd4, 0xf5, 0x21, 0xf4, 0xf9,
- 0x1e, 0x86, 0x4f, 0x42, 0xcb, 0x90, 0x9a, 0x2e, 0x7a, 0x6b, 0x7e, 0x22,
- 0x6b, 0x7e, 0xf2, 0x2f, 0xad, 0xf9, 0xc9, 0xbf, 0xb0, 0xe6, 0x47, 0xbf,
- 0xf0, 0x9a, 0x1f, 0x45, 0xd7, 0xec, 0x7d, 0x65, 0xf8, 0x37, 0x5a, 0xf3,
- 0xdf, 0xd6, 0xc5, 0xa7, 0xa1, 0x99, 0x2f, 0x49, 0x61, 0xe9, 0xb1, 0x56,
- 0xf7, 0x98, 0x6c, 0x7e, 0xa3, 0x1d, 0xf8, 0xf6, 0x1d, 0xc0, 0xb0, 0xd7,
- 0x33, 0x2e, 0x15, 0x53, 0x81, 0x43, 0xfc, 0x4d, 0xd8, 0xd4, 0x22, 0x30,
- 0x10, 0x72, 0xaa, 0xf7, 0xad, 0xa7, 0xe4, 0xa7, 0x20, 0xcd, 0x7e, 0x4b,
- 0x66, 0xa3, 0xc3, 0x6e, 0x69, 0xdf, 0x15, 0xdc, 0xf4, 0x34, 0xc4, 0x39,
- 0x9a, 0xc2, 0x4d, 0x86, 0x3b, 0x69, 0x63, 0xe0, 0xae, 0x2f, 0x3b, 0x8c,
- 0x0e, 0xc6, 0x80, 0xd2, 0x81, 0x39, 0x2e, 0x48, 0x31, 0x9f, 0x90, 0x67,
- 0x5c, 0xdc, 0xad, 0x68, 0x40, 0x23, 0x9b, 0x2b, 0x23, 0x83, 0x39, 0x11,
- 0x05, 0xcd, 0xc4, 0x13, 0x3b, 0xc9, 0xa4, 0x33, 0x41, 0x89, 0x76, 0x5c,
- 0x65, 0x77, 0xdb, 0x81, 0xc2, 0x30, 0x5d, 0x94, 0xc4, 0x6f, 0x66, 0x9b,
- 0x8d, 0x8f, 0x89, 0x6b, 0x70, 0xc7, 0xf2, 0xa2, 0xd3, 0xf1, 0xce, 0x97,
- 0x1b, 0x9f, 0xb2, 0x6c, 0x95, 0x2e, 0x00, 0xad, 0x41, 0xb9, 0x0f, 0x7d,
- 0x8d, 0xb2, 0x5a, 0xc9, 0x91, 0x5a, 0x38, 0x80, 0x37, 0x5a, 0x99, 0x67,
- 0xe0, 0x73, 0x7c, 0x90, 0x54, 0x29, 0x93, 0xe4, 0x33, 0xd4, 0xba, 0xc6,
- 0xfb, 0xa6, 0xb8, 0xa6, 0x0c, 0x76, 0x12, 0xd4, 0x7a, 0xa3, 0x9c, 0x08,
- 0x06, 0x8c, 0xfd, 0x84, 0xe2, 0xc8, 0x51, 0x6a, 0xce, 0x75, 0x4e, 0x29,
- 0x79, 0x5d, 0xec, 0x61, 0xfb, 0x3e, 0xbf, 0x0e, 0x54, 0xa9, 0x56, 0xe7,
- 0x04, 0x3e, 0x40, 0x7a, 0xa2, 0xb4, 0xf2, 0x8f, 0xd4, 0x0d, 0xf4, 0x11,
- 0x0d, 0x48, 0x4a, 0x01, 0x94, 0x59, 0xff, 0xbd, 0x78, 0x75, 0xfe, 0xf1,
- 0x9b, 0xe3, 0xe3, 0xf3, 0x93, 0xd7, 0xa7, 0xc7, 0x72, 0x61, 0xec, 0x8f,
- 0xde, 0x5d, 0x7c, 0x7b, 0xaa, 0x7d, 0xe2, 0x94, 0x16, 0x03, 0x82, 0x17,
- 0xd8, 0x7f, 0x66, 0xca, 0x03, 0xb4, 0xc3, 0x32, 0x86, 0xf4, 0xcb, 0x93,
- 0xef, 0x8d, 0xd6, 0x7a, 0x3e, 0xfc, 0xf0, 0x7d, 0xd0, 0x8b, 0xc4, 0xab,
- 0x31, 0x09, 0x9b, 0x09, 0xb8, 0x92, 0x13, 0xf4, 0x74, 0x77, 0x6b, 0xef,
- 0x4b, 0xb9, 0xfb, 0x85, 0xc5, 0x20, 0x35, 0x38, 0x2f, 0xac, 0xc2, 0xc0,
- 0x2f, 0x6a, 0xbf, 0x1f, 0x2f, 0xad, 0xed, 0xc9, 0xbe, 0xb6, 0x51, 0xdb,
- 0x18, 0xb4, 0xf8, 0xbc, 0x6d, 0x33, 0x7e, 0xca, 0xee, 0x80, 0xe1, 0x98,
- 0xbc, 0xa0, 0xff, 0xc6, 0xdb, 0xdc, 0x9d, 0x57, 0xf9, 0x35, 0xe9, 0x7f,
- 0xe6, 0x59, 0x0e, 0xe9, 0xd2, 0xa3, 0x23, 0xdb, 0xf4, 0x4f, 0xc2, 0xca,
- 0x34, 0x08, 0x32, 0x4f, 0x30, 0x68, 0x12, 0xf3, 0xf6, 0x00, 0x19, 0x87,
- 0x7e, 0xc3, 0xe3, 0x61, 0x40, 0xb3, 0x3d, 0xa3, 0xe4, 0xf5, 0xf1, 0xfb,
- 0x41, 0x72, 0x7e, 0xfc, 0x96, 0x0b, 0x55, 0x8e, 0xdf, 0x7d, 0xc5, 0x7d,
- 0x10, 0xb5, 0xbd, 0x1d, 0x32, 0x21, 0xc2, 0x64, 0x4d, 0x6f, 0x4f, 0xcc,
- 0xbb, 0xc8, 0x4c, 0xad, 0x6b, 0x23, 0x5d, 0x7f, 0x45, 0x00, 0x1d, 0x5e,
- 0xdb, 0x0b, 0xf3, 0x9f, 0xd8, 0x56, 0x19, 0x3b, 0xe2, 0xeb, 0xc8, 0x76,
- 0x89, 0x62, 0x66, 0x73, 0x67, 0xc4, 0x28, 0xa0, 0xdd, 0xe0, 0x1d, 0x33,
- 0x1b, 0x12, 0x66, 0x71, 0xe8, 0x06, 0xc1, 0xec, 0x03, 0x84, 0x10, 0x37,
- 0xcf, 0x95, 0x18, 0x3c, 0x59, 0xb1, 0xe6, 0x73, 0x03, 0xa2, 0x4b, 0x00,
- 0x92, 0xbb, 0xcd, 0x88, 0x55, 0x47, 0x57, 0x39, 0x37, 0x22, 0xee, 0x20,
- 0xd3, 0x99, 0xed, 0xce, 0x67, 0x8c, 0xc0, 0x40, 0x01, 0xe4, 0xb2, 0xa2,
- 0x04, 0x0e, 0x82, 0x3e, 0xf8, 0x9f, 0x7b, 0xa3, 0xba, 0xbe, 0xda, 0xcb,
- 0x67, 0x1f, 0xab, 0x3a, 0xdd, 0xee, 0xca, 0x22, 0xef, 0xd7, 0x33, 0xfa,
- 0x75, 0xb2, 0x3d, 0xb2, 0x8f, 0xca, 0xdf, 0xe9, 0xe7, 0x51, 0x2c, 0x00,
- 0x15, 0x41, 0xec, 0x5a, 0xd1, 0x7c, 0x4e, 0x6d, 0x9f, 0xb8, 0xc8, 0x27,
- 0x95, 0x51, 0xe0, 0x5c, 0xf7, 0x0f, 0xe9, 0x86, 0xb8, 0xfa, 0x34, 0xad,
- 0x0f, 0x0e, 0x42, 0x34, 0x7a, 0x5b, 0xe2, 0x38, 0xd0, 0xbc, 0xdc, 0xf3,
- 0x6f, 0x5e, 0x8d, 0x7f, 0x77, 0x70, 0x80, 0x34, 0xe8, 0x1d, 0x4a, 0x57,
- 0x7d, 0xfa, 0xf8, 0xe0, 0x70, 0x37, 0xa6, 0x3e, 0x06, 0x79, 0x3d, 0xd4,
- 0xc1, 0x32, 0x75, 0xf4, 0x49, 0xbb, 0x8f, 0x30, 0xb7, 0x14, 0x3d, 0xd8,
- 0xa1, 0x67, 0x19, 0x25, 0x09, 0xa2, 0xb2, 0x93, 0xc3, 0x99, 0xc8, 0x9d,
- 0x0c, 0x52, 0x2f, 0x2c, 0x0e, 0xd2, 0x16, 0xcf, 0xfe, 0xf9, 0x96, 0xa5,
- 0x2a, 0x3f, 0x87, 0x1c, 0xf9, 0x27, 0xde, 0xac, 0x47, 0xbc, 0x4f, 0xdd,
- 0xf0, 0x9a, 0xbf, 0x2e, 0x24, 0x3a, 0x3a, 0xa0, 0x29, 0x16, 0x5f, 0xae,
- 0x75, 0x64, 0x27, 0x41, 0x80, 0xf2, 0x03, 0x02, 0x5f, 0xbd, 0xcc, 0x69,
- 0x8b, 0xe9, 0x87, 0x08, 0x3e, 0x75, 0x83, 0xda, 0xdd, 0xf7, 0x18, 0x84,
- 0x3f, 0x68, 0xe8, 0xec, 0xe3, 0x6f, 0x24, 0x5b, 0xe6, 0xee, 0xc6, 0x87,
- 0xfc, 0x55, 0xef, 0x64, 0x35, 0x49, 0x5e, 0x2c, 0xcc, 0x8b, 0x8b, 0x9e,
- 0xd2, 0xbb, 0x63, 0x6e, 0xb7, 0xf5, 0x4d, 0x56, 0x4d, 0xb2, 0xaa, 0xac,
- 0x3b, 0x55, 0x42, 0x58, 0xad, 0xd4, 0xfd, 0x52, 0x4d, 0x80, 0x19, 0x47,
- 0xd3, 0xa5, 0x82, 0xc6, 0x9a, 0x0d, 0xac, 0x6f, 0xc1, 0x78, 0x6f, 0xe3,
- 0xf2, 0x6c, 0xa3, 0x56, 0x89, 0x2e, 0x00, 0xf5, 0x97, 0xa2, 0x3f, 0x0d,
- 0x37, 0x9e, 0xa3, 0x19, 0x4c, 0x9e, 0x2e, 0xb6, 0xa9, 0xeb, 0x4f, 0xf7,
- 0x1a, 0x09, 0xa5, 0x6d, 0x8f, 0xa8, 0x00, 0x8d, 0x8d, 0x35, 0x64, 0x41,
- 0xa1, 0xdc, 0x3a, 0x4d, 0x64, 0x2e, 0x9a, 0xdf, 0x4d, 0xd7, 0xdc, 0xa5,
- 0x01, 0xd6, 0x41, 0x27, 0x24, 0x3b, 0x5c, 0x1b, 0x3a, 0xa9, 0x2f, 0xc3,
- 0xf8, 0x17, 0x16, 0x53, 0x7c, 0x0c, 0x3f, 0xb9, 0x79, 0xb6, 0xed, 0x97,
- 0xdd, 0x19, 0x4e, 0xcf, 0xca, 0x3f, 0x67, 0x7d, 0x3f, 0xda, 0x8a, 0xf6,
- 0x25, 0x57, 0x87, 0x77, 0xb0, 0x46, 0xd0, 0x95, 0x80, 0x4a, 0x9a, 0x66,
- 0x6c, 0x18, 0x4a, 0xf5, 0xab, 0x4b, 0x9c, 0x60, 0x4e, 0x13, 0x06, 0xc7,
- 0xb1, 0x54, 0xf4, 0x0f, 0xd1, 0x69, 0x0f, 0xd9, 0x78, 0x7f, 0x95, 0x88,
- 0x37, 0x02, 0x75, 0x51, 0x37, 0x15, 0xa1, 0xa5, 0x16, 0x0e, 0x73, 0x79,
- 0x91, 0xf5, 0x82, 0x68, 0x29, 0xa2, 0xaa, 0x39, 0xa4, 0x85, 0xf4, 0x36,
- 0xd4, 0x6c, 0xc4, 0x4a, 0xe7, 0x34, 0x94, 0x64, 0x0e, 0x75, 0x18, 0xd0,
- 0x7b, 0xff, 0x76, 0x2f, 0xa4, 0xca, 0x7d, 0x67, 0xe7, 0x54, 0xfa, 0x18,
- 0x4c, 0xc2, 0x83, 0xb1, 0xe2, 0x3a, 0x65, 0x7e, 0xa8, 0x18, 0x18, 0x42,
- 0x26, 0xbd, 0x30, 0xfc, 0x34, 0x0b, 0xc0, 0xb2, 0xc6, 0x2d, 0x7c, 0x05,
- 0x69, 0xf9, 0xaa, 0x25, 0x74, 0x78, 0xcf, 0xb6, 0xbe, 0xb6, 0x4d, 0xca,
- 0x98, 0xf6, 0x87, 0x50, 0x59, 0xbb, 0xee, 0x36, 0x6a, 0x57, 0xe2, 0xca,
- 0xb4, 0x71, 0x6b, 0x01, 0x46, 0xaf, 0x20, 0x47, 0x9a, 0x25, 0xcd, 0xdb,
- 0x41, 0xbe, 0x68, 0xc9, 0xbf, 0x85, 0x71, 0x91, 0x06, 0x3e, 0x10, 0x14,
- 0x3c, 0x70, 0x07, 0x10, 0x21, 0x82, 0xed, 0x19, 0x7b, 0x46, 0x71, 0x24,
- 0x76, 0xaa, 0x74, 0xf1, 0x24, 0x0c, 0xc5, 0x5d, 0x13, 0xcc, 0x8d, 0x0e,
- 0x4c, 0x85, 0x89, 0x19, 0xe2, 0x26, 0x9f, 0x35, 0x57, 0xe8, 0xc9, 0xa3,
- 0x96, 0x51, 0x2d, 0xb8, 0x00, 0xe4, 0xa4, 0xce, 0xc3, 0xaa, 0xb7, 0x49,
- 0x8f, 0x03, 0x8f, 0x0f, 0x0c, 0x9b, 0x9a, 0x30, 0x40, 0x16, 0x39, 0xea,
- 0x70, 0x0e, 0x70, 0x6a, 0xef, 0xb1, 0xaa, 0x67, 0xa1, 0x61, 0x52, 0x73,
- 0x8b, 0xe6, 0xd4, 0x6e, 0x27, 0x30, 0xd7, 0xb4, 0x3c, 0x6d, 0xa4, 0x37,
- 0x84, 0x68, 0x78, 0xfb, 0x13, 0x83, 0xe2, 0x7f, 0xb3, 0xad, 0x5d, 0x65,
- 0xd7, 0x45, 0xe3, 0x57, 0xd0, 0x10, 0x2f, 0x4f, 0x3e, 0xe5, 0x61, 0xa7,
- 0x06, 0x7c, 0x7d, 0x60, 0x78, 0xcd, 0x92, 0x47, 0x78, 0xbb, 0xad, 0x8e,
- 0x52, 0x02, 0x4c, 0xb8, 0x4c, 0xe5, 0xf7, 0x0c, 0x96, 0xb2, 0x7d, 0xc9,
- 0x0f, 0x7d, 0xe5, 0x1e, 0xea, 0x0c, 0x47, 0x5e, 0x7b, 0xf6, 0xd2, 0x6b,
- 0x32, 0x5d, 0xfd, 0x9c, 0x0a, 0x34, 0xbe, 0x19, 0x24, 0x47, 0x4b, 0x1c,
- 0xca, 0xc1, 0x57, 0x31, 0xc6, 0xc5, 0x3d, 0x82, 0xeb, 0xd2, 0x96, 0xcb,
- 0x0f, 0xff, 0x42, 0x26, 0x17, 0x36, 0x8c, 0xe9, 0xd2, 0x56, 0x82, 0x71,
- 0x3d, 0x8a, 0xf2, 0x83, 0x48, 0xd0, 0x01, 0xb9, 0x94, 0x2b, 0x32, 0x12,
- 0x66, 0x99, 0xa2, 0x84, 0x2f, 0xe1, 0xdd, 0xa4, 0x6c, 0xa9, 0x95, 0xc0,
- 0x61, 0x10, 0xb9, 0x0e, 0x2d, 0x04, 0x69, 0xbd, 0xa0, 0x07, 0xd0, 0x26,
- 0xab, 0x0c, 0x32, 0xab, 0x17, 0x2b, 0x18, 0x48, 0xb6, 0x93, 0x9d, 0x37,
- 0x29, 0xaa, 0x6a, 0x9d, 0x26, 0xe2, 0xe3, 0xf9, 0x15, 0x45, 0xe2, 0x02,
- 0x29, 0x7a, 0x79, 0xdd, 0x0c, 0x23, 0x78, 0xaf, 0x88, 0x01, 0x9d, 0x9f,
- 0x9d, 0x1f, 0xed, 0xfa, 0xa0, 0x98, 0x02, 0x8e, 0xc0, 0x3d, 0x1f, 0x11,
- 0x25, 0xb2, 0xc0, 0x09, 0x03, 0x65, 0x37, 0x5c, 0xa6, 0x17, 0xda, 0x96,
- 0x53, 0x41, 0x8c, 0x23, 0xe6, 0x82, 0x2f, 0xc2, 0xe5, 0xef, 0x0a, 0x45,
- 0xbc, 0x6e, 0x88, 0xee, 0x62, 0x2a, 0x3c, 0xe2, 0x67, 0x21, 0xac, 0x4c,
- 0xcd, 0x09, 0xe5, 0x40, 0x64, 0x19, 0xa2, 0xf8, 0xaf, 0xdd, 0x4f, 0x84,
- 0x0a, 0x17, 0x82, 0x59, 0x26, 0x9c, 0x78, 0x14, 0x49, 0xe9, 0x92, 0x20,
- 0xaf, 0x7b, 0x12, 0x01, 0x09, 0x2d, 0x86, 0x04, 0xba, 0x90, 0xcb, 0xb5,
- 0x20, 0x6f, 0x29, 0x51, 0x2d, 0x63, 0x2a, 0x8f, 0x7a, 0xfb, 0xc0, 0xdb,
- 0xbe, 0x16, 0x2d, 0x8b, 0x4c, 0xba, 0x96, 0xa5, 0xc9, 0xbb, 0xd3, 0xf1,
- 0x85, 0x1f, 0x44, 0x82, 0x1e, 0x16, 0xa4, 0x32, 0xb7, 0x81, 0xdd, 0xbc,
- 0xd4, 0xa2, 0xd3, 0x93, 0xf1, 0xc5, 0x28, 0xd6, 0xb1, 0xc1, 0x68, 0xe7,
- 0x63, 0x2a, 0xb7, 0x69, 0x01, 0x65, 0x24, 0xdc, 0x1d, 0x9c, 0x13, 0x8d,
- 0x39, 0x3a, 0xc6, 0xd1, 0xa2, 0xbc, 0xf2, 0x41, 0x21, 0xba, 0xc3, 0x99,
- 0x29, 0xfe, 0x91, 0xd3, 0x94, 0x25, 0xc5, 0x59, 0xa3, 0x44, 0xf5, 0x7a,
- 0x32, 0xf4, 0x90, 0x14, 0x59, 0xdf, 0x41, 0x8b, 0x2e, 0x43, 0xbd, 0x46,
- 0x42, 0x7d, 0x0a, 0x6d, 0xcc, 0x1d, 0x26, 0x28, 0xec, 0x8f, 0x20, 0x60,
- 0xb6, 0x5c, 0xdd, 0xd3, 0x24, 0x03, 0xe2, 0x2e, 0x9c, 0x4c, 0xf4, 0xec,
- 0x83, 0x89, 0x8a, 0xb6, 0xa2, 0xb3, 0x93, 0xd2, 0xd5, 0xb1, 0x5d, 0xb3,
- 0x40, 0x61, 0xbb, 0x9f, 0x12, 0xa7, 0xf4, 0x48, 0xd0, 0x11, 0x5d, 0x9d,
- 0x65, 0xec, 0x72, 0xb2, 0xd3, 0xee, 0x05, 0x01, 0xce, 0x67, 0x8c, 0x83,
- 0x59, 0xb7, 0x81, 0x30, 0x19, 0xf4, 0x80, 0x98, 0x0e, 0x37, 0x00, 0x22,
- 0xd5, 0xad, 0xef, 0x24, 0xd9, 0x27, 0xd7, 0xca, 0x4f, 0x1d, 0x7e, 0xcf,
- 0x19, 0xcf, 0x08, 0x94, 0x0d, 0xfa, 0x10, 0xda, 0x42, 0x32, 0xd2, 0x66,
- 0x4c, 0x1f, 0x4e, 0x5e, 0x9f, 0xda, 0xdd, 0x92, 0xdd, 0x41, 0x0a, 0xad,
- 0x5d, 0x2b, 0x95, 0xb5, 0x28, 0xdb, 0xc4, 0x99, 0x04, 0x41, 0x9f, 0x75,
- 0x91, 0xff, 0x1d, 0xa9, 0x56, 0xd0, 0x5d, 0xe7, 0x39, 0xe0, 0xbc, 0x52,
- 0xb8, 0xce, 0x55, 0x92, 0x6d, 0xd7, 0xb6, 0x93, 0x5d, 0x3e, 0xb3, 0xe5,
- 0x1f, 0x1c, 0xe3, 0x8b, 0xe6, 0x1f, 0x6f, 0x44, 0x4e, 0x39, 0x68, 0xc3,
- 0x9b, 0x02, 0xe5, 0x58, 0xc0, 0xc8, 0x8c, 0x40, 0xda, 0x43, 0xf9, 0x62,
- 0xa0, 0x5c, 0x40, 0x37, 0x73, 0xd9, 0x75, 0x6d, 0x90, 0x9d, 0xb2, 0x92,
- 0xa2, 0xc7, 0x9d, 0x37, 0xef, 0xcf, 0xde, 0x0e, 0x2f, 0xce, 0xd0, 0xea,
- 0x1e, 0xe6, 0xdc, 0x62, 0x43, 0x8a, 0x48, 0x6d, 0xfb, 0xa4, 0x3a, 0x94,
- 0x12, 0xf1, 0xb5, 0xed, 0xd4, 0xbb, 0x52, 0xe8, 0xc3, 0x22, 0x05, 0xd3,
- 0xd3, 0xb7, 0x82, 0xf6, 0x25, 0x05, 0x6b, 0x22, 0x29, 0x5a, 0xa4, 0x92,
- 0xdf, 0x71, 0xea, 0xc5, 0xb1, 0x38, 0xa5, 0x43, 0x38, 0xf7, 0x64, 0x5d,
- 0xdf, 0x25, 0x52, 0x5b, 0x4a, 0x98, 0x85, 0xb0, 0xa5, 0xc2, 0xe8, 0x80,
- 0xed, 0xbd, 0x6d, 0x91, 0x8a, 0xa8, 0xea, 0x8e, 0xcb, 0xba, 0x9a, 0xd2,
- 0x5c, 0xdf, 0xb4, 0xaa, 0xca, 0x1b, 0x15, 0x5c, 0x52, 0xfb, 0x6d, 0xa6,
- 0x4e, 0x87, 0x54, 0xdd, 0xf5, 0xa2, 0xbb, 0x08, 0x60, 0x99, 0x76, 0x0e,
- 0xdf, 0xa8, 0xfe, 0x3d, 0x6e, 0x63, 0x6e, 0x68, 0x06, 0xf8, 0xb0, 0xa9,
- 0xd6, 0x54, 0x52, 0x1a, 0x77, 0x3b, 0x9f, 0x12, 0x9b, 0x6c, 0xa7, 0x8c,
- 0x0f, 0x04, 0x51, 0x91, 0x00, 0x78, 0xd0, 0xeb, 0xcd, 0xfa, 0x25, 0xe1,
- 0x9f, 0xe0, 0x98, 0xe2, 0x1f, 0x82, 0x1b, 0x2c, 0x50, 0xcb, 0xa4, 0xd1,
- 0x53, 0x1b, 0x57, 0xa4, 0x8d, 0xbb, 0x5c, 0xbc, 0xbc, 0xe1, 0xfe, 0x9b,
- 0x9a, 0x84, 0x03, 0x30, 0x35, 0x30, 0x03, 0xfa, 0x69, 0xa0, 0x4b, 0x2a,
- 0x4a, 0x52, 0x4e, 0x08, 0x15, 0xb3, 0xf5, 0x14, 0xc7, 0x44, 0x11, 0x3f,
- 0x6a, 0xef, 0x39, 0x61, 0xdc, 0x56, 0x05, 0x79, 0xa0, 0xa1, 0x5d, 0xba,
- 0x3c, 0x3b, 0x70, 0xba, 0x5a, 0x56, 0xc2, 0x8f, 0xb9, 0x9e, 0x65, 0xa4,
- 0x4c, 0x52, 0xee, 0x6b, 0xc6, 0x8a, 0x65, 0xd5, 0xb5, 0x39, 0x29, 0xaa,
- 0xa4, 0x3d, 0x93, 0x43, 0x76, 0x45, 0xa0, 0xf9, 0x80, 0x0b, 0x97, 0xa0,
- 0x3f, 0x21, 0x5b, 0x12, 0x01, 0x23, 0xe8, 0xfe, 0xe7, 0xb4, 0x36, 0x7c,
- 0xa9, 0x3d, 0xde, 0xee, 0x06, 0xf7, 0xf4, 0x5a, 0x0b, 0x2b, 0xbc, 0xd3,
- 0x6b, 0x1d, 0x48, 0xfc, 0xe4, 0x4e, 0x5a, 0x18, 0x17, 0x9c, 0x9a, 0xe1,
- 0xed, 0xb8, 0xb0, 0x28, 0x00, 0x2f, 0x22, 0x57, 0x3d, 0x45, 0xb7, 0xeb,
- 0xeb, 0x18, 0x73, 0x4a, 0x6d, 0x3f, 0xc7, 0x26, 0xd1, 0x8f, 0x26, 0x3b,
- 0x5a, 0xf9, 0x69, 0x2b, 0x91, 0x4e, 0xe5, 0x57, 0xcf, 0x6d, 0x69, 0x2a,
- 0xf1, 0xb4, 0xce, 0x70, 0x47, 0xdf, 0x7f, 0xdf, 0xee, 0xbf, 0xbc, 0xdb,
- 0x07, 0x86, 0x21, 0x35, 0x29, 0x33, 0xe6, 0x7d, 0x3a, 0xe1, 0xa0, 0xae,
- 0x4e, 0xc9, 0x8e, 0x42, 0x0c, 0xc8, 0xe2, 0x67, 0x07, 0x8c, 0x78, 0x8a,
- 0x8c, 0x09, 0x78, 0xa5, 0xc5, 0x56, 0xad, 0x14, 0x0e, 0xc0, 0x64, 0x9c,
- 0x44, 0x72, 0x16, 0xc1, 0x70, 0x35, 0xf7, 0x82, 0x63, 0x2a, 0xc8, 0x49,
- 0xf7, 0xb7, 0xab, 0x76, 0xce, 0x99, 0x2b, 0x8a, 0x2d, 0x08, 0x50, 0xf3,
- 0xe6, 0x26, 0xd1, 0x16, 0x38, 0xd3, 0x96, 0x5e, 0x42, 0xde, 0x73, 0x5b,
- 0x09, 0x4a, 0x8b, 0x9d, 0x56, 0x99, 0x78, 0x1b, 0xb4, 0x09, 0x50, 0x10,
- 0x45, 0x26, 0xd0, 0x1e, 0xbe, 0x3c, 0x70, 0xaa, 0xa6, 0xde, 0x7d, 0x71,
- 0x78, 0x8b, 0x9d, 0x13, 0x93, 0x32, 0x8c, 0x50, 0x7b, 0xbf, 0x29, 0x01,
- 0xb1, 0x89, 0xde, 0x4b, 0x80, 0x8d, 0x2b, 0xd9, 0xb1, 0x25, 0xed, 0x83,
- 0x59, 0xde, 0xfc, 0x41, 0x6f, 0xee, 0xc8, 0x0f, 0x5e, 0x12, 0x15, 0xc4,
- 0x42, 0xa0, 0xca, 0x4c, 0xe8, 0x5c, 0x08, 0xdb, 0x97, 0x72, 0xe1, 0xb4,
- 0x25, 0x19, 0x79, 0x8a, 0x35, 0x46, 0xce, 0xea, 0x34, 0x90, 0x28, 0x96,
- 0x30, 0x5e, 0x42, 0xa0, 0x69, 0x77, 0x65, 0x29, 0x87, 0x07, 0x4e, 0x4f,
- 0x87, 0x4b, 0xc7, 0xce, 0x2d, 0x63, 0x94, 0x0e, 0xf1, 0x58, 0xdd, 0x97,
- 0x6e, 0x22, 0xc8, 0xe3, 0xc8, 0x81, 0xe3, 0xf6, 0x29, 0xfe, 0x9e, 0xa9,
- 0x9b, 0xcc, 0xa2, 0x9e, 0x48, 0xa1, 0x99, 0xf4, 0xe1, 0xf8, 0xea, 0xf8,
- 0xa2, 0x7b, 0xb5, 0xfc, 0xc8, 0x21, 0x30, 0x46, 0xcc, 0xbf, 0xcf, 0x3f,
- 0x5c, 0xec, 0xa2, 0x39, 0x99, 0x02, 0x06, 0x37, 0xad, 0xa6, 0x33, 0xb6,
- 0x7e, 0x35, 0x2c, 0xc5, 0x61, 0x54, 0x0f, 0xe1, 0x53, 0x92, 0x0c, 0x24,
- 0x37, 0x83, 0x7c, 0x2c, 0x47, 0xfb, 0x07, 0xc6, 0x8e, 0xda, 0x3f, 0x44,
- 0xc3, 0xe9, 0xa3, 0xfd, 0x23, 0x0b, 0x84, 0xa0, 0x4f, 0x85, 0x6d, 0x2a,
- 0xf8, 0x45, 0xb8, 0x4c, 0x40, 0xf7, 0x47, 0xb7, 0xb7, 0xf8, 0x71, 0xbb,
- 0xbc, 0x62, 0x68, 0x4b, 0x12, 0xfd, 0x69, 0x46, 0xe5, 0xbe, 0xb7, 0xdf,
- 0x88, 0xec, 0xad, 0x0b, 0x2e, 0x00, 0x46, 0x43, 0x6f, 0xc2, 0x0d, 0x19,
- 0xf5, 0x77, 0xb7, 0xf2, 0x5a, 0xf5, 0x09, 0x3a, 0x9a, 0xdf, 0x9e, 0xce,
- 0x10, 0x8b, 0x8f, 0x38, 0x23, 0x28, 0x24, 0x01, 0x6b, 0xa6, 0x67, 0x04,
- 0xaf, 0xc9, 0xec, 0xc1, 0xad, 0xdb, 0x21, 0xdb, 0x32, 0x55, 0x18, 0x80,
- 0x11, 0x74, 0xc2, 0x8e, 0x6c, 0x31, 0x4d, 0xc4, 0x09, 0x41, 0xfc, 0xef,
- 0x39, 0xa5, 0x89, 0x98, 0x3b, 0x81, 0xfd, 0xd5, 0xbf, 0x6a, 0x1e, 0x1f,
- 0xff, 0xeb, 0xa8, 0x2d, 0x29, 0xc9, 0x3d, 0xac, 0x83, 0xbe, 0x90, 0xbf,
- 0x04, 0xbe, 0x4a, 0xf4, 0x19, 0x86, 0x6e, 0x8c, 0x0e, 0x31, 0xbb, 0x2d,
- 0xff, 0x09, 0xc6, 0xb0, 0x13, 0x13, 0x2d, 0x45, 0x3a, 0xb8, 0x33, 0x8b,
- 0xee, 0xd2, 0x46, 0x4b, 0x3e, 0x8c, 0xfa, 0x1a, 0x00, 0xaa, 0x26, 0x18,
- 0x8c, 0xaf, 0x09, 0x16, 0x16, 0x31, 0xc0, 0x53, 0x89, 0xcb, 0x55, 0xec,
- 0xee, 0xd6, 0x0a, 0xfe, 0x40, 0xc2, 0xd5, 0x3a, 0xdb, 0x65, 0x8e, 0x9d,
- 0xe9, 0x24, 0x2f, 0x1b, 0xf4, 0x83, 0x86, 0x1f, 0x2c, 0x34, 0x51, 0x69,
- 0x2b, 0x06, 0xbc, 0x15, 0xe8, 0xb3, 0x4e, 0x0d, 0x73, 0x34, 0x05, 0xb3,
- 0x35, 0x53, 0x0e, 0x84, 0x2c, 0xfd, 0x44, 0x8d, 0x58, 0x86, 0xed, 0x44,
- 0x93, 0xf7, 0x92, 0xce, 0x42, 0xcd, 0x3d, 0x24, 0xd1, 0x4a, 0x6a, 0xbf,
- 0x74, 0x83, 0x7e, 0x34, 0xc0, 0xdf, 0x1e, 0xef, 0x3f, 0xe3, 0x13, 0x3d,
- 0x39, 0xbe, 0x78, 0xd3, 0x75, 0xe6, 0x55, 0x86, 0xa0, 0xf8, 0xbf, 0xc3,
- 0x2c, 0xad, 0xae, 0x8c, 0x71, 0x41, 0x50, 0x49, 0x43, 0xea, 0xbf, 0x31,
- 0xdc, 0xdf, 0x8f, 0xe5, 0x6d, 0xfc, 0x8a, 0xf0, 0x10, 0x47, 0x8f, 0xda,
- 0x21, 0x3d, 0x52, 0xe9, 0x87, 0xb4, 0xdd, 0xfd, 0x48, 0xbe, 0x6d, 0xf2,
- 0x4a, 0x55, 0x77, 0x96, 0xc7, 0x5b, 0x01, 0xfb, 0x2c, 0xb1, 0x90, 0xd0,
- 0x49, 0x17, 0x08, 0xd3, 0x33, 0xb1, 0xbb, 0xea, 0x8d, 0xcd, 0x4e, 0x32,
- 0x62, 0x1e, 0x32, 0xa9, 0xb9, 0xdb, 0x4d, 0xb8, 0x8f, 0x24, 0xb7, 0x7b,
- 0x6b, 0xc0, 0x00, 0x60, 0x41, 0x44, 0x0b, 0xe7, 0x6b, 0xa9, 0x1d, 0xac,
- 0x32, 0x82, 0x5c, 0x63, 0xb5, 0x4f, 0xda, 0x66, 0xdd, 0x0f, 0x1b, 0x87,
- 0x2d, 0xa8, 0xa6, 0x2b, 0x29, 0x22, 0xe5, 0x7f, 0x93, 0x28, 0x6e, 0xe5,
- 0xcf, 0x1e, 0x3e, 0x8e, 0x6c, 0x1c, 0x04, 0xf6, 0xcf, 0xdc, 0x38, 0xa7,
- 0x1c, 0xb1, 0xff, 0x0e, 0x06, 0xaf, 0x2d, 0x75, 0x8b, 0x64, 0x6a, 0x6b,
- 0x5b, 0xe7, 0x9f, 0xbc, 0x16, 0xda, 0xed, 0xd1, 0x26, 0xf0, 0x49, 0xf7,
- 0xd6, 0xcf, 0x5c, 0xcb, 0xc0, 0x75, 0x3e, 0x21, 0xe9, 0xb1, 0x94, 0xc6,
- 0x6e, 0xf0, 0x33, 0x20, 0xa0, 0xd9, 0x05, 0x86, 0xc9, 0x56, 0x19, 0x16,
- 0xef, 0xe7, 0x2d, 0x78, 0xc4, 0x6d, 0x6d, 0x54, 0xb2, 0x15, 0xb5, 0x20,
- 0xd2, 0x08, 0xd1, 0x7c, 0x45, 0x88, 0x1f, 0x75, 0xd4, 0xcf, 0x22, 0x66,
- 0x3e, 0xfb, 0x11, 0xb0, 0x99, 0xea, 0x92, 0x1d, 0x88, 0x18, 0x93, 0xd7,
- 0x75, 0x8f, 0x95, 0x67, 0x05, 0x4a, 0xe3, 0x75, 0xba, 0x20, 0x73, 0x1d,
- 0x63, 0xd8, 0xc3, 0x2a, 0x5d, 0x65, 0x3d, 0x0f, 0x5e, 0xf6, 0x88, 0x7f,
- 0x7f, 0x1e, 0x85, 0x7d, 0x9f, 0x13, 0x1e, 0x55, 0x99, 0xfd, 0xf6, 0xfd,
- 0x9b, 0xbf, 0xa8, 0xdd, 0xbd, 0x3b, 0xe8, 0xb1, 0x84, 0x3b, 0xd3, 0x9d,
- 0x64, 0x5e, 0x22, 0xa0, 0x40, 0x40, 0xb4, 0x76, 0x9d, 0xff, 0xe5, 0xb2,
- 0x2c, 0x83, 0xa0, 0x02, 0x92, 0x3e, 0x76, 0x28, 0xcc, 0x66, 0x9e, 0x1b,
- 0x8b, 0x49, 0x77, 0x34, 0x7a, 0x0c, 0x7f, 0xc8, 0x9b, 0x57, 0x8f, 0x8f,
- 0x0e, 0x0f, 0x8c, 0xd5, 0xba, 0xd3, 0xe1, 0x16, 0xbb, 0x9f, 0x3d, 0x68,
- 0xb7, 0xed, 0x79, 0x67, 0xb7, 0x2b, 0xa2, 0xbd, 0x9d, 0xe3, 0xef, 0xcf,
- 0xdf, 0x05, 0x6b, 0x34, 0x6b, 0x0a, 0x02, 0xa9, 0x7d, 0x6b, 0x74, 0xba,
- 0x40, 0x6b, 0x7c, 0xcd, 0x3f, 0x46, 0xc3, 0xea, 0x48, 0xa8, 0xf2, 0x4d,
- 0x95, 0x93, 0x8e, 0xbb, 0x45, 0x5b, 0xb2, 0x75, 0x5a, 0x16, 0x33, 0x23,
- 0xfa, 0xcf, 0x08, 0xa2, 0x2f, 0xdb, 0x32, 0xba, 0xfa, 0xbd, 0xab, 0xeb,
- 0xbf, 0x26, 0x6f, 0x07, 0xb8, 0x2a, 0x45, 0x98, 0xe1, 0xf2, 0x16, 0x3f,
- 0x04, 0x22, 0x32, 0x81, 0x9b, 0x70, 0x8d, 0xc9, 0xfa, 0x32, 0x63, 0xf7,
- 0x2e, 0x99, 0x66, 0xed, 0xdb, 0x76, 0x8b, 0x86, 0x44, 0xf0, 0xf8, 0xbc,
- 0x80, 0x43, 0xbb, 0x2f, 0x16, 0xc2, 0xdc, 0x52, 0xa3, 0x21, 0xec, 0x23,
- 0xda, 0x51, 0xb7, 0xfe, 0xae, 0xd7, 0xd1, 0x1d, 0xe0, 0x9d, 0x1c, 0xeb,
- 0x20, 0xbd, 0x2d, 0xc2, 0x73, 0xf1, 0x98, 0xb3, 0x2b, 0xf2, 0x76, 0x4a,
- 0x3c, 0x6e, 0x22, 0xc0, 0x20, 0x06, 0x6d, 0xec, 0xc2, 0x98, 0x0f, 0x1c,
- 0x19, 0x04, 0xe8, 0xb8, 0x97, 0x16, 0x6d, 0x9c, 0x57, 0x02, 0x33, 0x60,
- 0xeb, 0x27, 0xbb, 0x45, 0x13, 0x55, 0xa3, 0x22, 0x3e, 0x39, 0x0a, 0xe5,
- 0x91, 0x2c, 0x45, 0xe0, 0x5d, 0xc4, 0xcd, 0x64, 0xa1, 0xa8, 0xdf, 0x38,
- 0xb5, 0x77, 0x10, 0x8d, 0x43, 0xc4, 0x42, 0x52, 0x1c, 0x95, 0x10, 0xeb,
- 0xac, 0x13, 0x97, 0xf0, 0xe3, 0x10, 0xb8, 0x29, 0x14, 0x89, 0x90, 0x28,
- 0x43, 0x68, 0xa8, 0x78, 0x91, 0x89, 0xfe, 0xd0, 0xc4, 0x86, 0x60, 0x44,
- 0xd7, 0x04, 0xb5, 0xa1, 0x89, 0x16, 0xf1, 0x3d, 0xfe, 0x3c, 0x42, 0x7c,
- 0xef, 0xce, 0x2e, 0x8e, 0x9f, 0x0b, 0xc4, 0x97, 0x62, 0xe1, 0xa8, 0x99,
- 0xc0, 0x89, 0x69, 0xdc, 0xc8, 0x9d, 0x6b, 0x0e, 0x49, 0xc8, 0xea, 0xa9,
- 0x0f, 0x62, 0x57, 0x1e, 0x39, 0xe2, 0x74, 0x4d, 0xd8, 0xcb, 0xdb, 0xf4,
- 0x22, 0xe4, 0xa2, 0xd4, 0x5f, 0x2c, 0x03, 0xa6, 0x27, 0x3a, 0xff, 0x10,
- 0x19, 0x05, 0xf0, 0x19, 0x40, 0xa4, 0x60, 0x79, 0x1b, 0x90, 0x10, 0x8b,
- 0x32, 0x36, 0xb8, 0x6c, 0xc2, 0xe2, 0x94, 0xfa, 0xa9, 0x86, 0x4d, 0x40,
- 0x11, 0xa1, 0x7b, 0x23, 0x8d, 0xe4, 0x61, 0x8f, 0x58, 0x98, 0xcd, 0x4d,
- 0x22, 0xce, 0x05, 0x12, 0xbb, 0x97, 0x4a, 0x8c, 0x33, 0xf2, 0x02, 0xfe,
- 0xa9, 0x17, 0xe6, 0xaa, 0xf1, 0xee, 0x93, 0xd2, 0x89, 0xb9, 0x47, 0x6a,
- 0xa5, 0x91, 0x55, 0x69, 0xcd, 0x14, 0xc1, 0xb0, 0x09, 0xc3, 0xd7, 0x60,
- 0x81, 0x6d, 0xb7, 0x88, 0x6a, 0x69, 0x03, 0xab, 0xae, 0x21, 0x71, 0x27,
- 0x43, 0x59, 0x16, 0x1b, 0xe0, 0xd0, 0x16, 0x7a, 0x90, 0x58, 0x7d, 0x8c,
- 0x01, 0x51, 0xaa, 0x49, 0xf4, 0x4d, 0x8d, 0xe0, 0xf6, 0x2b, 0x10, 0xa0,
- 0xf3, 0xc1, 0x9a, 0xcd, 0x19, 0xe8, 0xc1, 0x7c, 0xe4, 0xf1, 0x7e, 0x8f,
- 0x2d, 0xcb, 0x2a, 0xef, 0x38, 0x6b, 0x0b, 0x5a, 0xf3, 0xc6, 0xf0, 0xc0,
- 0x3a, 0x61, 0x73, 0x14, 0xb7, 0x0b, 0x9a, 0xdb, 0xaf, 0x17, 0x62, 0x5a,
- 0x0e, 0xe4, 0x8c, 0x36, 0xe6, 0x31, 0xbe, 0xd5, 0xb0, 0x2f, 0x3d, 0x94,
- 0x17, 0x9a, 0xa2, 0xc6, 0x9a, 0x12, 0x47, 0xf1, 0x14, 0xb4, 0xd6, 0xdc,
- 0xcc, 0x92, 0xa2, 0xe7, 0x2e, 0xf8, 0x1d, 0x1a, 0x73, 0xe4, 0xa4, 0x18,
- 0x25, 0x89, 0x8f, 0x40, 0xa6, 0x25, 0x47, 0x72, 0x30, 0xb4, 0xeb, 0xf0,
- 0xb7, 0x4d, 0xa8, 0x7e, 0x3f, 0xf9, 0x5b, 0x39, 0x11, 0x27, 0x0c, 0x59,
- 0x8e, 0x31, 0x24, 0x9f, 0x39, 0xf2, 0xe7, 0xd7, 0x86, 0xca, 0x66, 0x6b,
- 0xf6, 0xab, 0xd2, 0x84, 0x24, 0x13, 0x9b, 0x5b, 0x3f, 0x53, 0xc0, 0x23,
- 0xb9, 0x04, 0x8e, 0x26, 0xa7, 0x82, 0x6a, 0x21, 0x7a, 0x58, 0xed, 0x7c,
- 0xd8, 0x45, 0x6b, 0x49, 0xa7, 0xe4, 0x0d, 0x31, 0x83, 0x0b, 0x38, 0x02,
- 0x03, 0xee, 0xb9, 0x84, 0xf5, 0x74, 0xda, 0xac, 0x65, 0xe3, 0xbb, 0xb3,
- 0x2b, 0xd5, 0x4b, 0x6a, 0xde, 0x05, 0x0c, 0x3c, 0xb2, 0x90, 0xa6, 0x86,
- 0xf2, 0xd2, 0xe9, 0x9d, 0xea, 0x0b, 0x4e, 0xb8, 0x0a, 0xa0, 0xa3, 0x03,
- 0x8d, 0x0f, 0x6b, 0x3c, 0x75, 0x12, 0x14, 0xed, 0xcc, 0xeb, 0x9e, 0x6e,
- 0x2d, 0xbf, 0xa8, 0x9d, 0xe2, 0xf7, 0xdc, 0x62, 0xa7, 0xb3, 0x02, 0x4f,
- 0xb6, 0xae, 0x7a, 0xd6, 0xa4, 0xb4, 0xcb, 0x1b, 0x8b, 0xd1, 0x9d, 0x4b,
- 0xc0, 0x56, 0xd6, 0x20, 0x32, 0x88, 0x7a, 0x46, 0xaa, 0xb1, 0x41, 0x1c,
- 0x5c, 0x1b, 0x4e, 0x9d, 0x84, 0x7a, 0xc4, 0x5b, 0xf9, 0x0a, 0xf3, 0xc3,
- 0x1d, 0x30, 0x2b, 0x57, 0x51, 0x4a, 0xc3, 0x3c, 0xe2, 0x8c, 0xb1, 0xe4,
- 0xf1, 0xe7, 0x8f, 0x1f, 0xed, 0x6a, 0xf3, 0x62, 0xcd, 0x42, 0xdc, 0x8d,
- 0x75, 0x00, 0xc4, 0x8d, 0x93, 0x9e, 0x0a, 0xd0, 0x6b, 0x72, 0xea, 0x91,
- 0xc9, 0x68, 0x1d, 0xe2, 0xd8, 0xcc, 0xb9, 0x69, 0x16, 0xb9, 0xd8, 0xd1,
- 0x7e, 0x8e, 0x99, 0x72, 0x90, 0x3f, 0x40, 0x1f, 0xcb, 0xf8, 0xe5, 0x1d,
- 0x70, 0xf8, 0xb4, 0x76, 0xcc, 0xdb, 0x55, 0x06, 0x31, 0xb4, 0x3f, 0x94,
- 0x34, 0x4d, 0x7d, 0xdb, 0x45, 0xf9, 0x7a, 0xb4, 0xac, 0x9c, 0xd3, 0xcf,
- 0xa1, 0xa9, 0x8a, 0xea, 0x71, 0x45, 0x1d, 0xd9, 0x4b, 0x4f, 0x2e, 0xb0,
- 0x6f, 0x84, 0x6b, 0xbb, 0x58, 0xf0, 0xc4, 0x80, 0xaa, 0x81, 0x33, 0x51,
- 0x73, 0x86, 0x54, 0x7b, 0x1f, 0x19, 0xfa, 0x14, 0xe0, 0x0b, 0xf2, 0xbe,
- 0x24, 0x48, 0xc9, 0x99, 0x30, 0xe2, 0x6e, 0x20, 0x90, 0x97, 0xda, 0x1d,
- 0x8a, 0x55, 0x8f, 0xb2, 0x72, 0xa5, 0xb9, 0x1c, 0xa4, 0x61, 0x71, 0x89,
- 0x7c, 0xe1, 0x3e, 0xe0, 0x1d, 0x75, 0x83, 0xa4, 0x8a, 0x11, 0xd2, 0x9a,
- 0x59, 0x6f, 0x7d, 0x8b, 0x52, 0x9b, 0x42, 0xf1, 0x74, 0xcb, 0x5a, 0xf4,
- 0xef, 0x96, 0x2a, 0xc3, 0x8a, 0x36, 0xfe, 0x6a, 0x67, 0x23, 0x7a, 0x66,
- 0x0f, 0x4b, 0x8a, 0x71, 0xf3, 0xe0, 0x4b, 0x09, 0x9b, 0xc3, 0x2e, 0x92,
- 0x1d, 0x4c, 0x78, 0x6f, 0x6f, 0xf7, 0xfe, 0x49, 0xcb, 0x93, 0xf7, 0x4d,
- 0xf2, 0x9c, 0x1d, 0x1b, 0x5e, 0x3b, 0x89, 0xb9, 0x37, 0x07, 0xfa, 0xa6,
- 0x07, 0x97, 0x31, 0x60, 0x8a, 0x84, 0x83, 0xb9, 0x20, 0xcc, 0xd3, 0xf4,
- 0x2e, 0x74, 0xe2, 0x6b, 0x56, 0x1a, 0x2f, 0xb0, 0xbd, 0x76, 0xad, 0x47,
- 0x06, 0x9c, 0x9f, 0xb0, 0x10, 0x4a, 0x8d, 0x02, 0xbe, 0xda, 0x4b, 0x43,
- 0x84, 0xa1, 0xbe, 0xe9, 0xa6, 0xe5, 0x2d, 0x0e, 0x26, 0x6e, 0x3e, 0x48,
- 0x3c, 0x37, 0x3b, 0xdf, 0x42, 0xf5, 0x41, 0xb0, 0x3b, 0x3e, 0x52, 0x1b,
- 0xa1, 0x4f, 0xdb, 0x0c, 0x4b, 0xee, 0xa4, 0x3e, 0x0a, 0x10, 0x91, 0xf9,
- 0x49, 0xd7, 0xcd, 0x3b, 0xd2, 0x4b, 0xc1, 0x77, 0x91, 0xca, 0x80, 0x86,
- 0xa3, 0x7e, 0x72, 0x6b, 0x66, 0x3c, 0x62, 0xee, 0xd8, 0x2e, 0x0d, 0xf9,
- 0x74, 0x30, 0x9a, 0x6e, 0xc0, 0x78, 0x31, 0x37, 0x4b, 0xdf, 0xd8, 0x31,
- 0x06, 0xe3, 0x99, 0xf0, 0x4f, 0x5b, 0x9b, 0x39, 0xe0, 0x3b, 0x0a, 0x18,
- 0x9c, 0x98, 0xae, 0x8e, 0xae, 0x89, 0x21, 0x92, 0x83, 0xdd, 0xc3, 0x8d,
- 0x29, 0x78, 0x36, 0x07, 0x0f, 0x7e, 0x5e, 0xc9, 0xc2, 0x0b, 0xe5, 0xac,
- 0xfa, 0xda, 0x74, 0xd0, 0xb6, 0xaf, 0xe1, 0x69, 0xdb, 0xd7, 0x60, 0x41,
- 0x29, 0xe2, 0x1a, 0x1a, 0x27, 0x5f, 0xd6, 0xc9, 0x3b, 0x7d, 0x2c, 0xd9,
- 0x19, 0x9f, 0xbf, 0x3b, 0xfe, 0xea, 0x6c, 0xf7, 0x3e, 0x1f, 0x65, 0x9b,
- 0xff, 0xdb, 0x75, 0xa5, 0x9a, 0x25, 0x2c, 0xd3, 0x87, 0x75, 0xf2, 0xd5,
- 0x78, 0x3c, 0x7c, 0x79, 0x7e, 0x82, 0x2e, 0x97, 0x63, 0xf3, 0x67, 0x0f,
- 0x16, 0xfb, 0x08, 0xad, 0x00, 0x86, 0xdf, 0x4a, 0xed, 0x68, 0xad, 0x49,
- 0x82, 0xf0, 0x00, 0xd2, 0x61, 0x0a, 0x7a, 0x22, 0xef, 0x91, 0x85, 0xf6,
- 0xc0, 0xf0, 0x5d, 0x93, 0xe7, 0xfc, 0x64, 0x0f, 0x9f, 0xa2, 0x4f, 0x62,
- 0x41, 0x3d, 0xee, 0x83, 0x75, 0xd8, 0xe0, 0x92, 0x34, 0x1f, 0xa4, 0x98,
- 0x82, 0x41, 0x6b, 0x32, 0xb8, 0xb1, 0xfc, 0x48, 0x9c, 0xb8, 0x80, 0x5d,
- 0xbc, 0xf4, 0x86, 0x5c, 0x61, 0x54, 0x5b, 0xa1, 0xa0, 0xa9, 0x1d, 0xd7,
- 0x1b, 0x4c, 0x34, 0x86, 0xc6, 0x5b, 0x10, 0xfc, 0xc8, 0x58, 0xa3, 0xab,
- 0x5d, 0xa7, 0xc8, 0xf6, 0x70, 0x9d, 0x24, 0xcf, 0xb7, 0xa5, 0x71, 0x7c,
- 0x51, 0xae, 0x2f, 0xaf, 0xd8, 0xc0, 0x6a, 0xfb, 0x21, 0xc0, 0xcb, 0x35,
- 0xfa, 0x6a, 0x7b, 0x37, 0x98, 0x49, 0x06, 0x24, 0x88, 0x77, 0x54, 0xef,
- 0xa9, 0x32, 0x0a, 0x0e, 0xb1, 0x7a, 0xc3, 0x49, 0x17, 0xb3, 0xdf, 0x04,
- 0x03, 0x7d, 0x83, 0x06, 0x32, 0xe1, 0xc0, 0x29, 0xdc, 0x68, 0x45, 0xb3,
- 0x58, 0xca, 0x5f, 0xd3, 0xe2, 0x0e, 0xee, 0x52, 0xf1, 0xdf, 0xa3, 0xfe,
- 0xd3, 0xd2, 0x74, 0x9b, 0xd0, 0x9b, 0x6a, 0x0a, 0x43, 0x9f, 0x53, 0x50,
- 0xb9, 0xf0, 0x73, 0x13, 0xcd, 0xa2, 0xa7, 0xfd, 0xd2, 0x88, 0x69, 0x98,
- 0x76, 0xc3, 0x62, 0xa0, 0xa3, 0x0c, 0x8c, 0x39, 0x2c, 0x61, 0x32, 0x51,
- 0x84, 0x85, 0x08, 0x22, 0xac, 0x08, 0x2d, 0x20, 0x77, 0xd2, 0x49, 0x5d,
- 0x2e, 0xd6, 0x0d, 0x74, 0x01, 0x72, 0x8a, 0x52, 0x71, 0xcd, 0x2e, 0x48,
- 0x57, 0xc2, 0x97, 0x66, 0xd4, 0xc4, 0x4b, 0x40, 0x4d, 0x62, 0x75, 0x00,
- 0xae, 0x3d, 0xe9, 0xc8, 0x85, 0x00, 0x38, 0x8a, 0x28, 0xfe, 0x09, 0xda,
- 0x59, 0x1e, 0x0b, 0x43, 0xad, 0x90, 0x96, 0x74, 0xad, 0x60, 0x6f, 0xe1,
- 0xf9, 0xe9, 0x59, 0xb5, 0x76, 0x47, 0xbd, 0xeb, 0xc4, 0xba, 0x5b, 0x89,
- 0xea, 0x4e, 0x6b, 0x8c, 0x71, 0xb6, 0xde, 0x4c, 0x65, 0xcd, 0x16, 0x98,
- 0xd0, 0x2d, 0x99, 0xdc, 0xd9, 0x8f, 0xf1, 0x77, 0x52, 0xe4, 0xf2, 0x58,
- 0x45, 0xf8, 0xa1, 0xd0, 0x4a, 0xee, 0x30, 0x46, 0x9b, 0x92, 0x51, 0xda,
- 0x5f, 0xea, 0x0c, 0xfd, 0x6d, 0xc6, 0x79, 0x67, 0x7c, 0xc4, 0x38, 0x8d,
- 0xd6, 0x21, 0xb3, 0x96, 0xdf, 0x6d, 0x6a, 0x47, 0x1b, 0x31, 0xc2, 0x13,
- 0x01, 0x01, 0x53, 0x28, 0xdd, 0xae, 0x4a, 0xd5, 0x23, 0xf2, 0xb7, 0xa5,
- 0xdc, 0x4e, 0x93, 0x5f, 0xf6, 0xbe, 0x61, 0x4b, 0x81, 0xca, 0xcd, 0x1d,
- 0x6f, 0xdd, 0xe9, 0x8c, 0x1e, 0xb0, 0x21, 0x6e, 0xfd, 0xee, 0x87, 0x81,
- 0x65, 0x67, 0xe3, 0xc5, 0x35, 0x20, 0x29, 0xed, 0xa2, 0x0c, 0xe7, 0xff,
- 0x28, 0x7f, 0xa1, 0x3b, 0xf0, 0x5d, 0x5e, 0x18, 0xcd, 0xb0, 0xde, 0x55,
- 0xe2, 0xcc, 0x8b, 0x18, 0x8c, 0x02, 0xf1, 0x8e, 0xed, 0xda, 0x58, 0x62,
- 0x86, 0xe3, 0xb8, 0x44, 0x3d, 0x52, 0x9c, 0x39, 0x60, 0x13, 0xb0, 0x22,
- 0xaf, 0xb1, 0xe9, 0xdd, 0x2a, 0xa8, 0x9f, 0x99, 0x5a, 0xa6, 0x83, 0x31,
- 0x00, 0x5e, 0x6c, 0xcc, 0x82, 0x22, 0xbf, 0x1d, 0xd9, 0xe0, 0xbe, 0x45,
- 0x5f, 0xf3, 0x83, 0x9b, 0x86, 0x11, 0x46, 0x7a, 0xda, 0x83, 0xb3, 0x75,
- 0x43, 0x58, 0xb4, 0xbb, 0x58, 0xe7, 0xce, 0xe3, 0xdd, 0x64, 0xde, 0xac,
- 0x76, 0x0e, 0x76, 0x19, 0xc3, 0x5e, 0x7a, 0xa9, 0x97, 0x4e, 0xdc, 0x87,
- 0x5e, 0x1c, 0xca, 0x2d, 0x4c, 0x5e, 0xd9, 0xcf, 0x22, 0xb8, 0x49, 0x70,
- 0x6e, 0xa8, 0xe2, 0x9b, 0xcb, 0x0d, 0xe6, 0x0d, 0xb3, 0x0d, 0x98, 0x91,
- 0xc6, 0x1c, 0xd9, 0x3b, 0xae, 0xc5, 0x5f, 0x11, 0xb2, 0x2b, 0x2a, 0x1b,
- 0x8d, 0x05, 0xe1, 0xba, 0xe0, 0x4a, 0x2f, 0x30, 0x29, 0x7d, 0x36, 0x3b,
- 0xb7, 0x98, 0x0d, 0x89, 0x87, 0x5c, 0x56, 0xa5, 0x11, 0x91, 0x55, 0x04,
- 0xff, 0x52, 0x6c, 0x8a, 0x0b, 0x54, 0xdf, 0x5c, 0xe7, 0x55, 0x59, 0x00,
- 0x62, 0xf4, 0x3a, 0xad, 0x72, 0x84, 0xf9, 0xb7, 0xbe, 0x3e, 0x7b, 0x7b,
- 0xbc, 0xe5, 0x3b, 0x45, 0xe6, 0xb9, 0xf8, 0xd1, 0x71, 0x7e, 0x5d, 0x2f,
- 0xb5, 0x9e, 0x66, 0xcc, 0x69, 0x68, 0x44, 0xfa, 0x94, 0xd5, 0x3e, 0x00,
- 0x31, 0x00, 0x2a, 0x2e, 0xb3, 0x11, 0x72, 0xa3, 0x4a, 0x4a, 0x12, 0x80,
- 0xf4, 0x55, 0x54, 0x0a, 0x43, 0x12, 0x50, 0xac, 0xfb, 0x8d, 0x9a, 0x86,
- 0xe8, 0x80, 0x53, 0xfa, 0x9d, 0xfd, 0x12, 0xaf, 0xfb, 0x1f, 0xa9, 0xf9,
- 0xda, 0x16, 0xc5, 0xb9, 0xd8, 0xbb, 0xe2, 0x71, 0x79, 0x47, 0x96, 0xcd,
- 0x76, 0x5b, 0x00, 0x6e, 0xd7, 0x64, 0x8c, 0x37, 0xdb, 0xba, 0xbd, 0x48,
- 0x17, 0x75, 0x3c, 0x3e, 0xec, 0xb8, 0xdc, 0xf3, 0x75, 0xa6, 0x6a, 0xfe,
- 0x84, 0x1b, 0x9d, 0x07, 0x77, 0xb7, 0xef, 0x39, 0xdf, 0xbe, 0xdb, 0xe6,
- 0x5e, 0x7c, 0xa4, 0xd4, 0x15, 0x88, 0xb5, 0x9b, 0x35, 0xb7, 0xa3, 0xf4,
- 0xd4, 0x63, 0x22, 0xf4, 0x2a, 0x9a, 0xcf, 0x97, 0x53, 0x86, 0x15, 0xb3,
- 0x71, 0xd5, 0x0e, 0xe0, 0xb3, 0x6a, 0x49, 0x85, 0xd7, 0xb6, 0x15, 0xa3,
- 0xf5, 0x02, 0x8e, 0x1a, 0xc1, 0x8d, 0x34, 0x2a, 0xc5, 0x5d, 0xcc, 0x2b,
- 0xc2, 0xf0, 0x71, 0x51, 0x64, 0xf9, 0xd2, 0xc0, 0xaf, 0xa6, 0xee, 0x83,
- 0x20, 0x76, 0xc9, 0x28, 0x56, 0x2f, 0x61, 0x0c, 0x5e, 0x46, 0x71, 0xb5,
- 0xf8, 0x6f, 0x8a, 0x64, 0x1b, 0xea, 0xc7, 0x76, 0x27, 0xd5, 0xb1, 0x8d,
- 0x8a, 0x25, 0xf3, 0x37, 0x36, 0x67, 0x6c, 0xc4, 0x9f, 0x51, 0x3a, 0xa0,
- 0x70, 0x50, 0xfb, 0x91, 0x14, 0x59, 0x36, 0x59, 0x1c, 0xb4, 0xcd, 0xde,
- 0x47, 0xb3, 0x34, 0x69, 0xa4, 0x50, 0xaf, 0xab, 0x6b, 0x54, 0xbd, 0x4a,
- 0xff, 0x2d, 0x4e, 0x0d, 0x76, 0xe7, 0x21, 0xe7, 0x10, 0x91, 0xf2, 0xde,
- 0x0c, 0x29, 0x6d, 0xb3, 0x12, 0x64, 0xac, 0xe4, 0x2b, 0x9e, 0x85, 0x9d,
- 0xa0, 0xb5, 0x74, 0x08, 0x00, 0x85, 0xb5, 0xd8, 0x20, 0x49, 0xbf, 0xac,
- 0x81, 0x9b, 0xdb, 0x54, 0xe9, 0xd4, 0xfd, 0x65, 0x98, 0xd6, 0xd3, 0x3c,
- 0xd7, 0x7e, 0x4e, 0x14, 0x1f, 0xcc, 0x28, 0x1d, 0x36, 0x8a, 0x8f, 0xe3,
- 0xce, 0xc3, 0x76, 0x52, 0x99, 0x95, 0xec, 0xde, 0xe5, 0x9c, 0x93, 0x94,
- 0x5b, 0xfd, 0x51, 0x06, 0x0b, 0x4a, 0xe3, 0x24, 0x78, 0x18, 0x6b, 0x71,
- 0xa5, 0x95, 0x36, 0x3d, 0xa6, 0xad, 0xb1, 0xbe, 0x0f, 0x7c, 0xf3, 0x5b,
- 0x37, 0x61, 0x48, 0x28, 0x55, 0x75, 0xc3, 0xa6, 0xe4, 0xcd, 0xcd, 0xa1,
- 0xff, 0xcc, 0xa6, 0x68, 0x78, 0x07, 0x14, 0xa9, 0x28, 0x87, 0xe9, 0x62,
- 0x15, 0x4d, 0x71, 0x1b, 0xef, 0xb6, 0x1a, 0x5e, 0xbe, 0x3c, 0x3d, 0x7f,
- 0x07, 0xbc, 0x3c, 0x42, 0x4e, 0x2f, 0x6a, 0xce, 0x52, 0xa0, 0x9f, 0x51,
- 0x02, 0x7b, 0xc1, 0xb0, 0x92, 0x48, 0x1a, 0x99, 0x85, 0xe5, 0xd5, 0x68,
- 0x0e, 0x01, 0xf3, 0x21, 0x66, 0x5f, 0x71, 0x7a, 0x5b, 0x91, 0x78, 0x05,
- 0x8e, 0xcc, 0xe0, 0xd5, 0xbe, 0xe8, 0x2e, 0xc7, 0x7c, 0xd5, 0x7d, 0x5b,
- 0xbb, 0x2c, 0xd8, 0x42, 0xa4, 0xf6, 0xbb, 0x16, 0x30, 0xb0, 0x4c, 0x04,
- 0x1e, 0x30, 0xe0, 0xe7, 0x4d, 0x66, 0xb1, 0x09, 0xc5, 0xae, 0xb3, 0x58,
- 0xa8, 0xda, 0xc1, 0x8a, 0x93, 0x34, 0x00, 0x5c, 0xa1, 0xf5, 0xf1, 0xf5,
- 0x66, 0x44, 0x03, 0xb3, 0xb1, 0xc5, 0xaa, 0xe8, 0xe2, 0x6d, 0xc9, 0x76,
- 0x47, 0x8d, 0xd0, 0x00, 0xfc, 0x6d, 0x63, 0x5d, 0x98, 0x4e, 0x95, 0x1a,
- 0x67, 0x6d, 0x38, 0xe0, 0x77, 0x03, 0xfe, 0xea, 0x64, 0x4d, 0x1c, 0xa2,
- 0xf3, 0x05, 0x39, 0x5e, 0x56, 0x9a, 0xf8, 0x09, 0xfa, 0x9e, 0xb8, 0xbf,
- 0x18, 0x49, 0x89, 0x6a, 0x38, 0xb3, 0x74, 0x69, 0xd4, 0x82, 0x42, 0x0b,
- 0x05, 0xc8, 0xf3, 0x4b, 0xf9, 0x9c, 0xdd, 0x09, 0xaf, 0x53, 0xe1, 0x58,
- 0x0a, 0x67, 0x0f, 0x2e, 0xd0, 0xa9, 0x1f, 0xe0, 0xcf, 0x10, 0x27, 0xf5,
- 0x87, 0x8f, 0xd5, 0x84, 0xe1, 0x75, 0x8b, 0x7b, 0x20, 0x71, 0x1b, 0x6d,
- 0xfd, 0xc9, 0xc0, 0xe1, 0x3c, 0x84, 0xed, 0xfe, 0x4d, 0x9d, 0xab, 0xae,
- 0xd6, 0xc5, 0x27, 0x33, 0x85, 0xb0, 0x1c, 0x5a, 0x93, 0x7d, 0xa9, 0xf9,
- 0x05, 0xb7, 0xcc, 0xa5, 0xbf, 0x70, 0xff, 0x65, 0x3b, 0x02, 0x61, 0x96,
- 0x5f, 0x93, 0x23, 0x4f, 0x40, 0xbc, 0x3d, 0xe5, 0x34, 0x36, 0xbb, 0x99,
- 0xbd, 0x1f, 0x66, 0x56, 0x76, 0x03, 0xa3, 0xe9, 0xec, 0x7a, 0xd2, 0xae,
- 0xd9, 0xbc, 0xa1, 0x46, 0x4f, 0xa4, 0x48, 0x14, 0x5b, 0x01, 0xa4, 0x50,
- 0x91, 0xa4, 0xa9, 0x5e, 0x01, 0x3b, 0x5c, 0x83, 0xec, 0xc9, 0x64, 0xc3,
- 0x37, 0x81, 0xdd, 0xe2, 0x75, 0x9f, 0x8a, 0xcc, 0xa4, 0x5d, 0x9b, 0xdf,
- 0x47, 0x07, 0xac, 0xa4, 0xc0, 0x91, 0x65, 0x88, 0xc0, 0x95, 0xf2, 0x4b,
- 0x26, 0x8a, 0xd5, 0xd9, 0xa8, 0x2f, 0xac, 0xdf, 0x98, 0x32, 0xc2, 0xb7,
- 0x5c, 0x29, 0x57, 0x56, 0x58, 0x22, 0x5b, 0x46, 0x81, 0x67, 0x7f, 0xf5,
- 0x5d, 0x72, 0x0b, 0xf1, 0x36, 0xca, 0xfe, 0xb0, 0xb3, 0x49, 0xc5, 0x83,
- 0xb8, 0xe1, 0xbb, 0x90, 0x19, 0xbe, 0x6b, 0xf3, 0x42, 0xb7, 0xd2, 0xa0,
- 0x8e, 0x3a, 0x72, 0xa3, 0xef, 0xe5, 0x81, 0x34, 0x3c, 0x25, 0xd8, 0x9f,
- 0xbf, 0x0b, 0xab, 0xbc, 0xc5, 0xfd, 0x37, 0x41, 0x7d, 0xf6, 0x7d, 0x5c,
- 0xd0, 0x9a, 0xee, 0xf2, 0xb3, 0x1e, 0xd7, 0xd6, 0xcf, 0x67, 0x81, 0x6a,
- 0x51, 0x09, 0xab, 0x0b, 0x39, 0x60, 0x11, 0x30, 0x40, 0xa1, 0xbb, 0x5f,
- 0x87, 0x05, 0xd2, 0x27, 0x8d, 0x95, 0x7d, 0x49, 0x59, 0x29, 0xe4, 0x06,
- 0x0c, 0xd8, 0xe0, 0x99, 0xf5, 0x1b, 0x71, 0xad, 0x8d, 0xed, 0xb2, 0xa6,
- 0x6f, 0x25, 0x78, 0x4b, 0xd9, 0x8d, 0xe2, 0xe4, 0x2e, 0xd7, 0x88, 0xa6,
- 0x05, 0x29, 0x90, 0x8e, 0xf2, 0x53, 0x46, 0xf9, 0xa0, 0x3a, 0xf7, 0xb4,
- 0x2a, 0x38, 0x3f, 0x66, 0xe6, 0xe7, 0xe1, 0x19, 0x66, 0x6a, 0xaf, 0x16,
- 0x43, 0xce, 0x0d, 0xeb, 0xd0, 0x6f, 0x54, 0xe7, 0xa8, 0x87, 0x8d, 0x9a,
- 0xb0, 0xae, 0xa3, 0x9a, 0xd6, 0x0b, 0x6d, 0xb8, 0x37, 0xfe, 0xb5, 0x11,
- 0xef, 0x46, 0xff, 0xa5, 0x69, 0x6f, 0x19, 0xdf, 0x1c, 0x4b, 0xfe, 0x9d,
- 0x9d, 0x01, 0x4c, 0xc1, 0x03, 0xb1, 0xe8, 0x98, 0x20, 0xea, 0x81, 0x5d,
- 0x58, 0x1b, 0xb4, 0xf1, 0x69, 0x70, 0x76, 0x42, 0x6c, 0xf9, 0x2c, 0x8a,
- 0xbe, 0xa1, 0x97, 0x52, 0x1a, 0xfa, 0x4a, 0xac, 0x89, 0xae, 0x91, 0xc2,
- 0xfe, 0x9c, 0xbc, 0x36, 0x0b, 0x25, 0x2b, 0x83, 0xda, 0xbb, 0xff, 0x19,
- 0x0a, 0x4a, 0xec, 0x5a, 0xa2, 0x3b, 0x80, 0x8d, 0xc7, 0xc3, 0x37, 0x43,
- 0xd8, 0xa6, 0x3e, 0x26, 0x1b, 0x81, 0x34, 0x8e, 0x3c, 0x3e, 0xc5, 0xb9,
- 0x12, 0xd2, 0x3d, 0x28, 0xee, 0x4a, 0x22, 0x53, 0x00, 0x75, 0xd2, 0x57,
- 0x6b, 0x43, 0xa9, 0xa4, 0xa6, 0x70, 0xb7, 0x2f, 0xce, 0xab, 0x2d, 0xc9,
- 0x3c, 0x00, 0xbb, 0xa5, 0x09, 0x7b, 0x33, 0x0e, 0xa8, 0x80, 0x03, 0x10,
- 0x75, 0x66, 0x58, 0x28, 0xd7, 0x78, 0x4d, 0xaa, 0xf2, 0x53, 0xc6, 0xfc,
- 0x02, 0x46, 0x21, 0x50, 0xb3, 0x58, 0x07, 0x16, 0x3f, 0xba, 0x91, 0x50,
- 0xdc, 0xd0, 0x83, 0x72, 0x4d, 0x82, 0x80, 0x39, 0x77, 0x17, 0x15, 0xb8,
- 0x0d, 0x27, 0xc7, 0x72, 0xbc, 0x0e, 0xa0, 0x0b, 0xed, 0xc1, 0xc1, 0x57,
- 0x6d, 0x4a, 0x20, 0x7d, 0xbf, 0x21, 0xcf, 0xb6, 0xa7, 0xee, 0xf3, 0xec,
- 0xc8, 0x91, 0x3e, 0xbc, 0x69, 0xa8, 0xa1, 0x25, 0x38, 0x2f, 0x93, 0x17,
- 0xcc, 0x10, 0x6e, 0xef, 0x50, 0x02, 0xda, 0xf5, 0x50, 0xa2, 0xf9, 0xed,
- 0x50, 0xad, 0xc5, 0x99, 0xad, 0x1d, 0x9c, 0x4b, 0x4d, 0x0d, 0xd7, 0xa4,
- 0xcc, 0x1c, 0x74, 0xaf, 0xb4, 0xbf, 0x00, 0xd4, 0x48, 0x08, 0x86, 0x4b,
- 0x2e, 0x4e, 0xeb, 0x7a, 0xe3, 0xf2, 0x65, 0x98, 0x4f, 0x74, 0x3a, 0xc0,
- 0x5b, 0xca, 0x6b, 0x67, 0x1f, 0xfc, 0x57, 0xca, 0xe0, 0x36, 0xc6, 0x48,
- 0x43, 0x29, 0x7c, 0xfc, 0xa5, 0xc0, 0x5c, 0xe0, 0x46, 0x90, 0xb6, 0xc6,
- 0x87, 0x0b, 0xf4, 0x2d, 0x9e, 0x10, 0x41, 0xc7, 0xfb, 0x5a, 0x1d, 0x77,
- 0xe6, 0x48, 0x8e, 0xc9, 0xd2, 0x8c, 0x18, 0xf1, 0x8a, 0x9e, 0x82, 0x35,
- 0xe6, 0x82, 0xea, 0xcf, 0xd9, 0x76, 0xe2, 0x11, 0x49, 0x35, 0x8d, 0x4e,
- 0x71, 0x49, 0x2d, 0xcc, 0x61, 0xc4, 0xd3, 0x42, 0x33, 0x92, 0x64, 0x35,
- 0x6d, 0x56, 0xab, 0x3f, 0xb2, 0x3d, 0x20, 0x5b, 0xb9, 0x4e, 0xb0, 0x2e,
- 0x61, 0xd6, 0xdc, 0x44, 0xda, 0x38, 0x62, 0x36, 0x89, 0x7b, 0x68, 0xe0,
- 0xfd, 0xfd, 0xf9, 0xe7, 0xfb, 0x03, 0x31, 0x47, 0x29, 0x40, 0xe9, 0x3f,
- 0x03, 0x40, 0xe1, 0x88, 0x06, 0x48, 0xcf, 0x99, 0x9f, 0xda, 0x47, 0x7b,
- 0xd0, 0xf3, 0x29, 0x55, 0xe9, 0x88, 0xf2, 0x14, 0xda, 0xce, 0x6a, 0xe7,
- 0x09, 0x6c, 0x7a, 0x3c, 0x3f, 0x75, 0x2c, 0x53, 0x77, 0xe6, 0x29, 0x0d,
- 0x72, 0x18, 0x27, 0x12, 0xe1, 0xde, 0x46, 0xaf, 0xc8, 0xa8, 0x0f, 0x89,
- 0x5e, 0x8b, 0xf8, 0x9d, 0x38, 0xf9, 0x50, 0xc8, 0xcd, 0xf6, 0xf0, 0x44,
- 0x07, 0x33, 0x26, 0x6d, 0x9c, 0xa3, 0xb9, 0x30, 0x5b, 0x68, 0x40, 0xa4,
- 0x53, 0x36, 0x7b, 0xbf, 0xf1, 0x9e, 0x3c, 0x1b, 0x3d, 0x6a, 0xdd, 0x93,
- 0x66, 0xb1, 0x1c, 0xde, 0x4c, 0xee, 0x09, 0x57, 0x5d, 0x9c, 0xbe, 0x45,
- 0xba, 0x8e, 0xb2, 0x1b, 0x74, 0xd1, 0xd1, 0xc8, 0x01, 0xc9, 0x2a, 0x76,
- 0xef, 0x12, 0xba, 0x3a, 0x26, 0x12, 0xb1, 0xe9, 0x3b, 0x91, 0x19, 0x5b,
- 0xed, 0x2b, 0x8e, 0x1a, 0x01, 0x2b, 0x4c, 0x68, 0x44, 0x44, 0x20, 0xa8,
- 0x5a, 0x7f, 0x91, 0x47, 0x8b, 0xb2, 0x34, 0x2b, 0x3a, 0xbb, 0xcd, 0xa6,
- 0x6b, 0xa4, 0x16, 0x90, 0x62, 0x4f, 0xf8, 0x5f, 0x9b, 0x63, 0x1e, 0x5e,
- 0x9c, 0x43, 0x22, 0x1b, 0xe6, 0x07, 0xdd, 0xcd, 0x70, 0xad, 0xd4, 0x64,
- 0xf1, 0xbc, 0xfa, 0xc0, 0xe3, 0xc9, 0xe0, 0x04, 0xf8, 0x5d, 0xfb, 0x57,
- 0x41, 0x78, 0x1f, 0xb5, 0x18, 0xa4, 0xcc, 0x18, 0x7a, 0xca, 0x2f, 0x0b,
- 0x56, 0x17, 0xdf, 0xe6, 0xd3, 0xaa, 0xac, 0xcb, 0x39, 0x67, 0x19, 0x7a,
- 0xa6, 0xed, 0xc9, 0xc9, 0x38, 0xb9, 0xc9, 0x26, 0x5a, 0xce, 0x3c, 0x0a,
- 0xfd, 0xff, 0xcc, 0x45, 0x28, 0xaa, 0x55, 0xe5, 0x59, 0x43, 0xbb, 0xa6,
- 0x71, 0x6c, 0xc2, 0xf7, 0x42, 0x53, 0x41, 0x41, 0xbf, 0x81, 0xed, 0x45,
- 0x7d, 0x59, 0x17, 0x10, 0x4d, 0xab, 0xac, 0x8c, 0xe4, 0x32, 0xf0, 0x04,
- 0x54, 0xac, 0x30, 0x9d, 0x40, 0xff, 0x9a, 0xa4, 0xd2, 0xf1, 0x8e, 0xbd,
- 0x3a, 0x86, 0xed, 0x90, 0x76, 0x29, 0xde, 0xb0, 0x4f, 0xe4, 0xe6, 0x0c,
- 0xea, 0x8c, 0x26, 0x19, 0xf5, 0x88, 0x25, 0x76, 0xe0, 0xb7, 0x2d, 0x43,
- 0x87, 0xd6, 0x59, 0x59, 0x21, 0x7f, 0xcc, 0xeb, 0x46, 0x45, 0x6d, 0x5b,
- 0xd7, 0x15, 0xb9, 0xf9, 0x01, 0x3d, 0x1b, 0xf2, 0xd3, 0x9b, 0xab, 0x92,
- 0x7b, 0xf7, 0x61, 0x9b, 0x9d, 0xce, 0x86, 0xa2, 0x2c, 0xe9, 0x77, 0x02,
- 0xae, 0xe0, 0xe4, 0x8d, 0x7f, 0x50, 0x51, 0x98, 0x4a, 0x39, 0x0f, 0x57,
- 0x0e, 0x2c, 0xf9, 0x25, 0xaf, 0xf3, 0xcb, 0x9e, 0xd6, 0xc4, 0xec, 0xf2,
- 0x03, 0x34, 0x87, 0x53, 0x8c, 0x30, 0x23, 0x11, 0x9a, 0x15, 0xdf, 0xd2,
- 0xa0, 0xe1, 0x36, 0xfd, 0x2b, 0x74, 0x9e, 0xf7, 0x50, 0xdf, 0x6f, 0x1c,
- 0x06, 0xb4, 0xbe, 0x0b, 0x6f, 0x2e, 0xf6, 0x0a, 0x38, 0x8d, 0xdd, 0x53,
- 0xd9, 0x5d, 0xe4, 0x3c, 0x00, 0x0f, 0xb9, 0x4f, 0x5f, 0x8f, 0x07, 0x59,
- 0x34, 0x0a, 0x19, 0xc9, 0x25, 0xf2, 0x02, 0xe9, 0xf2, 0xef, 0x19, 0x8e,
- 0xa7, 0x1d, 0xa5, 0xf4, 0xaf, 0x6e, 0x49, 0x3f, 0x38, 0x1c, 0x4e, 0xb2,
- 0x94, 0xba, 0x63, 0xbd, 0x68, 0x48, 0x61, 0xda, 0x54, 0x55, 0x14, 0x29,
- 0x2b, 0xfa, 0x33, 0xbf, 0x7b, 0x01, 0x5d, 0x8b, 0x8e, 0xf6, 0xec, 0xe5,
- 0x87, 0x8b, 0xaf, 0x93, 0xc3, 0xd1, 0xfe, 0x83, 0xaa, 0x8a, 0xc0, 0x10,
- 0x5a, 0x63, 0xe8, 0xe1, 0xa1, 0xc9, 0x76, 0xf1, 0xb7, 0x75, 0xd1, 0x6e,
- 0xbe, 0x13, 0x8b, 0xab, 0x88, 0xfe, 0xa4, 0xe2, 0x97, 0xd2, 0xbc, 0xba,
- 0x99, 0xf1, 0x7e, 0x7b, 0xb6, 0xe1, 0x10, 0xe6, 0x77, 0x75, 0x5f, 0x08,
- 0xba, 0x8e, 0x42, 0xab, 0xb4, 0x26, 0x2b, 0xc0, 0x4f, 0x1a, 0xe8, 0x46,
- 0x23, 0x2c, 0xb2, 0x5c, 0xf8, 0x4e, 0xd9, 0xc6, 0xca, 0xd0, 0x63, 0xdf,
- 0xbf, 0x79, 0xd5, 0x19, 0xee, 0xc9, 0xd3, 0xc7, 0xfb, 0xbf, 0x62, 0x82,
- 0x65, 0x49, 0x16, 0x84, 0x98, 0x64, 0x51, 0xc4, 0xa3, 0xef, 0x2a, 0x2a,
- 0x39, 0x56, 0x1f, 0x51, 0x29, 0x0f, 0xf9, 0x90, 0x08, 0x75, 0x33, 0xa3,
- 0x4c, 0x3b, 0x8b, 0x98, 0x52, 0xa9, 0xb6, 0xff, 0x9f, 0xff, 0x0c, 0xcd,
- 0xba, 0xbf, 0xfe, 0x88, 0x50, 0x0e, 0xda, 0x91, 0xda, 0x0a, 0x0d, 0x65,
- 0x32, 0xb5, 0x13, 0xc7, 0x74, 0x9d, 0xb7, 0x7f, 0xb7, 0x9d, 0xd8, 0xa6,
- 0x61, 0x62, 0x98, 0xc7, 0x7b, 0x2e, 0x68, 0xb8, 0x4f, 0x67, 0xa7, 0xc7,
- 0x0a, 0x48, 0xf9, 0xd4, 0xd3, 0x08, 0x74, 0x17, 0xa4, 0x95, 0xd6, 0xac,
- 0xaf, 0xe9, 0x9f, 0x76, 0xbf, 0x12, 0xe8, 0x35, 0x0d, 0x71, 0x50, 0x28,
- 0x82, 0xf3, 0xe2, 0xb0, 0x02, 0xd2, 0x45, 0x51, 0x7a, 0x9e, 0x17, 0x3d,
- 0x7e, 0x67, 0x49, 0xfe, 0xfa, 0x4f, 0x73, 0x02, 0x83, 0xe6, 0xa6, 0xfc,
- 0x67, 0xdb, 0x07, 0x6d, 0x34, 0x0c, 0x9a, 0xef, 0xc7, 0xdf, 0x1d, 0x50,
- 0x35, 0xd7, 0x56, 0x77, 0x88, 0x12, 0xcd, 0x24, 0xec, 0xa9, 0x5a, 0x05,
- 0x69, 0x13, 0xb0, 0xb2, 0x7e, 0x90, 0x0a, 0xc5, 0x07, 0xa4, 0x35, 0xfe,
- 0x73, 0x44, 0xff, 0xfd, 0xeb, 0xc1, 0xf0, 0xf1, 0x8f, 0xf6, 0xa3, 0xbf,
- 0x3b, 0xf8, 0xf8, 0xbb, 0xc3, 0xad, 0x58, 0xb1, 0x9e, 0x83, 0x6d, 0xf0,
- 0x92, 0x4b, 0x49, 0xa1, 0x2d, 0xee, 0xa4, 0xc2, 0x46, 0x82, 0xc3, 0xae,
- 0x4d, 0x29, 0x9a, 0x9e, 0x47, 0xb0, 0xad, 0xc8, 0xe7, 0x38, 0xea, 0x3a,
- 0xfa, 0xb5, 0x55, 0xa9, 0x32, 0x87, 0x9b, 0x92, 0xdf, 0x57, 0x70, 0x0b,
- 0xba, 0x21, 0x52, 0xfb, 0x11, 0xf0, 0x42, 0x82, 0xd1, 0xf2, 0xc9, 0x83,
- 0x90, 0x6e, 0x14, 0x1e, 0x25, 0xdc, 0x0d, 0x49, 0x69, 0x33, 0xf2, 0x2c,
- 0x4d, 0x3a, 0x9b, 0x3e, 0x99, 0xd8, 0x9f, 0x14, 0x59, 0x50, 0x44, 0xa7,
- 0xe5, 0xb6, 0x6c, 0xbd, 0x29, 0x3b, 0x28, 0x5d, 0xba, 0x01, 0xe3, 0x7f,
- 0x65, 0x89, 0xac, 0xdc, 0x06, 0x4e, 0x71, 0xa5, 0x83, 0xac, 0xb1, 0xbf,
- 0x51, 0x02, 0x8e, 0xef, 0x9f, 0x61, 0xa9, 0x62, 0x06, 0xcc, 0x6b, 0x17,
- 0x3a, 0xc3, 0xcf, 0x24, 0x6c, 0x46, 0xf0, 0x0c, 0xe8, 0x93, 0x19, 0x2b,
- 0xae, 0x4e, 0x27, 0xd4, 0x45, 0xb4, 0xd5, 0x94, 0xcd, 0x76, 0xd8, 0x9a,
- 0x38, 0xa4, 0xb0, 0xb4, 0xee, 0xd9, 0x10, 0x7f, 0x2b, 0xbc, 0x4d, 0x90,
- 0x8d, 0xc2, 0xe6, 0x6c, 0x6e, 0xa0, 0x38, 0xa4, 0xbc, 0xdf, 0x26, 0x1b,
- 0x7a, 0xf5, 0xcc, 0xa8, 0x9f, 0xc6, 0x4f, 0xb5, 0xf8, 0x71, 0xca, 0x0d,
- 0xda, 0x10, 0x92, 0x1d, 0x06, 0x71, 0x64, 0x92, 0x50, 0xb3, 0x3b, 0xc3,
- 0x0d, 0x19, 0x95, 0x77, 0x64, 0xeb, 0x56, 0xd4, 0x45, 0x20, 0xdc, 0xc6,
- 0x90, 0xda, 0xf6, 0x70, 0x3b, 0xd9, 0xb1, 0x86, 0xdd, 0x2c, 0xad, 0xaf,
- 0x76, 0x63, 0x1e, 0x64, 0xe7, 0xb4, 0x75, 0x8c, 0x4a, 0xba, 0xaa, 0x40,
- 0x64, 0x32, 0x87, 0xea, 0x57, 0x60, 0xcf, 0x18, 0x0e, 0x85, 0xd2, 0x3b,
- 0x87, 0x36, 0x07, 0xa0, 0xf5, 0x93, 0x21, 0x99, 0x8a, 0x0c, 0xab, 0xfc,
- 0x1f, 0x88, 0x88, 0x85, 0x01, 0x49, 0x3c, 0xcb, 0x19, 0x7a, 0x43, 0x2e,
- 0x5e, 0x73, 0x42, 0x54, 0xfb, 0xb0, 0x53, 0x2e, 0x7b, 0x34, 0x7d, 0x2b,
- 0xad, 0x3f, 0x71, 0x94, 0x7b, 0x56, 0xda, 0xa6, 0xed, 0xce, 0x8f, 0x32,
- 0x10, 0x8e, 0x3a, 0xfc, 0xef, 0x03, 0x6f, 0xb0, 0x4d, 0xc8, 0xc9, 0x64,
- 0x5f, 0x56, 0xe5, 0xa2, 0x6e, 0xc1, 0xa2, 0x49, 0x15, 0x3b, 0xd1, 0xb4,
- 0xf5, 0xd0, 0xf0, 0x27, 0xeb, 0x9c, 0x98, 0x71, 0x5a, 0x44, 0xd2, 0xc3,
- 0xeb, 0x48, 0xf4, 0x8e, 0x64, 0x9c, 0x76, 0x2b, 0x37, 0x64, 0x1c, 0x91,
- 0x50, 0x6e, 0x6f, 0x5b, 0x53, 0xde, 0xd4, 0x5a, 0xa4, 0xf5, 0x60, 0x34,
- 0x0f, 0x84, 0x49, 0x58, 0x4a, 0xc8, 0x00, 0x46, 0xe0, 0xd6, 0xe1, 0x35,
- 0xbb, 0x27, 0xc2, 0xa1, 0x34, 0x87, 0xb4, 0xca, 0x66, 0x71, 0x88, 0x82,
- 0x2a, 0xbb, 0x24, 0x98, 0x1e, 0xd2, 0x3e, 0x08, 0xa9, 0xc0, 0xdc, 0xa5,
- 0xe2, 0x9e, 0xb6, 0xdb, 0x1d, 0x27, 0x08, 0xc5, 0xd2, 0x93, 0x17, 0xab,
- 0xab, 0xca, 0x68, 0xf2, 0x61, 0xcd, 0xe3, 0xf8, 0xeb, 0x84, 0x31, 0x6d,
- 0xcd, 0x53, 0xfc, 0x8c, 0xbd, 0xe9, 0x1e, 0xec, 0xe7, 0xaf, 0x88, 0x55,
- 0x49, 0xc9, 0x5c, 0xc3, 0xb4, 0x1e, 0x06, 0xd4, 0x71, 0xe1, 0x67, 0xb6,
- 0x93, 0x05, 0x41, 0x86, 0x25, 0x25, 0x11, 0x53, 0x6c, 0xbb, 0x20, 0x30,
- 0x24, 0x43, 0x1c, 0x7b, 0xa3, 0xd1, 0x1e, 0x09, 0x9f, 0x3d, 0xf3, 0x87,
- 0x95, 0xac, 0x9c, 0xf3, 0xde, 0xed, 0x20, 0x49, 0xa1, 0x79, 0xfa, 0x18,
- 0x40, 0x6b, 0xa4, 0xdf, 0xb2, 0xd7, 0x93, 0xef, 0xef, 0x6b, 0x24, 0x82,
- 0x57, 0xc6, 0x36, 0xa8, 0xb8, 0xa2, 0x7e, 0xe9, 0x69, 0x3c, 0x61, 0x42,
- 0xa8, 0x84, 0xb7, 0x6a, 0xc1, 0x6e, 0xe9, 0xf4, 0x22, 0x25, 0x13, 0x1d,
- 0x9e, 0x34, 0x5a, 0x44, 0xde, 0x28, 0x62, 0x1e, 0xb0, 0x0c, 0xd2, 0x8d,
- 0xb6, 0xf9, 0xa3, 0xc3, 0xce, 0xf1, 0xe5, 0xe6, 0xc0, 0x67, 0xc6, 0xce,
- 0x01, 0xd0, 0x2e, 0x65, 0xc2, 0x86, 0xb5, 0x74, 0xec, 0x18, 0xed, 0xb4,
- 0x87, 0x83, 0x97, 0x11, 0xdb, 0xe1, 0x34, 0x47, 0xb5, 0x97, 0x18, 0x69,
- 0x98, 0xb3, 0x69, 0x76, 0x02, 0xc5, 0x87, 0x3f, 0xb2, 0xcb, 0x6a, 0x9e,
- 0xe4, 0xca, 0x83, 0x20, 0x32, 0xdb, 0xf8, 0x46, 0xa0, 0x97, 0x52, 0xce,
- 0xc5, 0x83, 0x29, 0x86, 0xd1, 0x62, 0x1e, 0x2c, 0xeb, 0x3f, 0xb2, 0xcc,
- 0xd1, 0x75, 0xa9, 0xa4, 0x35, 0x13, 0x56, 0xb1, 0xd9, 0xf7, 0xd7, 0xc7,
- 0xef, 0x45, 0xdb, 0x04, 0x3c, 0x83, 0x6b, 0x30, 0x1e, 0x80, 0x63, 0xc3,
- 0x28, 0x7d, 0xf2, 0x08, 0xa6, 0x23, 0xed, 0x5b, 0x7d, 0x95, 0x1e, 0x3e,
- 0x7e, 0x22, 0xd3, 0x56, 0xe4, 0x3a, 0xd8, 0xbc, 0xdb, 0xfc, 0xab, 0xbd,
- 0x3d, 0x4e, 0x5a, 0x21, 0x47, 0x43, 0xc0, 0xe3, 0xe1, 0xf3, 0xa3, 0x67,
- 0xff, 0xb8, 0x1d, 0x4d, 0x57, 0x55, 0x23, 0x84, 0x5d, 0x31, 0x14, 0x02,
- 0x42, 0x4a, 0xad, 0xdf, 0x20, 0x65, 0xa0, 0x1b, 0x2d, 0x6d, 0x46, 0x18,
- 0x81, 0x24, 0xd0, 0x00, 0xfd, 0xde, 0x21, 0x89, 0x80, 0xbd, 0x68, 0xbf,
- 0xc4, 0x44, 0xab, 0xc2, 0x09, 0x45, 0xd7, 0xdf, 0x9f, 0x9a, 0x9b, 0xab,
- 0x4f, 0x43, 0x40, 0x21, 0x49, 0x3d, 0xa5, 0xd3, 0xf0, 0x06, 0x96, 0x1c,
- 0xec, 0x9c, 0xc3, 0x07, 0x20, 0x3c, 0x8d, 0x7d, 0xb2, 0x77, 0x0d, 0x33,
- 0x35, 0x5f, 0x08, 0xb2, 0x85, 0x94, 0x2e, 0x2c, 0xe8, 0x2d, 0xf8, 0x91,
- 0x97, 0xa4, 0xeb, 0x6e, 0x8b, 0x11, 0xed, 0x55, 0xd3, 0xc1, 0x83, 0x0a,
- 0xbc, 0x00, 0xc0, 0x58, 0x57, 0x28, 0x23, 0x24, 0x69, 0x4e, 0xb3, 0x9c,
- 0x41, 0xd0, 0xcc, 0xd9, 0x52, 0xf4, 0x35, 0xb8, 0x07, 0x86, 0x14, 0xf6,
- 0x88, 0x0e, 0xc4, 0x70, 0x0c, 0x9a, 0x99, 0x50, 0xac, 0xe7, 0xd9, 0x68,
- 0xff, 0xb9, 0xc2, 0x23, 0x0f, 0x92, 0xaf, 0x8a, 0x35, 0x1d, 0x09, 0xad,
- 0xfa, 0xab, 0xf1, 0x37, 0x41, 0xa1, 0x23, 0xbd, 0xf1, 0xe8, 0x88, 0xde,
- 0x78, 0x37, 0xe6, 0xa7, 0x6e, 0xca, 0xc5, 0xdc, 0xbc, 0x19, 0x7b, 0xee,
- 0x29, 0x3d, 0x67, 0x28, 0x6e, 0xd6, 0x2c, 0x6a, 0x25, 0xaa, 0x0d, 0x33,
- 0x79, 0xf4, 0x28, 0x32, 0x93, 0xc1, 0x4f, 0xfe, 0xd0, 0x19, 0xbc, 0xae,
- 0x44, 0x50, 0xd4, 0x03, 0x0c, 0x94, 0x83, 0x12, 0x10, 0x0b, 0xf6, 0xfd,
- 0x6b, 0x32, 0x5f, 0x06, 0xed, 0x78, 0x48, 0x87, 0xc0, 0x0a, 0x98, 0x85,
- 0x0d, 0xb0, 0x20, 0x9e, 0x1e, 0x1e, 0x1d, 0xec, 0x3d, 0x19, 0x3d, 0x1a,
- 0x1d, 0xda, 0x94, 0x4c, 0x43, 0x07, 0xd7, 0xd4, 0xc1, 0x86, 0x32, 0x60,
- 0x22, 0xa1, 0x07, 0x24, 0x23, 0xe5, 0x85, 0x19, 0xc7, 0x83, 0x28, 0x91,
- 0x4e, 0x03, 0x2e, 0x19, 0x8b, 0x00, 0x49, 0x0e, 0xfc, 0xda, 0xbe, 0x51,
- 0xa4, 0x63, 0x2e, 0xe1, 0x9c, 0xd0, 0x24, 0xc4, 0xcd, 0xb4, 0xae, 0xb0,
- 0x03, 0x93, 0xfc, 0xef, 0xeb, 0xbc, 0x31, 0x2a, 0x00, 0x71, 0x14, 0x72,
- 0x9d, 0x69, 0xbf, 0x03, 0x2a, 0xa3, 0x2e, 0x35, 0x41, 0x81, 0xae, 0x44,
- 0x0c, 0xac, 0x81, 0x67, 0xcf, 0xc9, 0xef, 0x13, 0x17, 0x30, 0xe2, 0x12,
- 0xc2, 0x1c, 0xec, 0x8b, 0x9b, 0x0d, 0x19, 0x4b, 0xb2, 0x98, 0x9a, 0x3b,
- 0xfa, 0xb5, 0xb1, 0xf3, 0xae, 0xc9, 0x67, 0x1f, 0x74, 0x16, 0x66, 0x16,
- 0xc0, 0xc8, 0x5b, 0x1c, 0x72, 0x91, 0xb4, 0x20, 0xd7, 0x94, 0x40, 0x7e,
- 0xc0, 0x85, 0x46, 0x5a, 0xe4, 0xcd, 0x35, 0x8d, 0x01, 0x77, 0xd2, 0x7d,
- 0x68, 0xbb, 0xa6, 0x19, 0x02, 0x95, 0x02, 0x8c, 0x54, 0xed, 0xc7, 0xe1,
- 0x05, 0x06, 0x62, 0x84, 0xea, 0x65, 0xab, 0x36, 0x63, 0xce, 0xaf, 0x4d,
- 0xce, 0xd1, 0x28, 0x72, 0x0b, 0xff, 0xeb, 0x74, 0x90, 0xb4, 0xba, 0x5c,
- 0x8b, 0xcc, 0x8a, 0xb5, 0x38, 0xed, 0x36, 0x02, 0x96, 0x51, 0x7f, 0x36,
- 0x95, 0x1d, 0xfd, 0xf2, 0x54, 0x76, 0xf8, 0x50, 0x2a, 0xf3, 0xc8, 0x8c,
- 0x03, 0xef, 0x1b, 0x08, 0x8d, 0x3a, 0x07, 0xd3, 0x3a, 0x7a, 0xa8, 0xcc,
- 0x23, 0x32, 0x97, 0x2a, 0xd0, 0x22, 0xb1, 0x36, 0x8d, 0x39, 0x22, 0xeb,
- 0xa3, 0x32, 0x06, 0x96, 0x51, 0x3a, 0xbb, 0x87, 0xd0, 0xd8, 0xc7, 0xb9,
- 0x99, 0xca, 0x2e, 0xda, 0x7c, 0x65, 0x03, 0x8d, 0xf9, 0x04, 0xf1, 0x60,
- 0x2a, 0x73, 0xfe, 0x46, 0xe6, 0x3b, 0x49, 0x0f, 0xa1, 0xf9, 0x74, 0xd6,
- 0xdb, 0x48, 0xf7, 0xe0, 0x59, 0x8c, 0xca, 0x8e, 0x1e, 0x42, 0x65, 0xe6,
- 0x3c, 0x17, 0x24, 0x2b, 0x5b, 0x54, 0xf6, 0xe8, 0x27, 0x51, 0x19, 0x93,
- 0x19, 0xe8, 0xac, 0x97, 0xd0, 0x68, 0x49, 0xed, 0x42, 0xe5, 0x97, 0xff,
- 0x2a, 0xb7, 0x48, 0x5b, 0x83, 0x06, 0xe5, 0xbb, 0x3f, 0xed, 0x0c, 0x3b,
- 0x5b, 0xfd, 0x80, 0x13, 0x3b, 0x6c, 0x9f, 0xd8, 0xc1, 0x4f, 0x3b, 0xb1,
- 0xc3, 0xae, 0x65, 0x52, 0x65, 0xec, 0x33, 0xff, 0xab, 0xc6, 0x2e, 0x9e,
- 0xef, 0xed, 0xfd, 0x08, 0x1f, 0xd0, 0x73, 0x92, 0x7d, 0x3f, 0x06, 0x4d,
- 0xe0, 0xb3, 0x4e, 0x89, 0xef, 0xf8, 0xec, 0xd5, 0x37, 0x63, 0x71, 0xbc,
- 0x8b, 0xc2, 0xa1, 0x0a, 0x09, 0x94, 0x76, 0x06, 0xef, 0xe5, 0xfe, 0x81,
- 0x81, 0x9a, 0x2b, 0x6d, 0x88, 0x87, 0xb7, 0x03, 0xeb, 0x02, 0xa7, 0xc2,
- 0xd1, 0x22, 0xd1, 0xab, 0x02, 0x90, 0x41, 0x86, 0x3a, 0x83, 0xd3, 0x43,
- 0x86, 0xee, 0xc1, 0x92, 0xf3, 0xe7, 0x62, 0xdb, 0xa0, 0xda, 0x57, 0x76,
- 0x9a, 0xab, 0x0a, 0x05, 0x45, 0x78, 0x4c, 0x74, 0x6b, 0xaf, 0xbb, 0x61,
- 0xcf, 0xec, 0x64, 0x56, 0x5f, 0x03, 0x88, 0x79, 0x55, 0x69, 0x44, 0x31,
- 0x66, 0xe4, 0xda, 0xdf, 0xaa, 0x27, 0x30, 0x06, 0x38, 0x22, 0xc0, 0x82,
- 0xde, 0x7e, 0xd3, 0x7b, 0x41, 0xfa, 0x66, 0x7e, 0xeb, 0xc3, 0x1b, 0x11,
- 0x15, 0xa0, 0x7d, 0x77, 0xa3, 0x1d, 0x72, 0x6e, 0xb9, 0x9f, 0x09, 0xc6,
- 0xe0, 0xdc, 0xb9, 0x8c, 0x9b, 0xd0, 0xd4, 0x8f, 0xcc, 0x90, 0x5d, 0xbf,
- 0x12, 0xff, 0x22, 0xa5, 0xdf, 0xc8, 0x3f, 0x1e, 0xd3, 0x87, 0x11, 0x31,
- 0xe6, 0x7f, 0x5e, 0xe1, 0xdf, 0x9c, 0x1d, 0xc1, 0xe8, 0x65, 0xde, 0x39,
- 0x4f, 0xa3, 0x1b, 0xad, 0xac, 0x94, 0xdd, 0x27, 0x8c, 0xaa, 0xf1, 0xae,
- 0x74, 0xd5, 0x9c, 0xfe, 0x9a, 0x29, 0xd1, 0x03, 0x85, 0xc9, 0xb1, 0x12,
- 0x20, 0x8f, 0x11, 0x63, 0xe4, 0x47, 0xa3, 0x38, 0xbc, 0x7c, 0x96, 0xf8,
- 0x10, 0xa7, 0x8a, 0x59, 0xe1, 0x37, 0xae, 0x73, 0x21, 0x5f, 0x39, 0x82,
- 0x01, 0xa3, 0xdd, 0x86, 0xc9, 0xe5, 0xd4, 0x94, 0x45, 0x66, 0x7e, 0xb0,
- 0xff, 0x79, 0xe8, 0x92, 0xf8, 0xa0, 0xd5, 0x94, 0x0e, 0xe5, 0x13, 0x69,
- 0x1d, 0xa8, 0x6b, 0x98, 0xb8, 0x1a, 0xa2, 0xd8, 0x47, 0x23, 0x05, 0x97,
- 0xb0, 0x7d, 0x67, 0x19, 0x5b, 0x4b, 0x13, 0x36, 0x7b, 0xc3, 0x84, 0x76,
- 0x14, 0x90, 0xd7, 0x90, 0x6b, 0x02, 0x4f, 0x2d, 0xc9, 0x09, 0x01, 0x7f,
- 0x27, 0x27, 0x86, 0x86, 0xcc, 0xbe, 0x74, 0x18, 0x82, 0xbf, 0x7f, 0xb4,
- 0x4f, 0x67, 0xaa, 0x83, 0x50, 0x63, 0xa6, 0x85, 0x86, 0x3a, 0x7e, 0x7f,
- 0x94, 0x8e, 0x7e, 0x43, 0x0c, 0xb0, 0xc7, 0x6d, 0x2b, 0xfa, 0x77, 0x03,
- 0x3f, 0xbf, 0x69, 0x92, 0x56, 0x11, 0x9f, 0x8d, 0xc8, 0x6e, 0xc5, 0xb7,
- 0x51, 0x74, 0x18, 0x9b, 0xf8, 0x94, 0xb2, 0x01, 0x8b, 0x3a, 0x0c, 0xfb,
- 0x43, 0x33, 0x54, 0x12, 0x76, 0x3a, 0xb1, 0xf1, 0x06, 0xbf, 0x69, 0xf9,
- 0x80, 0x51, 0xd9, 0x5a, 0xc9, 0x60, 0x03, 0x4e, 0xa7, 0xea, 0x29, 0xf4,
- 0xb4, 0x5f, 0xc1, 0x67, 0x66, 0x55, 0x7a, 0xe3, 0xd9, 0xd0, 0xdc, 0x17,
- 0x61, 0x8e, 0xc8, 0x83, 0xcd, 0x21, 0x31, 0xbf, 0xa7, 0x88, 0x72, 0x4c,
- 0xfb, 0xa8, 0xa7, 0x55, 0x26, 0x11, 0x1e, 0x82, 0xd8, 0x44, 0xf4, 0x98,
- 0x90, 0x29, 0x8d, 0xe6, 0x71, 0x99, 0x69, 0xd5, 0xae, 0x5d, 0xb5, 0xc2,
- 0xb2, 0x00, 0x8b, 0x65, 0x14, 0x4b, 0x88, 0x77, 0xee, 0x2c, 0xd7, 0x47,
- 0xde, 0x28, 0xb1, 0x0c, 0xde, 0x42, 0xaf, 0x6b, 0x0d, 0xb5, 0x05, 0xf6,
- 0x5c, 0x51, 0x07, 0xc5, 0xfa, 0x2a, 0x5f, 0x75, 0x45, 0xf4, 0xf0, 0x8b,
- 0xf2, 0x8b, 0xe1, 0xae, 0x90, 0x78, 0x79, 0x9d, 0xd5, 0xdc, 0x0d, 0x99,
- 0xa6, 0x4a, 0xd1, 0xe6, 0x2b, 0xb8, 0x58, 0x44, 0x78, 0xa1, 0x54, 0x98,
- 0x12, 0x77, 0xa1, 0x8d, 0x21, 0xc0, 0x11, 0xb4, 0xf6, 0xe1, 0x89, 0x55,
- 0x14, 0x68, 0x16, 0x7e, 0x47, 0xee, 0x18, 0xb3, 0x57, 0x73, 0xce, 0x2d,
- 0x44, 0x39, 0x31, 0x45, 0xe1, 0x05, 0xc3, 0x9b, 0x7d, 0xfa, 0xe5, 0xaa,
- 0x2d, 0x9b, 0xa8, 0x32, 0x5d, 0x79, 0xc3, 0x0b, 0x65, 0x2b, 0x7f, 0xba,
- 0xb7, 0xee, 0xc4, 0x32, 0xa0, 0xb9, 0x38, 0x31, 0xe8, 0xf2, 0xa1, 0x0e,
- 0x89, 0xd1, 0xbf, 0xa7, 0x57, 0xd9, 0x52, 0x5a, 0x20, 0xf5, 0x54, 0xf1,
- 0xf7, 0x96, 0xbc, 0xb7, 0xe7, 0xc4, 0x89, 0x99, 0xf3, 0x66, 0x35, 0x5a,
- 0x96, 0xff, 0x30, 0x7b, 0x9c, 0x52, 0x4f, 0xc5, 0xe0, 0x4a, 0x50, 0xb9,
- 0x6d, 0xc1, 0x87, 0xc2, 0x00, 0x5a, 0x85, 0x35, 0x2c, 0x1d, 0x0b, 0x57,
- 0x94, 0x76, 0xc0, 0x2d, 0x24, 0xaf, 0xcc, 0x8c, 0x8f, 0x3f, 0x7e, 0x78,
- 0x37, 0xfe, 0x70, 0xde, 0x25, 0xec, 0xf3, 0xb3, 0xf7, 0x17, 0xc7, 0xaf,
- 0x3f, 0x9e, 0xbf, 0x3f, 0xbb, 0x38, 0x7b, 0x75, 0x76, 0x9a, 0xec, 0x1c,
- 0xec, 0x6e, 0xac, 0x2e, 0xb4, 0x2e, 0x08, 0x0f, 0xa7, 0x52, 0xe7, 0xcf,
- 0x3c, 0xcb, 0x4e, 0x61, 0x87, 0xd6, 0x13, 0x8e, 0xf6, 0x9d, 0xd0, 0x56,
- 0x0b, 0xf7, 0x1b, 0x7e, 0x08, 0x08, 0x37, 0x70, 0xf5, 0x34, 0xb9, 0x5c,
- 0xf3, 0x65, 0x94, 0x5c, 0x05, 0x2d, 0xbd, 0xaa, 0x9b, 0x40, 0x14, 0x65,
- 0x1a, 0x2f, 0xf5, 0x0a, 0xd3, 0x36, 0xba, 0xe3, 0x1e, 0x77, 0x75, 0x16,
- 0x3a, 0x03, 0x28, 0x60, 0x8e, 0x2a, 0xea, 0x38, 0x59, 0x58, 0xba, 0x60,
- 0x38, 0x1b, 0x60, 0xa0, 0xdb, 0x57, 0xd0, 0x20, 0x42, 0x42, 0x58, 0x65,
- 0x61, 0x55, 0xba, 0x51, 0x72, 0x1e, 0xf6, 0x09, 0x93, 0x37, 0x66, 0x59,
- 0x21, 0xcd, 0x6a, 0x65, 0x1e, 0x08, 0x60, 0xa2, 0x0b, 0x0e, 0xc7, 0xd3,
- 0xcd, 0x03, 0xf4, 0x5b, 0x6f, 0xaf, 0x50, 0xee, 0x9c, 0x05, 0x51, 0x61,
- 0x7e, 0x9b, 0x91, 0x5e, 0x6e, 0xbc, 0x39, 0xd1, 0x78, 0xa4, 0x94, 0x01,
- 0x87, 0x32, 0xc2, 0x61, 0x8f, 0x35, 0x38, 0xc6, 0x28, 0x35, 0xb8, 0x93,
- 0xd0, 0x5f, 0x14, 0xdf, 0x68, 0xec, 0xaf, 0xe5, 0x1e, 0x42, 0xe6, 0x4d,
- 0xa4, 0x68, 0xc5, 0x80, 0xce, 0x7e, 0xc0, 0x04, 0x2d, 0x51, 0xc1, 0x0d,
- 0xc5, 0x2d, 0x0e, 0x2c, 0xc8, 0xf7, 0x48, 0x61, 0x42, 0x5c, 0xbc, 0x88,
- 0x89, 0x0c, 0x2c, 0xee, 0xd2, 0x9b, 0xce, 0xb4, 0xba, 0xec, 0xe7, 0xe9,
- 0xe8, 0xc9, 0xe3, 0xd1, 0x21, 0x81, 0x86, 0x9c, 0x2d, 0x28, 0x8e, 0x26,
- 0x9a, 0x05, 0xfc, 0xcb, 0xf8, 0x80, 0x20, 0x24, 0x21, 0x05, 0xcf, 0xed,
- 0x95, 0x8c, 0x18, 0xb3, 0xa5, 0x12, 0x2d, 0x66, 0x56, 0x51, 0xa6, 0xb8,
- 0x12, 0xd2, 0xd2, 0x58, 0x60, 0xb5, 0x09, 0x95, 0xc6, 0x7c, 0xe7, 0xb9,
- 0xa4, 0xa1, 0x71, 0x5e, 0x56, 0x97, 0xd7, 0x12, 0x44, 0x05, 0x20, 0x3f,
- 0x5f, 0x9d, 0x73, 0x8a, 0xaa, 0x85, 0xa8, 0x00, 0x2b, 0xd7, 0x96, 0xdd,
- 0xfb, 0xa3, 0x7d, 0x4a, 0x67, 0xf8, 0xb3, 0x64, 0xc8, 0x99, 0xbf, 0x8d,
- 0x63, 0xd0, 0x0b, 0xac, 0xce, 0xeb, 0x18, 0xed, 0x70, 0x16, 0x2d, 0xcf,
- 0x4c, 0xef, 0x0f, 0xf4, 0xa7, 0xa6, 0xf0, 0x77, 0x97, 0xdc, 0x03, 0xc3,
- 0x34, 0xf0, 0x50, 0x24, 0xcc, 0x7d, 0xad, 0xb3, 0xf8, 0x8a, 0x47, 0x9b,
- 0x91, 0xe8, 0x0e, 0x83, 0x8b, 0x76, 0xef, 0x15, 0x7b, 0xe8, 0x0d, 0xb3,
- 0xa1, 0x01, 0x95, 0x0e, 0x5d, 0x99, 0x76, 0x6e, 0xdf, 0x62, 0xe0, 0x19,
- 0x2a, 0x5f, 0x83, 0x67, 0x78, 0x91, 0xcd, 0xa1, 0x1b, 0xa2, 0xa6, 0x74,
- 0x80, 0x5f, 0x22, 0xa4, 0x69, 0xb3, 0xd6, 0xf8, 0x24, 0x62, 0xe0, 0x35,
- 0xe9, 0xd4, 0xd7, 0xb5, 0x2d, 0x88, 0xe1, 0xb6, 0xd9, 0x54, 0xea, 0x7e,
- 0x25, 0x55, 0xcd, 0x8b, 0x3b, 0x80, 0xf6, 0xe7, 0xb7, 0x9a, 0x38, 0xf0,
- 0x8f, 0xac, 0x2a, 0xc3, 0xf0, 0x3a, 0x94, 0x07, 0x05, 0x93, 0x23, 0x53,
- 0x52, 0xd1, 0x6e, 0xdc, 0x0f, 0xe9, 0xab, 0xc1, 0x9d, 0xfb, 0x03, 0x5a,
- 0x2f, 0x33, 0x38, 0x34, 0xb7, 0x49, 0x13, 0xb4, 0x13, 0x00, 0x37, 0xe6,
- 0x1a, 0x14, 0xf5, 0x78, 0xc0, 0x82, 0x6a, 0x60, 0xef, 0xb8, 0x7c, 0x36,
- 0x30, 0x31, 0xa1, 0xfe, 0xcd, 0xc8, 0x9c, 0x71, 0xd9, 0xbf, 0x36, 0xbc,
- 0x46, 0x6d, 0xce, 0x1c, 0xe0, 0x9d, 0xe8, 0x73, 0x21, 0x4f, 0x1f, 0x26,
- 0xc9, 0xeb, 0xac, 0xb8, 0x6b, 0x4f, 0x68, 0x00, 0xcc, 0x1a, 0xb8, 0x87,
- 0xf3, 0xc6, 0xc1, 0x2a, 0xb8, 0x64, 0x5c, 0x37, 0xc5, 0x70, 0x4a, 0xed,
- 0x39, 0xc7, 0x38, 0xd7, 0x17, 0x76, 0x1b, 0x98, 0x6b, 0xb5, 0x37, 0x63,
- 0x07, 0xe8, 0x28, 0x1a, 0xd3, 0xc5, 0x27, 0x1f, 0xb2, 0x0d, 0xc0, 0x7c,
- 0x84, 0x55, 0x57, 0xaf, 0x27, 0x7f, 0x63, 0x90, 0xfd, 0x84, 0x3c, 0x0b,
- 0x95, 0xec, 0x82, 0xe4, 0x39, 0x9a, 0x53, 0x35, 0x0f, 0x70, 0xe0, 0x8a,
- 0x98, 0x43, 0x11, 0x1b, 0x0e, 0xc1, 0x66, 0x85, 0xb7, 0x6f, 0x53, 0x18,
- 0x66, 0x14, 0xad, 0x4b, 0xcc, 0x7a, 0x54, 0x06, 0xbd, 0x3f, 0xc3, 0x39,
- 0xf1, 0x54, 0xce, 0x9f, 0xeb, 0x08, 0x5f, 0xde, 0x4b, 0xce, 0xd9, 0xb4,
- 0x19, 0xc4, 0xf4, 0x78, 0xef, 0x58, 0xca, 0xa9, 0xeb, 0xc1, 0x1f, 0xe8,
- 0x8f, 0x70, 0x0d, 0x2d, 0x92, 0xa5, 0x5d, 0x56, 0x36, 0x42, 0x8f, 0x83,
- 0x31, 0xe1, 0xf5, 0xbe, 0x0f, 0x7c, 0xe1, 0xc4, 0xc0, 0xe6, 0xb1, 0xc1,
- 0xc5, 0x1e, 0xf2, 0x81, 0x0f, 0x85, 0x82, 0x09, 0x2a, 0x75, 0xaf, 0x6c,
- 0x77, 0x03, 0xa9, 0xd0, 0x68, 0xdb, 0x41, 0x84, 0x41, 0xb3, 0x92, 0xce,
- 0x27, 0xe9, 0x9c, 0x92, 0xab, 0xab, 0xcc, 0x81, 0x31, 0xd3, 0x51, 0x32,
- 0xd4, 0x94, 0xa0, 0xbb, 0x6b, 0xae, 0xef, 0xaa, 0x6c, 0x18, 0x67, 0x9e,
- 0xb2, 0xb1, 0x49, 0xd3, 0xa9, 0xc8, 0x41, 0xe8, 0x6d, 0xb2, 0xaa, 0xc8,
- 0x34, 0x9a, 0x3d, 0x7c, 0xf8, 0xd1, 0xd6, 0xab, 0xb2, 0x70, 0x45, 0x38,
- 0x12, 0x7c, 0xf5, 0xd8, 0x98, 0x7c, 0x91, 0x73, 0xea, 0xe0, 0x74, 0xb2,
- 0x90, 0xf4, 0xd7, 0x65, 0x4e, 0xc8, 0x52, 0x3a, 0x1c, 0xb4, 0x37, 0x47,
- 0x25, 0x17, 0xf1, 0x4e, 0x29, 0x2e, 0x95, 0x49, 0xec, 0x2b, 0x72, 0x63,
- 0x22, 0xd3, 0x0c, 0xee, 0x0e, 0xaf, 0xf2, 0x8e, 0x6f, 0xb7, 0x0e, 0x87,
- 0x7c, 0x17, 0x44, 0xab, 0x0b, 0x8a, 0x33, 0x15, 0x1c, 0xba, 0x12, 0xe3,
- 0x53, 0x19, 0x2e, 0x4d, 0x8f, 0xcc, 0x34, 0x4a, 0xb9, 0x4a, 0x49, 0x32,
- 0x69, 0x65, 0x61, 0x07, 0x4c, 0xbe, 0xdd, 0x5e, 0xde, 0xea, 0x02, 0x36,
- 0x2d, 0xd7, 0xa9, 0xb9, 0xa3, 0x7b, 0x64, 0xc4, 0xed, 0x9d, 0x26, 0x02,
- 0x6e, 0x56, 0xc1, 0x56, 0x28, 0xab, 0x37, 0xfb, 0x9c, 0x37, 0x38, 0xb1,
- 0x4e, 0x26, 0xb2, 0x26, 0xe8, 0x4a, 0xff, 0x99, 0xe5, 0x3a, 0x6c, 0x5e,
- 0x29, 0xc1, 0x3a, 0x9b, 0x77, 0xc5, 0xc0, 0x6a, 0xd0, 0x7e, 0xc4, 0x4b,
- 0xc3, 0xdd, 0x35, 0x60, 0xa3, 0x4b, 0xc7, 0x11, 0xb8, 0x9f, 0x10, 0xbf,
- 0x8b, 0xfb, 0x11, 0xf7, 0x2c, 0xaa, 0x92, 0x21, 0x98, 0x62, 0x36, 0x34,
- 0x4c, 0x60, 0xb5, 0xc1, 0x3f, 0x7f, 0x3b, 0xd0, 0x45, 0xb7, 0x32, 0x98,
- 0x7d, 0x18, 0x17, 0xfe, 0x09, 0x27, 0x4a, 0xca, 0xde, 0x85, 0x15, 0x00,
- 0x46, 0xd3, 0x38, 0x8a, 0xed, 0x64, 0x2c, 0x13, 0x33, 0xb4, 0x70, 0x7a,
- 0x7b, 0x6e, 0x68, 0x71, 0x25, 0x36, 0x50, 0x37, 0xac, 0x2f, 0x6d, 0x8d,
- 0xb7, 0x4f, 0x76, 0xee, 0x03, 0xd7, 0x36, 0x62, 0x4c, 0x94, 0xac, 0x17,
- 0x92, 0xfb, 0xee, 0x7d, 0x8b, 0x4d, 0xb9, 0x60, 0x1f, 0x81, 0x73, 0xc6,
- 0xfd, 0x1b, 0xf8, 0x39, 0x11, 0x4a, 0x96, 0xd5, 0x05, 0x93, 0x94, 0xb3,
- 0x8e, 0xf9, 0x82, 0xc0, 0x27, 0xf1, 0x21, 0x9a, 0x58, 0xbe, 0x11, 0x41,
- 0xa4, 0xe7, 0x30, 0x62, 0xe0, 0x39, 0xb3, 0x4e, 0x5a, 0xb1, 0xfe, 0x7c,
- 0x9a, 0x52, 0xe4, 0x36, 0x9e, 0xcc, 0x38, 0x96, 0xfb, 0x36, 0xd4, 0xa7,
- 0x88, 0x4f, 0x6b, 0x26, 0xa9, 0xe7, 0x1c, 0xe4, 0x26, 0x60, 0xb7, 0xcd,
- 0x43, 0x12, 0x7c, 0xa7, 0x29, 0xc2, 0xf5, 0xda, 0x73, 0x5d, 0x06, 0x76,
- 0xff, 0x74, 0xbf, 0x35, 0xab, 0x8b, 0x31, 0x69, 0x3a, 0xab, 0x7e, 0x2f,
- 0x4b, 0xfb, 0x2b, 0x2f, 0xcc, 0x8d, 0xde, 0xb4, 0x28, 0x3c, 0xf4, 0x73,
- 0x16, 0xe5, 0x18, 0x87, 0xdb, 0x42, 0x99, 0x73, 0xe7, 0x44, 0xf8, 0x23,
- 0x1b, 0x63, 0x55, 0x3d, 0x4b, 0x30, 0x63, 0x6e, 0x68, 0x03, 0xed, 0x2d,
- 0xc3, 0x3e, 0xf8, 0x53, 0x57, 0x72, 0xff, 0x36, 0x82, 0x34, 0xe8, 0xbf,
- 0x7f, 0x7d, 0x0e, 0x37, 0xe0, 0xec, 0xc7, 0xde, 0x79, 0x1c, 0x0f, 0x64,
- 0x2e, 0xbf, 0xc2, 0x34, 0xf2, 0xd5, 0x15, 0xe9, 0x96, 0x2f, 0x62, 0xa5,
- 0x53, 0xde, 0x46, 0xc8, 0x63, 0xbf, 0xfc, 0xf7, 0xab, 0x85, 0x03, 0x98,
- 0xda, 0xf0, 0x7d, 0x79, 0xec, 0x17, 0xff, 0x3e, 0xdf, 0xdd, 0xcd, 0xc2,
- 0xc5, 0x72, 0xc5, 0xd7, 0x92, 0xa0, 0xde, 0xe6, 0x38, 0x4e, 0xaa, 0xfc,
- 0x0c, 0xa6, 0x28, 0x39, 0xef, 0x21, 0x57, 0x94, 0x6f, 0x45, 0xbb, 0xa0,
- 0xf8, 0x6c, 0xf1, 0x17, 0xe1, 0x60, 0x60, 0xcd, 0xe1, 0xe6, 0x48, 0x5b,
- 0xa2, 0x17, 0xfc, 0xe7, 0xde, 0x97, 0xb1, 0x33, 0xb2, 0xa5, 0x34, 0x24,
- 0x06, 0xb5, 0x91, 0x11, 0x3a, 0xe3, 0x30, 0x6e, 0x87, 0xa8, 0xbc, 0xb6,
- 0xab, 0x0b, 0x6d, 0x96, 0x66, 0x8d, 0xd0, 0xab, 0xb1, 0xee, 0x49, 0xb2,
- 0x43, 0x9a, 0x06, 0xac, 0x71, 0x0a, 0x97, 0x33, 0x44, 0x8a, 0x47, 0xe6,
- 0x7d, 0xb0, 0xee, 0x6b, 0x84, 0x07, 0x51, 0xe1, 0xf7, 0xa0, 0x75, 0x08,
- 0xc2, 0x5f, 0x0f, 0xa4, 0x7b, 0x91, 0x19, 0x8e, 0xc8, 0x4a, 0x92, 0x60,
- 0x95, 0x9e, 0x70, 0x9c, 0x21, 0xcc, 0x12, 0xd7, 0x37, 0x90, 0x6e, 0xba,
- 0xe0, 0x74, 0xeb, 0xe4, 0xd5, 0xd9, 0xbb, 0x77, 0xc7, 0xaf, 0xba, 0xf1,
- 0x68, 0x57, 0x4f, 0x82, 0x66, 0x59, 0xa2, 0xea, 0x07, 0xbd, 0x33, 0xf1,
- 0x75, 0x6e, 0x8c, 0x60, 0x43, 0x46, 0x3c, 0x03, 0x74, 0xd6, 0x4a, 0x05,
- 0x25, 0x99, 0xcb, 0x52, 0x3c, 0xfc, 0x5c, 0xa6, 0x80, 0x48, 0xb5, 0x5e,
- 0x40, 0x0f, 0xce, 0x87, 0x02, 0x67, 0x1a, 0xf5, 0x55, 0x65, 0x0d, 0x14,
- 0xf6, 0xab, 0xce, 0x00, 0xd3, 0x35, 0x06, 0xe3, 0x9e, 0xa4, 0xa3, 0xb3,
- 0xff, 0x35, 0xd2, 0xc1, 0xd1, 0xd2, 0x32, 0x23, 0xee, 0x51, 0xd1, 0xcf,
- 0xb0, 0x9c, 0x73, 0x1b, 0xdf, 0x65, 0x5a, 0x7d, 0xa2, 0x78, 0xb6, 0x57,
- 0xfe, 0x83, 0x02, 0x50, 0x80, 0x7f, 0xcf, 0x66, 0x31, 0x4c, 0x08, 0x78,
- 0xdd, 0xfd, 0x6a, 0x07, 0x99, 0x90, 0xb4, 0xbe, 0x7c, 0xae, 0x75, 0x99,
- 0xf4, 0x7a, 0x91, 0xdd, 0xd0, 0x67, 0x18, 0x08, 0x87, 0x80, 0x1d, 0xc2,
- 0x5e, 0x1a, 0x8c, 0xdf, 0xce, 0x51, 0x85, 0x3b, 0xc1, 0x94, 0xa0, 0xb3,
- 0x5a, 0x72, 0xb7, 0x0a, 0x00, 0x62, 0x53, 0xfb, 0x37, 0xae, 0xe9, 0x09,
- 0xf6, 0xea, 0x6b, 0x05, 0xb5, 0xf4, 0x52, 0xea, 0x82, 0xdc, 0x3f, 0x8b,
- 0x5f, 0x35, 0xc9, 0x5a, 0x50, 0x97, 0x7d, 0xb8, 0x40, 0xbc, 0xdb, 0x38,
- 0x06, 0xb2, 0x56, 0xea, 0xd6, 0x00, 0x7a, 0xb4, 0x69, 0x4f, 0xe4, 0x6f,
- 0x4c, 0x20, 0xf5, 0x30, 0x9a, 0xc1, 0xc2, 0x1e, 0x77, 0xe1, 0x96, 0x81,
- 0x44, 0x06, 0x27, 0x29, 0x41, 0x10, 0x5e, 0xa2, 0x76, 0x81, 0x33, 0x25,
- 0x71, 0x59, 0x03, 0x35, 0x17, 0x95, 0x27, 0xa8, 0xec, 0x1b, 0x88, 0x59,
- 0xc0, 0x6d, 0xe4, 0x67, 0xd4, 0x60, 0x58, 0x37, 0x5f, 0x51, 0x85, 0x38,
- 0x08, 0x21, 0x17, 0x38, 0x2f, 0x56, 0xeb, 0x26, 0x08, 0x24, 0x12, 0xbc,
- 0x1a, 0x23, 0x6b, 0x7c, 0x39, 0x0c, 0x5b, 0x91, 0xa5, 0x33, 0xff, 0x4c,
- 0xc1, 0xc0, 0x61, 0xf9, 0xd7, 0xcd, 0x2c, 0x2f, 0x36, 0x7a, 0x96, 0x7d,
- 0x8b, 0xc6, 0x99, 0x34, 0x92, 0xf8, 0xcf, 0x91, 0x5f, 0x47, 0xac, 0x7b,
- 0x70, 0x2d, 0x74, 0x69, 0xc1, 0xbe, 0xa5, 0x2c, 0x62, 0x13, 0x8a, 0x0e,
- 0xaa, 0xd4, 0x3b, 0xdc, 0xcf, 0x58, 0x39, 0xe4, 0xd8, 0xca, 0xfa, 0x84,
- 0xd2, 0x27, 0xee, 0x8e, 0xc6, 0x0f, 0xfd, 0xf2, 0x92, 0xc9, 0x76, 0xa2,
- 0xbf, 0x47, 0x47, 0xb1, 0xcf, 0xfd, 0x1a, 0x33, 0x48, 0x5e, 0x98, 0xff,
- 0x6c, 0xfc, 0xf6, 0xc3, 0x3f, 0x1b, 0x60, 0x4d, 0x6e, 0x90, 0xba, 0x36,
- 0xc5, 0x15, 0xb2, 0xf0, 0x5e, 0x28, 0x55, 0xf0, 0xdc, 0x20, 0x2f, 0xd5,
- 0x93, 0xc8, 0x1b, 0x65, 0xb0, 0xab, 0x43, 0xf3, 0xc5, 0x70, 0x24, 0x60,
- 0x1f, 0x9b, 0x88, 0x84, 0xa0, 0x1e, 0x26, 0x92, 0xef, 0x15, 0xc1, 0xad,
- 0x32, 0xde, 0x6e, 0x9e, 0x95, 0xad, 0xe2, 0x7b, 0xf8, 0xc6, 0x85, 0xa5,
- 0xab, 0xff, 0x9a, 0xba, 0x82, 0xd2, 0xc1, 0x96, 0xb2, 0x82, 0x4f, 0xb4,
- 0x36, 0xe1, 0x21, 0x52, 0x29, 0xd8, 0x92, 0x6e, 0x2d, 0x60, 0x6b, 0xa3,
- 0xc2, 0x5d, 0xd8, 0x94, 0xf5, 0xee, 0xc8, 0x13, 0x4f, 0xfd, 0xe2, 0xd7,
- 0xe2, 0xe1, 0x29, 0xdb, 0xf1, 0x93, 0xe9, 0xcb, 0xda, 0xa6, 0xe1, 0x18,
- 0xaa, 0xbd, 0x37, 0x65, 0x9b, 0x92, 0x9b, 0xbc, 0x84, 0x6d, 0xcf, 0x2f,
- 0xd1, 0x97, 0xb1, 0xfd, 0x7f, 0x63, 0xca, 0x76, 0x2b, 0x67, 0x9b, 0xd4,
- 0x2b, 0x4a, 0x11, 0x8e, 0xa5, 0x6d, 0x7b, 0x70, 0x37, 0x9c, 0xb3, 0xbd,
- 0x29, 0x65, 0xdb, 0xcb, 0xd8, 0xde, 0x90, 0xb0, 0xcd, 0xe0, 0xc1, 0x9b,
- 0x52, 0xb6, 0x7f, 0x66, 0xce, 0x76, 0x4f, 0xca, 0xf6, 0x4f, 0xce, 0xd8,
- 0xfe, 0x85, 0x53, 0xb6, 0x7f, 0xc9, 0x6c, 0x64, 0xdc, 0x1e, 0x3a, 0x8f,
- 0x7c, 0x2a, 0xc5, 0x4d, 0x2f, 0xee, 0x85, 0x14, 0x6e, 0x27, 0xb0, 0x78,
- 0x71, 0x66, 0x19, 0x87, 0x55, 0x1a, 0xa7, 0xb8, 0x87, 0x75, 0x43, 0x42,
- 0x2a, 0x91, 0x0c, 0x38, 0x3f, 0x0e, 0x7c, 0x14, 0xbb, 0xe9, 0x75, 0xbd,
- 0x18, 0x62, 0x02, 0x54, 0x73, 0x1c, 0x58, 0x89, 0x8e, 0xcf, 0x74, 0x9e,
- 0xfb, 0xe5, 0x59, 0x4e, 0xb3, 0xa8, 0x0f, 0x8e, 0x9c, 0xad, 0x2e, 0x7f,
- 0x59, 0x53, 0x3d, 0x6c, 0xcc, 0x6e, 0x67, 0xee, 0x33, 0x16, 0x0e, 0xa3,
- 0x10, 0x27, 0xfc, 0x16, 0x7c, 0xa4, 0x99, 0x6d, 0xa9, 0x68, 0x23, 0x12,
- 0xb6, 0x43, 0x72, 0x58, 0x0c, 0x83, 0xf2, 0x77, 0x7f, 0x1d, 0x10, 0x21,
- 0x54, 0xf6, 0xa2, 0x4c, 0xbb, 0xc6, 0x15, 0x3c, 0x18, 0x1d, 0x71, 0x85,
- 0x34, 0x22, 0x2c, 0x14, 0x5e, 0xe5, 0x79, 0x06, 0x88, 0x54, 0x98, 0x00,
- 0xf0, 0xc0, 0xd5, 0xb4, 0xe3, 0x86, 0x65, 0xf2, 0xfc, 0x28, 0x79, 0x4f,
- 0xaa, 0xa3, 0x51, 0xd4, 0x11, 0xed, 0xc7, 0xed, 0x36, 0x63, 0x27, 0xf2,
- 0xfb, 0xd8, 0x70, 0x6d, 0x10, 0x5a, 0x43, 0x3f, 0x1f, 0xde, 0x9f, 0x86,
- 0xf1, 0x69, 0x44, 0x0f, 0x9e, 0xef, 0xed, 0x21, 0x41, 0xea, 0x2a, 0xbd,
- 0xbd, 0x1d, 0xd5, 0xd9, 0xde, 0xac, 0x9c, 0xd6, 0x7b, 0x74, 0x82, 0xfa,
- 0xf5, 0xab, 0x66, 0xb9, 0xf8, 0xec, 0x3e, 0x98, 0x6b, 0xad, 0xcb, 0x5d,
- 0xdc, 0x09, 0x5a, 0x97, 0xcb, 0xbe, 0xc4, 0xad, 0xcc, 0xbd, 0x3a, 0xf9,
- 0x75, 0xd0, 0x79, 0x54, 0xaa, 0x0a, 0xcc, 0xaa, 0xcc, 0xff, 0xa1, 0xe7,
- 0x0a, 0x45, 0x95, 0x22, 0x85, 0xcb, 0x7e, 0x5f, 0x5a, 0xaf, 0x86, 0x20,
- 0x3c, 0x20, 0x2e, 0x24, 0x6f, 0x08, 0x53, 0x36, 0x6b, 0xc0, 0xc4, 0xe4,
- 0x44, 0x3a, 0xc7, 0xde, 0xe9, 0x08, 0xcb, 0xe4, 0x15, 0xb6, 0x6d, 0x03,
- 0x9d, 0xf5, 0xf4, 0x88, 0xfd, 0xc5, 0x59, 0x82, 0xa1, 0x6e, 0x92, 0xf2,
- 0x0f, 0x51, 0x76, 0xfd, 0x47, 0x7f, 0x8d, 0x5b, 0x66, 0x13, 0xf2, 0x5e,
- 0x70, 0xb6, 0xdd, 0xc6, 0x99, 0xd8, 0x87, 0x7f, 0x8d, 0x99, 0xa0, 0x4e,
- 0x3f, 0xca, 0x1f, 0x5b, 0x73, 0xc0, 0x63, 0xbf, 0xc6, 0xf7, 0xaf, 0x0f,
- 0xfa, 0x3e, 0x8b, 0x26, 0xb0, 0x78, 0xe2, 0x17, 0xfc, 0xf0, 0x07, 0xeb,
- 0xac, 0x62, 0x4c, 0x83, 0x17, 0xf4, 0xdf, 0xe7, 0xba, 0xc3, 0x7d, 0xdd,
- 0xe5, 0x36, 0x20, 0xf7, 0x7b, 0x8d, 0xed, 0x25, 0xa3, 0x75, 0x33, 0x68,
- 0x48, 0x2f, 0x2a, 0x08, 0x43, 0x42, 0x09, 0xaa, 0x37, 0x9a, 0x2d, 0x0c,
- 0x15, 0x12, 0x90, 0x21, 0x54, 0x18, 0xd5, 0x86, 0x3e, 0x3e, 0x2b, 0x15,
- 0x65, 0xe9, 0x5d, 0x8f, 0x18, 0x42, 0x86, 0x40, 0x4c, 0x2b, 0x6f, 0xd4,
- 0x69, 0x84, 0x6b, 0xec, 0xd7, 0x46, 0x9a, 0x8b, 0xb5, 0x08, 0xd3, 0x5a,
- 0xee, 0xeb, 0x59, 0x00, 0x9e, 0xed, 0x43, 0x11, 0x4d, 0xac, 0x1f, 0x0d,
- 0x7c, 0xa5, 0xcb, 0x44, 0x15, 0xcf, 0x76, 0xe1, 0xc0, 0x2b, 0xec, 0x15,
- 0x7f, 0x9e, 0x6c, 0x0d, 0x3f, 0x24, 0xcf, 0xb7, 0x82, 0x2d, 0x3a, 0x2b,
- 0xa4, 0xe7, 0x0b, 0x9c, 0x5e, 0x15, 0x0a, 0xe1, 0xd1, 0x46, 0xca, 0x57,
- 0x4d, 0xae, 0x08, 0xb0, 0xc8, 0x99, 0x13, 0xb6, 0x5f, 0xc2, 0x65, 0x10,
- 0x84, 0x63, 0xe7, 0x05, 0x2b, 0x51, 0xda, 0xe1, 0x88, 0x44, 0x09, 0xb9,
- 0x6d, 0x1c, 0xfc, 0x39, 0xd4, 0x27, 0xee, 0xde, 0x20, 0x89, 0x0d, 0x14,
- 0xcd, 0x9c, 0x86, 0xee, 0x17, 0xdb, 0x1b, 0x1c, 0x23, 0xae, 0xca, 0xba,
- 0xce, 0x27, 0x86, 0x47, 0x5f, 0x0a, 0x7f, 0xac, 0x33, 0x4e, 0xa7, 0xe2,
- 0x26, 0xab, 0xb4, 0x97, 0xb5, 0x4b, 0x2e, 0xab, 0x43, 0x68, 0x2d, 0x5e,
- 0xa9, 0xed, 0x18, 0x21, 0xee, 0x25, 0x33, 0x3b, 0x66, 0x6d, 0xd7, 0x39,
- 0x0d, 0xcf, 0x04, 0x97, 0x26, 0x93, 0x2a, 0xcf, 0xe6, 0xc9, 0xb2, 0xe4,
- 0xad, 0x87, 0xe2, 0xd5, 0x65, 0xb2, 0x0b, 0x42, 0xe6, 0xa0, 0x2e, 0xe1,
- 0x94, 0x69, 0x5b, 0x13, 0xe8, 0x24, 0xf2, 0xaf, 0x91, 0xfd, 0xe8, 0x72,
- 0xbb, 0xab, 0x8c, 0x32, 0x07, 0xae, 0x33, 0x39, 0xd6, 0x54, 0x7b, 0xef,
- 0xf4, 0xe4, 0xa4, 0x56, 0x16, 0x9b, 0x1b, 0xd5, 0x0e, 0x80, 0x04, 0xb2,
- 0xf8, 0x24, 0xf4, 0x45, 0xf4, 0x72, 0xd4, 0xf4, 0x5d, 0x57, 0xba, 0x3f,
- 0xfa, 0xd5, 0x78, 0xbc, 0xe7, 0x85, 0xfe, 0xd9, 0x75, 0x00, 0xfd, 0x59,
- 0xf1, 0xed, 0xd4, 0x68, 0x31, 0x82, 0xee, 0xcb, 0x87, 0x9f, 0x13, 0x2a,
- 0xfe, 0xbb, 0xae, 0x96, 0x13, 0x49, 0x2d, 0xa7, 0x04, 0x3a, 0xce, 0x57,
- 0xb3, 0xab, 0x6b, 0x80, 0x2e, 0x00, 0x90, 0x16, 0x3f, 0x36, 0xfc, 0x21,
- 0x10, 0xf1, 0x2e, 0x5d, 0xbe, 0x95, 0x20, 0xef, 0xf2, 0xe3, 0xe9, 0xac,
- 0x5c, 0x76, 0x3c, 0x0a, 0x42, 0xd8, 0x45, 0x9e, 0xd2, 0x0c, 0x42, 0x99,
- 0x4c, 0x18, 0xe2, 0xfd, 0xb9, 0xf1, 0x46, 0xe7, 0xf3, 0x62, 0xf5, 0x0e,
- 0xf5, 0x93, 0x1c, 0xac, 0xf1, 0x28, 0x31, 0x6e, 0x28, 0xfa, 0x3f, 0x3c,
- 0x0d, 0xba, 0x38, 0x4a, 0xed, 0x84, 0x30, 0x4e, 0x9b, 0xbd, 0x70, 0x9d,
- 0xa7, 0x56, 0x87, 0x72, 0xdf, 0xe2, 0x1d, 0x75, 0x9f, 0xea, 0x8b, 0xc3,
- 0x31, 0xde, 0x4e, 0xa4, 0xb2, 0xf3, 0xdd, 0x78, 0x1c, 0xa6, 0xc8, 0x17,
- 0xc6, 0x38, 0x29, 0x2f, 0x8b, 0xfc, 0x1f, 0xd2, 0x5e, 0xab, 0x9b, 0xd9,
- 0xda, 0xaa, 0x51, 0x68, 0x07, 0xe4, 0x29, 0x51, 0x22, 0xe4, 0x6f, 0x82,
- 0x04, 0x47, 0x62, 0x07, 0x09, 0x61, 0x80, 0xb0, 0xb2, 0xc9, 0x80, 0x14,
- 0x67, 0xe0, 0x1e, 0x4a, 0xad, 0xa4, 0x07, 0x85, 0xcc, 0xf9, 0x2c, 0x54,
- 0x24, 0x69, 0x0f, 0x04, 0x7b, 0x26, 0xae, 0x22, 0x65, 0x3f, 0xa3, 0xa0,
- 0x80, 0x38, 0xe8, 0xcf, 0x2a, 0x29, 0x68, 0x2b, 0xa8, 0x1e, 0x00, 0x53,
- 0x76, 0xcb, 0x1c, 0x34, 0x8e, 0x70, 0x27, 0xa8, 0xb2, 0x59, 0x4c, 0xbc,
- 0xd8, 0x38, 0x04, 0xda, 0xa7, 0x3c, 0x04, 0xe4, 0x4e, 0x55, 0xcf, 0x40,
- 0xbc, 0x44, 0x10, 0xee, 0xec, 0xe8, 0x0f, 0x80, 0xb6, 0x23, 0x37, 0xbe,
- 0x82, 0xca, 0xcb, 0x94, 0xd1, 0x6a, 0x85, 0xe1, 0x17, 0x32, 0xc6, 0xa3,
- 0xa3, 0x69, 0xb9, 0x2b, 0xc9, 0x17, 0x36, 0xda, 0x04, 0x94, 0xd0, 0x18,
- 0xa0, 0xb8, 0x4f, 0xb4, 0x68, 0xaf, 0xe1, 0xbd, 0xa5, 0xb7, 0x47, 0x84,
- 0xbe, 0x46, 0x45, 0x55, 0x16, 0x17, 0x8b, 0x2c, 0x79, 0x54, 0xef, 0x29,
- 0x4d, 0x74, 0x49, 0xcb, 0x01, 0xfc, 0xdb, 0x29, 0x72, 0x96, 0x88, 0xf8,
- 0xf8, 0x6d, 0xe3, 0xba, 0xb6, 0x0c, 0x63, 0x04, 0xd2, 0x80, 0xb4, 0x04,
- 0x97, 0x06, 0x6a, 0xc0, 0xda, 0x18, 0x65, 0x04, 0xfc, 0xcb, 0xa5, 0x45,
- 0xf6, 0x4c, 0x06, 0xc4, 0x7d, 0x98, 0xe5, 0x8a, 0xa7, 0x6e, 0xb8, 0x52,
- 0x2e, 0xdb, 0x5d, 0xec, 0x9d, 0x0c, 0xd2, 0xa3, 0xcb, 0xff, 0x0a, 0x95,
- 0x28, 0x3f, 0xa7, 0x10, 0xe5, 0x57, 0xae, 0x44, 0xf1, 0x24, 0x05, 0x89,
- 0x9d, 0x50, 0x4e, 0x20, 0x2d, 0x8a, 0x5c, 0x32, 0x9c, 0x07, 0x75, 0x93,
- 0xda, 0xd6, 0x33, 0x78, 0xab, 0x33, 0x5c, 0xf4, 0x26, 0xb5, 0x73, 0x64,
- 0x3d, 0x0e, 0xa2, 0xfc, 0x91, 0x53, 0xe0, 0xa9, 0xe9, 0x5d, 0x0f, 0xcc,
- 0x4f, 0x46, 0x25, 0xe3, 0xb3, 0x4c, 0x20, 0xba, 0xfe, 0xe0, 0x3a, 0xbf,
- 0xfc, 0xda, 0x06, 0xd8, 0x81, 0xe1, 0xcd, 0x2f, 0x3c, 0x79, 0xfc, 0xa7,
- 0x88, 0x40, 0x0e, 0x9c, 0x96, 0x5c, 0xd7, 0x46, 0xaf, 0xb6, 0x61, 0x30,
- 0x23, 0x4c, 0x2f, 0x7e, 0x61, 0xd0, 0x68, 0x16, 0xf1, 0x4d, 0x65, 0x6f,
- 0x94, 0x16, 0x47, 0x2f, 0xf7, 0x30, 0x38, 0x01, 0x5a, 0x55, 0x83, 0xd8,
- 0xf0, 0xf3, 0x49, 0xd6, 0xdc, 0x90, 0x16, 0x87, 0xdd, 0xd0, 0x6d, 0xf4,
- 0x78, 0x80, 0xe5, 0x87, 0xbd, 0xf9, 0x2e, 0x03, 0xc1, 0x57, 0x26, 0x8e,
- 0xc2, 0x40, 0xbe, 0xd6, 0x33, 0xa2, 0x71, 0xdd, 0xe0, 0xfa, 0xc5, 0x5a,
- 0x39, 0xb9, 0x10, 0x35, 0x7f, 0x9f, 0xf6, 0xc5, 0xcb, 0xc5, 0x6d, 0x55,
- 0x0c, 0x69, 0xe6, 0x92, 0x3c, 0xe8, 0xfb, 0xf8, 0xed, 0x35, 0x96, 0x6b,
- 0x1b, 0xf3, 0x7e, 0xb6, 0xd9, 0x9c, 0x1e, 0xbe, 0xa7, 0x67, 0x49, 0x84,
- 0xd0, 0x2e, 0xde, 0x15, 0xc8, 0xc5, 0x42, 0xc3, 0xbd, 0x5c, 0x86, 0x5d,
- 0x39, 0xf2, 0xdb, 0x74, 0x65, 0x7e, 0x46, 0x21, 0x41, 0x60, 0xca, 0xce,
- 0xb2, 0x58, 0x5e, 0x42, 0x67, 0xf3, 0x3b, 0x71, 0x71, 0x9c, 0x4f, 0xd8,
- 0x26, 0xc1, 0x1a, 0x67, 0xb1, 0xf6, 0x36, 0xb5, 0x20, 0x37, 0xa9, 0x7b,
- 0x4a, 0x83, 0xe0, 0x12, 0x6c, 0xf1, 0x29, 0x4d, 0xd0, 0x09, 0x0b, 0x29,
- 0xdf, 0x0c, 0xa1, 0xc7, 0x5b, 0x6b, 0x2c, 0x47, 0x91, 0x26, 0x97, 0xa4,
- 0x5f, 0xa0, 0x1e, 0xab, 0x3b, 0x7f, 0xc9, 0xe1, 0xd3, 0x96, 0x87, 0x2d,
- 0x27, 0x0f, 0x64, 0x59, 0xe8, 0x32, 0x13, 0xf0, 0x27, 0x7d, 0x45, 0x20,
- 0x90, 0xe5, 0x03, 0xb6, 0x35, 0x6c, 0x5f, 0x64, 0x32, 0x96, 0xc3, 0xd1,
- 0xba, 0xb5, 0x12, 0x7b, 0x88, 0xc4, 0xe6, 0x76, 0xc6, 0x54, 0x17, 0x31,
- 0x7e, 0x75, 0xbe, 0x9b, 0x9c, 0x77, 0xc2, 0x0a, 0x28, 0x4a, 0x22, 0x61,
- 0xea, 0x33, 0x62, 0x69, 0xc5, 0xc7, 0x08, 0x97, 0xfd, 0x2e, 0x68, 0xc5,
- 0x15, 0xb6, 0x58, 0xae, 0x08, 0xfd, 0xfe, 0xe2, 0x8c, 0xa9, 0xb3, 0x96,
- 0x97, 0x28, 0xd2, 0x60, 0x50, 0x10, 0x31, 0x29, 0xfd, 0x5b, 0x6a, 0x4c,
- 0xe8, 0x92, 0x4a, 0xed, 0xb8, 0xf9, 0x95, 0x38, 0xe5, 0xd5, 0x99, 0xbe,
- 0x08, 0x52, 0x1d, 0x19, 0x14, 0x47, 0x33, 0xcf, 0x3d, 0xf8, 0x23, 0x69,
- 0x43, 0x59, 0xb3, 0x5c, 0xea, 0xb4, 0x89, 0xa0, 0x55, 0x5c, 0x66, 0x45,
- 0xd8, 0x75, 0x06, 0x1f, 0x25, 0x41, 0x2e, 0x44, 0x3d, 0x1b, 0x75, 0xd1,
- 0xb3, 0xbd, 0xb0, 0x81, 0x4c, 0x2e, 0x2f, 0x1d, 0x52, 0x7e, 0x0f, 0xc2,
- 0x26, 0x4c, 0xfe, 0x09, 0x0a, 0x00, 0x09, 0x87, 0x0b, 0x48, 0xec, 0x30,
- 0x0a, 0xa6, 0xe5, 0xea, 0x8e, 0xb6, 0xc3, 0x3c, 0x58, 0xd7, 0x57, 0x87,
- 0x86, 0x73, 0x1c, 0x8e, 0x3e, 0x87, 0x89, 0x62, 0x84, 0x75, 0x04, 0x8e,
- 0x97, 0x73, 0x47, 0xa4, 0x5d, 0x6d, 0x67, 0x34, 0xd1, 0xc2, 0x47, 0x4e,
- 0xf1, 0x1f, 0xfe, 0x37, 0xa2, 0xb4, 0xbf, 0xaf, 0xc3, 0xf8, 0xdd, 0x0e,
- 0x08, 0xea, 0x0d, 0x90, 0x34, 0xa9, 0x1d, 0x12, 0x32, 0x0d, 0x26, 0x79,
- 0x83, 0x96, 0x06, 0x6a, 0x43, 0xb6, 0x2f, 0xe6, 0x1b, 0x2e, 0x79, 0x4e,
- 0xf0, 0x5a, 0xb4, 0x26, 0xde, 0xa8, 0xe0, 0xff, 0x8d, 0xbe, 0xa5, 0x03,
- 0x70, 0x6d, 0x12, 0xb2, 0x21, 0xfe, 0x7c, 0xfc, 0xe6, 0xec, 0xfd, 0x71,
- 0xbb, 0x5e, 0xb1, 0x01, 0xe8, 0x16, 0x82, 0xfd, 0xdd, 0xd9, 0x01, 0xd5,
- 0xce, 0x35, 0xf5, 0xcd, 0x8b, 0x9c, 0x8c, 0xfe, 0xe4, 0xfc, 0xbb, 0xd7,
- 0x76, 0x72, 0x39, 0x98, 0x26, 0x26, 0xa5, 0x23, 0x0e, 0x74, 0x9f, 0xbb,
- 0xa2, 0x9d, 0x94, 0x00, 0x6a, 0x06, 0x26, 0xcd, 0xc5, 0xed, 0xf4, 0x90,
- 0x64, 0xc1, 0xa9, 0x31, 0x5a, 0xaa, 0x0f, 0x0c, 0xf5, 0xba, 0xa6, 0xd2,
- 0x7b, 0x3b, 0x6c, 0xa0, 0xf7, 0x42, 0xf4, 0x03, 0x6d, 0x4a, 0x6c, 0x51,
- 0x42, 0x8e, 0x23, 0x30, 0xb9, 0x51, 0x62, 0x3f, 0xe2, 0xbe, 0x42, 0x07,
- 0x2f, 0xd9, 0x40, 0xf8, 0x4a, 0x8c, 0x61, 0x53, 0xdf, 0x7b, 0x8e, 0x83,
- 0xb0, 0xbc, 0x23, 0x87, 0x0b, 0xd1, 0xac, 0xed, 0x3b, 0x36, 0x60, 0xa4,
- 0x3f, 0x09, 0xf7, 0xf8, 0xfb, 0x18, 0x89, 0x90, 0x9b, 0xcf, 0xee, 0xd4,
- 0xbb, 0x03, 0x6f, 0xa6, 0x76, 0xdb, 0x64, 0xc2, 0xdb, 0x7f, 0xd8, 0x4e,
- 0xa4, 0x20, 0x04, 0x0c, 0x8f, 0x61, 0x69, 0x7b, 0xfa, 0x8d, 0xba, 0xfe,
- 0x73, 0xbb, 0xf7, 0xe5, 0x6f, 0xe9, 0xa2, 0xfb, 0xeb, 0xb1, 0x25, 0x74,
- 0x27, 0x49, 0x3d, 0x68, 0x04, 0xbb, 0x66, 0xcc, 0x52, 0xb0, 0x0e, 0x11,
- 0xa7, 0x3a, 0xce, 0x40, 0x70, 0xbc, 0x43, 0xe7, 0x5e, 0xe5, 0xf7, 0xa4,
- 0x52, 0x86, 0x83, 0x88, 0x99, 0x36, 0x4e, 0xe0, 0x58, 0x04, 0x51, 0x77,
- 0x7d, 0x57, 0x34, 0x74, 0x51, 0x99, 0xa7, 0x4c, 0xcb, 0x2a, 0x5e, 0x00,
- 0x06, 0x62, 0x72, 0xb4, 0x5b, 0x03, 0x6b, 0xe2, 0xd9, 0xe3, 0x67, 0x24,
- 0xdc, 0x91, 0xa3, 0x24, 0x3d, 0xd9, 0x04, 0xe1, 0x19, 0xf1, 0x53, 0x9e,
- 0x73, 0x14, 0x39, 0x44, 0xc6, 0x91, 0x2e, 0xda, 0x93, 0x6c, 0xc1, 0x5d,
- 0xe0, 0xc6, 0xde, 0x10, 0x21, 0x98, 0x52, 0xdf, 0x89, 0x11, 0xe6, 0xa2,
- 0xa1, 0x9d, 0xbc, 0xfe, 0x94, 0xec, 0xfc, 0x57, 0x6e, 0x99, 0xe9, 0xaa,
- 0xe3, 0x39, 0xf8, 0x9b, 0x17, 0xeb, 0x80, 0xf2, 0xc9, 0x39, 0xa7, 0x85,
- 0xc2, 0x3a, 0xe0, 0x1c, 0x31, 0x95, 0xb4, 0xf6, 0x11, 0x4d, 0x3c, 0x50,
- 0xb5, 0xa6, 0x5c, 0x91, 0xd2, 0x06, 0xf8, 0x84, 0x48, 0xd7, 0x5e, 0x73,
- 0x58, 0x0f, 0x4e, 0xf2, 0x69, 0x97, 0x2d, 0x84, 0x12, 0x91, 0x76, 0x02,
- 0x98, 0xd8, 0xe2, 0x6e, 0x55, 0xe5, 0x6a, 0x94, 0x7c, 0x28, 0x90, 0x89,
- 0x27, 0x64, 0x27, 0x62, 0x22, 0x2f, 0xcc, 0x0e, 0x18, 0x9a, 0x26, 0x28,
- 0x8f, 0x08, 0x13, 0x02, 0x9f, 0xf3, 0xef, 0x9d, 0xb0, 0xc9, 0x4e, 0x88,
- 0x14, 0xf7, 0xd6, 0xa2, 0x98, 0x0b, 0xdf, 0x7a, 0x13, 0xf6, 0x37, 0xe4,
- 0xfe, 0x6c, 0x44, 0xea, 0x66, 0x39, 0x18, 0x9b, 0x42, 0xe0, 0xd9, 0x62,
- 0x31, 0x64, 0x10, 0x75, 0x82, 0x94, 0x26, 0xe5, 0x9e, 0x8b, 0xa4, 0x91,
- 0xc0, 0xe6, 0x97, 0xe0, 0x07, 0x92, 0x05, 0xb5, 0xde, 0x23, 0xd4, 0x00,
- 0x29, 0xd8, 0x88, 0xa4, 0xbd, 0x6b, 0x64, 0x8d, 0x0a, 0xf7, 0x9c, 0x3f,
- 0x04, 0xbb, 0xf3, 0x77, 0xe5, 0xa7, 0xb1, 0x8e, 0x64, 0x21, 0x2c, 0xe9,
- 0xf4, 0xea, 0xb2, 0x5a, 0x71, 0x57, 0xc4, 0x58, 0xcb, 0x46, 0x4f, 0xeb,
- 0xe6, 0x27, 0x95, 0x24, 0xea, 0xac, 0xe1, 0xa9, 0xf0, 0xab, 0x27, 0xaf,
- 0x5b, 0xdd, 0xd5, 0x69, 0x27, 0x50, 0xe7, 0x16, 0x1f, 0x4e, 0x60, 0x47,
- 0xc9, 0x57, 0x80, 0x1b, 0xe9, 0x24, 0x87, 0x1d, 0xcd, 0x99, 0x18, 0x93,
- 0x3b, 0xf7, 0x9b, 0xf8, 0x70, 0x32, 0x06, 0x6b, 0xaa, 0x3c, 0x82, 0x0e,
- 0x0b, 0x5a, 0x31, 0xa6, 0x68, 0x4e, 0x0d, 0xae, 0x88, 0x1a, 0x2e, 0xb3,
- 0xca, 0x7e, 0x24, 0x4c, 0x92, 0xbc, 0x5a, 0x96, 0x33, 0x2a, 0xea, 0xca,
- 0xee, 0xdd, 0x0b, 0x7a, 0x50, 0xf7, 0x42, 0x6a, 0xe1, 0x6a, 0x7f, 0x5d,
- 0x18, 0xc4, 0x50, 0x29, 0x51, 0x5e, 0x39, 0x8f, 0x35, 0x55, 0xe8, 0x9a,
- 0x41, 0x89, 0x76, 0x29, 0xcd, 0xf8, 0x65, 0x7f, 0x09, 0x45, 0x52, 0x4e,
- 0x1b, 0x6f, 0x05, 0xf4, 0x40, 0x7c, 0x38, 0x66, 0xac, 0x91, 0x95, 0x51,
- 0x81, 0x14, 0x2c, 0xca, 0xfb, 0x56, 0x46, 0x0f, 0x06, 0xa7, 0x6c, 0x7e,
- 0xe8, 0xb0, 0x67, 0xbd, 0x23, 0xe6, 0xc3, 0x89, 0x0f, 0xd7, 0x3e, 0x60,
- 0x3d, 0x61, 0xcc, 0x21, 0x76, 0xc0, 0x82, 0x61, 0x1d, 0x6a, 0x58, 0xce,
- 0x3e, 0xe6, 0xdd, 0xb1, 0x0f, 0xf6, 0x1e, 0xb0, 0x7c, 0x23, 0xd8, 0x85,
- 0x45, 0x61, 0xb4, 0xbb, 0x75, 0x35, 0xcd, 0x3e, 0x62, 0x6e, 0x4d, 0x5a,
- 0x5d, 0x66, 0xcd, 0xc7, 0xcd, 0x1b, 0xb2, 0x10, 0x34, 0x85, 0xbb, 0x25,
- 0xda, 0x8c, 0x5b, 0x5e, 0x21, 0xf8, 0xb2, 0xa9, 0xa0, 0x0b, 0x18, 0x05,
- 0x8f, 0x5b, 0xb9, 0x37, 0xfd, 0x1b, 0xe2, 0x7d, 0x8f, 0x31, 0x69, 0xd9,
- 0x30, 0x5b, 0x95, 0x79, 0x61, 0x1b, 0xc7, 0x80, 0xc7, 0x78, 0x73, 0x8c,
- 0x21, 0x2f, 0x6d, 0x0a, 0x57, 0x2d, 0x3f, 0x51, 0x89, 0x95, 0x55, 0x02,
- 0x3e, 0x46, 0x9a, 0x83, 0x78, 0x8b, 0xe3, 0xa7, 0xf5, 0xb4, 0x79, 0x49,
- 0x52, 0x42, 0x68, 0x9b, 0xd1, 0xfa, 0x07, 0x4d, 0x45, 0xc5, 0x3d, 0xb3,
- 0xf1, 0x3f, 0x68, 0x6f, 0x64, 0x77, 0x76, 0xab, 0x9b, 0x99, 0x05, 0xb2,
- 0xb9, 0x71, 0x17, 0x48, 0x45, 0x3b, 0x32, 0x9b, 0xb5, 0xe1, 0x33, 0x65,
- 0x30, 0xf1, 0x60, 0x73, 0x45, 0xc0, 0xee, 0xfd, 0x74, 0xd1, 0x84, 0xfa,
- 0x4f, 0xf0, 0xf1, 0x0a, 0x9d, 0xab, 0x65, 0x77, 0xe5, 0x30, 0xfa, 0xb7,
- 0x46, 0x9e, 0x76, 0x53, 0x64, 0xee, 0x6e, 0xe9, 0xbf, 0xac, 0x22, 0x7b,
- 0xb4, 0x81, 0xdd, 0xc9, 0x67, 0xbb, 0x0c, 0x6f, 0x96, 0x91, 0x5b, 0x96,
- 0x29, 0x01, 0x39, 0x5b, 0xf7, 0xdf, 0x2b, 0x9e, 0x79, 0xef, 0x1e, 0x57,
- 0xcb, 0x7b, 0xae, 0xb8, 0x79, 0xc0, 0xad, 0x8a, 0x91, 0x38, 0xec, 0xaa,
- 0x82, 0x5b, 0x29, 0x8d, 0xad, 0x7b, 0x76, 0xbe, 0x6f, 0x06, 0x2d, 0x1a,
- 0xec, 0x9f, 0x89, 0x3c, 0x19, 0x9d, 0x8e, 0xdb, 0x5c, 0x73, 0xba, 0xd5,
- 0x9d, 0x9b, 0x59, 0x7c, 0x38, 0x99, 0xae, 0x7b, 0x4b, 0xb6, 0x67, 0xe0,
- 0xf9, 0x2e, 0xb9, 0x93, 0x88, 0x31, 0x1b, 0x43, 0xda, 0xd0, 0xeb, 0xfd,
- 0x93, 0xd8, 0x03, 0xd9, 0xe7, 0x8b, 0xc2, 0xb7, 0xc8, 0xe9, 0x8b, 0x46,
- 0xf2, 0x6e, 0x28, 0x65, 0xf1, 0x22, 0xd6, 0xf6, 0xb8, 0xb9, 0x97, 0x30,
- 0xe2, 0xae, 0x48, 0xc8, 0x43, 0xa2, 0x2a, 0x1a, 0x51, 0x89, 0x92, 0x0a,
- 0xc0, 0xb8, 0x19, 0xb5, 0xf8, 0x08, 0xf3, 0xe6, 0x13, 0xfe, 0x66, 0xc2,
- 0x79, 0x5b, 0x0c, 0x84, 0x4c, 0xb1, 0x43, 0x51, 0x43, 0xb4, 0x57, 0x71,
- 0x9d, 0x89, 0x9d, 0x20, 0x8f, 0x73, 0xd7, 0x90, 0xb0, 0x41, 0x73, 0x27,
- 0x79, 0xae, 0x1e, 0x05, 0x70, 0xdb, 0xd9, 0xe5, 0xcc, 0x6f, 0x77, 0xee,
- 0x2d, 0xbf, 0x1a, 0xf0, 0x16, 0x5c, 0x9a, 0xc5, 0xe3, 0x8f, 0x68, 0x91,
- 0x48, 0xa2, 0x86, 0x24, 0x50, 0x0f, 0x76, 0x93, 0xf7, 0x12, 0xda, 0x24,
- 0xa5, 0xee, 0xae, 0xc1, 0x04, 0xcd, 0x00, 0x3b, 0xf9, 0xc8, 0x08, 0x43,
- 0x2e, 0x0a, 0x20, 0x05, 0x89, 0x10, 0xf9, 0x63, 0x81, 0xe2, 0x5d, 0x8d,
- 0x14, 0x2b, 0x04, 0xd8, 0xde, 0xc1, 0xe8, 0x60, 0x90, 0x58, 0xdb, 0xd3,
- 0xd3, 0x9d, 0x91, 0xbc, 0x28, 0x58, 0xe0, 0xf4, 0xe9, 0xae, 0x9f, 0xe1,
- 0x3d, 0x7d, 0xb8, 0x0e, 0xbd, 0xc2, 0x70, 0x2d, 0x3b, 0x83, 0xe5, 0x26,
- 0xbd, 0x0b, 0x15, 0xd3, 0xfd, 0xe1, 0xa3, 0x67, 0xcf, 0x5a, 0xf2, 0xbc,
- 0xf6, 0x70, 0xd4, 0x1f, 0xef, 0xef, 0x63, 0x6d, 0x41, 0x4d, 0xb4, 0xf9,
- 0xc5, 0xf0, 0x19, 0x5e, 0x6c, 0xbf, 0x56, 0x67, 0xe6, 0x08, 0x66, 0xfd,
- 0xef, 0x0d, 0xe9, 0x37, 0x91, 0xcf, 0xc1, 0x9f, 0xd2, 0xfb, 0xd6, 0x33,
- 0xfa, 0x5c, 0xe4, 0x2d, 0x3c, 0xcc, 0xdb, 0x58, 0xce, 0xe7, 0xe4, 0xc9,
- 0xa2, 0x27, 0x15, 0x99, 0xe7, 0x26, 0xad, 0x66, 0xe1, 0x72, 0xf7, 0x07,
- 0xc3, 0x83, 0xbe, 0xe5, 0x22, 0x9a, 0x8c, 0x04, 0x38, 0x3a, 0x4f, 0x32,
- 0x14, 0x8d, 0x01, 0xc2, 0x05, 0x42, 0xdd, 0x81, 0x0e, 0xcc, 0x8c, 0x0e,
- 0x9e, 0x3d, 0x1b, 0xd0, 0xcc, 0x1e, 0x3f, 0x7b, 0xd6, 0x5b, 0x10, 0xee,
- 0x7d, 0xe6, 0xa6, 0x74, 0xee, 0x27, 0x7a, 0xdd, 0x11, 0x4d, 0x4d, 0x76,
- 0x4e, 0xfc, 0x3b, 0xf4, 0x9b, 0x2f, 0x92, 0x77, 0x67, 0x17, 0xc7, 0x9e,
- 0x63, 0x06, 0xd7, 0x8b, 0x23, 0x86, 0x5e, 0x8a, 0x28, 0x42, 0xb0, 0x2b,
- 0xb4, 0xf2, 0x82, 0xe1, 0x4b, 0x36, 0x49, 0x68, 0x4c, 0xa2, 0x58, 0x45,
- 0x7d, 0x82, 0xff, 0x16, 0x66, 0x44, 0x90, 0x71, 0x3c, 0xcb, 0x2f, 0xf3,
- 0xc6, 0x87, 0x6d, 0xda, 0x31, 0xa7, 0xbd, 0x0b, 0x17, 0x07, 0x27, 0xba,
- 0x49, 0x34, 0x65, 0xbb, 0xa6, 0xf2, 0x0e, 0xce, 0x84, 0xdd, 0x26, 0x6b,
- 0x6a, 0x3b, 0x28, 0xb0, 0xc8, 0x16, 0xb3, 0x5a, 0x05, 0x21, 0x3f, 0x3e,
- 0xc4, 0x83, 0x72, 0x5b, 0x60, 0xae, 0x72, 0x8f, 0xf7, 0x14, 0xa0, 0x96,
- 0xfc, 0xe9, 0xfe, 0x78, 0x0a, 0xdc, 0x59, 0x48, 0xc4, 0xd0, 0xc2, 0x2c,
- 0x1a, 0xc7, 0x4f, 0x95, 0xdd, 0xae, 0x9d, 0xcb, 0xd3, 0x7a, 0xe7, 0x0a,
- 0x3a, 0x87, 0x00, 0x8f, 0x90, 0x9d, 0xf8, 0xb3, 0x6c, 0xa5, 0x29, 0xa5,
- 0x45, 0x7b, 0x1c, 0x43, 0xcb, 0xf3, 0xfc, 0x72, 0x5d, 0xc5, 0xd3, 0x2f,
- 0xff, 0xe2, 0xca, 0x84, 0xb4, 0x69, 0x40, 0x7a, 0x93, 0x6a, 0x79, 0x12,
- 0x1a, 0x3d, 0xe8, 0xbd, 0x56, 0x23, 0x58, 0xcb, 0x81, 0xd0, 0xd2, 0x21,
- 0xb0, 0xa4, 0xc9, 0x3b, 0x31, 0x37, 0x9a, 0x0c, 0x39, 0x09, 0xb4, 0x6d,
- 0xa7, 0x34, 0x2f, 0x48, 0x1b, 0x57, 0x96, 0x25, 0x2e, 0x44, 0x3a, 0x6f,
- 0x12, 0xa7, 0xa9, 0x6c, 0x41, 0x98, 0x53, 0xb7, 0xbd, 0x70, 0xbe, 0x7b,
- 0x7a, 0x12, 0xde, 0x96, 0xab, 0xd2, 0x6b, 0x13, 0x12, 0x82, 0x36, 0x08,
- 0x28, 0x0d, 0xb8, 0x0f, 0x1f, 0xd1, 0xcc, 0xa8, 0xd0, 0x8b, 0x32, 0xa5,
- 0x63, 0x54, 0xcf, 0x09, 0x47, 0xd3, 0x59, 0x3b, 0x60, 0xc4, 0x31, 0x3d,
- 0xdb, 0x20, 0xab, 0x83, 0x8e, 0x5a, 0x4e, 0x99, 0xb0, 0xbc, 0x1d, 0xa8,
- 0x08, 0x88, 0xd4, 0x73, 0x83, 0x30, 0x9f, 0x32, 0x1f, 0x61, 0x84, 0x8c,
- 0xdd, 0x51, 0x12, 0x9a, 0xbd, 0x44, 0xf0, 0x7c, 0x5a, 0xb6, 0xcf, 0x05,
- 0xfa, 0x9d, 0x92, 0x90, 0xa4, 0x09, 0xab, 0x38, 0x1e, 0x9f, 0xfc, 0xf7,
- 0xe3, 0x5f, 0x33, 0xea, 0x54, 0xa5, 0x37, 0xb6, 0x70, 0xf0, 0x3b, 0x06,
- 0xac, 0x94, 0x68, 0x90, 0x45, 0xaa, 0x48, 0x17, 0x62, 0xc4, 0x53, 0x4f,
- 0x4d, 0x48, 0x0f, 0xc4, 0x15, 0xa5, 0x9d, 0xb1, 0x21, 0xac, 0x90, 0xb6,
- 0xc9, 0x6b, 0x46, 0xf0, 0x0a, 0xea, 0x34, 0x44, 0x32, 0x3a, 0x4a, 0xbe,
- 0xd8, 0x09, 0xc8, 0x07, 0xb9, 0x84, 0x2b, 0x11, 0x96, 0x3d, 0x79, 0x7b,
- 0x19, 0x51, 0x2a, 0x0c, 0x17, 0x00, 0x12, 0x91, 0x26, 0x65, 0xe6, 0x7a,
- 0x4f, 0x4f, 0x42, 0xbf, 0xd2, 0x3e, 0xe3, 0xf6, 0x0d, 0x14, 0xa0, 0xaa,
- 0x92, 0x17, 0x1f, 0xde, 0x9f, 0xf6, 0x94, 0x4b, 0x8e, 0x71, 0x06, 0xb4,
- 0x59, 0x5b, 0xef, 0x33, 0xa0, 0x99, 0x55, 0xc9, 0x79, 0x7a, 0x99, 0x6d,
- 0xf9, 0x00, 0x72, 0xaa, 0x2a, 0x62, 0xf9, 0xe2, 0x7f, 0x88, 0xb9, 0x53,
- 0xfc, 0xb6, 0x1b, 0xc4, 0xc4, 0x5d, 0x58, 0xd8, 0xaf, 0x71, 0x9c, 0x2f,
- 0x52, 0xd9, 0xbb, 0x75, 0x45, 0x01, 0x7d, 0xec, 0x7c, 0xa4, 0x95, 0x14,
- 0xbf, 0xde, 0x46, 0xfd, 0x74, 0x19, 0xa6, 0x14, 0x09, 0x22, 0x3f, 0x59,
- 0xb2, 0xf5, 0x47, 0x72, 0xbf, 0x6f, 0x79, 0x48, 0x97, 0xc3, 0x2c, 0x0c,
- 0xb2, 0xe9, 0x56, 0x30, 0x46, 0xa1, 0x75, 0x45, 0xb1, 0x2b, 0xbf, 0xe5,
- 0xbe, 0xaf, 0xe5, 0x82, 0xad, 0xaa, 0x8c, 0xf0, 0x78, 0x91, 0xc1, 0x1b,
- 0xb4, 0x0a, 0xe3, 0xb4, 0x63, 0x86, 0x60, 0x25, 0xfb, 0xef, 0x54, 0xe6,
- 0xf7, 0x5c, 0x22, 0x2d, 0xac, 0x06, 0xd9, 0xa9, 0x49, 0x9c, 0x5a, 0x7b,
- 0x2c, 0xc5, 0x16, 0x9b, 0x2e, 0xa8, 0x21, 0x0e, 0x7b, 0xbf, 0x24, 0xf4,
- 0x3e, 0x2b, 0xa9, 0x89, 0x0a, 0xcd, 0x27, 0x2d, 0xac, 0x3f, 0xb9, 0x75,
- 0xb2, 0xbf, 0x3a, 0xd4, 0xa1, 0x0b, 0x00, 0xbd, 0x1c, 0x48, 0x97, 0xa7,
- 0xa1, 0xa1, 0x8e, 0x42, 0x2a, 0xe1, 0xbd, 0x63, 0xf5, 0x68, 0xef, 0x3f,
- 0xbc, 0xd6, 0x21, 0x5e, 0xf3, 0x8f, 0x1e, 0xc4, 0x5c, 0x6f, 0xba, 0x0d,
- 0xaa, 0x54, 0x40, 0x30, 0x41, 0xfb, 0x11, 0x57, 0x30, 0x2b, 0xd2, 0x32,
- 0xea, 0xce, 0x1f, 0x3a, 0xa5, 0xe9, 0x15, 0x57, 0x6e, 0x0e, 0x5f, 0xe7,
- 0x46, 0x86, 0xd4, 0x0c, 0x40, 0x04, 0x25, 0x97, 0x6b, 0x0f, 0xf5, 0x1a,
- 0xc2, 0x37, 0x92, 0x05, 0xe9, 0x0a, 0x1c, 0x25, 0x41, 0xe2, 0xb3, 0x7d,
- 0xc7, 0x86, 0x6c, 0x0c, 0x45, 0xdc, 0xeb, 0x2c, 0xf6, 0x14, 0x86, 0xd4,
- 0xf9, 0x2b, 0xb0, 0x6d, 0xda, 0xc3, 0x80, 0x6f, 0x87, 0x91, 0x08, 0x91,
- 0xdd, 0x51, 0x58, 0x20, 0x64, 0xcd, 0x38, 0xbc, 0x1e, 0xe9, 0xc1, 0x14,
- 0x98, 0x9a, 0xb6, 0x73, 0x39, 0x4b, 0xa5, 0x80, 0xc4, 0x28, 0x2f, 0xc5,
- 0x36, 0xc2, 0xe1, 0xd8, 0x09, 0x83, 0xf0, 0x71, 0x69, 0xea, 0xd4, 0x0c,
- 0x6c, 0xe3, 0xe6, 0xda, 0x97, 0x59, 0x9a, 0xf8, 0xc4, 0x05, 0xee, 0x5d,
- 0x6b, 0x55, 0x48, 0x1a, 0xf5, 0x09, 0x8f, 0x62, 0x03, 0x45, 0x29, 0x08,
- 0x2f, 0xb1, 0x10, 0x3a, 0xf2, 0x77, 0xcc, 0x13, 0x9e, 0x0c, 0xe4, 0x7c,
- 0x8d, 0xe4, 0xf7, 0x43, 0xd7, 0x79, 0x63, 0xe7, 0x2e, 0x33, 0xfa, 0xb5,
- 0x05, 0xd5, 0x52, 0x43, 0x2a, 0x52, 0xfd, 0x99, 0x70, 0x77, 0xd0, 0xba,
- 0x55, 0x98, 0x02, 0x13, 0xc4, 0x8b, 0x2c, 0xf2, 0x96, 0x1b, 0x2d, 0x00,
- 0x89, 0x96, 0x45, 0x76, 0x4b, 0x18, 0xe0, 0xfd, 0xc3, 0x85, 0x4a, 0xf6,
- 0x77, 0x2f, 0xdf, 0xbf, 0x3b, 0x79, 0xf7, 0xd5, 0xf3, 0xe4, 0xf8, 0x36,
- 0xab, 0xa6, 0xd4, 0x89, 0xf9, 0x6f, 0xeb, 0x59, 0x3e, 0x05, 0x9b, 0x90,
- 0x06, 0xc1, 0x7e, 0xc8, 0xdb, 0x58, 0x01, 0x99, 0xf8, 0x57, 0x49, 0xe0,
- 0x06, 0x85, 0x30, 0x92, 0xcb, 0x4b, 0xc0, 0x11, 0xc6, 0x8a, 0x2a, 0x2f,
- 0xd7, 0x1e, 0xf9, 0x4c, 0xb9, 0xa5, 0x21, 0x62, 0x01, 0x88, 0x91, 0x5e,
- 0xc9, 0x5e, 0x93, 0xd3, 0x35, 0x79, 0x7d, 0x7a, 0xda, 0xd3, 0x1f, 0x9a,
- 0xa7, 0xcf, 0xa5, 0xbe, 0x18, 0xc2, 0xe6, 0x9b, 0x52, 0x2c, 0xcf, 0x88,
- 0x7f, 0xe2, 0x35, 0x2d, 0x86, 0x07, 0x30, 0xb0, 0xef, 0xc2, 0x4c, 0x4e,
- 0xa4, 0x19, 0x23, 0x39, 0x10, 0x27, 0x9c, 0x57, 0x33, 0xd8, 0x42, 0x86,
- 0x43, 0x96, 0xf3, 0x86, 0xf4, 0xa3, 0x96, 0x24, 0x6d, 0xf7, 0x05, 0xda,
- 0x94, 0x14, 0xc6, 0x31, 0xa3, 0x36, 0x4e, 0x94, 0x84, 0x24, 0x91, 0xb3,
- 0x6a, 0x08, 0x92, 0x15, 0x43, 0x34, 0x93, 0x42, 0xaa, 0x59, 0x90, 0x50,
- 0x9b, 0xda, 0xce, 0xe6, 0x35, 0x71, 0xcb, 0x90, 0x5d, 0xdc, 0x64, 0x95,
- 0x98, 0x9e, 0xb6, 0x88, 0xd8, 0x30, 0xbb, 0x51, 0x32, 0x2e, 0xcd, 0xf3,
- 0x91, 0xaa, 0x05, 0xed, 0xb8, 0xe8, 0xba, 0xaa, 0xa6, 0x8d, 0xa4, 0xd0,
- 0xda, 0xbc, 0x2a, 0x34, 0xa3, 0x42, 0xcc, 0xad, 0xbd, 0xde, 0x48, 0xbf,
- 0x67, 0xa2, 0xff, 0x49, 0x66, 0x15, 0x8a, 0x3b, 0x0d, 0xed, 0x10, 0x91,
- 0x6c, 0x0d, 0x0d, 0x3b, 0xdd, 0x42, 0x23, 0x3d, 0xea, 0x42, 0xed, 0x8d,
- 0x74, 0x4f, 0x2f, 0x55, 0x3f, 0x4d, 0xbd, 0xbb, 0xe0, 0x7b, 0x5a, 0xd4,
- 0xa9, 0xd5, 0xe9, 0x39, 0x4e, 0xa5, 0x51, 0x98, 0x8d, 0x95, 0x32, 0x4f,
- 0xa2, 0xae, 0x36, 0x59, 0x13, 0x04, 0xc0, 0xcf, 0x6c, 0x0b, 0x48, 0x3c,
- 0xe6, 0x17, 0xca, 0xfb, 0xaf, 0x8b, 0xbc, 0x19, 0x38, 0xef, 0x02, 0x69,
- 0x05, 0x41, 0xb9, 0xb6, 0xb1, 0xf1, 0x46, 0xbb, 0xb1, 0xbc, 0x1a, 0xe1,
- 0x8b, 0x02, 0xe4, 0x9a, 0x5e, 0xbb, 0x7c, 0xaf, 0x5e, 0xce, 0x37, 0xd2,
- 0xfc, 0xf8, 0xae, 0x8c, 0x06, 0xe4, 0x81, 0xe7, 0x0f, 0xe7, 0xe1, 0xc0,
- 0x4c, 0xfc, 0x62, 0x16, 0x2f, 0x5a, 0xe9, 0x70, 0x09, 0xc2, 0xe1, 0xbc,
- 0x82, 0xaf, 0x7e, 0x26, 0x2c, 0x51, 0x9b, 0xbc, 0xb8, 0x2e, 0x3f, 0xb1,
- 0xbc, 0x47, 0xa0, 0x2b, 0x9a, 0xa2, 0x92, 0xf7, 0x96, 0xb5, 0xb0, 0x5f,
- 0x8a, 0x77, 0x55, 0xe6, 0xce, 0x22, 0xcb, 0xab, 0x24, 0x30, 0x8b, 0x91,
- 0x60, 0x8c, 0x2d, 0x01, 0xb4, 0xe2, 0xa9, 0x9b, 0xef, 0xaf, 0x77, 0x69,
- 0xa0, 0x0d, 0xc5, 0x93, 0x6c, 0x51, 0x67, 0x03, 0xaf, 0x1a, 0x50, 0x85,
- 0x8d, 0x4a, 0x1b, 0x24, 0x7f, 0xb2, 0x38, 0xd9, 0x24, 0x49, 0x46, 0xdd,
- 0x8e, 0xa5, 0x1d, 0x23, 0x16, 0xc1, 0x4d, 0x8e, 0x3a, 0x4d, 0xaf, 0xca,
- 0x32, 0x2a, 0xb6, 0x9d, 0x0c, 0x81, 0x4a, 0x03, 0x40, 0x8c, 0x1e, 0xfd,
- 0xc1, 0xc2, 0x87, 0xb9, 0x60, 0x5d, 0x90, 0xe0, 0x6b, 0xa1, 0x06, 0x45,
- 0x1b, 0xf4, 0x00, 0x4a, 0xdb, 0xd2, 0x8d, 0x27, 0x14, 0xc8, 0xe6, 0x58,
- 0xf2, 0x02, 0xff, 0xae, 0x23, 0x8f, 0x9b, 0x16, 0x7a, 0x82, 0xbf, 0x29,
- 0x51, 0x61, 0xc7, 0x09, 0x68, 0x2e, 0x2d, 0x11, 0x74, 0x03, 0xa3, 0xa9,
- 0x68, 0x07, 0x34, 0x30, 0xcf, 0xbc, 0x01, 0x03, 0xf9, 0xfd, 0xe1, 0x7e,
- 0x1f, 0x93, 0x67, 0x35, 0x56, 0xab, 0x5c, 0xe9, 0x3a, 0x5a, 0xe3, 0x9c,
- 0x05, 0xa1, 0x2b, 0x0c, 0x20, 0x01, 0xb2, 0x5e, 0x25, 0x68, 0x7d, 0x45,
- 0x4d, 0xf0, 0x7a, 0xf6, 0x7f, 0xf4, 0x5b, 0xf4, 0x3e, 0x74, 0xfc, 0xeb,
- 0xbd, 0x77, 0xc6, 0x34, 0x52, 0xb4, 0xbc, 0x96, 0x79, 0x89, 0xe7, 0x2a,
- 0xf1, 0x74, 0x76, 0xa7, 0x37, 0xc0, 0xb2, 0x07, 0xb3, 0xe3, 0x1c, 0x83,
- 0x3c, 0x64, 0xc9, 0xc6, 0xa6, 0x5d, 0xae, 0x22, 0x0c, 0xcb, 0x5e, 0x02,
- 0xcd, 0x52, 0x49, 0x1d, 0xda, 0x65, 0xfa, 0xc9, 0xf6, 0xee, 0x0b, 0xd1,
- 0x57, 0x84, 0x93, 0xb2, 0x31, 0x9e, 0x4a, 0xb6, 0x26, 0x76, 0x84, 0xbe,
- 0xd4, 0x16, 0x8c, 0xc8, 0x3a, 0x1b, 0x46, 0xbd, 0xfd, 0x8a, 0x59, 0x13,
- 0x82, 0x9f, 0xc1, 0x92, 0x72, 0x60, 0xf8, 0x5b, 0xfc, 0xfa, 0x56, 0xb2,
- 0x43, 0x5c, 0x75, 0x57, 0xb5, 0xd7, 0xb0, 0xfe, 0xd9, 0xd5, 0xd4, 0x81,
- 0xfd, 0xa6, 0x75, 0x90, 0x39, 0x0b, 0xed, 0x35, 0x31, 0x46, 0x5e, 0x65,
- 0x14, 0x00, 0x6a, 0xf9, 0x26, 0x95, 0x83, 0xf3, 0xf5, 0x22, 0x66, 0xe6,
- 0xe0, 0x66, 0xdb, 0x66, 0xac, 0x79, 0x5d, 0xaf, 0xb5, 0x97, 0x80, 0xc3,
- 0x99, 0x11, 0xd0, 0xc1, 0x85, 0x99, 0x11, 0x0a, 0x5a, 0x16, 0xdc, 0xe2,
- 0x2c, 0x4a, 0xb9, 0x70, 0x0d, 0x73, 0x03, 0x73, 0x51, 0x30, 0xd9, 0x8a,
- 0xe2, 0xb9, 0x69, 0x17, 0x3a, 0xdb, 0x46, 0x8d, 0xb6, 0x80, 0xba, 0xb3,
- 0xe7, 0x41, 0xd2, 0xe0, 0xd6, 0xd9, 0xf9, 0xc5, 0xc9, 0xd9, 0xbb, 0x71,
- 0xf2, 0x5f, 0xb7, 0x36, 0x96, 0x77, 0xb5, 0x81, 0x95, 0xbf, 0x1f, 0xb8,
- 0x33, 0x49, 0x5e, 0x88, 0x9f, 0xa1, 0xcf, 0x36, 0xf6, 0x34, 0xf8, 0xa9,
- 0x91, 0xde, 0x86, 0xbd, 0xea, 0x9b, 0x82, 0xed, 0x26, 0x87, 0xd5, 0x41,
- 0x32, 0x08, 0xb4, 0x65, 0x1f, 0xf6, 0xc1, 0xb7, 0xa1, 0x99, 0xd7, 0x3b,
- 0x93, 0xa5, 0x33, 0x7a, 0x0f, 0x07, 0x66, 0x2c, 0x92, 0x96, 0xfd, 0x82,
- 0xbd, 0x93, 0xb7, 0xb0, 0xcd, 0x37, 0xa4, 0x9b, 0xe2, 0xc1, 0x1d, 0xe6,
- 0x9a, 0xa2, 0x68, 0xd5, 0x61, 0x86, 0xe0, 0x57, 0xc7, 0x17, 0xbb, 0x52,
- 0xe8, 0x6a, 0xe7, 0x07, 0x4f, 0x97, 0xa8, 0x3d, 0xa9, 0xd5, 0xcc, 0xb4,
- 0xb4, 0x95, 0x81, 0xdc, 0x8c, 0xf6, 0xbc, 0x48, 0x8b, 0x68, 0x09, 0x1b,
- 0x69, 0xb4, 0xaf, 0xcc, 0x76, 0x10, 0x1f, 0x56, 0x8e, 0xac, 0xde, 0x13,
- 0xaf, 0x7f, 0x0e, 0xe3, 0x32, 0x9d, 0x7f, 0xb8, 0xc0, 0x80, 0xaf, 0x8f,
- 0x4f, 0x8f, 0x2f, 0x8e, 0xbb, 0x96, 0xfb, 0x84, 0xc1, 0x2c, 0x51, 0xea,
- 0xd2, 0x64, 0xd3, 0xab, 0xa2, 0x5c, 0x94, 0x97, 0xb9, 0x34, 0x7c, 0x4d,
- 0xbe, 0xcb, 0x26, 0xaf, 0x5f, 0x7e, 0x4b, 0xfa, 0x04, 0x79, 0x9c, 0xce,
- 0xdf, 0x9f, 0x9d, 0xbf, 0x39, 0x79, 0xf7, 0x7a, 0x90, 0xbc, 0x3a, 0x3b,
- 0xff, 0xcb, 0x20, 0x79, 0x7b, 0xf6, 0xed, 0x71, 0x24, 0xc5, 0x99, 0x10,
- 0x6e, 0x03, 0x8a, 0xb1, 0xad, 0xfa, 0x58, 0x9c, 0xb1, 0xe9, 0x8d, 0x36,
- 0xef, 0x1d, 0x31, 0x42, 0x35, 0x00, 0x75, 0x29, 0xfc, 0xd6, 0xec, 0xdd,
- 0x20, 0xf9, 0xfa, 0xf8, 0xe5, 0xeb, 0x41, 0x00, 0x60, 0x3e, 0xe6, 0x55,
- 0xd1, 0xea, 0xec, 0x92, 0x01, 0x7b, 0xcd, 0xd6, 0x07, 0x74, 0x04, 0x0e,
- 0x72, 0xf1, 0x95, 0x35, 0x04, 0x8b, 0x22, 0xfd, 0x59, 0x5f, 0xe6, 0x84,
- 0x20, 0xf1, 0xf7, 0xb6, 0x58, 0x6e, 0x95, 0x5d, 0x40, 0x5d, 0xf3, 0x15,
- 0x6d, 0x81, 0x6b, 0x42, 0x66, 0xbd, 0xd6, 0x61, 0xd9, 0xe3, 0xee, 0x41,
- 0x0c, 0x1a, 0xb4, 0x90, 0x02, 0xc0, 0x8e, 0xd8, 0xf5, 0x98, 0x4a, 0x47,
- 0x43, 0xf4, 0x2c, 0x32, 0x66, 0x12, 0x69, 0xd5, 0x73, 0x87, 0x12, 0x1b,
- 0xd7, 0xb0, 0x55, 0x45, 0x28, 0x15, 0x4c, 0x5d, 0x80, 0x9b, 0x68, 0xfb,
- 0x74, 0x8b, 0x6c, 0x53, 0xcf, 0xef, 0xf9, 0xc7, 0x2a, 0x63, 0x83, 0x4a,
- 0xeb, 0xb9, 0x21, 0xcc, 0x8c, 0x53, 0xa6, 0x70, 0x46, 0xce, 0x2d, 0x90,
- 0x0c, 0x4f, 0xd4, 0x29, 0xb1, 0x49, 0xc1, 0x92, 0xcb, 0x22, 0x8e, 0x19,
- 0x00, 0x45, 0xa9, 0xc3, 0xaa, 0xcd, 0x23, 0xf4, 0x12, 0xea, 0xbd, 0x9b,
- 0x07, 0x7c, 0x8d, 0xf4, 0x7d, 0x7b, 0xc6, 0x03, 0xdb, 0x4f, 0x5b, 0x9c,
- 0x38, 0xfe, 0xbe, 0x20, 0xfb, 0xb6, 0xed, 0xcf, 0x32, 0x12, 0x36, 0x10,
- 0x2e, 0xf4, 0x98, 0xe1, 0x24, 0x85, 0x38, 0x44, 0x29, 0xf0, 0x36, 0x64,
- 0x4b, 0xda, 0xcf, 0xf9, 0xb5, 0x4d, 0x76, 0x45, 0x35, 0xd5, 0x29, 0x04,
- 0x21, 0x2a, 0x2c, 0xd4, 0x6f, 0x31, 0xe9, 0x0e, 0xfe, 0x68, 0xff, 0xd6,
- 0xf9, 0xd8, 0x49, 0x97, 0xa8, 0x93, 0xa1, 0xe0, 0x7d, 0xa3, 0x78, 0x2f,
- 0xd8, 0xba, 0x9d, 0x37, 0x3d, 0x8c, 0xd1, 0xf7, 0xda, 0xda, 0x8a, 0x7e,
- 0x9b, 0x6d, 0x7e, 0x7a, 0x62, 0xae, 0x43, 0x04, 0x1a, 0x67, 0x56, 0xa2,
- 0x71, 0x34, 0xd2, 0x0c, 0x72, 0x15, 0x25, 0x34, 0x56, 0xf8, 0x61, 0x6a,
- 0xa4, 0x1e, 0xfd, 0x32, 0x3a, 0xac, 0xdf, 0xf3, 0xe9, 0xe0, 0xcc, 0xde,
- 0x1f, 0x5f, 0xbc, 0x1f, 0x25, 0x3b, 0x3e, 0xe6, 0xeb, 0x93, 0xd1, 0x7e,
- 0x18, 0xb4, 0xa1, 0x26, 0xee, 0xbb, 0x89, 0xf7, 0x59, 0xf7, 0x5d, 0xf4,
- 0x77, 0xdf, 0xfc, 0xdd, 0x30, 0x8f, 0xd8, 0x43, 0x7a, 0xda, 0x8f, 0x7d,
- 0xcf, 0x6f, 0x14, 0xdf, 0x5a, 0x25, 0xfd, 0x62, 0xc3, 0xd7, 0xbe, 0x3e,
- 0x3e, 0x3d, 0x0f, 0x57, 0xf9, 0xed, 0xfb, 0x37, 0x7f, 0x69, 0xaf, 0xf2,
- 0xe8, 0x51, 0xe4, 0xab, 0xbf, 0xa4, 0x43, 0x3d, 0xab, 0xcb, 0x85, 0xd1,
- 0x57, 0x50, 0xc5, 0x81, 0x22, 0x8e, 0xe7, 0x46, 0x00, 0x50, 0xae, 0xf9,
- 0x5f, 0x07, 0xf2, 0x97, 0x1f, 0x47, 0xa3, 0xd1, 0x9f, 0x42, 0x54, 0x74,
- 0xf8, 0x68, 0xdc, 0x7a, 0xe5, 0xe1, 0xae, 0x09, 0x8e, 0xaa, 0x19, 0x94,
- 0x09, 0x51, 0xe4, 0x62, 0x95, 0xe6, 0x15, 0x95, 0x3c, 0xc6, 0x04, 0x2e,
- 0xad, 0xc8, 0x15, 0x7a, 0x59, 0x6d, 0x4e, 0x00, 0xc1, 0xf8, 0xb2, 0xee,
- 0xd4, 0xbb, 0x52, 0x55, 0xed, 0xd5, 0x93, 0xa4, 0xb3, 0xc0, 0x11, 0xc2,
- 0xcd, 0x51, 0xf0, 0xd9, 0x8a, 0x1c, 0xb4, 0xac, 0x68, 0x3a, 0x41, 0x5b,
- 0xa8, 0xf0, 0x90, 0xe5, 0xcf, 0xec, 0xf4, 0x63, 0xde, 0x0b, 0xae, 0x93,
- 0x7c, 0x25, 0x11, 0x75, 0xd8, 0x5f, 0x90, 0x28, 0xe8, 0x33, 0x9b, 0x35,
- 0xd3, 0x3d, 0x5a, 0x64, 0x1d, 0xf4, 0x42, 0x62, 0x25, 0x2e, 0x74, 0x22,
- 0x09, 0xd6, 0x8a, 0x57, 0x42, 0xcb, 0xd9, 0x2d, 0x5e, 0x4d, 0x82, 0xab,
- 0xe2, 0xf5, 0x74, 0x75, 0x75, 0x8e, 0xc4, 0x7a, 0xb8, 0xe8, 0x76, 0xdb,
- 0xca, 0x11, 0xa0, 0xa7, 0x95, 0x75, 0xd3, 0x3a, 0x78, 0x7a, 0x9b, 0x6c,
- 0x40, 0x6a, 0xf4, 0xcd, 0x85, 0x6a, 0xa1, 0xda, 0x0f, 0xee, 0xac, 0x94,
- 0x44, 0x79, 0x14, 0x40, 0x1f, 0x9f, 0xb7, 0x7c, 0x2e, 0xea, 0xa1, 0xf3,
- 0xcf, 0x5c, 0x5b, 0x9f, 0x47, 0x30, 0x9c, 0x04, 0x49, 0x5c, 0x0d, 0x78,
- 0x5a, 0x68, 0x28, 0x0f, 0xff, 0xdc, 0xaa, 0x32, 0xdf, 0xfe, 0xaf, 0xdb,
- 0xa4, 0x0a, 0xe3, 0xed, 0x68, 0x6d, 0xbb, 0xd2, 0x2d, 0x19, 0x36, 0x78,
- 0x2c, 0xa2, 0x37, 0xb8, 0x5d, 0x51, 0xda, 0xb3, 0xe9, 0x52, 0x96, 0x7a,
- 0x64, 0x09, 0xa3, 0xe4, 0xbb, 0x7c, 0x31, 0x9b, 0xa6, 0x15, 0xd2, 0xc3,
- 0x42, 0xf1, 0x2a, 0x54, 0x82, 0xeb, 0x54, 0x97, 0xf8, 0xaa, 0xbb, 0x3b,
- 0xda, 0x4b, 0x26, 0x4e, 0xf3, 0xb1, 0xa2, 0x1f, 0x7b, 0x1e, 0x14, 0xfc,
- 0xee, 0x69, 0xda, 0x25, 0xf4, 0xa3, 0x7b, 0x4c, 0xd2, 0xae, 0xdd, 0xc2,
- 0xa3, 0x7d, 0xb4, 0x1a, 0x87, 0x18, 0x3e, 0x0a, 0x63, 0x29, 0xf9, 0xea,
- 0xfa, 0x11, 0xdc, 0x57, 0x4f, 0x06, 0xfc, 0xaf, 0x27, 0x0c, 0x0e, 0xd9,
- 0x58, 0xe1, 0x8e, 0x6d, 0x65, 0x33, 0x86, 0xb5, 0xfe, 0x93, 0x73, 0xad,
- 0x70, 0xed, 0xf2, 0xc4, 0xb1, 0x44, 0x21, 0x05, 0x1f, 0xc1, 0xcc, 0x52,
- 0x0d, 0x18, 0xf3, 0x8e, 0xce, 0x96, 0xb6, 0xc4, 0xf0, 0xaf, 0xbf, 0x4e,
- 0x2a, 0x82, 0x1d, 0x69, 0xea, 0x1f, 0x37, 0xd5, 0x13, 0x1b, 0x9d, 0xff,
- 0xe9, 0x28, 0xd2, 0x7e, 0xdb, 0x87, 0x3e, 0x77, 0x5f, 0xb2, 0xf9, 0xbe,
- 0xee, 0x73, 0x94, 0xe1, 0x8f, 0xb0, 0x1d, 0x65, 0xfd, 0x6c, 0xfe, 0xd0,
- 0xb3, 0x0d, 0x1f, 0x9a, 0x03, 0xd8, 0x88, 0xce, 0xd4, 0x1a, 0x00, 0x37,
- 0x4a, 0x15, 0x7e, 0x8d, 0x32, 0xf5, 0xd2, 0x7e, 0x34, 0xda, 0x7f, 0x78,
- 0x86, 0xb2, 0xb3, 0xbe, 0xc9, 0xb3, 0x37, 0x93, 0x9f, 0x80, 0x4c, 0x24,
- 0x45, 0xac, 0xec, 0xa3, 0xb9, 0x8d, 0x9d, 0x31, 0x08, 0x36, 0xa7, 0xc5,
- 0xcb, 0xcd, 0xfa, 0x51, 0x22, 0x54, 0x19, 0xe3, 0xb0, 0x0e, 0x76, 0xe0,
- 0xc4, 0xd3, 0xee, 0xf5, 0x26, 0xf0, 0x69, 0x53, 0xea, 0x08, 0x7e, 0x4c,
- 0xf8, 0x0b, 0xca, 0xe7, 0x8e, 0xa9, 0x8e, 0xe9, 0xfd, 0xf1, 0x9b, 0x0f,
- 0xe3, 0xe3, 0xd7, 0x80, 0xdb, 0x8c, 0xf5, 0x53, 0xca, 0xe9, 0x46, 0x73,
- 0x64, 0xa2, 0x29, 0x59, 0xa9, 0x94, 0x89, 0xb4, 0x1b, 0x0e, 0x72, 0x8f,
- 0x4c, 0x28, 0x64, 0x4d, 0x69, 0x0c, 0xe3, 0xb0, 0xee, 0x84, 0x55, 0x39,
- 0x79, 0xf7, 0x27, 0xe0, 0x8e, 0xf0, 0xaa, 0x67, 0x19, 0x35, 0xe7, 0x7a,
- 0xc1, 0x59, 0x30, 0x01, 0xa8, 0xda, 0x5b, 0x2f, 0x8b, 0xbd, 0x5e, 0x64,
- 0xd9, 0x4a, 0x83, 0xfe, 0x5e, 0x37, 0x79, 0x73, 0x3e, 0xea, 0x0f, 0x84,
- 0xf7, 0x19, 0xe3, 0xb2, 0xfa, 0x96, 0xf6, 0x74, 0x92, 0x82, 0xd3, 0x87,
- 0xf2, 0xd5, 0x1d, 0x60, 0x40, 0x77, 0x53, 0x76, 0xf2, 0xc6, 0xaa, 0xf5,
- 0x0a, 0x3f, 0x1e, 0x74, 0xd5, 0x63, 0x38, 0x72, 0x42, 0xe8, 0x31, 0x86,
- 0x11, 0x63, 0x55, 0x92, 0x96, 0x7a, 0x59, 0x56, 0x66, 0xd0, 0xa5, 0x2d,
- 0x56, 0x64, 0x44, 0x87, 0x7a, 0xb7, 0xdb, 0xca, 0xb1, 0x6b, 0xb6, 0x93,
- 0x2d, 0x81, 0x08, 0x78, 0xc6, 0xf5, 0xdb, 0xc4, 0x15, 0x78, 0x9b, 0xe0,
- 0x31, 0xa1, 0xe8, 0x20, 0x8b, 0xb4, 0xb1, 0x54, 0x5d, 0x63, 0x2f, 0x78,
- 0x07, 0x43, 0x73, 0x93, 0xba, 0x8e, 0x74, 0x9d, 0x39, 0xaa, 0xba, 0x6b,
- 0x34, 0x40, 0xa7, 0x4e, 0x33, 0xff, 0x2d, 0xbb, 0xb9, 0x1d, 0x1c, 0xc6,
- 0x6e, 0xc0, 0x32, 0xbd, 0x85, 0x8b, 0xaa, 0x97, 0x1c, 0xc4, 0x61, 0x4b,
- 0x1b, 0x42, 0xcf, 0x55, 0xcc, 0xf3, 0xc1, 0x61, 0x5d, 0xe9, 0x0b, 0x27,
- 0x26, 0xd9, 0xa3, 0x16, 0xff, 0x15, 0x19, 0xde, 0x61, 0xe8, 0x11, 0x50,
- 0x59, 0x32, 0x67, 0x78, 0x09, 0x53, 0x5a, 0x24, 0xd9, 0x6f, 0x3b, 0xdc,
- 0x58, 0x0a, 0x1f, 0xdb, 0xa5, 0x1f, 0x2f, 0x4a, 0x8a, 0x51, 0x2a, 0x31,
- 0xe0, 0xf3, 0x21, 0x64, 0x1f, 0x99, 0x09, 0x15, 0x51, 0x21, 0x32, 0xf0,
- 0x6c, 0xe2, 0x0d, 0x9a, 0xd9, 0xa0, 0x58, 0x8c, 0xf0, 0xcb, 0xd8, 0x05,
- 0x36, 0xb7, 0x3e, 0xb4, 0x4a, 0xde, 0x0c, 0x72, 0x58, 0x75, 0x9c, 0x8c,
- 0x07, 0x18, 0xb4, 0x61, 0x95, 0x65, 0xda, 0xa8, 0xcd, 0x84, 0x9f, 0x80,
- 0x7b, 0xa9, 0x69, 0x8d, 0x7c, 0x44, 0x55, 0x63, 0xb0, 0x01, 0x72, 0x35,
- 0xa2, 0xb6, 0x89, 0x56, 0x04, 0x43, 0x33, 0x2d, 0xfc, 0xc9, 0xe2, 0x04,
- 0xcc, 0x20, 0x79, 0x39, 0x43, 0x55, 0x14, 0x77, 0xe2, 0xe9, 0x81, 0x8f,
- 0x91, 0xd9, 0x6c, 0x93, 0xab, 0xf2, 0x36, 0x5f, 0xae, 0x97, 0x78, 0x7d,
- 0xc0, 0x06, 0xd8, 0x92, 0xa4, 0x96, 0x1e, 0x2a, 0xb2, 0x0b, 0x6d, 0xdb,
- 0xaf, 0x98, 0x33, 0x83, 0x58, 0x1b, 0x88, 0xb6, 0xe1, 0x94, 0x1f, 0x7a,
- 0x8b, 0x5b, 0x6c, 0xe0, 0xa0, 0xfe, 0x97, 0xd3, 0x67, 0xf2, 0xc2, 0x28,
- 0x74, 0x7f, 0x8a, 0x44, 0xa3, 0x53, 0x9f, 0xa7, 0x0a, 0xff, 0x00, 0x65,
- 0x52, 0xaa, 0x73, 0x36, 0xf3, 0x4c, 0x49, 0xa6, 0x38, 0xd2, 0xc4, 0xf8,
- 0x90, 0x7a, 0x39, 0xd4, 0xc0, 0x3a, 0xbe, 0x85, 0xdc, 0x69, 0xa1, 0xce,
- 0xf7, 0xcb, 0x42, 0x49, 0x88, 0x9e, 0xce, 0x4d, 0x3a, 0x8f, 0x04, 0x32,
- 0x5f, 0xe1, 0x19, 0x40, 0xb4, 0xf2, 0xbe, 0xf9, 0xfc, 0xbe, 0x24, 0xc5,
- 0x88, 0x7d, 0x4b, 0x1e, 0x73, 0xd9, 0x65, 0x75, 0x63, 0xb5, 0x7b, 0x85,
- 0xd8, 0x70, 0x20, 0xd8, 0x06, 0x31, 0xb2, 0x0e, 0xbb, 0x64, 0xb5, 0x94,
- 0xa1, 0x90, 0x9e, 0x13, 0x3b, 0xe5, 0xb3, 0x1b, 0x70, 0xb2, 0x26, 0x32,
- 0x34, 0x1f, 0xdd, 0xde, 0x06, 0x14, 0xee, 0x19, 0xc4, 0x8c, 0x37, 0xc9,
- 0xd6, 0xf2, 0xa3, 0x7d, 0x94, 0x39, 0x3e, 0xbe, 0xed, 0x18, 0xcd, 0xa3,
- 0x38, 0x38, 0x24, 0xcb, 0x07, 0x62, 0x91, 0x93, 0x92, 0xa3, 0x70, 0xbc,
- 0x69, 0x69, 0x64, 0x3b, 0x99, 0x3b, 0xdc, 0xa4, 0x39, 0x08, 0x22, 0x48,
- 0x6d, 0x40, 0x2e, 0xa6, 0x6d, 0xf6, 0xaa, 0x51, 0x52, 0x34, 0x2d, 0x34,
- 0x9a, 0x3f, 0x6d, 0xa5, 0xee, 0x93, 0xcd, 0x03, 0x98, 0x95, 0x6b, 0x40,
- 0x61, 0x84, 0xdb, 0x45, 0x5f, 0xe1, 0xdd, 0xa7, 0x2b, 0x65, 0xe4, 0x55,
- 0xbe, 0xa0, 0xd7, 0xf8, 0x62, 0xd7, 0xc9, 0x81, 0x39, 0x85, 0xbc, 0x58,
- 0x37, 0x16, 0xae, 0x0f, 0xdf, 0xb4, 0xb0, 0x33, 0x91, 0xdd, 0x5f, 0x20,
- 0xd1, 0x57, 0x2b, 0xe0, 0xe9, 0xf6, 0xd5, 0x5e, 0x74, 0x90, 0x6f, 0x09,
- 0x34, 0x72, 0xdb, 0xd3, 0xd9, 0x97, 0xb2, 0x31, 0x57, 0x91, 0x0d, 0xc3,
- 0x8a, 0x5c, 0xcd, 0x6e, 0xcd, 0x6e, 0x33, 0x8a, 0x92, 0x27, 0xd8, 0xac,
- 0x48, 0x1b, 0x79, 0x5d, 0x28, 0x22, 0x99, 0x3f, 0x2d, 0x26, 0x6e, 0x9b,
- 0x78, 0x81, 0xcf, 0x95, 0x8d, 0x5c, 0x49, 0xdb, 0x7c, 0x8d, 0xb5, 0xb6,
- 0xf8, 0xd5, 0xe6, 0xfe, 0x69, 0x82, 0x57, 0xf3, 0xe4, 0x89, 0xad, 0x05,
- 0xe6, 0x34, 0xce, 0x72, 0x69, 0x73, 0x36, 0x99, 0xb0, 0xdf, 0xe3, 0xcb,
- 0x2f, 0x29, 0x62, 0xfc, 0x3c, 0x89, 0x69, 0x64, 0x4c, 0x42, 0x0a, 0x4b,
- 0x6d, 0x78, 0x2f, 0x98, 0x01, 0x7c, 0xf6, 0x99, 0x02, 0x72, 0x13, 0x54,
- 0x37, 0x5f, 0x55, 0xc2, 0xb2, 0x87, 0xfb, 0x1d, 0x46, 0x5c, 0x76, 0x1b,
- 0x72, 0xe6, 0x98, 0xaa, 0xf3, 0x1b, 0xb2, 0xa3, 0x3a, 0x25, 0xf8, 0xc9,
- 0x75, 0x73, 0xf5, 0x8f, 0x7c, 0x16, 0x85, 0x52, 0xa2, 0xbb, 0x60, 0x7e,
- 0x6d, 0x0e, 0xad, 0x66, 0xef, 0x97, 0x62, 0x9b, 0x26, 0x3b, 0xf2, 0xda,
- 0xee, 0x20, 0x99, 0xad, 0xe1, 0x92, 0x1b, 0xbf, 0x1c, 0x9f, 0x26, 0xe7,
- 0xa7, 0x2f, 0x4f, 0xde, 0x99, 0x77, 0x86, 0xa1, 0x91, 0x6a, 0x11, 0xcb,
- 0x06, 0x49, 0xb7, 0xc7, 0x18, 0xfc, 0x9d, 0x6d, 0x54, 0xb3, 0xf6, 0x87,
- 0x42, 0x4c, 0xa3, 0x19, 0x84, 0x69, 0xab, 0xf6, 0x60, 0xb8, 0xd6, 0x8c,
- 0xa7, 0x3e, 0x54, 0x1d, 0xbb, 0xa5, 0x9a, 0x26, 0x23, 0x79, 0xa8, 0x5e,
- 0x98, 0x51, 0xee, 0xa2, 0x11, 0x5b, 0xd7, 0x0a, 0x5d, 0x11, 0x5b, 0x8d,
- 0x59, 0xb9, 0x03, 0x6d, 0xe5, 0xc9, 0x9b, 0x39, 0x71, 0xcf, 0x2c, 0x43,
- 0x16, 0xde, 0xd8, 0x40, 0x77, 0xeb, 0xe4, 0xb9, 0xc6, 0x9b, 0x7d, 0x23,
- 0x9f, 0x93, 0x72, 0x43, 0x65, 0x97, 0x44, 0xc6, 0x7a, 0x19, 0xf9, 0x29,
- 0xca, 0x86, 0x13, 0x6b, 0xa4, 0xa1, 0x6a, 0x69, 0xbb, 0x0e, 0x24, 0xf4,
- 0xa4, 0xbc, 0x1d, 0x28, 0x08, 0x0d, 0x96, 0x80, 0xea, 0x26, 0x97, 0xe3,
- 0x70, 0x69, 0xd8, 0x19, 0xa0, 0xa8, 0x78, 0xbc, 0xa6, 0x64, 0x94, 0x5e,
- 0x02, 0xdf, 0x0d, 0x0b, 0x06, 0x96, 0x46, 0xbf, 0x35, 0x03, 0xfa, 0x7e,
- 0xd1, 0x4d, 0x34, 0xf6, 0xa4, 0xd3, 0xcb, 0x1b, 0x34, 0x96, 0x77, 0x75,
- 0x9c, 0x63, 0xe4, 0xd8, 0xda, 0x1c, 0x39, 0xcb, 0x9d, 0xcd, 0x10, 0xa0,
- 0xa3, 0x36, 0x35, 0x6c, 0x04, 0x60, 0x3f, 0xe8, 0x7c, 0xef, 0x61, 0x28,
- 0xb1, 0x3f, 0x19, 0x24, 0x96, 0x51, 0xbb, 0xfb, 0x1a, 0x5f, 0xd6, 0xcf,
- 0xf1, 0x71, 0x87, 0x45, 0x1d, 0x4c, 0x85, 0x71, 0xbd, 0x50, 0xcb, 0xc4,
- 0x1d, 0x4a, 0xd9, 0xb1, 0x14, 0xc1, 0xfe, 0x9a, 0xed, 0x49, 0x6a, 0xdc,
- 0x7d, 0x19, 0x26, 0x0c, 0x3d, 0xab, 0x2b, 0x1f, 0x13, 0xf5, 0x53, 0x07,
- 0xdf, 0x61, 0x0c, 0xc6, 0xca, 0x26, 0xcb, 0x8a, 0x9d, 0x55, 0xe3, 0x69,
- 0x4a, 0x94, 0x6b, 0x84, 0xd2, 0xac, 0x1c, 0xa7, 0x31, 0x5c, 0xbe, 0x19,
- 0x35, 0x40, 0x08, 0xdb, 0x25, 0x70, 0x1a, 0xc2, 0x9c, 0x9b, 0xa4, 0xea,
- 0x0c, 0xbc, 0x31, 0x03, 0x3e, 0xcc, 0x3d, 0x34, 0xaa, 0xe4, 0xef, 0xeb,
- 0x3c, 0x6b, 0x50, 0x8c, 0x38, 0x4a, 0x5e, 0x73, 0xba, 0xa4, 0x74, 0x1a,
- 0xe5, 0x8e, 0xc6, 0x68, 0x7b, 0xcc, 0x10, 0x00, 0xfc, 0x7d, 0x9a, 0x40,
- 0xc0, 0x87, 0xcd, 0x84, 0x50, 0xe5, 0xfa, 0x16, 0xb3, 0x4e, 0x5e, 0xd1,
- 0xb4, 0x97, 0x46, 0x02, 0x02, 0x83, 0xc9, 0x43, 0xd7, 0xd3, 0x7c, 0x1a,
- 0xad, 0x70, 0x41, 0x12, 0x77, 0xfd, 0x29, 0xac, 0x61, 0x19, 0xb4, 0x3a,
- 0xb5, 0xc1, 0x97, 0x22, 0x7c, 0xa9, 0xa1, 0x36, 0x7f, 0x45, 0xba, 0xd8,
- 0xab, 0x9b, 0x19, 0x69, 0x05, 0xeb, 0x62, 0x41, 0xf3, 0xa4, 0x91, 0x7a,
- 0xfa, 0x86, 0x46, 0x70, 0xa8, 0x80, 0x83, 0x43, 0x27, 0xd4, 0x3a, 0x22,
- 0xc9, 0x6d, 0xe9, 0xcb, 0x80, 0xf0, 0xb2, 0x9b, 0x42, 0x50, 0x2c, 0x7f,
- 0xb7, 0x88, 0xe9, 0xf0, 0x7a, 0xb1, 0x97, 0xad, 0x73, 0xdb, 0x04, 0x11,
- 0x72, 0x4d, 0xe7, 0x65, 0x08, 0x6d, 0x52, 0xd6, 0x0a, 0x9e, 0x6e, 0x16,
- 0x69, 0x5e, 0x6f, 0xdd, 0x27, 0x40, 0xd0, 0xdd, 0x8b, 0xf2, 0xd3, 0xf6,
- 0xaa, 0x71, 0xbf, 0xf4, 0x7b, 0xe1, 0x7d, 0xf8, 0x8d, 0xb0, 0xc9, 0xfc,
- 0x4f, 0x06, 0xf8, 0x89, 0x23, 0x98, 0x91, 0x93, 0xc5, 0x26, 0x05, 0x4b,
- 0xb6, 0x5f, 0x0b, 0xed, 0x86, 0x73, 0x21, 0xee, 0x22, 0x2d, 0x3a, 0x0d,
- 0x31, 0xad, 0x05, 0x1b, 0x64, 0xba, 0x30, 0x4a, 0x50, 0xc4, 0x11, 0xa3,
- 0xbd, 0x59, 0x09, 0x06, 0x6f, 0xd0, 0x15, 0xd9, 0xf5, 0x9a, 0x34, 0xf3,
- 0xc5, 0x9a, 0xbe, 0xcc, 0x08, 0x72, 0x16, 0xc1, 0x4c, 0x21, 0x0d, 0xa2,
- 0xa8, 0x7f, 0x16, 0x27, 0x88, 0xee, 0xa8, 0x07, 0x80, 0xa8, 0x98, 0xbe,
- 0x16, 0x1b, 0xb0, 0x0b, 0xa2, 0x37, 0xea, 0x99, 0x1d, 0x79, 0x4b, 0x78,
- 0x98, 0x4c, 0x00, 0x56, 0x3d, 0xc7, 0x14, 0x15, 0x79, 0xe9, 0x74, 0x04,
- 0x21, 0x50, 0xba, 0xfe, 0xc4, 0x50, 0xdd, 0x6c, 0xca, 0x44, 0x6b, 0x66,
- 0xaa, 0x9f, 0x28, 0x82, 0x00, 0x0a, 0x2f, 0x7c, 0x14, 0x40, 0x72, 0x38,
- 0x17, 0x41, 0x3c, 0x10, 0x1d, 0x50, 0xd1, 0x58, 0x10, 0x3c, 0x87, 0xd5,
- 0x69, 0x29, 0x22, 0xab, 0xf5, 0xee, 0xb5, 0xa6, 0xa4, 0xca, 0x74, 0x24,
- 0x83, 0x9f, 0x5f, 0xda, 0x51, 0x90, 0x1e, 0xbc, 0xb6, 0xdb, 0x8a, 0x9b,
- 0x95, 0x2d, 0x18, 0xea, 0xdf, 0x54, 0xe7, 0x7a, 0xdc, 0x6e, 0xa8, 0x27,
- 0x90, 0x8e, 0x3f, 0xeb, 0x42, 0xa5, 0x0f, 0xbb, 0x51, 0x3d, 0xd5, 0x36,
- 0xff, 0x6f, 0xde, 0xa8, 0x34, 0x79, 0xd8, 0x9d, 0x4a, 0xbb, 0x97, 0x2a,
- 0x64, 0x4b, 0xb7, 0xbd, 0x33, 0xfe, 0x05, 0x6f, 0x19, 0x5f, 0xb3, 0x9f,
- 0x74, 0xcf, 0x94, 0x28, 0xfe, 0x5f, 0xbe, 0x65, 0x9f, 0x77, 0xb4, 0x40,
- 0xe0, 0xa3, 0x3e, 0xb0, 0x6f, 0x25, 0x69, 0xc7, 0xa4, 0x6b, 0xed, 0x59,
- 0x28, 0xc3, 0x78, 0xe3, 0x13, 0x86, 0xde, 0x8a, 0x85, 0x2e, 0x4b, 0x3d,
- 0xd9, 0xc7, 0x96, 0xe7, 0x29, 0xec, 0xc0, 0xc6, 0x81, 0x43, 0xe7, 0xad,
- 0x02, 0x44, 0x23, 0xc7, 0xdb, 0xb6, 0x3a, 0x4d, 0xa4, 0x89, 0x8a, 0x2c,
- 0xeb, 0xd2, 0x88, 0xf6, 0x55, 0x9e, 0x70, 0xa7, 0x76, 0x43, 0x80, 0x5f,
- 0x8d, 0xc7, 0xc3, 0x97, 0xe7, 0x27, 0xf7, 0xd8, 0x5d, 0xc0, 0x85, 0x71,
- 0x93, 0x8c, 0xd9, 0xcb, 0xfd, 0x69, 0x58, 0xed, 0x4f, 0x1b, 0x45, 0xb7,
- 0xbb, 0xad, 0x2f, 0xeb, 0x56, 0x92, 0xb1, 0x4e, 0xc9, 0x36, 0xdc, 0x20,
- 0x65, 0x5b, 0x31, 0x97, 0x91, 0x47, 0x41, 0xbe, 0x1a, 0xe2, 0x32, 0xfc,
- 0x44, 0x90, 0x93, 0x0d, 0x84, 0x1d, 0x80, 0xe3, 0x24, 0x07, 0xcf, 0x9e,
- 0x1c, 0x98, 0x6b, 0x71, 0xc7, 0xc0, 0x8f, 0xf2, 0xfe, 0xa3, 0xd1, 0xd1,
- 0xde, 0xa3, 0xd1, 0x23, 0xe2, 0x6a, 0x2e, 0x5a, 0x2a, 0xe3, 0x1b, 0x6e,
- 0x17, 0xc9, 0x4a, 0xa2, 0x69, 0xbd, 0x3b, 0x7e, 0x95, 0x70, 0xe2, 0x2a,
- 0x60, 0x00, 0x3b, 0x36, 0x57, 0xc2, 0xc9, 0x33, 0xc4, 0x48, 0x47, 0xea,
- 0x26, 0x66, 0x62, 0x0d, 0x9c, 0x14, 0xc1, 0x76, 0x24, 0x6a, 0x4b, 0x00,
- 0x98, 0xa2, 0xb0, 0x33, 0x21, 0x7e, 0xc7, 0x66, 0x85, 0xec, 0x8c, 0xf9,
- 0x4d, 0x58, 0x81, 0xe6, 0xed, 0x89, 0xb7, 0x63, 0xf7, 0xa4, 0x97, 0x3f,
- 0xea, 0x3f, 0x1f, 0x35, 0x5f, 0x7a, 0x0c, 0x20, 0xe7, 0xb9, 0x0f, 0xec,
- 0x1c, 0xe1, 0x87, 0xd6, 0x28, 0xad, 0x93, 0x6a, 0xba, 0xb4, 0x26, 0xc9,
- 0xfc, 0xef, 0xb3, 0x62, 0xf4, 0x53, 0xed, 0xa9, 0x88, 0x42, 0xdc, 0x36,
- 0x9b, 0x78, 0xee, 0xc2, 0xa8, 0xc5, 0x5c, 0xea, 0x5b, 0x11, 0x9b, 0x48,
- 0x5d, 0x0f, 0x19, 0x08, 0x80, 0xee, 0x32, 0x1b, 0x50, 0xde, 0x40, 0x76,
- 0xf4, 0x4d, 0x83, 0x47, 0x0c, 0x72, 0xf7, 0xad, 0xbd, 0x2a, 0x4b, 0x17,
- 0xf2, 0xa2, 0x98, 0x6e, 0x40, 0x0c, 0x0e, 0x7e, 0x39, 0x47, 0x7b, 0xb9,
- 0x3a, 0x00, 0x68, 0x63, 0x84, 0x73, 0x0b, 0x8f, 0xc8, 0x4f, 0xdb, 0x34,
- 0x2d, 0xaf, 0x91, 0x4b, 0x65, 0xc4, 0x49, 0xbe, 0x4a, 0x17, 0xc9, 0x03,
- 0x6a, 0x0b, 0xfa, 0x0f, 0xff, 0x5e, 0x7e, 0xe7, 0xd8, 0x45, 0xc8, 0xe5,
- 0x6c, 0x21, 0xbf, 0x26, 0x90, 0x76, 0xa5, 0xaa, 0x70, 0x90, 0x16, 0x9f,
- 0xeb, 0x19, 0x90, 0x92, 0xdd, 0x85, 0x9d, 0x39, 0x14, 0xa8, 0x6e, 0x02,
- 0x8d, 0xb1, 0x24, 0x15, 0x11, 0x91, 0x1c, 0x72, 0x2e, 0x96, 0xa6, 0x83,
- 0x4a, 0xd5, 0xeb, 0xee, 0x48, 0xcd, 0xa8, 0x4d, 0xcc, 0xdd, 0xb2, 0xc4,
- 0x7b, 0x59, 0xef, 0x2f, 0xc1, 0x0c, 0x49, 0x85, 0x63, 0x3f, 0xc3, 0x4f,
- 0xc5, 0x40, 0xf5, 0x85, 0x45, 0xb2, 0x83, 0x44, 0x10, 0x5b, 0xc5, 0x48,
- 0x3f, 0xd2, 0xd4, 0x82, 0xd0, 0x59, 0x64, 0xa3, 0xc6, 0xbb, 0xa3, 0x87,
- 0x80, 0x45, 0x0f, 0x04, 0x17, 0xda, 0x42, 0x41, 0x07, 0x7c, 0xf6, 0xff,
- 0x09, 0x35, 0xf0, 0x71, 0x62, 0xcf, 0xea, 0x21, 0xda, 0x20, 0x23, 0xab,
- 0x73, 0xbf, 0xf1, 0x00, 0xfa, 0xce, 0x99, 0x5c, 0xff, 0xbf, 0x36, 0xf8,
- 0x7f, 0x92, 0x36, 0xf8, 0x93, 0x6f, 0x69, 0xeb, 0x92, 0x0e, 0x25, 0xb3,
- 0xd9, 0xde, 0x4b, 0x77, 0x13, 0xe3, 0x05, 0x07, 0x8b, 0xbb, 0x07, 0x5e,
- 0xd0, 0xee, 0x0d, 0x4d, 0x42, 0x52, 0xf8, 0x7f, 0xe3, 0x8a, 0x3e, 0xe8,
- 0x66, 0xfe, 0xff, 0xbe, 0x8f, 0xff, 0xdd, 0xee, 0x61, 0xbf, 0x36, 0xb8,
- 0x63, 0x88, 0xec, 0x86, 0xb2, 0xf6, 0xb8, 0xd7, 0x19, 0xec, 0xec, 0x5d,
- 0xa7, 0xf9, 0x50, 0x3d, 0x1e, 0xef, 0xdd, 0xc9, 0xf9, 0xb7, 0x4f, 0x18,
- 0x81, 0x67, 0xdc, 0x4d, 0x66, 0xa9, 0x92, 0xd3, 0xd7, 0x2f, 0xcf, 0x7f,
- 0xc2, 0x6d, 0xff, 0x0b, 0xbc, 0xd0, 0xab, 0x2c, 0x9b, 0x0d, 0x39, 0x6e,
- 0xf8, 0x02, 0xff, 0x88, 0x04, 0xdc, 0x53, 0x8b, 0xb0, 0x01, 0xb2, 0xa5,
- 0x70, 0x62, 0x98, 0xc6, 0x80, 0x97, 0x8d, 0x9a, 0x52, 0x08, 0xe6, 0xcd,
- 0x0a, 0x2d, 0x01, 0x03, 0x1f, 0x4b, 0x59, 0xcc, 0x76, 0xb9, 0xd0, 0x0f,
- 0x5f, 0x06, 0xa9, 0x48, 0xf6, 0x09, 0xdd, 0xef, 0x4b, 0x42, 0xc5, 0xb3,
- 0xc0, 0xa1, 0xde, 0x33, 0x8a, 0x04, 0x1d, 0x4d, 0x86, 0xba, 0x73, 0x4b,
- 0xe1, 0x90, 0x27, 0xa3, 0xd7, 0x1d, 0xed, 0x93, 0xff, 0x1d, 0x5c, 0x24,
- 0x6b, 0x7e, 0x45, 0xb4, 0x8d, 0xee, 0xe7, 0xfb, 0xd2, 0x69, 0x36, 0x6e,
- 0xa5, 0x7f, 0x12, 0xad, 0x1d, 0xa4, 0x08, 0x39, 0x87, 0x0e, 0x83, 0x2e,
- 0xe5, 0xde, 0x37, 0x39, 0x81, 0x84, 0xe7, 0x6b, 0x3f, 0xd1, 0xde, 0xcd,
- 0x93, 0xb9, 0xff, 0x42, 0x60, 0x51, 0xdb, 0x9a, 0xb4, 0xcc, 0x1a, 0xd4,
- 0x49, 0x6b, 0x56, 0xae, 0x62, 0xe0, 0x40, 0xbd, 0xfb, 0xae, 0xb4, 0xe0,
- 0x2f, 0x61, 0x36, 0xa5, 0xf7, 0xee, 0xe6, 0x14, 0xc0, 0xb2, 0x68, 0x2a,
- 0x6a, 0x31, 0xa2, 0xd9, 0x03, 0x8a, 0x34, 0x6f, 0xf8, 0xa2, 0x5f, 0xfb,
- 0x9f, 0xa2, 0x52, 0x20, 0xc1, 0xae, 0x85, 0xed, 0x36, 0xf9, 0x7e, 0x27,
- 0x59, 0x33, 0x1d, 0xb9, 0xb3, 0x05, 0x84, 0xa1, 0xf9, 0xe5, 0xd4, 0x28,
- 0xb9, 0xda, 0x93, 0x7a, 0x90, 0x70, 0x82, 0x07, 0x99, 0x3c, 0x3d, 0xbe,
- 0x0a, 0xcd, 0x84, 0xf9, 0xf5, 0xdb, 0xb3, 0x6d, 0xee, 0x7f, 0x18, 0x42,
- 0x48, 0xa8, 0x79, 0x62, 0xd9, 0x42, 0x6a, 0xd8, 0x19, 0x90, 0x17, 0xd0,
- 0x24, 0x99, 0x02, 0xc1, 0xf3, 0x45, 0x7a, 0x23, 0x45, 0x30, 0x5d, 0x7e,
- 0x3f, 0x3e, 0x3d, 0xe2, 0x8c, 0xdf, 0x8b, 0xd3, 0xb1, 0x8f, 0x9f, 0x5f,
- 0x23, 0x18, 0x8f, 0x0a, 0xc8, 0x3f, 0x1f, 0xbf, 0x1c, 0x5f, 0x8c, 0x22,
- 0x6b, 0x0c, 0x13, 0xa6, 0x5c, 0x41, 0x34, 0x01, 0x9b, 0x2d, 0xd2, 0x3b,
- 0x42, 0xcf, 0x94, 0xba, 0x4a, 0x9a, 0x1b, 0x4f, 0x4d, 0xc7, 0x26, 0x33,
- 0x97, 0x3b, 0xc8, 0x20, 0xe5, 0x2e, 0x4c, 0x49, 0x32, 0x7b, 0x37, 0xc9,
- 0x17, 0xb4, 0x02, 0x33, 0x2d, 0x63, 0x0c, 0x2d, 0xa5, 0x68, 0x02, 0x55,
- 0xfa, 0xe5, 0x82, 0x12, 0x09, 0xe8, 0x3b, 0x6d, 0x4f, 0x04, 0x25, 0x24,
- 0x0b, 0x74, 0x41, 0x7f, 0x21, 0xb2, 0xd1, 0x3b, 0x4a, 0x6a, 0xff, 0x64,
- 0xe7, 0xaa, 0x7b, 0xc5, 0x51, 0x67, 0xaf, 0x61, 0x1f, 0x75, 0xa8, 0x27,
- 0x10, 0x97, 0x30, 0xdd, 0x3b, 0xad, 0x3f, 0x69, 0x64, 0x17, 0x6d, 0x45,
- 0x29, 0x68, 0xbc, 0x31, 0xe7, 0xb4, 0x6b, 0x09, 0x99, 0x83, 0x46, 0x4d,
- 0x3c, 0x55, 0x47, 0x05, 0xc5, 0x11, 0xe4, 0x00, 0x28, 0xb2, 0xc5, 0xee,
- 0x86, 0x13, 0xd7, 0xc4, 0x11, 0xbf, 0xed, 0x29, 0x8d, 0x16, 0xef, 0xb5,
- 0x96, 0x4c, 0xaf, 0x32, 0x23, 0x45, 0x46, 0x1e, 0xb2, 0xc3, 0x83, 0x37,
- 0xe4, 0xb3, 0x00, 0xfe, 0x2f, 0xb2, 0x3d, 0x3f, 0x79, 0x43, 0x1e, 0x3d,
- 0x0a, 0x37, 0xa4, 0xca, 0xfe, 0x3e, 0x8b, 0x61, 0xa1, 0xa3, 0x02, 0x05,
- 0xe5, 0x2f, 0x5c, 0x36, 0xf2, 0x9e, 0x01, 0xdd, 0x69, 0xaa, 0x7b, 0xd4,
- 0xd2, 0x48, 0xf3, 0xe8, 0x1d, 0x98, 0x1e, 0x19, 0xd8, 0x14, 0x80, 0x0c,
- 0xdb, 0xb1, 0x2b, 0xea, 0xa6, 0xd7, 0x7f, 0x33, 0x8f, 0xc3, 0x81, 0x48,
- 0x76, 0xb3, 0x7c, 0x64, 0x23, 0xcb, 0xa2, 0x54, 0x16, 0x34, 0xc6, 0xa1,
- 0x1a, 0x53, 0x7b, 0x77, 0x86, 0xc3, 0x79, 0xb3, 0xb2, 0x0b, 0xdb, 0x48,
- 0x1d, 0xfb, 0xc1, 0x66, 0xf4, 0x2c, 0xfd, 0xa2, 0xd2, 0x06, 0x41, 0x9b,
- 0x57, 0x1f, 0x66, 0x5b, 0x52, 0xd7, 0x1d, 0xed, 0xe4, 0x0e, 0xe0, 0x32,
- 0x69, 0xa3, 0xfe, 0xd0, 0x8d, 0x08, 0x99, 0x07, 0xb6, 0xa5, 0xd5, 0x59,
- 0x5a, 0xd7, 0x2b, 0x2c, 0x5c, 0x83, 0xa3, 0xb2, 0x03, 0x98, 0xa9, 0x14,
- 0x34, 0x04, 0xb7, 0xbd, 0xa0, 0xb2, 0xda, 0xeb, 0x6c, 0x81, 0x72, 0xc3,
- 0xac, 0x98, 0x56, 0x77, 0x2b, 0x1f, 0xbc, 0x7f, 0x76, 0x8f, 0x06, 0x7f,
- 0xcf, 0x09, 0xb4, 0x6a, 0x83, 0x0e, 0x0c, 0xaf, 0xdb, 0x0d, 0xf5, 0xaf,
- 0x54, 0x19, 0x3c, 0x1b, 0x27, 0x50, 0xbc, 0x1b, 0xbf, 0x54, 0x80, 0x0c,
- 0x19, 0x65, 0xdc, 0x8c, 0x9f, 0x29, 0x88, 0x85, 0xc9, 0x3c, 0x74, 0x20,
- 0xd3, 0xd6, 0xda, 0x4a, 0x80, 0x07, 0x9f, 0xfc, 0xe1, 0x80, 0xf7, 0xeb,
- 0xfa, 0x30, 0xe0, 0x09, 0xe3, 0xd3, 0x5d, 0x82, 0xa7, 0xae, 0x08, 0x2e,
- 0xa6, 0xe5, 0x96, 0xa2, 0x0b, 0xab, 0x0d, 0xca, 0x0e, 0xd9, 0x1b, 0xe5,
- 0xb7, 0x6b, 0x66, 0x25, 0x3b, 0x48, 0xa1, 0x42, 0x69, 0x38, 0xdf, 0x75,
- 0x2e, 0xd1, 0x1d, 0x1b, 0xbe, 0xca, 0x79, 0x8d, 0xed, 0x76, 0xaa, 0xb6,
- 0xea, 0x99, 0x9e, 0xbe, 0x3e, 0xec, 0x05, 0xa2, 0x1f, 0xc9, 0xef, 0x51,
- 0xc2, 0x3e, 0xcb, 0x80, 0xe5, 0xae, 0x58, 0x9a, 0x54, 0xc1, 0xc5, 0xd4,
- 0x86, 0xbc, 0x5e, 0xf2, 0x4e, 0x3f, 0x39, 0x78, 0xfa, 0x64, 0x37, 0x1a,
- 0x64, 0x67, 0x62, 0xa2, 0xd2, 0xc6, 0xa6, 0x59, 0x51, 0x81, 0xae, 0x90,
- 0x11, 0xfd, 0xf3, 0x70, 0xe4, 0xef, 0x51, 0xd8, 0xdd, 0xa4, 0x2b, 0x92,
- 0x8a, 0x19, 0x11, 0x04, 0x6d, 0x83, 0x76, 0x7b, 0x20, 0x42, 0xb1, 0x7d,
- 0x62, 0xf5, 0x8e, 0x83, 0x90, 0x43, 0x93, 0x30, 0x40, 0xa2, 0x87, 0x89,
- 0x38, 0x3c, 0xd2, 0x09, 0x1c, 0xf1, 0xcc, 0xbc, 0xf6, 0x9c, 0x3c, 0x53,
- 0xfc, 0x7d, 0xd4, 0xfe, 0x97, 0x1f, 0xcc, 0x74, 0x03, 0xfc, 0xbc, 0x53,
- 0x3e, 0xfa, 0xb5, 0x4f, 0xf9, 0xe8, 0x9e, 0x53, 0x3e, 0x7a, 0xe8, 0x29,
- 0x3f, 0x7d, 0xfc, 0xe4, 0xf3, 0x9f, 0x77, 0xca, 0xde, 0x26, 0xff, 0xaf,
- 0x39, 0x65, 0x8f, 0xcc, 0x7e, 0xde, 0x29, 0x4b, 0x52, 0x48, 0xb7, 0x20,
- 0x53, 0x92, 0x5f, 0xb8, 0x9c, 0x96, 0xb0, 0x34, 0x38, 0x23, 0x99, 0x1f,
- 0x0e, 0x0b, 0xad, 0xa4, 0xfb, 0x24, 0x77, 0xbd, 0x33, 0x6a, 0x58, 0xc4,
- 0xc8, 0x76, 0xc0, 0x1e, 0xd0, 0x6f, 0x57, 0x0b, 0x6a, 0x9e, 0xb6, 0x3d,
- 0xdc, 0xd6, 0xd0, 0xb5, 0x96, 0x4f, 0x2a, 0x2e, 0x16, 0x7f, 0xcd, 0x1c,
- 0xf6, 0x6f, 0x88, 0xaa, 0x16, 0xe6, 0xcc, 0x78, 0x59, 0x4f, 0xed, 0x4d,
- 0xbb, 0x5b, 0x18, 0x33, 0x81, 0x33, 0x90, 0xa2, 0xd9, 0x6f, 0xb5, 0xa6,
- 0x0e, 0x32, 0xb4, 0x93, 0x7a, 0x69, 0x26, 0x46, 0x27, 0x34, 0x22, 0xa0,
- 0xa0, 0x9c, 0x9e, 0xbb, 0x45, 0x26, 0x15, 0xc4, 0xb4, 0x66, 0xf8, 0xe4,
- 0xc9, 0x94, 0xef, 0xba, 0x84, 0xa5, 0x57, 0x90, 0x05, 0xd4, 0xd3, 0x9c,
- 0xa5, 0x91, 0x84, 0x0d, 0x8d, 0x82, 0xd6, 0x9a, 0x0e, 0x76, 0xce, 0x5c,
- 0x14, 0x8e, 0x3b, 0x2c, 0x23, 0x60, 0x3f, 0x9b, 0x12, 0xfc, 0xba, 0x09,
- 0x77, 0x3d, 0xbd, 0x89, 0x62, 0x09, 0x68, 0x41, 0x9b, 0x2a, 0x7b, 0x34,
- 0x0c, 0xb3, 0x66, 0x5b, 0x27, 0xd9, 0xf2, 0x04, 0xd8, 0xc7, 0x54, 0x9b,
- 0x10, 0x14, 0x22, 0xa3, 0x94, 0x5a, 0xd6, 0xa3, 0xbd, 0xa0, 0xbc, 0xd7,
- 0xdb, 0xb9, 0xba, 0xf5, 0x3d, 0x35, 0x33, 0x94, 0x77, 0xde, 0x78, 0x6d,
- 0x31, 0xc5, 0xfa, 0x7b, 0x4d, 0xd3, 0x9d, 0xad, 0x97, 0x2b, 0x85, 0x42,
- 0xa4, 0xf2, 0xa6, 0x1c, 0x69, 0x5c, 0x8a, 0x86, 0xc0, 0x39, 0xd7, 0x11,
- 0x37, 0x9a, 0xad, 0x76, 0xb2, 0x19, 0x6e, 0xec, 0xb3, 0xd2, 0xd3, 0x92,
- 0x7a, 0x7e, 0x5e, 0x01, 0x12, 0xd7, 0x2c, 0x06, 0x5b, 0x90, 0x7a, 0x40,
- 0xf7, 0xcc, 0x4c, 0x7b, 0x96, 0x4d, 0xd6, 0x97, 0x8a, 0x28, 0x60, 0xdb,
- 0xdb, 0xb5, 0x69, 0x12, 0x05, 0x58, 0x84, 0x30, 0x94, 0x0d, 0x38, 0x8d,
- 0x2e, 0x2d, 0xee, 0x42, 0x70, 0x95, 0x86, 0x5a, 0x3b, 0x4e, 0x37, 0x25,
- 0x87, 0x05, 0x4b, 0x07, 0xb1, 0xe7, 0x03, 0x6f, 0xe9, 0xf8, 0x49, 0xeb,
- 0x44, 0x23, 0xad, 0xb3, 0x7c, 0x52, 0x69, 0xa6, 0xab, 0xe1, 0x3c, 0x25,
- 0x68, 0xd2, 0xa0, 0xb0, 0x5c, 0x12, 0x42, 0xe5, 0x0e, 0x5c, 0xbc, 0x3a,
- 0x4f, 0xde, 0xa4, 0xd2, 0x6e, 0x28, 0xd9, 0x31, 0x1c, 0xf8, 0xe9, 0xa3,
- 0x83, 0xa3, 0xdd, 0x8d, 0x7a, 0x78, 0x1b, 0x6e, 0x0b, 0xdf, 0x2a, 0xca,
- 0x58, 0xc2, 0xfa, 0xc5, 0xda, 0x18, 0xcd, 0x02, 0xe3, 0x63, 0x3e, 0xf4,
- 0xf1, 0xdd, 0xd9, 0xeb, 0xe3, 0xd3, 0x97, 0x7f, 0xb1, 0x80, 0x11, 0xb4,
- 0x07, 0x5a, 0x79, 0xfc, 0xd1, 0x58, 0xaf, 0x77, 0x1f, 0xeb, 0xcc, 0x4c,
- 0xb9, 0xd9, 0x39, 0xda, 0x05, 0xb0, 0x43, 0xd0, 0x14, 0xf2, 0x32, 0x6b,
- 0xa1, 0x6d, 0x48, 0xf5, 0xc0, 0x06, 0xc0, 0xa8, 0xb1, 0xed, 0x29, 0xba,
- 0x3f, 0x32, 0xec, 0x59, 0xd2, 0x2e, 0xb9, 0x71, 0x82, 0x23, 0x52, 0xaf,
- 0x73, 0x4a, 0x2a, 0x98, 0x72, 0x02, 0x9d, 0x10, 0xb4, 0x1e, 0x5a, 0x2d,
- 0xf2, 0x69, 0x4e, 0xd6, 0x8a, 0xdc, 0x6a, 0xaa, 0x4a, 0x98, 0xcf, 0xdb,
- 0xb0, 0x94, 0x28, 0xde, 0x45, 0xb9, 0xc2, 0x46, 0x67, 0x5a, 0x9b, 0xf7,
- 0x37, 0x10, 0x16, 0xd9, 0xa2, 0xc8, 0x9a, 0xa1, 0x4c, 0xeb, 0x85, 0xf9,
- 0xf3, 0x8b, 0xeb, 0x74, 0x11, 0x94, 0x84, 0x53, 0x4f, 0x45, 0xa5, 0x4d,
- 0x9b, 0x3c, 0x49, 0x6f, 0x7a, 0x2d, 0x57, 0xc6, 0xb6, 0xf3, 0x88, 0x3e,
- 0x69, 0xae, 0x4a, 0xd0, 0x61, 0xe4, 0xe2, 0xe2, 0x2f, 0xe7, 0xc7, 0x5f,
- 0xbc, 0x20, 0x36, 0xf6, 0x27, 0xaa, 0x3d, 0xa9, 0x5b, 0x5c, 0x2d, 0xa1,
- 0x1e, 0xee, 0xc1, 0x1a, 0xbe, 0x7f, 0x7d, 0x32, 0x3e, 0x3f, 0x3d, 0x7b,
- 0xf5, 0xc5, 0x8b, 0xef, 0xc9, 0xa6, 0x34, 0xc2, 0xe3, 0xce, 0x7b, 0xd7,
- 0xfe, 0xcc, 0x36, 0x51, 0x08, 0x01, 0x45, 0x8e, 0xbf, 0xfb, 0x78, 0xfc,
- 0xee, 0xdb, 0x2f, 0x5e, 0x5c, 0xa7, 0xd5, 0x80, 0xd6, 0xc7, 0x6f, 0xf7,
- 0xb4, 0x2c, 0x6d, 0x91, 0x1a, 0x29, 0xe7, 0x93, 0xc5, 0xa7, 0x3a, 0xff,
- 0x47, 0x96, 0x98, 0xd7, 0x17, 0xeb, 0x10, 0xc6, 0xfc, 0x42, 0xda, 0x60,
- 0x19, 0xe9, 0x4d, 0xe6, 0xd0, 0x9f, 0x4f, 0xbf, 0x21, 0xa8, 0x5c, 0xeb,
- 0x28, 0x5d, 0x72, 0xdf, 0xa5, 0xe4, 0x4f, 0x8f, 0x0f, 0x0e, 0x77, 0x5d,
- 0xb7, 0x4f, 0x40, 0x6d, 0x9b, 0x19, 0x7f, 0x0a, 0xaa, 0xa6, 0xfe, 0xa1,
- 0x90, 0x81, 0xb6, 0x9c, 0xa1, 0x71, 0x16, 0x15, 0x57, 0x1f, 0x88, 0xd7,
- 0x09, 0xc9, 0xf9, 0x0c, 0xe2, 0x53, 0x12, 0x43, 0xa0, 0xac, 0xf5, 0xc0,
- 0xe3, 0x76, 0xf1, 0xc6, 0x03, 0xb9, 0xf9, 0xb3, 0x23, 0x3c, 0x33, 0x1d,
- 0xf1, 0xda, 0x6d, 0x94, 0x8f, 0xbf, 0x62, 0x2c, 0xa7, 0x6b, 0x52, 0x62,
- 0xb3, 0x8d, 0x40, 0x13, 0xfa, 0x89, 0xef, 0xb3, 0x17, 0xf3, 0x46, 0x05,
- 0x58, 0xc9, 0xb0, 0x8c, 0x58, 0xa5, 0x12, 0x9e, 0x62, 0x0a, 0x6c, 0x34,
- 0x88, 0xf3, 0x25, 0x15, 0x1e, 0x53, 0x99, 0x0e, 0x3b, 0x77, 0x3c, 0xd7,
- 0xcd, 0x22, 0xbb, 0x4c, 0xa7, 0x77, 0x89, 0x05, 0x98, 0x96, 0x7c, 0xfb,
- 0x59, 0xf7, 0x76, 0xb2, 0x8f, 0x6f, 0x4a, 0xb6, 0x9c, 0x91, 0xc0, 0x84,
- 0xfb, 0x41, 0x5c, 0x99, 0xb1, 0x54, 0xa8, 0x50, 0x53, 0xfd, 0x3e, 0xad,
- 0xd9, 0x8d, 0x58, 0x5e, 0xd2, 0xa6, 0x76, 0xa5, 0x73, 0x7b, 0x8b, 0x3b,
- 0xd4, 0x47, 0x64, 0x83, 0x5e, 0xc4, 0x1b, 0xf7, 0xf4, 0x51, 0xdb, 0x63,
- 0xfe, 0x0f, 0x5c, 0x72, 0x42, 0xe1, 0x82, 0x53, 0xf6, 0x05, 0xfd, 0xb5,
- 0x17, 0x87, 0x9f, 0xbd, 0x16, 0xdc, 0x6d, 0xda, 0x21, 0x57, 0xda, 0xd2,
- 0x02, 0x69, 0x6c, 0x43, 0xa5, 0xf2, 0x8d, 0xba, 0x80, 0x7b, 0x31, 0xee,
- 0xb4, 0xd2, 0x95, 0x3c, 0xc1, 0xe6, 0x71, 0xdb, 0xeb, 0xaa, 0x67, 0x48,
- 0x5b, 0x9c, 0x19, 0x86, 0x68, 0x50, 0x18, 0x48, 0xa9, 0x08, 0x2f, 0x68,
- 0x20, 0xe2, 0x88, 0xa4, 0x92, 0x98, 0x8d, 0xfa, 0x93, 0x06, 0x7d, 0x52,
- 0x1f, 0x06, 0x08, 0x0f, 0x31, 0x94, 0x0c, 0x29, 0xd1, 0x55, 0x34, 0xbb,
- 0x5d, 0xfd, 0x06, 0x9c, 0xa0, 0x41, 0x01, 0x35, 0x0b, 0x2b, 0x6d, 0x26,
- 0x59, 0xab, 0x56, 0x4a, 0x35, 0x90, 0x30, 0xd2, 0x1d, 0xf0, 0x6c, 0xac,
- 0x4d, 0xab, 0x56, 0xec, 0x29, 0x1c, 0x38, 0xaf, 0x4a, 0x92, 0x11, 0x30,
- 0x9f, 0x9d, 0x25, 0x2d, 0x63, 0x57, 0xca, 0x4a, 0xb8, 0x17, 0x44, 0xd2,
- 0xd7, 0xb0, 0xbd, 0x23, 0xa6, 0xcc, 0xa8, 0x34, 0x06, 0x89, 0x28, 0x23,
- 0xa1, 0x20, 0x93, 0x18, 0x96, 0xa1, 0xb3, 0x1d, 0x91, 0xea, 0xe3, 0x86,
- 0x93, 0xf8, 0xbb, 0x22, 0x8a, 0x40, 0xc5, 0x35, 0x71, 0xbe, 0x35, 0x82,
- 0xdf, 0x8d, 0x6e, 0x67, 0xb8, 0x6b, 0x21, 0x04, 0xf2, 0xc6, 0x2a, 0x6d,
- 0x11, 0xc8, 0x9d, 0xc4, 0x22, 0x9f, 0x5b, 0xe8, 0x36, 0xf6, 0x7d, 0x4a,
- 0xbc, 0x25, 0x13, 0x92, 0xa0, 0xaf, 0xed, 0x71, 0xed, 0xa7, 0xf2, 0xa0,
- 0x3c, 0x2c, 0x3d, 0x0f, 0xc6, 0x2a, 0xb2, 0x1b, 0x7f, 0x2c, 0x67, 0x76,
- 0xd8, 0xf1, 0x7e, 0x4d, 0x6f, 0xb7, 0xb1, 0x99, 0xa8, 0x5e, 0x2d, 0x79,
- 0xf1, 0xed, 0xf1, 0xfb, 0xf1, 0xc9, 0xd9, 0xbb, 0x3f, 0x45, 0xcd, 0x61,
- 0xf9, 0xa5, 0x6d, 0xf4, 0xa6, 0x95, 0xae, 0xae, 0x1b, 0x17, 0x79, 0xc1,
- 0xd4, 0xd7, 0xc2, 0xa0, 0x47, 0x79, 0x41, 0x8f, 0x04, 0x5d, 0xbe, 0xa6,
- 0xd9, 0xaa, 0xe1, 0x72, 0x3b, 0x35, 0xa5, 0x5d, 0x47, 0x51, 0x4a, 0x1c,
- 0x64, 0x23, 0x6e, 0x7f, 0xa0, 0x7f, 0x3b, 0xb0, 0x7f, 0x3b, 0x0c, 0xa9,
- 0x9d, 0x7f, 0x71, 0x14, 0x6c, 0x50, 0x3c, 0x61, 0xc7, 0x8b, 0x97, 0xaf,
- 0x57, 0x5c, 0x23, 0x49, 0x58, 0x26, 0x8c, 0x7c, 0xe4, 0x2f, 0x20, 0xe8,
- 0xdb, 0x40, 0x0d, 0x7f, 0xfd, 0x17, 0xcd, 0xc3, 0xd7, 0x07, 0x5e, 0x05,
- 0x8b, 0x7d, 0xee, 0x20, 0xf6, 0xdc, 0x41, 0xf8, 0xdc, 0x61, 0xec, 0xb9,
- 0xc3, 0xf0, 0xb9, 0xa3, 0xd8, 0x73, 0xde, 0x7a, 0x3d, 0xc7, 0x9f, 0x6c,
- 0xdc, 0x26, 0xcb, 0xb8, 0xf5, 0xaf, 0xa3, 0x91, 0x3b, 0xfe, 0xcf, 0xac,
- 0xb7, 0xa2, 0xdb, 0xaa, 0xf6, 0x27, 0x19, 0xf6, 0xca, 0xa7, 0x75, 0x38,
- 0xa3, 0x25, 0x76, 0x5c, 0xcc, 0xe6, 0x7b, 0x07, 0x47, 0xc3, 0x69, 0xbe,
- 0xba, 0x22, 0xb9, 0xf3, 0x42, 0x3b, 0xbb, 0xd1, 0xe6, 0xd3, 0x62, 0xe5,
- 0x17, 0x6b, 0xb2, 0xc8, 0x43, 0x3d, 0xe4, 0x74, 0xec, 0xc3, 0x15, 0x09,
- 0x42, 0x27, 0xde, 0x48, 0xf8, 0x15, 0x07, 0x56, 0xd4, 0xf5, 0x2f, 0x87,
- 0x30, 0x61, 0x79, 0x93, 0x58, 0xef, 0x0d, 0x39, 0x7a, 0x64, 0x0a, 0x4c,
- 0xbc, 0x3a, 0x2f, 0x9d, 0xa8, 0x0c, 0xcf, 0x1d, 0x13, 0x39, 0xf4, 0xde,
- 0x75, 0xed, 0xa2, 0xc5, 0x85, 0x3c, 0x2f, 0x10, 0x77, 0xd4, 0x99, 0xad,
- 0xe8, 0xac, 0x8d, 0x87, 0x72, 0xf0, 0x76, 0x28, 0x9e, 0x09, 0x45, 0xe5,
- 0x87, 0xf7, 0xa7, 0x81, 0x6a, 0x99, 0x90, 0x5f, 0xa6, 0x7e, 0xbe, 0xb7,
- 0x87, 0x0e, 0xe3, 0x57, 0xe9, 0xed, 0xed, 0xa8, 0xce, 0xf6, 0x0c, 0x3f,
- 0xa9, 0xf7, 0xe0, 0xf0, 0x95, 0x6f, 0x5f, 0x35, 0xcb, 0xc5, 0x66, 0x47,
- 0x6d, 0xce, 0x7e, 0x2d, 0x69, 0x08, 0xcf, 0xbc, 0x03, 0xc8, 0x0b, 0xad,
- 0x26, 0xbf, 0xf6, 0x88, 0xc3, 0x52, 0x2f, 0xe9, 0xa4, 0x8a, 0x3e, 0xce,
- 0x07, 0x24, 0xf9, 0x20, 0x31, 0x11, 0xce, 0x44, 0x1c, 0x02, 0x70, 0xc8,
- 0x9c, 0xf9, 0xe0, 0xb0, 0x73, 0xe8, 0x05, 0x2a, 0xa7, 0xcd, 0x82, 0x70,
- 0x86, 0x45, 0xc9, 0xa9, 0x80, 0x88, 0x0f, 0x67, 0x41, 0x6c, 0xd7, 0x6a,
- 0x3f, 0xf0, 0x81, 0x58, 0x21, 0x2f, 0x39, 0xaa, 0x66, 0xfc, 0xca, 0x4c,
- 0x93, 0x52, 0xf2, 0x48, 0x99, 0x37, 0x2a, 0x87, 0xf9, 0xef, 0x9f, 0xc2,
- 0xa2, 0x73, 0xac, 0xa0, 0x9b, 0xb8, 0x47, 0xda, 0x3f, 0x95, 0x7c, 0xf1,
- 0xd6, 0xf3, 0xd7, 0x5a, 0x0d, 0x32, 0x80, 0xba, 0x14, 0x87, 0x06, 0xc0,
- 0xb1, 0x6d, 0x8d, 0xdf, 0x9f, 0x6f, 0x0d, 0x38, 0x5f, 0x93, 0xbe, 0x30,
- 0x34, 0xff, 0x4e, 0x60, 0x65, 0x52, 0x7b, 0x9d, 0xc7, 0x8f, 0x76, 0x05,
- 0x27, 0x17, 0x73, 0xe4, 0xd2, 0xc9, 0x30, 0x7c, 0x84, 0x5f, 0xba, 0xe4,
- 0xc2, 0xaa, 0xd5, 0x08, 0xcb, 0xd8, 0x7f, 0xed, 0x05, 0x72, 0xd6, 0xcf,
- 0x80, 0xb3, 0x38, 0x36, 0xa8, 0x75, 0x3e, 0xec, 0x23, 0xcf, 0x73, 0xd4,
- 0x89, 0xd0, 0x94, 0xd5, 0x27, 0xe9, 0x07, 0x22, 0x51, 0x0e, 0x30, 0x97,
- 0xa0, 0xfb, 0x72, 0x8b, 0xd9, 0xb4, 0xbd, 0xa3, 0xde, 0x9a, 0x65, 0xc3,
- 0x1c, 0x06, 0x5e, 0x4f, 0x8b, 0x61, 0xa5, 0x55, 0xb3, 0x61, 0x5f, 0x15,
- 0x6b, 0x3a, 0x14, 0x0c, 0xa4, 0xe3, 0xc8, 0x30, 0xf7, 0x60, 0xd5, 0x3c,
- 0xea, 0x9c, 0xbe, 0x6e, 0x5e, 0xe4, 0xd8, 0x6d, 0x07, 0x7b, 0x3e, 0x24,
- 0xd8, 0x34, 0x8a, 0xc7, 0x19, 0x21, 0x09, 0xc5, 0x06, 0xec, 0xab, 0x26,
- 0x53, 0x6c, 0x19, 0xef, 0x44, 0x46, 0x1a, 0x7c, 0x13, 0x36, 0xed, 0xce,
- 0xda, 0xeb, 0x87, 0x71, 0xff, 0x82, 0xfc, 0xf5, 0xe0, 0xed, 0x68, 0xc2,
- 0x35, 0x2d, 0x49, 0x13, 0x52, 0x1f, 0xb4, 0x20, 0x5d, 0xd1, 0x86, 0x25,
- 0xc9, 0x51, 0x76, 0x16, 0xe5, 0x56, 0xe5, 0x2d, 0xcb, 0x51, 0x29, 0x2d,
- 0x2d, 0x20, 0xbd, 0x07, 0x2d, 0xb4, 0xb5, 0x52, 0x12, 0x91, 0x51, 0xc1,
- 0x22, 0x0e, 0x7f, 0xdf, 0xdf, 0xef, 0xa9, 0x04, 0x50, 0x01, 0x94, 0xd1,
- 0xb5, 0xd3, 0x8d, 0x7b, 0xab, 0x2a, 0xc4, 0xf5, 0x4f, 0xa3, 0x68, 0x1f,
- 0x93, 0x08, 0xaa, 0x11, 0xb9, 0x4c, 0xf5, 0x2b, 0xd2, 0x3d, 0x53, 0x5a,
- 0x62, 0x77, 0x82, 0x9b, 0xaa, 0x38, 0x4a, 0x3d, 0xf5, 0x22, 0x4c, 0xb9,
- 0xf8, 0x48, 0x77, 0xeb, 0xa3, 0xb0, 0xce, 0x7d, 0xae, 0xe8, 0x06, 0x6c,
- 0x66, 0x4e, 0xcd, 0x17, 0x52, 0xc0, 0xa0, 0x52, 0xa4, 0xa0, 0x46, 0xdb,
- 0x18, 0x57, 0xd9, 0x2d, 0x42, 0xa8, 0xcb, 0xe5, 0x69, 0x1c, 0x73, 0x0d,
- 0xa9, 0xe5, 0xb5, 0x7a, 0x63, 0x55, 0x5b, 0xec, 0x80, 0xaa, 0xa1, 0x6d,
- 0x88, 0x55, 0x0a, 0x65, 0xdb, 0x02, 0xdd, 0xff, 0xbe, 0x6a, 0xe8, 0x50,
- 0x55, 0x20, 0x0d, 0xe6, 0xe7, 0x1d, 0xd6, 0xc1, 0xff, 0x59, 0x87, 0x75,
- 0xf0, 0x7f, 0xc7, 0x61, 0x1d, 0xfe, 0xbc, 0xc3, 0x3a, 0xfc, 0x3f, 0xeb,
- 0xb0, 0x0e, 0xff, 0xef, 0x38, 0xac, 0xa3, 0x9f, 0x77, 0x58, 0x47, 0xbf,
- 0xfc, 0x61, 0xbd, 0xa3, 0xdf, 0x83, 0xe7, 0xab, 0xd6, 0x97, 0x8b, 0x9e,
- 0xe0, 0xb4, 0xa2, 0xc9, 0x1d, 0x9a, 0xcf, 0x4f, 0x68, 0x43, 0xc4, 0x60,
- 0x10, 0x65, 0xb2, 0xee, 0x5a, 0x4d, 0x2f, 0x1d, 0x36, 0xbb, 0x6d, 0x92,
- 0x22, 0x31, 0x28, 0xc1, 0xaa, 0x27, 0x95, 0xe7, 0xcf, 0x25, 0xb9, 0x50,
- 0x8c, 0x66, 0x30, 0x48, 0xde, 0x8d, 0xc7, 0x9c, 0x76, 0x34, 0x46, 0xe8,
- 0xb4, 0x7b, 0x58, 0xe4, 0x8c, 0x84, 0x8d, 0xb3, 0x43, 0x6a, 0xe3, 0x99,
- 0x99, 0xa1, 0xe3, 0x2e, 0xfc, 0xde, 0x32, 0x9d, 0xd2, 0x8f, 0xf7, 0x47,
- 0x07, 0x6e, 0x77, 0x76, 0x7f, 0x02, 0x10, 0x9c, 0x8b, 0x6b, 0xc6, 0x83,
- 0xd1, 0x11, 0xc8, 0x76, 0x20, 0xa0, 0xd7, 0x4d, 0xe7, 0x70, 0x6e, 0xdb,
- 0x51, 0xe9, 0x5e, 0x70, 0xf0, 0xd8, 0xa9, 0x70, 0xfa, 0x85, 0xa2, 0x6b,
- 0xd2, 0x2f, 0x9c, 0x85, 0x0e, 0x03, 0x38, 0xb0, 0xbe, 0xaf, 0xf2, 0x4b,
- 0xc2, 0xc2, 0xfb, 0x19, 0x91, 0x65, 0x2f, 0x90, 0xfb, 0xbf, 0x26, 0xb2,
- 0xfc, 0x20, 0xfb, 0xd8, 0xbf, 0x32, 0xd5, 0x50, 0x3b, 0xab, 0xc5, 0xf1,
- 0xdb, 0x9d, 0x67, 0x91, 0x4a, 0x81, 0x80, 0xec, 0x38, 0x63, 0xd2, 0xa1,
- 0x4c, 0x9b, 0x63, 0x79, 0xd7, 0x05, 0xf7, 0xd8, 0x8c, 0x09, 0xf1, 0x97,
- 0xa4, 0xd2, 0xce, 0xc2, 0x0d, 0x29, 0xb0, 0x05, 0xaf, 0xb2, 0x66, 0x7a,
- 0x5b, 0x17, 0xfa, 0x11, 0xc9, 0x0d, 0x25, 0x17, 0x39, 0x83, 0x9f, 0x05,
- 0xe9, 0x07, 0xd3, 0x8c, 0xa1, 0xb1, 0xf2, 0xfb, 0x34, 0xa5, 0x27, 0xed,
- 0xf5, 0xa6, 0xd3, 0x6c, 0x98, 0xd6, 0xd3, 0x3c, 0x8f, 0xb7, 0x76, 0xd5,
- 0x38, 0x70, 0x9a, 0xcc, 0xd7, 0xf0, 0xe0, 0x9b, 0xe7, 0x13, 0x8a, 0xb9,
- 0x69, 0xa3, 0x76, 0xe2, 0x88, 0x40, 0x8b, 0xa2, 0x09, 0x97, 0xeb, 0xe6,
- 0xb2, 0x54, 0x67, 0xfe, 0x20, 0xe2, 0x18, 0xa4, 0xa8, 0x1c, 0x23, 0x93,
- 0xd7, 0xd3, 0x2a, 0x5f, 0x01, 0x88, 0xd6, 0x6b, 0x0a, 0x37, 0xb0, 0x1d,
- 0xd3, 0xe1, 0x69, 0xd3, 0xd0, 0x29, 0xf7, 0x10, 0x27, 0x0e, 0xda, 0xc5,
- 0xeb, 0x1f, 0x6e, 0x91, 0x5b, 0xd3, 0x76, 0xd3, 0x32, 0x6f, 0x13, 0x7a,
- 0xb8, 0x17, 0xb5, 0x4c, 0x14, 0xf3, 0xa8, 0x27, 0x0c, 0xaf, 0x61, 0x0c,
- 0x43, 0x42, 0x77, 0x8a, 0x50, 0x8d, 0x86, 0x21, 0x1a, 0xa0, 0x9c, 0x70,
- 0x13, 0x02, 0x72, 0xb0, 0x6b, 0x37, 0x88, 0xab, 0xec, 0x96, 0x0b, 0x49,
- 0x43, 0x93, 0x8b, 0xb9, 0xd9, 0x95, 0x16, 0x59, 0xbe, 0x1c, 0xbf, 0x3a,
- 0x39, 0x69, 0x15, 0x9d, 0xd2, 0xd6, 0x21, 0x92, 0xca, 0x68, 0x26, 0x49,
- 0x4d, 0x20, 0xbf, 0x80, 0x13, 0x89, 0x45, 0xe1, 0xb9, 0x59, 0xa4, 0xb9,
- 0x7e, 0x88, 0xbc, 0x18, 0x46, 0x90, 0x6b, 0x2b, 0xcf, 0x94, 0x53, 0xbc,
- 0xd6, 0x85, 0x99, 0x66, 0x4e, 0xc8, 0x6b, 0x57, 0xeb, 0x65, 0x5a, 0xfc,
- 0xfa, 0xc8, 0x71, 0xbe, 0xa1, 0xe7, 0x4a, 0x39, 0x64, 0xb7, 0xf8, 0x5e,
- 0xf9, 0xb1, 0xde, 0x90, 0xd6, 0x22, 0x8d, 0x39, 0xce, 0x2b, 0x69, 0xdb,
- 0x08, 0x78, 0x39, 0xf8, 0xdb, 0xb9, 0xb9, 0x86, 0x59, 0x29, 0x70, 0x2e,
- 0x79, 0x70, 0xb3, 0x5c, 0x8d, 0x20, 0x03, 0xb6, 0xde, 0x06, 0x97, 0xba,
- 0x4e, 0x41, 0x0e, 0xa3, 0x6d, 0xac, 0x96, 0x3b, 0xe8, 0x8a, 0x4a, 0x7c,
- 0xe1, 0xb7, 0xbc, 0x01, 0xad, 0x2b, 0x70, 0xff, 0x1d, 0xe0, 0x2b, 0xf0,
- 0x4b, 0xdc, 0x00, 0x29, 0x24, 0xda, 0xfa, 0xfd, 0x56, 0x12, 0x6f, 0xdd,
- 0xf2, 0x80, 0x71, 0x5a, 0x00, 0x2c, 0xbf, 0x2d, 0xa5, 0x45, 0x10, 0x61,
- 0x3c, 0x26, 0xe6, 0x9f, 0xe9, 0xba, 0xc8, 0x6f, 0x51, 0xd1, 0x61, 0x54,
- 0x89, 0x17, 0xd4, 0xb9, 0xa4, 0xa7, 0x25, 0xc7, 0x2b, 0x56, 0x6c, 0x12,
- 0xad, 0x4f, 0xc1, 0x2a, 0x3e, 0x98, 0x97, 0x8d, 0xc2, 0xb8, 0xa4, 0xfc,
- 0x1e, 0x1e, 0x63, 0xe0, 0x63, 0xa3, 0x83, 0xad, 0x47, 0xf2, 0x83, 0x8a,
- 0xac, 0x21, 0xf7, 0xc7, 0xc6, 0xc8, 0x56, 0x3b, 0x5a, 0x78, 0x01, 0x44,
- 0xb0, 0x15, 0x15, 0x0d, 0x6c, 0xe8, 0xb0, 0x8d, 0xcd, 0x70, 0x49, 0xfa,
- 0xed, 0x00, 0x82, 0xd7, 0x86, 0x4b, 0x48, 0xc7, 0xb6, 0x7a, 0xe2, 0xbe,
- 0x2c, 0xb1, 0x54, 0x26, 0xdb, 0x3f, 0xc8, 0x35, 0xdf, 0xca, 0xbb, 0x91,
- 0x09, 0x34, 0x78, 0x72, 0xe1, 0x5b, 0xe9, 0x8e, 0x19, 0xca, 0xee, 0x4e,
- 0x1f, 0xb0, 0x91, 0xd7, 0x92, 0xb8, 0xd5, 0xa5, 0x0c, 0x28, 0x85, 0xf9,
- 0x82, 0xc8, 0x7f, 0x4f, 0xd3, 0x1b, 0x16, 0x61, 0xee, 0xbd, 0x6b, 0x7e,
- 0x25, 0xbc, 0x8e, 0x2a, 0xbd, 0x10, 0xe4, 0xa4, 0x7f, 0x03, 0x49, 0x49,
- 0x95, 0x88, 0xf6, 0x2a, 0xb8, 0x97, 0x5d, 0x57, 0x7d, 0xf1, 0xe2, 0xcf,
- 0x57, 0xd4, 0x0d, 0x5d, 0xe7, 0x55, 0x31, 0x21, 0xb6, 0xfb, 0xdd, 0x6b,
- 0x48, 0xdb, 0x6b, 0xe8, 0x13, 0xe4, 0x35, 0xf3, 0xf5, 0x58, 0xd7, 0x99,
- 0xe8, 0x52, 0x8c, 0x3c, 0x4b, 0xa5, 0x76, 0xd4, 0x40, 0x84, 0xf2, 0xf4,
- 0x6c, 0xf7, 0x65, 0x3e, 0x58, 0x6e, 0xdb, 0x2e, 0x35, 0xbd, 0x01, 0xb2,
- 0x6e, 0xbe, 0x18, 0xf9, 0x55, 0x13, 0xe2, 0xa6, 0xd5, 0x62, 0xad, 0x1d,
- 0xa3, 0xac, 0xb3, 0xe6, 0xc6, 0x97, 0x87, 0x9a, 0x7f, 0x28, 0x32, 0x7b,
- 0x3f, 0x6c, 0x77, 0x1c, 0xde, 0xa9, 0x9d, 0xc1, 0x46, 0xac, 0x63, 0x27,
- 0x55, 0x78, 0x53, 0x0a, 0x96, 0xed, 0xaa, 0xda, 0x69, 0xae, 0x78, 0x5e,
- 0xf8, 0xf4, 0x9e, 0x46, 0x83, 0xa3, 0x22, 0x97, 0x5f, 0x0a, 0xaa, 0x7c,
- 0xa6, 0xae, 0x4e, 0xef, 0x1b, 0x23, 0xc3, 0x65, 0xcc, 0x47, 0xf4, 0x2b,
- 0x52, 0x2c, 0xb3, 0x1b, 0x00, 0xb8, 0xdd, 0x71, 0x3f, 0x0c, 0xaf, 0xfe,
- 0xd8, 0x6f, 0x46, 0x43, 0x53, 0xed, 0x4c, 0x0d, 0x79, 0xd5, 0x48, 0x3c,
- 0x08, 0x6f, 0x22, 0x40, 0x0a, 0xd4, 0xc4, 0x83, 0xb0, 0x44, 0x0b, 0x21,
- 0xe9, 0x97, 0xce, 0xdc, 0x4c, 0x20, 0x64, 0x79, 0x38, 0xf8, 0x5c, 0x27,
- 0x99, 0x40, 0x8b, 0x06, 0x9e, 0x4a, 0x74, 0x38, 0x8c, 0x36, 0xb3, 0xe2,
- 0xee, 0xab, 0x5a, 0xa5, 0x47, 0x3c, 0x2d, 0xbc, 0xd0, 0xb6, 0x59, 0x20,
- 0xf5, 0x1f, 0x2a, 0x35, 0x64, 0xd1, 0xdf, 0x8f, 0x65, 0x94, 0x1c, 0xd3,
- 0xd3, 0xe1, 0x40, 0x7f, 0xc0, 0x08, 0x00, 0x89, 0x77, 0x8d, 0x40, 0xcd,
- 0x42, 0x80, 0xa1, 0xd7, 0xa5, 0x2b, 0xa1, 0x3c, 0xc6, 0xcb, 0xa5, 0xac,
- 0x3b, 0x94, 0xf8, 0x8f, 0xa4, 0xd3, 0x15, 0xa9, 0xed, 0xaa, 0x6b, 0x26,
- 0x5b, 0x97, 0x8b, 0x72, 0x32, 0x31, 0x8b, 0xdf, 0x52, 0x2d, 0xc5, 0x7c,
- 0x3b, 0xf0, 0x25, 0xfb, 0x33, 0x49, 0xab, 0x4b, 0x58, 0xd2, 0x03, 0x98,
- 0x11, 0xec, 0xa8, 0xa7, 0x59, 0xb8, 0x4e, 0xba, 0xfa, 0x79, 0x85, 0x42,
- 0x8f, 0xc8, 0x19, 0xce, 0x06, 0xb4, 0x04, 0x48, 0x6b, 0x6b, 0xf9, 0xfd,
- 0x51, 0xd0, 0x48, 0x3f, 0xd5, 0xe9, 0x71, 0xb6, 0x61, 0x5f, 0xba, 0xac,
- 0xeb, 0x3f, 0x03, 0xb6, 0x25, 0xad, 0x08, 0xf3, 0x3a, 0x8c, 0xaf, 0x60,
- 0x0b, 0xda, 0x0b, 0xda, 0xfa, 0x4f, 0xfa, 0xe3, 0x60, 0x40, 0xff, 0x3d,
- 0xfc, 0xe7, 0x16, 0x42, 0x30, 0xcf, 0xf7, 0xf6, 0x6e, 0x6e, 0x6e, 0x46,
- 0x0a, 0x28, 0x68, 0x8e, 0xec, 0xb3, 0xb0, 0xf2, 0x8f, 0x70, 0xd8, 0x7a,
- 0x3e, 0x70, 0x91, 0x6c, 0xe5, 0xcb, 0xcb, 0xbf, 0x1e, 0x0c, 0x0f, 0xf6,
- 0xf7, 0xf7, 0x7f, 0x1c, 0xad, 0x68, 0x7f, 0xe7, 0x18, 0xd6, 0xfc, 0xd7,
- 0x1f, 0x76, 0x8f, 0x67, 0xb2, 0x17, 0x85, 0x7c, 0xe5, 0xdf, 0xa9, 0x95,
- 0x5d, 0x70, 0xd3, 0x0e, 0x26, 0xe5, 0xe7, 0x1e, 0x8b, 0xe1, 0x38, 0x72,
- 0xba, 0xa9, 0x8e, 0x9e, 0x53, 0x07, 0x29, 0x84, 0xf0, 0xf8, 0xe8, 0xf0,
- 0x30, 0x61, 0x85, 0x83, 0xcb, 0xd3, 0x38, 0x95, 0x81, 0x90, 0x09, 0xa4,
- 0xc3, 0x38, 0xcb, 0x32, 0x82, 0x5e, 0x4c, 0x39, 0x58, 0x63, 0x28, 0xa3,
- 0x27, 0xa5, 0x93, 0x0d, 0xe3, 0xdc, 0x08, 0xf2, 0x72, 0x76, 0xe7, 0x46,
- 0x35, 0x24, 0x5e, 0x11, 0x63, 0xa5, 0x26, 0xa1, 0x77, 0x3e, 0xc4, 0x63,
- 0x2a, 0xd9, 0xd6, 0x41, 0x39, 0xa1, 0xb4, 0xbe, 0x83, 0x94, 0x03, 0x4c,
- 0x6e, 0x51, 0x4a, 0x9f, 0x6b, 0x44, 0xee, 0xe7, 0xeb, 0x4a, 0xba, 0x1c,
- 0x21, 0xd1, 0xe1, 0x26, 0xbd, 0x6b, 0x09, 0x7b, 0xb3, 0xe3, 0x2f, 0xcc,
- 0x7f, 0x02, 0xbf, 0xb6, 0x5c, 0x4d, 0x52, 0x2d, 0x6d, 0x9b, 0xe6, 0x79,
- 0xd6, 0x4c, 0xaf, 0xba, 0xe9, 0x96, 0xe0, 0xe0, 0x66, 0xb6, 0x57, 0x66,
- 0x41, 0x77, 0xb6, 0xa1, 0x7a, 0xac, 0x03, 0xa4, 0x57, 0x97, 0x6b, 0x86,
- 0xa4, 0x86, 0x1f, 0x28, 0x4d, 0xe0, 0x86, 0xf0, 0xcc, 0x14, 0x7b, 0xd0,
- 0x3d, 0x6d, 0xdf, 0x44, 0x7c, 0x2f, 0xaf, 0xb5, 0x6c, 0x78, 0x7a, 0x95,
- 0x2d, 0x85, 0x63, 0xee, 0x68, 0xce, 0xe4, 0x96, 0xd0, 0xe0, 0x56, 0xc4,
- 0x22, 0xdf, 0x9a, 0xeb, 0xaf, 0xcc, 0x4a, 0x76, 0xa5, 0xf0, 0xd6, 0x8a,
- 0x39, 0xe9, 0x85, 0x74, 0xb9, 0x26, 0xc3, 0x71, 0x92, 0x8a, 0x3c, 0xd1,
- 0x7a, 0xf0, 0x9e, 0xcc, 0x66, 0xc3, 0x16, 0xb3, 0x0a, 0x42, 0xac, 0x5e,
- 0x4f, 0x86, 0xa2, 0xf9, 0x60, 0x46, 0x48, 0x2e, 0xa1, 0xdb, 0xfa, 0xfa,
- 0xe4, 0xd5, 0x05, 0x97, 0xc0, 0x9a, 0xff, 0x52, 0xb5, 0x8c, 0xf9, 0x83,
- 0x2a, 0x5f, 0xc3, 0x46, 0x55, 0xe7, 0x47, 0x9c, 0x42, 0x04, 0x62, 0xb5,
- 0x11, 0xa5, 0xd4, 0xa5, 0xd9, 0xb5, 0x54, 0xbf, 0x81, 0xd7, 0xf6, 0x24,
- 0x92, 0x3b, 0xdc, 0xd2, 0x12, 0x6d, 0xe5, 0xf4, 0xa3, 0xc7, 0xa3, 0x7d,
- 0x5e, 0x22, 0xed, 0xa1, 0x64, 0xd0, 0x48, 0xa5, 0x16, 0xdc, 0x48, 0x1a,
- 0x61, 0x4c, 0xe3, 0x39, 0x03, 0x76, 0x2a, 0x83, 0x84, 0xf1, 0xcf, 0x19,
- 0x4a, 0x41, 0x7f, 0xeb, 0x65, 0x4b, 0xde, 0x53, 0x0e, 0xa3, 0xb2, 0x4b,
- 0x72, 0x84, 0xef, 0xba, 0xd8, 0xd5, 0x40, 0x16, 0xd7, 0x2a, 0x1d, 0x30,
- 0xe1, 0x58, 0xb9, 0x9c, 0xd0, 0x84, 0xe4, 0x8d, 0x0f, 0x5c, 0xe7, 0xa9,
- 0x92, 0xa4, 0x80, 0xc8, 0x2c, 0xa9, 0x3e, 0x42, 0xa7, 0x56, 0xd7, 0xea,
- 0x30, 0xa6, 0x9f, 0x04, 0x2d, 0xbd, 0x86, 0x7f, 0x16, 0xe4, 0x59, 0xd6,
- 0x93, 0x63, 0xa5, 0x5f, 0x38, 0xcb, 0x5d, 0x4d, 0x73, 0x65, 0xd3, 0x55,
- 0x55, 0xce, 0x11, 0x39, 0x0c, 0xf9, 0xe4, 0x9b, 0x6e, 0x57, 0xf6, 0x2c,
- 0xb0, 0x71, 0x80, 0x6f, 0xe2, 0x55, 0xf7, 0xa5, 0x58, 0x1e, 0x8b, 0x08,
- 0x36, 0xf4, 0x38, 0x32, 0xb4, 0xf5, 0x47, 0x0a, 0x09, 0x7d, 0xf1, 0xd2,
- 0x46, 0x10, 0xe3, 0x50, 0x46, 0x50, 0xa7, 0x6a, 0xe6, 0x6f, 0x6d, 0x63,
- 0x46, 0x78, 0x1a, 0xf1, 0xfd, 0xec, 0x96, 0x31, 0x3b, 0x71, 0x72, 0x37,
- 0x79, 0x71, 0x74, 0x98, 0xd4, 0x77, 0x46, 0x83, 0x58, 0xfa, 0x9b, 0xd0,
- 0x6d, 0x38, 0x1e, 0x0d, 0x85, 0xb5, 0x3a, 0xf5, 0x31, 0xeb, 0xfa, 0x40,
- 0xaf, 0xbc, 0xc4, 0x2b, 0xd2, 0xdd, 0x4b, 0xf3, 0xf5, 0x1e, 0xd0, 0xc5,
- 0xbe, 0x54, 0x26, 0x36, 0x59, 0xa4, 0xc5, 0x27, 0x9b, 0x55, 0xcd, 0x03,
- 0x0d, 0xa8, 0x39, 0x2c, 0x17, 0x92, 0xba, 0x1f, 0xca, 0xf6, 0xb0, 0x60,
- 0x0c, 0xba, 0xa8, 0x41, 0xb1, 0x5f, 0xa6, 0x15, 0x6a, 0x0c, 0xb1, 0x6d,
- 0x92, 0xfe, 0xec, 0x1f, 0x8a, 0x2d, 0x0f, 0x06, 0x11, 0x79, 0x3d, 0xd5,
- 0x43, 0x11, 0xc6, 0x31, 0x76, 0xc6, 0xfd, 0xd1, 0x1c, 0xf2, 0x9e, 0x8e,
- 0x70, 0xbf, 0x5c, 0x6c, 0xdd, 0x02, 0x21, 0x1b, 0xae, 0x6d, 0xfe, 0xfb,
- 0x5c, 0x03, 0x80, 0x7d, 0xfc, 0xbb, 0x11, 0xac, 0x32, 0xd7, 0xf1, 0xdc,
- 0x86, 0x0c, 0xfd, 0x16, 0xb6, 0xac, 0xe2, 0xb9, 0x50, 0x65, 0x2c, 0xc2,
- 0x3e, 0x4a, 0xce, 0x9c, 0x39, 0x59, 0x0c, 0x80, 0x89, 0xdb, 0x54, 0x53,
- 0x31, 0x26, 0xf1, 0x77, 0x49, 0xdd, 0x4c, 0x17, 0xd1, 0x96, 0xec, 0xd0,
- 0x72, 0xea, 0x1c, 0xd0, 0xdc, 0x56, 0x12, 0x78, 0x22, 0x8e, 0xbb, 0xa5,
- 0x3a, 0x7e, 0x6c, 0xb6, 0x96, 0xda, 0x8a, 0x02, 0xba, 0x2a, 0xc8, 0xcc,
- 0xe6, 0x45, 0x44, 0x1b, 0xec, 0xc4, 0xd7, 0x5b, 0x4b, 0x24, 0x7f, 0x61,
- 0x64, 0xe2, 0x7a, 0x65, 0x43, 0x0f, 0x89, 0x80, 0x34, 0x10, 0xfa, 0x4b,
- 0x59, 0x0c, 0x02, 0x7c, 0x27, 0xc4, 0xce, 0xc5, 0xe9, 0x44, 0x59, 0x81,
- 0x4b, 0xe9, 0xe1, 0x9d, 0x59, 0x57, 0x33, 0xbf, 0xa9, 0xe4, 0xe9, 0x3e,
- 0x7e, 0x4f, 0xab, 0x61, 0xee, 0x05, 0xa4, 0x87, 0x61, 0x68, 0x70, 0xc0,
- 0xb5, 0x7c, 0xc1, 0x92, 0xce, 0x0a, 0xbd, 0x91, 0x02, 0x37, 0x95, 0x73,
- 0x21, 0x75, 0xed, 0xef, 0xd5, 0x15, 0x35, 0x6d, 0xf2, 0xbc, 0x1f, 0x82,
- 0xd9, 0x65, 0xf4, 0xcd, 0x40, 0x5f, 0x46, 0x0b, 0x02, 0xce, 0x44, 0x34,
- 0x3b, 0x0c, 0x98, 0x68, 0xca, 0xe7, 0xa1, 0x84, 0x49, 0x97, 0x9e, 0x4c,
- 0x1a, 0x45, 0x56, 0xb0, 0x5d, 0x5f, 0x2a, 0xf8, 0x5a, 0x32, 0x0d, 0xb1,
- 0x13, 0x67, 0x0c, 0xad, 0x5b, 0xf3, 0x88, 0xb6, 0xc1, 0xf9, 0xa5, 0x48,
- 0x91, 0x9a, 0xd2, 0x3c, 0x0d, 0x43, 0x63, 0x54, 0x6b, 0xda, 0x9c, 0xda,
- 0xed, 0x7c, 0xa4, 0xa9, 0x14, 0xaf, 0x34, 0xd1, 0x36, 0x1a, 0x77, 0x3e,
- 0xe4, 0xaf, 0xb9, 0x0d, 0xd7, 0x39, 0xef, 0x3d, 0xc3, 0x99, 0x4d, 0xaa,
- 0x3c, 0x9b, 0x1b, 0xee, 0x85, 0x25, 0x71, 0x0a, 0x69, 0xe0, 0x35, 0xca,
- 0x08, 0xf7, 0x9a, 0xb2, 0xd3, 0xcd, 0x39, 0x52, 0x01, 0x71, 0x0e, 0xc7,
- 0x11, 0xf3, 0x44, 0x0b, 0x2e, 0xc7, 0x20, 0xf3, 0xd7, 0xda, 0xb8, 0x39,
- 0xd5, 0x92, 0xa6, 0x68, 0x7e, 0x26, 0xfa, 0xb0, 0x8b, 0xc7, 0x93, 0x08,
- 0xac, 0xa0, 0x5b, 0x6c, 0x1b, 0x39, 0xe2, 0x8b, 0xcc, 0x56, 0x45, 0xbb,
- 0xf1, 0xba, 0x81, 0xf5, 0x74, 0xd6, 0x85, 0xfd, 0xf4, 0x4d, 0x56, 0x19,
- 0xf1, 0x57, 0x9a, 0x75, 0x7f, 0xfb, 0x58, 0xa3, 0x10, 0xd2, 0x94, 0x5e,
- 0x94, 0x11, 0xb9, 0xa5, 0x68, 0x90, 0x88, 0xa9, 0x07, 0xe1, 0x0b, 0x2e,
- 0xde, 0xa0, 0xbd, 0xd5, 0x37, 0x7d, 0x85, 0xa4, 0x4b, 0xa1, 0x03, 0x80,
- 0x14, 0x1b, 0xea, 0x23, 0xf5, 0x32, 0xde, 0x7d, 0x4c, 0xbf, 0x09, 0xf5,
- 0xcf, 0x68, 0x58, 0x44, 0x2d, 0xe4, 0xce, 0x33, 0xf7, 0xb6, 0x9c, 0x34,
- 0x29, 0x37, 0xf0, 0xb6, 0x33, 0xbf, 0xc8, 0xc9, 0xe1, 0xa3, 0x79, 0x4e,
- 0xd1, 0xb2, 0x9e, 0xe6, 0x4a, 0x1a, 0x13, 0x28, 0x3e, 0x78, 0x27, 0x3d,
- 0x82, 0xb4, 0xc8, 0xfa, 0x8a, 0x14, 0x31, 0xd2, 0x0f, 0x60, 0xe4, 0xc7,
- 0xd5, 0x7b, 0x6c, 0xda, 0xbb, 0x8b, 0xd3, 0xb7, 0x83, 0xce, 0xb5, 0x13,
- 0x95, 0xc6, 0xb3, 0x88, 0x95, 0xe5, 0x08, 0x4d, 0x85, 0x98, 0x00, 0x55,
- 0x22, 0xfb, 0x61, 0x4b, 0x0c, 0x19, 0x93, 0x82, 0xb6, 0x6e, 0x20, 0xc9,
- 0x38, 0x95, 0x94, 0xae, 0xa9, 0xd9, 0xcf, 0xfb, 0x1a, 0x7a, 0xb2, 0x89,
- 0x08, 0x6b, 0x9c, 0x3d, 0x5c, 0x25, 0x46, 0x9e, 0x18, 0x66, 0xb3, 0x09,
- 0x60, 0xfd, 0xc2, 0x69, 0xc5, 0xee, 0xab, 0xbc, 0x14, 0x62, 0x2f, 0xdc,
- 0x30, 0x23, 0x79, 0x5d, 0xde, 0x14, 0xc3, 0x53, 0xaa, 0x3e, 0x4e, 0x4e,
- 0xcb, 0x4b, 0xba, 0x41, 0xef, 0x00, 0x1f, 0x15, 0x9c, 0xda, 0x87, 0xf3,
- 0x77, 0xc9, 0x0e, 0xc9, 0xdd, 0xe4, 0xdc, 0x62, 0xce, 0xd1, 0xa3, 0xbb,
- 0x62, 0x62, 0xd4, 0xac, 0x92, 0xc8, 0x6c, 0x06, 0xc9, 0xf1, 0xf7, 0x2f,
- 0xdf, 0x9e, 0x9f, 0x1e, 0xff, 0xc0, 0x09, 0x32, 0xc1, 0x72, 0xe8, 0xc7,
- 0x5f, 0x7a, 0x36, 0x17, 0x22, 0x34, 0x94, 0x34, 0x68, 0x66, 0x12, 0x05,
- 0x9c, 0x21, 0xea, 0x64, 0xb6, 0xa8, 0x24, 0x38, 0x1e, 0x9f, 0x9f, 0x0c,
- 0x15, 0x2d, 0x8e, 0x7b, 0x95, 0xe6, 0x05, 0x99, 0x47, 0x30, 0xb1, 0xb5,
- 0xcd, 0x09, 0x51, 0xd1, 0x30, 0x70, 0xca, 0xc8, 0x7d, 0x18, 0x24, 0xef,
- 0x34, 0x15, 0x71, 0x80, 0x43, 0xa7, 0x3b, 0xf8, 0x3a, 0xbf, 0x44, 0x44,
- 0xa9, 0x93, 0x43, 0x26, 0x06, 0x08, 0xd1, 0x41, 0x80, 0xc5, 0xe8, 0x75,
- 0x99, 0xab, 0xb3, 0x05, 0x3b, 0x2f, 0x7b, 0xe5, 0x23, 0xb3, 0x48, 0x9c,
- 0x22, 0xea, 0x44, 0x82, 0x50, 0x99, 0xd4, 0x8d, 0x4c, 0x5a, 0xed, 0xed,
- 0x2c, 0x85, 0xb0, 0x54, 0x10, 0x5d, 0xc2, 0xb2, 0xfd, 0xe7, 0xc9, 0xd6,
- 0x70, 0x9d, 0x3c, 0xdf, 0xfa, 0x15, 0x55, 0x04, 0xdf, 0xd3, 0x1b, 0x69,
- 0x96, 0xa5, 0x45, 0xbb, 0x36, 0x28, 0xa0, 0x5d, 0x1e, 0xb8, 0x8d, 0x82,
- 0x38, 0xdc, 0xe0, 0x33, 0x37, 0x37, 0x5d, 0x14, 0xfa, 0xc9, 0xfa, 0xf2,
- 0x32, 0x02, 0xe7, 0x42, 0x9d, 0xf8, 0x32, 0xb8, 0x7f, 0xc8, 0x9b, 0xb2,
- 0x5d, 0x27, 0xec, 0xc3, 0x37, 0xf3, 0xdf, 0x42, 0x5c, 0x92, 0x79, 0xc8,
- 0x55, 0x59, 0xce, 0x48, 0x55, 0x7d, 0x99, 0x70, 0x00, 0x82, 0xa2, 0x14,
- 0x55, 0x13, 0x0e, 0xc7, 0xda, 0xdb, 0xf6, 0x9f, 0xb6, 0x6d, 0x94, 0x75,
- 0x4b, 0xf4, 0x2a, 0xf0, 0xeb, 0x2d, 0x56, 0x62, 0x27, 0xdc, 0xf0, 0x76,
- 0x90, 0x6c, 0xbf, 0xd8, 0x96, 0xe7, 0xb6, 0xa2, 0x2a, 0x1a, 0xbf, 0xc3,
- 0x11, 0x3e, 0xd6, 0xaa, 0xa7, 0xd6, 0x05, 0x4a, 0xca, 0x5f, 0x3e, 0x9b,
- 0x65, 0x10, 0xdb, 0xd2, 0x33, 0x32, 0x61, 0x84, 0xc7, 0x81, 0xf8, 0x7e,
- 0xba, 0x2a, 0x07, 0xa6, 0xae, 0x33, 0xe7, 0xb9, 0x52, 0x2b, 0x43, 0x9e,
- 0x81, 0xd7, 0x59, 0x99, 0x42, 0x12, 0xae, 0xc7, 0x9f, 0x7c, 0xb5, 0xef,
- 0xa6, 0x70, 0x5a, 0x29, 0x19, 0xc7, 0xd0, 0x84, 0xa3, 0x05, 0x84, 0x83,
- 0x4e, 0x6d, 0x1e, 0xe2, 0x5a, 0xa1, 0xfb, 0xd2, 0xeb, 0x82, 0x61, 0x46,
- 0xde, 0xae, 0x08, 0xbb, 0xac, 0xfc, 0x84, 0x9e, 0xae, 0x65, 0xd5, 0xf7,
- 0x7d, 0xf5, 0xec, 0x3a, 0xc2, 0x63, 0x51, 0xab, 0x05, 0x12, 0xa4, 0x4d,
- 0xe0, 0x41, 0xd1, 0x05, 0xd4, 0xb6, 0x1b, 0x84, 0x68, 0x36, 0xdc, 0x59,
- 0x4e, 0x7a, 0x06, 0x0f, 0x6d, 0xe8, 0xa9, 0x1d, 0x2b, 0xd5, 0x2a, 0xe1,
- 0x98, 0x9b, 0xd5, 0x2f, 0xb7, 0x6d, 0x77, 0x2f, 0x14, 0x57, 0x36, 0x1a,
- 0x0c, 0x6c, 0xac, 0xd4, 0x6e, 0xd5, 0x6f, 0x8e, 0xfa, 0x21, 0xd4, 0xfc,
- 0xc0, 0x5b, 0x98, 0xfc, 0x19, 0x0d, 0x8b, 0x7c, 0x2b, 0xb7, 0xaa, 0x0e,
- 0xed, 0xac, 0xd7, 0x12, 0x38, 0xf3, 0xa3, 0x51, 0x52, 0x2a, 0xc8, 0x5e,
- 0xc3, 0x42, 0x5b, 0x74, 0x71, 0x7c, 0x5e, 0xd3, 0x06, 0x72, 0x78, 0xf7,
- 0xeb, 0x51, 0x44, 0x85, 0x65, 0x9d, 0x14, 0x24, 0x27, 0xab, 0x61, 0xf7,
- 0x3a, 0x42, 0x69, 0xfa, 0xbe, 0x66, 0xec, 0xa0, 0x27, 0x3b, 0x0f, 0x1d,
- 0x0b, 0xad, 0x42, 0x7e, 0x1c, 0x55, 0x33, 0x04, 0x2b, 0xee, 0x24, 0xb1,
- 0x86, 0xdb, 0x76, 0x17, 0x9f, 0x34, 0x83, 0x92, 0x06, 0xcf, 0x6e, 0xb3,
- 0xe9, 0xba, 0x69, 0x97, 0xc0, 0x79, 0x73, 0x52, 0x64, 0x27, 0x9e, 0xd6,
- 0x0e, 0xae, 0x82, 0x00, 0xde, 0x6c, 0x9d, 0x2b, 0x2c, 0xcf, 0xf3, 0xad,
- 0x5d, 0x89, 0xe3, 0xa6, 0xac, 0xc1, 0xf3, 0x8f, 0x63, 0xf1, 0x59, 0x9d,
- 0x73, 0x95, 0xb1, 0x3b, 0xd5, 0x25, 0x2b, 0x44, 0x3f, 0x6f, 0x88, 0xb4,
- 0x9a, 0xc5, 0xbe, 0xfd, 0x86, 0x7d, 0x6f, 0xde, 0xa7, 0x6d, 0xbb, 0x4e,
- 0x71, 0xcb, 0xd5, 0xc1, 0x55, 0x0e, 0xbe, 0x8c, 0xb6, 0xe5, 0xa3, 0xe4,
- 0xe5, 0xb5, 0xa1, 0x6e, 0xd8, 0xf1, 0xfa, 0xaa, 0xee, 0x7f, 0xe0, 0x0e,
- 0x3d, 0x39, 0xbf, 0x7e, 0x22, 0xde, 0x6c, 0x52, 0x39, 0x48, 0xe6, 0xe1,
- 0x47, 0x96, 0xe3, 0x07, 0xab, 0xf8, 0x54, 0x4d, 0x1e, 0x99, 0x3f, 0xbe,
- 0xa1, 0x3f, 0xe6, 0xec, 0x16, 0x10, 0x50, 0x3d, 0xf6, 0xc3, 0x86, 0xa4,
- 0x3d, 0x3e, 0xb5, 0x7f, 0xd8, 0x44, 0x2d, 0x73, 0xea, 0x54, 0xa9, 0x48,
- 0x10, 0x7c, 0x0e, 0x0c, 0x09, 0xa6, 0x8d, 0x8e, 0x33, 0xd0, 0xfa, 0xe1,
- 0x78, 0x7d, 0x07, 0x10, 0xe3, 0x06, 0x40, 0x64, 0x1b, 0xc0, 0xe7, 0x34,
- 0x66, 0x46, 0x5e, 0xc6, 0xea, 0x47, 0xcd, 0x56, 0xfd, 0x83, 0xe2, 0x70,
- 0xb6, 0x94, 0x7d, 0x96, 0x69, 0x6e, 0x85, 0x90, 0xa0, 0x97, 0xcf, 0xc1,
- 0xde, 0x69, 0xba, 0x66, 0xcc, 0xce, 0xc2, 0x84, 0x54, 0x0b, 0x94, 0xd7,
- 0xb7, 0x64, 0x08, 0x77, 0xf9, 0x23, 0xc4, 0x9c, 0xed, 0x7f, 0xef, 0x35,
- 0xea, 0xa7, 0xe5, 0xc2, 0xf3, 0x55, 0x80, 0xf3, 0x23, 0xb5, 0x87, 0xcd,
- 0x19, 0x31, 0x38, 0x1d, 0x3c, 0x2c, 0xb6, 0x0e, 0x2b, 0x26, 0x3d, 0xf3,
- 0x5c, 0xa2, 0x65, 0x24, 0x35, 0xdd, 0x00, 0x57, 0xf8, 0xa4, 0xd1, 0xea,
- 0x65, 0xb6, 0xa4, 0xc0, 0x97, 0x95, 0x8b, 0x82, 0xe1, 0x45, 0x8a, 0x15,
- 0x3e, 0x3e, 0x8c, 0x0f, 0x37, 0x23, 0xfd, 0x8d, 0x44, 0x2c, 0xa7, 0x6f,
- 0xfd, 0x5b, 0x10, 0xed, 0xac, 0xef, 0x8a, 0xe9, 0xd5, 0xeb, 0x77, 0xe3,
- 0xf8, 0xeb, 0xe1, 0xe2, 0xf0, 0xbc, 0xd1, 0x43, 0x88, 0x18, 0xa0, 0xc0,
- 0x08, 0x88, 0xa5, 0x51, 0xf2, 0x5e, 0x7a, 0xbf, 0x8b, 0x0f, 0xd7, 0x7a,
- 0xc1, 0x7a, 0x02, 0x49, 0xb1, 0x60, 0x26, 0x2e, 0x9a, 0x27, 0xc2, 0x2e,
- 0xc3, 0x94, 0xae, 0x02, 0x2d, 0x2f, 0x54, 0xa0, 0xed, 0x9d, 0xa6, 0x80,
- 0x91, 0xa1, 0x02, 0x19, 0xb2, 0xf2, 0x12, 0xd0, 0xba, 0x74, 0x8d, 0x86,
- 0x3b, 0xfa, 0xc7, 0x4f, 0x39, 0xe6, 0x53, 0x63, 0xd1, 0x66, 0x91, 0xe0,
- 0xa2, 0xbf, 0x43, 0xad, 0x84, 0x20, 0x2f, 0xf8, 0x6b, 0x68, 0x75, 0x41,
- 0xaf, 0x33, 0x99, 0x0e, 0x84, 0x5a, 0xf1, 0xa3, 0xaa, 0x6f, 0x49, 0x66,
- 0x53, 0x0e, 0xbf, 0xfa, 0x73, 0x28, 0x3d, 0x5f, 0xbf, 0xeb, 0xf9, 0x1c,
- 0xfd, 0x66, 0xa8, 0xd5, 0x84, 0xa2, 0x11, 0x78, 0x2a, 0x7d, 0xb8, 0x17,
- 0x82, 0x85, 0x1c, 0x9f, 0x80, 0x02, 0x25, 0xdf, 0xc3, 0x25, 0xcc, 0x13,
- 0xf2, 0xc7, 0xc6, 0x07, 0x25, 0xa7, 0x3f, 0xfe, 0x29, 0x4a, 0xf6, 0xdf,
- 0xe1, 0x04, 0xbf, 0xe4, 0x3d, 0x07, 0x71, 0xcf, 0x45, 0x13, 0xde, 0x8d,
- 0x1c, 0x91, 0xfb, 0x4c, 0x7c, 0x38, 0xe2, 0x6f, 0x31, 0x48, 0x2a, 0xe2,
- 0x0b, 0x87, 0xfc, 0xc7, 0xde, 0xa1, 0x4d, 0x4e, 0xb3, 0x05, 0xa1, 0xb8,
- 0xa4, 0x46, 0x80, 0x87, 0x0a, 0x42, 0x91, 0xdf, 0x8e, 0x91, 0x4f, 0xd0,
- 0x43, 0xcd, 0x48, 0x3c, 0xe0, 0x8c, 0x03, 0xbb, 0x07, 0x34, 0x51, 0xd5,
- 0xc4, 0xa2, 0x33, 0x19, 0xb3, 0xfb, 0xee, 0x3e, 0x62, 0xca, 0x23, 0xf9,
- 0x74, 0x9b, 0x70, 0x37, 0xdf, 0x1a, 0x25, 0x89, 0x84, 0xeb, 0xfd, 0xd7,
- 0xd8, 0xd2, 0x8d, 0x7d, 0x27, 0xd9, 0x99, 0x18, 0x89, 0xed, 0xe1, 0xe8,
- 0x10, 0xbf, 0x79, 0x84, 0x12, 0x96, 0xf8, 0x70, 0x8f, 0x3f, 0x7f, 0xfc,
- 0x68, 0x77, 0x77, 0x20, 0xae, 0x2a, 0xce, 0x8e, 0x99, 0x50, 0x31, 0x56,
- 0x4e, 0x7c, 0x8b, 0xe3, 0x4c, 0xb4, 0xc1, 0x57, 0xdc, 0x57, 0x89, 0xbf,
- 0x1b, 0x89, 0x80, 0x3b, 0x83, 0xcf, 0xbe, 0x4a, 0x87, 0x48, 0x26, 0x38,
- 0x38, 0xba, 0x35, 0x83, 0x53, 0xe5, 0x89, 0xb5, 0x0b, 0xba, 0xf4, 0x72,
- 0x05, 0x38, 0x52, 0x9c, 0x87, 0x91, 0xdc, 0x4a, 0x1c, 0x2f, 0x4e, 0x55,
- 0xd2, 0x86, 0x89, 0xa0, 0xe7, 0x2c, 0xf6, 0xe8, 0x0f, 0xa2, 0xe7, 0x2b,
- 0x6d, 0xe0, 0x7c, 0xbe, 0x9e, 0x2c, 0x8c, 0x04, 0x1a, 0xaf, 0xe7, 0x73,
- 0x73, 0xd6, 0xa7, 0xb9, 0xb4, 0xe2, 0x16, 0x5b, 0x41, 0x7b, 0xa2, 0xf5,
- 0xc9, 0x1c, 0x5e, 0x38, 0x51, 0x1a, 0x93, 0x5a, 0xab, 0x6e, 0xc6, 0x95,
- 0x70, 0xb3, 0xde, 0xb6, 0xb5, 0xe2, 0x6f, 0xd5, 0xeb, 0xf9, 0xb0, 0x6f,
- 0x61, 0xb7, 0x59, 0x1d, 0x9a, 0x71, 0x6f, 0x29, 0x6e, 0x6b, 0x04, 0xf6,
- 0x83, 0xf9, 0x93, 0xed, 0x79, 0xdd, 0x4e, 0xd9, 0xb5, 0x7a, 0xe7, 0x0d,
- 0xe9, 0x9d, 0xc0, 0xe0, 0xa1, 0x68, 0x46, 0xf2, 0x82, 0x35, 0xcc, 0x68,
- 0x17, 0x64, 0x6e, 0xd5, 0x29, 0x60, 0x08, 0xbe, 0x2e, 0x0a, 0xb5, 0x1e,
- 0x7e, 0xff, 0x94, 0x1a, 0x20, 0x4a, 0x12, 0xe6, 0x22, 0x43, 0x46, 0x37,
- 0xf1, 0xc7, 0x10, 0x95, 0xa4, 0x12, 0xfc, 0x77, 0xf1, 0x1a, 0x24, 0xe2,
- 0xfc, 0x10, 0x27, 0x3e, 0xd2, 0xeb, 0x52, 0x00, 0x2b, 0xc1, 0x09, 0xc4,
- 0x78, 0x3e, 0x1c, 0x4b, 0x30, 0xfb, 0x32, 0x8b, 0x19, 0x76, 0xed, 0x10,
- 0x8f, 0x82, 0x2d, 0xd4, 0xec, 0x07, 0x95, 0xaf, 0x84, 0xbe, 0x1b, 0x3a,
- 0xae, 0xd0, 0x12, 0x6b, 0x60, 0x13, 0x27, 0x5b, 0x3c, 0x9f, 0x2d, 0x81,
- 0x43, 0xd1, 0x3a, 0x39, 0x24, 0x60, 0xa9, 0xe1, 0xc0, 0xaa, 0xb7, 0x8c,
- 0xcf, 0xde, 0xbd, 0x48, 0x4c, 0x5d, 0x54, 0xc9, 0x2f, 0x35, 0x8f, 0x6b,
- 0x8b, 0x95, 0xf6, 0xb2, 0xdb, 0x99, 0x5e, 0x86, 0xb3, 0xbb, 0x12, 0x41,
- 0x5c, 0xe0, 0xcc, 0x08, 0x24, 0xa9, 0xd3, 0xa9, 0x99, 0x41, 0x87, 0x5b,
- 0x71, 0x7d, 0xda, 0xee, 0x41, 0x62, 0x9b, 0x4c, 0xb6, 0x0c, 0x3f, 0xfd,
- 0x8a, 0xda, 0xf9, 0x94, 0xde, 0xdd, 0xe4, 0xcd, 0x3a, 0x64, 0xba, 0x12,
- 0x29, 0x06, 0x3e, 0x05, 0x42, 0x13, 0x74, 0x12, 0x0e, 0x44, 0x02, 0x56,
- 0x1e, 0x25, 0xbb, 0x35, 0x00, 0x87, 0xb6, 0x4c, 0x82, 0x7a, 0x91, 0x18,
- 0x85, 0xe4, 0x26, 0xc8, 0x10, 0x27, 0x00, 0x53, 0x37, 0xbb, 0x76, 0x05,
- 0x9c, 0x19, 0xe0, 0xf7, 0xff, 0xa9, 0xbf, 0xfc, 0x48, 0x9b, 0xf5, 0x4f,
- 0xdd, 0x2c, 0x99, 0x76, 0x1a, 0xc0, 0x24, 0xc0, 0xbc, 0xfe, 0x3d, 0x36,
- 0xe5, 0x6f, 0x94, 0xd4, 0xc4, 0x3b, 0x43, 0x00, 0x45, 0x18, 0xee, 0xf7,
- 0x23, 0xab, 0x46, 0xeb, 0x10, 0x54, 0xf6, 0xcd, 0xce, 0x82, 0xc9, 0x5d,
- 0xe0, 0x92, 0x22, 0x1a, 0xfc, 0xa1, 0x18, 0x00, 0x6a, 0xd9, 0x58, 0x74,
- 0x84, 0xd2, 0xc2, 0x9d, 0x74, 0xf9, 0x18, 0x7f, 0xa8, 0x04, 0x73, 0xc8,
- 0xd8, 0x32, 0x66, 0xe2, 0x64, 0xe7, 0xf1, 0xcf, 0xe3, 0x86, 0x85, 0x4d,
- 0x97, 0xd5, 0x7d, 0x6e, 0x81, 0x50, 0x99, 0x91, 0xa8, 0x49, 0xbc, 0x9a,
- 0xe2, 0x13, 0xc5, 0x7f, 0x61, 0x52, 0xed, 0x9e, 0x3d, 0x30, 0x5a, 0x04,
- 0x82, 0x5a, 0x5f, 0xe5, 0xa6, 0x6d, 0x36, 0xa8, 0xf7, 0xfb, 0xff, 0xe4,
- 0x44, 0xc0, 0x7f, 0x86, 0xba, 0xef, 0xd9, 0xc5, 0xf1, 0x73, 0x4c, 0xe9,
- 0xf7, 0xc3, 0xfa, 0x6e, 0x39, 0x29, 0x17, 0x72, 0xeb, 0x68, 0xef, 0xcd,
- 0x06, 0xea, 0xcf, 0x98, 0x46, 0x10, 0xab, 0x1b, 0x7a, 0x00, 0x26, 0x83,
- 0x68, 0x6f, 0x0a, 0xd8, 0x61, 0x49, 0x39, 0xe5, 0x82, 0x56, 0xaa, 0x5d,
- 0x30, 0xb7, 0xef, 0xf7, 0x89, 0xa2, 0x92, 0x70, 0x6b, 0x5a, 0x69, 0x40,
- 0xec, 0x81, 0x66, 0xc6, 0x8b, 0x2c, 0xa3, 0xfb, 0xe7, 0x11, 0x8a, 0xb5,
- 0x9e, 0x62, 0xd0, 0x2f, 0xc4, 0x2c, 0xcc, 0x34, 0x3f, 0xa2, 0x6a, 0x92,
- 0x5f, 0x7d, 0xc5, 0x3f, 0x1a, 0x5e, 0xd0, 0x8f, 0x24, 0x87, 0x46, 0xa1,
- 0x06, 0x88, 0x3a, 0xb5, 0xf2, 0x64, 0x10, 0x29, 0x50, 0x4e, 0x62, 0xa9,
- 0x79, 0x94, 0xfa, 0x6e, 0x18, 0x4d, 0x30, 0x4f, 0xbd, 0xd7, 0x1f, 0x33,
- 0x20, 0xf2, 0xe6, 0xd7, 0xd9, 0xe6, 0xd1, 0x40, 0x17, 0xc4, 0x99, 0x97,
- 0xe8, 0xf8, 0x68, 0xd3, 0x3b, 0x7d, 0x64, 0x16, 0xc6, 0x45, 0xe3, 0x68,
- 0xea, 0xe8, 0xbe, 0xe1, 0x38, 0xaa, 0x02, 0x77, 0x8f, 0xa4, 0xfe, 0x90,
- 0x73, 0xcd, 0xeb, 0x90, 0xd1, 0x50, 0x39, 0x0e, 0xf2, 0x8d, 0x68, 0xdc,
- 0x7b, 0xd6, 0x0a, 0x80, 0x4c, 0x66, 0x5c, 0x7e, 0x93, 0xdb, 0x76, 0x7c,
- 0x5b, 0xb2, 0xfa, 0x28, 0x14, 0xbe, 0x79, 0x38, 0x17, 0x27, 0x97, 0xc8,
- 0xd4, 0x09, 0xba, 0x75, 0x97, 0x9c, 0x7d, 0x88, 0x79, 0xa2, 0x8e, 0x65,
- 0x49, 0x7e, 0xdb, 0x48, 0x9c, 0x39, 0x89, 0xb9, 0xf1, 0x10, 0x1d, 0xfd,
- 0x8f, 0x81, 0x9b, 0x0e, 0xfb, 0xb6, 0x86, 0x5e, 0x98, 0x7d, 0x24, 0x90,
- 0x97, 0x9b, 0x87, 0xe3, 0xfc, 0xfb, 0x27, 0xa3, 0xfd, 0xdd, 0xe0, 0x50,
- 0x9b, 0xd5, 0x47, 0x43, 0x1c, 0xd5, 0xdd, 0x47, 0xca, 0x52, 0xc5, 0x99,
- 0x69, 0x54, 0x01, 0x3f, 0xc0, 0xd6, 0x32, 0x7a, 0xc1, 0x7a, 0x45, 0xe3,
- 0x80, 0xc8, 0x17, 0x25, 0x9b, 0x6c, 0xf7, 0x2d, 0x43, 0x22, 0xd4, 0x92,
- 0xd0, 0xe8, 0x83, 0xe8, 0xec, 0xb4, 0x7b, 0xc0, 0x3d, 0x0a, 0x26, 0x46,
- 0x19, 0x28, 0x1f, 0x11, 0xba, 0xb6, 0xc4, 0x64, 0x24, 0x5f, 0x56, 0xe5,
- 0x53, 0xbf, 0x21, 0x2a, 0x1e, 0x00, 0x3d, 0x31, 0x32, 0x28, 0xc5, 0xb2,
- 0xa3, 0x20, 0xc8, 0x9d, 0xff, 0xc1, 0xff, 0xeb, 0x22, 0x56, 0x9a, 0xec,
- 0x08, 0x11, 0x68, 0xa6, 0x49, 0x79, 0x35, 0x5e, 0xfe, 0x41, 0x88, 0x52,
- 0xdf, 0xf9, 0x1f, 0x50, 0xd6, 0x0f, 0xa5, 0xd9, 0xed, 0x22, 0x4f, 0x6b,
- 0x3b, 0x43, 0x5e, 0x02, 0xae, 0x14, 0x16, 0x2c, 0x78, 0x67, 0xf7, 0xde,
- 0x43, 0xce, 0x40, 0x23, 0x05, 0x64, 0xd4, 0xb3, 0x33, 0x9c, 0x38, 0xdc,
- 0xdd, 0x99, 0xfe, 0x0d, 0xd1, 0x35, 0x0f, 0x37, 0x7f, 0x5b, 0x81, 0xe1,
- 0x76, 0x24, 0x8a, 0x07, 0xed, 0x7c, 0x97, 0xb3, 0xe5, 0x40, 0x0c, 0x0a,
- 0x22, 0x27, 0x2c, 0xe6, 0x9e, 0x5b, 0xbb, 0xd3, 0xee, 0xaf, 0xdc, 0x73,
- 0xce, 0xb6, 0x08, 0x88, 0x99, 0x06, 0xfd, 0xcc, 0xab, 0x0c, 0x62, 0xad,
- 0x94, 0xd6, 0x93, 0x58, 0xd6, 0xa3, 0xa0, 0x02, 0x3f, 0xe1, 0xf3, 0x8f,
- 0xf7, 0x23, 0xf4, 0x8f, 0xf4, 0xe1, 0x8f, 0xf9, 0xca, 0xe7, 0x59, 0x27,
- 0xe7, 0x68, 0x3b, 0x8a, 0xda, 0x17, 0x61, 0xa8, 0x9c, 0x65, 0x4c, 0x49,
- 0x17, 0xf2, 0x03, 0xdc, 0xec, 0x7b, 0x37, 0x73, 0xca, 0xf0, 0x07, 0x70,
- 0x08, 0x78, 0x48, 0x11, 0x43, 0x55, 0xd2, 0xd4, 0x3f, 0x40, 0x5e, 0xaf,
- 0x47, 0x91, 0x40, 0x54, 0x12, 0x71, 0x97, 0xf9, 0x4b, 0x3a, 0x7c, 0xd6,
- 0xbb, 0x24, 0x18, 0x58, 0x76, 0x49, 0x3c, 0xff, 0x56, 0xa7, 0x8d, 0xf6,
- 0x42, 0xbc, 0x99, 0xde, 0xb3, 0x24, 0xb7, 0x8c, 0x7b, 0x67, 0x62, 0xbe,
- 0xf4, 0xd1, 0x61, 0xb4, 0x27, 0xef, 0xec, 0x87, 0x8d, 0x62, 0xe2, 0xc0,
- 0xdb, 0x09, 0xbe, 0x50, 0x69, 0x94, 0x27, 0x92, 0xc4, 0x35, 0xea, 0x24,
- 0xa2, 0x60, 0x77, 0xe8, 0xeb, 0x28, 0x3a, 0x07, 0xed, 0x44, 0x5b, 0xfb,
- 0x73, 0x70, 0x3f, 0xe4, 0xeb, 0x42, 0xa2, 0x6f, 0x5e, 0x4a, 0xd7, 0x74,
- 0x3b, 0x9d, 0x7b, 0xe6, 0xc0, 0x57, 0xe0, 0xfe, 0x59, 0xe0, 0x16, 0x7d,
- 0xac, 0xeb, 0x05, 0x91, 0x7a, 0x3e, 0xbf, 0x33, 0x53, 0xaa, 0x7b, 0xc1,
- 0x63, 0x7c, 0x01, 0xca, 0xcf, 0xe9, 0x61, 0x79, 0x06, 0xf3, 0x76, 0x0d,
- 0x9f, 0xe6, 0x2a, 0xa3, 0xe4, 0x1b, 0x06, 0x07, 0xbf, 0x8f, 0x18, 0x49,
- 0x0c, 0xe3, 0xf3, 0x2e, 0xce, 0x27, 0x7c, 0xc2, 0xaa, 0x0b, 0xa3, 0x64,
- 0x5f, 0x6c, 0xc1, 0x7b, 0x59, 0x68, 0x6b, 0x24, 0x1a, 0xc4, 0x85, 0xb6,
- 0xdb, 0x1b, 0x42, 0x85, 0x88, 0xc1, 0x86, 0xe8, 0xee, 0x7f, 0x84, 0x45,
- 0xc9, 0xf1, 0x68, 0xc9, 0x3a, 0xb7, 0x38, 0x49, 0x34, 0x28, 0x88, 0x43,
- 0x23, 0xca, 0xc3, 0x53, 0x92, 0x85, 0x8b, 0x08, 0xf8, 0x79, 0x12, 0x03,
- 0xb3, 0x40, 0xb7, 0x2b, 0x49, 0xc3, 0xd6, 0xb3, 0xde, 0x29, 0xa5, 0xa6,
- 0x74, 0x48, 0xa5, 0xb0, 0x43, 0xfc, 0xa2, 0xd7, 0xc5, 0xea, 0xd2, 0x3d,
- 0x9a, 0x5d, 0x49, 0x3e, 0x53, 0x45, 0x4d, 0x72, 0x2a, 0x08, 0xba, 0x92,
- 0xbb, 0xa0, 0x4f, 0xa9, 0x2b, 0x8c, 0xe4, 0x79, 0xa6, 0x9b, 0x87, 0xd3,
- 0xd9, 0x48, 0xbb, 0x34, 0x98, 0x5a, 0x97, 0x00, 0xf6, 0x2a, 0x3b, 0xa4,
- 0x64, 0x84, 0x4a, 0x64, 0xe7, 0x48, 0x98, 0x5a, 0x96, 0x75, 0xe1, 0x97,
- 0x5c, 0x18, 0xce, 0xd5, 0x61, 0x5c, 0xff, 0xc2, 0xf5, 0xb6, 0x5c, 0x4a,
- 0x98, 0x14, 0x78, 0x54, 0x59, 0x75, 0xb8, 0xd0, 0x7d, 0x82, 0x31, 0xca,
- 0x18, 0x64, 0x0d, 0xca, 0xa3, 0xfc, 0x35, 0xfc, 0xc6, 0x2c, 0x4a, 0xd2,
- 0x5f, 0xfd, 0x2b, 0x47, 0x47, 0x28, 0x3f, 0xde, 0xa9, 0x1d, 0x8e, 0x32,
- 0xd5, 0xca, 0xcd, 0x12, 0x1b, 0x2f, 0xd8, 0x4d, 0x62, 0x48, 0x6b, 0x5d,
- 0x35, 0xce, 0x50, 0xb0, 0x2f, 0xb2, 0x10, 0x8e, 0xbe, 0xf7, 0x6e, 0x10,
- 0x54, 0xdd, 0x47, 0xdb, 0xcd, 0x83, 0x03, 0x37, 0x65, 0x43, 0x79, 0x1e,
- 0x4b, 0x23, 0xcf, 0xc1, 0x0c, 0x18, 0x74, 0xd0, 0x31, 0x2e, 0x7d, 0x3a,
- 0xe2, 0xa3, 0xc3, 0x68, 0x1a, 0x03, 0xde, 0x34, 0x9a, 0x56, 0x09, 0xda,
- 0xa1, 0x10, 0x4a, 0xbd, 0xe7, 0xa6, 0x11, 0x1a, 0x50, 0xf4, 0x8b, 0x16,
- 0xa1, 0xf6, 0x41, 0xf3, 0x87, 0xe1, 0x0e, 0x15, 0xf9, 0x5e, 0xbe, 0xe3,
- 0xb3, 0x88, 0xf8, 0xa7, 0x35, 0xff, 0xff, 0x61, 0x9f, 0xd6, 0x1c, 0xf6,
- 0x70, 0x2c, 0x6a, 0x64, 0xe2, 0xce, 0x81, 0xc6, 0x4a, 0x29, 0x91, 0xe0,
- 0xd2, 0x6b, 0xb5, 0xc2, 0xed, 0x6f, 0x9c, 0x41, 0x63, 0x78, 0x67, 0xbd,
- 0x26, 0x8c, 0xec, 0xf9, 0x7d, 0xb2, 0x5c, 0x2a, 0x31, 0xe0, 0x41, 0xb2,
- 0xe3, 0x11, 0xb8, 0x64, 0xbb, 0x07, 0x4c, 0xcf, 0xac, 0xec, 0x12, 0xfd,
- 0x59, 0xc9, 0x0f, 0xbb, 0x73, 0x72, 0x93, 0xfa, 0x89, 0xb3, 0xe2, 0xf1,
- 0x1e, 0x32, 0xa7, 0x9f, 0x2e, 0xd7, 0x3a, 0x82, 0xad, 0x2b, 0xca, 0x5a,
- 0xb2, 0xea, 0x21, 0xcc, 0xfe, 0x1e, 0x51, 0xd6, 0x92, 0x56, 0xf7, 0xdf,
- 0xd9, 0x3e, 0x51, 0x76, 0x10, 0x65, 0x21, 0x0c, 0xe9, 0xad, 0xff, 0x7b,
- 0x83, 0x94, 0x17, 0x08, 0x0b, 0xc3, 0xcc, 0x72, 0xa2, 0x6b, 0x14, 0x56,
- 0x92, 0x2d, 0xd7, 0x71, 0x44, 0x46, 0xeb, 0x6e, 0x93, 0x78, 0x06, 0xba,
- 0x3a, 0x54, 0x38, 0x8b, 0x4c, 0xfd, 0x22, 0xec, 0x18, 0x19, 0x59, 0x45,
- 0xf7, 0x01, 0x0c, 0xf9, 0xc9, 0x51, 0x7c, 0x0d, 0x40, 0x85, 0xff, 0x6d,
- 0xd6, 0x10, 0x3a, 0x85, 0x46, 0xce, 0xbe, 0xbf, 0x9f, 0x03, 0x48, 0x9e,
- 0xfc, 0x80, 0xfb, 0xd6, 0x72, 0xcd, 0xcf, 0x44, 0x11, 0xa5, 0x1d, 0x76,
- 0x37, 0x39, 0x82, 0xd9, 0x59, 0x7b, 0x8f, 0xc5, 0x83, 0xc7, 0x35, 0xb1,
- 0x9a, 0x0b, 0x4c, 0xdb, 0x96, 0x43, 0x74, 0xcb, 0x48, 0x2c, 0x7c, 0x4c,
- 0x57, 0x2b, 0x91, 0x36, 0xf7, 0x93, 0x3c, 0xc3, 0x36, 0x72, 0x8f, 0x5e,
- 0xea, 0x13, 0x05, 0x84, 0xcc, 0xa6, 0x2c, 0x3f, 0xb1, 0x4b, 0x95, 0x53,
- 0xb0, 0xa9, 0x16, 0x32, 0x09, 0x91, 0xa2, 0x03, 0x92, 0x5f, 0x24, 0x7a,
- 0x6f, 0xf6, 0xc6, 0xe3, 0xaf, 0xf7, 0xb2, 0x66, 0xaa, 0x62, 0x6f, 0xcf,
- 0xa5, 0xff, 0x59, 0xf3, 0xfb, 0x9e, 0xe1, 0x20, 0x78, 0xd1, 0xaf, 0x8f,
- 0x88, 0xdf, 0xfa, 0xb5, 0x1f, 0x40, 0xfb, 0xd8, 0x84, 0xb6, 0x2d, 0xfa,
- 0x0b, 0x2f, 0x53, 0x60, 0xa8, 0x75, 0x75, 0x1d, 0x97, 0x02, 0x26, 0x4d,
- 0x3a, 0x1d, 0x9b, 0xa9, 0xf7, 0xdf, 0x6c, 0xb7, 0xb8, 0xe8, 0x52, 0xc8,
- 0xb3, 0x42, 0x29, 0x3f, 0xeb, 0xd5, 0x6f, 0x7e, 0x9e, 0x28, 0x7b, 0x72,
- 0xe1, 0x64, 0x24, 0x48, 0xdd, 0x3f, 0xe1, 0x15, 0x39, 0x31, 0xd8, 0x4f,
- 0xf1, 0x00, 0xa6, 0xfb, 0xe0, 0x29, 0x3f, 0x78, 0xc6, 0x5c, 0xf9, 0x2b,
- 0x33, 0xc0, 0x84, 0xe1, 0x9c, 0x96, 0x10, 0x10, 0x98, 0xd5, 0x24, 0xbb,
- 0xcc, 0x8b, 0x07, 0x39, 0xf7, 0x34, 0x4b, 0x87, 0xd3, 0x5e, 0xb2, 0xa1,
- 0x1d, 0x57, 0x12, 0x80, 0x6b, 0xc9, 0x15, 0xbe, 0x2c, 0xef, 0x9d, 0x5d,
- 0x2a, 0x40, 0xdb, 0x24, 0x16, 0x3c, 0xdf, 0xfb, 0x54, 0xe9, 0x87, 0xf2,
- 0x78, 0xf2, 0xe9, 0x9a, 0xf2, 0x8f, 0x23, 0x1d, 0xa7, 0x03, 0x37, 0x96,
- 0x51, 0xf8, 0xb8, 0xd6, 0xea, 0x9a, 0xc2, 0xf2, 0x3d, 0x67, 0x61, 0xf5,
- 0xfa, 0xfb, 0xc8, 0x83, 0x12, 0xaf, 0x17, 0x0b, 0x6b, 0x07, 0xdc, 0x2b,
- 0x92, 0x8c, 0x38, 0x5b, 0xe9, 0xf6, 0x10, 0x5d, 0x48, 0x57, 0x4d, 0x22,
- 0xd3, 0x81, 0x5e, 0x8c, 0x41, 0xf2, 0x60, 0x52, 0xe0, 0xb2, 0x4c, 0xdd,
- 0x5b, 0xc5, 0x0d, 0xd6, 0x44, 0x7e, 0x40, 0x88, 0xd3, 0x2f, 0xd3, 0xa9,
- 0x9a, 0x76, 0xf7, 0xcd, 0x2e, 0xe5, 0x4e, 0x73, 0xed, 0x4d, 0x70, 0x48,
- 0x14, 0x56, 0xa1, 0xe0, 0xec, 0xa8, 0x87, 0xd9, 0x6e, 0xb9, 0xb6, 0x8c,
- 0x76, 0xd1, 0x3d, 0x6f, 0xbf, 0xea, 0xd1, 0xc3, 0x2d, 0x90, 0xa8, 0x41,
- 0x8e, 0xb9, 0x62, 0xe6, 0x0f, 0xbf, 0x3e, 0xbf, 0x06, 0x03, 0xd7, 0xca,
- 0x09, 0xd2, 0x4a, 0xdd, 0xf5, 0x11, 0x8c, 0x7c, 0x54, 0xd3, 0x3c, 0xd0,
- 0x15, 0x82, 0x0c, 0xfd, 0xf6, 0x35, 0xea, 0x32, 0x08, 0x4d, 0xca, 0x5c,
- 0xd4, 0xe5, 0xfd, 0x5a, 0xa0, 0x9c, 0x80, 0xd7, 0x28, 0x8a, 0xd0, 0xf5,
- 0x59, 0xc0, 0x1a, 0x5b, 0x88, 0xae, 0x0e, 0x87, 0x9f, 0x1e, 0xe0, 0x52,
- 0x34, 0x07, 0x18, 0xbf, 0x31, 0xac, 0x9b, 0xb7, 0x35, 0xf5, 0x70, 0x97,
- 0x2d, 0x50, 0x2c, 0x32, 0xf7, 0x38, 0xbf, 0xf6, 0x21, 0x44, 0x44, 0x0e,
- 0xcf, 0xc8, 0x5d, 0x45, 0xdf, 0x02, 0x35, 0xca, 0x9c, 0xc9, 0xe7, 0x9c,
- 0xa6, 0x19, 0xc7, 0x9f, 0xe8, 0x75, 0x57, 0xcc, 0x01, 0x23, 0x94, 0xf4,
- 0xc9, 0xe1, 0x7d, 0xae, 0x76, 0x8d, 0x4a, 0x50, 0x06, 0x29, 0x60, 0x03,
- 0x16, 0x33, 0x05, 0x05, 0xa3, 0xfa, 0x4f, 0xf6, 0x48, 0x58, 0xa0, 0xfd,
- 0xe7, 0x9b, 0x87, 0xd3, 0xfe, 0x1c, 0xbf, 0x22, 0xd2, 0xe8, 0x6d, 0x6a,
- 0xee, 0x40, 0xb4, 0xaa, 0xa2, 0x4e, 0xaf, 0x19, 0x61, 0x4c, 0x82, 0x7b,
- 0x70, 0x02, 0x13, 0xc7, 0x6f, 0x37, 0xb5, 0x6d, 0x77, 0xac, 0xab, 0x9b,
- 0x48, 0x09, 0x89, 0xd1, 0xea, 0x29, 0xba, 0x0d, 0x69, 0x61, 0x2c, 0xea,
- 0x14, 0xb5, 0x23, 0xe6, 0x07, 0xd9, 0x6d, 0xc3, 0xc1, 0x05, 0x09, 0xc4,
- 0xd0, 0x54, 0x72, 0xa3, 0xd5, 0x21, 0xcf, 0xc2, 0x81, 0x98, 0x46, 0xaa,
- 0x2a, 0xa4, 0x68, 0x11, 0x5f, 0xb3, 0xfe, 0xba, 0xdb, 0xd9, 0xe5, 0xa8,
- 0xac, 0x72, 0x92, 0x37, 0x48, 0x1a, 0xd5, 0xd1, 0x88, 0xf0, 0x07, 0xe0,
- 0x26, 0x64, 0x3d, 0xc6, 0x86, 0x93, 0xc0, 0x5a, 0xa2, 0x70, 0xa4, 0xed,
- 0x71, 0x97, 0x20, 0x56, 0xc4, 0xdc, 0xec, 0x98, 0x82, 0x82, 0x1a, 0x6a,
- 0xab, 0xbc, 0x12, 0x2d, 0xc2, 0xb1, 0xed, 0x5c, 0x35, 0xe9, 0xc5, 0x2e,
- 0xd9, 0xad, 0x95, 0xa2, 0xb0, 0x37, 0x69, 0x85, 0x62, 0xf6, 0xc0, 0x17,
- 0x95, 0xd7, 0xf5, 0x1a, 0x07, 0xf6, 0xe6, 0xe4, 0xf4, 0xd8, 0x66, 0xb5,
- 0xfd, 0xcf, 0xbd, 0x11, 0x6d, 0x78, 0x35, 0x0d, 0x72, 0xf8, 0xb8, 0x86,
- 0xd4, 0x2b, 0x08, 0x96, 0x22, 0xd3, 0x6f, 0x06, 0xdc, 0xf9, 0x12, 0x3f,
- 0x6e, 0x55, 0x98, 0x1e, 0xbf, 0xfb, 0xf6, 0xe4, 0xfd, 0xd9, 0xbb, 0xb7,
- 0xc7, 0xef, 0x2e, 0x3e, 0xf3, 0xd8, 0x5d, 0xac, 0xaf, 0x43, 0x1d, 0xa6,
- 0x17, 0xe4, 0x14, 0x0e, 0xba, 0x41, 0x09, 0x20, 0xf7, 0x57, 0x31, 0xeb,
- 0x94, 0x7f, 0x8d, 0xfc, 0xe1, 0xbc, 0x87, 0xd4, 0xb3, 0x4f, 0x89, 0x24,
- 0x2b, 0x72, 0xec, 0xcc, 0x28, 0xaa, 0x3a, 0xe2, 0x58, 0x80, 0xed, 0x1d,
- 0x4c, 0xad, 0x25, 0x6e, 0x09, 0xca, 0x1b, 0xa9, 0xc0, 0xd4, 0x27, 0xf6,
- 0x33, 0xbb, 0x25, 0x1c, 0x05, 0x74, 0xb1, 0xd2, 0xd6, 0x24, 0x1c, 0x71,
- 0x7f, 0xe0, 0x12, 0xd0, 0x78, 0x8f, 0x0a, 0xc5, 0xbe, 0x73, 0x6d, 0xe5,
- 0xaf, 0xd2, 0xda, 0xc5, 0x5e, 0xc4, 0x71, 0xe3, 0x03, 0xd5, 0x78, 0xb8,
- 0xc0, 0x5e, 0x9b, 0xe3, 0x2e, 0x16, 0xb0, 0xb7, 0x8a, 0xbf, 0xaa, 0xb7,
- 0xe8, 0xf9, 0xde, 0xde, 0x8f, 0xe8, 0xaf, 0xfd, 0x27, 0x69, 0xb0, 0x1d,
- 0x42, 0xa0, 0xd6, 0xde, 0x44, 0x84, 0xe3, 0x7a, 0xd5, 0x85, 0x44, 0xb7,
- 0x76, 0x3b, 0xe1, 0x06, 0xfe, 0x78, 0xfe, 0xfe, 0xec, 0xfb, 0xbf, 0xfc,
- 0xc2, 0x9f, 0xf0, 0x92, 0xcd, 0xfe, 0x4a, 0x39, 0x98, 0x3a, 0xf8, 0x8f,
- 0x3f, 0xeb, 0x6b, 0x1b, 0x3f, 0xd7, 0x1e, 0x7f, 0x20, 0xa1, 0x76, 0x79,
- 0x23, 0x08, 0x9c, 0xa3, 0x70, 0x9b, 0xfb, 0x5e, 0x69, 0x19, 0xb7, 0xf3,
- 0x70, 0xd8, 0x44, 0x20, 0x96, 0x6f, 0x75, 0x07, 0xcb, 0x23, 0x74, 0xc8,
- 0x02, 0x9a, 0x06, 0x15, 0xc5, 0x2e, 0x83, 0x77, 0x20, 0x65, 0xe5, 0x54,
- 0x37, 0x3e, 0x40, 0x3d, 0x32, 0x32, 0x52, 0xed, 0x7e, 0xbc, 0x3c, 0x3d,
- 0xfd, 0xf9, 0x9b, 0xa0, 0x1d, 0x98, 0xda, 0xdb, 0x80, 0x36, 0xc5, 0x76,
- 0x41, 0x43, 0xab, 0xa3, 0xea, 0x15, 0xd8, 0x84, 0x44, 0xfb, 0xee, 0x4c,
- 0x66, 0xf3, 0x02, 0xca, 0xf1, 0xb0, 0xce, 0x8c, 0x4a, 0x9b, 0x52, 0xc4,
- 0x5f, 0x81, 0xc5, 0x69, 0x62, 0xf5, 0x1e, 0x27, 0x4e, 0x06, 0x48, 0xe7,
- 0xfe, 0x43, 0x9c, 0x55, 0xc9, 0xfb, 0xc9, 0x45, 0x71, 0x28, 0x5b, 0x28,
- 0x2d, 0x2a, 0x11, 0x77, 0x4b, 0x97, 0x86, 0xdd, 0xf3, 0x58, 0x43, 0x66,
- 0xc6, 0x87, 0x20, 0x79, 0x5b, 0xe5, 0xf5, 0x27, 0x14, 0x75, 0xd0, 0x0d,
- 0x85, 0x86, 0xa4, 0x35, 0xfc, 0xa4, 0xf2, 0x62, 0x4e, 0x02, 0x32, 0xe2,
- 0xea, 0xe9, 0xf2, 0x3a, 0x36, 0x3b, 0x12, 0xba, 0x29, 0x8b, 0x62, 0x72,
- 0xa3, 0xb2, 0x13, 0x3a, 0x6d, 0x15, 0x77, 0x09, 0x3e, 0x3b, 0x67, 0x50,
- 0xd5, 0x16, 0x66, 0x20, 0x56, 0x96, 0x3e, 0xd0, 0x72, 0x63, 0x7a, 0x80,
- 0x3f, 0xdd, 0xd4, 0xd9, 0x62, 0xde, 0x53, 0x61, 0xef, 0x33, 0x0c, 0xc7,
- 0x31, 0xb4, 0xc8, 0xdf, 0xf6, 0x8c, 0x77, 0x04, 0x4e, 0x60, 0x1c, 0x88,
- 0x2c, 0x84, 0xfe, 0x3a, 0xa1, 0x44, 0x57, 0x12, 0x7d, 0x8b, 0x14, 0x03,
- 0x21, 0x09, 0x8d, 0xe3, 0x0b, 0x36, 0x22, 0x7d, 0x5c, 0xcf, 0xf6, 0x8b,
- 0x59, 0x58, 0x30, 0x65, 0x58, 0x92, 0x8f, 0xdf, 0xa1, 0x39, 0x79, 0xc3,
- 0xdb, 0x44, 0x81, 0x43, 0xf8, 0xa4, 0x5a, 0xcf, 0xc8, 0x6f, 0x1e, 0x32,
- 0x5c, 0x0a, 0xcf, 0x57, 0xa6, 0x74, 0x9b, 0x34, 0x94, 0xdb, 0xdb, 0x24,
- 0x12, 0xd9, 0x10, 0xc4, 0x22, 0x3a, 0xd9, 0x58, 0x9d, 0x84, 0x37, 0xf1,
- 0x70, 0xe4, 0x07, 0xcc, 0x34, 0x12, 0x1b, 0x36, 0x8f, 0x91, 0x13, 0x9e,
- 0x11, 0x64, 0xfc, 0xf1, 0xec, 0x44, 0x01, 0xc4, 0xc9, 0xb3, 0x64, 0x3d,
- 0x4e, 0xa1, 0xb4, 0xb2, 0x58, 0x10, 0x2e, 0x9e, 0xbe, 0x04, 0x82, 0x43,
- 0x31, 0x08, 0x2e, 0x84, 0xdc, 0x88, 0x56, 0x55, 0xbb, 0x96, 0x0e, 0xb9,
- 0x58, 0x3b, 0xa2, 0x2d, 0x41, 0x2d, 0x2f, 0xf2, 0xf8, 0x05, 0x44, 0x11,
- 0xa1, 0x12, 0x5b, 0x75, 0x20, 0xb5, 0xb2, 0xa8, 0xae, 0x9b, 0x68, 0x95,
- 0xb1, 0x6d, 0xc8, 0x68, 0x44, 0xe0, 0xa2, 0xac, 0x63, 0x70, 0x9a, 0x13,
- 0x4a, 0x9b, 0xcf, 0xd0, 0x8a, 0x87, 0xaf, 0xbc, 0xf9, 0xef, 0xc5, 0xd9,
- 0xab, 0xb3, 0x53, 0xf3, 0x97, 0xe3, 0x37, 0x27, 0xdf, 0x3b, 0xad, 0x40,
- 0x3a, 0x67, 0xd9, 0xda, 0x34, 0x8e, 0x9f, 0x03, 0x7a, 0xf1, 0xe9, 0xa0,
- 0xc5, 0x8e, 0x39, 0x09, 0x91, 0xf2, 0x0f, 0x5b, 0xc2, 0xbc, 0xdd, 0x5f,
- 0xd2, 0xe3, 0x73, 0x24, 0xa7, 0x29, 0x63, 0xd4, 0xc3, 0x1f, 0x49, 0x05,
- 0x7a, 0x89, 0xb4, 0x68, 0x1e, 0xd5, 0xd6, 0x52, 0xb8, 0x4d, 0x3e, 0x69,
- 0xb1, 0x38, 0x68, 0x56, 0xbe, 0xe6, 0xd0, 0x66, 0x8e, 0x3c, 0x29, 0x24,
- 0x61, 0xe4, 0x73, 0x2d, 0x9e, 0x6d, 0xfc, 0x1e, 0xe8, 0x5a, 0x53, 0x25,
- 0x5d, 0x67, 0x28, 0x83, 0xc7, 0x47, 0xb5, 0x2f, 0xb2, 0x81, 0xb7, 0x48,
- 0x55, 0x78, 0x9b, 0x2a, 0x03, 0x63, 0x44, 0x5e, 0x53, 0x0b, 0xe5, 0xa3,
- 0x43, 0x11, 0x44, 0x0a, 0x6e, 0xb8, 0xf6, 0x9a, 0x64, 0x03, 0x24, 0x95,
- 0x0f, 0xb9, 0x15, 0xa4, 0xc8, 0x7b, 0x10, 0x3f, 0x42, 0xad, 0xd1, 0x72,
- 0x41, 0x2e, 0x53, 0xa2, 0x3f, 0xdc, 0x24, 0x94, 0xa5, 0xd2, 0x57, 0x6d,
- 0x33, 0x17, 0x6c, 0x97, 0x06, 0xa5, 0x56, 0xa1, 0x69, 0x45, 0x67, 0x20,
- 0xca, 0x7e, 0x5b, 0xe3, 0xa8, 0x37, 0x7c, 0x3a, 0xdc, 0x80, 0x20, 0xeb,
- 0x9a, 0xb2, 0xbe, 0xeb, 0x47, 0x9b, 0xc6, 0x20, 0x8d, 0xf0, 0xef, 0xeb,
- 0xfc, 0x3a, 0x45, 0x6d, 0x99, 0xb9, 0x2a, 0xc3, 0x21, 0xbf, 0xd4, 0x19,
- 0x23, 0xfd, 0x59, 0x83, 0xa4, 0xed, 0x51, 0x1e, 0xff, 0x9c, 0x41, 0x1e,
- 0x77, 0xc6, 0xb8, 0xfa, 0x59, 0x83, 0x0c, 0x55, 0x40, 0x18, 0xc5, 0xf8,
- 0xfb, 0x93, 0x8b, 0xe4, 0xd5, 0xd9, 0x6b, 0x77, 0xc1, 0x2e, 0x24, 0x1f,
- 0x90, 0x48, 0x20, 0x99, 0xac, 0x0b, 0x43, 0x83, 0xd4, 0x2f, 0xc9, 0x36,
- 0xa0, 0xe0, 0x3c, 0x45, 0x4a, 0xc2, 0xd1, 0x6e, 0xf6, 0x59, 0x5e, 0x31,
- 0x1c, 0x11, 0x25, 0xd6, 0xc0, 0x7b, 0xe3, 0xd5, 0xe8, 0xd2, 0xc3, 0x4b,
- 0x02, 0x3a, 0xba, 0x54, 0xf9, 0x4b, 0x37, 0x92, 0xb0, 0xee, 0xd2, 0x4a,
- 0x4b, 0x4a, 0x27, 0x29, 0xe1, 0x19, 0x15, 0x5c, 0x1b, 0x49, 0x45, 0x29,
- 0x21, 0xf4, 0xb0, 0x0e, 0xe7, 0x23, 0x10, 0x1b, 0xdd, 0x39, 0x6f, 0x74,
- 0x26, 0x7e, 0x26, 0xe1, 0x81, 0xe6, 0xfa, 0xb7, 0x28, 0x5d, 0x1a, 0xd0,
- 0x41, 0xf8, 0x51, 0x52, 0x37, 0x12, 0x5d, 0xc0, 0x47, 0xa4, 0xed, 0xa2,
- 0x9a, 0x2f, 0xdc, 0x86, 0x3a, 0x90, 0xd8, 0x76, 0x08, 0xfb, 0x9d, 0x43,
- 0x09, 0x25, 0x18, 0x15, 0x9d, 0xbd, 0x06, 0x92, 0x57, 0x96, 0xff, 0xc3,
- 0x53, 0xd0, 0x8f, 0xac, 0x3e, 0x66, 0x56, 0xbe, 0x40, 0x67, 0xe7, 0x19,
- 0xdf, 0x88, 0xfa, 0xce, 0x08, 0xf5, 0x5b, 0x18, 0xe4, 0x64, 0x3d, 0x09,
- 0xa2, 0x93, 0x7b, 0xf3, 0x91, 0x68, 0x65, 0x16, 0x36, 0xaa, 0xac, 0xac,
- 0x3d, 0xaa, 0x96, 0xbc, 0xf3, 0x58, 0x68, 0x85, 0x34, 0x43, 0xd9, 0x66,
- 0x75, 0x8e, 0x70, 0x58, 0x78, 0xbd, 0x24, 0x66, 0xa9, 0x5f, 0xd5, 0x8a,
- 0x6b, 0x41, 0xe0, 0xf6, 0x3a, 0x09, 0x5a, 0xb4, 0x1f, 0xf3, 0x29, 0xec,
- 0xd7, 0x90, 0xbb, 0x28, 0x05, 0x75, 0xe9, 0xae, 0x02, 0x53, 0x6d, 0x8e,
- 0x59, 0x89, 0x0d, 0x1c, 0x20, 0x95, 0x97, 0x9a, 0xde, 0xa7, 0x04, 0xf6,
- 0x80, 0xde, 0x85, 0x69, 0xc1, 0x95, 0x86, 0x7a, 0x02, 0xf1, 0x9a, 0x3b,
- 0x57, 0xf3, 0xf4, 0x98, 0xff, 0x78, 0xa5, 0x3a, 0x9b, 0xd6, 0x0d, 0x25,
- 0x56, 0x5d, 0xbb, 0xb0, 0x70, 0x16, 0x62, 0xe2, 0x90, 0x78, 0x9b, 0x42,
- 0x0e, 0x71, 0x1d, 0x41, 0x64, 0x13, 0xea, 0x8e, 0x8f, 0xf3, 0x49, 0xe7,
- 0x2b, 0xfa, 0x11, 0x46, 0x74, 0x72, 0x5f, 0xf0, 0x7d, 0xf2, 0xba, 0x83,
- 0xf2, 0xac, 0x37, 0xda, 0xd3, 0x2e, 0x5d, 0x78, 0x9e, 0x7d, 0x8c, 0x68,
- 0x9f, 0xfc, 0x5c, 0x7c, 0x11, 0x19, 0x15, 0x2d, 0x8a, 0xe6, 0x5c, 0x65,
- 0xab, 0x85, 0xf0, 0x4c, 0xf9, 0x09, 0x42, 0xc7, 0xf0, 0x27, 0x60, 0x97,
- 0xa7, 0x3a, 0x4b, 0xa3, 0x0e, 0xfb, 0xa6, 0xe0, 0x33, 0xf9, 0xac, 0xe1,
- 0xbb, 0xac, 0x39, 0x10, 0xea, 0x46, 0x6e, 0xa9, 0x4d, 0x7a, 0xa1, 0xe3,
- 0x47, 0x94, 0xde, 0x68, 0x64, 0x53, 0x69, 0xff, 0xad, 0x6f, 0x84, 0x48,
- 0x77, 0x2c, 0xbe, 0x9c, 0x2f, 0x19, 0xeb, 0x5d, 0x57, 0x5c, 0xb6, 0xeb,
- 0xd0, 0x1d, 0x15, 0x6e, 0x9d, 0x17, 0x5c, 0x11, 0x22, 0xdf, 0x28, 0x79,
- 0x5b, 0x06, 0xe8, 0x93, 0xe5, 0xbc, 0x91, 0xca, 0x7b, 0xca, 0x4c, 0xe4,
- 0xdd, 0xb9, 0x4a, 0x8b, 0x4b, 0x46, 0x14, 0xf4, 0x06, 0x04, 0x89, 0x5b,
- 0x61, 0x68, 0xae, 0x3a, 0xd4, 0x97, 0x22, 0x32, 0xbb, 0x2e, 0x1e, 0xfa,
- 0xc1, 0xbe, 0xdd, 0x07, 0xe9, 0x94, 0x85, 0xf2, 0x14, 0xda, 0x88, 0xef,
- 0x00, 0x4b, 0x78, 0x93, 0x72, 0x2b, 0x5d, 0xed, 0x37, 0xef, 0x4c, 0x16,
- 0x3d, 0x28, 0x0a, 0xac, 0x85, 0x79, 0xd2, 0xc8, 0xdf, 0x49, 0xd9, 0xa9,
- 0xc6, 0x99, 0x9e, 0x5c, 0xde, 0x28, 0xd2, 0x6a, 0x00, 0x33, 0xdc, 0xb2,
- 0x47, 0x0e, 0xb3, 0x42, 0xbb, 0xa6, 0xca, 0x98, 0x1e, 0x8f, 0x0c, 0xc1,
- 0x56, 0x79, 0xd9, 0x1c, 0x0e, 0x34, 0xc4, 0x5b, 0xcf, 0x81, 0x5b, 0xcf,
- 0x0d, 0x28, 0xe5, 0xfc, 0xe5, 0x78, 0xac, 0x74, 0xf2, 0x2a, 0x24, 0x09,
- 0xf1, 0x59, 0x12, 0x9a, 0x85, 0x02, 0x3a, 0x85, 0xaa, 0xa2, 0x8c, 0xd1,
- 0x49, 0x32, 0x38, 0x60, 0x9e, 0xf6, 0x9a, 0x19, 0x73, 0x7c, 0xb9, 0x37,
- 0xad, 0x4d, 0x64, 0x0f, 0x76, 0x07, 0x05, 0xe4, 0xb3, 0x68, 0xba, 0x0a,
- 0xc7, 0x2b, 0x69, 0x9b, 0x51, 0x8e, 0xac, 0x3c, 0x9e, 0x74, 0x43, 0xc3,
- 0x77, 0xf2, 0x56, 0xcf, 0xc2, 0x83, 0xa3, 0xc8, 0xa2, 0xbf, 0xe5, 0x55,
- 0x0d, 0xfe, 0x95, 0x45, 0x7f, 0x1b, 0x59, 0xf4, 0x23, 0xfb, 0x2d, 0xfe,
- 0xd4, 0xe1, 0xe1, 0x53, 0xa9, 0xaa, 0x60, 0x1f, 0x1d, 0x15, 0xfd, 0x5b,
- 0x06, 0xc4, 0x5f, 0xe3, 0x15, 0x9b, 0x07, 0x87, 0x5c, 0x7f, 0x10, 0x7e,
- 0xcb, 0xbb, 0xbc, 0xde, 0xa7, 0x1e, 0xbb, 0x65, 0x19, 0xd5, 0x9b, 0xc6,
- 0x23, 0xad, 0x9e, 0xf9, 0x4c, 0xc0, 0x7e, 0xd4, 0x98, 0x23, 0x3d, 0xfc,
- 0x86, 0x32, 0xa8, 0x9a, 0x78, 0xea, 0xaf, 0x4e, 0xc3, 0xfb, 0xce, 0x13,
- 0xeb, 0x46, 0xd9, 0x3b, 0xd4, 0x10, 0xfa, 0x4b, 0xf0, 0xe2, 0x45, 0xb6,
- 0xe4, 0x7e, 0x0d, 0x19, 0x81, 0xf5, 0x38, 0x0f, 0x20, 0xd7, 0xdc, 0xcd,
- 0xab, 0x14, 0x68, 0xcb, 0x8b, 0xf4, 0x2e, 0x02, 0xb6, 0x25, 0x9e, 0x62,
- 0x36, 0x57, 0xcc, 0xfd, 0xbc, 0xcc, 0x0a, 0xb2, 0x14, 0xa0, 0x08, 0x88,
- 0xdb, 0x8c, 0xfc, 0xb0, 0x88, 0x9a, 0xcf, 0xad, 0xab, 0x56, 0xbe, 0x1a,
- 0xc0, 0x01, 0xd4, 0xd2, 0xc0, 0x90, 0xef, 0x8c, 0x68, 0x09, 0x71, 0x6c,
- 0xb8, 0x83, 0xa7, 0x76, 0xdf, 0xec, 0x49, 0x90, 0x67, 0x8b, 0x31, 0x42,
- 0xbc, 0xad, 0x53, 0x66, 0xa2, 0x01, 0x01, 0xe9, 0xa3, 0x83, 0x28, 0x5d,
- 0x1e, 0x5a, 0xcd, 0x95, 0xa7, 0x20, 0x1e, 0x30, 0x37, 0x3e, 0x27, 0x5e,
- 0x27, 0x80, 0xbb, 0xa3, 0xe4, 0x0c, 0x5e, 0xb8, 0x16, 0xc8, 0x38, 0x57,
- 0x02, 0xa5, 0xae, 0x68, 0xb4, 0x4d, 0xb8, 0xcf, 0xbc, 0x13, 0xd6, 0x59,
- 0x69, 0xf6, 0xcb, 0x9e, 0xb0, 0x59, 0x07, 0xc1, 0xa4, 0xbe, 0xe6, 0x2c,
- 0x79, 0x7f, 0x7c, 0xf1, 0x1e, 0x81, 0x5e, 0x62, 0x00, 0x01, 0x48, 0x6a,
- 0x5a, 0xed, 0x5a, 0x90, 0x20, 0xe1, 0x66, 0x4e, 0x0f, 0x71, 0x0c, 0x82,
- 0xf1, 0xcb, 0xec, 0x79, 0xf3, 0x3f, 0xf5, 0x3d, 0xae, 0x7e, 0xc9, 0xb4,
- 0xd6, 0xc4, 0x85, 0x74, 0xda, 0xc8, 0x6a, 0x87, 0x87, 0x2e, 0x0b, 0x09,
- 0xbd, 0x8d, 0x59, 0xca, 0x49, 0x26, 0xf9, 0x48, 0x92, 0x36, 0xb5, 0xfa,
- 0x42, 0x5b, 0x09, 0xd0, 0x43, 0x9c, 0x8c, 0x5d, 0x56, 0x31, 0xbd, 0x43,
- 0x3e, 0x6d, 0x15, 0x00, 0x99, 0x84, 0x5f, 0x98, 0xc0, 0xd5, 0xe0, 0x1e,
- 0x07, 0xe5, 0x1a, 0xc0, 0x47, 0xfb, 0xfb, 0x61, 0xde, 0x70, 0x3a, 0x31,
- 0x4c, 0x55, 0xb4, 0x39, 0xa9, 0xea, 0xc1, 0x2b, 0xec, 0x35, 0x85, 0x7a,
- 0x59, 0x93, 0xad, 0x31, 0x9c, 0x93, 0x1b, 0x93, 0x76, 0x2c, 0x34, 0x2a,
- 0x0e, 0x99, 0xc7, 0x7c, 0x87, 0x32, 0x23, 0xd9, 0xb3, 0x36, 0x67, 0xe1,
- 0x0a, 0x24, 0xed, 0x9d, 0x9b, 0x6a, 0x92, 0x31, 0x6a, 0x82, 0xc5, 0xfb,
- 0x1d, 0xcc, 0x2c, 0xe0, 0xdf, 0x87, 0x8f, 0x23, 0x14, 0x91, 0x8c, 0x2f,
- 0xce, 0xde, 0x2b, 0xf6, 0x7e, 0x28, 0x9f, 0x91, 0xf9, 0x40, 0x4f, 0x58,
- 0xa8, 0x95, 0x41, 0x08, 0xb9, 0x33, 0xb3, 0xf8, 0x00, 0x16, 0xc6, 0xd4,
- 0xfb, 0x2a, 0x73, 0x00, 0xb4, 0xd0, 0x93, 0xb5, 0x7d, 0x2b, 0x80, 0x00,
- 0x0a, 0xd9, 0xab, 0xf7, 0xd2, 0x7b, 0x89, 0xaf, 0xd9, 0x19, 0xdf, 0x5f,
- 0xae, 0x5f, 0x27, 0x3a, 0x92, 0x4a, 0x76, 0x42, 0xfc, 0x95, 0x74, 0x58,
- 0xdb, 0xe9, 0xb3, 0x4b, 0x8b, 0x7c, 0x89, 0xce, 0x1c, 0x24, 0x33, 0x73,
- 0x78, 0x59, 0xa4, 0xb5, 0x8c, 0xd1, 0x6d, 0x96, 0xf8, 0x04, 0x43, 0x16,
- 0x4b, 0x62, 0x53, 0xca, 0xbe, 0xb0, 0x69, 0x00, 0xeb, 0x5e, 0x56, 0x0a,
- 0xd2, 0x2a, 0x82, 0x53, 0x8d, 0x05, 0xa7, 0x67, 0x7b, 0x52, 0xff, 0xfc,
- 0xec, 0xfd, 0x45, 0x62, 0x85, 0x3e, 0xbe, 0x8c, 0x1f, 0x75, 0x2e, 0x10,
- 0xb5, 0x4c, 0x81, 0xcf, 0xce, 0x95, 0x6d, 0x04, 0x0e, 0x49, 0xb1, 0x09,
- 0x9a, 0xce, 0x10, 0x03, 0xb4, 0xd9, 0x9b, 0x95, 0x8c, 0xe5, 0xe3, 0xc2,
- 0x8f, 0x82, 0xd2, 0x05, 0x39, 0xd3, 0x87, 0x0c, 0xe6, 0x94, 0xdb, 0xa3,
- 0x83, 0x08, 0x65, 0x90, 0x15, 0xfd, 0xfe, 0x78, 0x7c, 0xc1, 0x3b, 0x46,
- 0x7f, 0x0b, 0xe6, 0xcd, 0x05, 0xa2, 0xf2, 0xc3, 0xc0, 0x50, 0xb1, 0x94,
- 0x41, 0x09, 0x68, 0xc6, 0xda, 0xc0, 0xf8, 0xb6, 0xc0, 0xdd, 0xdb, 0xb1,
- 0x23, 0x2f, 0xdb, 0x10, 0x5c, 0x53, 0xe8, 0x04, 0x17, 0x1c, 0x3f, 0xd8,
- 0x92, 0x8f, 0x6c, 0x19, 0xc5, 0x8c, 0x2f, 0x44, 0x0b, 0x7e, 0xfd, 0xe8,
- 0x91, 0xc7, 0x29, 0x48, 0x4e, 0xc9, 0x00, 0x27, 0xda, 0x26, 0x97, 0x7e,
- 0x38, 0x54, 0x52, 0x81, 0xb0, 0x60, 0xa2, 0xe0, 0xe7, 0xdc, 0x38, 0x8f,
- 0xa5, 0x44, 0xfd, 0xd4, 0xaa, 0x0a, 0xde, 0x54, 0xe8, 0xc7, 0x9a, 0xf1,
- 0x03, 0xb5, 0xad, 0x43, 0x72, 0x47, 0x4c, 0xe9, 0x7f, 0x36, 0x84, 0x6e,
- 0xb3, 0x16, 0x79, 0xe9, 0xbe, 0x5c, 0x30, 0xba, 0x56, 0x5e, 0xac, 0x33,
- 0xe8, 0x68, 0x69, 0xb5, 0xa0, 0x56, 0x0f, 0x86, 0x87, 0x54, 0x52, 0x40,
- 0x76, 0x53, 0xc4, 0x60, 0xa9, 0xbd, 0x6f, 0x88, 0xfc, 0x39, 0x39, 0x3d,
- 0x76, 0x27, 0xc5, 0x7d, 0x22, 0x70, 0x83, 0x9d, 0xae, 0x4f, 0xad, 0xed,
- 0xad, 0x98, 0x18, 0x25, 0xe7, 0xd4, 0xb3, 0x1c, 0x7a, 0x53, 0xfd, 0xef,
- 0x6e, 0x34, 0xbe, 0x24, 0xf0, 0xc0, 0x1b, 0xb1, 0x09, 0x33, 0x25, 0x2f,
- 0xcc, 0xc1, 0xe2, 0x27, 0xf4, 0x57, 0x0f, 0xd3, 0x3c, 0x58, 0xee, 0x33,
- 0xf7, 0x72, 0x6d, 0x96, 0x62, 0x0c, 0xf4, 0xee, 0x23, 0x8f, 0x84, 0xae,
- 0x8c, 0xf5, 0x8e, 0x21, 0x2c, 0x6f, 0xa6, 0xbb, 0x2c, 0xad, 0x62, 0x66,
- 0x3c, 0xc2, 0x5c, 0x9f, 0x69, 0xf1, 0x70, 0x6f, 0x28, 0x16, 0x06, 0x2f,
- 0x27, 0xb6, 0x81, 0x10, 0xa5, 0x09, 0x93, 0x22, 0x67, 0xc6, 0x2a, 0x88,
- 0xd3, 0x2e, 0x6c, 0xae, 0xbd, 0x0d, 0x03, 0x13, 0xaf, 0x9c, 0xe8, 0xb5,
- 0xa1, 0x95, 0x74, 0x37, 0xb7, 0xd3, 0x80, 0xfd, 0x11, 0x53, 0xa2, 0x25,
- 0x1b, 0x2b, 0xbf, 0x5a, 0xb3, 0x93, 0xfc, 0x64, 0x01, 0xbd, 0x23, 0xa7,
- 0x01, 0xc5, 0x03, 0x8c, 0x80, 0xf7, 0x95, 0xff, 0x47, 0x8f, 0xdd, 0x50,
- 0x73, 0xaa, 0xe9, 0xb4, 0x63, 0x39, 0xde, 0x63, 0xbb, 0x48, 0x30, 0x02,
- 0x03, 0x1e, 0x13, 0x8b, 0x91, 0x9b, 0x75, 0x4f, 0x22, 0xe8, 0x6f, 0xfe,
- 0x9e, 0x3c, 0x15, 0xd3, 0x97, 0x6c, 0xdf, 0xe2, 0xce, 0xe5, 0xde, 0x4b,
- 0xd3, 0x6e, 0xf6, 0x9b, 0x71, 0xa3, 0x1a, 0xf9, 0x8d, 0x80, 0x30, 0x5e,
- 0x89, 0x5f, 0x86, 0x5a, 0x51, 0x05, 0x88, 0x8b, 0xeb, 0xa5, 0xe4, 0xf0,
- 0x7a, 0x5f, 0xfa, 0x5c, 0x3c, 0x19, 0x54, 0x79, 0x6e, 0xf1, 0x1a, 0x3d,
- 0x2e, 0x5a, 0xaa, 0xc5, 0x6c, 0x61, 0x8c, 0x0c, 0xf1, 0x20, 0xb7, 0xd4,
- 0xd6, 0xba, 0x87, 0x18, 0x7b, 0x84, 0x5d, 0x06, 0x51, 0x2c, 0xea, 0xae,
- 0x3a, 0x15, 0x4a, 0x0f, 0xfa, 0x8a, 0x36, 0x5c, 0x9e, 0xe3, 0x5f, 0x29,
- 0x40, 0x4a, 0xe8, 0x12, 0xaf, 0xb2, 0xbf, 0x41, 0x91, 0x74, 0xfd, 0x5a,
- 0x35, 0xa6, 0x9c, 0x16, 0xeb, 0xd4, 0xb3, 0xe5, 0x1f, 0x3d, 0x13, 0x0f,
- 0x95, 0xb8, 0x41, 0x28, 0xac, 0x5e, 0x64, 0x4d, 0x10, 0x5e, 0x7c, 0x7c,
- 0x60, 0x7d, 0x95, 0x94, 0x31, 0x2b, 0x75, 0x20, 0x7e, 0xde, 0xac, 0x61,
- 0x6e, 0xe3, 0xf1, 0xd7, 0xc9, 0xdb, 0xd7, 0x8f, 0x29, 0x9d, 0xe7, 0x32,
- 0xab, 0x56, 0x15, 0xa5, 0x70, 0x2a, 0x0d, 0x9f, 0x7d, 0xe3, 0x0d, 0x76,
- 0xe8, 0x1c, 0x9f, 0x22, 0x62, 0x73, 0xb9, 0xbd, 0x64, 0x2b, 0x98, 0xf3,
- 0xa3, 0xba, 0xe7, 0x4b, 0x45, 0x46, 0x60, 0xef, 0x17, 0xa0, 0x17, 0x04,
- 0xac, 0x8a, 0x95, 0x96, 0xcf, 0xba, 0x49, 0xe1, 0x2d, 0x06, 0xf6, 0xf8,
- 0xc8, 0x31, 0xb0, 0xea, 0x6e, 0x45, 0x9d, 0x55, 0x8a, 0x4b, 0xb2, 0x0b,
- 0x22, 0x37, 0xea, 0x31, 0x33, 0xcd, 0x57, 0x7c, 0xef, 0x49, 0x89, 0x0d,
- 0x5f, 0x83, 0x7a, 0x0e, 0x7f, 0xa9, 0xf7, 0xde, 0x63, 0xdf, 0xab, 0x50,
- 0x4b, 0x6f, 0x34, 0x69, 0x89, 0x01, 0x1d, 0xc5, 0x7b, 0xf6, 0x89, 0x7d,
- 0x96, 0x1c, 0x47, 0x79, 0xe1, 0xb5, 0x30, 0xea, 0x79, 0x43, 0x94, 0x5f,
- 0x35, 0x10, 0x34, 0x92, 0xc3, 0x1a, 0x8f, 0xb7, 0xf7, 0xde, 0x2b, 0xcf,
- 0xda, 0x4e, 0x13, 0xf4, 0x0f, 0xb0, 0xa4, 0x89, 0x45, 0xa1, 0xb3, 0xac,
- 0xe7, 0x66, 0x61, 0x19, 0x7d, 0x4e, 0x69, 0xd0, 0xad, 0xf3, 0x54, 0x26,
- 0x98, 0xf9, 0x18, 0x22, 0x7a, 0xd7, 0x99, 0xf6, 0x5f, 0xbd, 0xec, 0x2b,
- 0x02, 0x02, 0xb5, 0x7b, 0x1f, 0x39, 0x90, 0x3b, 0x43, 0x7d, 0xa9, 0x2f,
- 0x8b, 0xfc, 0x1f, 0x0a, 0x5f, 0x40, 0x02, 0x5a, 0xdb, 0x4f, 0x79, 0x8f,
- 0x1f, 0x0a, 0xc3, 0xe0, 0xde, 0xc3, 0x60, 0x8a, 0x14, 0x3c, 0x75, 0x0f,
- 0x1c, 0x09, 0xd5, 0x72, 0xf7, 0x38, 0x68, 0xff, 0x94, 0x84, 0x8f, 0xd0,
- 0x7d, 0xd6, 0x4a, 0xab, 0x7f, 0xf2, 0x48, 0x74, 0x2e, 0x55, 0x8e, 0x49,
- 0xf2, 0xd2, 0x46, 0x2c, 0x00, 0xc9, 0xd8, 0x65, 0xd3, 0x4f, 0x44, 0xec,
- 0xc9, 0x51, 0x4a, 0xaf, 0xf5, 0xd4, 0x35, 0xf3, 0xa2, 0xbf, 0xde, 0xe4,
- 0x85, 0xa4, 0xba, 0x07, 0xaf, 0x3f, 0xe9, 0x71, 0x3f, 0xd6, 0x2c, 0x33,
- 0x8f, 0x41, 0x4b, 0xde, 0xf3, 0x4f, 0xed, 0x4d, 0xf0, 0xc0, 0x3d, 0x15,
- 0xc8, 0x70, 0xe0, 0x03, 0x96, 0xea, 0x45, 0x12, 0xff, 0x49, 0xa6, 0x9d,
- 0x0e, 0x22, 0xc8, 0xf2, 0x73, 0xfb, 0xf9, 0x45, 0x79, 0x99, 0xf8, 0x98,
- 0x2c, 0x4f, 0x98, 0xa4, 0xde, 0xa0, 0x5d, 0x85, 0xb3, 0x0e, 0x8a, 0xe4,
- 0xc2, 0x2b, 0x93, 0x75, 0x4f, 0x3f, 0x13, 0xda, 0x50, 0x79, 0x69, 0x8d,
- 0xd5, 0xbe, 0x37, 0x9e, 0xee, 0xfb, 0xca, 0xea, 0x8c, 0xa2, 0xb2, 0x5c,
- 0xc6, 0xdf, 0xfb, 0x02, 0x53, 0xc6, 0x89, 0x11, 0x23, 0x97, 0x86, 0xa8,
- 0xf1, 0x8c, 0x83, 0x32, 0x74, 0x8f, 0x1d, 0xb6, 0x98, 0xee, 0x85, 0xaf,
- 0x3e, 0x25, 0x27, 0xaf, 0xbd, 0x07, 0x8f, 0xdc, 0x02, 0xd3, 0x05, 0x69,
- 0x03, 0x77, 0xec, 0xa8, 0xaa, 0x93, 0x1d, 0x7a, 0xcb, 0xc3, 0x2c, 0x79,
- 0xca, 0x94, 0xf1, 0xae, 0x64, 0xd0, 0x2d, 0xec, 0x7f, 0xf0, 0x0c, 0x93,
- 0xc3, 0xab, 0x2b, 0x23, 0xd5, 0xa6, 0x0d, 0x72, 0x42, 0x0b, 0x8d, 0x70,
- 0x75, 0xcf, 0xfe, 0xe9, 0x93, 0x0d, 0xcf, 0x8a, 0xd0, 0xac, 0xad, 0xa8,
- 0xf7, 0xde, 0x7b, 0x1a, 0x5e, 0x73, 0x35, 0x07, 0xb4, 0x4a, 0x41, 0x6e,
- 0x5a, 0xb2, 0x43, 0xe5, 0xd1, 0xff, 0xae, 0x9e, 0xc1, 0x8a, 0xf0, 0x04,
- 0xeb, 0x7f, 0xf7, 0xe7, 0xfb, 0xb9, 0x5f, 0xc3, 0xc7, 0x3e, 0xc1, 0x2a,
- 0x43, 0x98, 0x60, 0xda, 0x6a, 0x17, 0xe1, 0x32, 0x84, 0xb0, 0x3b, 0xde,
- 0x08, 0x7c, 0xe6, 0x46, 0x8f, 0x58, 0x17, 0x8e, 0x73, 0xb0, 0x01, 0x28,
- 0x58, 0x04, 0x33, 0x1f, 0x77, 0x92, 0x78, 0xbe, 0x78, 0xa1, 0x3c, 0x1f,
- 0xea, 0x7e, 0xe7, 0x1a, 0xd4, 0x57, 0x6b, 0xb6, 0xb8, 0xed, 0x8a, 0x9c,
- 0x83, 0xcd, 0x7b, 0xed, 0xd0, 0x71, 0x2f, 0x11, 0xfb, 0x5c, 0x70, 0xf2,
- 0x8a, 0xa2, 0xc0, 0x6c, 0x96, 0xdb, 0x26, 0x02, 0x70, 0x8f, 0x57, 0x25,
- 0xfb, 0x0c, 0x09, 0x6c, 0x63, 0x27, 0x8d, 0xa7, 0x66, 0x4a, 0x12, 0xb9,
- 0xf7, 0x19, 0x51, 0x6d, 0x28, 0xc5, 0xc9, 0x9c, 0xd2, 0x55, 0x36, 0xfd,
- 0xa4, 0x57, 0xc6, 0x8e, 0x11, 0x79, 0xeb, 0x91, 0xdd, 0x5a, 0xa2, 0xbe,
- 0xf3, 0xf7, 0xc7, 0x5d, 0x23, 0xc0, 0x3d, 0xca, 0x54, 0xf3, 0xfe, 0x62,
- 0x7c, 0xfe, 0x9c, 0xe6, 0xcb, 0x61, 0x43, 0x73, 0x21, 0x5e, 0x8d, 0xb3,
- 0xbf, 0x4b, 0x99, 0x59, 0xed, 0x9e, 0x7e, 0xd2, 0xf3, 0xf4, 0x58, 0x9c,
- 0x7b, 0x27, 0x40, 0x6a, 0x36, 0xe7, 0xe0, 0xbf, 0xc4, 0x44, 0xb3, 0x2e,
- 0xd4, 0xbf, 0xcf, 0x2e, 0x30, 0x9a, 0x19, 0xb8, 0x21, 0x85, 0x96, 0xdd,
- 0xc3, 0x9f, 0x3b, 0x4f, 0xcd, 0xd5, 0xba, 0xf8, 0x64, 0xf5, 0x45, 0xc1,
- 0xd1, 0xd3, 0x03, 0x76, 0x2f, 0x3c, 0xd3, 0xab, 0xe1, 0xf9, 0x41, 0x6d,
- 0xde, 0xd3, 0x40, 0x3c, 0x14, 0xe2, 0x7a, 0x94, 0x78, 0xa7, 0xe1, 0xaf,
- 0x6b, 0x6f, 0x0f, 0x9e, 0xed, 0x5b, 0xf1, 0x2b, 0x88, 0x3c, 0x9f, 0xb2,
- 0x3b, 0x47, 0x75, 0x9a, 0x63, 0xb1, 0xca, 0x0b, 0x72, 0x41, 0xb8, 0x47,
- 0xdc, 0x00, 0x07, 0x2d, 0x21, 0xd0, 0x55, 0x37, 0xea, 0x26, 0x6d, 0xd6,
- 0x9e, 0x88, 0x79, 0xc6, 0xb4, 0x33, 0xa6, 0xa8, 0xe3, 0x52, 0xe8, 0x35,
- 0x2f, 0xd4, 0xdb, 0xd6, 0x71, 0xa1, 0xe9, 0x4b, 0xdf, 0x7f, 0xcf, 0x72,
- 0xc4, 0x82, 0xc5, 0x49, 0xe8, 0xca, 0x36, 0x7f, 0x32, 0x7c, 0x97, 0x01,
- 0x84, 0xe9, 0x0a, 0x23, 0xe0, 0x53, 0x65, 0xd4, 0x9e, 0x52, 0xd1, 0x6f,
- 0x70, 0x79, 0x62, 0xd1, 0xf3, 0xb2, 0x90, 0x98, 0x2d, 0x25, 0x6f, 0xc2,
- 0xf3, 0xc9, 0x60, 0xd3, 0xec, 0x0b, 0x33, 0x33, 0x78, 0xf9, 0xe1, 0xe2,
- 0xeb, 0xb3, 0xf7, 0xe3, 0x64, 0x8f, 0x4a, 0xdb, 0x2f, 0xde, 0x9f, 0xfc,
- 0xf9, 0xc3, 0x85, 0xf9, 0xa7, 0x8e, 0xf4, 0x3a, 0x2d, 0x72, 0x23, 0x9d,
- 0xcc, 0x72, 0xb2, 0xc2, 0x10, 0xcb, 0xa5, 0x36, 0x69, 0x62, 0xe8, 0x62,
- 0x23, 0x8f, 0xcb, 0x4a, 0x11, 0x4d, 0x28, 0x1f, 0xa5, 0x94, 0x13, 0x67,
- 0x54, 0xbf, 0x82, 0x33, 0xfc, 0x4a, 0x67, 0x39, 0xe7, 0x9d, 0xa2, 0x7c,
- 0x4d, 0xdb, 0x49, 0x2e, 0xbe, 0x7e, 0xf9, 0xee, 0x9b, 0xb1, 0x76, 0xf0,
- 0xf8, 0xee, 0xbb, 0xef, 0xba, 0xc1, 0x5d, 0xe8, 0xb1, 0x57, 0xe9, 0xed,
- 0xed, 0xa8, 0xce, 0x3e, 0xfb, 0x6c, 0x7c, 0x7c, 0x9c, 0xbc, 0x3c, 0x1d,
- 0x9f, 0x7d, 0xe6, 0x70, 0x1c, 0x76, 0x0e, 0x08, 0xc1, 0xea, 0x32, 0x6b,
- 0xcc, 0x5f, 0x3e, 0xfb, 0xec, 0xff, 0x03, 0x4d, 0xda, 0xc1, 0xce, 0xef,
- 0x98, 0x02, 0x00,
+ 0x7b, 0x7b, 0xdc, 0xc6, 0x91, 0x2e, 0xfe, 0xbf, 0x3f, 0x05, 0x96, 0x79,
+ 0x72, 0x48, 0x6e, 0x66, 0x86, 0x37, 0x5d, 0x2c, 0x46, 0xf6, 0x9a, 0xa6,
+ 0x28, 0x9b, 0x6b, 0x4a, 0xe4, 0x6a, 0x28, 0xdb, 0x39, 0xb1, 0x1f, 0x3d,
+ 0xe0, 0x0c, 0x48, 0x22, 0x9a, 0x01, 0x26, 0x00, 0x86, 0x97, 0xec, 0xe6,
+ 0x7c, 0xf6, 0x5f, 0xd7, 0x5b, 0x55, 0xdd, 0x0d, 0x74, 0x63, 0x48, 0x3b,
+ 0x56, 0xf6, 0x5c, 0x7e, 0xd9, 0x73, 0x64, 0x89, 0x04, 0x1a, 0xdd, 0xd5,
+ 0xd5, 0xd5, 0x75, 0x7d, 0x2b, 0x49, 0x1e, 0xfa, 0xdf, 0x07, 0xfc, 0xff,
+ 0x0f, 0xe6, 0x7f, 0xe6, 0xbf, 0x9f, 0x25, 0xc9, 0x59, 0x55, 0xfe, 0x25,
+ 0x9b, 0x34, 0xf1, 0x67, 0x3f, 0x7c, 0xf8, 0xaf, 0x84, 0xff, 0xcf, 0xbc,
+ 0xf3, 0x93, 0xf9, 0xef, 0x67, 0x2b, 0xc7, 0xde, 0x4a, 0xdc, 0x0b, 0xff,
+ 0xf5, 0x61, 0x33, 0x79, 0xe8, 0x85, 0xff, 0x4a, 0x36, 0xf0, 0xc2, 0x07,
+ 0xf9, 0xc2, 0x4b, 0xfa, 0xfb, 0x87, 0x0f, 0xab, 0x3f, 0xf2, 0x13, 0xcd,
+ 0x8a, 0xfe, 0xd8, 0xa2, 0xf7, 0x7e, 0xfa, 0x40, 0x7f, 0x35, 0x3f, 0xf9,
+ 0xec, 0xb3, 0xb7, 0x07, 0x6f, 0x8e, 0xf4, 0xd5, 0xc9, 0xb2, 0x9a, 0x25,
+ 0xc3, 0xa4, 0xa9, 0xd2, 0xa2, 0xbe, 0xcc, 0xaa, 0x24, 0x4d, 0xde, 0xbf,
+ 0x3b, 0xf9, 0xec, 0xb3, 0xf1, 0x9f, 0xde, 0x9e, 0x9e, 0x8d, 0x8f, 0xc7,
+ 0xad, 0xc7, 0xfe, 0x5c, 0x2e, 0x9a, 0xbc, 0x2c, 0x6a, 0x33, 0x7d, 0xf3,
+ 0x50, 0xfd, 0xf3, 0x67, 0x9f, 0xbd, 0x3a, 0x1a, 0x1f, 0xbe, 0x3b, 0x3e,
+ 0x3b, 0x3f, 0x3e, 0x7d, 0xdb, 0x7a, 0x32, 0xc9, 0xeb, 0xc4, 0x0c, 0xd5,
+ 0x94, 0xe5, 0xcc, 0xfc, 0xe1, 0x46, 0x9f, 0xa6, 0x4d, 0x9a, 0x5c, 0x56,
+ 0xe5, 0x3c, 0x29, 0x2b, 0xfa, 0x45, 0x9a, 0xd4, 0x59, 0x75, 0x93, 0x55,
+ 0x83, 0x64, 0x59, 0xe7, 0xc5, 0x55, 0x52, 0x16, 0x59, 0x52, 0x5e, 0x26,
+ 0xcd, 0x75, 0xa6, 0xc3, 0xd5, 0xcb, 0xc5, 0xa2, 0xac, 0x9a, 0x6c, 0x9a,
+ 0x2c, 0xaa, 0xb2, 0x29, 0x27, 0xe5, 0xac, 0x4e, 0x36, 0x5e, 0x1d, 0x1f,
+ 0x9e, 0x0f, 0x92, 0xd7, 0xc7, 0x27, 0x47, 0xe6, 0xcf, 0xf3, 0x33, 0xfc,
+ 0x31, 0x1e, 0x24, 0xdf, 0x9c, 0x9e, 0x7d, 0x7b, 0xf4, 0x6e, 0x90, 0x7c,
+ 0x7b, 0x4e, 0x3f, 0xa3, 0x3f, 0xcd, 0x0f, 0x93, 0xe3, 0x37, 0x07, 0x67,
+ 0x03, 0x1d, 0x8e, 0xfe, 0x41, 0x3f, 0x3c, 0x79, 0x65, 0x7e, 0xc8, 0xff,
+ 0xa1, 0x7f, 0xbe, 0xf9, 0x8f, 0x73, 0x33, 0xe0, 0xd9, 0xe9, 0xd9, 0x1e,
+ 0xff, 0x69, 0x7e, 0xf6, 0xee, 0xfc, 0xcd, 0x19, 0xff, 0x89, 0x7f, 0x8c,
+ 0xcd, 0x3f, 0xc6, 0x87, 0xf4, 0x07, 0x7d, 0x50, 0x87, 0x1b, 0xbf, 0xf9,
+ 0x7a, 0x40, 0x7f, 0x8c, 0xe9, 0x4f, 0xfa, 0x28, 0xfd, 0x69, 0xfe, 0x71,
+ 0x7e, 0x74, 0xf2, 0xf6, 0xe8, 0x3c, 0x49, 0x8b, 0x69, 0x72, 0x6e, 0x9e,
+ 0xdf, 0x1c, 0x25, 0xe7, 0xd7, 0x59, 0x32, 0x29, 0xe7, 0x73, 0xfa, 0x11,
+ 0xa8, 0x33, 0xcd, 0xea, 0xfc, 0xaa, 0x30, 0xeb, 0x32, 0x74, 0xd0, 0xe1,
+ 0x6e, 0xcb, 0xea, 0x63, 0x72, 0x9b, 0x37, 0xd7, 0xe5, 0xb2, 0x31, 0x14,
+ 0x31, 0x04, 0xcb, 0x8b, 0x26, 0xab, 0xd2, 0x09, 0x91, 0x7d, 0xf4, 0x59,
+ 0x8b, 0xc4, 0xe5, 0xa5, 0x21, 0x68, 0x6d, 0x28, 0x78, 0xb1, 0xac, 0x67,
+ 0x65, 0x3a, 0x25, 0xba, 0x99, 0x57, 0x2e, 0x97, 0x86, 0xe2, 0x55, 0x3e,
+ 0xf9, 0x58, 0x27, 0xb3, 0xfc, 0x63, 0x46, 0x54, 0xbb, 0xbb, 0x57, 0x2a,
+ 0x0e, 0x78, 0xd0, 0x74, 0x69, 0x08, 0x5c, 0x0c, 0x75, 0xb8, 0x26, 0x9f,
+ 0xa4, 0xf4, 0x01, 0x90, 0x31, 0x59, 0x2e, 0x68, 0x34, 0x26, 0x5f, 0xb2,
+ 0x28, 0x6b, 0xf3, 0xd2, 0x78, 0x7c, 0x62, 0xe6, 0x5e, 0x14, 0x19, 0xe6,
+ 0x51, 0x0f, 0xcc, 0x3f, 0xca, 0x8f, 0x79, 0x66, 0xfe, 0x72, 0x99, 0xcf,
+ 0xb2, 0x84, 0xb7, 0xd7, 0x0e, 0x47, 0xfb, 0x9c, 0x54, 0x59, 0xbd, 0x9c,
+ 0x67, 0x44, 0xd9, 0xac, 0x49, 0x67, 0x79, 0xf1, 0xd1, 0xfc, 0x95, 0x96,
+ 0x3e, 0x2f, 0xab, 0x6c, 0x94, 0x1c, 0xd4, 0xc9, 0x7d, 0xb9, 0x34, 0x2b,
+ 0x9d, 0xcd, 0x0c, 0x03, 0x64, 0xc9, 0x45, 0x36, 0x2b, 0x6f, 0x07, 0xb4,
+ 0xed, 0x49, 0xb1, 0x9c, 0x5f, 0x98, 0x01, 0xca, 0x4b, 0x37, 0x5c, 0xda,
+ 0x2c, 0xcd, 0x70, 0xfc, 0xf4, 0x3c, 0x35, 0x6b, 0x32, 0xef, 0x56, 0xc9,
+ 0x75, 0x66, 0xd6, 0x5c, 0x2f, 0xf2, 0xe2, 0x5f, 0xda, 0x74, 0x31, 0xb4,
+ 0x5d, 0x94, 0xb7, 0x59, 0x65, 0x28, 0x7b, 0x71, 0x9f, 0x18, 0x22, 0x5c,
+ 0x30, 0x47, 0x5e, 0x1a, 0x8e, 0x4b, 0x52, 0x33, 0x84, 0xe5, 0xc6, 0x61,
+ 0x95, 0xcd, 0x52, 0xe2, 0x2c, 0xfb, 0x8d, 0x91, 0xd9, 0xd1, 0xcc, 0xb2,
+ 0x9e, 0xbc, 0xba, 0xb1, 0xb7, 0x89, 0x97, 0xa7, 0x66, 0x25, 0xf9, 0xac,
+ 0x36, 0xdb, 0x40, 0x27, 0x44, 0x9e, 0xa1, 0x6d, 0xa5, 0xc3, 0x60, 0x18,
+ 0xf5, 0xbe, 0x68, 0xd2, 0x3b, 0x7c, 0x5e, 0x18, 0x75, 0x38, 0xcd, 0x16,
+ 0x59, 0x31, 0xcd, 0x8a, 0x66, 0x94, 0xfc, 0xa9, 0x5c, 0xae, 0x9b, 0x6f,
+ 0x5f, 0xe6, 0x86, 0x06, 0xa9, 0x0c, 0x65, 0xbe, 0x6c, 0x98, 0x60, 0x52,
+ 0xe5, 0x0b, 0x6f, 0x2b, 0xca, 0xc2, 0xec, 0x79, 0xf2, 0xee, 0xf5, 0x61,
+ 0xb2, 0xf7, 0xe2, 0xf3, 0x67, 0x6e, 0xcf, 0xcd, 0x00, 0xc9, 0x24, 0x2d,
+ 0xcc, 0x8a, 0xb3, 0x49, 0x7e, 0x79, 0x9f, 0xcc, 0x97, 0xb3, 0x26, 0x5f,
+ 0x18, 0xea, 0xd3, 0x49, 0xa4, 0xd3, 0xb4, 0x48, 0xab, 0xa6, 0x26, 0x26,
+ 0xc0, 0x0f, 0xb0, 0xf6, 0xdb, 0x2a, 0x6f, 0xe8, 0x54, 0xe1, 0x77, 0x66,
+ 0x86, 0x59, 0x53, 0x5b, 0x4e, 0x33, 0x4c, 0x66, 0xbe, 0x73, 0x61, 0x78,
+ 0xcb, 0x90, 0x96, 0x76, 0xe6, 0xaf, 0xcb, 0x12, 0x0f, 0xd3, 0x26, 0xd0,
+ 0x82, 0xd2, 0xda, 0x4c, 0x64, 0xff, 0x33, 0x27, 0x62, 0xd6, 0xae, 0x9b,
+ 0x66, 0xb1, 0xbf, 0xb5, 0x55, 0xe7, 0x4d, 0x36, 0xfa, 0x4f, 0x73, 0x52,
+ 0x07, 0xcd, 0x6d, 0x39, 0x68, 0xae, 0xab, 0x2c, 0xfb, 0xfb, 0xc8, 0xb0,
+ 0xf6, 0x9a, 0x7d, 0xd6, 0xcc, 0xe6, 0x5e, 0xa6, 0x7b, 0x95, 0x35, 0xe6,
+ 0xbb, 0x7f, 0x5d, 0x66, 0x05, 0x7d, 0xc7, 0xcc, 0x2e, 0x9d, 0x2d, 0xae,
+ 0x53, 0xb3, 0xc9, 0x99, 0xe1, 0x51, 0x3a, 0xfc, 0x86, 0x8d, 0x68, 0xae,
+ 0x7c, 0xfc, 0xff, 0xfc, 0x73, 0xe4, 0xb3, 0x97, 0xf8, 0xaa, 0xf9, 0x73,
+ 0x94, 0xdd, 0xa5, 0x73, 0xb3, 0x64, 0xfa, 0xd8, 0x16, 0x71, 0xde, 0x9f,
+ 0x77, 0x86, 0x3b, 0xdb, 0xdb, 0x3f, 0x8f, 0x9a, 0xbb, 0x66, 0xed, 0x91,
+ 0x6f, 0x6c, 0x6f, 0x7b, 0xef, 0xd0, 0xc3, 0x1b, 0x44, 0x89, 0x64, 0x66,
+ 0x98, 0x89, 0x26, 0xf0, 0xb7, 0xac, 0x2a, 0xeb, 0xcd, 0x47, 0x8e, 0x95,
+ 0x0e, 0xff, 0xd6, 0xf9, 0xf6, 0xdb, 0xac, 0x06, 0x3f, 0xb9, 0x15, 0x27,
+ 0x69, 0x65, 0x78, 0xba, 0x6c, 0x9c, 0x1c, 0x1b, 0x98, 0x03, 0xdb, 0x58,
+ 0xfa, 0x98, 0xf3, 0x68, 0x9e, 0x36, 0x12, 0x30, 0x9d, 0x91, 0xf0, 0xab,
+ 0x93, 0x22, 0xbb, 0x6b, 0x2c, 0x37, 0x94, 0x49, 0x96, 0x4e, 0xae, 0x93,
+ 0xd2, 0xec, 0x49, 0x15, 0xdb, 0x0a, 0x7f, 0x4a, 0x69, 0x35, 0xb9, 0xce,
+ 0x6f, 0x0c, 0x4d, 0x5e, 0xbc, 0x78, 0x36, 0x34, 0x7f, 0xbc, 0xf8, 0x79,
+ 0xeb, 0xa6, 0x9c, 0x19, 0x12, 0x3d, 0xf9, 0x79, 0x8b, 0xf6, 0xff, 0x3f,
+ 0xd3, 0xc1, 0xc5, 0x60, 0xf2, 0xf7, 0xd1, 0x75, 0x33, 0x9f, 0xad, 0xf5,
+ 0xb2, 0x55, 0x5a, 0x98, 0xff, 0x3f, 0x2f, 0x97, 0x45, 0x63, 0x59, 0xc9,
+ 0x70, 0x64, 0xe3, 0x09, 0x2f, 0x73, 0x98, 0xcd, 0x09, 0x26, 0xc6, 0x27,
+ 0x0e, 0xa3, 0x33, 0x69, 0x8e, 0xaf, 0x3b, 0xac, 0xcd, 0xe4, 0x9a, 0x28,
+ 0x60, 0x78, 0x2b, 0x15, 0x32, 0x34, 0x79, 0x4a, 0xe7, 0xd6, 0x88, 0x0f,
+ 0x12, 0x67, 0x18, 0x8b, 0xbf, 0x96, 0x9b, 0x07, 0xcb, 0x6a, 0x9a, 0x55,
+ 0xa3, 0xee, 0x34, 0xec, 0x81, 0xf6, 0xbe, 0x99, 0xe8, 0xe5, 0x43, 0x3f,
+ 0xc0, 0xc4, 0xe6, 0xf9, 0x9d, 0x19, 0x81, 0xfe, 0x49, 0x5f, 0x33, 0x13,
+ 0xe7, 0xd1, 0x12, 0x9a, 0x31, 0x3e, 0xa3, 0xef, 0xbb, 0x03, 0x6d, 0xa6,
+ 0xde, 0x5a, 0x3a, 0x3e, 0xea, 0x16, 0x9f, 0x98, 0xed, 0x5b, 0x98, 0xb7,
+ 0x96, 0x24, 0x75, 0x71, 0xe8, 0x69, 0x18, 0x23, 0x2e, 0xae, 0xcc, 0xce,
+ 0x98, 0xdd, 0x20, 0x6e, 0xa6, 0xcd, 0xba, 0x4f, 0xde, 0x1a, 0xa6, 0x61,
+ 0x51, 0xe5, 0x31, 0xfd, 0x2c, 0x6b, 0x9a, 0x87, 0x37, 0xca, 0x71, 0xee,
+ 0xfe, 0x4e, 0x84, 0x79, 0xfb, 0xde, 0x30, 0xdc, 0xb6, 0xbf, 0xdb, 0x79,
+ 0xfc, 0x07, 0x23, 0xc6, 0xdd, 0xd1, 0x31, 0x33, 0xf8, 0xcf, 0xbf, 0x7b,
+ 0xbc, 0x77, 0x4b, 0xbf, 0xcd, 0x8b, 0x9b, 0xf2, 0xa3, 0x21, 0x13, 0x2e,
+ 0xdd, 0xb4, 0x4d, 0x51, 0x92, 0x54, 0xf3, 0x45, 0x63, 0x6f, 0x33, 0x62,
+ 0x4a, 0xf3, 0xa3, 0x8b, 0xf4, 0x62, 0x76, 0x9f, 0x5c, 0xa7, 0x37, 0x19,
+ 0xad, 0x79, 0x61, 0xb8, 0x95, 0xa8, 0x60, 0x2e, 0x96, 0x19, 0x04, 0x83,
+ 0x88, 0x8e, 0x69, 0xb9, 0xbc, 0x30, 0xe2, 0x87, 0xc4, 0x06, 0x13, 0x27,
+ 0xbd, 0x29, 0xf3, 0x69, 0xeb, 0xea, 0xbe, 0xce, 0x48, 0xe4, 0xd1, 0x87,
+ 0x71, 0x8d, 0x19, 0x91, 0x4b, 0x33, 0xc5, 0x81, 0xcb, 0x1b, 0xba, 0x12,
+ 0x8d, 0xb0, 0x4c, 0x67, 0x75, 0x99, 0x24, 0x57, 0x25, 0x9d, 0x15, 0x88,
+ 0x68, 0x30, 0xbb, 0xd9, 0x98, 0xeb, 0x94, 0xee, 0x3d, 0x73, 0xc5, 0xd9,
+ 0xd3, 0x50, 0x65, 0x90, 0xd6, 0xd8, 0xad, 0x74, 0x36, 0xe0, 0xfb, 0x8d,
+ 0xde, 0x11, 0x5a, 0x25, 0xeb, 0xff, 0x63, 0x7d, 0x90, 0xac, 0xff, 0xdb,
+ 0x3a, 0x78, 0x62, 0xfd, 0x5f, 0xd7, 0xdd, 0x5e, 0x1b, 0xdd, 0xed, 0x26,
+ 0x9f, 0x66, 0xcc, 0x16, 0xc7, 0x67, 0x37, 0xcf, 0x92, 0xbf, 0x91, 0xaa,
+ 0x61, 0xa4, 0x71, 0x76, 0xa7, 0x4c, 0xa9, 0x6b, 0x33, 0x6f, 0x27, 0x46,
+ 0x2c, 0xa7, 0x0b, 0xd2, 0x39, 0xb2, 0x6a, 0x62, 0x38, 0x38, 0xbd, 0x32,
+ 0x3c, 0x6b, 0x6e, 0x6b, 0x1d, 0x8e, 0xc6, 0xa7, 0x57, 0x78, 0x59, 0x46,
+ 0x84, 0x26, 0x45, 0x3a, 0x37, 0xa7, 0xe2, 0x84, 0x66, 0x94, 0x17, 0x91,
+ 0xed, 0xfc, 0xf3, 0x65, 0xf6, 0xf9, 0xf6, 0xfe, 0xfe, 0xde, 0xef, 0x77,
+ 0x9f, 0x66, 0xcd, 0xf5, 0xf6, 0xcf, 0x5b, 0x6e, 0x13, 0x8f, 0x2f, 0x41,
+ 0x78, 0x65, 0x42, 0x9d, 0x06, 0xa9, 0x00, 0x7a, 0x93, 0x98, 0x01, 0xcc,
+ 0xdf, 0xb3, 0xcb, 0xfc, 0x6e, 0xa0, 0x0a, 0x16, 0x9f, 0xbc, 0xd4, 0x30,
+ 0x9c, 0xd9, 0x41, 0x5f, 0x87, 0xb8, 0x5a, 0x66, 0xb5, 0xa1, 0xe5, 0xed,
+ 0x75, 0xda, 0x24, 0x76, 0x00, 0xde, 0xdb, 0x79, 0x7e, 0x75, 0xdd, 0x24,
+ 0xb7, 0x29, 0x5d, 0x48, 0xc7, 0x0d, 0x0f, 0x41, 0x9a, 0x80, 0xb9, 0x86,
+ 0x2e, 0x53, 0x73, 0x9f, 0xd0, 0x2e, 0xe2, 0xda, 0x37, 0x12, 0xca, 0x51,
+ 0xfd, 0x5e, 0xb6, 0xc4, 0xe9, 0x5f, 0x17, 0x69, 0x4d, 0x47, 0xb7, 0x30,
+ 0x22, 0xa2, 0x31, 0x7a, 0xc4, 0x92, 0xfe, 0x75, 0x6d, 0x34, 0x05, 0x50,
+ 0x41, 0x26, 0x8a, 0xcb, 0xf4, 0x35, 0x6d, 0x28, 0xed, 0x8e, 0xbd, 0xe0,
+ 0xcc, 0x36, 0x0d, 0x64, 0xa3, 0xed, 0x1b, 0xb5, 0x39, 0x76, 0x46, 0x40,
+ 0x59, 0xde, 0x20, 0x99, 0x3b, 0x5a, 0xe3, 0x75, 0x62, 0x8e, 0x69, 0x4d,
+ 0xca, 0x04, 0xab, 0x0c, 0x66, 0xf2, 0xde, 0x62, 0x0d, 0xd1, 0xd2, 0x8f,
+ 0xa4, 0xb6, 0x74, 0x94, 0x23, 0xbc, 0x36, 0x2d, 0x0d, 0x9b, 0x99, 0xd9,
+ 0x1a, 0xa1, 0x4c, 0x2b, 0x23, 0x51, 0x0b, 0xaa, 0x80, 0xcd, 0xcd, 0x98,
+ 0xf4, 0xc3, 0xbc, 0xa1, 0x1b, 0x07, 0x4a, 0xaf, 0x99, 0xaf, 0x21, 0x0a,
+ 0x74, 0x33, 0x23, 0xb0, 0xbd, 0xf5, 0xe3, 0x0a, 0x35, 0xcf, 0x26, 0x37,
+ 0x46, 0x93, 0x31, 0x1a, 0x6c, 0x66, 0xdf, 0xc2, 0x9d, 0x3f, 0x21, 0xfd,
+ 0x69, 0x66, 0x4e, 0xcc, 0xa4, 0xac, 0x2a, 0x32, 0x10, 0x68, 0x07, 0x2f,
+ 0x58, 0x94, 0xce, 0x33, 0xa3, 0x6a, 0xf8, 0xe4, 0xcc, 0xe9, 0x7a, 0x33,
+ 0x52, 0xc6, 0xe8, 0x2e, 0x90, 0x23, 0x46, 0xc7, 0x80, 0xec, 0xc7, 0xc2,
+ 0x31, 0x3b, 0x1a, 0x7b, 0x32, 0xc9, 0x16, 0x4d, 0x1d, 0x5b, 0x93, 0x6e,
+ 0xb8, 0x99, 0x4e, 0x95, 0x11, 0xe5, 0x7d, 0xc5, 0x0c, 0x74, 0xb5, 0x8a,
+ 0x01, 0x74, 0x33, 0xd5, 0x75, 0x8c, 0xae, 0x56, 0x5b, 0xaa, 0x35, 0xe0,
+ 0x0d, 0x23, 0xcc, 0x40, 0xf3, 0x39, 0x4d, 0x94, 0x1e, 0xae, 0xf9, 0xac,
+ 0x42, 0x40, 0xd3, 0x46, 0xb2, 0x6a, 0xce, 0xdf, 0xa5, 0x2b, 0xcc, 0xd0,
+ 0xd3, 0x0e, 0x6e, 0xbe, 0x6a, 0xf7, 0x94, 0x3e, 0x4f, 0x36, 0x81, 0xb9,
+ 0xd7, 0xa7, 0xf5, 0xb5, 0x51, 0xd0, 0x6a, 0x39, 0xdb, 0xf9, 0xdc, 0xf0,
+ 0xcc, 0x0d, 0xed, 0xef, 0x22, 0xcb, 0xa6, 0xa3, 0xe4, 0xf4, 0x92, 0x64,
+ 0x6b, 0x65, 0x26, 0xdd, 0xe0, 0xd7, 0x74, 0xb7, 0x18, 0xba, 0x4d, 0xa1,
+ 0xf5, 0xdb, 0xc3, 0xc5, 0x53, 0xf1, 0xee, 0x08, 0xc8, 0xf3, 0xd4, 0xfc,
+ 0xc4, 0xcc, 0x76, 0xd6, 0xbe, 0x88, 0x70, 0x12, 0x8d, 0x0c, 0xa7, 0xe9,
+ 0x5d, 0x64, 0x09, 0x38, 0xf1, 0x22, 0x6b, 0x6e, 0xb3, 0xcc, 0x0e, 0x57,
+ 0x67, 0xe6, 0xf6, 0xa3, 0x4d, 0x63, 0xed, 0x10, 0xe2, 0x90, 0x48, 0x7b,
+ 0xf6, 0xee, 0xf4, 0xfc, 0xf4, 0xf0, 0xf4, 0xa4, 0x6d, 0xe2, 0xc8, 0x35,
+ 0x5d, 0x27, 0x50, 0x51, 0xca, 0xa5, 0xd3, 0xe6, 0x0c, 0x05, 0x49, 0xcb,
+ 0x32, 0xa7, 0xd2, 0xc8, 0x0b, 0x68, 0x7c, 0xe6, 0xec, 0xcf, 0xeb, 0x7d,
+ 0xf3, 0x05, 0x73, 0xe5, 0xcd, 0xc1, 0xef, 0xe6, 0x4a, 0xb1, 0xf7, 0x01,
+ 0xdd, 0xb9, 0xf9, 0x64, 0x39, 0x4b, 0x2b, 0xb3, 0xff, 0xf9, 0xcc, 0xa8,
+ 0xbe, 0xe9, 0xbd, 0xaf, 0x09, 0x10, 0x9d, 0xe7, 0xa4, 0x90, 0xba, 0x6d,
+ 0x26, 0xb3, 0xc6, 0xfc, 0xe7, 0xc4, 0xe8, 0x69, 0x60, 0xd2, 0x99, 0x51,
+ 0xb3, 0x97, 0x0b, 0xb2, 0x0a, 0xa6, 0xb5, 0x35, 0x90, 0xb0, 0xec, 0x69,
+ 0x8e, 0x1d, 0x4f, 0x49, 0x7d, 0x72, 0xef, 0x93, 0x41, 0x64, 0xfe, 0xf3,
+ 0x8e, 0xb8, 0x8b, 0x26, 0x0b, 0x05, 0xd0, 0x08, 0xbd, 0x59, 0x69, 0x18,
+ 0x54, 0x08, 0x3b, 0x52, 0x01, 0x32, 0x25, 0x91, 0xeb, 0xcf, 0x87, 0xb8,
+ 0xae, 0xa6, 0x8f, 0x74, 0xac, 0x4a, 0x7a, 0x8d, 0x04, 0x10, 0xad, 0xb9,
+ 0xca, 0xe6, 0x46, 0xdc, 0xcf, 0xee, 0x59, 0x89, 0xc1, 0x05, 0x53, 0x2d,
+ 0x8b, 0x82, 0x67, 0x96, 0xbc, 0xc9, 0x27, 0x46, 0x7d, 0xba, 0x6c, 0x92,
+ 0x1f, 0x8c, 0x60, 0x2d, 0x6f, 0x65, 0xce, 0x9d, 0xe1, 0xa0, 0xe4, 0x1b,
+ 0x7b, 0xc3, 0xdc, 0x2e, 0xef, 0xdf, 0x1e, 0x26, 0xe9, 0xc2, 0x10, 0x98,
+ 0x94, 0x1c, 0xb0, 0x19, 0x19, 0x40, 0xde, 0x7a, 0xce, 0xcf, 0x36, 0xc6,
+ 0x9b, 0x32, 0x5f, 0xbb, 0x33, 0x7c, 0xb5, 0xbf, 0x26, 0xee, 0x3e, 0x57,
+ 0xbb, 0xf2, 0x4c, 0xe5, 0x1c, 0x0b, 0x70, 0xb3, 0x62, 0xe8, 0x2f, 0x86,
+ 0x11, 0xd2, 0x8f, 0x75, 0x67, 0x02, 0xe0, 0x1d, 0xba, 0xc5, 0x0d, 0x2d,
+ 0x7e, 0xa0, 0xc7, 0xcb, 0xca, 0xb3, 0xb9, 0x68, 0x29, 0xe7, 0x27, 0x63,
+ 0x37, 0x09, 0x36, 0x2a, 0x0d, 0x51, 0x8d, 0x55, 0x65, 0xde, 0x12, 0x2a,
+ 0xda, 0x5f, 0x93, 0xbc, 0x34, 0x93, 0xec, 0x7c, 0xa3, 0xcd, 0x4b, 0x90,
+ 0xa9, 0x98, 0x99, 0xe5, 0x2a, 0x5f, 0x99, 0xb9, 0x31, 0xdb, 0x08, 0x03,
+ 0xac, 0x86, 0x58, 0x26, 0x7e, 0xee, 0x0c, 0xc7, 0x62, 0x0e, 0xc3, 0xd0,
+ 0xbc, 0xc9, 0x48, 0xd8, 0x1e, 0xbd, 0x18, 0x24, 0x3b, 0xa3, 0x6d, 0xfa,
+ 0x63, 0x67, 0x90, 0xec, 0x62, 0xa4, 0xbd, 0x84, 0x4d, 0x0e, 0xd9, 0x0f,
+ 0xe6, 0xbb, 0xd2, 0x99, 0x17, 0x9e, 0x95, 0x51, 0xdb, 0x4b, 0x4c, 0xc5,
+ 0x56, 0x4c, 0xd9, 0x72, 0xeb, 0x24, 0xc3, 0x39, 0x5c, 0xe7, 0xfb, 0x5a,
+ 0x4d, 0x86, 0xb9, 0x31, 0x68, 0x0c, 0x7b, 0xb0, 0x1a, 0xad, 0x67, 0x66,
+ 0xc0, 0x84, 0x20, 0x25, 0x6b, 0xcd, 0x30, 0x44, 0x41, 0x96, 0xe5, 0x5a,
+ 0x92, 0xd1, 0xb3, 0x7c, 0xdd, 0x77, 0x86, 0x33, 0x4c, 0xff, 0xa8, 0x3d,
+ 0x21, 0xb3, 0xbd, 0x87, 0xe8, 0xf4, 0x2d, 0x23, 0xa8, 0xa6, 0x39, 0xad,
+ 0xa9, 0x24, 0x09, 0x8b, 0x43, 0xc4, 0xb2, 0xd1, 0x8c, 0x3f, 0xe0, 0x8d,
+ 0xf0, 0xc6, 0x6f, 0x8d, 0x4c, 0x8e, 0x80, 0x60, 0xff, 0xf0, 0x43, 0x25,
+ 0xfc, 0xde, 0x28, 0x79, 0x25, 0x4b, 0x01, 0x99, 0x49, 0x44, 0xe2, 0x01,
+ 0xa3, 0x77, 0x19, 0x65, 0x26, 0x59, 0xab, 0x97, 0x17, 0x5d, 0x82, 0x93,
+ 0x91, 0x77, 0x91, 0xad, 0xb1, 0xc7, 0xa3, 0x29, 0x17, 0xc6, 0xf4, 0xb9,
+ 0xbd, 0x26, 0x06, 0x66, 0x63, 0xdb, 0x8c, 0xb3, 0x45, 0x96, 0x36, 0x8d,
+ 0xa7, 0xa3, 0x2c, 0x8c, 0x76, 0x95, 0xd7, 0xd7, 0x6b, 0xb4, 0x8f, 0x69,
+ 0x77, 0xff, 0x68, 0x84, 0x91, 0x4e, 0x56, 0xcf, 0x2f, 0xc9, 0xd3, 0xec,
+ 0xce, 0x68, 0x2c, 0xf9, 0x9c, 0x54, 0x96, 0x19, 0x7b, 0x1f, 0x4e, 0xc6,
+ 0x72, 0x5d, 0xe3, 0xe1, 0xbc, 0xf6, 0xef, 0xb6, 0xc0, 0xc5, 0xb2, 0x71,
+ 0x9f, 0x35, 0x9b, 0x9e, 0xd6, 0x74, 0x7a, 0xb6, 0x17, 0x92, 0xd9, 0x5f,
+ 0xbd, 0x68, 0x95, 0x8b, 0x72, 0xb1, 0xa7, 0xd7, 0x05, 0x5f, 0x79, 0x7a,
+ 0xb9, 0x90, 0xdc, 0xa6, 0xed, 0x36, 0xb3, 0xc5, 0xbe, 0x26, 0xc1, 0x9e,
+ 0xaf, 0xd8, 0x66, 0x72, 0xbe, 0x84, 0xdf, 0x87, 0xc9, 0x6d, 0x64, 0x9c,
+ 0xb9, 0x89, 0xcc, 0x25, 0x95, 0xbc, 0x31, 0x42, 0x2b, 0xbd, 0xc2, 0xb7,
+ 0xac, 0x14, 0xc0, 0x25, 0xbe, 0x30, 0x84, 0x30, 0x27, 0x6b, 0x76, 0xcf,
+ 0xd7, 0x82, 0xa1, 0x3d, 0xcf, 0xb0, 0xbb, 0x7a, 0xd2, 0x2b, 0xe7, 0xb8,
+ 0x08, 0xb3, 0x69, 0x9e, 0xf2, 0x8d, 0xe2, 0x38, 0x89, 0xd7, 0x4a, 0xfa,
+ 0xaa, 0x37, 0xad, 0xf1, 0x59, 0xc0, 0x23, 0xf8, 0xa1, 0x39, 0x8f, 0xf6,
+ 0x15, 0xef, 0xec, 0x8c, 0x0f, 0xcf, 0x42, 0xa1, 0x30, 0x1e, 0x7f, 0x6b,
+ 0x79, 0x6a, 0xd7, 0x70, 0xc8, 0xc2, 0xdd, 0xd5, 0xde, 0x9b, 0xe4, 0x91,
+ 0x09, 0xde, 0xa4, 0x1f, 0x6e, 0x4c, 0xab, 0xd4, 0x48, 0xda, 0xa7, 0x9b,
+ 0x72, 0x7d, 0x12, 0xe9, 0x5b, 0x43, 0x7a, 0x83, 0xbc, 0xf9, 0xda, 0x8a,
+ 0x51, 0x37, 0xc8, 0x9b, 0xaf, 0xed, 0xb3, 0x3b, 0x38, 0x1c, 0xcc, 0x8b,
+ 0x58, 0xbf, 0xae, 0xc1, 0x1f, 0x23, 0x26, 0xe6, 0xde, 0x2b, 0xfb, 0x92,
+ 0x3e, 0x60, 0x54, 0xc1, 0x86, 0x0d, 0x81, 0x02, 0x8f, 0x2b, 0x43, 0x08,
+ 0x47, 0x98, 0x7f, 0xb2, 0x60, 0xa2, 0xdf, 0xb3, 0x0c, 0x18, 0x75, 0x86,
+ 0xfb, 0x61, 0xd5, 0xc9, 0x14, 0x97, 0xda, 0xb9, 0xb1, 0x29, 0xf0, 0x41,
+ 0x5a, 0x8d, 0xf9, 0x18, 0x2c, 0x4e, 0x3a, 0x55, 0xd9, 0xac, 0xc8, 0x58,
+ 0xf7, 0x82, 0x36, 0x49, 0xf2, 0xcd, 0x79, 0xcf, 0x6e, 0x48, 0x9b, 0xa9,
+ 0x69, 0xb1, 0x5d, 0xee, 0x33, 0x9a, 0x2d, 0xf4, 0x39, 0x9a, 0x5d, 0x6d,
+ 0x35, 0x30, 0x12, 0x64, 0x35, 0x2b, 0x1e, 0x75, 0x63, 0x66, 0xcd, 0xb7,
+ 0x46, 0x62, 0x26, 0x65, 0x14, 0x00, 0xab, 0x5d, 0x7b, 0xb6, 0x8e, 0x55,
+ 0x36, 0xb0, 0x64, 0x1e, 0xcc, 0xe7, 0x99, 0x73, 0x6f, 0x23, 0x45, 0x44,
+ 0xe1, 0x47, 0x96, 0x5b, 0xf0, 0x01, 0xde, 0x02, 0xd1, 0x4e, 0xbe, 0x79,
+ 0x77, 0x34, 0x1e, 0x27, 0x6f, 0x8e, 0xce, 0x8f, 0xde, 0xb5, 0x7d, 0xab,
+ 0x45, 0x59, 0xcd, 0xa1, 0x70, 0x1a, 0x29, 0x57, 0x2f, 0x66, 0xe9, 0x3d,
+ 0xa9, 0xa2, 0x46, 0xe4, 0x5e, 0x55, 0xa4, 0xf9, 0xcf, 0x33, 0xb2, 0x5d,
+ 0xa7, 0x4b, 0xd8, 0x5a, 0xa5, 0x11, 0x07, 0xa9, 0x38, 0xed, 0xcc, 0x9d,
+ 0x0c, 0x47, 0x9f, 0xbb, 0x91, 0x49, 0x6e, 0x3b, 0x63, 0x5f, 0xd9, 0x8f,
+ 0x3c, 0x67, 0xe4, 0xa7, 0x1d, 0x38, 0x4f, 0x59, 0xc2, 0x1a, 0x5c, 0x2d,
+ 0x64, 0x30, 0x0a, 0xb5, 0x39, 0x5a, 0xf0, 0x74, 0xd0, 0x19, 0xb4, 0xe6,
+ 0x75, 0x76, 0xd9, 0x98, 0x97, 0xcc, 0x86, 0xb0, 0x7f, 0x20, 0x98, 0x93,
+ 0xce, 0xd6, 0xfa, 0xf8, 0x8c, 0x9a, 0xdc, 0x64, 0xee, 0x26, 0xe2, 0x8f,
+ 0x58, 0x23, 0x8b, 0x36, 0xa6, 0x90, 0x47, 0x16, 0xa0, 0xaa, 0xe1, 0xb2,
+ 0x29, 0xbb, 0x52, 0xeb, 0xe5, 0x25, 0x8c, 0x8c, 0x64, 0xe3, 0xe3, 0x20,
+ 0x79, 0x33, 0x48, 0xbe, 0x19, 0x24, 0xe4, 0xc0, 0xdd, 0xc4, 0x5b, 0xc9,
+ 0xce, 0xf6, 0xee, 0x93, 0x84, 0xe5, 0x9e, 0xe5, 0xb1, 0xd7, 0x9e, 0xa1,
+ 0xb8, 0xf3, 0x91, 0x24, 0x04, 0x9e, 0xc2, 0xf0, 0xa3, 0x64, 0xe7, 0x0d,
+ 0xff, 0xe4, 0xc9, 0xe7, 0x4f, 0x9f, 0x3f, 0x93, 0x1f, 0xb6, 0xd5, 0x6f,
+ 0x37, 0x7d, 0xd6, 0x5e, 0xd9, 0x97, 0x4d, 0xce, 0x6d, 0x33, 0x1d, 0x52,
+ 0x05, 0xf3, 0xc2, 0xc8, 0x5c, 0xa3, 0xf7, 0x8b, 0x31, 0x45, 0x0a, 0x77,
+ 0x92, 0xb3, 0x6d, 0xc7, 0x5a, 0x67, 0x6b, 0x38, 0xf3, 0xe2, 0x14, 0x47,
+ 0xc5, 0x6e, 0x11, 0x7b, 0x32, 0x1a, 0x9a, 0x47, 0x7a, 0x41, 0xec, 0x6f,
+ 0x1e, 0x61, 0x05, 0xce, 0xff, 0x92, 0xfd, 0x94, 0xb5, 0xda, 0xcd, 0x2b,
+ 0x66, 0x6a, 0xc6, 0x66, 0x27, 0x33, 0x3c, 0xa4, 0xba, 0x31, 0x54, 0x60,
+ 0xbf, 0xdd, 0xe6, 0x35, 0x18, 0xfd, 0xb6, 0x5c, 0x92, 0x32, 0x4a, 0x0f,
+ 0x18, 0xdd, 0x92, 0x5e, 0x60, 0xae, 0xd6, 0xe1, 0xe6, 0xf9, 0x9d, 0x5c,
+ 0xe1, 0xad, 0x51, 0xcc, 0xdc, 0xcc, 0x3f, 0x17, 0x86, 0x93, 0x78, 0x3e,
+ 0xa3, 0xae, 0xfd, 0x0a, 0xcb, 0x2c, 0xe0, 0x43, 0x12, 0x2c, 0xd0, 0x5b,
+ 0xce, 0x4e, 0xc7, 0xe7, 0x74, 0xb6, 0xcf, 0xde, 0x9f, 0x9b, 0x81, 0xfe,
+ 0x6a, 0x8c, 0xd4, 0xc6, 0xf0, 0x24, 0xbd, 0x58, 0x64, 0x90, 0xce, 0x3a,
+ 0x9c, 0x61, 0x3f, 0xdc, 0xdd, 0xa2, 0xe7, 0xd9, 0x8f, 0xf2, 0x2c, 0xf9,
+ 0x0a, 0x25, 0x1d, 0x4c, 0x43, 0x06, 0xec, 0x65, 0xb0, 0x6f, 0x6d, 0x7c,
+ 0xb9, 0x39, 0x48, 0x86, 0xa5, 0xa5, 0xce, 0x70, 0x28, 0x2f, 0x9a, 0x6f,
+ 0xd7, 0xf9, 0x3c, 0x37, 0xfa, 0xb8, 0x37, 0xf5, 0x46, 0x6e, 0x44, 0x67,
+ 0xf4, 0x4c, 0x0c, 0xd3, 0x60, 0xd6, 0xce, 0x17, 0x4e, 0x24, 0x84, 0xc9,
+ 0xe4, 0xb6, 0xca, 0x2a, 0xcf, 0xe4, 0x81, 0xb6, 0xa4, 0xa3, 0x4d, 0x23,
+ 0x63, 0xaa, 0x45, 0xa8, 0x2e, 0x8b, 0xb4, 0x08, 0x07, 0x02, 0xc0, 0x62,
+ 0xa6, 0x43, 0x96, 0x26, 0x8e, 0x7c, 0xc9, 0xda, 0x45, 0x5a, 0xad, 0x25,
+ 0xd6, 0x5a, 0x94, 0xb0, 0x88, 0x19, 0xfb, 0x0a, 0x36, 0x05, 0xc8, 0x6b,
+ 0x56, 0xfa, 0x3b, 0x6f, 0xa5, 0xfa, 0xf2, 0xd0, 0xbc, 0x4a, 0x0b, 0x83,
+ 0x9f, 0xfc, 0xd2, 0xa8, 0xad, 0x74, 0x6a, 0xd4, 0xc5, 0x06, 0x87, 0x8b,
+ 0x30, 0x4c, 0x9b, 0x5f, 0x78, 0x4c, 0xcf, 0xf7, 0x66, 0x8e, 0x0a, 0x29,
+ 0xfb, 0xac, 0x31, 0xd1, 0xa3, 0x43, 0xb3, 0x65, 0xc3, 0x61, 0x6d, 0xa8,
+ 0x4f, 0x22, 0x63, 0x21, 0x51, 0x89, 0x53, 0xc4, 0x7f, 0xac, 0x1d, 0x75,
+ 0x2a, 0xaa, 0x2d, 0xcb, 0x61, 0xbe, 0xe0, 0x13, 0x8e, 0xec, 0x54, 0x46,
+ 0x23, 0x37, 0x1f, 0x4f, 0xcd, 0x9e, 0x99, 0x33, 0xf7, 0x86, 0x68, 0x25,
+ 0xcb, 0x52, 0x7d, 0x98, 0x58, 0xc3, 0x6c, 0x64, 0xe2, 0x54, 0xe0, 0x74,
+ 0x3a, 0xcd, 0x61, 0xeb, 0xcc, 0xc8, 0xfe, 0x5e, 0x66, 0xf0, 0x90, 0x0a,
+ 0x51, 0xe7, 0x9e, 0x80, 0xa5, 0x0d, 0xbc, 0x26, 0x3d, 0x68, 0x8d, 0xed,
+ 0xc4, 0x21, 0x7d, 0x66, 0x8d, 0xb6, 0x72, 0xde, 0xf9, 0x88, 0x59, 0xc3,
+ 0x54, 0x7c, 0x10, 0x22, 0x10, 0x06, 0x09, 0xac, 0x33, 0xcf, 0x91, 0x09,
+ 0x95, 0xa1, 0xab, 0x29, 0x1a, 0x83, 0x7f, 0x41, 0xce, 0x1e, 0xb1, 0x30,
+ 0x61, 0xaa, 0xe3, 0xcc, 0xd6, 0x3c, 0xb5, 0x81, 0x21, 0x2e, 0x3d, 0x79,
+ 0x75, 0xad, 0x8f, 0x7a, 0x66, 0x7f, 0x6a, 0xd6, 0x46, 0x2a, 0x36, 0x45,
+ 0x04, 0xa6, 0x6a, 0x95, 0x96, 0x15, 0x8b, 0xb3, 0x59, 0x69, 0x38, 0x79,
+ 0x8d, 0x5d, 0x6a, 0xde, 0xc4, 0x69, 0xa6, 0x44, 0x71, 0x0e, 0x9b, 0x39,
+ 0xd5, 0xc9, 0x4e, 0x5b, 0xc8, 0x55, 0x3f, 0x38, 0x35, 0xef, 0x26, 0x07,
+ 0x91, 0xf4, 0xea, 0x57, 0xba, 0x83, 0xbf, 0x8d, 0x26, 0xb1, 0xde, 0xf0,
+ 0x79, 0x84, 0x1f, 0xb8, 0x43, 0xf9, 0x1a, 0xfc, 0x23, 0x66, 0xb6, 0x5d,
+ 0xd9, 0x1c, 0x6a, 0x13, 0xf8, 0x44, 0x77, 0xc6, 0x39, 0xad, 0x23, 0x4e,
+ 0xba, 0xfb, 0xc0, 0xed, 0x4a, 0x46, 0xb0, 0x7f, 0x25, 0xe9, 0x9c, 0x86,
+ 0xa7, 0x66, 0xed, 0x27, 0x58, 0xc7, 0xf0, 0x26, 0xa1, 0xf3, 0x57, 0x98,
+ 0x15, 0xa6, 0xf4, 0x8b, 0x93, 0x1b, 0xef, 0x18, 0x51, 0x94, 0xa1, 0x20,
+ 0x2f, 0xca, 0x00, 0xf1, 0x9d, 0x8b, 0xb2, 0x9c, 0x65, 0xa9, 0x5b, 0x1a,
+ 0xdd, 0x08, 0x59, 0x41, 0xec, 0x2e, 0x3b, 0x6a, 0x44, 0xc2, 0xc2, 0x0a,
+ 0x5c, 0xa3, 0xf1, 0x26, 0xe9, 0x55, 0x9a, 0x5b, 0x7e, 0x93, 0xa3, 0x61,
+ 0x9f, 0x2d, 0x4a, 0x79, 0x9c, 0x76, 0x8a, 0xb4, 0x03, 0x11, 0x5b, 0xcb,
+ 0x9a, 0x8f, 0x8f, 0x59, 0x97, 0x11, 0x3b, 0x90, 0x1d, 0x32, 0x2c, 0x9c,
+ 0x5a, 0x3a, 0xdc, 0x05, 0xdc, 0x78, 0xe4, 0x11, 0x83, 0xf0, 0x85, 0x7f,
+ 0xcb, 0x0c, 0xb9, 0x36, 0x4a, 0xbe, 0x2d, 0x6f, 0x33, 0x84, 0x3e, 0xe1,
+ 0x7f, 0xcc, 0x29, 0x5e, 0x57, 0x9b, 0x27, 0x8c, 0x29, 0x65, 0x4c, 0x01,
+ 0x43, 0x4d, 0xf8, 0x46, 0xf0, 0x33, 0xcf, 0x85, 0x6d, 0x58, 0xfc, 0x96,
+ 0x8f, 0xa2, 0x2e, 0xc2, 0xee, 0xe4, 0x25, 0x9f, 0x88, 0x64, 0x03, 0xbe,
+ 0x97, 0x09, 0x11, 0x6b, 0xd1, 0xb8, 0x55, 0x58, 0x7a, 0x18, 0x49, 0x5d,
+ 0x7b, 0x87, 0x4b, 0xbc, 0xf5, 0xc9, 0xf3, 0xd1, 0xce, 0x8b, 0xd1, 0xf6,
+ 0x88, 0xb4, 0xe8, 0xec, 0x26, 0x37, 0x36, 0x2a, 0x29, 0x18, 0x34, 0x15,
+ 0xfb, 0x22, 0x05, 0xd5, 0xcc, 0xf6, 0x5e, 0x5d, 0xcd, 0xe0, 0xfd, 0xdb,
+ 0x2a, 0x2f, 0x2f, 0x49, 0x43, 0xaa, 0x32, 0xe7, 0xdd, 0x63, 0x0f, 0x2d,
+ 0x91, 0x46, 0x8e, 0x1c, 0xcb, 0xd4, 0xd0, 0xb2, 0x1c, 0xb9, 0x20, 0xcb,
+ 0x70, 0x98, 0x5e, 0x18, 0x25, 0xdc, 0x50, 0x71, 0xb8, 0x2c, 0xf2, 0xbb,
+ 0x61, 0x5d, 0x4e, 0x3e, 0x9a, 0x4d, 0x79, 0xb9, 0x48, 0x9b, 0xeb, 0x2f,
+ 0x3b, 0xfa, 0xd5, 0x06, 0xdd, 0x25, 0x9b, 0xc9, 0x21, 0xfb, 0xbc, 0xcc,
+ 0x17, 0x2a, 0x3e, 0x6d, 0x66, 0x2f, 0x65, 0x8c, 0xe4, 0xbd, 0x19, 0xc3,
+ 0x70, 0xb2, 0xd1, 0x2f, 0x89, 0xc5, 0x30, 0xd6, 0xc0, 0x8a, 0xd1, 0xce,
+ 0x70, 0x66, 0x92, 0x72, 0x8b, 0xf0, 0x65, 0x63, 0x34, 0x48, 0x78, 0x20,
+ 0x92, 0xe4, 0x6d, 0xd9, 0x64, 0xfb, 0xf4, 0x6f, 0x23, 0xc4, 0x1a, 0x50,
+ 0x5d, 0x2e, 0xd7, 0x94, 0x44, 0xc2, 0x25, 0x7f, 0x71, 0x18, 0x9a, 0x12,
+ 0xe0, 0x05, 0x5e, 0x80, 0xf8, 0x41, 0x85, 0x91, 0xd6, 0xbf, 0x5a, 0x1f,
+ 0x90, 0xcf, 0x13, 0x7b, 0x2e, 0x9f, 0xe3, 0x25, 0x92, 0xa6, 0x73, 0xb5,
+ 0x24, 0x9b, 0xad, 0x3b, 0xdc, 0x35, 0xae, 0x6a, 0xba, 0x66, 0xd8, 0x19,
+ 0x0f, 0x26, 0x11, 0x13, 0xdb, 0xfa, 0xc7, 0x47, 0x9f, 0x75, 0x5e, 0x3b,
+ 0xc0, 0x9e, 0x9a, 0xd5, 0x3f, 0x1f, 0x3d, 0xdd, 0x33, 0x3b, 0xea, 0x13,
+ 0x7a, 0xd6, 0x0c, 0xeb, 0x9b, 0x49, 0xf2, 0x12, 0xbe, 0x41, 0x62, 0xd3,
+ 0x28, 0x81, 0x8d, 0xb1, 0xf0, 0xc3, 0xc1, 0xbb, 0xb7, 0xc7, 0x6f, 0xbf,
+ 0xd9, 0xe7, 0x8f, 0x0a, 0xab, 0x75, 0x0c, 0x4c, 0x32, 0x84, 0x31, 0x3b,
+ 0xda, 0x6f, 0xf3, 0x3d, 0x73, 0x91, 0x74, 0x29, 0x32, 0x5d, 0x76, 0x42,
+ 0xd7, 0x56, 0x5a, 0xbb, 0x51, 0xf9, 0x6c, 0x32, 0x79, 0x75, 0x82, 0x46,
+ 0x38, 0x72, 0xf4, 0x1b, 0xca, 0xd2, 0x88, 0xae, 0x4a, 0xc4, 0x20, 0x74,
+ 0xda, 0x9d, 0xe1, 0x16, 0x65, 0xee, 0x6c, 0x8f, 0xec, 0x2e, 0x67, 0x53,
+ 0x5a, 0x07, 0x9b, 0x18, 0x71, 0x94, 0x89, 0xce, 0x00, 0x39, 0x07, 0x57,
+ 0x93, 0xc8, 0xb1, 0x51, 0x72, 0x70, 0x19, 0xf8, 0x47, 0x90, 0x07, 0xa1,
+ 0x17, 0xe0, 0xd4, 0xaa, 0xc1, 0x1c, 0xa1, 0xe6, 0xe1, 0x74, 0x8c, 0xda,
+ 0xec, 0xcc, 0x94, 0xdd, 0xc3, 0xd8, 0x53, 0xfa, 0x4c, 0x67, 0x38, 0x78,
+ 0xc5, 0x21, 0x63, 0x48, 0x1f, 0xcc, 0x69, 0x37, 0xc9, 0x2b, 0x6d, 0xa4,
+ 0xf4, 0xbc, 0x9c, 0xc2, 0xc5, 0x19, 0xd0, 0x67, 0x6c, 0x23, 0x52, 0x6b,
+ 0x6b, 0x6e, 0xd5, 0xc9, 0x06, 0xc5, 0x27, 0x0d, 0x0b, 0x14, 0x57, 0xcd,
+ 0xf5, 0xa6, 0x8b, 0xb9, 0xa8, 0x0f, 0xc1, 0xcc, 0x05, 0xeb, 0x2e, 0xba,
+ 0x7c, 0x8e, 0xa8, 0x39, 0xd4, 0xce, 0xbf, 0x2c, 0xeb, 0x06, 0x8e, 0x5a,
+ 0xb9, 0xfc, 0x79, 0x31, 0x66, 0x66, 0xf3, 0x6c, 0x5e, 0x56, 0xf7, 0xc1,
+ 0x44, 0x40, 0xf8, 0x16, 0x07, 0xe0, 0x66, 0xd4, 0x90, 0x25, 0xa9, 0xff,
+ 0xf5, 0xa0, 0x15, 0x92, 0x80, 0xc6, 0x64, 0xed, 0xc1, 0xae, 0x2f, 0x11,
+ 0xfe, 0x02, 0x0e, 0x3b, 0x88, 0xa3, 0xf7, 0x42, 0xe2, 0x4b, 0xb3, 0x94,
+ 0x44, 0x4d, 0x91, 0xb5, 0x76, 0x07, 0x37, 0x07, 0x2f, 0x6b, 0x15, 0x9f,
+ 0x3f, 0x7b, 0x32, 0xda, 0x69, 0xf1, 0x79, 0x71, 0x4f, 0x39, 0x0e, 0x71,
+ 0xe1, 0x41, 0x16, 0x64, 0xed, 0xec, 0xc7, 0xfc, 0x6a, 0x59, 0x65, 0xac,
+ 0xba, 0x21, 0x2d, 0x42, 0xb3, 0x21, 0x48, 0x1b, 0xba, 0x2e, 0x91, 0x44,
+ 0x60, 0x6e, 0xd1, 0x6c, 0x76, 0x39, 0x88, 0xf8, 0x11, 0xf5, 0x12, 0x80,
+ 0x9c, 0x34, 0xf6, 0x09, 0x86, 0x2a, 0x32, 0xd1, 0xd4, 0xc8, 0x57, 0x9a,
+ 0x50, 0xb8, 0x3c, 0x99, 0xcc, 0xd2, 0x7c, 0x5e, 0x33, 0x9b, 0x88, 0x09,
+ 0x3e, 0x8a, 0x1d, 0x09, 0xf3, 0xff, 0x60, 0xce, 0x5f, 0x90, 0x47, 0xbe,
+ 0xaa, 0xe9, 0x4a, 0xc6, 0x8e, 0xaa, 0xca, 0xcc, 0xde, 0x89, 0xeb, 0x6c,
+ 0xf2, 0x51, 0xfd, 0x6e, 0xaa, 0x6b, 0x76, 0x79, 0x98, 0xd2, 0x23, 0xe0,
+ 0xf6, 0x6f, 0xae, 0xc9, 0x89, 0x5d, 0x1a, 0xe3, 0x97, 0xa2, 0x7a, 0xc6,
+ 0x08, 0x5c, 0x4e, 0x9c, 0x15, 0x7e, 0x67, 0x58, 0xdb, 0x8a, 0x3d, 0xa3,
+ 0x6c, 0x1b, 0x5b, 0x70, 0x3a, 0x6c, 0xaa, 0x7c, 0x11, 0x9d, 0x1d, 0xdc,
+ 0x2a, 0xd8, 0x96, 0x96, 0x5a, 0x4a, 0x89, 0x05, 0xd6, 0xd9, 0x23, 0x6e,
+ 0xfb, 0x49, 0x87, 0x9a, 0x5d, 0x86, 0x04, 0x6d, 0x07, 0xe4, 0x05, 0x33,
+ 0xaa, 0x82, 0x06, 0xc3, 0x8d, 0x41, 0xc4, 0xca, 0xe2, 0xd0, 0x68, 0xb0,
+ 0x75, 0x3e, 0x19, 0xd0, 0xdf, 0xa6, 0xf9, 0x55, 0x46, 0x49, 0x28, 0x74,
+ 0x89, 0x35, 0xb3, 0x39, 0xe7, 0x91, 0x74, 0x86, 0x33, 0xbf, 0xca, 0xae,
+ 0xca, 0x86, 0xd4, 0x90, 0x80, 0x4d, 0xd8, 0x45, 0x69, 0x79, 0x42, 0x15,
+ 0x7e, 0x5f, 0x19, 0x13, 0x2b, 0xcd, 0x7c, 0x5e, 0x0c, 0x70, 0xe6, 0x53,
+ 0x58, 0xfe, 0xdd, 0x5d, 0x37, 0xa3, 0x4d, 0x60, 0x47, 0x91, 0xc2, 0xa8,
+ 0xda, 0xaa, 0xea, 0xf9, 0x24, 0x0f, 0x48, 0x35, 0x6e, 0x6e, 0xf3, 0x49,
+ 0xa6, 0x66, 0xad, 0x0d, 0x46, 0xcf, 0xf2, 0x50, 0xc6, 0xcf, 0xe9, 0x3c,
+ 0xd2, 0x7b, 0xac, 0x8e, 0x53, 0x54, 0xe7, 0x36, 0x27, 0x75, 0x5d, 0x24,
+ 0x1e, 0x94, 0x31, 0xb9, 0x08, 0xd2, 0x2a, 0x47, 0x08, 0x8b, 0x62, 0xbe,
+ 0xea, 0x78, 0x89, 0x9d, 0x2f, 0x9e, 0x37, 0x5e, 0x17, 0x03, 0xc6, 0x19,
+ 0x2e, 0x38, 0x5c, 0x97, 0xf0, 0xbd, 0x04, 0x74, 0x82, 0x19, 0x76, 0x95,
+ 0x21, 0xd8, 0xc7, 0x6a, 0xc3, 0x92, 0x94, 0x4f, 0x4a, 0x19, 0x0a, 0x05,
+ 0x54, 0x96, 0xb1, 0x25, 0x01, 0xab, 0xe3, 0xee, 0x5e, 0xc9, 0x3b, 0xd0,
+ 0xbd, 0x63, 0xb5, 0x4d, 0x76, 0xcf, 0x3b, 0x9b, 0x29, 0x3d, 0x91, 0x2e,
+ 0xc8, 0x4b, 0xdd, 0x3d, 0x9e, 0x64, 0x71, 0x91, 0x6f, 0x6b, 0x53, 0xe3,
+ 0xda, 0x99, 0x44, 0xf6, 0x6d, 0x4e, 0x12, 0x44, 0x11, 0x09, 0x33, 0x39,
+ 0xbf, 0x3c, 0x8e, 0x18, 0x03, 0x5d, 0x21, 0x6e, 0x6e, 0x55, 0x73, 0x0b,
+ 0x4b, 0x8a, 0x52, 0x8b, 0x5f, 0xc9, 0x59, 0x66, 0x73, 0x63, 0x28, 0x12,
+ 0x0d, 0x53, 0xcc, 0x3b, 0xb3, 0x11, 0x21, 0x4e, 0x16, 0x1f, 0x69, 0xc7,
+ 0xb8, 0x5d, 0x06, 0xac, 0xcb, 0xb1, 0x9c, 0x9a, 0x70, 0x5c, 0x5a, 0x94,
+ 0x06, 0xbe, 0x61, 0x30, 0xd1, 0xcb, 0x59, 0x7a, 0xc5, 0x67, 0x26, 0xbf,
+ 0xea, 0x1e, 0xcf, 0xa2, 0x94, 0x04, 0xa5, 0xba, 0x34, 0x72, 0x1d, 0x1e,
+ 0x3d, 0xf6, 0x1d, 0xd5, 0xc9, 0x86, 0xe1, 0xb0, 0xd9, 0x12, 0x97, 0xfc,
+ 0xa9, 0x59, 0xde, 0x78, 0xfc, 0xed, 0xa6, 0x2f, 0xdb, 0x40, 0xdd, 0xb8,
+ 0x64, 0xeb, 0x88, 0x36, 0x12, 0x4e, 0xb0, 0xbd, 0xbf, 0xe6, 0x0d, 0x69,
+ 0x8b, 0x37, 0x6b, 0xd4, 0x55, 0x81, 0xec, 0x00, 0x0d, 0x28, 0x3c, 0x3b,
+ 0xb2, 0x52, 0x89, 0x1e, 0xd4, 0x28, 0x31, 0xf3, 0x75, 0xe7, 0x52, 0x58,
+ 0xc2, 0x23, 0x85, 0x8b, 0xb8, 0x3b, 0x9c, 0x91, 0xf2, 0x46, 0x0e, 0x2d,
+ 0x0b, 0xfa, 0xaf, 0x55, 0x9d, 0x73, 0x58, 0x0a, 0xb4, 0x13, 0x15, 0x05,
+ 0xe6, 0xc9, 0x71, 0x60, 0xd5, 0x4e, 0x23, 0x4f, 0x74, 0x6c, 0xa2, 0x66,
+ 0xe0, 0x63, 0x23, 0xe7, 0x9e, 0xd1, 0xd3, 0x29, 0x01, 0x8e, 0x4e, 0x5b,
+ 0x5c, 0x6e, 0x6f, 0xd4, 0x4b, 0x23, 0x5a, 0xc8, 0x5c, 0x70, 0x92, 0x83,
+ 0xf8, 0xb1, 0x3b, 0x3b, 0x96, 0x2e, 0xe6, 0x9a, 0xf1, 0x84, 0xc8, 0xe6,
+ 0x6f, 0x7d, 0x3a, 0xb0, 0x69, 0xfe, 0x2e, 0x9a, 0x7b, 0x37, 0x33, 0x66,
+ 0x18, 0x14, 0xb1, 0x40, 0x07, 0x3b, 0x3f, 0x19, 0x6f, 0x46, 0xf6, 0xb2,
+ 0x9d, 0x39, 0x43, 0xef, 0x93, 0xa0, 0x4d, 0x1b, 0x0d, 0xf5, 0x96, 0x64,
+ 0x0b, 0x78, 0xd9, 0x33, 0x9e, 0x49, 0xb5, 0xc8, 0x32, 0xb1, 0x34, 0xf1,
+ 0x28, 0xc9, 0x2e, 0xba, 0xa1, 0xa1, 0x23, 0xdb, 0x98, 0x6e, 0x72, 0x78,
+ 0x90, 0xf8, 0xc3, 0xd6, 0xec, 0xc6, 0xeb, 0x46, 0x59, 0xdc, 0x03, 0x1b,
+ 0xf5, 0xa6, 0x48, 0xb0, 0x0b, 0xe8, 0x10, 0x67, 0x47, 0x6f, 0x60, 0xb6,
+ 0xa6, 0x86, 0x71, 0xde, 0xaa, 0x93, 0x52, 0x93, 0xf2, 0x28, 0x18, 0xe5,
+ 0x87, 0xee, 0x9d, 0xa1, 0x8d, 0x84, 0x38, 0x66, 0x2d, 0xcc, 0x8e, 0xf3,
+ 0x6e, 0x72, 0x84, 0xac, 0xbb, 0x8c, 0xd6, 0xdc, 0x2f, 0x24, 0xda, 0x2e,
+ 0x4e, 0xfd, 0xee, 0xa5, 0x3c, 0x23, 0xe5, 0x8d, 0xad, 0x59, 0x6f, 0xcc,
+ 0x60, 0x87, 0x58, 0x63, 0xa1, 0x4b, 0xe0, 0xaa, 0xc8, 0xff, 0x26, 0xda,
+ 0x67, 0x56, 0xdc, 0xe4, 0x55, 0x59, 0x90, 0x76, 0xcb, 0x41, 0xb9, 0x0b,
+ 0x51, 0xbc, 0xa6, 0xc9, 0xfa, 0xe1, 0xfb, 0x77, 0x27, 0x1f, 0x0e, 0x0f,
+ 0x3e, 0x7c, 0xfd, 0xfe, 0xed, 0xab, 0x93, 0xa3, 0xf5, 0xce, 0x70, 0xac,
+ 0xd7, 0x99, 0xf9, 0xd5, 0x64, 0x6d, 0x88, 0x66, 0xc0, 0x83, 0x5e, 0xe5,
+ 0x37, 0x46, 0x98, 0xc1, 0x6e, 0x40, 0xce, 0x00, 0xfe, 0x06, 0x45, 0x20,
+ 0x75, 0x14, 0xef, 0x0c, 0x77, 0xb1, 0x24, 0x05, 0x6d, 0xd4, 0x52, 0x93,
+ 0xf5, 0xa8, 0x88, 0xad, 0xae, 0xf3, 0x8b, 0xa8, 0xd6, 0x19, 0xa9, 0x62,
+ 0x1c, 0x80, 0xb5, 0xd6, 0x21, 0xe4, 0x9e, 0x97, 0x46, 0xb0, 0x6c, 0x8c,
+ 0x85, 0xa4, 0x89, 0x0b, 0x14, 0x22, 0x03, 0xd5, 0x53, 0x33, 0xa1, 0xc8,
+ 0x76, 0xd7, 0x4e, 0x05, 0x35, 0x94, 0xa0, 0x51, 0x0c, 0xff, 0x0e, 0x65,
+ 0x92, 0x93, 0xaa, 0x31, 0x96, 0x4d, 0x96, 0xe3, 0x60, 0x68, 0x7e, 0x17,
+ 0x29, 0xab, 0x70, 0xc8, 0x05, 0xaa, 0x35, 0x85, 0xe4, 0x52, 0xe6, 0xeb,
+ 0x51, 0x76, 0x97, 0xe1, 0xe4, 0xc9, 0x5b, 0x87, 0xcb, 0x0a, 0xe7, 0xf9,
+ 0x07, 0xa3, 0x8b, 0x90, 0xf4, 0x7b, 0xa5, 0x31, 0x3c, 0x7d, 0xc8, 0xdc,
+ 0x31, 0xdd, 0xfb, 0xae, 0x9c, 0x51, 0xc6, 0x57, 0x0a, 0xff, 0x09, 0xdc,
+ 0x5d, 0x67, 0x07, 0xe7, 0xdf, 0xc6, 0xb4, 0xd8, 0x36, 0x1b, 0x42, 0x1b,
+ 0xaf, 0xd5, 0xc7, 0xf8, 0x76, 0x3c, 0x4e, 0x90, 0xe4, 0x4a, 0xe9, 0x18,
+ 0x55, 0x4a, 0x1f, 0xf4, 0x7e, 0x61, 0xb8, 0xba, 0x33, 0xdc, 0xd9, 0x77,
+ 0x87, 0xe3, 0xdf, 0xed, 0xec, 0x90, 0xfa, 0xbe, 0x34, 0x74, 0xd9, 0x30,
+ 0x6f, 0x15, 0xb5, 0x39, 0x99, 0xf3, 0x51, 0x5d, 0x6e, 0xe2, 0xca, 0xae,
+ 0x45, 0x1b, 0x48, 0x6f, 0xcc, 0x55, 0x0b, 0x36, 0x52, 0xa6, 0xee, 0x09,
+ 0xc7, 0xc2, 0xd9, 0x4b, 0x3a, 0x98, 0x91, 0x17, 0xe6, 0xb2, 0x9e, 0x85,
+ 0x9a, 0xf8, 0x46, 0x7e, 0x3a, 0xe6, 0x14, 0xda, 0x74, 0x62, 0xfe, 0x46,
+ 0xde, 0x81, 0xcd, 0xfe, 0x85, 0x8d, 0x59, 0x17, 0xe5, 0x08, 0x39, 0x52,
+ 0x7f, 0x43, 0xa9, 0x50, 0xa8, 0x27, 0x5b, 0xfd, 0x16, 0xc4, 0xbf, 0x36,
+ 0x16, 0x48, 0x13, 0xbe, 0x48, 0x27, 0x1f, 0x6f, 0xd3, 0x6a, 0x0a, 0x5b,
+ 0xc8, 0xb0, 0xcb, 0x45, 0x3e, 0xcb, 0x1b, 0xf6, 0x07, 0x76, 0x2d, 0x69,
+ 0x6c, 0x3f, 0xd1, 0xd0, 0x18, 0x27, 0xc6, 0xcc, 0xaf, 0x39, 0x43, 0x20,
+ 0x6f, 0x7c, 0x2b, 0x16, 0xea, 0x51, 0x33, 0xb2, 0xb7, 0xad, 0xf7, 0xe1,
+ 0xe0, 0x7a, 0xe4, 0x7c, 0xd5, 0x81, 0x4c, 0xd4, 0x71, 0xae, 0x0a, 0x42,
+ 0x5f, 0x4e, 0x59, 0xb6, 0xbb, 0x37, 0x97, 0xfc, 0x3c, 0xa2, 0x1f, 0x22,
+ 0xeb, 0xf9, 0xbb, 0xec, 0xde, 0x18, 0xcd, 0x79, 0xe1, 0x04, 0xa5, 0x15,
+ 0x8d, 0xaa, 0x88, 0xe6, 0xea, 0x41, 0xcf, 0x24, 0x0e, 0x22, 0x97, 0x49,
+ 0xe8, 0x36, 0xe0, 0x01, 0x54, 0x09, 0xa7, 0x31, 0xd6, 0xeb, 0x96, 0x48,
+ 0xc6, 0xa7, 0xc2, 0x4d, 0x1c, 0x9b, 0x9f, 0x17, 0x45, 0x36, 0x93, 0xfd,
+ 0x3b, 0x6f, 0x4b, 0xb7, 0x36, 0xf5, 0xed, 0xb3, 0x66, 0xce, 0x92, 0x51,
+ 0xd1, 0x19, 0xee, 0x39, 0xb2, 0x0e, 0xd3, 0x46, 0xaf, 0x24, 0x4d, 0x76,
+ 0x36, 0x16, 0xd1, 0xb6, 0xfd, 0xd5, 0xa8, 0xfb, 0x15, 0xf7, 0x99, 0xe0,
+ 0x34, 0xad, 0xdc, 0xf2, 0x70, 0x93, 0xff, 0x68, 0xf5, 0x2a, 0x48, 0xbf,
+ 0xce, 0x70, 0xbe, 0x8a, 0x2d, 0x57, 0x98, 0x2c, 0x63, 0xdd, 0xe8, 0xa8,
+ 0x65, 0x05, 0x27, 0x51, 0x55, 0x9a, 0xad, 0x6e, 0x6d, 0xe6, 0x06, 0x58,
+ 0x63, 0x1a, 0x68, 0x25, 0x22, 0xcd, 0x3d, 0xc2, 0x6c, 0xfe, 0x4a, 0x73,
+ 0xb5, 0xd7, 0xdc, 0x6c, 0xdf, 0xd0, 0x90, 0xd4, 0x2f, 0x8d, 0x18, 0x8b,
+ 0x5f, 0xd0, 0x72, 0x43, 0x3f, 0xf2, 0x8a, 0x76, 0x09, 0x09, 0xc1, 0x9d,
+ 0xd5, 0x61, 0xc6, 0x51, 0xf2, 0x46, 0x6f, 0x64, 0x9a, 0x81, 0xf5, 0xba,
+ 0x92, 0x68, 0xa0, 0x24, 0xc6, 0x29, 0x27, 0x77, 0x8b, 0x07, 0x39, 0x9a,
+ 0x60, 0x33, 0x17, 0x47, 0xe3, 0xfe, 0x5a, 0xb2, 0x91, 0x8d, 0xae, 0xcc,
+ 0x3d, 0xbe, 0x46, 0x43, 0xed, 0xec, 0xd3, 0x9f, 0xbb, 0xf8, 0x73, 0x6f,
+ 0x4d, 0x8b, 0x12, 0x7c, 0xda, 0xd3, 0x65, 0xde, 0xbd, 0x8b, 0x3a, 0x57,
+ 0x3b, 0x5f, 0x6f, 0x79, 0x9f, 0xe0, 0x61, 0x95, 0xf5, 0x84, 0x89, 0x9c,
+ 0x84, 0xea, 0x96, 0x52, 0x61, 0xce, 0x8e, 0x88, 0x9b, 0x8c, 0x3d, 0x21,
+ 0x66, 0x6d, 0x94, 0x7d, 0x04, 0xe7, 0xa1, 0x9e, 0xaa, 0xc9, 0x87, 0x2a,
+ 0xbb, 0x4e, 0xeb, 0xeb, 0x64, 0xd9, 0x30, 0x13, 0x1a, 0xbe, 0xed, 0x0e,
+ 0xb7, 0x98, 0xe5, 0xea, 0x61, 0x93, 0x2f, 0x8f, 0xc4, 0xe2, 0x73, 0x5b,
+ 0xc8, 0xde, 0x66, 0x73, 0xd3, 0x95, 0xb7, 0x89, 0x3e, 0x35, 0x94, 0x1a,
+ 0x81, 0xa8, 0x5a, 0x40, 0x97, 0x33, 0x5c, 0x26, 0xc4, 0xeb, 0x43, 0x3f,
+ 0xc1, 0x6e, 0x4e, 0x3a, 0x25, 0xd5, 0x30, 0x24, 0xd9, 0xa5, 0xa1, 0x19,
+ 0x19, 0x74, 0x33, 0xda, 0xb9, 0xb4, 0x88, 0xe6, 0x3a, 0x59, 0x3d, 0x2f,
+ 0xbf, 0x14, 0xa7, 0xad, 0xfc, 0x1b, 0xf7, 0xa9, 0x68, 0x60, 0x35, 0x67,
+ 0xe0, 0x19, 0x55, 0xa0, 0xa5, 0x7b, 0x3d, 0xcc, 0xda, 0x90, 0x8f, 0xbe,
+ 0x62, 0x2e, 0xeb, 0xe5, 0x30, 0x89, 0xf2, 0x75, 0x7e, 0x05, 0x5b, 0x23,
+ 0xe6, 0xbd, 0xb0, 0x5a, 0xcb, 0xaf, 0x3f, 0x24, 0x66, 0xc6, 0x43, 0x72,
+ 0x91, 0x2e, 0xeb, 0x55, 0x67, 0x44, 0x8f, 0x88, 0xc7, 0xe9, 0xfc, 0x92,
+ 0x75, 0x13, 0x73, 0xdc, 0xdc, 0x23, 0x40, 0x97, 0x0b, 0xef, 0x3d, 0xc6,
+ 0x38, 0xf4, 0xce, 0xd5, 0x98, 0xc7, 0x79, 0x27, 0xfe, 0x91, 0x8d, 0xf4,
+ 0x63, 0x3a, 0x4a, 0x4e, 0x0f, 0xc7, 0x67, 0xf4, 0x85, 0x05, 0xa5, 0x0a,
+ 0x6c, 0x52, 0x1e, 0x41, 0x67, 0xb8, 0xec, 0xae, 0xc9, 0x8a, 0x3a, 0xe6,
+ 0x99, 0xe4, 0xbb, 0xa9, 0xed, 0xf3, 0x94, 0xe0, 0x81, 0x0d, 0x53, 0xfb,
+ 0x41, 0x7e, 0x64, 0x19, 0x20, 0x31, 0x94, 0x8f, 0x5a, 0xf0, 0xa1, 0x85,
+ 0x39, 0xf8, 0xd3, 0x4d, 0xeb, 0xa7, 0x19, 0x28, 0x2f, 0xd8, 0x20, 0x61,
+ 0xbd, 0xbc, 0x22, 0x1b, 0xa4, 0x56, 0xcb, 0xd1, 0xa7, 0x46, 0xa8, 0x2a,
+ 0xc8, 0xb2, 0xe1, 0x43, 0xe4, 0xa3, 0x63, 0x46, 0x42, 0x8a, 0x37, 0xb4,
+ 0xa4, 0xa2, 0x74, 0x03, 0x9b, 0xd1, 0xc8, 0xd5, 0x96, 0x53, 0x54, 0x6d,
+ 0x92, 0x19, 0x35, 0x74, 0x1a, 0x51, 0x02, 0x78, 0x4f, 0xd4, 0x76, 0xba,
+ 0x94, 0x0a, 0x97, 0xb8, 0x6b, 0x6a, 0xc2, 0x0a, 0x9a, 0xc6, 0x26, 0x72,
+ 0xf2, 0x8f, 0x92, 0xb2, 0xcc, 0x76, 0x3a, 0x0e, 0xbc, 0x3d, 0xfe, 0xc9,
+ 0x37, 0xc5, 0x92, 0x92, 0x8f, 0x22, 0xb7, 0x31, 0x69, 0x55, 0x74, 0xcd,
+ 0x10, 0xfd, 0x56, 0x79, 0xf5, 0x9e, 0xec, 0xb4, 0xbd, 0xd7, 0x60, 0x36,
+ 0x63, 0x00, 0x64, 0xc9, 0x4b, 0xfa, 0xf3, 0x11, 0x52, 0x99, 0xf3, 0x34,
+ 0xf0, 0x8a, 0x44, 0x3a, 0x59, 0x80, 0xb2, 0x2b, 0xa6, 0x25, 0x9f, 0x83,
+ 0xdb, 0x0b, 0xec, 0x36, 0x22, 0xc1, 0x37, 0x48, 0x5e, 0x51, 0x55, 0xd9,
+ 0xd1, 0xdb, 0x6f, 0xc0, 0x02, 0x67, 0x3b, 0xbb, 0x88, 0x29, 0x59, 0xe3,
+ 0x61, 0x8a, 0x2f, 0xd4, 0xec, 0x46, 0x40, 0x46, 0xe5, 0x22, 0x54, 0x7c,
+ 0x71, 0x23, 0x0c, 0x20, 0x47, 0x29, 0x18, 0x88, 0x8c, 0xe6, 0xe9, 0xa7,
+ 0xbb, 0xbf, 0x02, 0x43, 0xf4, 0x68, 0x20, 0x14, 0xa4, 0xff, 0x7e, 0xcc,
+ 0xee, 0xc5, 0x3f, 0x63, 0xfe, 0x06, 0x92, 0x7a, 0x74, 0xb6, 0x4f, 0x26,
+ 0x2f, 0x3d, 0x02, 0xfd, 0x79, 0x9f, 0x52, 0xa6, 0x29, 0x15, 0xf5, 0xe7,
+ 0xc7, 0x10, 0x3e, 0x7e, 0x1f, 0x86, 0x64, 0x8f, 0x78, 0x5a, 0xe0, 0xe0,
+ 0xd2, 0xfc, 0x31, 0x8e, 0xf5, 0xb3, 0x80, 0x97, 0x82, 0x3e, 0xaa, 0xf5,
+ 0x23, 0x56, 0x4f, 0x0b, 0xab, 0x8f, 0x0c, 0x39, 0xc5, 0x0d, 0x69, 0x87,
+ 0x5d, 0xc2, 0x4f, 0xca, 0x99, 0xa4, 0xa3, 0xb4, 0x3e, 0xec, 0x9b, 0xad,
+ 0x50, 0xe7, 0x77, 0xe5, 0x7e, 0xa3, 0xf3, 0xc9, 0xa2, 0x86, 0x75, 0xe8,
+ 0xee, 0x59, 0xb0, 0x0a, 0x35, 0xb2, 0x19, 0xec, 0xb5, 0xe8, 0x5e, 0x43,
+ 0x54, 0x1b, 0x33, 0x63, 0x2d, 0x69, 0x94, 0xa8, 0x33, 0xaf, 0x47, 0xf7,
+ 0xa7, 0xdc, 0x5c, 0x25, 0x2e, 0xe9, 0xc2, 0xe4, 0x66, 0xb2, 0x44, 0x6b,
+ 0xb9, 0x9a, 0x8c, 0x8c, 0xab, 0x72, 0xd1, 0x0e, 0xb9, 0x2c, 0x27, 0x8c,
+ 0x5c, 0x70, 0x92, 0x41, 0xd7, 0x17, 0xa5, 0x9a, 0x36, 0x33, 0x1e, 0x8a,
+ 0x33, 0x93, 0x35, 0x8f, 0x1e, 0x6b, 0xd1, 0xc8, 0x45, 0xc3, 0x01, 0x4f,
+ 0x39, 0x3c, 0xf9, 0x0d, 0x11, 0x4e, 0x79, 0x07, 0x37, 0x74, 0xb8, 0xa1,
+ 0x14, 0x77, 0x34, 0xff, 0x2d, 0xc8, 0x25, 0xf6, 0x2f, 0x11, 0x6e, 0xf4,
+ 0xd8, 0xcb, 0x72, 0x20, 0x72, 0xf3, 0x24, 0xe2, 0x01, 0xed, 0x85, 0xea,
+ 0x32, 0xa4, 0x74, 0x6e, 0x76, 0xff, 0x78, 0x6b, 0x8e, 0xa6, 0x44, 0xc2,
+ 0x85, 0x34, 0x54, 0xb1, 0xe4, 0x62, 0x86, 0x4e, 0x97, 0x41, 0x48, 0x3b,
+ 0x68, 0x28, 0x89, 0x84, 0xaf, 0x29, 0xf2, 0xba, 0xe6, 0x93, 0x8f, 0x08,
+ 0xb8, 0xc8, 0xf5, 0xe4, 0x2f, 0x50, 0x2b, 0x09, 0xb8, 0x0a, 0x26, 0xdc,
+ 0x02, 0x9a, 0x00, 0xf9, 0x83, 0x89, 0x25, 0xe9, 0x66, 0xce, 0x0b, 0x76,
+ 0xf4, 0xf5, 0x3a, 0x18, 0xcc, 0x6c, 0x3f, 0xbc, 0x3a, 0x7e, 0x97, 0x6c,
+ 0x50, 0x42, 0xc2, 0x45, 0xd7, 0xc2, 0xd5, 0xbb, 0x3d, 0xd9, 0xca, 0x9a,
+ 0xc9, 0xd6, 0xe2, 0x63, 0xbe, 0x65, 0x4c, 0xcd, 0xe9, 0xc5, 0xa6, 0xe7,
+ 0xb4, 0xc4, 0x27, 0x89, 0x13, 0x23, 0x76, 0x69, 0xe0, 0x77, 0x74, 0x76,
+ 0x2a, 0x89, 0x21, 0x6b, 0x9e, 0x82, 0x4a, 0xe0, 0x66, 0x04, 0x65, 0x24,
+ 0x1b, 0x82, 0xa3, 0x39, 0xf0, 0x6d, 0x4a, 0xb2, 0x4a, 0xf7, 0xac, 0x72,
+ 0x39, 0x86, 0x78, 0x71, 0xd8, 0x7b, 0xa3, 0x35, 0x04, 0x72, 0x5b, 0x38,
+ 0xcd, 0x77, 0x40, 0xd5, 0x1f, 0x44, 0x95, 0x05, 0xdd, 0x47, 0x53, 0xf2,
+ 0x01, 0x46, 0x72, 0x41, 0x93, 0xb5, 0xd1, 0xd6, 0x9a, 0xad, 0x76, 0x31,
+ 0x24, 0xe6, 0xa2, 0x2e, 0x1b, 0xec, 0x32, 0x0c, 0x76, 0xb9, 0xac, 0xad,
+ 0x07, 0x93, 0x18, 0x59, 0xb7, 0x6b, 0x14, 0xbd, 0xcb, 0xbd, 0xed, 0xb4,
+ 0x1a, 0x97, 0xd1, 0x8c, 0x71, 0xb0, 0x7c, 0x5b, 0x5d, 0x66, 0x85, 0xcd,
+ 0x5a, 0xfb, 0x69, 0xcd, 0xab, 0x97, 0x68, 0x9d, 0x86, 0xc6, 0x8f, 0x20,
+ 0x88, 0xfc, 0x37, 0x77, 0xb1, 0x3d, 0xc0, 0xd3, 0x6c, 0x96, 0xcf, 0x73,
+ 0xd8, 0x5d, 0x6e, 0x87, 0x68, 0x06, 0xc3, 0x58, 0x58, 0xd0, 0x9b, 0xd2,
+ 0x4f, 0xe1, 0x94, 0xb4, 0x0c, 0x29, 0xa5, 0x5f, 0x63, 0x4a, 0xde, 0x24,
+ 0x22, 0x26, 0x73, 0x7b, 0x4a, 0xb6, 0x8e, 0x69, 0x45, 0xb0, 0xf8, 0xf8,
+ 0x01, 0x3d, 0xde, 0x79, 0x44, 0xf4, 0xcc, 0xb3, 0x50, 0x33, 0x12, 0xeb,
+ 0xe3, 0xa4, 0xde, 0xd9, 0xe9, 0xde, 0x72, 0x1e, 0x4f, 0x0d, 0x98, 0xa9,
+ 0x52, 0xcb, 0x96, 0xef, 0xdf, 0x1d, 0x27, 0x1b, 0x54, 0xd9, 0xfa, 0xfc,
+ 0xe9, 0xce, 0xee, 0xa6, 0x9f, 0x4c, 0xa2, 0x02, 0x20, 0xbc, 0x34, 0x29,
+ 0x04, 0xea, 0x9f, 0x3e, 0x2a, 0x65, 0x10, 0x7d, 0xc3, 0x0d, 0x3c, 0xcd,
+ 0x6e, 0xf2, 0x09, 0x95, 0x15, 0x23, 0x04, 0x0f, 0xe5, 0xff, 0x22, 0x33,
+ 0xb3, 0x0c, 0x28, 0x8e, 0x5f, 0x31, 0xdb, 0xac, 0xf1, 0xfc, 0x8d, 0x85,
+ 0x64, 0x15, 0x65, 0x4a, 0x16, 0x35, 0x4c, 0xd0, 0x08, 0xf5, 0xfc, 0x79,
+ 0xc3, 0x67, 0x91, 0xf6, 0xb8, 0x81, 0x68, 0x5d, 0x5c, 0xf6, 0x0b, 0xed,
+ 0x42, 0xd6, 0xcd, 0xfa, 0xbe, 0x50, 0x4b, 0xc4, 0xaf, 0x0d, 0x1a, 0x53,
+ 0xd2, 0x49, 0x77, 0x03, 0x65, 0x46, 0x6b, 0x74, 0x93, 0x14, 0xb8, 0xd9,
+ 0x53, 0x37, 0xa8, 0x25, 0xbf, 0xaf, 0x06, 0xb5, 0x47, 0x0d, 0xdd, 0xe4,
+ 0xe0, 0x1b, 0xa3, 0xb6, 0xc4, 0x87, 0xfc, 0xa7, 0x78, 0x98, 0xba, 0xd2,
+ 0x53, 0xf6, 0x87, 0xf6, 0x5e, 0x5c, 0x86, 0x17, 0x99, 0x94, 0x84, 0xb0,
+ 0xb8, 0xb5, 0xdb, 0x1d, 0xdc, 0xe3, 0xe6, 0xf5, 0x2d, 0xff, 0x12, 0x6a,
+ 0x3b, 0x7d, 0x28, 0x81, 0x99, 0xbc, 0x3c, 0x1f, 0xc5, 0xcb, 0x83, 0xeb,
+ 0xd9, 0x66, 0x6c, 0x44, 0x1c, 0xc5, 0xba, 0x7f, 0xbb, 0x66, 0x8f, 0x26,
+ 0x25, 0xcc, 0x6a, 0x7f, 0xa2, 0x20, 0x84, 0xf7, 0xb9, 0x51, 0x2b, 0xcf,
+ 0xb1, 0xc7, 0x8d, 0xfd, 0x58, 0x01, 0x68, 0x25, 0x20, 0x9d, 0xe4, 0x98,
+ 0x3b, 0xed, 0x97, 0xc9, 0xc0, 0xd4, 0x93, 0x80, 0xbd, 0x0e, 0x27, 0xd9,
+ 0xcf, 0xc3, 0xe0, 0xca, 0xae, 0xad, 0x2e, 0xe4, 0x34, 0x35, 0x2a, 0x5f,
+ 0x03, 0xe5, 0x42, 0x73, 0xa6, 0xe2, 0x3c, 0x6a, 0x4e, 0xc4, 0x6c, 0x6f,
+ 0x2d, 0x6a, 0xfb, 0x93, 0x8d, 0x13, 0xc9, 0x09, 0x4f, 0xce, 0x5e, 0xff,
+ 0x68, 0xeb, 0xe9, 0x92, 0xa8, 0xf5, 0x0e, 0x2f, 0xd4, 0x1f, 0x6d, 0x00,
+ 0xd8, 0x58, 0x14, 0x94, 0x9c, 0x96, 0x4b, 0x9a, 0x27, 0x3b, 0x89, 0x10,
+ 0x08, 0xdf, 0x74, 0x09, 0x8c, 0x44, 0xea, 0xb5, 0x97, 0xf8, 0x5d, 0x37,
+ 0xd0, 0x54, 0xb2, 0x19, 0xf3, 0xe5, 0x4f, 0xfc, 0x6b, 0xce, 0x70, 0xf9,
+ 0xe9, 0x65, 0x73, 0xbd, 0x9c, 0x5f, 0x98, 0xbd, 0x2c, 0x9a, 0x2f, 0xd7,
+ 0x38, 0xc6, 0x7a, 0xc9, 0xd4, 0x24, 0x2e, 0xe8, 0xb7, 0x39, 0x29, 0x38,
+ 0xc2, 0xe2, 0x5b, 0x99, 0xac, 0x4d, 0x36, 0x9e, 0xdf, 0x20, 0x48, 0x25,
+ 0x5c, 0x63, 0x47, 0x76, 0xa0, 0xea, 0xbd, 0x37, 0xfc, 0xf9, 0xd3, 0x9b,
+ 0x3f, 0xfd, 0xf4, 0x62, 0xef, 0x49, 0xfa, 0x3c, 0x9d, 0x3c, 0xbb, 0xfc,
+ 0x3c, 0x7d, 0x3a, 0x7d, 0xfa, 0xfc, 0xc5, 0xee, 0xe7, 0x4f, 0xd3, 0xe7,
+ 0x4f, 0x2e, 0xd3, 0x67, 0x3b, 0xd9, 0xce, 0x8b, 0xcb, 0xdd, 0xbd, 0xe9,
+ 0xf4, 0x32, 0xfb, 0x7c, 0xfa, 0x3c, 0x5d, 0x1b, 0xc1, 0xf6, 0xd2, 0xb9,
+ 0x87, 0xa2, 0xd6, 0x86, 0xdd, 0xcc, 0x3a, 0xc6, 0xdf, 0x1e, 0x0c, 0x77,
+ 0x92, 0xeb, 0xec, 0x4e, 0x8f, 0x58, 0x3b, 0xb4, 0x4e, 0x28, 0x0b, 0x94,
+ 0x4d, 0xd3, 0xbb, 0x58, 0x45, 0x37, 0x48, 0x5e, 0x97, 0xe4, 0x28, 0x41,
+ 0x66, 0x2d, 0x68, 0xa8, 0x44, 0xe5, 0x44, 0x3a, 0xe7, 0x3b, 0xdc, 0x4f,
+ 0xd4, 0x61, 0x4f, 0xeb, 0xea, 0x1e, 0xfe, 0x13, 0x2a, 0x39, 0x7b, 0x93,
+ 0x4e, 0x8c, 0x8e, 0x44, 0x24, 0x91, 0x27, 0xc7, 0xc6, 0xb0, 0x35, 0x92,
+ 0x7a, 0x90, 0xc8, 0x5f, 0x8c, 0x2d, 0xe3, 0x8d, 0xf1, 0x4d, 0x55, 0x2e,
+ 0x17, 0x67, 0xe5, 0x2c, 0x9f, 0xdc, 0xaf, 0x1a, 0xce, 0x7f, 0xac, 0xf5,
+ 0x8b, 0x23, 0x16, 0xe0, 0x79, 0x9d, 0xfd, 0x13, 0xed, 0x2a, 0x27, 0x8e,
+ 0x1f, 0x34, 0xac, 0x86, 0x93, 0x7c, 0x71, 0x4d, 0x11, 0xde, 0x97, 0xc8,
+ 0xea, 0x33, 0xc2, 0x4e, 0x7e, 0x10, 0x37, 0xa8, 0xc6, 0x72, 0x1a, 0x6b,
+ 0xd9, 0x4a, 0x7d, 0x5b, 0xd4, 0xad, 0x5c, 0xcb, 0xf2, 0xd5, 0x3b, 0x25,
+ 0x99, 0xa4, 0x79, 0xe0, 0xc1, 0x43, 0xe8, 0x47, 0x5e, 0x96, 0x84, 0x03,
+ 0x9b, 0x7a, 0xc9, 0x9e, 0x0b, 0xf9, 0xed, 0x88, 0x4b, 0x07, 0x97, 0x0b,
+ 0x32, 0x2e, 0x00, 0xfa, 0x81, 0x9f, 0x77, 0x4f, 0x19, 0x4d, 0x5e, 0xd8,
+ 0x85, 0xad, 0x10, 0x43, 0xce, 0xf7, 0xef, 0x4e, 0xf6, 0xbb, 0x44, 0x4a,
+ 0xa8, 0xf6, 0xb9, 0xde, 0xdf, 0xda, 0x42, 0xb0, 0xe7, 0x3a, 0xbd, 0xbb,
+ 0x1b, 0xd5, 0xd9, 0xd6, 0xb4, 0x9c, 0xd4, 0x5b, 0x75, 0x3d, 0x53, 0x6a,
+ 0x00, 0x90, 0xe0, 0x53, 0xfa, 0x71, 0xcb, 0x39, 0x64, 0x56, 0x36, 0x1d,
+ 0xd6, 0x75, 0x90, 0x12, 0x44, 0xa5, 0x39, 0x9c, 0x73, 0x70, 0x24, 0x69,
+ 0x68, 0xb8, 0xe5, 0x86, 0x79, 0x81, 0x6a, 0x1a, 0x7d, 0x19, 0xe4, 0xb5,
+ 0x7e, 0x10, 0x9b, 0x8e, 0x33, 0x88, 0xe8, 0x60, 0xa9, 0x48, 0xeb, 0x3f,
+ 0xfa, 0xae, 0x1c, 0xd2, 0xa7, 0xcb, 0xca, 0x96, 0x80, 0xa2, 0x32, 0x79,
+ 0x65, 0xe2, 0xde, 0xb3, 0x8e, 0xeb, 0xc3, 0x2e, 0x22, 0x1e, 0xf9, 0x57,
+ 0xf7, 0x57, 0x9a, 0xb8, 0x27, 0x9d, 0x23, 0xa8, 0x8b, 0xad, 0x63, 0x58,
+ 0xf7, 0xaa, 0xac, 0xcc, 0xcd, 0x31, 0xaf, 0x57, 0xd5, 0x2d, 0xb2, 0xce,
+ 0xd7, 0x0e, 0x15, 0x4e, 0x33, 0xfd, 0x80, 0x72, 0x5f, 0x03, 0x7c, 0x93,
+ 0x6f, 0x39, 0xdd, 0xa8, 0x7b, 0xc9, 0x0a, 0xf8, 0x45, 0x6f, 0x9e, 0x9b,
+ 0xf5, 0xb6, 0x75, 0x77, 0xba, 0xcf, 0xd7, 0xb6, 0x2c, 0x5c, 0x8c, 0x24,
+ 0x14, 0xb1, 0xe6, 0x1e, 0x37, 0x2b, 0x1d, 0x78, 0xe1, 0xa2, 0x2a, 0xe3,
+ 0xda, 0x56, 0xa3, 0x6e, 0x54, 0x55, 0xe9, 0xe9, 0xbf, 0xc3, 0xef, 0x60,
+ 0x87, 0x9a, 0x8b, 0x34, 0xbf, 0xd2, 0x30, 0x7c, 0x6f, 0x12, 0x5e, 0x43,
+ 0x89, 0xcd, 0x1a, 0x64, 0xa7, 0xda, 0x20, 0xf1, 0x72, 0x68, 0xe2, 0x66,
+ 0xcd, 0x99, 0x37, 0xd6, 0xcf, 0xd0, 0x86, 0x9d, 0xf0, 0xd0, 0x27, 0xda,
+ 0xaf, 0x50, 0xb6, 0x55, 0xa2, 0x07, 0xd9, 0x7d, 0xa3, 0x95, 0x00, 0x47,
+ 0x78, 0x28, 0xd8, 0xb4, 0xae, 0x61, 0x88, 0x6c, 0x5c, 0xab, 0x1e, 0xc6,
+ 0x40, 0x3a, 0xba, 0xeb, 0x39, 0x5d, 0xb4, 0x0a, 0x3f, 0x73, 0x60, 0xc6,
+ 0xa4, 0x48, 0xfa, 0x8f, 0xe9, 0x00, 0xa5, 0x17, 0xcb, 0xc5, 0x80, 0xe1,
+ 0xf5, 0xd8, 0xd8, 0xbc, 0x4a, 0xad, 0xb2, 0x86, 0xea, 0x60, 0xe4, 0x95,
+ 0xb9, 0x1f, 0x29, 0x1f, 0x9d, 0xa0, 0x82, 0x66, 0xa5, 0x53, 0xc6, 0xa4,
+ 0xba, 0x91, 0xb0, 0x14, 0x46, 0x81, 0x88, 0x47, 0xbd, 0x12, 0xb8, 0x80,
+ 0x51, 0x01, 0x26, 0x36, 0x89, 0x1b, 0xac, 0x77, 0xa1, 0xb1, 0x74, 0x5c,
+ 0xcc, 0x82, 0xef, 0x81, 0xed, 0x8b, 0x7a, 0x91, 0x24, 0x67, 0x9f, 0x61,
+ 0x1a, 0x72, 0x80, 0x90, 0x08, 0x64, 0x05, 0xd7, 0x1f, 0xa8, 0x07, 0xbc,
+ 0x2e, 0x25, 0xad, 0x93, 0x26, 0x4a, 0xf3, 0xe4, 0x39, 0x76, 0x39, 0xcb,
+ 0xc2, 0x51, 0xb4, 0xec, 0x96, 0xb4, 0x76, 0x99, 0xfc, 0xb5, 0x4d, 0xda,
+ 0xf2, 0x5c, 0xf4, 0x4a, 0xcd, 0x98, 0xa1, 0x1b, 0xd6, 0x44, 0x60, 0x26,
+ 0x55, 0xa6, 0x9f, 0x28, 0xca, 0xee, 0xac, 0x64, 0x1e, 0xb1, 0x84, 0x55,
+ 0xcd, 0xfc, 0xf7, 0x26, 0xa0, 0x15, 0x00, 0x76, 0x9b, 0xe3, 0xf7, 0x62,
+ 0xe6, 0x1e, 0x70, 0xe6, 0xa8, 0xdb, 0x43, 0x38, 0x26, 0xa4, 0xa6, 0x8e,
+ 0xe7, 0xbd, 0xcf, 0xd5, 0xe5, 0x5f, 0x6c, 0xc6, 0xfc, 0xc9, 0xde, 0x60,
+ 0x2e, 0xbb, 0xcd, 0x9c, 0xd5, 0xc9, 0xac, 0x44, 0xe6, 0xa0, 0x38, 0x4e,
+ 0x18, 0x37, 0x84, 0xab, 0x7d, 0x2d, 0x9a, 0x48, 0x67, 0x38, 0x7e, 0x86,
+ 0xb7, 0xe7, 0xd2, 0xaa, 0x25, 0x62, 0xd3, 0x3a, 0x9c, 0x13, 0xe8, 0x25,
+ 0xd6, 0xec, 0x34, 0x93, 0xfb, 0xe9, 0x27, 0xa3, 0x72, 0x18, 0x73, 0xba,
+ 0x33, 0xdc, 0x4f, 0xcd, 0x20, 0xf9, 0xc9, 0xf0, 0xe2, 0x4f, 0x5c, 0xce,
+ 0xf4, 0xd3, 0x0d, 0x59, 0x8c, 0xe4, 0x88, 0xae, 0x67, 0x14, 0x65, 0x62,
+ 0x9d, 0xbc, 0xed, 0xc1, 0x63, 0x44, 0x17, 0xa0, 0x36, 0xc4, 0x53, 0xb8,
+ 0xbc, 0xd4, 0x64, 0x4a, 0xd7, 0x34, 0xdb, 0xb5, 0x9c, 0x17, 0x62, 0xc7,
+ 0x30, 0x73, 0xe2, 0xd8, 0xe3, 0xd2, 0x58, 0xff, 0xdd, 0xba, 0xc7, 0x48,
+ 0x51, 0xda, 0x55, 0x24, 0xc4, 0x71, 0x61, 0xe3, 0x6e, 0xcb, 0xbd, 0x7b,
+ 0x4d, 0xe1, 0x4f, 0x60, 0x9a, 0x72, 0x60, 0xd5, 0xc8, 0xdd, 0x53, 0x72,
+ 0xc4, 0xa3, 0x4a, 0xac, 0x7b, 0xe9, 0x3b, 0xab, 0x93, 0x6a, 0xe7, 0x16,
+ 0xd7, 0xf7, 0x35, 0x89, 0x70, 0x99, 0x8e, 0xd5, 0x1d, 0x68, 0x86, 0xd1,
+ 0x04, 0x99, 0xb1, 0xf3, 0xc7, 0xe1, 0x01, 0xd8, 0x67, 0x46, 0xfa, 0xb5,
+ 0xe4, 0xa6, 0x99, 0xcb, 0xfa, 0x70, 0xdd, 0x8b, 0x97, 0x69, 0x5a, 0x4d,
+ 0x90, 0x69, 0x6f, 0xb3, 0xb7, 0x5d, 0x86, 0x62, 0xf0, 0x49, 0xb8, 0x2c,
+ 0x05, 0x9c, 0x82, 0x86, 0xf4, 0xb2, 0x22, 0x1d, 0x42, 0x0f, 0x15, 0x78,
+ 0x86, 0xd3, 0x1f, 0x44, 0x7c, 0x53, 0x52, 0x57, 0x66, 0xdf, 0xcd, 0x1b,
+ 0x2f, 0x84, 0x34, 0x1c, 0x02, 0x43, 0x6d, 0xc1, 0xb8, 0x67, 0x5c, 0xd6,
+ 0x08, 0x2b, 0x05, 0xa1, 0x55, 0x8a, 0x6c, 0x04, 0xf2, 0x56, 0x13, 0x06,
+ 0x1b, 0x0b, 0xf9, 0x45, 0x67, 0x9c, 0x30, 0xb7, 0x6e, 0x0b, 0x41, 0x45,
+ 0x1a, 0x97, 0x70, 0xe1, 0x4c, 0x90, 0xf1, 0x80, 0xac, 0x1a, 0x29, 0x39,
+ 0x0b, 0x0d, 0x46, 0xba, 0xf5, 0x02, 0x8d, 0x89, 0xe6, 0xf4, 0x05, 0x63,
+ 0xc6, 0xc4, 0xf5, 0xa6, 0xb5, 0xee, 0x1b, 0x3f, 0xd8, 0xec, 0x08, 0x20,
+ 0x8b, 0x48, 0x20, 0xc8, 0xcc, 0x61, 0x43, 0xf2, 0xed, 0x86, 0x7f, 0x45,
+ 0x01, 0x91, 0xd4, 0x7b, 0x69, 0x02, 0xef, 0x66, 0xc2, 0x59, 0xc4, 0x75,
+ 0x24, 0x03, 0xc0, 0x65, 0x63, 0x79, 0x04, 0x76, 0x39, 0x4d, 0x39, 0x5c,
+ 0xdd, 0xb8, 0xbb, 0x58, 0xe3, 0xf4, 0x9e, 0x0e, 0x42, 0xf6, 0xfa, 0x36,
+ 0x05, 0x8f, 0xe8, 0x7b, 0xe2, 0xbb, 0xd6, 0xab, 0xc3, 0x9e, 0xe9, 0xc5,
+ 0x0c, 0x38, 0x64, 0x5a, 0x09, 0x03, 0x05, 0x2a, 0xa0, 0xce, 0xce, 0x26,
+ 0xa5, 0xe1, 0x71, 0x04, 0x90, 0xb2, 0xb1, 0xbe, 0x3d, 0x7d, 0x73, 0x14,
+ 0x77, 0xa9, 0x92, 0x58, 0xcf, 0x9a, 0xee, 0xfb, 0xbb, 0xee, 0xfd, 0x1f,
+ 0x5f, 0x7d, 0xf3, 0xe1, 0xf0, 0xf4, 0xed, 0xeb, 0xe3, 0x6f, 0x1e, 0x1c,
+ 0x25, 0xd9, 0x50, 0xbd, 0xac, 0x9b, 0x7c, 0x31, 0x7a, 0xbe, 0x37, 0xda,
+ 0xde, 0xec, 0x7e, 0x65, 0xcf, 0x7d, 0xe5, 0x97, 0x4e, 0xf0, 0xc9, 0xa6,
+ 0x39, 0x03, 0xc5, 0x50, 0x92, 0xb7, 0xf6, 0xa1, 0xe6, 0x5f, 0x65, 0xcd,
+ 0xe2, 0x76, 0x99, 0x4f, 0x39, 0x57, 0x5d, 0xb4, 0xa2, 0xeb, 0x72, 0xee,
+ 0x65, 0x14, 0x74, 0x87, 0x79, 0xba, 0xa9, 0x79, 0x16, 0x3c, 0xc4, 0xc1,
+ 0xd9, 0xd9, 0xab, 0x83, 0xf3, 0x83, 0x9e, 0x8f, 0x3e, 0xeb, 0x3c, 0xbd,
+ 0xf6, 0x7e, 0x7c, 0xf4, 0xee, 0xec, 0xdd, 0x29, 0x81, 0x89, 0x6c, 0xcf,
+ 0x34, 0x30, 0xf8, 0x2a, 0x6d, 0xd2, 0xb5, 0x9e, 0x11, 0x9e, 0x1b, 0x6e,
+ 0x3a, 0x2d, 0x6c, 0xd2, 0x99, 0x46, 0x38, 0xab, 0x8c, 0x3d, 0xa5, 0xc9,
+ 0x88, 0xf8, 0xb3, 0x9a, 0x08, 0x27, 0x14, 0xad, 0x15, 0x0c, 0x42, 0x27,
+ 0x30, 0x33, 0xa6, 0xc4, 0x38, 0xb2, 0x6e, 0x4a, 0x99, 0x7a, 0x56, 0x66,
+ 0xc6, 0xe0, 0xce, 0x26, 0xcb, 0x46, 0xd9, 0x1a, 0x1c, 0x44, 0x18, 0x33,
+ 0xdd, 0x6d, 0xa2, 0x7a, 0xa0, 0x21, 0xaa, 0xd0, 0xc4, 0x8a, 0xaf, 0x07,
+ 0x89, 0x8d, 0xa9, 0xf0, 0x49, 0x07, 0xc8, 0x91, 0xa1, 0x2f, 0x72, 0xa5,
+ 0xed, 0x6c, 0xc5, 0x8d, 0x13, 0xda, 0xc9, 0x88, 0xb1, 0x00, 0xf2, 0x88,
+ 0xa7, 0x14, 0x08, 0xb2, 0xdf, 0x99, 0x13, 0x37, 0x4c, 0x8e, 0xa4, 0xe0,
+ 0x0d, 0xcb, 0x36, 0x3f, 0x08, 0x1e, 0x6a, 0xac, 0x39, 0x21, 0xe2, 0x3c,
+ 0x2e, 0x0d, 0x3c, 0x24, 0xb0, 0xb5, 0xae, 0x90, 0xe7, 0xd2, 0x56, 0xf3,
+ 0x10, 0x4d, 0x9a, 0x48, 0x2e, 0xf0, 0x6e, 0x61, 0xfa, 0xd3, 0x30, 0xbd,
+ 0x22, 0x0e, 0xfc, 0x82, 0xf0, 0x29, 0x28, 0x1b, 0x9c, 0xfe, 0xb5, 0xb5,
+ 0x33, 0xda, 0x5e, 0x0b, 0x27, 0x4f, 0x47, 0x5d, 0xca, 0xea, 0x25, 0xc4,
+ 0x46, 0xd2, 0xae, 0x29, 0xcb, 0x07, 0xe7, 0xc7, 0x42, 0xca, 0x68, 0xa0,
+ 0x0b, 0x33, 0x7e, 0x74, 0x2a, 0xc3, 0xd3, 0x20, 0x1f, 0x84, 0xb2, 0x78,
+ 0x2b, 0x15, 0x7b, 0x46, 0xea, 0x15, 0x25, 0x8a, 0xf2, 0x0d, 0xc3, 0xcd,
+ 0x66, 0x2d, 0xd0, 0xbd, 0xb5, 0x38, 0x99, 0x0b, 0x40, 0x5f, 0x66, 0x5d,
+ 0x6a, 0xaf, 0xa8, 0x38, 0xf2, 0x35, 0x38, 0x9b, 0xfd, 0x0a, 0x9b, 0xd2,
+ 0x72, 0x81, 0x97, 0x15, 0xcb, 0x52, 0x30, 0x02, 0x8a, 0x53, 0xb7, 0x2d,
+ 0x34, 0xd8, 0xe1, 0x43, 0x1a, 0x86, 0xf4, 0xce, 0x97, 0x5c, 0xad, 0x1e,
+ 0xd8, 0xf6, 0x6f, 0xd2, 0xbb, 0x7c, 0xbe, 0x9c, 0x73, 0xe5, 0x3c, 0xab,
+ 0xb2, 0xf2, 0xa4, 0x5e, 0x7d, 0xe4, 0xb2, 0xe1, 0x64, 0x15, 0xda, 0xd4,
+ 0xf5, 0xda, 0x33, 0xf1, 0x23, 0xd7, 0x88, 0xb9, 0x76, 0xd5, 0x32, 0x95,
+ 0x82, 0xc1, 0x79, 0xde, 0xd4, 0x1d, 0xd7, 0x80, 0xb9, 0xfe, 0x53, 0x4a,
+ 0x3d, 0x20, 0xa8, 0xb5, 0x5c, 0x13, 0x41, 0x63, 0x02, 0x9b, 0xa1, 0x9c,
+ 0xbc, 0xe0, 0x96, 0xa6, 0xaf, 0x66, 0x55, 0x5e, 0x4e, 0xed, 0xb1, 0x21,
+ 0x2d, 0x31, 0x2f, 0x96, 0x86, 0xd0, 0xec, 0x59, 0x6e, 0xf4, 0x37, 0x81,
+ 0xbb, 0x10, 0xd9, 0xf5, 0x63, 0xd4, 0x4c, 0x68, 0x2a, 0xea, 0xf3, 0xd1,
+ 0xde, 0x2e, 0xe1, 0xd6, 0xf8, 0x06, 0xbe, 0x20, 0x5e, 0x91, 0x79, 0x99,
+ 0xcf, 0x6d, 0xbd, 0xe9, 0xe8, 0x9f, 0xe6, 0xc5, 0xa1, 0x4a, 0xdb, 0xe1,
+ 0x3c, 0xbd, 0xc3, 0xf6, 0x45, 0xb7, 0xb5, 0x4c, 0x5e, 0x7e, 0x7b, 0x3a,
+ 0x3e, 0xdf, 0xd9, 0x3f, 0x3b, 0x7d, 0x67, 0xfe, 0xa4, 0xbf, 0xef, 0xe2,
+ 0xef, 0xbb, 0x81, 0xdd, 0x08, 0xd4, 0xb3, 0x34, 0xb1, 0x35, 0x3b, 0xae,
+ 0x38, 0x4c, 0xec, 0x17, 0x6f, 0x20, 0x52, 0x97, 0x49, 0x0a, 0xea, 0x66,
+ 0x45, 0x3c, 0xd5, 0xde, 0xa7, 0x34, 0xdd, 0x6e, 0x94, 0x84, 0x99, 0x83,
+ 0x79, 0xa3, 0xca, 0x92, 0x54, 0xc2, 0x6b, 0x95, 0x7d, 0xd7, 0x26, 0xe7,
+ 0x3a, 0x66, 0xa9, 0xd2, 0x51, 0xf8, 0x5d, 0x64, 0x89, 0xb5, 0x7f, 0x35,
+ 0x99, 0x19, 0xed, 0x3d, 0xa3, 0x94, 0x92, 0x69, 0xc6, 0xf1, 0x16, 0xfa,
+ 0x49, 0xcc, 0xf4, 0x90, 0x22, 0xa0, 0x8a, 0x31, 0x95, 0x3a, 0x33, 0x03,
+ 0x57, 0x6a, 0x90, 0xc7, 0xcc, 0x27, 0x05, 0xae, 0x8d, 0x14, 0xb7, 0x04,
+ 0xb5, 0x02, 0xc8, 0x81, 0xf5, 0x7d, 0x5a, 0xc7, 0x0d, 0x17, 0xdb, 0xbf,
+ 0x3d, 0x3d, 0x4f, 0xd2, 0xcb, 0x4b, 0xae, 0xfa, 0xcc, 0x18, 0x3d, 0x8e,
+ 0x74, 0xd2, 0x2d, 0xc6, 0xbe, 0xe1, 0xa3, 0x13, 0x49, 0xe2, 0x10, 0x8d,
+ 0xe3, 0xfc, 0x64, 0xbc, 0x45, 0x1e, 0x2d, 0x4e, 0x87, 0x1b, 0xbf, 0x3d,
+ 0x1e, 0xb4, 0x7c, 0xd7, 0x7e, 0x12, 0xcc, 0x26, 0x19, 0x37, 0x82, 0xfd,
+ 0xd8, 0xa5, 0xdd, 0x62, 0x61, 0x6f, 0x44, 0x8b, 0x0b, 0x36, 0x4a, 0xd6,
+ 0xb0, 0xa1, 0x6b, 0xac, 0x45, 0xae, 0x61, 0x5f, 0xd7, 0x12, 0x17, 0x43,
+ 0xc5, 0x7c, 0x09, 0xb5, 0xed, 0x3e, 0xac, 0x17, 0x85, 0xbb, 0x82, 0x00,
+ 0x52, 0x48, 0x0b, 0x5a, 0x23, 0xc3, 0x83, 0x16, 0x86, 0x45, 0xad, 0xc9,
+ 0xc0, 0xbb, 0x3c, 0x30, 0xc6, 0x35, 0x7f, 0xa7, 0x61, 0xc1, 0xb4, 0x17,
+ 0x59, 0xcc, 0x82, 0xc0, 0x77, 0xdc, 0xd0, 0x76, 0x6c, 0x33, 0x31, 0xba,
+ 0xdd, 0xd5, 0xa1, 0x2d, 0xcc, 0x61, 0xa4, 0x0b, 0xd9, 0x72, 0xf9, 0x15,
+ 0x25, 0x0d, 0x74, 0x2b, 0xc8, 0xdc, 0x44, 0x02, 0x4f, 0x95, 0x11, 0xd6,
+ 0xe6, 0xb7, 0x6b, 0x9e, 0xb7, 0xa0, 0x09, 0x52, 0xf5, 0x91, 0x40, 0x5a,
+ 0xa9, 0xc5, 0xa2, 0x13, 0x22, 0x50, 0x8c, 0x26, 0xa2, 0xa9, 0x43, 0xf4,
+ 0xce, 0x53, 0xba, 0x75, 0x6c, 0x38, 0x48, 0x2b, 0x80, 0xf4, 0x20, 0x01,
+ 0xa4, 0x4f, 0x10, 0xb2, 0xc4, 0xac, 0x44, 0x0c, 0xa9, 0x3b, 0x1c, 0xa3,
+ 0xcb, 0xa6, 0xe4, 0xc9, 0x9a, 0x20, 0xeb, 0x7e, 0x6d, 0x67, 0xf7, 0xf9,
+ 0x68, 0xdb, 0xfc, 0x9f, 0xd9, 0x17, 0xf1, 0x44, 0x00, 0xce, 0xd2, 0x81,
+ 0x16, 0xda, 0x27, 0xb3, 0xbb, 0x2e, 0x4b, 0xf2, 0x05, 0x54, 0x56, 0x57,
+ 0x6b, 0xa3, 0x47, 0x5f, 0x2a, 0xb4, 0x91, 0xf6, 0x42, 0x49, 0xa7, 0xf2,
+ 0x13, 0x3d, 0xe3, 0xd5, 0x72, 0x16, 0x49, 0xf0, 0xf3, 0x7c, 0xca, 0xc6,
+ 0x0c, 0x2c, 0x67, 0x37, 0xac, 0x74, 0x0f, 0xbf, 0x25, 0xd9, 0xc4, 0xe5,
+ 0x7c, 0xa3, 0x56, 0x7a, 0xd4, 0x8b, 0x96, 0x8f, 0xf0, 0x50, 0xec, 0x32,
+ 0x08, 0xe6, 0xa1, 0x39, 0x0d, 0x2f, 0xcb, 0xcb, 0x4b, 0xa3, 0xad, 0x75,
+ 0x2f, 0xa0, 0x43, 0x79, 0x64, 0xeb, 0x1d, 0x20, 0x9a, 0xbd, 0xca, 0x9b,
+ 0x36, 0x62, 0x60, 0x92, 0x36, 0x6d, 0xa9, 0xc5, 0xc3, 0x8d, 0x62, 0xe5,
+ 0x06, 0xad, 0x27, 0x38, 0x34, 0xc1, 0xcc, 0x88, 0xda, 0xf8, 0x00, 0xef,
+ 0xc5, 0x2f, 0xc2, 0xed, 0x1e, 0x89, 0x8f, 0xf9, 0x62, 0x41, 0x26, 0x0c,
+ 0x40, 0x58, 0x2d, 0xc4, 0x14, 0x8d, 0x86, 0x90, 0x2e, 0x43, 0xcd, 0x49,
+ 0xd2, 0x60, 0xb9, 0xac, 0x26, 0x99, 0x56, 0x78, 0x5d, 0x64, 0x97, 0x61,
+ 0x44, 0x88, 0xa3, 0xf5, 0x3e, 0xb2, 0x8d, 0xa0, 0x71, 0x4c, 0x09, 0xc3,
+ 0xa6, 0x48, 0x59, 0xc6, 0xd0, 0xc5, 0xe2, 0x00, 0x1f, 0xa4, 0x06, 0x70,
+ 0x10, 0x39, 0xff, 0xae, 0x4c, 0xcb, 0x7a, 0xda, 0xc6, 0xc7, 0xff, 0xf3,
+ 0xc8, 0x41, 0x24, 0x5a, 0x0c, 0x42, 0xae, 0x7b, 0x89, 0x95, 0x11, 0x25,
+ 0x6b, 0xc3, 0xc3, 0x64, 0x88, 0x38, 0x94, 0x97, 0x74, 0x52, 0x76, 0xfc,
+ 0xac, 0x50, 0xf5, 0x49, 0x8f, 0x60, 0x84, 0xa2, 0x2d, 0x2a, 0xfb, 0x0f,
+ 0xaf, 0x06, 0x46, 0xd9, 0x16, 0x62, 0xeb, 0x2a, 0x71, 0x44, 0x1a, 0xa9,
+ 0xa0, 0xf3, 0x6b, 0x50, 0x58, 0x5b, 0xdc, 0xca, 0x0b, 0xd2, 0x19, 0xa1,
+ 0xc0, 0x04, 0xc5, 0x19, 0x5a, 0x0e, 0xcb, 0x70, 0x27, 0xcb, 0xe6, 0x9f,
+ 0x18, 0x48, 0x21, 0x30, 0x93, 0x21, 0xa0, 0x76, 0x3d, 0xa6, 0x9e, 0x30,
+ 0x53, 0x13, 0xda, 0xf8, 0xf0, 0x2f, 0xc6, 0x8c, 0x7e, 0xa9, 0xae, 0x88,
+ 0x1e, 0x60, 0x00, 0xeb, 0xb5, 0x28, 0x25, 0x68, 0x02, 0xde, 0xb0, 0x61,
+ 0x5b, 0xa5, 0x35, 0xc3, 0xea, 0x00, 0x0c, 0x5c, 0xa0, 0xcc, 0xbb, 0x67,
+ 0xfe, 0xb2, 0x11, 0x40, 0x16, 0x57, 0x05, 0xee, 0xaa, 0x28, 0x47, 0x14,
+ 0xb5, 0x9a, 0xf1, 0x28, 0x35, 0x86, 0x91, 0x51, 0x04, 0xec, 0x36, 0xb8,
+ 0x73, 0xf3, 0x62, 0xc8, 0xf5, 0xd5, 0xf2, 0x20, 0x42, 0x6b, 0x04, 0x2a,
+ 0x2b, 0xdc, 0xc8, 0xfb, 0xc3, 0x76, 0x76, 0x23, 0x59, 0x16, 0x53, 0x2e,
+ 0x55, 0xa4, 0x6f, 0x46, 0xf1, 0xfb, 0x24, 0xbd, 0xc4, 0xd8, 0x57, 0xf6,
+ 0xeb, 0xf0, 0x84, 0x7d, 0x34, 0xfa, 0x73, 0x31, 0xa0, 0x9f, 0xa3, 0x2a,
+ 0x55, 0xa9, 0x4f, 0x93, 0x6d, 0x32, 0x0e, 0x12, 0x45, 0x74, 0xd9, 0xee,
+ 0x73, 0x9e, 0xab, 0xe4, 0x6d, 0xd6, 0x48, 0x16, 0x09, 0xcf, 0x9d, 0x8f,
+ 0x9b, 0xd6, 0x79, 0x99, 0x49, 0x84, 0x20, 0x7e, 0xb0, 0x9b, 0x5b, 0x05,
+ 0xfb, 0x12, 0xd0, 0x65, 0x04, 0x4f, 0x72, 0x76, 0x0e, 0xcc, 0x39, 0x58,
+ 0x53, 0xcf, 0x2b, 0x4f, 0x3f, 0x2e, 0x11, 0x74, 0x42, 0xe4, 0xc9, 0x69,
+ 0xa6, 0x31, 0x9e, 0x14, 0xbc, 0x8b, 0x00, 0x63, 0x42, 0x4a, 0x9d, 0x08,
+ 0xfe, 0x0b, 0x89, 0x5b, 0xec, 0x31, 0xc6, 0x1a, 0x6c, 0x16, 0x4b, 0xa4,
+ 0xbe, 0xd0, 0xab, 0x2f, 0xa5, 0x7c, 0x9a, 0x6a, 0x6a, 0x2b, 0xbd, 0x65,
+ 0xa2, 0x46, 0x0a, 0x8b, 0x5d, 0x74, 0x9b, 0x82, 0xd5, 0xec, 0x27, 0x62,
+ 0x79, 0x39, 0x5e, 0x26, 0xe4, 0xf0, 0xc2, 0xb1, 0xb3, 0x83, 0xcf, 0x89,
+ 0x7a, 0x64, 0xe5, 0x21, 0xe2, 0x79, 0x73, 0xb1, 0xac, 0x37, 0x5e, 0xa1,
+ 0x29, 0x10, 0x69, 0x2c, 0x51, 0x98, 0x84, 0xb7, 0xd7, 0xe5, 0x8c, 0xcd,
+ 0xe2, 0xae, 0x85, 0x68, 0x2b, 0x7f, 0x8d, 0x6a, 0x45, 0xe3, 0x50, 0x86,
+ 0x2f, 0xfc, 0xc9, 0xc4, 0x71, 0x9d, 0xe8, 0x88, 0x51, 0xf0, 0xb2, 0x94,
+ 0x6a, 0x8f, 0xb4, 0x68, 0xfa, 0x66, 0x10, 0x24, 0xb4, 0x9b, 0x73, 0x7e,
+ 0x51, 0xd6, 0xc2, 0x2f, 0x54, 0x60, 0x6b, 0x58, 0x2c, 0xad, 0x20, 0x96,
+ 0x05, 0x20, 0x4b, 0x21, 0xce, 0xad, 0x4e, 0xa6, 0xc5, 0x3e, 0x45, 0xe0,
+ 0x53, 0xbb, 0xc9, 0xa9, 0x2a, 0xdd, 0xb0, 0x89, 0x51, 0x00, 0xc8, 0x11,
+ 0x0b, 0xde, 0xc1, 0xa0, 0x0c, 0x80, 0x75, 0x9d, 0x7b, 0xa5, 0xeb, 0xe6,
+ 0x14, 0x5e, 0xd3, 0x9d, 0x9e, 0x37, 0xcb, 0xb4, 0x59, 0x99, 0xba, 0xed,
+ 0x17, 0x34, 0xad, 0x14, 0x4f, 0x4e, 0x7d, 0xe9, 0x83, 0x6d, 0xe8, 0x89,
+ 0x2a, 0xfa, 0x1b, 0xf9, 0x92, 0xce, 0xd9, 0x7f, 0x3d, 0x20, 0x98, 0xce,
+ 0x52, 0x89, 0x98, 0xf9, 0x90, 0x50, 0x28, 0xce, 0x95, 0xfb, 0x44, 0x6b,
+ 0xe0, 0x78, 0x4c, 0xbd, 0xee, 0x8f, 0x63, 0x51, 0x7f, 0x44, 0xc0, 0xcc,
+ 0x7c, 0x66, 0xf7, 0x6e, 0x44, 0xaf, 0x7a, 0x56, 0x93, 0xbd, 0x3d, 0x34,
+ 0x5f, 0xfb, 0x89, 0x6e, 0x0a, 0xd3, 0xda, 0xd8, 0xa8, 0xe0, 0xfc, 0xcd,
+ 0xfd, 0xb5, 0x44, 0xb1, 0xdd, 0xf9, 0x52, 0xc7, 0xb8, 0x5a, 0xbe, 0x05,
+ 0x6d, 0xcb, 0xcf, 0x88, 0xe0, 0xf3, 0xdf, 0x1d, 0x8e, 0x3a, 0x8b, 0xec,
+ 0x7c, 0xf1, 0xfd, 0xc1, 0xc9, 0xfb, 0xa3, 0x9d, 0x3f, 0x26, 0xf4, 0xaf,
+ 0x5d, 0xfe, 0xd7, 0xee, 0x5a, 0x74, 0xbb, 0x8c, 0x94, 0x5a, 0xff, 0x62,
+ 0x3d, 0xa9, 0xef, 0xe7, 0x17, 0xe5, 0xcc, 0x6e, 0x97, 0xd0, 0x42, 0x43,
+ 0x65, 0x03, 0xb9, 0xc6, 0xb5, 0xd6, 0x48, 0x3c, 0xe1, 0x5d, 0x91, 0x5d,
+ 0x4b, 0x02, 0x8e, 0x8a, 0x1b, 0xc4, 0xe9, 0xfc, 0xaa, 0xe2, 0x06, 0x35,
+ 0xd7, 0x2a, 0xc5, 0x10, 0xaf, 0xf3, 0x14, 0xb8, 0xa0, 0x90, 0xb4, 0x76,
+ 0x07, 0xbb, 0xf6, 0xcf, 0xa4, 0x88, 0x0e, 0xbe, 0x5f, 0x5c, 0x53, 0x0a,
+ 0x5f, 0x60, 0xe4, 0x91, 0xc8, 0xe4, 0x9c, 0x61, 0x12, 0xa5, 0x71, 0x06,
+ 0xbf, 0x4d, 0xba, 0xbc, 0x21, 0x2c, 0xe1, 0x71, 0xdc, 0x0b, 0x0a, 0xc1,
+ 0x7a, 0x95, 0x59, 0xd9, 0x8b, 0x35, 0xe3, 0xdd, 0xee, 0x70, 0x17, 0xa2,
+ 0xbb, 0x68, 0x24, 0x09, 0x7b, 0x32, 0x3c, 0x41, 0x89, 0xb3, 0x26, 0x6c,
+ 0xb8, 0x63, 0x40, 0xcd, 0x2b, 0xca, 0x56, 0xc7, 0x88, 0xae, 0x8c, 0x52,
+ 0xe4, 0xc9, 0x56, 0xd0, 0x8f, 0xdd, 0xc9, 0x21, 0xf8, 0x0a, 0xe3, 0xc0,
+ 0x18, 0xda, 0xcc, 0xee, 0x01, 0xef, 0x19, 0xa4, 0x6a, 0x15, 0x46, 0x97,
+ 0xdc, 0x30, 0xe2, 0x7d, 0xd3, 0x8f, 0xc4, 0xea, 0xee, 0x61, 0x5b, 0xbc,
+ 0xd8, 0x71, 0xbd, 0x2a, 0x24, 0x60, 0x2b, 0x96, 0x25, 0xc9, 0xba, 0xf4,
+ 0xa6, 0x62, 0x43, 0xb1, 0xfe, 0xdd, 0x2b, 0xec, 0x4a, 0xe9, 0x9c, 0xb3,
+ 0x34, 0x70, 0xd9, 0xe2, 0xc0, 0x09, 0x32, 0x46, 0xb2, 0xe1, 0x78, 0xdf,
+ 0x7c, 0xfd, 0x7e, 0x96, 0x6d, 0xaa, 0x6d, 0x60, 0xaf, 0xbc, 0xad, 0x37,
+ 0xe5, 0xdf, 0xcc, 0xdc, 0x53, 0xbd, 0x37, 0x62, 0x17, 0xa7, 0x5c, 0x84,
+ 0xd1, 0x32, 0x5c, 0xbe, 0x2a, 0x9d, 0x94, 0xe1, 0xba, 0x71, 0x5f, 0x78,
+ 0xb4, 0x0c, 0x64, 0xf4, 0xbe, 0x30, 0xca, 0x19, 0x65, 0x6f, 0x07, 0xfc,
+ 0xd3, 0xba, 0x23, 0xfd, 0x5b, 0x51, 0x09, 0x62, 0xb8, 0xb9, 0x94, 0x9c,
+ 0x1d, 0xcb, 0x66, 0xb8, 0x7a, 0x22, 0x8a, 0x6c, 0xa0, 0x58, 0xf5, 0xdc,
+ 0x46, 0x47, 0x77, 0x59, 0x35, 0x21, 0xd4, 0x09, 0x73, 0x0b, 0x2d, 0x45,
+ 0xa6, 0x2a, 0x6a, 0x1d, 0xc2, 0x6e, 0x16, 0x3d, 0xc9, 0xf3, 0xe5, 0x14,
+ 0xce, 0xab, 0xd6, 0xcb, 0x67, 0x48, 0x88, 0x98, 0x18, 0xee, 0x18, 0x59,
+ 0x00, 0x41, 0xbd, 0x25, 0xdb, 0x32, 0x44, 0x8b, 0xce, 0x10, 0x35, 0x08,
+ 0x73, 0xf8, 0x98, 0xc2, 0xba, 0x4a, 0xd2, 0x27, 0xed, 0x9e, 0x0a, 0xcb,
+ 0x30, 0x9e, 0xa9, 0xcb, 0xa9, 0x27, 0x9e, 0x65, 0x78, 0xa8, 0xfe, 0x84,
+ 0x45, 0xbb, 0x37, 0x40, 0xf3, 0x40, 0x50, 0xa4, 0xb8, 0x57, 0x50, 0xa9,
+ 0x0d, 0x5c, 0x9d, 0xac, 0x21, 0x2a, 0xec, 0x20, 0x82, 0x90, 0x61, 0x6d,
+ 0xf2, 0xac, 0xbc, 0x45, 0xac, 0xa5, 0x8d, 0x52, 0xae, 0xd9, 0x10, 0x9c,
+ 0x65, 0xc7, 0xc2, 0x79, 0x48, 0x1a, 0x13, 0x7f, 0x57, 0x0f, 0x5c, 0x94,
+ 0x03, 0x54, 0xfa, 0x74, 0xca, 0x92, 0x52, 0x97, 0x28, 0xd1, 0xb0, 0x43,
+ 0x99, 0x75, 0x0c, 0xa9, 0x3b, 0xa8, 0x43, 0xc8, 0x24, 0x96, 0x92, 0xb4,
+ 0xe2, 0x8b, 0xb2, 0xb9, 0xf6, 0x32, 0x53, 0x09, 0xd9, 0x8f, 0x9c, 0x3d,
+ 0x97, 0xcb, 0x06, 0x96, 0x80, 0x9a, 0x83, 0x8d, 0xe4, 0x1e, 0x8b, 0xc7,
+ 0x28, 0x48, 0x6e, 0xf8, 0x08, 0x04, 0xb8, 0xb2, 0x71, 0x18, 0xfb, 0x94,
+ 0x50, 0x5b, 0x70, 0xf6, 0xf8, 0x39, 0xac, 0x60, 0x4d, 0x1b, 0xa1, 0xec,
+ 0xa5, 0xba, 0x26, 0x40, 0x39, 0x24, 0xa9, 0x1a, 0xc2, 0x06, 0x08, 0x14,
+ 0x40, 0x26, 0xa0, 0x24, 0x1c, 0xb7, 0x9f, 0x1b, 0x8c, 0x85, 0xe3, 0x8c,
+ 0x47, 0xc6, 0xc9, 0x20, 0xdb, 0xfd, 0x42, 0xf6, 0xa6, 0xde, 0x94, 0x3c,
+ 0xd0, 0x88, 0x67, 0xc4, 0xaa, 0xb1, 0x3d, 0x07, 0xf6, 0x1f, 0xb6, 0x6c,
+ 0x02, 0x4b, 0xcf, 0xb0, 0x39, 0x30, 0xfe, 0xd1, 0x25, 0xc1, 0xa6, 0xca,
+ 0x83, 0xdc, 0xa1, 0xe0, 0x4a, 0x5d, 0x98, 0x2d, 0x16, 0xce, 0x5d, 0x2e,
+ 0xa6, 0x0c, 0xb8, 0x6a, 0x75, 0x7d, 0xe8, 0x4b, 0x1e, 0x1a, 0x66, 0x5d,
+ 0xca, 0x61, 0xc4, 0x07, 0x5a, 0x42, 0x26, 0x02, 0x98, 0xd3, 0x3d, 0xff,
+ 0x7e, 0x94, 0xa5, 0xa5, 0x4a, 0x8b, 0x6a, 0xed, 0xcb, 0x06, 0xf3, 0x22,
+ 0x6e, 0xe0, 0xa1, 0xe1, 0xfd, 0x3a, 0x16, 0x8f, 0xd4, 0x4b, 0xdc, 0x48,
+ 0xf8, 0xbf, 0x2c, 0x8b, 0x49, 0x1b, 0x6e, 0x64, 0x58, 0x0e, 0x3c, 0x50,
+ 0x4e, 0x09, 0xc0, 0xda, 0x6b, 0xa2, 0xcb, 0xf4, 0xf8, 0x90, 0x45, 0x67,
+ 0xa3, 0x12, 0xd1, 0x14, 0x98, 0xde, 0xe4, 0xdd, 0x71, 0x25, 0xb5, 0xd7,
+ 0xb9, 0xd9, 0xa3, 0x6a, 0x72, 0x0d, 0x68, 0x01, 0xf2, 0x26, 0x65, 0x53,
+ 0xbe, 0xdb, 0x03, 0x6d, 0x98, 0x5d, 0x35, 0x18, 0x55, 0xf4, 0xb1, 0x9c,
+ 0xa4, 0x11, 0xc1, 0x87, 0x94, 0x85, 0x4a, 0xe8, 0x60, 0x9a, 0x3a, 0xcf,
+ 0x30, 0xdd, 0xeb, 0x1a, 0xe2, 0x2f, 0x9b, 0xd5, 0x99, 0x97, 0xee, 0x6f,
+ 0xdf, 0x73, 0x57, 0x26, 0x4c, 0xf1, 0x02, 0xbe, 0x59, 0x88, 0xb2, 0xd8,
+ 0x09, 0xc7, 0x54, 0x08, 0x59, 0x88, 0x67, 0x43, 0x96, 0x25, 0xf1, 0xc9,
+ 0xbd, 0x62, 0xce, 0xc8, 0xeb, 0x5d, 0xdc, 0x99, 0x2e, 0x23, 0x1f, 0x8a,
+ 0x99, 0x80, 0xe1, 0x48, 0x48, 0xcf, 0xcd, 0x7d, 0xc7, 0x0b, 0x9b, 0x93,
+ 0x2b, 0x77, 0xfb, 0xf9, 0xd3, 0x6d, 0x3a, 0xe2, 0x04, 0xb6, 0xc7, 0x17,
+ 0x1f, 0xcf, 0x53, 0xa2, 0x63, 0x81, 0x83, 0xa7, 0xd4, 0x5d, 0x10, 0x70,
+ 0x1c, 0x25, 0x7b, 0xae, 0x2d, 0x66, 0x98, 0xed, 0xc8, 0x37, 0x42, 0xb5,
+ 0xd9, 0xe8, 0xc7, 0x46, 0x01, 0x35, 0x43, 0x86, 0xcb, 0x26, 0x48, 0xf9,
+ 0xf5, 0x58, 0xa7, 0xcd, 0x51, 0xb3, 0x4b, 0x46, 0x00, 0x02, 0x76, 0xf4,
+ 0x26, 0xfc, 0x54, 0x37, 0x54, 0x25, 0x94, 0x9c, 0xbc, 0x66, 0x0f, 0xfa,
+ 0xe1, 0x3b, 0xfa, 0x1b, 0xc9, 0x05, 0xf6, 0xd0, 0x8c, 0x70, 0xc8, 0xa8,
+ 0xdf, 0x19, 0x24, 0xf4, 0x9b, 0xef, 0xbb, 0x45, 0x9e, 0x1b, 0xa7, 0xe3,
+ 0xad, 0xbd, 0x17, 0xdb, 0x9b, 0x91, 0xa4, 0x68, 0x82, 0xa7, 0x4e, 0x3d,
+ 0x57, 0xda, 0xb6, 0x1f, 0xc8, 0xe5, 0xd9, 0x10, 0x49, 0x56, 0xc0, 0xb3,
+ 0x68, 0x47, 0x19, 0x39, 0xb7, 0x4c, 0x03, 0xaf, 0x1c, 0x4c, 0x12, 0xb3,
+ 0xfd, 0x52, 0xd5, 0x77, 0xd9, 0x8d, 0xe1, 0xdb, 0x28, 0xfa, 0xc3, 0x49,
+ 0x8e, 0xf2, 0xa5, 0x94, 0x61, 0xa5, 0xf4, 0xa2, 0xa2, 0x6a, 0xf0, 0x76,
+ 0xca, 0x31, 0x1e, 0x49, 0x01, 0xc3, 0x08, 0x16, 0x08, 0x23, 0x38, 0xb5,
+ 0x99, 0x54, 0x85, 0xe4, 0x3f, 0xe4, 0x02, 0x7c, 0x72, 0x07, 0x8e, 0xe7,
+ 0x90, 0xdc, 0x79, 0x31, 0x7a, 0xde, 0xda, 0xd3, 0x65, 0x45, 0xcd, 0x3f,
+ 0x5e, 0xda, 0x6c, 0x43, 0xa4, 0x8e, 0x3e, 0x06, 0xed, 0x46, 0x1d, 0xbe,
+ 0x2e, 0x16, 0xc1, 0x43, 0x11, 0x1b, 0xe0, 0xae, 0x17, 0x78, 0x6b, 0x4a,
+ 0x52, 0x0d, 0xca, 0x1e, 0x38, 0x3d, 0xdd, 0x85, 0x1a, 0x10, 0x79, 0x4f,
+ 0x27, 0xa4, 0x98, 0xe3, 0xfe, 0x28, 0xd1, 0x5d, 0xed, 0xf3, 0x27, 0xbb,
+ 0xbb, 0x83, 0xe4, 0xe9, 0x68, 0x87, 0x70, 0xf4, 0x55, 0x33, 0x4e, 0x67,
+ 0x01, 0x3a, 0x90, 0xe4, 0x49, 0xaa, 0x7b, 0xb7, 0xaf, 0x06, 0x5f, 0xca,
+ 0xee, 0xb5, 0xb8, 0x84, 0x8c, 0xa9, 0x58, 0x39, 0xf0, 0xda, 0x8f, 0xbb,
+ 0x4f, 0x9f, 0xee, 0xbc, 0xd8, 0x3f, 0x1b, 0x3e, 0xdd, 0xdd, 0xa1, 0x0a,
+ 0x7c, 0x01, 0xca, 0xb6, 0x29, 0x53, 0xad, 0xa2, 0xac, 0x7c, 0xca, 0xb0,
+ 0x46, 0xb3, 0x99, 0x56, 0x3b, 0x74, 0x87, 0x33, 0xe6, 0x7d, 0x51, 0xd7,
+ 0xc6, 0x28, 0xfe, 0xc0, 0xa5, 0x78, 0x5b, 0xf5, 0x07, 0xbe, 0x9f, 0xd7,
+ 0xa4, 0x68, 0x3e, 0x8f, 0x38, 0x9a, 0xed, 0xce, 0x20, 0xca, 0x48, 0xea,
+ 0x82, 0x16, 0xfb, 0x68, 0xe3, 0x3c, 0xdd, 0x87, 0x78, 0x15, 0x7c, 0x34,
+ 0x97, 0x4d, 0x0d, 0x02, 0x16, 0xd5, 0x1b, 0x47, 0x87, 0x9b, 0xbc, 0x69,
+ 0xba, 0x97, 0xae, 0x08, 0x8e, 0x67, 0x3a, 0xe0, 0x52, 0x86, 0xb0, 0x66,
+ 0xde, 0x68, 0x0d, 0xa8, 0x28, 0x49, 0x51, 0x3b, 0xa1, 0xcb, 0x62, 0xed,
+ 0x46, 0x01, 0x9a, 0xda, 0xad, 0x29, 0x7a, 0x39, 0xdb, 0x21, 0x88, 0x78,
+ 0x75, 0x74, 0xb2, 0x76, 0x4e, 0x63, 0x96, 0x9a, 0x16, 0xfa, 0x68, 0x19,
+ 0x7a, 0x4e, 0x40, 0xda, 0x4e, 0x1d, 0xfd, 0xaa, 0x03, 0xf0, 0xbc, 0x03,
+ 0xb7, 0x49, 0x16, 0xf4, 0x30, 0xad, 0x27, 0x79, 0xce, 0x4e, 0x82, 0x1e,
+ 0xdf, 0x80, 0xa6, 0x15, 0x03, 0x9b, 0x11, 0x08, 0xcd, 0x79, 0xca, 0xf9,
+ 0x0f, 0x0e, 0xfd, 0x37, 0x18, 0x96, 0x2c, 0x40, 0x23, 0x64, 0x57, 0x8d,
+ 0x2b, 0xa0, 0x7d, 0xd4, 0x59, 0xa2, 0x66, 0x6b, 0xde, 0x5a, 0x6d, 0x75,
+ 0xd7, 0x28, 0x31, 0x77, 0x0b, 0x83, 0x01, 0x46, 0x40, 0x3c, 0xa5, 0x2d,
+ 0x0c, 0x14, 0xbb, 0xba, 0x24, 0x41, 0x11, 0xa3, 0x3d, 0xdc, 0x7e, 0x40,
+ 0x7c, 0xb6, 0x4e, 0x09, 0x7b, 0x99, 0x4a, 0x1a, 0xdd, 0x57, 0x03, 0xad,
+ 0x7c, 0x6f, 0xda, 0x8e, 0x85, 0x34, 0x62, 0x58, 0x71, 0x47, 0xad, 0x04,
+ 0x99, 0x27, 0xd2, 0xd0, 0xa1, 0xe4, 0xee, 0x7a, 0x80, 0xe3, 0xb7, 0x99,
+ 0x55, 0xd2, 0x59, 0x8e, 0x60, 0x81, 0x2d, 0xb5, 0x22, 0xd8, 0x6d, 0x03,
+ 0xb3, 0x3e, 0x00, 0xe2, 0x42, 0x84, 0x16, 0xd9, 0x2d, 0x69, 0x37, 0xb5,
+ 0x68, 0xe6, 0x55, 0x95, 0x93, 0x37, 0xd6, 0xcc, 0xcc, 0xe8, 0xbc, 0x85,
+ 0x38, 0x52, 0xc9, 0x77, 0x00, 0xbe, 0x9b, 0x46, 0xa0, 0x13, 0x26, 0xb8,
+ 0x9d, 0x6a, 0x5b, 0x17, 0x51, 0x00, 0xd6, 0x95, 0xb0, 0x1b, 0x03, 0xda,
+ 0xa0, 0x29, 0x18, 0x26, 0xa7, 0x48, 0xce, 0x4d, 0x3b, 0x6b, 0x8a, 0xac,
+ 0x60, 0x2e, 0xe8, 0x62, 0xf0, 0xc0, 0xb2, 0xe5, 0xb4, 0xa9, 0xfb, 0x63,
+ 0x90, 0x5b, 0x77, 0xc3, 0xdb, 0xdb, 0xdb, 0x21, 0xdd, 0x38, 0x94, 0xce,
+ 0x26, 0x75, 0x4c, 0x9d, 0x4a, 0x25, 0xe7, 0xca, 0xe1, 0x9c, 0xba, 0xc0,
+ 0x24, 0x73, 0x69, 0x85, 0xd5, 0x45, 0xde, 0xa0, 0x68, 0x56, 0x98, 0x0b,
+ 0xaf, 0xc9, 0xa9, 0x95, 0xe9, 0xc0, 0x62, 0x50, 0xef, 0x6e, 0xe4, 0xfa,
+ 0x71, 0x6b, 0x21, 0x74, 0xb7, 0x49, 0x93, 0x11, 0x3c, 0x04, 0x35, 0xd8,
+ 0xd8, 0x4f, 0x86, 0xdf, 0x26, 0x6b, 0x87, 0xb2, 0xda, 0x73, 0xf3, 0xc4,
+ 0x7e, 0x7b, 0x2d, 0xfc, 0x70, 0xb4, 0x39, 0xc7, 0xda, 0xe3, 0x5c, 0x7d,
+ 0xbd, 0x37, 0x19, 0x1a, 0x2b, 0xba, 0x64, 0xb3, 0x26, 0xe2, 0x01, 0xa7,
+ 0xe4, 0x4d, 0x76, 0x17, 0x33, 0xa4, 0x20, 0x96, 0x9e, 0xd6, 0xd2, 0xa0,
+ 0xf3, 0x82, 0x4f, 0xf8, 0x8a, 0xe3, 0x58, 0xa5, 0xb7, 0x0f, 0x9f, 0x71,
+ 0xef, 0x24, 0x0a, 0xf7, 0xce, 0xe0, 0x3f, 0xf6, 0x40, 0xbe, 0xe1, 0x38,
+ 0xd5, 0xdc, 0xe5, 0x58, 0x83, 0x09, 0x6e, 0x7e, 0xe7, 0x8a, 0x15, 0xd9,
+ 0xd5, 0x23, 0x86, 0xde, 0x57, 0x2b, 0x2a, 0x3d, 0x5d, 0xa4, 0xc5, 0xad,
+ 0xa2, 0x15, 0x4e, 0x8c, 0x09, 0x2f, 0xcb, 0x55, 0x8f, 0x10, 0x34, 0x6e,
+ 0x75, 0x03, 0x2f, 0xed, 0x91, 0x37, 0x00, 0xde, 0x72, 0x6f, 0x99, 0x02,
+ 0x29, 0x1d, 0xbb, 0x49, 0x18, 0x53, 0x9b, 0x8e, 0xaa, 0xe2, 0xff, 0x89,
+ 0x1f, 0x38, 0xab, 0x88, 0xd1, 0x51, 0x6a, 0xc2, 0x25, 0x7b, 0x31, 0x50,
+ 0xd8, 0x73, 0xe8, 0x45, 0x87, 0xdf, 0x1c, 0xa3, 0x64, 0xc2, 0x08, 0xd2,
+ 0x42, 0x30, 0x52, 0x78, 0xfe, 0xdc, 0x09, 0xd5, 0x3a, 0x89, 0xae, 0x72,
+ 0xeb, 0x41, 0x4b, 0x93, 0x18, 0xb0, 0xb0, 0xda, 0xf0, 0x89, 0xda, 0xea,
+ 0x92, 0xeb, 0x2d, 0x46, 0xb7, 0x1c, 0x5e, 0xab, 0xa7, 0xa4, 0xae, 0x0e,
+ 0x27, 0x4a, 0x2f, 0x7c, 0x5d, 0x35, 0x89, 0xb4, 0x96, 0xa4, 0x08, 0xdc,
+ 0xb6, 0x41, 0x8d, 0x86, 0xe3, 0x57, 0xee, 0x2c, 0x9b, 0x85, 0xe9, 0xa2,
+ 0xf2, 0xf9, 0x78, 0x17, 0x68, 0xec, 0x49, 0xc7, 0x3d, 0x69, 0x49, 0x97,
+ 0xf9, 0x1e, 0x38, 0x2e, 0x75, 0x24, 0x07, 0x75, 0x2c, 0x1c, 0x62, 0xf3,
+ 0x89, 0x8d, 0x30, 0xfe, 0x77, 0xcd, 0xe7, 0x36, 0x22, 0x13, 0x9a, 0xb7,
+ 0x16, 0x24, 0xfb, 0xa3, 0x29, 0x52, 0xa6, 0xa4, 0x92, 0xc7, 0x87, 0x23,
+ 0x7f, 0xca, 0x17, 0x64, 0x2f, 0x7c, 0x25, 0xce, 0x5f, 0xaa, 0x36, 0xf1,
+ 0x23, 0xc3, 0x52, 0xb7, 0xcf, 0x0a, 0x08, 0x3b, 0x31, 0x40, 0x86, 0xf8,
+ 0x70, 0x9c, 0x38, 0xe0, 0x51, 0x8f, 0x39, 0x8e, 0x9a, 0x39, 0xd4, 0xdc,
+ 0x5d, 0xf8, 0x5f, 0xba, 0xc4, 0xfb, 0xe2, 0x61, 0xea, 0xfd, 0x52, 0xf2,
+ 0xad, 0xa6, 0x1e, 0x77, 0x44, 0xd1, 0x1c, 0xf3, 0x2f, 0x3c, 0xa7, 0x37,
+ 0x12, 0xa8, 0xd8, 0x99, 0x61, 0x9d, 0xdf, 0x6d, 0x29, 0xe3, 0x39, 0x6d,
+ 0xbe, 0xf8, 0xad, 0x76, 0x1d, 0xcc, 0x88, 0x94, 0x15, 0x9a, 0x7c, 0x7c,
+ 0x38, 0x0e, 0xe1, 0x60, 0xef, 0x7d, 0x40, 0x09, 0x31, 0x6a, 0x31, 0x82,
+ 0x80, 0x82, 0x4f, 0x1a, 0x66, 0xe6, 0x0b, 0xf8, 0x97, 0x87, 0xf1, 0xe1,
+ 0xb4, 0xd2, 0x56, 0x0c, 0xdb, 0x60, 0x7d, 0x5f, 0xe9, 0xc5, 0xff, 0xf8,
+ 0xc5, 0x21, 0x5b, 0xcf, 0xb5, 0x15, 0xf7, 0x13, 0x16, 0xd8, 0x37, 0xb8,
+ 0x11, 0x3a, 0xe3, 0xf5, 0xf8, 0x08, 0xca, 0x2a, 0xf7, 0x8e, 0x55, 0x95,
+ 0x60, 0x73, 0xd0, 0x26, 0x18, 0x21, 0x49, 0xe2, 0x32, 0xd0, 0x5d, 0xce,
+ 0x7b, 0xf7, 0x58, 0xf7, 0x8e, 0x7a, 0x9d, 0x44, 0xf7, 0xee, 0xff, 0xa6,
+ 0xf5, 0x81, 0x9f, 0x1d, 0x1b, 0x50, 0xd8, 0xae, 0x16, 0x54, 0x69, 0x2a,
+ 0x55, 0x49, 0x50, 0xe4, 0x43, 0x57, 0x7c, 0xcf, 0xec, 0x80, 0xef, 0x41,
+ 0x4a, 0x11, 0x25, 0x31, 0xcc, 0x04, 0x8b, 0x97, 0x4b, 0x7f, 0xbe, 0x70,
+ 0xca, 0xcc, 0x90, 0x16, 0x39, 0xb4, 0x65, 0x66, 0xc4, 0x84, 0x2b, 0x38,
+ 0xd5, 0x72, 0x66, 0x9c, 0x29, 0x03, 0xf6, 0xeb, 0xbf, 0x1a, 0x15, 0xbe,
+ 0x58, 0xee, 0xf6, 0xd6, 0x4d, 0xb9, 0xf3, 0x79, 0xeb, 0xa6, 0x74, 0xef,
+ 0xf4, 0xdf, 0x91, 0xe8, 0xbe, 0xb6, 0x69, 0x3e, 0x44, 0x79, 0x9e, 0x6d,
+ 0x50, 0x1c, 0xbc, 0xc9, 0x70, 0x06, 0xd4, 0x22, 0x27, 0xc8, 0x1a, 0x8c,
+ 0x85, 0x30, 0x34, 0x6b, 0xcf, 0xf7, 0xda, 0x21, 0x16, 0x0d, 0xf7, 0x40,
+ 0x72, 0x51, 0x19, 0xb3, 0x0e, 0xea, 0xa8, 0xba, 0x68, 0x52, 0x2e, 0x8e,
+ 0xbf, 0x0e, 0x40, 0x07, 0x0c, 0x79, 0x67, 0x16, 0x66, 0xf9, 0xdb, 0xf3,
+ 0x37, 0x27, 0xdc, 0x30, 0x85, 0x8b, 0xdf, 0xa9, 0x8c, 0x50, 0xa6, 0xbb,
+ 0xbc, 0x98, 0xe7, 0x0d, 0x69, 0x27, 0x0d, 0x8b, 0x32, 0x95, 0x8e, 0x41,
+ 0x91, 0x3e, 0xe2, 0xe4, 0x62, 0x3e, 0x2e, 0x62, 0x41, 0x4f, 0x51, 0x24,
+ 0x3d, 0x98, 0x37, 0x4f, 0x03, 0xfe, 0xe5, 0xba, 0x6e, 0x72, 0xc8, 0x69,
+ 0x66, 0xd0, 0xa3, 0x5e, 0xd3, 0x56, 0xd0, 0x23, 0x11, 0x9b, 0xd7, 0xaa,
+ 0x69, 0x68, 0x3a, 0x0c, 0xc0, 0x76, 0x4b, 0x3b, 0xd2, 0xba, 0x6c, 0x4b,
+ 0x1f, 0x80, 0xd2, 0xa5, 0x6d, 0x4d, 0x2b, 0x28, 0x5c, 0xb7, 0x9a, 0x97,
+ 0x2d, 0xd6, 0x69, 0x29, 0x5f, 0xa4, 0x87, 0x90, 0x3e, 0x24, 0xc1, 0xd9,
+ 0x65, 0x45, 0xce, 0x71, 0xd6, 0xaa, 0x63, 0xa5, 0x2a, 0xa2, 0x90, 0x68,
+ 0x88, 0xcc, 0xe6, 0x0b, 0xb4, 0x4c, 0x3d, 0xed, 0x42, 0x42, 0x63, 0x7b,
+ 0x27, 0x38, 0xc2, 0x23, 0x0c, 0x00, 0x87, 0x22, 0x24, 0xec, 0xa6, 0xe1,
+ 0x33, 0x33, 0x3a, 0x3a, 0x00, 0xa7, 0x08, 0x35, 0x05, 0xea, 0x5d, 0x54,
+ 0xc1, 0x76, 0xed, 0x79, 0x6a, 0xd7, 0x94, 0x45, 0x1d, 0x46, 0x00, 0xc1,
+ 0x03, 0xf0, 0x1d, 0xba, 0xb2, 0x94, 0x6d, 0xff, 0x71, 0xe8, 0xcf, 0x17,
+ 0x7f, 0xf2, 0xc0, 0x0b, 0x59, 0xe7, 0xe4, 0xcf, 0xf5, 0xfb, 0xbc, 0x6a,
+ 0x37, 0x71, 0xca, 0x5a, 0xac, 0xae, 0xb8, 0xad, 0x02, 0x23, 0x2e, 0x47,
+ 0x5d, 0x0e, 0x69, 0xdb, 0x01, 0xf3, 0x3f, 0x86, 0x7c, 0xa3, 0x22, 0x39,
+ 0x76, 0xc9, 0xc1, 0x2f, 0xfc, 0x62, 0x7d, 0x38, 0x65, 0xb1, 0x32, 0x4d,
+ 0x0b, 0x43, 0x09, 0x73, 0x62, 0xc3, 0xa4, 0xb3, 0xd9, 0xec, 0x8b, 0x59,
+ 0xb9, 0xac, 0xef, 0xd7, 0x13, 0x69, 0x90, 0x25, 0x3d, 0x65, 0x80, 0x04,
+ 0xc1, 0xa6, 0x27, 0x55, 0x26, 0x2c, 0x8b, 0x8f, 0x7a, 0x29, 0x52, 0x79,
+ 0x4f, 0xcd, 0x81, 0x8f, 0xce, 0x70, 0xeb, 0xde, 0xc7, 0xfe, 0x87, 0x3f,
+ 0x76, 0x94, 0xca, 0x88, 0xa5, 0x49, 0xab, 0xa4, 0x47, 0x59, 0xce, 0x2e,
+ 0xc4, 0x19, 0x33, 0x9b, 0x93, 0x56, 0xf8, 0xdb, 0x0e, 0x48, 0x97, 0x07,
+ 0xa3, 0x5c, 0x2b, 0xda, 0xbd, 0x4b, 0x88, 0x82, 0xa4, 0xe9, 0xa9, 0xd9,
+ 0x12, 0xd3, 0x11, 0x77, 0x8f, 0xc4, 0x68, 0x93, 0xe4, 0x4c, 0x7a, 0x55,
+ 0xba, 0x6b, 0x29, 0x6d, 0x21, 0x04, 0x5f, 0x96, 0xe5, 0x45, 0x5a, 0xad,
+ 0x07, 0xa9, 0xbd, 0x34, 0x6d, 0xb4, 0x23, 0x30, 0x73, 0x9f, 0xb2, 0x67,
+ 0x91, 0x42, 0x15, 0x4e, 0x80, 0x7e, 0xc5, 0x6f, 0x8e, 0x38, 0x8c, 0xe0,
+ 0x9b, 0xcc, 0xb1, 0xbc, 0x9a, 0xd9, 0xd4, 0x4d, 0x3d, 0x69, 0xcd, 0x03,
+ 0xe5, 0x1e, 0xb4, 0x4d, 0x03, 0x67, 0xdc, 0xab, 0x6d, 0x4f, 0x9c, 0x68,
+ 0xee, 0xc2, 0x61, 0xa4, 0x3a, 0xd7, 0x85, 0x57, 0x29, 0x5b, 0x95, 0xf2,
+ 0x10, 0x91, 0x03, 0xa7, 0xf6, 0x34, 0x47, 0x11, 0xad, 0x55, 0xed, 0x9d,
+ 0xf7, 0x30, 0x33, 0x2f, 0x26, 0x44, 0x9c, 0xd0, 0xf0, 0x8e, 0x20, 0x24,
+ 0x92, 0x64, 0x75, 0xc7, 0x4c, 0x36, 0x69, 0x90, 0xde, 0x12, 0x05, 0x83,
+ 0x88, 0x7d, 0xd6, 0xbd, 0xaf, 0xfa, 0xa3, 0x1f, 0x0e, 0x48, 0xda, 0xc9,
+ 0x4b, 0x7e, 0xfd, 0x18, 0x03, 0x5f, 0x83, 0x9c, 0x50, 0x0c, 0x87, 0xe7,
+ 0xf8, 0x09, 0xfb, 0xdb, 0x87, 0x11, 0x6e, 0x6b, 0x19, 0x8c, 0xd9, 0x2c,
+ 0xbb, 0xe2, 0xf5, 0xbd, 0x3c, 0x39, 0xfa, 0xfe, 0xe8, 0x24, 0xb8, 0x09,
+ 0xbf, 0x19, 0x8f, 0xb7, 0x3e, 0x66, 0xd5, 0x45, 0x56, 0x95, 0x84, 0x1c,
+ 0x3e, 0xa6, 0x5c, 0x51, 0x3c, 0x69, 0x93, 0x21, 0xbd, 0x0b, 0xe2, 0xd6,
+ 0xa1, 0x2d, 0xa5, 0x6c, 0x84, 0x85, 0x89, 0x55, 0xf2, 0x49, 0x69, 0x8a,
+ 0x80, 0xca, 0x3b, 0xc9, 0xb9, 0xc5, 0x75, 0x37, 0xa9, 0x32, 0x78, 0x50,
+ 0xd3, 0x08, 0xa6, 0x21, 0xe0, 0x70, 0xa8, 0x99, 0x29, 0xed, 0x29, 0x97,
+ 0x5b, 0x20, 0xc6, 0x6b, 0x17, 0x11, 0xbc, 0xb1, 0x00, 0xe4, 0x44, 0xf2,
+ 0x4a, 0xbe, 0x89, 0xba, 0x6c, 0xa2, 0x12, 0x63, 0x21, 0xb2, 0xd9, 0x71,
+ 0xfa, 0xdd, 0xf0, 0x60, 0x3c, 0x7c, 0x75, 0x74, 0x72, 0xf4, 0xcd, 0xc1,
+ 0xf9, 0x91, 0xd7, 0x01, 0x80, 0xca, 0xa6, 0xa2, 0x7a, 0x8b, 0xad, 0x65,
+ 0xfe, 0x4e, 0x08, 0xc3, 0x99, 0xf4, 0xd4, 0x3f, 0x22, 0x69, 0x72, 0xe9,
+ 0x5e, 0x64, 0xd1, 0x89, 0x53, 0xb2, 0x74, 0x1a, 0xe4, 0xd2, 0xc6, 0x87,
+ 0x33, 0x67, 0x61, 0x36, 0x97, 0xa9, 0x06, 0x2b, 0x48, 0x67, 0xb7, 0xd4,
+ 0xbf, 0xf0, 0x7d, 0x41, 0xf5, 0x26, 0xb9, 0x2d, 0xac, 0xe6, 0xd5, 0xfb,
+ 0x4e, 0x1e, 0x47, 0xd9, 0xd6, 0x06, 0xa3, 0x97, 0x43, 0xdc, 0x05, 0xa0,
+ 0xe8, 0x09, 0x50, 0x4f, 0x5e, 0xe1, 0xc1, 0x0e, 0x2e, 0xbf, 0xeb, 0x25,
+ 0x00, 0x34, 0x56, 0xf9, 0x5d, 0x04, 0xe5, 0x07, 0xb7, 0x2a, 0xf7, 0xd4,
+ 0x56, 0x59, 0x4b, 0x59, 0x3c, 0xdc, 0x5d, 0xf4, 0x3a, 0x73, 0x48, 0x5b,
+ 0x38, 0xf1, 0x17, 0x19, 0x4c, 0x64, 0x84, 0xad, 0xc3, 0xe6, 0xae, 0xc8,
+ 0x8d, 0xcb, 0xb9, 0x91, 0x24, 0x92, 0xdb, 0x50, 0x66, 0x3f, 0x92, 0x0a,
+ 0x3d, 0xce, 0xaf, 0x31, 0x3c, 0x63, 0xd3, 0x69, 0xac, 0xdc, 0x95, 0x26,
+ 0x9b, 0x5d, 0x2d, 0xc2, 0x42, 0xfe, 0xdb, 0xfe, 0x04, 0x25, 0xbc, 0x61,
+ 0xf8, 0x11, 0xf7, 0xf9, 0x11, 0x35, 0x9a, 0x66, 0xf8, 0x4b, 0xdc, 0x56,
+ 0x5d, 0xbf, 0x15, 0xb8, 0xca, 0x15, 0x16, 0xa3, 0x12, 0x2e, 0x56, 0xdd,
+ 0xb0, 0xc2, 0xcf, 0x63, 0x27, 0x3b, 0xb0, 0x7d, 0x08, 0xa6, 0xb2, 0x33,
+ 0x10, 0x16, 0xd2, 0xb2, 0x43, 0x8b, 0x49, 0xe2, 0x79, 0x50, 0x9e, 0xb4,
+ 0x68, 0x35, 0xf6, 0xa0, 0x8e, 0x0a, 0xfa, 0xd7, 0xb0, 0xf7, 0x8a, 0xad,
+ 0x38, 0x1d, 0x66, 0x8b, 0x00, 0xdd, 0x7e, 0xe3, 0xb5, 0xb6, 0xe1, 0x71,
+ 0xad, 0x30, 0xbd, 0x7e, 0x84, 0x5e, 0xf7, 0xb0, 0xa3, 0xb3, 0x77, 0xe7,
+ 0xf8, 0xc8, 0x09, 0xfd, 0x45, 0xe2, 0xd2, 0x75, 0x0c, 0x2f, 0x52, 0xfa,
+ 0xe4, 0x70, 0xab, 0x57, 0x0a, 0x23, 0xba, 0x66, 0xba, 0x92, 0xac, 0xcb,
+ 0x29, 0xda, 0xd2, 0x94, 0x40, 0x4e, 0x02, 0x68, 0x1b, 0xd4, 0xc7, 0x34,
+ 0x54, 0x43, 0x61, 0x13, 0x37, 0x69, 0x0e, 0x02, 0xe9, 0x85, 0x59, 0x70,
+ 0x9e, 0xb9, 0x06, 0xfc, 0x4e, 0xe9, 0x97, 0xe8, 0x85, 0xce, 0x9c, 0xd3,
+ 0x23, 0x74, 0x1d, 0x8a, 0x23, 0x0d, 0x49, 0x6f, 0x25, 0x55, 0x7e, 0x75,
+ 0x6d, 0x76, 0xc2, 0xcc, 0x63, 0xe4, 0xd6, 0xc9, 0x9f, 0x60, 0xf7, 0x33,
+ 0x30, 0x6a, 0xc3, 0xf0, 0x1e, 0x5a, 0xb8, 0xd9, 0x8a, 0x22, 0xad, 0xdd,
+ 0xe0, 0xdc, 0x74, 0xaf, 0xf1, 0x36, 0xe3, 0x78, 0x49, 0x46, 0x06, 0x15,
+ 0xd5, 0x50, 0x52, 0x47, 0xa0, 0xaf, 0x4b, 0xd1, 0xce, 0x40, 0xbb, 0x30,
+ 0xdd, 0x4b, 0x56, 0x09, 0xab, 0x77, 0x97, 0x12, 0xbc, 0x4f, 0x81, 0xbe,
+ 0x0c, 0x1b, 0xe5, 0x82, 0xf5, 0x11, 0x31, 0x36, 0x8a, 0xc8, 0x71, 0x33,
+ 0x84, 0xb7, 0x6d, 0x03, 0xb1, 0x50, 0xd9, 0xb6, 0x88, 0x4a, 0x4e, 0xbc,
+ 0xd1, 0x85, 0x81, 0x33, 0x66, 0x9b, 0x91, 0x5d, 0x39, 0x45, 0x29, 0x64,
+ 0x2a, 0x4c, 0x1c, 0xb4, 0xcf, 0x12, 0x7e, 0x2b, 0x63, 0x5c, 0xc5, 0x82,
+ 0xc5, 0x8b, 0x9d, 0xb4, 0x58, 0xb0, 0x2f, 0xcf, 0xd6, 0x7a, 0xd9, 0x51,
+ 0x82, 0xe6, 0x01, 0x50, 0x1f, 0x9f, 0xdd, 0x3c, 0x6b, 0xd7, 0xa8, 0xb1,
+ 0x76, 0x8a, 0x8b, 0xdd, 0x50, 0xb5, 0x5b, 0xe9, 0xc6, 0xa5, 0x49, 0xe6,
+ 0xdb, 0x98, 0x2e, 0x39, 0x75, 0x6c, 0xb6, 0x02, 0xf1, 0x4e, 0xf0, 0xfd,
+ 0x57, 0x98, 0x1c, 0xf4, 0x53, 0xbc, 0x81, 0xf3, 0x4e, 0x58, 0x5d, 0x57,
+ 0xda, 0x0a, 0x8d, 0x79, 0xf9, 0x22, 0x33, 0x5f, 0xcc, 0xa9, 0x4f, 0xe4,
+ 0x4a, 0xfc, 0xb1, 0xda, 0xf0, 0x1f, 0x95, 0xce, 0xb0, 0xd1, 0x45, 0x2f,
+ 0x22, 0xd6, 0xef, 0xf5, 0x57, 0xe5, 0xf2, 0x76, 0x44, 0x4f, 0x87, 0x67,
+ 0x03, 0x8d, 0xce, 0x73, 0xf5, 0x54, 0xd0, 0x94, 0xdb, 0x10, 0x90, 0xbb,
+ 0x1c, 0x49, 0xfb, 0x40, 0x3c, 0x9a, 0xd6, 0x37, 0xf1, 0x13, 0x5e, 0xdf,
+ 0x44, 0x4f, 0xb8, 0xfe, 0x07, 0x27, 0xdd, 0xa9, 0x9a, 0xbd, 0x67, 0x7d,
+ 0xfc, 0x7d, 0x0f, 0x72, 0x8a, 0x77, 0xc2, 0x75, 0x75, 0xe0, 0x76, 0xef,
+ 0x8c, 0xf3, 0x21, 0x97, 0x3d, 0x72, 0x0d, 0x92, 0xf9, 0x9c, 0x47, 0xbd,
+ 0xfd, 0xf6, 0xa0, 0xdb, 0x73, 0x6e, 0xbe, 0x2f, 0x87, 0xfb, 0xec, 0x60,
+ 0xfc, 0x7d, 0xe7, 0x58, 0x7b, 0x07, 0x39, 0x30, 0x46, 0xa4, 0xf8, 0x83,
+ 0x92, 0x1e, 0x98, 0x79, 0x68, 0xac, 0x28, 0xbf, 0xd7, 0x37, 0x8f, 0xe1,
+ 0x77, 0x33, 0x91, 0x80, 0xdf, 0x03, 0x1a, 0xaf, 0xe2, 0x77, 0x7f, 0xa3,
+ 0x3a, 0x58, 0x98, 0x3e, 0xc7, 0x17, 0xe0, 0x72, 0x54, 0x41, 0x45, 0x58,
+ 0x1d, 0x9c, 0x4e, 0x71, 0x41, 0xb0, 0x76, 0x98, 0x6d, 0x8b, 0x79, 0xfe,
+ 0x12, 0x46, 0xc7, 0x0b, 0x01, 0x9f, 0xeb, 0x8e, 0xfe, 0x62, 0x46, 0x97,
+ 0x03, 0x12, 0xf0, 0x39, 0x94, 0xeb, 0xb3, 0x81, 0xc7, 0xe0, 0x1e, 0xd7,
+ 0xfa, 0x68, 0x08, 0x11, 0x0a, 0xf1, 0x55, 0x9c, 0xd6, 0xde, 0xcd, 0xeb,
+ 0x62, 0xf3, 0x11, 0x8c, 0x9d, 0x81, 0x2d, 0x47, 0xaf, 0x26, 0xa1, 0x73,
+ 0xde, 0xc2, 0x1f, 0xf8, 0xf5, 0x41, 0xb0, 0x56, 0xa4, 0xa2, 0x60, 0x3a,
+ 0xc2, 0x75, 0x0d, 0x5b, 0xdf, 0xc7, 0xd5, 0xf0, 0x7b, 0xbd, 0xb6, 0xf1,
+ 0xd9, 0x74, 0x12, 0x31, 0x88, 0x86, 0x3a, 0xa3, 0x1c, 0x28, 0xc0, 0xf6,
+ 0x75, 0xcf, 0x29, 0x69, 0x78, 0x50, 0x05, 0x48, 0x47, 0x19, 0xe6, 0xc5,
+ 0x30, 0xac, 0x14, 0x68, 0x07, 0x8d, 0x9b, 0x0e, 0x98, 0x33, 0x4a, 0x79,
+ 0x49, 0xcb, 0x95, 0xb0, 0x45, 0x8a, 0xea, 0x6f, 0x71, 0xf1, 0xe3, 0xea,
+ 0x8d, 0xd4, 0x9c, 0x47, 0x11, 0x09, 0xdb, 0xbd, 0x91, 0x9a, 0xb2, 0xe5,
+ 0x5a, 0x7b, 0xd6, 0x81, 0xfc, 0x9e, 0x16, 0xf5, 0x10, 0xb6, 0xd3, 0x25,
+ 0x01, 0xd1, 0xbc, 0xb4, 0x7f, 0x0d, 0x4c, 0x8b, 0x57, 0x6f, 0xc7, 0x1d,
+ 0x95, 0xa2, 0xce, 0xb8, 0x82, 0xea, 0x0a, 0x72, 0xc3, 0xfc, 0xde, 0xba,
+ 0xd6, 0x10, 0xe7, 0xe0, 0xc6, 0xa1, 0x32, 0x64, 0xd8, 0x6a, 0xc2, 0x7c,
+ 0xa2, 0xa3, 0x17, 0x69, 0xa5, 0xfe, 0x12, 0xa6, 0x1c, 0xe2, 0xdc, 0xb4,
+ 0x06, 0x37, 0xbb, 0x0d, 0xd6, 0xd2, 0xc9, 0x8f, 0x14, 0x83, 0x05, 0xe3,
+ 0x0b, 0x82, 0xe6, 0xa9, 0x1d, 0xcc, 0x17, 0xdc, 0xbc, 0x40, 0xf0, 0xfa,
+ 0x14, 0x80, 0x29, 0x45, 0xe2, 0xa3, 0x0e, 0x1a, 0x0b, 0x4a, 0x6d, 0x08,
+ 0xcc, 0x98, 0x64, 0x54, 0x6e, 0x3e, 0x60, 0x37, 0x12, 0x09, 0x17, 0x37,
+ 0x4f, 0x86, 0xf4, 0x78, 0xa2, 0x76, 0x22, 0xff, 0xf0, 0x19, 0x7e, 0x38,
+ 0xea, 0x12, 0x3a, 0xa8, 0x32, 0x93, 0x26, 0xc3, 0xd6, 0xc7, 0xba, 0x2c,
+ 0xa6, 0xd4, 0xa3, 0x86, 0xa6, 0xad, 0x2d, 0x47, 0x6e, 0x81, 0x47, 0xcf,
+ 0xd9, 0x14, 0x5e, 0x97, 0x43, 0xc3, 0x42, 0xc3, 0x10, 0x14, 0xac, 0x6e,
+ 0x6d, 0xfa, 0xde, 0x5e, 0x64, 0xd3, 0xed, 0x8c, 0x5f, 0xca, 0x32, 0x1f,
+ 0xb1, 0xe5, 0x17, 0x39, 0x37, 0x83, 0x7b, 0x99, 0x2f, 0x86, 0xfa, 0x16,
+ 0x5f, 0x1e, 0xf3, 0xf4, 0xa3, 0x5c, 0xea, 0x4f, 0xc0, 0x0a, 0x61, 0xcf,
+ 0x33, 0xed, 0x48, 0xee, 0x47, 0xb4, 0xf8, 0x49, 0xe1, 0x19, 0xd1, 0xb4,
+ 0xc8, 0x21, 0xc4, 0xde, 0x10, 0x56, 0xe4, 0xe5, 0x3b, 0xb1, 0xb2, 0x48,
+ 0xad, 0x5f, 0xf0, 0x3d, 0x36, 0x5a, 0x02, 0x85, 0x99, 0xd8, 0x77, 0x1f,
+ 0xdc, 0x3f, 0xc7, 0x0f, 0xab, 0xf6, 0x4f, 0x69, 0xf6, 0xbf, 0xc7, 0xfe,
+ 0x3d, 0xfb, 0x24, 0xfb, 0xf7, 0xec, 0x7f, 0x9b, 0xfd, 0x7b, 0xf6, 0x8f,
+ 0xef, 0xdf, 0x93, 0xee, 0xfe, 0x3d, 0xfb, 0xdf, 0x65, 0xff, 0xb4, 0x19,
+ 0xa1, 0xee, 0x5e, 0x16, 0xec, 0xdf, 0x58, 0x92, 0x40, 0x14, 0xcb, 0x92,
+ 0x88, 0xad, 0x6f, 0x71, 0xc8, 0x45, 0xd2, 0x80, 0xd9, 0xa7, 0xad, 0x35,
+ 0xbb, 0x0c, 0xa4, 0xda, 0xd3, 0xdd, 0x47, 0x00, 0xf4, 0x74, 0xc8, 0xe3,
+ 0xb3, 0xc4, 0x7e, 0xde, 0xdb, 0x04, 0x87, 0x35, 0x27, 0x8e, 0xe0, 0xa8,
+ 0xc3, 0xd9, 0xac, 0xf1, 0x8c, 0x08, 0xc0, 0xc5, 0xc7, 0xb5, 0xab, 0x9b,
+ 0x8f, 0x41, 0xca, 0x19, 0xe2, 0xed, 0xbf, 0x24, 0x7a, 0x0d, 0xf9, 0xf1,
+ 0x2f, 0xa3, 0xf5, 0xa0, 0xe8, 0x6b, 0xee, 0x26, 0x15, 0x0b, 0x32, 0x78,
+ 0xa4, 0x7b, 0xf4, 0xb6, 0xd9, 0x5d, 0xeb, 0xaa, 0x3a, 0xb2, 0x85, 0x93,
+ 0xe1, 0xc3, 0x5b, 0x56, 0x5e, 0x03, 0xd0, 0xea, 0xe5, 0xfb, 0x77, 0xa1,
+ 0xdb, 0xcd, 0x2c, 0x75, 0x33, 0x09, 0xe0, 0x44, 0xcd, 0x7e, 0x0d, 0xc9,
+ 0xb8, 0x1f, 0xa2, 0xad, 0x82, 0x39, 0x8e, 0xa7, 0xdf, 0x6e, 0x7a, 0x0e,
+ 0x20, 0xc4, 0x20, 0xca, 0xc8, 0x41, 0xe3, 0xca, 0x74, 0x85, 0x5f, 0x20,
+ 0xb4, 0x1f, 0xb7, 0xc3, 0xad, 0x66, 0xda, 0x36, 0xe3, 0x8e, 0x81, 0xce,
+ 0xa5, 0xa6, 0xbd, 0x0a, 0x3a, 0xc1, 0x92, 0x32, 0x98, 0xd7, 0x73, 0xbe,
+ 0x15, 0x09, 0x69, 0x46, 0x6f, 0x42, 0x4c, 0xec, 0x9f, 0x99, 0xc0, 0xfa,
+ 0x6c, 0xb7, 0x45, 0xd5, 0x57, 0xd0, 0x15, 0x97, 0xf3, 0x85, 0x54, 0xdf,
+ 0x3f, 0x50, 0x7d, 0x0c, 0x13, 0x7c, 0x33, 0xf9, 0x01, 0xb5, 0xc5, 0xec,
+ 0xad, 0x97, 0x42, 0x3c, 0xb5, 0xca, 0x6d, 0xe9, 0x91, 0x86, 0xc2, 0x7a,
+ 0xd0, 0x01, 0xa3, 0x80, 0x6c, 0x1d, 0x58, 0x0d, 0xae, 0x19, 0xd3, 0x66,
+ 0x04, 0x24, 0x23, 0x3d, 0x9d, 0x59, 0xca, 0x80, 0x04, 0x29, 0x23, 0x0a,
+ 0xcd, 0xc9, 0x8e, 0x35, 0x52, 0x36, 0x38, 0xa2, 0x48, 0x93, 0x66, 0x94,
+ 0x4d, 0xf3, 0xba, 0x19, 0x6a, 0x24, 0xa5, 0x88, 0xb5, 0x8b, 0x3b, 0xeb,
+ 0xec, 0x01, 0x6f, 0x16, 0xab, 0x9d, 0x51, 0xed, 0x16, 0x9e, 0x02, 0x81,
+ 0xb5, 0x51, 0x1d, 0x92, 0x8a, 0xc9, 0xd4, 0xb9, 0x47, 0xa9, 0xb3, 0x3e,
+ 0xa7, 0x0c, 0x2f, 0xc2, 0x3a, 0x53, 0x2d, 0xd4, 0xe5, 0x15, 0xff, 0x0b,
+ 0x98, 0xa3, 0xa7, 0x6a, 0x89, 0x35, 0x33, 0xdf, 0x33, 0x11, 0x9c, 0x24,
+ 0xbf, 0x2a, 0x2a, 0xc6, 0x51, 0xc6, 0xcc, 0xd1, 0xd5, 0x49, 0x6b, 0x17,
+ 0xee, 0x97, 0xd3, 0x36, 0x52, 0xbd, 0x3e, 0x1a, 0x6c, 0x68, 0x72, 0x32,
+ 0x7b, 0x90, 0x1e, 0x28, 0x20, 0x1c, 0xd1, 0x6d, 0x44, 0x64, 0xc3, 0x36,
+ 0x51, 0x4e, 0x38, 0x5b, 0xfe, 0x3a, 0xf3, 0xa1, 0x05, 0x2c, 0x6e, 0xab,
+ 0xa4, 0x28, 0x62, 0xea, 0x85, 0x24, 0x76, 0x07, 0xdd, 0xb9, 0x00, 0x1c,
+ 0x22, 0x93, 0x5f, 0x13, 0x6c, 0xcf, 0x25, 0xbf, 0xc5, 0xbd, 0xc9, 0x01,
+ 0xc5, 0xf5, 0x4f, 0x2c, 0xe4, 0xf7, 0x0a, 0x27, 0x7c, 0x11, 0x95, 0x5d,
+ 0x71, 0x30, 0x7f, 0x55, 0x52, 0xbd, 0x0f, 0x3a, 0x08, 0xdc, 0x76, 0x16,
+ 0x1d, 0xd6, 0xdb, 0x75, 0x54, 0x34, 0x55, 0xb9, 0x30, 0xdc, 0xf3, 0x4d,
+ 0x4a, 0xab, 0x02, 0x07, 0xbd, 0x4a, 0xb3, 0x79, 0xe0, 0xb5, 0xac, 0x4b,
+ 0xf2, 0x9c, 0x2b, 0x1e, 0x2b, 0xff, 0xcb, 0x73, 0xb6, 0xc2, 0x3c, 0x60,
+ 0xd2, 0x24, 0x95, 0x21, 0x99, 0x61, 0x70, 0xa9, 0xab, 0x42, 0x7b, 0xb9,
+ 0x20, 0xa9, 0xdc, 0x4b, 0x7e, 0x5e, 0x09, 0xdb, 0x81, 0xa1, 0x86, 0xdd,
+ 0xc0, 0x88, 0x0c, 0xfd, 0x32, 0x2a, 0x39, 0x78, 0xdd, 0xd9, 0x4c, 0x81,
+ 0x6d, 0x34, 0x15, 0x7b, 0x52, 0xdd, 0x2f, 0xc8, 0x3d, 0xc0, 0xef, 0xca,
+ 0x39, 0xa7, 0xd9, 0x31, 0x6c, 0xf2, 0x6a, 0x64, 0x80, 0xf7, 0xb5, 0xd7,
+ 0x7b, 0x00, 0xb7, 0x29, 0x39, 0x86, 0x08, 0x44, 0xdc, 0x1c, 0x14, 0xbd,
+ 0x5d, 0xe9, 0xda, 0x99, 0x02, 0xf0, 0xa8, 0xb7, 0x21, 0xa0, 0xb4, 0xf9,
+ 0xf3, 0xbb, 0xc9, 0xc0, 0xf6, 0x30, 0x7c, 0x80, 0x6e, 0x25, 0x14, 0x44,
+ 0xd9, 0xf4, 0x42, 0xe0, 0xf2, 0xbc, 0xc5, 0xbe, 0xe9, 0x9e, 0x0c, 0x9b,
+ 0xd9, 0x9e, 0x12, 0x08, 0x4a, 0x11, 0xa0, 0x2d, 0x19, 0x1b, 0xf7, 0x6a,
+ 0x28, 0xb8, 0x31, 0x3d, 0x7c, 0xe2, 0xa5, 0x53, 0x0a, 0xeb, 0x72, 0xbd,
+ 0x3e, 0x92, 0xf1, 0xac, 0xe3, 0x11, 0x32, 0x4d, 0x33, 0x29, 0x04, 0xcb,
+ 0x87, 0xc4, 0x6d, 0x10, 0x6e, 0x40, 0x75, 0xc1, 0xd1, 0x79, 0x7a, 0xc5,
+ 0x92, 0xcb, 0xca, 0x3a, 0x0f, 0x91, 0x81, 0x9a, 0x34, 0x1b, 0xc1, 0xc8,
+ 0xdd, 0x88, 0x26, 0xe6, 0x6e, 0x32, 0x8f, 0x1c, 0x5f, 0x0e, 0xdf, 0x9a,
+ 0xb5, 0x0f, 0x03, 0x70, 0x2f, 0xf2, 0x4d, 0xc8, 0x6d, 0xe1, 0x32, 0x1c,
+ 0x90, 0x59, 0x8d, 0x5c, 0x14, 0xfa, 0xd2, 0x28, 0x86, 0x17, 0x35, 0x29,
+ 0x2b, 0x01, 0x6d, 0xa2, 0x64, 0x18, 0x73, 0xf2, 0x90, 0x01, 0x54, 0x5b,
+ 0x2c, 0x8e, 0x76, 0xa5, 0xba, 0x83, 0x69, 0x8d, 0x14, 0xd5, 0x5b, 0x1d,
+ 0x55, 0xe0, 0x43, 0x51, 0x87, 0x32, 0xcd, 0x6a, 0xea, 0x43, 0xc6, 0x13,
+ 0x48, 0x0e, 0x7c, 0x11, 0x05, 0xf4, 0xbc, 0xb4, 0xaa, 0xb5, 0x69, 0x48,
+ 0x97, 0x07, 0xf0, 0x60, 0x74, 0xe2, 0xef, 0x6d, 0xd9, 0xa5, 0x8a, 0x45,
+ 0xd9, 0xc2, 0x1a, 0x4e, 0x52, 0xc0, 0x89, 0x90, 0x0b, 0x05, 0xff, 0x84,
+ 0x8f, 0x8f, 0x08, 0x2d, 0x81, 0xda, 0x88, 0x66, 0x21, 0x0d, 0xd2, 0x6c,
+ 0xdf, 0xf4, 0xa5, 0x46, 0x69, 0x5c, 0xb0, 0x45, 0x99, 0xc3, 0x11, 0x97,
+ 0x85, 0x1c, 0x8d, 0x1c, 0xe2, 0x13, 0xa7, 0x94, 0xb8, 0xc2, 0x40, 0xb1,
+ 0x16, 0x0f, 0x2b, 0x84, 0x45, 0x7e, 0x73, 0x76, 0xf0, 0xee, 0x78, 0x7c,
+ 0xfa, 0x76, 0x1f, 0xe2, 0x02, 0x60, 0xb2, 0xf4, 0xc7, 0x2e, 0xb7, 0xf5,
+ 0x02, 0x4e, 0x3b, 0xbe, 0x9a, 0xd7, 0x0c, 0xc5, 0x4b, 0xdf, 0x32, 0x3b,
+ 0xf4, 0x43, 0x96, 0x7e, 0x8c, 0x94, 0xd6, 0x8d, 0x8d, 0x88, 0xa2, 0xc6,
+ 0x61, 0x2d, 0x1e, 0xe5, 0x64, 0xa4, 0xda, 0x6b, 0x0d, 0x0c, 0x44, 0xa4,
+ 0x12, 0x25, 0xe1, 0x3a, 0xf6, 0x4a, 0xd5, 0xa4, 0x9d, 0x73, 0xe4, 0x91,
+ 0xf9, 0xb1, 0xc7, 0x84, 0x1e, 0xae, 0x39, 0xcb, 0xc7, 0x9c, 0x0d, 0xec,
+ 0x84, 0x13, 0xac, 0x5e, 0x12, 0x06, 0x4b, 0xaf, 0x4e, 0x19, 0x70, 0xa3,
+ 0x71, 0x4c, 0xdb, 0x71, 0x80, 0x93, 0xbe, 0xe8, 0xe4, 0xeb, 0xc5, 0xc9,
+ 0x01, 0x76, 0x2d, 0x6b, 0x55, 0x6a, 0xe3, 0xc2, 0x8b, 0x46, 0x1d, 0x1c,
+ 0xa8, 0x37, 0x4d, 0x06, 0x11, 0x12, 0xd5, 0xfc, 0xb2, 0xe2, 0x26, 0x9b,
+ 0x95, 0x0b, 0x1e, 0x8b, 0x74, 0x09, 0x41, 0x6e, 0x66, 0x44, 0xe0, 0x51,
+ 0x4c, 0x33, 0xb2, 0x2c, 0x28, 0x87, 0x4d, 0x51, 0x27, 0x78, 0xa1, 0x3e,
+ 0x1a, 0xb4, 0x8c, 0xc5, 0xe0, 0xc2, 0x91, 0x0d, 0x64, 0x42, 0x91, 0xb7,
+ 0xab, 0x10, 0x3d, 0x8d, 0x49, 0x1c, 0x41, 0xc1, 0x52, 0x2c, 0x20, 0x34,
+ 0x58, 0x40, 0x46, 0xf0, 0x6d, 0x96, 0x7d, 0xe4, 0x6f, 0xda, 0x98, 0x2d,
+ 0xb7, 0xf1, 0xd0, 0x92, 0xa1, 0xb5, 0x1f, 0xb6, 0xd6, 0x84, 0x39, 0xba,
+ 0xfc, 0x8a, 0x58, 0xb5, 0xd9, 0x84, 0xca, 0x6b, 0x9a, 0xe1, 0x2e, 0x7e,
+ 0x41, 0xa9, 0x85, 0xff, 0xb4, 0x32, 0xf7, 0xc5, 0x0d, 0xa9, 0x7a, 0xf8,
+ 0x92, 0x20, 0x3f, 0x47, 0xc0, 0x93, 0xa5, 0x21, 0x7a, 0x5a, 0x7d, 0xac,
+ 0xdd, 0x29, 0x0f, 0x55, 0x81, 0x46, 0x37, 0x81, 0xcc, 0x11, 0x54, 0x4a,
+ 0xd3, 0x62, 0xda, 0x89, 0xff, 0x54, 0xb4, 0xd8, 0x78, 0x45, 0xcc, 0x3c,
+ 0xd6, 0x20, 0x42, 0xbf, 0xb6, 0x64, 0xe9, 0xab, 0x52, 0x5c, 0xc5, 0xdb,
+ 0x38, 0x2c, 0x3b, 0xdb, 0xdb, 0x0f, 0x82, 0x29, 0x0a, 0x9b, 0x2b, 0xa6,
+ 0x22, 0xee, 0xb2, 0xbc, 0xb0, 0x80, 0x8a, 0x8d, 0x56, 0x22, 0x3b, 0x38,
+ 0x45, 0xa0, 0xff, 0xa4, 0xb9, 0x14, 0x75, 0x77, 0x01, 0x66, 0xcd, 0x27,
+ 0x2d, 0xb4, 0xa1, 0xd5, 0xc2, 0x6e, 0x2d, 0xc4, 0x6e, 0x06, 0x68, 0x45,
+ 0xd2, 0x99, 0x8f, 0xf8, 0x3c, 0xef, 0xb7, 0xdf, 0xe9, 0xe6, 0x80, 0xf0,
+ 0x3d, 0x80, 0x10, 0x3f, 0xbd, 0xe8, 0xce, 0x44, 0xf2, 0xf5, 0xbd, 0xf3,
+ 0xe0, 0xda, 0xe8, 0x24, 0xe6, 0x45, 0x8a, 0x16, 0xcf, 0x7f, 0xb4, 0xc2,
+ 0x00, 0x88, 0xe3, 0x25, 0xfe, 0x8b, 0x07, 0x07, 0x6c, 0xae, 0xa9, 0x45,
+ 0x8d, 0x21, 0x19, 0x07, 0x2e, 0x1e, 0xb6, 0xb0, 0xab, 0xb5, 0x30, 0xf3,
+ 0x6e, 0xdd, 0xd4, 0x61, 0x12, 0x0d, 0x26, 0x55, 0x1b, 0x5e, 0xd9, 0x05,
+ 0xa3, 0x0d, 0x7f, 0xd9, 0xae, 0x2c, 0x78, 0xde, 0xde, 0x5f, 0x82, 0xa0,
+ 0x19, 0x02, 0x68, 0xa6, 0x7b, 0x11, 0x12, 0x36, 0x0d, 0x31, 0x39, 0x9c,
+ 0xcd, 0x65, 0xe1, 0x79, 0xe1, 0x09, 0x76, 0x95, 0xb3, 0x39, 0xb5, 0x1e,
+ 0xbd, 0x83, 0xe7, 0xdf, 0x52, 0xaf, 0x15, 0x10, 0x59, 0x95, 0x3d, 0x1f,
+ 0xfd, 0x22, 0xc0, 0xba, 0x68, 0xf9, 0xf3, 0x43, 0xfc, 0x30, 0xae, 0x0a,
+ 0x71, 0xb1, 0x22, 0x46, 0xd4, 0x41, 0xc6, 0x1b, 0xfc, 0x01, 0xac, 0x29,
+ 0x18, 0xbb, 0x75, 0x80, 0xbd, 0xbb, 0xa0, 0xe6, 0x98, 0xd9, 0x88, 0x77,
+ 0x38, 0xea, 0xe4, 0x18, 0x68, 0xd7, 0x1f, 0xb2, 0x20, 0xb8, 0xaa, 0x8c,
+ 0x17, 0x53, 0x3b, 0xe0, 0x5c, 0x94, 0xed, 0xd2, 0x2f, 0xcc, 0xb8, 0xb5,
+ 0xfa, 0x28, 0x8a, 0x58, 0x82, 0x16, 0xb4, 0x73, 0xf3, 0xd4, 0x3a, 0x61,
+ 0x40, 0x22, 0x84, 0xc9, 0x23, 0x5b, 0x9c, 0x5a, 0xd6, 0x40, 0x00, 0xef,
+ 0x93, 0x70, 0xc2, 0xa0, 0x82, 0x74, 0x07, 0xca, 0x23, 0xe5, 0x47, 0x11,
+ 0x88, 0x75, 0x82, 0xcd, 0x01, 0x54, 0xd0, 0xb2, 0xf2, 0xb2, 0xa2, 0xd6,
+ 0xae, 0x73, 0xb3, 0xab, 0xc5, 0x1a, 0x54, 0x22, 0x77, 0xb1, 0xca, 0x77,
+ 0x83, 0xc5, 0x2e, 0x67, 0x5e, 0x84, 0x2e, 0xd4, 0x1d, 0x2c, 0xc6, 0x49,
+ 0x50, 0x04, 0x6e, 0x5d, 0x0a, 0x72, 0xa7, 0x48, 0x5a, 0x31, 0xaf, 0xa1,
+ 0x2c, 0x92, 0xde, 0x0a, 0x1e, 0xc7, 0x1d, 0x62, 0xdf, 0xa2, 0x9f, 0x29,
+ 0x11, 0xdc, 0x35, 0x14, 0xb4, 0x3d, 0x30, 0xe6, 0xe4, 0xca, 0xa7, 0x7f,
+ 0x11, 0x8d, 0x63, 0xd6, 0x31, 0x6d, 0x82, 0x20, 0xa7, 0x45, 0xba, 0x2b,
+ 0x48, 0xb6, 0x76, 0x7a, 0x8f, 0xc2, 0x6c, 0xf7, 0x61, 0x70, 0x77, 0x80,
+ 0x94, 0x6b, 0xa8, 0x78, 0x55, 0xc2, 0x01, 0x24, 0x7c, 0x4c, 0x24, 0x9c,
+ 0x54, 0xf9, 0xa2, 0xe1, 0x8c, 0x34, 0x29, 0x98, 0x79, 0xc8, 0xea, 0xbf,
+ 0x9a, 0x95, 0x17, 0xe9, 0x4c, 0x30, 0x2d, 0x24, 0x5f, 0x55, 0xe3, 0x5e,
+ 0xad, 0xe6, 0x0d, 0x24, 0xde, 0x88, 0x3d, 0x23, 0x6d, 0xaa, 0xcc, 0x8a,
+ 0x87, 0xfb, 0x03, 0xe4, 0x6d, 0xdc, 0x35, 0x2b, 0x3f, 0x68, 0x3f, 0xc1,
+ 0x28, 0xc9, 0xc3, 0xcb, 0x81, 0x9c, 0x5e, 0xc5, 0xaf, 0x41, 0xba, 0x6f,
+ 0xed, 0x1d, 0xa9, 0xc0, 0xf2, 0x06, 0xdc, 0x54, 0x32, 0x5d, 0xb2, 0x3a,
+ 0xe8, 0xee, 0x93, 0x75, 0x49, 0x15, 0x92, 0x36, 0xc0, 0xc8, 0x41, 0xb5,
+ 0x1d, 0x9e, 0x38, 0x23, 0x27, 0x8b, 0xf5, 0xb7, 0xbc, 0x55, 0xff, 0x9d,
+ 0xd9, 0xd5, 0xeb, 0xf2, 0x16, 0x55, 0x77, 0x05, 0x19, 0x27, 0x6e, 0x72,
+ 0x5a, 0x51, 0xe1, 0xd1, 0x8a, 0x5b, 0x58, 0x86, 0x1c, 0x7f, 0xc9, 0x6e,
+ 0x01, 0xe8, 0xd2, 0xbc, 0x27, 0x2b, 0x28, 0xe3, 0xb7, 0x67, 0x69, 0x3b,
+ 0x8a, 0xec, 0xa7, 0x7b, 0x42, 0x6a, 0x90, 0x6b, 0x66, 0x8b, 0x67, 0xdc,
+ 0x3c, 0x77, 0xc3, 0xf0, 0x8b, 0x00, 0x04, 0x70, 0x8b, 0xde, 0x4d, 0x62,
+ 0x30, 0xb9, 0x67, 0x59, 0x12, 0x44, 0xf3, 0xf7, 0xcc, 0x2a, 0x28, 0x6d,
+ 0x99, 0xba, 0xb0, 0x94, 0x85, 0x94, 0x80, 0xc3, 0xe7, 0x21, 0x81, 0x63,
+ 0xe5, 0xa7, 0xac, 0x99, 0x78, 0xbf, 0x9c, 0x66, 0xe9, 0x2c, 0xda, 0x63,
+ 0x8c, 0x26, 0x8c, 0x68, 0x27, 0xcb, 0x36, 0x00, 0xca, 0x15, 0x1a, 0x3c,
+ 0x97, 0xd2, 0x19, 0x4e, 0x1e, 0x2f, 0x5a, 0x48, 0x55, 0x38, 0x53, 0xe1,
+ 0x4e, 0x53, 0xdf, 0x43, 0xfa, 0x35, 0xc1, 0x79, 0x4c, 0x1c, 0x6e, 0x93,
+ 0x57, 0x53, 0x09, 0x5f, 0xd3, 0x9b, 0x93, 0xc4, 0x3e, 0x80, 0xbc, 0x57,
+ 0x4e, 0xde, 0x0d, 0x9a, 0x2d, 0x4a, 0x34, 0x4d, 0xc0, 0x33, 0xf8, 0x9a,
+ 0xd1, 0x62, 0x3c, 0x9a, 0x17, 0xf7, 0x59, 0x22, 0x19, 0xb9, 0x29, 0x47,
+ 0x11, 0xc9, 0x76, 0x10, 0x1f, 0x8b, 0x70, 0xa7, 0x6f, 0x32, 0xcd, 0x76,
+ 0x85, 0xf9, 0xc1, 0xe4, 0x6f, 0x2c, 0x9e, 0x08, 0x8d, 0x25, 0xb2, 0x86,
+ 0xc5, 0xcc, 0xee, 0x6e, 0xfc, 0x64, 0xcc, 0x33, 0xa3, 0x48, 0x4e, 0x95,
+ 0xc5, 0x70, 0xd6, 0xeb, 0xf4, 0x32, 0x53, 0x9b, 0x45, 0x44, 0x77, 0x39,
+ 0x31, 0xe4, 0x43, 0xa6, 0xce, 0x2d, 0x1b, 0x14, 0x45, 0xa4, 0x50, 0x9f,
+ 0xa5, 0x26, 0x49, 0x49, 0x7b, 0xe5, 0xd2, 0x31, 0x10, 0x71, 0x5b, 0xcf,
+ 0xf2, 0x85, 0x86, 0x29, 0x07, 0x49, 0x26, 0x89, 0xa4, 0xd4, 0xec, 0x01,
+ 0x5b, 0xb2, 0x1c, 0x46, 0x1c, 0x70, 0x9a, 0x6a, 0xa7, 0xbd, 0x00, 0x66,
+ 0x64, 0x19, 0x6d, 0x74, 0x46, 0x7f, 0xb2, 0xbd, 0x83, 0xd9, 0x3e, 0xd9,
+ 0x7e, 0xbe, 0xd9, 0xbe, 0x95, 0x67, 0x75, 0x36, 0x44, 0x22, 0xf2, 0x23,
+ 0x2a, 0xf4, 0xe1, 0x8d, 0xa0, 0x37, 0x24, 0x75, 0x59, 0x0b, 0xf2, 0xa1,
+ 0x73, 0xa3, 0xef, 0x33, 0x39, 0x28, 0xeb, 0x6b, 0x82, 0xa7, 0x0e, 0x6e,
+ 0x79, 0x7a, 0x4d, 0xde, 0xe3, 0x9c, 0x46, 0xba, 0x96, 0x98, 0x52, 0x29,
+ 0x5e, 0x96, 0xbe, 0xb2, 0x4c, 0x08, 0x3c, 0x67, 0x2d, 0xf0, 0x58, 0x07,
+ 0x78, 0x59, 0x35, 0x17, 0x50, 0x72, 0x06, 0x07, 0x77, 0x1a, 0xb7, 0x36,
+ 0xa2, 0xca, 0x9c, 0xe4, 0x75, 0x5e, 0xe4, 0xf5, 0x35, 0xb1, 0xfd, 0x9c,
+ 0x92, 0x16, 0xae, 0xb2, 0x10, 0x04, 0xc8, 0x88, 0x23, 0x63, 0x02, 0xb0,
+ 0xb9, 0x5f, 0xa1, 0x45, 0x0f, 0x25, 0x03, 0x33, 0xdd, 0xa5, 0x08, 0x51,
+ 0x3a, 0x13, 0x03, 0x42, 0xd6, 0x2d, 0x33, 0x6a, 0x96, 0x3c, 0xaa, 0x6d,
+ 0x36, 0x35, 0x70, 0x05, 0x98, 0x28, 0xf7, 0x54, 0x44, 0x4b, 0xc5, 0x58,
+ 0xaf, 0xbc, 0x64, 0x83, 0x36, 0xf7, 0x74, 0x6c, 0x44, 0xd0, 0x36, 0x69,
+ 0xe4, 0xb3, 0x94, 0x1a, 0x89, 0xd0, 0xdf, 0xcc, 0xcf, 0x7e, 0x34, 0xba,
+ 0xe8, 0xe8, 0x85, 0xfd, 0xf1, 0xe6, 0xe3, 0x7a, 0x6c, 0xef, 0x76, 0x74,
+ 0x33, 0xaa, 0xaf, 0x90, 0x88, 0x34, 0x1c, 0x56, 0x5f, 0xf0, 0x3f, 0xe2,
+ 0x1e, 0x6f, 0xe0, 0x68, 0x1c, 0xbf, 0x39, 0x20, 0xe4, 0x4d, 0x57, 0xf1,
+ 0xe9, 0xa5, 0x15, 0x6b, 0xd1, 0xb5, 0x76, 0xf5, 0x20, 0xee, 0x80, 0xae,
+ 0x1a, 0x45, 0x42, 0x96, 0x4e, 0x7a, 0x9c, 0x7f, 0x89, 0x54, 0xf2, 0x16,
+ 0x30, 0x02, 0xb4, 0xb9, 0x19, 0xb5, 0x56, 0xa5, 0x83, 0x30, 0x4a, 0x4e,
+ 0x32, 0xee, 0x33, 0xb8, 0xfe, 0xd5, 0x7a, 0xa4, 0x42, 0x7b, 0xfd, 0xe5,
+ 0xba, 0xd7, 0xb5, 0xc7, 0xf5, 0x2f, 0x5d, 0xff, 0x23, 0x99, 0xf5, 0x04,
+ 0x3a, 0xc7, 0xdf, 0x94, 0x2d, 0xe0, 0x9a, 0x09, 0xc9, 0x79, 0xe9, 0x29,
+ 0xba, 0x15, 0x2c, 0xe5, 0x76, 0xfa, 0xe8, 0x82, 0x11, 0xec, 0xa9, 0x08,
+ 0xa2, 0xbd, 0x76, 0x55, 0xe6, 0xd6, 0x83, 0x0a, 0xee, 0xe2, 0x5e, 0x50,
+ 0x0d, 0x73, 0x24, 0xd6, 0xb9, 0xbe, 0xef, 0x3c, 0x23, 0x9e, 0x0a, 0x5c,
+ 0x68, 0x46, 0xcf, 0x87, 0x59, 0xc8, 0x36, 0xb7, 0xf9, 0xf5, 0xd5, 0x55,
+ 0x34, 0xc7, 0xd5, 0x90, 0x80, 0x36, 0x9e, 0xd6, 0x7c, 0x69, 0xec, 0x2d,
+ 0xe8, 0x1b, 0x74, 0xcf, 0xf7, 0x17, 0xc4, 0x38, 0xdd, 0x3d, 0xf2, 0x8c,
+ 0xb7, 0x8a, 0x97, 0x7e, 0xcd, 0x61, 0x4f, 0xdc, 0x03, 0x6c, 0x20, 0x7c,
+ 0x40, 0xce, 0x2c, 0xfc, 0xd4, 0x06, 0x3d, 0x2e, 0x53, 0xc3, 0x19, 0xf7,
+ 0x92, 0x60, 0x34, 0xa3, 0x2a, 0x31, 0x31, 0xa6, 0x02, 0x19, 0x46, 0x7c,
+ 0xcb, 0x29, 0xfc, 0xe6, 0x62, 0xa2, 0x16, 0x6c, 0x4c, 0xc7, 0x42, 0xb4,
+ 0x0d, 0x29, 0x62, 0x82, 0x61, 0x92, 0x68, 0x93, 0x33, 0xf1, 0x5f, 0xa0,
+ 0x3e, 0xa9, 0xeb, 0x1b, 0x97, 0x6a, 0x25, 0x39, 0x89, 0xa2, 0xac, 0xb8,
+ 0x9c, 0x16, 0xd4, 0x5b, 0x41, 0x68, 0x38, 0x6f, 0x92, 0x5f, 0xa0, 0xde,
+ 0x8d, 0x54, 0xc1, 0x82, 0x30, 0xc2, 0x68, 0x0b, 0x87, 0x84, 0xab, 0xc4,
+ 0xba, 0xb0, 0x22, 0xbb, 0x7b, 0x9f, 0x7f, 0x1e, 0x75, 0xf0, 0x31, 0xe4,
+ 0x8c, 0xe1, 0x41, 0x22, 0x93, 0x03, 0x0f, 0x1f, 0xd8, 0x2e, 0x10, 0xf4,
+ 0x75, 0x62, 0x30, 0xf5, 0x72, 0x95, 0xe8, 0x28, 0x4a, 0x5f, 0x0d, 0x9d,
+ 0xbc, 0x70, 0xbe, 0xcc, 0x49, 0xab, 0x10, 0x29, 0x06, 0xe5, 0x8a, 0xa4,
+ 0xc6, 0x3c, 0xef, 0x51, 0xe9, 0x44, 0x49, 0xa8, 0x15, 0x3d, 0x47, 0x70,
+ 0x94, 0xa5, 0xb6, 0x88, 0xbb, 0x3e, 0x1b, 0xc5, 0x01, 0x95, 0x4b, 0x9c,
+ 0xfd, 0x07, 0xbe, 0xea, 0x29, 0xf1, 0x5f, 0x4f, 0x34, 0x03, 0xe6, 0x22,
+ 0xb3, 0x08, 0x54, 0xec, 0xe8, 0xe8, 0x60, 0x05, 0xb2, 0xff, 0xb1, 0xa0,
+ 0x3a, 0x5f, 0x6a, 0xfa, 0x65, 0x86, 0xef, 0x0c, 0x07, 0xd4, 0x8b, 0xab,
+ 0xac, 0x09, 0x6b, 0x53, 0xbd, 0x8a, 0x8e, 0x15, 0x83, 0x47, 0x4e, 0x83,
+ 0x54, 0xd6, 0xbe, 0x94, 0xfe, 0x34, 0xf9, 0xa5, 0x1e, 0x50, 0xed, 0x91,
+ 0xf5, 0x15, 0x27, 0xdb, 0xbe, 0xb4, 0xe8, 0xa4, 0x85, 0x4a, 0xa8, 0xaf,
+ 0xa2, 0x60, 0xb0, 0x0e, 0x69, 0x0e, 0xe0, 0xa4, 0x4d, 0x63, 0x34, 0x6b,
+ 0x27, 0xbd, 0x51, 0x1c, 0x64, 0xe1, 0x27, 0x85, 0xbe, 0x50, 0x91, 0x67,
+ 0x31, 0x20, 0xb2, 0x97, 0xd6, 0x63, 0x2d, 0x2d, 0xdf, 0xa8, 0x38, 0x8b,
+ 0xe6, 0x13, 0xa3, 0x44, 0x2d, 0xde, 0x6b, 0x92, 0x10, 0xe6, 0xe9, 0xc0,
+ 0xea, 0xa1, 0x77, 0x3d, 0x3a, 0x85, 0x7b, 0xef, 0x72, 0x2f, 0x1d, 0x5e,
+ 0x22, 0xd3, 0xd8, 0xc1, 0x2e, 0xfa, 0x21, 0xdc, 0xd4, 0x3a, 0xbd, 0x71,
+ 0x28, 0xba, 0x71, 0x39, 0x5a, 0xa7, 0x43, 0xe7, 0x00, 0x67, 0x5d, 0x95,
+ 0x19, 0xcf, 0x12, 0xc0, 0x63, 0x4c, 0xda, 0x97, 0x70, 0x5c, 0x35, 0xd5,
+ 0x72, 0x42, 0x7a, 0x25, 0x8c, 0x72, 0x7c, 0x29, 0xd4, 0x68, 0x97, 0xb5,
+ 0x86, 0xd9, 0xec, 0x8a, 0xd1, 0x6a, 0x18, 0x7b, 0x06, 0x12, 0x0b, 0x72,
+ 0x32, 0x5b, 0x78, 0x02, 0xac, 0xcd, 0x25, 0x0a, 0x91, 0x5e, 0x04, 0xb0,
+ 0x78, 0xc9, 0xd9, 0x52, 0xe7, 0x7f, 0x63, 0xad, 0x4c, 0x6a, 0x3b, 0x14,
+ 0x47, 0x16, 0x0e, 0x8e, 0x8c, 0x7a, 0x17, 0x25, 0xaf, 0xa8, 0x39, 0x3b,
+ 0x5f, 0xe5, 0xc4, 0x6f, 0x81, 0x9c, 0xf6, 0xcb, 0x9b, 0xf8, 0x3a, 0x22,
+ 0x35, 0xae, 0xca, 0xae, 0x96, 0x74, 0xd1, 0x81, 0x4c, 0x1b, 0x8a, 0x1b,
+ 0xaf, 0x4f, 0x2c, 0xf2, 0x05, 0x7a, 0xba, 0x19, 0x7b, 0x2e, 0x68, 0x66,
+ 0x6d, 0xde, 0x42, 0xd7, 0xf5, 0x65, 0x61, 0xa8, 0xd5, 0x2c, 0x29, 0x17,
+ 0x45, 0x20, 0xf3, 0x8c, 0xf8, 0xfa, 0x0b, 0x02, 0x40, 0xa5, 0xac, 0x9c,
+ 0xbb, 0x90, 0x4d, 0xad, 0xe5, 0x9d, 0x64, 0x97, 0x81, 0xed, 0x92, 0x21,
+ 0xff, 0x91, 0xee, 0x05, 0x4e, 0x29, 0x6c, 0x54, 0x02, 0x48, 0x7f, 0xde,
+ 0x7c, 0x9e, 0xfd, 0x91, 0x42, 0x01, 0x72, 0x94, 0xa1, 0xad, 0x80, 0x2a,
+ 0x98, 0x42, 0x77, 0x38, 0xc0, 0x46, 0xab, 0xf6, 0x24, 0x79, 0xdc, 0x6c,
+ 0xd1, 0x72, 0xeb, 0xb7, 0x01, 0x43, 0xe4, 0x73, 0xb5, 0xaa, 0x00, 0x23,
+ 0xa6, 0x35, 0x97, 0xc4, 0xd5, 0x61, 0xdb, 0x7a, 0x5c, 0x01, 0xac, 0x55,
+ 0xff, 0xc5, 0x1a, 0xbc, 0x24, 0xfa, 0x22, 0x10, 0x93, 0x00, 0xd8, 0xdf,
+ 0x17, 0x0f, 0x2a, 0x35, 0x01, 0x16, 0x81, 0xd6, 0xb6, 0x3b, 0x06, 0xa2,
+ 0x21, 0xae, 0x1b, 0xd9, 0x49, 0xb4, 0x5f, 0x17, 0xa1, 0x19, 0xc3, 0x35,
+ 0xb4, 0x10, 0x0a, 0x15, 0x45, 0xe3, 0xe8, 0x8c, 0x58, 0x40, 0x70, 0x2b,
+ 0x40, 0xa0, 0x50, 0x55, 0xa9, 0x91, 0x97, 0x7f, 0x59, 0x5c, 0xb9, 0xda,
+ 0xc3, 0xc8, 0x81, 0x05, 0x26, 0x67, 0xd8, 0xdd, 0x14, 0x7c, 0x38, 0x7c,
+ 0x9d, 0xc8, 0x7c, 0xbe, 0xf8, 0xaa, 0x35, 0xa0, 0xf6, 0xf0, 0xf2, 0x1b,
+ 0xd8, 0x08, 0x6e, 0xd9, 0xe4, 0x2a, 0xef, 0x25, 0x02, 0x53, 0xe1, 0xbe,
+ 0x5c, 0x7a, 0xe5, 0x24, 0xf5, 0x75, 0x99, 0xc9, 0xce, 0x15, 0xb0, 0x80,
+ 0x9d, 0xdc, 0xd0, 0x54, 0x82, 0xa8, 0x83, 0xbd, 0x7f, 0xca, 0xb8, 0xd3,
+ 0xff, 0xbd, 0xbc, 0x2e, 0xe8, 0x1f, 0x34, 0x3c, 0x8d, 0xfe, 0xc5, 0xce,
+ 0x4e, 0x74, 0xd6, 0xab, 0x37, 0x0c, 0x53, 0xa5, 0x4b, 0x48, 0x0a, 0x04,
+ 0x3c, 0x99, 0xd6, 0x32, 0xf8, 0x47, 0x28, 0x7e, 0x8e, 0xf8, 0x21, 0x53,
+ 0x88, 0x57, 0xa0, 0xb5, 0x7a, 0x2f, 0x73, 0xf6, 0x75, 0x54, 0x18, 0xe6,
+ 0xf6, 0x66, 0x00, 0x0c, 0x60, 0x24, 0x77, 0xa2, 0x7f, 0xe1, 0x6b, 0x94,
+ 0x09, 0x70, 0xff, 0xc5, 0xcb, 0xeb, 0xe5, 0x55, 0x06, 0x79, 0xd9, 0xdc,
+ 0x35, 0x6b, 0x8f, 0x5a, 0xb5, 0xfa, 0x26, 0x38, 0xad, 0xab, 0xf1, 0x52,
+ 0xda, 0x51, 0xa8, 0xd6, 0x52, 0x1c, 0x12, 0x07, 0x54, 0x66, 0x53, 0x1d,
+ 0xba, 0x35, 0xa2, 0xac, 0x84, 0x0e, 0x98, 0x68, 0x82, 0x61, 0xe4, 0x50,
+ 0x53, 0x56, 0xac, 0xe0, 0x36, 0xbb, 0xf8, 0xe2, 0x2b, 0xf2, 0x67, 0xdd,
+ 0xa1, 0xc1, 0x12, 0x6b, 0xb3, 0x44, 0xb8, 0x2d, 0xf4, 0x5b, 0x4a, 0xbc,
+ 0x45, 0x74, 0x07, 0x29, 0xab, 0xfe, 0x61, 0xbd, 0x9a, 0x55, 0x6f, 0xc8,
+ 0xcb, 0xb2, 0x5c, 0x39, 0x22, 0x51, 0x85, 0xbb, 0x71, 0x80, 0x2e, 0x5e,
+ 0x32, 0x3b, 0xa7, 0x78, 0xbb, 0x8a, 0x7c, 0x66, 0x09, 0x77, 0xc1, 0xf0,
+ 0x59, 0x88, 0xe1, 0xa3, 0x20, 0xde, 0xca, 0xb6, 0xb9, 0xde, 0x34, 0x5f,
+ 0x0c, 0xb4, 0xa4, 0x33, 0xd2, 0x34, 0xcf, 0xad, 0x81, 0x8f, 0x21, 0xb8,
+ 0x82, 0xfe, 0xfa, 0x47, 0xfb, 0x3a, 0xfd, 0x61, 0x4e, 0x31, 0x5a, 0x96,
+ 0xac, 0x58, 0xcd, 0xf1, 0xa5, 0xfd, 0xe2, 0x16, 0xd2, 0x0f, 0x6c, 0x98,
+ 0x75, 0x7d, 0xc0, 0xfa, 0xf5, 0x1f, 0xd7, 0x5b, 0x71, 0x2a, 0xc4, 0x90,
+ 0x38, 0x48, 0x35, 0x2d, 0x03, 0x75, 0x96, 0x72, 0xf1, 0x25, 0xca, 0x44,
+ 0xb3, 0xef, 0x99, 0x38, 0x69, 0xdb, 0x89, 0xce, 0xfd, 0xa7, 0x35, 0x3b,
+ 0xfb, 0x9f, 0xd6, 0xdc, 0xfc, 0x7f, 0x5a, 0x73, 0x2b, 0xf8, 0x69, 0x6d,
+ 0x8d, 0x9b, 0x8d, 0x87, 0x86, 0xf0, 0x2f, 0xdd, 0xf4, 0x75, 0xfe, 0xa8,
+ 0xfb, 0xa6, 0xf7, 0x49, 0xef, 0x8b, 0x6b, 0xeb, 0xab, 0x88, 0xe6, 0x52,
+ 0x03, 0xf2, 0x4b, 0x0f, 0x81, 0x9b, 0x09, 0x48, 0xea, 0x95, 0x10, 0x49,
+ 0xa9, 0xe4, 0xa8, 0x82, 0x88, 0xd6, 0x7d, 0x80, 0xd5, 0xe5, 0x9e, 0x20,
+ 0x92, 0xbb, 0xfe, 0x9c, 0x5e, 0x53, 0x2a, 0x0b, 0xf3, 0x6d, 0x03, 0x86,
+ 0x80, 0x76, 0x9d, 0x86, 0xf7, 0x90, 0x7d, 0x3d, 0xb8, 0x77, 0xfe, 0xc3,
+ 0x7c, 0xc1, 0xe6, 0x5d, 0x4b, 0x43, 0x1d, 0x06, 0x1c, 0xd0, 0x72, 0x99,
+ 0x82, 0xf3, 0x55, 0xa4, 0x04, 0x9a, 0x70, 0x8f, 0x73, 0x8e, 0xc8, 0x81,
+ 0x27, 0x02, 0x91, 0x3b, 0xcf, 0xd1, 0xac, 0xd5, 0x2c, 0x6b, 0xc6, 0x86,
+ 0xe9, 0x16, 0xdd, 0x06, 0xa8, 0x7c, 0x40, 0x1f, 0xd5, 0x1a, 0xa6, 0xb9,
+ 0xd8, 0xac, 0xad, 0x20, 0x64, 0x1f, 0x67, 0x10, 0x63, 0xac, 0xd3, 0xa0,
+ 0x55, 0xfd, 0xc5, 0x9a, 0xd1, 0x86, 0xfe, 0x68, 0xf4, 0xcf, 0xca, 0xe8,
+ 0xaf, 0x7f, 0x24, 0xde, 0x5a, 0x9a, 0xdd, 0x72, 0x07, 0xf5, 0x6e, 0x38,
+ 0xbf, 0x37, 0x93, 0x5f, 0xff, 0x25, 0x9c, 0x61, 0x45, 0xda, 0x74, 0xaa,
+ 0x79, 0x0d, 0x9d, 0x04, 0x35, 0x39, 0xb5, 0x82, 0x75, 0xc8, 0x67, 0x52,
+ 0x9f, 0xf9, 0x22, 0x06, 0x01, 0x1c, 0x2c, 0xc4, 0x93, 0xbc, 0x30, 0xd1,
+ 0xbe, 0x38, 0xfd, 0xee, 0x8f, 0x3a, 0xc0, 0x4f, 0x6b, 0x3f, 0x0e, 0xf9,
+ 0xa7, 0xc0, 0x7e, 0xd8, 0x4f, 0x4e, 0xbf, 0x23, 0xe6, 0xfe, 0x65, 0x02,
+ 0x6c, 0xd5, 0x07, 0xbe, 0xe2, 0xbf, 0x80, 0xb3, 0x57, 0x0d, 0x7b, 0xee,
+ 0xa5, 0xc9, 0x7d, 0x61, 0x54, 0xa1, 0xec, 0x1e, 0xf5, 0xa5, 0xc8, 0x18,
+ 0x5d, 0x2c, 0xa8, 0x6a, 0x54, 0xd1, 0x0e, 0x1a, 0x46, 0x3b, 0x80, 0x5e,
+ 0x79, 0x51, 0xc2, 0x57, 0xd0, 0x84, 0xcd, 0x43, 0xd0, 0xbc, 0xe0, 0xaf,
+ 0xc2, 0x5f, 0xc4, 0x52, 0xf7, 0xa2, 0x03, 0xb7, 0x73, 0xcc, 0x34, 0xdf,
+ 0x44, 0xad, 0x0b, 0x73, 0x1e, 0x8e, 0x22, 0x5d, 0xa2, 0x1c, 0x50, 0x1d,
+ 0xff, 0x0d, 0xfa, 0x18, 0xf0, 0xf8, 0xc8, 0xb4, 0xa2, 0xa6, 0xb2, 0x9c,
+ 0x21, 0x36, 0xe7, 0xb6, 0xd2, 0xf0, 0x77, 0x33, 0x56, 0xe1, 0x1f, 0x63,
+ 0x21, 0x00, 0x89, 0x4a, 0x4a, 0x19, 0xd2, 0x65, 0x39, 0x9b, 0x4a, 0x34,
+ 0xc2, 0x70, 0x3e, 0xef, 0xb0, 0xed, 0x24, 0x6c, 0x54, 0x0d, 0x22, 0x84,
+ 0x44, 0x28, 0xe4, 0xb3, 0x31, 0x90, 0x00, 0x09, 0x23, 0x4a, 0x7a, 0x1f,
+ 0x37, 0xba, 0x96, 0xc4, 0x13, 0xb0, 0xbe, 0x99, 0xc8, 0xfc, 0x22, 0x83,
+ 0xd7, 0x49, 0xeb, 0xf1, 0x87, 0xe2, 0x17, 0x8e, 0x78, 0x6e, 0xba, 0xc7,
+ 0x06, 0xa9, 0x6c, 0x52, 0x90, 0x4f, 0x88, 0x80, 0xdf, 0xc2, 0xa5, 0x9a,
+ 0x2b, 0xda, 0x8c, 0x34, 0xfe, 0x43, 0x2e, 0x42, 0x1a, 0x5f, 0xac, 0xcd,
+ 0x99, 0x21, 0x0a, 0x85, 0xa7, 0x2d, 0xf9, 0x9d, 0x78, 0x90, 0xbd, 0xd4,
+ 0x1a, 0xac, 0x5e, 0xf6, 0x6b, 0x14, 0xbc, 0xf0, 0xa3, 0xa4, 0x84, 0x0e,
+ 0x77, 0xf6, 0xbd, 0x36, 0x8e, 0xfc, 0xb3, 0xf8, 0xf0, 0x3e, 0xa0, 0x97,
+ 0xcc, 0x2a, 0xaf, 0x85, 0xfc, 0x2b, 0xc6, 0xdf, 0xb5, 0xe3, 0x7f, 0x16,
+ 0xc1, 0xd0, 0x62, 0x94, 0xab, 0xf8, 0x67, 0xcf, 0xfd, 0x24, 0x70, 0x75,
+ 0x9f, 0x3a, 0x27, 0x46, 0xcb, 0x7d, 0x20, 0x99, 0x7e, 0x8c, 0xb0, 0xc5,
+ 0xe0, 0x39, 0x11, 0xab, 0x7f, 0xca, 0x19, 0x42, 0xbc, 0x0e, 0x43, 0xc6,
+ 0xae, 0x69, 0x08, 0x89, 0x2c, 0x7c, 0x55, 0xce, 0x09, 0x9f, 0x7e, 0xba,
+ 0xef, 0xba, 0x7e, 0x33, 0x1e, 0x50, 0xee, 0x97, 0x56, 0x39, 0xfc, 0x84,
+ 0xb0, 0x9e, 0xbd, 0xd5, 0x00, 0x22, 0xf8, 0x14, 0xa4, 0xb1, 0x34, 0xa8,
+ 0xf0, 0x3a, 0x53, 0xaf, 0x6f, 0xac, 0x8b, 0x43, 0x85, 0x3e, 0x96, 0x22,
+ 0x4c, 0x21, 0x0e, 0xe4, 0x94, 0x40, 0x1f, 0x78, 0xf9, 0xc3, 0x88, 0xd6,
+ 0xb1, 0x2f, 0xd9, 0x0d, 0x72, 0x26, 0x18, 0xf4, 0x0d, 0x89, 0x2c, 0x6a,
+ 0x2e, 0x33, 0x40, 0x63, 0x0b, 0xe8, 0x2d, 0x34, 0x8e, 0x3d, 0xfa, 0xca,
+ 0x60, 0x6c, 0x93, 0x22, 0x5b, 0x5d, 0x4e, 0xc4, 0xfa, 0x17, 0x9b, 0xeb,
+ 0x76, 0x69, 0xfd, 0xe6, 0x50, 0x1b, 0x03, 0x4e, 0x43, 0x8f, 0x36, 0x67,
+ 0x86, 0x7d, 0x6e, 0x73, 0x34, 0x91, 0xcc, 0x86, 0xd8, 0xcc, 0x38, 0x1c,
+ 0x30, 0x43, 0x75, 0x30, 0xc0, 0x4f, 0x5e, 0xe0, 0x6c, 0x32, 0x6e, 0x17,
+ 0xb3, 0x78, 0x3a, 0x6b, 0xa8, 0x50, 0x0b, 0xa5, 0x74, 0x0c, 0x5d, 0x5c,
+ 0xef, 0x7b, 0xda, 0x78, 0xe4, 0x78, 0x52, 0x0c, 0x07, 0x3d, 0xa6, 0xc4,
+ 0x0f, 0xe2, 0x79, 0x32, 0x56, 0xa9, 0xde, 0xeb, 0x5f, 0x6c, 0xf0, 0x7d,
+ 0xe5, 0xfc, 0x68, 0xde, 0xb7, 0xd7, 0x93, 0x9f, 0xe2, 0x80, 0x06, 0x09,
+ 0xbf, 0xeb, 0xd9, 0x07, 0xc2, 0xb3, 0x0f, 0xbd, 0x91, 0xbc, 0xbc, 0x28,
+ 0xa7, 0xf7, 0x5f, 0x22, 0xe2, 0x24, 0xaf, 0xbc, 0xdc, 0xc2, 0x8f, 0x3a,
+ 0x2a, 0x73, 0xdf, 0x40, 0x18, 0xc5, 0x6c, 0x15, 0xfe, 0xfb, 0x15, 0x3d,
+ 0xae, 0x16, 0xc3, 0x7a, 0x32, 0x1a, 0x19, 0x41, 0x54, 0xcf, 0xd1, 0xaf,
+ 0x74, 0xc5, 0xc5, 0x02, 0xec, 0x52, 0x61, 0x04, 0x05, 0x9f, 0x82, 0x3f,
+ 0x47, 0x6d, 0x6b, 0x76, 0x3c, 0xf2, 0xaf, 0xaa, 0x2f, 0xcc, 0x98, 0x07,
+ 0x36, 0x45, 0x32, 0xc9, 0x22, 0x4d, 0x44, 0xe8, 0x10, 0xb3, 0x40, 0x14,
+ 0xc7, 0x1d, 0x6d, 0xc8, 0xe7, 0x17, 0xb9, 0xc0, 0x9a, 0x4e, 0x4b, 0x8b,
+ 0x49, 0x4e, 0x90, 0xe4, 0x8c, 0xcf, 0x63, 0xae, 0xf7, 0x38, 0xea, 0x25,
+ 0x72, 0x0e, 0x29, 0x36, 0x84, 0xdf, 0x5b, 0x03, 0x46, 0xe6, 0x36, 0x3c,
+ 0x12, 0x8c, 0x45, 0x91, 0x2f, 0x83, 0xe4, 0x39, 0x7d, 0xc7, 0x42, 0xc2,
+ 0x05, 0xd9, 0x1b, 0x6c, 0xe9, 0xd7, 0xc9, 0xe7, 0x43, 0x7a, 0xce, 0xb9,
+ 0xde, 0x95, 0xef, 0xdb, 0x99, 0x1b, 0x03, 0xd1, 0x0b, 0x87, 0x48, 0x4b,
+ 0x8d, 0x94, 0x63, 0xd2, 0xca, 0x2e, 0xd2, 0x3a, 0x7b, 0xf6, 0x84, 0x3f,
+ 0xc9, 0x44, 0xaa, 0xf5, 0xd8, 0x3b, 0xcf, 0xab, 0xcb, 0x62, 0x6b, 0x2d,
+ 0xa8, 0x7b, 0x10, 0x00, 0x28, 0x41, 0xca, 0x19, 0x35, 0x48, 0xe5, 0x12,
+ 0x0c, 0xba, 0x4d, 0x8d, 0x22, 0x79, 0xd5, 0xa0, 0x9e, 0xf4, 0xf9, 0x33,
+ 0x6f, 0xd2, 0xa3, 0x07, 0x2c, 0xf4, 0xae, 0x20, 0x95, 0x35, 0x76, 0xd7,
+ 0x64, 0x39, 0x36, 0x38, 0x97, 0xe4, 0xe3, 0x60, 0x10, 0x49, 0x59, 0xa4,
+ 0xf5, 0x2a, 0x3e, 0x74, 0x8c, 0xfc, 0x43, 0xf0, 0x47, 0x65, 0x9d, 0xee,
+ 0x87, 0x57, 0x32, 0xb5, 0x67, 0x22, 0xe9, 0xfb, 0x3c, 0x09, 0x66, 0xec,
+ 0x87, 0xf9, 0x9a, 0x82, 0x07, 0x97, 0xcb, 0x0a, 0xb7, 0x8f, 0x3c, 0xc6,
+ 0x4a, 0x82, 0x56, 0xa9, 0x8a, 0x9e, 0xfe, 0xe6, 0xe0, 0xed, 0xfb, 0x83,
+ 0x93, 0xd1, 0xaf, 0xeb, 0xc5, 0xbb, 0xf2, 0x35, 0x0f, 0x96, 0xa2, 0x83,
+ 0xd9, 0x76, 0x3c, 0xe8, 0xc1, 0xb0, 0x09, 0xa2, 0x0d, 0x84, 0x69, 0xd3,
+ 0xcd, 0xd5, 0xa6, 0x92, 0x61, 0x62, 0x2d, 0x4a, 0x0d, 0x89, 0xc3, 0xb9,
+ 0x71, 0x91, 0x87, 0xc4, 0xc5, 0xbd, 0xac, 0xfd, 0xb4, 0x96, 0xa6, 0xd5,
+ 0x6b, 0xfa, 0xfe, 0x14, 0x3d, 0xb3, 0xb9, 0x74, 0xc8, 0x02, 0x84, 0x44,
+ 0xb8, 0xdc, 0x02, 0x9a, 0xd8, 0x8c, 0x2b, 0x45, 0x19, 0x97, 0xcb, 0xac,
+ 0xe5, 0x74, 0x2b, 0x2f, 0x2f, 0xbd, 0xe2, 0x89, 0x6e, 0x64, 0xef, 0xf0,
+ 0xb0, 0x1f, 0x70, 0xe1, 0x53, 0x42, 0xbf, 0x77, 0xea, 0x91, 0x40, 0x46,
+ 0x27, 0xdd, 0x87, 0x4d, 0xc9, 0xa8, 0x29, 0x2f, 0x65, 0x6e, 0x71, 0xaa,
+ 0x32, 0xea, 0x98, 0x87, 0x1a, 0xa3, 0x4a, 0x2e, 0xcd, 0x89, 0xda, 0x92,
+ 0x83, 0x5c, 0x67, 0x07, 0xe3, 0xb1, 0xc5, 0x02, 0x91, 0x0c, 0x9f, 0xc0,
+ 0x18, 0x43, 0xb0, 0x0f, 0x51, 0x1f, 0x21, 0x86, 0xcb, 0x0d, 0x93, 0x5c,
+ 0x7e, 0x95, 0x1c, 0xe7, 0xcb, 0xb9, 0x39, 0x2f, 0x46, 0xe1, 0x9d, 0x52,
+ 0x7c, 0x98, 0x23, 0xb0, 0x5d, 0xc6, 0x03, 0x20, 0xb9, 0x28, 0x52, 0xd8,
+ 0x6c, 0xf0, 0x1f, 0x0a, 0x7e, 0xc6, 0x5a, 0xca, 0x92, 0x6a, 0xd4, 0xda,
+ 0x03, 0xec, 0x1f, 0x44, 0x7d, 0x3f, 0x6b, 0xe3, 0xe3, 0xf3, 0xa3, 0xe4,
+ 0xe0, 0xfd, 0xf9, 0xb7, 0x6b, 0x4c, 0xe0, 0x2e, 0xf4, 0x11, 0x3c, 0xf5,
+ 0x46, 0xe1, 0xcd, 0x24, 0x6d, 0xda, 0x16, 0x53, 0x73, 0xe9, 0x62, 0x44,
+ 0x53, 0xf2, 0xbe, 0x39, 0x5a, 0xb1, 0x4b, 0x4f, 0x47, 0x4f, 0xbb, 0xbb,
+ 0xd4, 0xdf, 0xca, 0x43, 0xba, 0x31, 0xf0, 0xce, 0x30, 0xed, 0x84, 0xe3,
+ 0xa5, 0xcd, 0x03, 0x25, 0x4e, 0x6d, 0xb9, 0x06, 0x73, 0x92, 0xd6, 0x0c,
+ 0xbb, 0x3f, 0x82, 0x84, 0x6a, 0x61, 0x61, 0x6d, 0x34, 0x1c, 0x6d, 0x2d,
+ 0x2c, 0x72, 0x9c, 0x38, 0x79, 0x39, 0x0e, 0x6a, 0x76, 0x2c, 0xad, 0xa6,
+ 0x16, 0x13, 0x20, 0xa2, 0x1f, 0x6a, 0x8a, 0x1f, 0x25, 0x99, 0x1b, 0x16,
+ 0x18, 0x3d, 0x2e, 0xa1, 0xcc, 0xe5, 0xf1, 0xc5, 0x1b, 0x8d, 0xc0, 0x79,
+ 0x8e, 0x56, 0x76, 0xb6, 0xc7, 0xc5, 0xca, 0xac, 0xc7, 0x78, 0x33, 0x0b,
+ 0xa2, 0xab, 0x24, 0x8a, 0xbc, 0xe4, 0xff, 0xc6, 0xf9, 0x9d, 0xae, 0xdc,
+ 0xaa, 0x9c, 0xb1, 0x07, 0x51, 0x5e, 0xe0, 0xe4, 0x4d, 0xae, 0x75, 0xb4,
+ 0x35, 0x78, 0x29, 0xa2, 0x9f, 0x30, 0x4f, 0x4a, 0x6c, 0x43, 0xd8, 0x97,
+ 0x74, 0x63, 0xbc, 0x99, 0x58, 0x57, 0xeb, 0x39, 0x62, 0x89, 0x18, 0x2f,
+ 0x52, 0xc4, 0x1a, 0x80, 0x0c, 0x07, 0x91, 0x0a, 0x62, 0x67, 0x77, 0x7a,
+ 0x43, 0x8b, 0x09, 0x82, 0x7a, 0x72, 0x3b, 0xed, 0xc1, 0x1d, 0xa5, 0x25,
+ 0x20, 0x77, 0xcc, 0x96, 0x22, 0x1c, 0xfe, 0xf0, 0xca, 0x6b, 0x45, 0xa8,
+ 0xc9, 0x69, 0x09, 0x33, 0x8b, 0xe4, 0x92, 0xf7, 0x41, 0x05, 0x7b, 0x90,
+ 0xa7, 0x68, 0x00, 0x4c, 0xd1, 0xd4, 0x69, 0x96, 0x2d, 0x6c, 0xd7, 0x97,
+ 0x1c, 0x35, 0x96, 0x48, 0xce, 0x31, 0xe7, 0x94, 0x7b, 0xee, 0xcc, 0x43,
+ 0xcf, 0x92, 0xd5, 0x7a, 0x58, 0x72, 0x38, 0x3c, 0x2a, 0xea, 0xad, 0x4a,
+ 0xb1, 0xdb, 0x9d, 0xe7, 0x7b, 0x9f, 0x9b, 0x8b, 0xf9, 0x1e, 0xc9, 0xdf,
+ 0x2d, 0x7c, 0x7a, 0xc6, 0x75, 0xef, 0xc7, 0x6c, 0x15, 0xab, 0x46, 0x53,
+ 0x7a, 0x05, 0x4c, 0x27, 0xa9, 0xc9, 0x8c, 0x80, 0x83, 0x4a, 0xa0, 0x2d,
+ 0x42, 0x10, 0x32, 0x43, 0x44, 0xf5, 0xf6, 0x80, 0x62, 0xe8, 0xe7, 0x49,
+ 0xd4, 0xe2, 0xcc, 0xb0, 0x91, 0xc7, 0xc3, 0x46, 0xb9, 0xa3, 0x66, 0xb3,
+ 0x83, 0xe4, 0xdd, 0xd1, 0xf9, 0xbb, 0x41, 0x32, 0x3e, 0x3f, 0x7d, 0xd7,
+ 0x83, 0xb2, 0xdb, 0x30, 0x48, 0x13, 0xd1, 0x4c, 0xd3, 0x54, 0xf8, 0x54,
+ 0xb6, 0x10, 0x38, 0x91, 0x01, 0xcd, 0x82, 0xa7, 0x8e, 0x82, 0x36, 0x7a,
+ 0xd8, 0x8d, 0x1e, 0xb5, 0xc0, 0x36, 0xe6, 0x7e, 0x58, 0xb9, 0x30, 0xde,
+ 0xf6, 0x47, 0x70, 0x08, 0xf1, 0x22, 0x2d, 0xd7, 0x8a, 0x79, 0xcc, 0xd6,
+ 0x58, 0x6c, 0xe4, 0xfa, 0x77, 0x0d, 0x7e, 0xb4, 0x24, 0xa4, 0x07, 0x99,
+ 0x96, 0x53, 0x72, 0x6b, 0x97, 0x32, 0x6c, 0x58, 0x6e, 0x4d, 0x51, 0x60,
+ 0xa8, 0x15, 0x07, 0xbc, 0xc7, 0x0e, 0x6b, 0xed, 0x01, 0xfe, 0x35, 0xba,
+ 0xd0, 0xe6, 0xc8, 0x4b, 0xe0, 0x49, 0xea, 0x72, 0x9e, 0xb1, 0x9b, 0x1f,
+ 0x8e, 0x20, 0x95, 0x4f, 0xdc, 0xe3, 0x1a, 0x20, 0xe3, 0x31, 0x34, 0x24,
+ 0x0b, 0x07, 0x49, 0xbb, 0xbc, 0x6e, 0xe1, 0x64, 0xb4, 0x0e, 0x81, 0xf7,
+ 0x25, 0x33, 0x66, 0x6a, 0x03, 0x9c, 0xcd, 0x75, 0x9d, 0x95, 0x87, 0x13,
+ 0xd9, 0x16, 0xde, 0x3b, 0x5d, 0x21, 0x43, 0x90, 0x3c, 0x51, 0xc9, 0x42,
+ 0x09, 0x2a, 0x2d, 0x20, 0x20, 0xad, 0x81, 0x82, 0x2a, 0xe1, 0xf7, 0x57,
+ 0x3f, 0x93, 0xa7, 0x34, 0x12, 0x1e, 0x76, 0xe3, 0x20, 0x31, 0x30, 0x73,
+ 0xe5, 0xbc, 0xba, 0xe7, 0x1c, 0xa1, 0x59, 0x76, 0xa5, 0x6e, 0x07, 0xdf,
+ 0xa6, 0x07, 0x4d, 0xcc, 0xef, 0x3a, 0xdd, 0xc6, 0x6a, 0x59, 0xd9, 0x17,
+ 0xf5, 0x41, 0xe5, 0x85, 0x33, 0xac, 0xd4, 0x77, 0x89, 0x94, 0x60, 0xe0,
+ 0xfc, 0xc5, 0xa1, 0xd3, 0x92, 0xe4, 0x7d, 0xc1, 0xb0, 0x42, 0xec, 0x49,
+ 0x2a, 0x90, 0xf8, 0x30, 0xb5, 0x94, 0x23, 0x30, 0x3d, 0x4a, 0xd8, 0xc2,
+ 0xbd, 0x35, 0x2d, 0xa1, 0xd0, 0xd3, 0xa2, 0x43, 0x00, 0x57, 0x38, 0x91,
+ 0x91, 0x47, 0xa0, 0x37, 0x8d, 0x0c, 0x26, 0xe1, 0x2b, 0x2e, 0xee, 0xea,
+ 0xac, 0x14, 0x18, 0x3f, 0xc1, 0x42, 0xcf, 0xfc, 0x6d, 0x63, 0x89, 0x06,
+ 0xfb, 0xc7, 0x09, 0x82, 0x86, 0xa1, 0x76, 0x5a, 0x88, 0x49, 0xb2, 0xda,
+ 0x68, 0x8e, 0x78, 0x21, 0x78, 0x46, 0xcb, 0x62, 0x46, 0xe9, 0xe1, 0x6d,
+ 0xa0, 0x20, 0xa5, 0xe4, 0xa8, 0xff, 0x96, 0x6b, 0xe1, 0x0a, 0xb5, 0x58,
+ 0xb2, 0x8d, 0xd6, 0xd2, 0x5e, 0x5d, 0x2f, 0xee, 0x03, 0x2b, 0x14, 0xef,
+ 0x68, 0xe3, 0x90, 0x8f, 0xd3, 0x2a, 0x16, 0xcf, 0x8b, 0x9c, 0xa0, 0xe4,
+ 0xca, 0x6a, 0x8b, 0xca, 0x14, 0x09, 0x82, 0x35, 0x31, 0x37, 0xa4, 0x66,
+ 0xa2, 0x46, 0x1c, 0x1c, 0xaa, 0xcb, 0x41, 0x80, 0x98, 0xa1, 0x47, 0x91,
+ 0xda, 0x40, 0x01, 0xd8, 0xb7, 0x98, 0x5a, 0xa0, 0xed, 0x28, 0x89, 0xf5,
+ 0xcb, 0x95, 0x5c, 0x10, 0xe4, 0x3a, 0xb6, 0x35, 0x32, 0x6d, 0xde, 0xae,
+ 0x7d, 0xd7, 0x5c, 0x2b, 0x9b, 0xf5, 0xba, 0xb7, 0x92, 0x5b, 0x9b, 0xde,
+ 0x41, 0xcd, 0x37, 0x54, 0x91, 0xac, 0x90, 0xf6, 0xd9, 0x84, 0xe5, 0xd0,
+ 0xfe, 0x58, 0x9d, 0x35, 0xcb, 0x45, 0x78, 0xcf, 0x1f, 0x9f, 0xb9, 0x21,
+ 0x05, 0xba, 0x9d, 0x48, 0x2d, 0x51, 0x51, 0x6f, 0x92, 0x04, 0xab, 0x63,
+ 0x37, 0xc0, 0x5d, 0xfd, 0xdd, 0xd3, 0x08, 0x45, 0x20, 0xb8, 0xdd, 0xfb,
+ 0x70, 0x60, 0xf4, 0x7a, 0x19, 0x5d, 0x8d, 0x92, 0x35, 0xa3, 0x5d, 0x6c,
+ 0xa3, 0x89, 0xb9, 0x36, 0xab, 0x92, 0x7a, 0x27, 0x7d, 0xd7, 0x10, 0xa5,
+ 0x35, 0xdb, 0xf0, 0xcc, 0x68, 0x1d, 0x8a, 0x94, 0xac, 0xd3, 0xfe, 0x6c,
+ 0xbc, 0xa7, 0x9e, 0x64, 0x74, 0x86, 0x37, 0x3f, 0x0b, 0x97, 0x2e, 0x63,
+ 0xad, 0x9a, 0xd5, 0xce, 0x8b, 0xdd, 0xd1, 0xce, 0xb3, 0xcf, 0x47, 0x3b,
+ 0xdb, 0xa3, 0x9d, 0xd6, 0xec, 0xb8, 0x0c, 0x93, 0xba, 0xd1, 0x7b, 0x03,
+ 0x75, 0x9d, 0xc5, 0x94, 0xc7, 0xd3, 0x8f, 0xce, 0xce, 0x5f, 0x98, 0xdf,
+ 0x8f, 0xe8, 0xb9, 0x11, 0x37, 0x1c, 0x0c, 0xbe, 0x31, 0x37, 0x6a, 0x4d,
+ 0x5e, 0x04, 0x71, 0x90, 0xa1, 0xcb, 0x26, 0xd2, 0xeb, 0x7e, 0x91, 0x13,
+ 0x1f, 0x29, 0x66, 0xb2, 0x9b, 0x95, 0xc4, 0xd2, 0x5c, 0xf7, 0x37, 0x3a,
+ 0x9d, 0xf1, 0x19, 0xa9, 0x50, 0x9f, 0x88, 0x1e, 0xe9, 0xe4, 0xba, 0xfd,
+ 0xfe, 0x3f, 0x60, 0xf3, 0xa9, 0x8c, 0x7c, 0x95, 0x3b, 0xef, 0x05, 0x7b,
+ 0xa6, 0xd4, 0x26, 0x81, 0xcf, 0x1d, 0x18, 0x7f, 0x5d, 0x98, 0x38, 0x41,
+ 0xfd, 0x62, 0xf1, 0xd7, 0x01, 0x5a, 0xf3, 0x2e, 0x99, 0x23, 0x0f, 0xd6,
+ 0xd1, 0x4f, 0x42, 0xc2, 0x98, 0x9a, 0x82, 0xd4, 0x45, 0xf2, 0x93, 0xd7,
+ 0x70, 0x61, 0xb1, 0x84, 0xd6, 0xe1, 0xe8, 0xb5, 0x3f, 0xfc, 0xc1, 0x49,
+ 0xa4, 0x31, 0x92, 0x5f, 0xb8, 0x33, 0xd9, 0xd3, 0x01, 0x43, 0x2d, 0x23,
+ 0xe0, 0xc5, 0x3d, 0x5e, 0xd6, 0xf6, 0xff, 0x0c, 0xdf, 0xf0, 0xcf, 0xc3,
+ 0x3f, 0x9b, 0x7f, 0xfe, 0xbc, 0xa6, 0xa7, 0x9a, 0x91, 0x19, 0xb5, 0x4c,
+ 0xc4, 0xe1, 0xde, 0x62, 0x7b, 0x06, 0x16, 0xab, 0x96, 0x05, 0x32, 0x6d,
+ 0xd6, 0xf9, 0xe1, 0x19, 0x1f, 0xc4, 0x8a, 0x63, 0xde, 0x58, 0x27, 0x09,
+ 0x22, 0xa8, 0xf5, 0x24, 0xc1, 0x19, 0xe4, 0x99, 0xf9, 0xc4, 0xd2, 0xd2,
+ 0x7b, 0x67, 0xe0, 0x52, 0x1a, 0x6e, 0x59, 0x02, 0xa4, 0x46, 0xbd, 0xbd,
+ 0x22, 0xff, 0x0a, 0x03, 0x92, 0x8c, 0xa8, 0xda, 0x90, 0x75, 0x69, 0xfe,
+ 0x01, 0x40, 0x1d, 0x0d, 0x93, 0xd8, 0xe3, 0x70, 0x6b, 0xe6, 0x34, 0x10,
+ 0x24, 0x73, 0x2e, 0x89, 0x68, 0x14, 0x41, 0xb7, 0x20, 0x3b, 0x45, 0xa1,
+ 0xdc, 0xab, 0xbc, 0xfe, 0x48, 0x8b, 0x93, 0xea, 0x1e, 0x2f, 0x43, 0x08,
+ 0xf3, 0xf9, 0xcc, 0x6a, 0x7d, 0xf7, 0x8a, 0x58, 0x66, 0xcb, 0xb6, 0x3d,
+ 0xca, 0xba, 0xdb, 0x41, 0xf7, 0x5c, 0x91, 0x6d, 0xa2, 0xa0, 0x8b, 0xf2,
+ 0x58, 0x95, 0xc5, 0xb1, 0x40, 0x3b, 0x69, 0x6a, 0x52, 0x4b, 0x79, 0x66,
+ 0x14, 0x5d, 0xcb, 0x1d, 0x1e, 0x32, 0x5f, 0xb2, 0x41, 0x3f, 0xa0, 0xdb,
+ 0x6f, 0xb3, 0x7b, 0x6b, 0x51, 0xbb, 0xbd, 0x34, 0xf7, 0xfd, 0x32, 0x28,
+ 0xa5, 0xce, 0x49, 0x2b, 0x98, 0x56, 0x66, 0x0e, 0xdc, 0x70, 0x00, 0xc0,
+ 0x2c, 0x8a, 0x00, 0x44, 0x81, 0x5e, 0xd5, 0xe8, 0x3e, 0x8b, 0xda, 0x0a,
+ 0x92, 0x97, 0xec, 0xd4, 0x51, 0xd4, 0xd0, 0xb3, 0x2b, 0xb6, 0x06, 0xe1,
+ 0xe9, 0xbf, 0x10, 0xd8, 0x54, 0x97, 0x73, 0x5b, 0x90, 0x6b, 0xa9, 0x0e,
+ 0x0d, 0x1a, 0x4c, 0x7e, 0x1e, 0x83, 0x5b, 0xf7, 0x2e, 0xd5, 0xdd, 0xed,
+ 0xd0, 0x95, 0x52, 0x7f, 0xcc, 0x99, 0xc8, 0xc3, 0x7c, 0xf1, 0x30, 0x98,
+ 0x2a, 0x6d, 0x9b, 0x42, 0xc8, 0xb7, 0xe4, 0x8a, 0xbd, 0x61, 0xea, 0xe5,
+ 0xd5, 0x15, 0x40, 0x91, 0xc2, 0x8c, 0x3c, 0xae, 0x53, 0x94, 0x8a, 0x01,
+ 0x69, 0x4e, 0x63, 0x64, 0x39, 0xa6, 0xae, 0xe4, 0x70, 0x15, 0x91, 0x22,
+ 0x71, 0x1c, 0xca, 0x7f, 0x2f, 0x70, 0xc2, 0x28, 0x39, 0x96, 0xf3, 0xed,
+ 0x14, 0x99, 0x2a, 0x1b, 0xea, 0x3c, 0xbb, 0x42, 0x90, 0x2c, 0xb0, 0xb0,
+ 0x1b, 0x9f, 0x15, 0x88, 0xf5, 0x0a, 0xd9, 0xd7, 0x93, 0xff, 0x2a, 0x12,
+ 0x90, 0x7c, 0x6c, 0x16, 0xd4, 0x90, 0xc2, 0x48, 0x0c, 0xe1, 0xca, 0x18,
+ 0x9c, 0x95, 0x05, 0x35, 0xf4, 0xb1, 0x8b, 0xba, 0xb7, 0xe6, 0x25, 0xa8,
+ 0xb1, 0xca, 0x2f, 0xe0, 0xe4, 0xa0, 0xaf, 0x2d, 0x3d, 0x19, 0xed, 0x06,
+ 0x1b, 0x5b, 0xcf, 0x86, 0x93, 0xc9, 0x64, 0x08, 0x3d, 0xe0, 0x25, 0xab,
+ 0x27, 0x5b, 0xa2, 0x1c, 0xc4, 0x15, 0xa7, 0x71, 0x26, 0xd4, 0x3e, 0x3c,
+ 0x3c, 0x14, 0x3d, 0xe6, 0xfc, 0xba, 0xa3, 0x50, 0x58, 0xb8, 0x41, 0xd1,
+ 0xa6, 0xa2, 0x4d, 0x02, 0xea, 0xeb, 0x65, 0x43, 0xbc, 0xca, 0x32, 0x43,
+ 0x85, 0xaf, 0xad, 0x8d, 0xed, 0xc0, 0x41, 0x97, 0x66, 0x47, 0x06, 0x2e,
+ 0x25, 0xd1, 0x0c, 0x1e, 0x6c, 0xcd, 0x82, 0x9b, 0x59, 0xe1, 0x45, 0x19,
+ 0xbb, 0xdb, 0x82, 0x9e, 0xe7, 0xea, 0x03, 0x37, 0xea, 0x0c, 0xeb, 0x58,
+ 0x1a, 0xaf, 0x8e, 0x82, 0xcf, 0xa6, 0xb9, 0xe4, 0x7f, 0xa5, 0xf2, 0xad,
+ 0xee, 0xd8, 0x0f, 0xec, 0x87, 0x90, 0xba, 0xbd, 0x25, 0xcf, 0x7a, 0xb7,
+ 0x24, 0x2e, 0xa7, 0x80, 0x78, 0x40, 0x94, 0x4f, 0x36, 0x0e, 0x01, 0x27,
+ 0x4d, 0xed, 0x27, 0x70, 0x26, 0x0e, 0xaf, 0x29, 0x87, 0x6b, 0x66, 0x36,
+ 0xc8, 0xcc, 0xba, 0x86, 0x14, 0xc0, 0xe4, 0xc6, 0xe3, 0x93, 0xad, 0xf3,
+ 0x93, 0x71, 0x90, 0xe9, 0x7e, 0x4f, 0x2e, 0x63, 0xb8, 0x86, 0xdb, 0x0e,
+ 0x4f, 0x26, 0x11, 0x80, 0xfe, 0xe5, 0x06, 0xb2, 0x1c, 0xce, 0x5f, 0x88,
+ 0xa2, 0x5d, 0x2d, 0x0b, 0x2d, 0x82, 0x71, 0x2e, 0xdb, 0x22, 0x2b, 0x00,
+ 0x22, 0xa2, 0xbd, 0x70, 0xb5, 0xdd, 0xe3, 0xdb, 0x83, 0x73, 0xaa, 0x6b,
+ 0x69, 0x24, 0xcf, 0xe3, 0xb2, 0x9c, 0x85, 0x9e, 0xf1, 0x5b, 0x8b, 0x49,
+ 0x83, 0xa8, 0x4d, 0x3a, 0x71, 0x8d, 0xad, 0x54, 0x53, 0xe7, 0xed, 0xab,
+ 0x95, 0xf3, 0x56, 0x91, 0x9f, 0xda, 0x28, 0xf2, 0xed, 0xd0, 0xe5, 0xf9,
+ 0xee, 0x6e, 0xec, 0x44, 0x77, 0x83, 0x09, 0x10, 0xdd, 0x91, 0x77, 0x22,
+ 0xcb, 0x85, 0xcc, 0x96, 0x75, 0xe1, 0xbb, 0x9c, 0x95, 0x57, 0xb9, 0xe1,
+ 0x6f, 0x41, 0xfe, 0x96, 0xe2, 0x12, 0x89, 0x42, 0x05, 0x6e, 0x52, 0x26,
+ 0x0e, 0xd5, 0x5e, 0x2f, 0x01, 0x01, 0xd1, 0x02, 0x2f, 0xe7, 0x43, 0x42,
+ 0x37, 0x85, 0x25, 0xaa, 0x34, 0x35, 0xd1, 0xd2, 0xc7, 0xb0, 0xb2, 0x90,
+ 0x64, 0x4c, 0x3e, 0x31, 0x06, 0xc2, 0xe4, 0x7e, 0xc4, 0x35, 0x80, 0x75,
+ 0x3b, 0xb1, 0x36, 0x6f, 0x41, 0x10, 0x5b, 0x07, 0x29, 0x45, 0xed, 0xa3,
+ 0xc5, 0x3f, 0xb2, 0xc6, 0x95, 0x7e, 0xf8, 0x67, 0xad, 0xcb, 0xe3, 0x1b,
+ 0xb2, 0xc8, 0xae, 0x82, 0x4b, 0xd7, 0x61, 0x10, 0x0d, 0xba, 0x78, 0xe4,
+ 0xae, 0xfb, 0x10, 0xb9, 0x86, 0xb8, 0x55, 0x5d, 0xa7, 0x7d, 0xfd, 0x74,
+ 0x10, 0xed, 0xad, 0x32, 0xe8, 0xb6, 0x2b, 0xa9, 0xc2, 0x26, 0x05, 0x2d,
+ 0x5c, 0x38, 0x0b, 0x3e, 0xd5, 0x19, 0xee, 0x9b, 0x23, 0xaf, 0x0b, 0x4e,
+ 0x07, 0x3e, 0x0e, 0x25, 0x1b, 0xfa, 0x3b, 0xce, 0xc7, 0xa1, 0x20, 0xd4,
+ 0x2d, 0xb5, 0xa8, 0xbf, 0x8d, 0x1b, 0x39, 0xac, 0xc5, 0x9e, 0xbb, 0xce,
+ 0x1a, 0x7c, 0x3c, 0x58, 0x07, 0xcc, 0x6c, 0x96, 0x2a, 0x01, 0x8f, 0x69,
+ 0x80, 0xfe, 0xdf, 0xd6, 0x5d, 0xa7, 0xb7, 0x51, 0xe8, 0x87, 0x70, 0xed,
+ 0xad, 0x3b, 0xc0, 0xf1, 0x2e, 0xf6, 0x34, 0x70, 0xb3, 0xe5, 0x70, 0xa5,
+ 0x54, 0x7b, 0x87, 0xf1, 0x79, 0xac, 0x6e, 0xf5, 0x7c, 0xbe, 0x3d, 0x3a,
+ 0x78, 0xd5, 0x8b, 0x5e, 0xf2, 0x29, 0x20, 0xe5, 0xad, 0xaf, 0xef, 0x22,
+ 0xe3, 0x86, 0x3e, 0x4b, 0x71, 0x93, 0xa4, 0xd8, 0x1c, 0x65, 0x54, 0x86,
+ 0xa8, 0xc9, 0x80, 0xd9, 0x82, 0xbe, 0x85, 0xbd, 0x8d, 0x6d, 0x7a, 0x3d,
+ 0x23, 0x7e, 0xf6, 0x81, 0x38, 0xac, 0x49, 0x55, 0xe6, 0x9a, 0x2a, 0x8f,
+ 0x91, 0xaf, 0xc0, 0xc8, 0xb3, 0xf2, 0xa2, 0xbc, 0xbc, 0x5c, 0x11, 0x15,
+ 0x64, 0x70, 0x60, 0xd4, 0x3e, 0x31, 0xbf, 0xac, 0x11, 0x19, 0xe9, 0xbd,
+ 0x0b, 0x06, 0x8f, 0xae, 0xcc, 0x61, 0x5b, 0x93, 0x64, 0x2c, 0x34, 0x2c,
+ 0x0d, 0xce, 0x46, 0x2b, 0x80, 0xa0, 0x06, 0x83, 0x5a, 0x78, 0xa8, 0xc6,
+ 0x67, 0x6f, 0x8c, 0x66, 0x09, 0xd9, 0x1e, 0x2d, 0x86, 0xea, 0xff, 0xf9,
+ 0xf7, 0x3f, 0xff, 0x1c, 0xe9, 0x54, 0x83, 0x56, 0x8e, 0xd7, 0x5c, 0x52,
+ 0x88, 0x2e, 0xc1, 0x0c, 0xda, 0x65, 0x7b, 0x82, 0x70, 0xa6, 0x09, 0x07,
+ 0x34, 0x9a, 0x3a, 0x9b, 0x5d, 0x7a, 0x78, 0x4b, 0xe1, 0xb5, 0x58, 0xbb,
+ 0x0f, 0xa2, 0xf1, 0x28, 0x55, 0x80, 0x73, 0xc9, 0x2e, 0x75, 0x6c, 0x40,
+ 0xb7, 0x37, 0x97, 0x2f, 0x6d, 0x61, 0xdd, 0x65, 0x27, 0x02, 0xf4, 0x30,
+ 0xd7, 0x92, 0xcd, 0xaf, 0x64, 0x62, 0x06, 0x3c, 0xb6, 0x8e, 0x4e, 0x5f,
+ 0x2a, 0x5f, 0x1b, 0x4e, 0xbd, 0x1f, 0x66, 0xf7, 0xd9, 0x85, 0x91, 0x10,
+ 0xb5, 0x02, 0x3e, 0x0c, 0xe7, 0x75, 0xf2, 0x72, 0x6e, 0x98, 0x3c, 0xef,
+ 0x81, 0xea, 0xf8, 0x96, 0x5e, 0x33, 0x46, 0xb4, 0xbc, 0x67, 0xe1, 0xab,
+ 0xb5, 0x35, 0x34, 0x97, 0xe1, 0x4a, 0x29, 0x72, 0xdb, 0x95, 0x81, 0xc2,
+ 0x92, 0xc0, 0x1d, 0x40, 0xf8, 0xa9, 0x54, 0x4e, 0xe5, 0x01, 0x71, 0x8a,
+ 0x5a, 0x38, 0x5d, 0x1a, 0xcd, 0xd1, 0x4c, 0xdd, 0xd8, 0xd7, 0xb0, 0xe9,
+ 0xc9, 0x2f, 0xc8, 0x1c, 0xc5, 0x45, 0x86, 0xf4, 0x4a, 0x14, 0x3e, 0x40,
+ 0x2f, 0x0f, 0xb1, 0xb0, 0x8c, 0xcc, 0xf1, 0x57, 0x34, 0x52, 0xcc, 0x78,
+ 0xff, 0x93, 0x82, 0x88, 0x12, 0xd2, 0x55, 0xa6, 0xcf, 0x07, 0xda, 0xa6,
+ 0xae, 0x52, 0x91, 0x06, 0xa5, 0xec, 0x34, 0xdc, 0x94, 0xcb, 0xd3, 0x5a,
+ 0xbd, 0xc6, 0x03, 0xc1, 0xa1, 0x44, 0x03, 0x77, 0xd9, 0x16, 0x1f, 0x38,
+ 0x16, 0xe5, 0x87, 0x29, 0x55, 0x43, 0x66, 0x33, 0x16, 0x71, 0x92, 0x57,
+ 0xe5, 0x46, 0x85, 0xc4, 0xed, 0x02, 0xb4, 0x68, 0x67, 0xec, 0x4c, 0x2b,
+ 0xe3, 0x21, 0x0b, 0xd4, 0xef, 0x10, 0x8d, 0xf5, 0x9e, 0x33, 0x52, 0xda,
+ 0x15, 0x22, 0x47, 0x62, 0x3e, 0x00, 0x2b, 0x1f, 0x6d, 0x20, 0x19, 0x7e,
+ 0x84, 0x5e, 0x46, 0x76, 0x05, 0x89, 0x10, 0xd9, 0xef, 0x23, 0xd9, 0xef,
+ 0xce, 0x70, 0x14, 0x6e, 0x49, 0x9e, 0x3d, 0x7d, 0xfa, 0x34, 0xe1, 0x80,
+ 0x4b, 0xb2, 0x76, 0xcc, 0xf8, 0x6c, 0xef, 0x8e, 0x0e, 0x4f, 0xdf, 0xbc,
+ 0x39, 0x7a, 0xfb, 0xea, 0xe8, 0x95, 0x3d, 0x68, 0xba, 0x16, 0xcb, 0x1d,
+ 0xc1, 0x8a, 0x28, 0x4f, 0x70, 0x9a, 0xec, 0x3c, 0xdd, 0x1e, 0xee, 0x3e,
+ 0xdd, 0x4e, 0x0c, 0x2b, 0xa6, 0xb6, 0x3c, 0x2d, 0x9d, 0xa5, 0x64, 0xdf,
+ 0x5e, 0x2f, 0x8d, 0x96, 0x46, 0xb8, 0xce, 0x0d, 0xe1, 0x6c, 0xc0, 0xf3,
+ 0x4a, 0xce, 0xe1, 0x22, 0x6b, 0xc8, 0x8e, 0x8e, 0x64, 0x06, 0x8c, 0xd6,
+ 0x12, 0x0b, 0xd2, 0xe9, 0x42, 0x96, 0xa2, 0xfc, 0x80, 0x41, 0x77, 0xb7,
+ 0xe9, 0x53, 0xa3, 0xe4, 0xb5, 0xd1, 0x3f, 0x2e, 0xcb, 0xbb, 0x84, 0xb5,
+ 0x40, 0xa3, 0x94, 0x66, 0x61, 0xa8, 0xb2, 0xfd, 0x3a, 0xbd, 0xbd, 0xc7,
+ 0x6f, 0xff, 0x13, 0x63, 0xf4, 0x4f, 0x5f, 0xb4, 0x0d, 0x4b, 0x73, 0x90,
+ 0xd1, 0x13, 0x44, 0x6b, 0x11, 0xe3, 0xe0, 0x05, 0x63, 0xb6, 0xc5, 0xbf,
+ 0x3d, 0x38, 0xa3, 0x87, 0x8d, 0x4d, 0x7e, 0xfa, 0xe3, 0x9f, 0x5c, 0x6d,
+ 0xe7, 0xcd, 0x8e, 0x26, 0x33, 0x4a, 0x09, 0x2b, 0x37, 0x55, 0x2d, 0xc2,
+ 0xa0, 0xb7, 0xc5, 0x88, 0xf3, 0x4d, 0x42, 0xbd, 0x67, 0xb0, 0x46, 0xca,
+ 0x41, 0x35, 0xc4, 0xe3, 0x8e, 0x87, 0xb2, 0x6f, 0x55, 0x2d, 0x45, 0x44,
+ 0x61, 0x3d, 0x7f, 0x55, 0xa3, 0x1b, 0xfb, 0x5d, 0xce, 0x0d, 0x7f, 0xf2,
+ 0x62, 0x8a, 0xf0, 0x77, 0xdb, 0x2f, 0xdb, 0x54, 0xcb, 0x96, 0x59, 0xa9,
+ 0x7e, 0xd8, 0xd1, 0x6a, 0x98, 0x8d, 0x45, 0x95, 0xcf, 0xd3, 0x2a, 0x9f,
+ 0xdd, 0x2b, 0x83, 0xdf, 0x72, 0xdb, 0x63, 0xce, 0x94, 0x42, 0xe8, 0xcb,
+ 0xe2, 0x0a, 0x53, 0x0e, 0x41, 0x1a, 0xa9, 0xbf, 0xc9, 0x27, 0x72, 0xa4,
+ 0x04, 0xfb, 0x8b, 0xf7, 0x95, 0xa9, 0xb5, 0x12, 0x0d, 0xa9, 0x6d, 0xff,
+ 0x5b, 0x95, 0x22, 0x5a, 0x7a, 0x4b, 0x6a, 0xee, 0xeb, 0xe3, 0x93, 0xa3,
+ 0xcd, 0xe4, 0x75, 0xd6, 0x48, 0x75, 0x93, 0x26, 0x19, 0xd3, 0x75, 0xff,
+ 0x2f, 0x50, 0xb0, 0x2c, 0x24, 0xad, 0xd4, 0x06, 0x47, 0x73, 0xc1, 0xd8,
+ 0x8c, 0x81, 0xae, 0xa1, 0x95, 0x52, 0xbc, 0x33, 0x58, 0x22, 0x85, 0xe3,
+ 0x34, 0xb5, 0x4c, 0xc3, 0x9b, 0xb2, 0xf3, 0xb1, 0xbc, 0x5b, 0x45, 0x78,
+ 0x18, 0xb5, 0x01, 0x2f, 0xcb, 0xc2, 0x4b, 0x21, 0xa0, 0x79, 0x4b, 0xde,
+ 0x33, 0xc7, 0x03, 0xf3, 0x7a, 0x31, 0x23, 0x61, 0x10, 0x43, 0x77, 0x99,
+ 0x65, 0xae, 0xa2, 0x0f, 0x9c, 0x6f, 0xac, 0x07, 0x9b, 0x88, 0xc9, 0x32,
+ 0x95, 0xd6, 0xeb, 0x11, 0xee, 0x5b, 0x25, 0x1c, 0xa5, 0x9d, 0xf0, 0x7f,
+ 0xb7, 0xbe, 0x5a, 0x81, 0x95, 0x76, 0x84, 0xf6, 0xe7, 0xf2, 0x02, 0x18,
+ 0x0a, 0x0d, 0x59, 0x35, 0x95, 0x49, 0x95, 0xce, 0x16, 0x27, 0xc4, 0xd4,
+ 0x57, 0xf0, 0x83, 0x0b, 0xc5, 0xff, 0x49, 0xba, 0xee, 0xa9, 0x0a, 0x41,
+ 0xc5, 0xdf, 0xee, 0x7e, 0xc9, 0xbc, 0x8f, 0xd6, 0xd1, 0xf6, 0x96, 0x5a,
+ 0x59, 0x01, 0x6d, 0x85, 0xb5, 0x29, 0xca, 0xd7, 0x4f, 0xdb, 0x19, 0xfb,
+ 0xfc, 0xd8, 0xb5, 0x34, 0x2e, 0x80, 0x33, 0x85, 0xcb, 0xc7, 0xea, 0x88,
+ 0xcb, 0xdf, 0x9d, 0x45, 0x17, 0xdd, 0x43, 0x8b, 0x6c, 0xf6, 0xcc, 0x68,
+ 0xea, 0xc1, 0x40, 0x6a, 0xbb, 0xee, 0xf8, 0x99, 0xd9, 0x7d, 0x44, 0x5b,
+ 0x92, 0xaf, 0xfb, 0x22, 0xa8, 0xab, 0xb2, 0xdb, 0x6f, 0x94, 0x16, 0x34,
+ 0x47, 0x0c, 0xd1, 0x50, 0x5d, 0x24, 0xda, 0xb1, 0x8f, 0x3c, 0x43, 0x87,
+ 0xd3, 0xa6, 0xca, 0x27, 0x1f, 0x01, 0x88, 0x56, 0x37, 0x4b, 0xa8, 0x74,
+ 0x69, 0xe1, 0xcf, 0xd2, 0x36, 0xfa, 0x98, 0x96, 0xa0, 0x74, 0x5c, 0xfb,
+ 0x24, 0x15, 0x89, 0x5c, 0x06, 0x84, 0xbf, 0xad, 0xb3, 0xe1, 0xd5, 0xd8,
+ 0xb3, 0x62, 0xd5, 0x34, 0x2a, 0x83, 0xc4, 0xce, 0x2e, 0x22, 0x5d, 0x01,
+ 0xcc, 0x31, 0x26, 0x00, 0x0e, 0xf2, 0xb5, 0xdd, 0x0a, 0xb4, 0xd8, 0x7a,
+ 0x95, 0x71, 0x67, 0x92, 0x91, 0x31, 0x45, 0xe7, 0x54, 0x11, 0x80, 0x34,
+ 0x5b, 0x59, 0xb2, 0x90, 0xc7, 0x48, 0xb6, 0xab, 0xfc, 0x26, 0x9a, 0x65,
+ 0xa1, 0x13, 0x9b, 0x33, 0xde, 0x05, 0xcf, 0x42, 0x53, 0x8e, 0x15, 0xeb,
+ 0x28, 0x11, 0x97, 0x74, 0x42, 0x50, 0x70, 0x76, 0xfb, 0x82, 0x13, 0x3c,
+ 0x23, 0x95, 0x95, 0x80, 0xbc, 0x0a, 0x6e, 0xb6, 0xfe, 0xad, 0xd1, 0x7d,
+ 0xf6, 0xd7, 0x6c, 0x3f, 0x0d, 0x49, 0x8a, 0xca, 0x3a, 0x9c, 0x03, 0x23,
+ 0xa3, 0x28, 0x87, 0xd1, 0x1e, 0x92, 0xac, 0xb8, 0x37, 0x2a, 0xb7, 0x6c,
+ 0xbd, 0x4d, 0x98, 0xd5, 0x6c, 0xeb, 0x5f, 0x06, 0x80, 0x36, 0xb9, 0x0e,
+ 0xab, 0xfc, 0x68, 0x4a, 0x3f, 0x0e, 0x0f, 0xf1, 0xf1, 0xe1, 0xb7, 0x18,
+ 0xef, 0x8f, 0x6b, 0xd6, 0xdd, 0xdb, 0xfd, 0xd5, 0x7e, 0xd8, 0xf4, 0x7d,
+ 0xe2, 0xb5, 0x78, 0x61, 0x2e, 0x01, 0x3e, 0xa6, 0x48, 0xd9, 0xd4, 0x21,
+ 0x6f, 0x02, 0xf2, 0x6d, 0x3a, 0xdd, 0xb2, 0x9b, 0xce, 0xa9, 0x73, 0x7d,
+ 0xdd, 0xc6, 0xcd, 0x2d, 0xb2, 0x00, 0x8a, 0xce, 0x74, 0x58, 0x5e, 0x0e,
+ 0x91, 0x21, 0x4d, 0x90, 0x79, 0x94, 0x8d, 0xe4, 0x9d, 0x3a, 0x00, 0x83,
+ 0x00, 0xfd, 0x74, 0x3a, 0x8d, 0xa9, 0xe6, 0x69, 0x2d, 0x75, 0xc4, 0xca,
+ 0xf8, 0x5a, 0x68, 0xc1, 0x9b, 0xb9, 0x2f, 0x6e, 0x79, 0xbc, 0xae, 0xbd,
+ 0x78, 0x49, 0x0c, 0x6a, 0x41, 0x44, 0xe0, 0x4f, 0x43, 0x79, 0xc4, 0x80,
+ 0xd5, 0x77, 0x2c, 0x1a, 0xf6, 0xdb, 0x9c, 0x5d, 0xb9, 0x70, 0x3e, 0x2f,
+ 0x17, 0x50, 0x59, 0x09, 0xad, 0x39, 0xf0, 0xbe, 0x68, 0x91, 0x08, 0x5f,
+ 0xfd, 0x4f, 0x47, 0xdb, 0x83, 0x20, 0x4a, 0xdf, 0xc0, 0xcc, 0x2f, 0x5c,
+ 0x8a, 0x10, 0x12, 0x24, 0x20, 0x23, 0x87, 0xb1, 0xaa, 0x5a, 0x73, 0x08,
+ 0xef, 0x49, 0x5a, 0xdb, 0x42, 0x5a, 0xe4, 0x16, 0xbb, 0xc2, 0x07, 0x97,
+ 0xd7, 0x03, 0x1a, 0x8a, 0xe0, 0x44, 0xf5, 0x6c, 0x0c, 0xe0, 0x5a, 0x32,
+ 0xb6, 0xbe, 0x1a, 0x76, 0x5b, 0x1e, 0xdb, 0xce, 0x95, 0x7e, 0xf5, 0x86,
+ 0xab, 0x56, 0xef, 0xf7, 0x34, 0xa1, 0x8f, 0xca, 0x81, 0x76, 0x3d, 0x1b,
+ 0x1a, 0xa2, 0x4a, 0x77, 0xee, 0x61, 0x46, 0x3f, 0x64, 0xa0, 0x0e, 0x45,
+ 0x8d, 0xae, 0x1f, 0xa0, 0xd9, 0xde, 0x73, 0xa2, 0x99, 0x6d, 0x2c, 0xa3,
+ 0x1d, 0xd4, 0xdc, 0x05, 0x01, 0xb6, 0xf5, 0xce, 0x52, 0x97, 0x66, 0x24,
+ 0x57, 0x48, 0x12, 0x14, 0x9a, 0xf5, 0x9d, 0x42, 0x5f, 0xb9, 0xef, 0x4d,
+ 0x2d, 0xee, 0xc9, 0xf9, 0xc5, 0xb1, 0x79, 0x4d, 0x8a, 0xfd, 0xf0, 0xad,
+ 0xd9, 0x86, 0xfd, 0xe4, 0xdf, 0xcb, 0x8c, 0x6b, 0x56, 0x1f, 0x28, 0x59,
+ 0xfd, 0xe1, 0xe0, 0xdd, 0xdb, 0xe3, 0xb7, 0xdf, 0xec, 0x3b, 0x88, 0x4e,
+ 0xc8, 0x3c, 0x01, 0xcd, 0x0f, 0xfa, 0xfd, 0x00, 0x59, 0x1f, 0x75, 0x01,
+ 0x29, 0xfb, 0xe6, 0xa3, 0x1d, 0x16, 0x92, 0x21, 0xcb, 0x66, 0xf6, 0x5d,
+ 0x56, 0x19, 0x07, 0x45, 0xd8, 0x16, 0xd5, 0xc2, 0x09, 0xa9, 0xd6, 0xc4,
+ 0x55, 0xc9, 0x6d, 0x3a, 0x23, 0x40, 0x0d, 0xc3, 0x13, 0xe4, 0xe5, 0xce,
+ 0xca, 0x56, 0x7b, 0x40, 0xe2, 0xcb, 0x19, 0xf6, 0xbf, 0xf4, 0x59, 0xc0,
+ 0xeb, 0xf2, 0x47, 0x10, 0x7c, 0x91, 0x96, 0xb0, 0x30, 0xf4, 0xf8, 0x82,
+ 0x80, 0x41, 0xa3, 0x7d, 0xd1, 0xb8, 0xb9, 0x11, 0xd5, 0xec, 0x92, 0xa7,
+ 0x22, 0xe7, 0xf8, 0xbf, 0xa3, 0x87, 0x4d, 0xf2, 0x8a, 0xf8, 0x41, 0x98,
+ 0x50, 0x93, 0x74, 0xc9, 0x27, 0x86, 0x41, 0xc9, 0xe4, 0xa7, 0xae, 0x32,
+ 0xc3, 0x92, 0x60, 0x75, 0xdc, 0x81, 0xab, 0x64, 0x35, 0xac, 0xda, 0x49,
+ 0x75, 0x46, 0xc0, 0xcf, 0x09, 0x2c, 0xf3, 0x5f, 0xba, 0x4a, 0xa2, 0xf8,
+ 0x23, 0xb3, 0xcc, 0x55, 0x25, 0x59, 0x5d, 0xe7, 0x9a, 0x75, 0x9d, 0xd9,
+ 0x22, 0x79, 0x49, 0x3a, 0xb0, 0xb1, 0xa9, 0xef, 0xbf, 0x0c, 0xf0, 0xf6,
+ 0x28, 0xe3, 0x9c, 0x9e, 0x11, 0x4a, 0x53, 0x08, 0x0b, 0x57, 0xb1, 0xcb,
+ 0xa5, 0x15, 0xc1, 0xe5, 0x0d, 0x32, 0x12, 0x0f, 0x53, 0x00, 0x89, 0x63,
+ 0x64, 0x46, 0xc2, 0x3d, 0x27, 0x5c, 0xae, 0xb2, 0x97, 0xaa, 0xc6, 0xaa,
+ 0x1c, 0x47, 0xc4, 0x29, 0xaa, 0x9e, 0xcf, 0x49, 0xeb, 0x46, 0xc7, 0xd9,
+ 0x68, 0x87, 0x2f, 0x08, 0x0c, 0x95, 0x43, 0xb5, 0xc5, 0xea, 0x01, 0x54,
+ 0x35, 0xee, 0x3b, 0x99, 0x11, 0xe5, 0x63, 0x26, 0x5e, 0x33, 0x2b, 0x7d,
+ 0xa5, 0x9b, 0x61, 0x6b, 0x96, 0xb5, 0x86, 0xe9, 0xad, 0x9a, 0x1d, 0xad,
+ 0x5d, 0xdb, 0x1a, 0xbb, 0x18, 0x27, 0x8d, 0xbe, 0xa2, 0x16, 0x29, 0x59,
+ 0x53, 0xe2, 0x3c, 0xee, 0x03, 0xe6, 0xe9, 0x40, 0x30, 0xf0, 0x42, 0x74,
+ 0x95, 0x79, 0xa5, 0xc0, 0x42, 0xad, 0x24, 0x52, 0x62, 0xdc, 0xc5, 0xf2,
+ 0x62, 0x3e, 0x7d, 0x9a, 0xbc, 0x34, 0x7f, 0x04, 0x5a, 0xeb, 0x98, 0xd3,
+ 0x73, 0x0f, 0x29, 0x2c, 0x41, 0x39, 0x43, 0x8c, 0x28, 0xcc, 0xb5, 0x42,
+ 0xb6, 0x2b, 0xd3, 0xde, 0xae, 0xd9, 0xf2, 0xbb, 0x54, 0x61, 0x42, 0xa7,
+ 0xe6, 0x50, 0x34, 0xc8, 0xe5, 0xeb, 0x01, 0x60, 0x72, 0x49, 0xa2, 0xb4,
+ 0xe6, 0x9d, 0xdd, 0xcf, 0x13, 0xaa, 0xe5, 0x78, 0xf3, 0xea, 0x69, 0x32,
+ 0xb9, 0xce, 0x26, 0x1f, 0xeb, 0xe5, 0xdc, 0x32, 0x09, 0xf1, 0x28, 0x45,
+ 0x96, 0x68, 0x9e, 0x01, 0x74, 0x86, 0x99, 0xf8, 0x2c, 0x9f, 0x50, 0x25,
+ 0xe5, 0xa0, 0x15, 0xef, 0xbb, 0xd4, 0x78, 0x9f, 0x67, 0xd6, 0xdb, 0x7b,
+ 0x18, 0xf9, 0x17, 0x9c, 0xa4, 0x14, 0xd9, 0x00, 0x43, 0x03, 0xf3, 0x79,
+ 0xea, 0xe3, 0x61, 0x0c, 0x9d, 0x95, 0x3e, 0xf0, 0xe7, 0xed, 0x30, 0x02,
+ 0x49, 0xca, 0xed, 0xd1, 0x8b, 0x1e, 0x84, 0xe4, 0x16, 0xaa, 0x19, 0x15,
+ 0x7f, 0x59, 0xd0, 0x6c, 0x18, 0x58, 0x64, 0x36, 0xd1, 0x24, 0x09, 0x59,
+ 0x4b, 0xc3, 0xa2, 0xc1, 0xc7, 0xe9, 0xc9, 0x2d, 0x7a, 0x42, 0x5a, 0x44,
+ 0x91, 0x44, 0x06, 0xb6, 0x07, 0x9f, 0x54, 0x64, 0x5d, 0xd9, 0x98, 0x2a,
+ 0xe2, 0xc9, 0x00, 0x86, 0x42, 0x40, 0x3b, 0xa2, 0x05, 0xbb, 0x7a, 0x7a,
+ 0xeb, 0x04, 0x73, 0x6d, 0xe8, 0xa4, 0x32, 0xd9, 0x03, 0xc6, 0xd0, 0xf2,
+ 0x4c, 0xa2, 0x30, 0xe0, 0x69, 0x02, 0x4d, 0x42, 0xbe, 0xcc, 0x91, 0x7e,
+ 0xb7, 0x1d, 0x35, 0xc3, 0x3a, 0x22, 0x1e, 0x41, 0xa0, 0xda, 0xec, 0xa2,
+ 0x28, 0x6f, 0x8b, 0xab, 0x8a, 0x1c, 0x4e, 0xe8, 0x14, 0x9d, 0xc6, 0x82,
+ 0x43, 0x31, 0x28, 0x58, 0x37, 0xb6, 0x31, 0x61, 0x9f, 0xd1, 0xd5, 0xe9,
+ 0x53, 0x45, 0xb2, 0x02, 0x60, 0xe4, 0x8b, 0x13, 0xc4, 0xdb, 0xa2, 0xed,
+ 0x81, 0x6c, 0xd3, 0xce, 0x68, 0xbb, 0xaf, 0x2b, 0x99, 0xd7, 0x8f, 0x4c,
+ 0xf2, 0x48, 0x5a, 0xfb, 0x63, 0xde, 0xf4, 0x0d, 0x0f, 0x4e, 0x1c, 0x31,
+ 0xbc, 0xde, 0x93, 0xce, 0x68, 0x16, 0x2a, 0x1e, 0xc1, 0x6c, 0xda, 0x1a,
+ 0xe8, 0xb1, 0x45, 0x27, 0x32, 0xdd, 0x1d, 0x89, 0x6b, 0xd1, 0xbf, 0x76,
+ 0xbb, 0x4c, 0x67, 0x7e, 0xfd, 0x18, 0xa6, 0x8b, 0xac, 0x65, 0x67, 0xe5,
+ 0x34, 0xbc, 0x79, 0x80, 0x76, 0x8e, 0x78, 0x5a, 0xf2, 0x22, 0xf3, 0xd1,
+ 0x63, 0x11, 0x86, 0xf9, 0xc3, 0x0e, 0x32, 0x78, 0x83, 0xea, 0x87, 0xca,
+ 0x6a, 0x48, 0x46, 0x90, 0xd9, 0xac, 0x40, 0x27, 0x8d, 0x6d, 0x06, 0x6c,
+ 0xb6, 0xbc, 0xae, 0x09, 0xe1, 0x13, 0xc9, 0x03, 0xc4, 0x9d, 0x14, 0x89,
+ 0xf3, 0x21, 0xf8, 0xeb, 0x68, 0x1d, 0x04, 0x18, 0x64, 0xd7, 0x5a, 0x3d,
+ 0xf8, 0x27, 0x91, 0xf4, 0xfd, 0x02, 0x0c, 0x38, 0x02, 0x32, 0xb5, 0x6b,
+ 0xa3, 0x93, 0x60, 0x72, 0x6c, 0xa2, 0xc5, 0x66, 0xe7, 0x41, 0xcc, 0x69,
+ 0x48, 0x4d, 0xea, 0x5f, 0x6b, 0xfd, 0x54, 0x4d, 0xa5, 0xc5, 0xae, 0xed,
+ 0x2a, 0x77, 0xbe, 0xd1, 0x39, 0xc6, 0xf0, 0x91, 0xf9, 0x54, 0x19, 0xcd,
+ 0x5d, 0x06, 0x68, 0x55, 0x27, 0x50, 0xab, 0x11, 0xd6, 0xa5, 0x6c, 0x07,
+ 0xdc, 0xa9, 0x6b, 0xc1, 0x1a, 0x71, 0x58, 0xc1, 0xbb, 0xc4, 0xfa, 0x09,
+ 0x51, 0xa8, 0x1f, 0x3a, 0xb0, 0x67, 0x3b, 0x1e, 0xdd, 0x52, 0x28, 0x00,
+ 0x42, 0xcb, 0xd9, 0xe9, 0xa8, 0xf5, 0xc0, 0xbc, 0x9a, 0xd1, 0xe3, 0x98,
+ 0x7b, 0x7b, 0x10, 0x9d, 0x1d, 0xb1, 0x9b, 0xcf, 0xfc, 0x2d, 0x54, 0xc1,
+ 0x17, 0x11, 0xe6, 0xfa, 0x55, 0x67, 0x61, 0x77, 0x55, 0x5c, 0x39, 0x3c,
+ 0x83, 0x7b, 0x23, 0xfd, 0x5a, 0x1f, 0xad, 0x02, 0x71, 0xd6, 0xd3, 0x8e,
+ 0xe9, 0xb1, 0xd4, 0xea, 0xa1, 0xcd, 0x8e, 0x1e, 0x45, 0x5f, 0xb6, 0xf9,
+ 0xf4, 0xea, 0xee, 0xad, 0xd0, 0x2f, 0xec, 0x61, 0x10, 0x3f, 0xaa, 0x7b,
+ 0x71, 0x6a, 0x5a, 0x95, 0xbf, 0xe3, 0x44, 0x26, 0x1f, 0x64, 0x95, 0xcf,
+ 0x81, 0x24, 0x38, 0x4a, 0x5e, 0xb9, 0x1c, 0x21, 0xb2, 0xf8, 0x0c, 0xc7,
+ 0x76, 0xa9, 0x32, 0x5d, 0xf6, 0xa4, 0xd2, 0x74, 0x4e, 0x7e, 0xb0, 0x5f,
+ 0x7b, 0x92, 0x25, 0xe5, 0x72, 0x41, 0x70, 0xab, 0xab, 0xdf, 0xb5, 0x6b,
+ 0x56, 0xb2, 0x23, 0x4c, 0x03, 0xaa, 0x12, 0xf7, 0xa4, 0x5c, 0x37, 0x09,
+ 0x69, 0x81, 0xf4, 0x7b, 0x7e, 0x12, 0x82, 0xb5, 0x55, 0xa8, 0x26, 0x23,
+ 0xee, 0x7a, 0xb3, 0x5f, 0x84, 0x89, 0x4a, 0x57, 0xa2, 0xea, 0xe8, 0xe6,
+ 0x33, 0x37, 0x79, 0x9a, 0x1c, 0xcc, 0x9a, 0xe1, 0xf8, 0xfb, 0x89, 0x76,
+ 0x3d, 0xb6, 0x94, 0x0a, 0xda, 0xa5, 0xc3, 0x4d, 0x25, 0xb0, 0x83, 0x14,
+ 0x92, 0xca, 0xab, 0xc9, 0x72, 0x0e, 0x28, 0x59, 0x30, 0x95, 0x6d, 0xbb,
+ 0x44, 0xbb, 0xe8, 0xcb, 0x1f, 0xae, 0x5f, 0x08, 0x51, 0x24, 0xd3, 0x8f,
+ 0xb5, 0x2e, 0x49, 0x4a, 0x15, 0xb8, 0xae, 0xa5, 0x45, 0xa3, 0x07, 0xec,
+ 0x88, 0x8e, 0xb1, 0xcc, 0x88, 0xc7, 0x84, 0xbc, 0xf2, 0x1f, 0xef, 0x8f,
+ 0x0f, 0x7d, 0xbd, 0xca, 0x62, 0xf5, 0xf7, 0x87, 0x7f, 0x06, 0x1e, 0xa6,
+ 0xff, 0x25, 0x69, 0xab, 0x9a, 0xdc, 0xac, 0x89, 0x88, 0xad, 0xbd, 0x2d,
+ 0x19, 0xc7, 0xbe, 0xeb, 0x51, 0xbc, 0x2d, 0x7e, 0xd9, 0x19, 0xdd, 0xd5,
+ 0x33, 0xba, 0xf7, 0x5b, 0x9f, 0xd1, 0xbd, 0x5f, 0x7a, 0x46, 0x45, 0xbe,
+ 0xc5, 0x4f, 0x68, 0xdf, 0x69, 0x0d, 0xd4, 0x79, 0x77, 0x7a, 0xc5, 0x83,
+ 0xdf, 0x4e, 0xc2, 0x18, 0x32, 0x1a, 0xc7, 0x50, 0x1c, 0x41, 0x43, 0xae,
+ 0x38, 0x8e, 0x15, 0xdb, 0xf1, 0x19, 0x56, 0x04, 0xcd, 0x41, 0x72, 0xcc,
+ 0xe0, 0xf0, 0x3e, 0x2e, 0xe5, 0x09, 0x97, 0x2b, 0x4b, 0x18, 0xc1, 0xd5,
+ 0xa8, 0x44, 0x20, 0x0d, 0xf2, 0x09, 0xe1, 0xd4, 0xcd, 0x00, 0x40, 0x85,
+ 0x20, 0x06, 0x9c, 0x10, 0xb6, 0x3b, 0xdd, 0x12, 0x51, 0x9a, 0xe4, 0x60,
+ 0x41, 0x55, 0xc7, 0x46, 0xe7, 0xb8, 0x53, 0xc7, 0x0e, 0x31, 0x58, 0x98,
+ 0xdc, 0x55, 0x02, 0x32, 0x40, 0x2b, 0x19, 0x3a, 0xd3, 0xa1, 0x81, 0x19,
+ 0x42, 0x72, 0x46, 0x9c, 0xcf, 0xf0, 0xeb, 0x05, 0xb5, 0x50, 0x31, 0x0c,
+ 0x7e, 0x15, 0x74, 0x29, 0xba, 0xb8, 0x6f, 0x22, 0x75, 0x75, 0xb4, 0x6e,
+ 0xc4, 0x06, 0x36, 0x58, 0x51, 0x35, 0xd7, 0x88, 0x21, 0xe4, 0xa6, 0x31,
+ 0xde, 0x3f, 0x02, 0x0a, 0x39, 0x43, 0xe1, 0x93, 0x8d, 0x54, 0xa0, 0xbb,
+ 0xcc, 0x15, 0x39, 0x00, 0xa5, 0xa0, 0x26, 0x28, 0x41, 0xfa, 0x5b, 0xa6,
+ 0x59, 0xa3, 0x9a, 0x93, 0x29, 0xb8, 0xbd, 0xed, 0x9a, 0xdf, 0x7c, 0x80,
+ 0x36, 0xae, 0xf0, 0xf6, 0x77, 0xa3, 0x71, 0x12, 0x03, 0xa0, 0x8f, 0x8b,
+ 0x3e, 0xa3, 0xcd, 0x11, 0xc4, 0x83, 0x20, 0x52, 0x4b, 0xda, 0x5d, 0x09,
+ 0x94, 0x0c, 0xa3, 0xa2, 0xf6, 0x35, 0xb8, 0xf1, 0xdc, 0x0f, 0x13, 0x6e,
+ 0xf6, 0xca, 0x1f, 0x51, 0xaf, 0x1e, 0x7c, 0x27, 0xa2, 0xc1, 0x90, 0xdf,
+ 0x6d, 0xa0, 0x8d, 0xcb, 0x06, 0x21, 0x3e, 0xa1, 0x2d, 0xe4, 0x73, 0x98,
+ 0xdb, 0xad, 0x23, 0xab, 0x18, 0xd9, 0xa3, 0xd1, 0x28, 0x82, 0x0f, 0x72,
+ 0x93, 0x67, 0xb7, 0xad, 0xe0, 0x86, 0x4c, 0x6c, 0x60, 0xdb, 0x8e, 0xb0,
+ 0x4b, 0xed, 0x86, 0x28, 0x64, 0x86, 0xbc, 0x20, 0x4c, 0xd2, 0x9e, 0xfa,
+ 0x1c, 0x77, 0xe4, 0xfd, 0xa7, 0x3d, 0x32, 0x7f, 0x64, 0x32, 0xd7, 0xb1,
+ 0x02, 0x5b, 0x46, 0x98, 0x76, 0x4d, 0x31, 0x06, 0xe4, 0x63, 0xaa, 0xee,
+ 0x13, 0x34, 0xc2, 0xf2, 0x24, 0x1a, 0x1d, 0x7f, 0x2e, 0xe9, 0xc8, 0x6b,
+ 0x86, 0x78, 0xce, 0x63, 0x55, 0x46, 0x17, 0x99, 0xe6, 0x71, 0x75, 0xda,
+ 0xf0, 0x88, 0x44, 0x57, 0x6d, 0xc3, 0x5c, 0x7c, 0x13, 0xf2, 0xed, 0xa1,
+ 0xaf, 0x8a, 0xb4, 0x75, 0x20, 0xe7, 0x56, 0x24, 0x97, 0x4b, 0x3b, 0xbd,
+ 0xb8, 0x46, 0x60, 0x5e, 0xe6, 0x91, 0x6b, 0xd2, 0x92, 0xe8, 0x02, 0xa3,
+ 0x01, 0xf4, 0x60, 0x90, 0xd6, 0x32, 0x2e, 0xee, 0xb5, 0xcd, 0xa9, 0xf5,
+ 0x6b, 0x5b, 0x55, 0x36, 0x30, 0xb0, 0xbd, 0x82, 0x5f, 0x07, 0x49, 0xd5,
+ 0x0a, 0x16, 0x58, 0xf8, 0x40, 0xf9, 0x40, 0xed, 0x21, 0x8e, 0x07, 0xd8,
+ 0x0d, 0x0e, 0x00, 0x97, 0x06, 0xe6, 0x7e, 0x79, 0xd1, 0x2d, 0xe6, 0xdb,
+ 0x92, 0x61, 0x44, 0xa8, 0xa3, 0xe3, 0x92, 0x32, 0x79, 0x70, 0xfc, 0x05,
+ 0x0e, 0x40, 0x10, 0x00, 0xba, 0xe8, 0x30, 0x16, 0x63, 0x8f, 0x68, 0x3f,
+ 0xba, 0x4e, 0xef, 0xee, 0x46, 0x75, 0xb6, 0x65, 0xb8, 0xb6, 0xde, 0xaa,
+ 0xeb, 0x19, 0x7d, 0xb4, 0x06, 0x9c, 0xdd, 0xca, 0x66, 0xd1, 0x77, 0xf7,
+ 0x96, 0x81, 0x44, 0x38, 0x4f, 0x52, 0x7a, 0xb5, 0x25, 0x6c, 0x5d, 0xb7,
+ 0x68, 0xee, 0xb7, 0xd6, 0xcd, 0xc1, 0x66, 0x04, 0x6f, 0xf2, 0x7b, 0xfb,
+ 0xa5, 0xcb, 0x2c, 0x19, 0x5c, 0xaa, 0x9b, 0x1d, 0xc6, 0x75, 0x25, 0x48,
+ 0x08, 0xb2, 0xbb, 0xea, 0xab, 0x95, 0x49, 0xe4, 0xac, 0xfa, 0xd1, 0x66,
+ 0x43, 0x16, 0x5b, 0x53, 0xc2, 0x4d, 0xb7, 0x04, 0xab, 0x08, 0x1d, 0x14,
+ 0xcd, 0x15, 0x5b, 0x7e, 0x8c, 0x60, 0x68, 0xf5, 0xf9, 0x81, 0xbd, 0xa5,
+ 0x51, 0xf1, 0xcd, 0xbe, 0x43, 0x6b, 0xbc, 0xbd, 0xbd, 0x1d, 0xad, 0x72,
+ 0x04, 0xff, 0xc3, 0x49, 0x05, 0xed, 0xe1, 0x4e, 0x8b, 0xe4, 0x24, 0x2f,
+ 0x96, 0x77, 0x1e, 0x64, 0x8e, 0xed, 0xaa, 0xa7, 0x51, 0xce, 0xe4, 0xfb,
+ 0x77, 0xaf, 0x07, 0x36, 0x52, 0xac, 0x68, 0x25, 0x70, 0xa5, 0xd7, 0x11,
+ 0xad, 0x2d, 0xcb, 0xc1, 0x3c, 0x8c, 0xbf, 0x7d, 0x78, 0x70, 0xf6, 0xe1,
+ 0xed, 0xd1, 0xf9, 0x87, 0x77, 0x07, 0x3f, 0x10, 0x09, 0xd9, 0x2f, 0x63,
+ 0xee, 0x2b, 0x0a, 0xb1, 0x54, 0x65, 0x69, 0xc4, 0xec, 0x1b, 0x12, 0xea,
+ 0x79, 0x01, 0xbc, 0x9a, 0x58, 0x0b, 0x3c, 0xc5, 0xe0, 0x92, 0x79, 0xd2,
+ 0x64, 0xf6, 0x3d, 0x1e, 0x24, 0x7a, 0x7d, 0xcc, 0xaa, 0x22, 0x9b, 0x8d,
+ 0xca, 0xea, 0x8a, 0xb8, 0x70, 0xeb, 0x95, 0xc8, 0xcf, 0xe8, 0x70, 0x5b,
+ 0x92, 0x26, 0x42, 0x98, 0x6e, 0x37, 0xd5, 0x25, 0x41, 0xc0, 0xac, 0xd0,
+ 0x78, 0x5a, 0x0d, 0x7f, 0x3d, 0xd6, 0x7c, 0x02, 0x01, 0xb8, 0xb8, 0x79,
+ 0xb2, 0x4a, 0xbd, 0x6b, 0x5a, 0xe6, 0x90, 0xf4, 0x4c, 0x05, 0x03, 0xc1,
+ 0xf5, 0xe3, 0x67, 0xff, 0x64, 0x1c, 0xe2, 0x1f, 0x44, 0x10, 0x25, 0xa0,
+ 0xcf, 0x95, 0x16, 0x9b, 0x03, 0x15, 0x83, 0x94, 0xb5, 0xd4, 0x2f, 0xb5,
+ 0x43, 0xc3, 0xc5, 0xfa, 0x10, 0xda, 0xea, 0xa7, 0xef, 0x7b, 0x78, 0x16,
+ 0x5a, 0x86, 0xd4, 0xc3, 0xd8, 0x5b, 0xf3, 0x33, 0x59, 0xf3, 0xb3, 0x7f,
+ 0x6c, 0xcd, 0xcf, 0x7e, 0xfd, 0x9a, 0x9f, 0xfc, 0xc6, 0x6b, 0x7e, 0x12,
+ 0x5d, 0xb3, 0xf7, 0x95, 0xe1, 0x5f, 0x68, 0xcd, 0x7f, 0x59, 0x16, 0x1f,
+ 0x87, 0x66, 0xba, 0x74, 0x0b, 0x4b, 0xc7, 0xd2, 0xba, 0xc7, 0x64, 0xb3,
+ 0xc5, 0x14, 0xf0, 0xee, 0x31, 0x6e, 0xaa, 0x00, 0x35, 0x7b, 0x0d, 0x58,
+ 0x53, 0xaf, 0x25, 0x21, 0x87, 0xf2, 0xba, 0x7a, 0xb8, 0x17, 0xca, 0x81,
+ 0x79, 0x90, 0x53, 0x01, 0x75, 0x3d, 0x21, 0x4f, 0x05, 0xa9, 0xf6, 0x6b,
+ 0x32, 0x1b, 0x1d, 0x76, 0x4d, 0x3b, 0xd8, 0xe0, 0xa4, 0xa7, 0x21, 0x70,
+ 0xd4, 0x84, 0x41, 0xe7, 0xaf, 0xb9, 0x97, 0x1f, 0xee, 0x22, 0x44, 0x01,
+ 0xa5, 0x74, 0x82, 0x3b, 0x46, 0x31, 0xac, 0x96, 0x0e, 0x9d, 0x0b, 0x3a,
+ 0x5d, 0x28, 0x33, 0xce, 0xef, 0x17, 0x34, 0x60, 0x72, 0x51, 0x99, 0x0b,
+ 0x18, 0x3e, 0xcb, 0xd9, 0x2d, 0xe5, 0x7a, 0xe8, 0x0c, 0xed, 0x10, 0x76,
+ 0xd5, 0x6c, 0x5d, 0x21, 0xfc, 0xb9, 0x1e, 0x28, 0x0c, 0x93, 0x59, 0x49,
+ 0x12, 0x67, 0xba, 0xda, 0xf8, 0xb8, 0x70, 0xed, 0x62, 0xf9, 0xbe, 0xe8,
+ 0xf4, 0x8f, 0xf5, 0xef, 0x8d, 0x8f, 0x59, 0xb6, 0x48, 0x67, 0xc0, 0x2a,
+ 0xa1, 0x64, 0x92, 0xbe, 0x8e, 0x63, 0x2d, 0xc6, 0xa8, 0xb5, 0x16, 0x03,
+ 0xaf, 0xf8, 0x75, 0xd5, 0x2c, 0xe8, 0x78, 0x27, 0xa9, 0xfc, 0x28, 0xc9,
+ 0xa7, 0x54, 0x3b, 0x1c, 0x6f, 0x40, 0xa3, 0xd9, 0x24, 0x76, 0x0a, 0xa4,
+ 0x98, 0x5c, 0xb8, 0x00, 0x41, 0xc2, 0xe3, 0x5b, 0x5c, 0x3e, 0xe4, 0x3a,
+ 0xdd, 0xe4, 0x94, 0xe6, 0xd8, 0x05, 0x71, 0xee, 0x8c, 0x00, 0x98, 0xae,
+ 0x56, 0x07, 0x0a, 0xde, 0x3c, 0x7a, 0xa2, 0xb4, 0x17, 0x20, 0xf9, 0xfd,
+ 0xd1, 0x96, 0x3b, 0x60, 0x29, 0x85, 0xa2, 0x96, 0xb6, 0x1e, 0x87, 0x67,
+ 0x1f, 0xbe, 0x3b, 0x3a, 0x3a, 0x3b, 0x7e, 0x75, 0x72, 0x24, 0x27, 0xc6,
+ 0xfe, 0xe8, 0xed, 0xf9, 0xf7, 0x27, 0xae, 0xd1, 0xaa, 0x44, 0x55, 0xba,
+ 0x0c, 0x2f, 0x61, 0x0e, 0x11, 0xcb, 0x03, 0x34, 0x16, 0x33, 0xb6, 0xf4,
+ 0xc1, 0xf1, 0x8f, 0x46, 0x6d, 0x3d, 0x1b, 0xbe, 0xff, 0x31, 0xe8, 0xe9,
+ 0xd2, 0x2a, 0xda, 0xe9, 0xda, 0x5d, 0xb6, 0x84, 0x67, 0x38, 0x2c, 0x4a,
+ 0xb7, 0x81, 0xbd, 0x39, 0x8c, 0xbf, 0xf1, 0x35, 0x48, 0x99, 0xe0, 0x85,
+ 0xd5, 0x18, 0xf8, 0x45, 0x6d, 0x9c, 0xe4, 0xa5, 0x09, 0x3e, 0xdb, 0xd6,
+ 0x7e, 0x74, 0x2b, 0x83, 0x16, 0x9d, 0x1e, 0x78, 0x1f, 0xb3, 0x7b, 0x80,
+ 0x62, 0x26, 0x2f, 0xe9, 0xcf, 0x78, 0xd7, 0xd8, 0xe4, 0xac, 0xca, 0x6f,
+ 0x48, 0x01, 0x34, 0x0f, 0x73, 0x90, 0x9c, 0x9e, 0x1d, 0xd9, 0x2e, 0xba,
+ 0x12, 0xa7, 0xa7, 0x51, 0x90, 0xc9, 0x83, 0x51, 0x63, 0xde, 0x1e, 0x04,
+ 0xb0, 0xc8, 0xbd, 0x6a, 0x47, 0xcb, 0x0d, 0xeb, 0xbc, 0x3a, 0x7a, 0x37,
+ 0x48, 0xce, 0x8e, 0xde, 0x70, 0xd9, 0xcf, 0xd1, 0xdb, 0x6f, 0xb8, 0x2d,
+ 0xa6, 0xed, 0x15, 0x3b, 0xd2, 0xd0, 0x60, 0x13, 0x6b, 0x97, 0xc1, 0x34,
+ 0x31, 0xaf, 0x23, 0x28, 0x52, 0xd7, 0xe6, 0x76, 0xfd, 0x84, 0x88, 0x44,
+ 0xbc, 0xb4, 0x97, 0xe6, 0x8f, 0x18, 0xa9, 0x8c, 0x1d, 0xf1, 0xed, 0x66,
+ 0x48, 0x2d, 0x51, 0xcb, 0x6c, 0x32, 0x92, 0x98, 0x04, 0x44, 0x0d, 0x26,
+ 0x98, 0xa1, 0x48, 0x98, 0x16, 0xa3, 0x14, 0x2a, 0x04, 0x68, 0x50, 0x9a,
+ 0xd1, 0x4b, 0x4e, 0x03, 0x5a, 0x3d, 0x8c, 0xbf, 0x1d, 0x10, 0x5b, 0x02,
+ 0xd9, 0xdd, 0xd1, 0x22, 0x5a, 0x6e, 0x8e, 0x40, 0xa0, 0x02, 0x16, 0xd8,
+ 0x98, 0x32, 0xa9, 0x55, 0xd3, 0x7c, 0x0a, 0x4c, 0x0b, 0xb8, 0xe8, 0xca,
+ 0x8a, 0x52, 0x62, 0x92, 0x64, 0xfd, 0x7f, 0x6d, 0x8d, 0xea, 0xfa, 0x7a,
+ 0x2b, 0x9f, 0x7e, 0xa8, 0xea, 0x74, 0xbd, 0x7b, 0x17, 0x79, 0xbf, 0x9e,
+ 0xd2, 0xaf, 0x93, 0xf5, 0x91, 0x7d, 0x54, 0xfe, 0x4e, 0x3f, 0x8f, 0xed,
+ 0x83, 0xde, 0x40, 0xec, 0x59, 0xd1, 0x04, 0x59, 0xed, 0x46, 0x3c, 0xcb,
+ 0x2f, 0x2a, 0xa3, 0xc0, 0xb9, 0x2e, 0x2a, 0xd2, 0x5b, 0x38, 0x59, 0x7c,
+ 0x9c, 0xd4, 0x3b, 0x3b, 0x21, 0xac, 0xbf, 0x8d, 0xa7, 0x0e, 0x34, 0xd7,
+ 0xf9, 0xec, 0xbb, 0xc3, 0xf1, 0xef, 0x76, 0x76, 0x90, 0x57, 0xbe, 0x41,
+ 0xf9, 0xbf, 0xcf, 0x9f, 0xee, 0xec, 0x6e, 0xc6, 0x14, 0xc8, 0x20, 0x51,
+ 0x0a, 0x0a, 0xa5, 0xcf, 0x9e, 0x48, 0x1a, 0x90, 0x22, 0x12, 0x3b, 0xf0,
+ 0x34, 0xa3, 0x9c, 0x4b, 0x72, 0x1e, 0xda, 0x76, 0x32, 0x48, 0x46, 0x0d,
+ 0x72, 0x59, 0xf0, 0x2b, 0x76, 0xdc, 0xaf, 0xf1, 0xfc, 0xf7, 0xd7, 0x2c,
+ 0x5f, 0xf9, 0x59, 0xf9, 0x48, 0xe9, 0xf1, 0xe6, 0x8d, 0x54, 0xaa, 0x6e,
+ 0x78, 0xcd, 0x5f, 0x57, 0x5e, 0xb7, 0xa0, 0xbb, 0x32, 0x76, 0x0e, 0xd8,
+ 0x4e, 0xcc, 0x91, 0x6c, 0x8b, 0xc0, 0x57, 0x2f, 0x33, 0x5a, 0x4b, 0x98,
+ 0x83, 0x88, 0xe3, 0xbd, 0x28, 0xb3, 0xa5, 0xbf, 0x27, 0x21, 0xda, 0xa3,
+ 0x06, 0x99, 0xa8, 0xb8, 0xa9, 0xd7, 0xcc, 0xf1, 0x5d, 0x8b, 0x8e, 0xf8,
+ 0x49, 0xcf, 0x64, 0x75, 0x91, 0xbc, 0x9c, 0x99, 0x17, 0x67, 0xf1, 0x5a,
+ 0xc6, 0x23, 0xee, 0x5b, 0xf6, 0x5d, 0x56, 0x5d, 0x64, 0x55, 0x59, 0x77,
+ 0x6a, 0xae, 0xb4, 0x57, 0x2e, 0x67, 0xb6, 0x63, 0x18, 0xce, 0x3f, 0x8b,
+ 0xb8, 0x34, 0x69, 0xd3, 0x84, 0x3a, 0x01, 0xce, 0xd1, 0x3a, 0xca, 0xbf,
+ 0xe8, 0x00, 0x50, 0xa7, 0x2e, 0xfa, 0xaf, 0x91, 0xc6, 0x97, 0xdc, 0x6d,
+ 0x35, 0x9d, 0xad, 0x53, 0xfb, 0xa4, 0xee, 0x31, 0x12, 0x5e, 0x5b, 0x37,
+ 0xb2, 0x94, 0x47, 0x23, 0xe9, 0x00, 0x00, 0x09, 0x99, 0x07, 0xfb, 0x7a,
+ 0x6d, 0x97, 0x56, 0x3f, 0xab, 0xb2, 0x0e, 0x5a, 0x4a, 0xd9, 0xe1, 0xda,
+ 0x58, 0x54, 0x7d, 0x29, 0xdb, 0xbf, 0xf1, 0x35, 0xc5, 0xdb, 0xf0, 0xe8,
+ 0xd0, 0x51, 0xe0, 0x5a, 0xed, 0x0c, 0xa7, 0x9b, 0xe5, 0xef, 0xb3, 0xbe,
+ 0x1e, 0x6d, 0x45, 0x7c, 0xc0, 0xc5, 0xf6, 0x9d, 0x3e, 0xce, 0x94, 0x06,
+ 0x8b, 0x7a, 0x13, 0x32, 0x0b, 0xa5, 0x94, 0x58, 0x6a, 0xad, 0xd1, 0x87,
+ 0x53, 0xf4, 0x8b, 0x30, 0x38, 0xce, 0xe9, 0x7f, 0x88, 0x73, 0xeb, 0xb4,
+ 0x87, 0x6c, 0xbe, 0x1f, 0x26, 0xe2, 0x8e, 0x40, 0xa9, 0xd9, 0x6d, 0x45,
+ 0x00, 0xb4, 0x85, 0x46, 0x21, 0xf8, 0x7a, 0x8c, 0xa3, 0x92, 0x29, 0x46,
+ 0xad, 0xd9, 0xa4, 0x99, 0x34, 0x88, 0xd4, 0xf4, 0xce, 0x4a, 0xa7, 0xc5,
+ 0x69, 0x81, 0xce, 0x63, 0x40, 0xef, 0xfd, 0xcb, 0x3f, 0xb8, 0x73, 0xac,
+ 0xd0, 0x4b, 0x37, 0x8a, 0x08, 0xee, 0xc4, 0xa3, 0xc1, 0xf7, 0x3a, 0x75,
+ 0x93, 0xa8, 0xc1, 0x18, 0xe2, 0x52, 0x7a, 0x69, 0xe4, 0x69, 0x16, 0xa0,
+ 0x8f, 0xa9, 0x82, 0x20, 0x60, 0x48, 0xd2, 0x3d, 0xd7, 0xeb, 0x61, 0x89,
+ 0x77, 0x89, 0xe7, 0x01, 0xce, 0xe1, 0x07, 0xe7, 0x86, 0xa4, 0xb2, 0x76,
+ 0xdd, 0x6d, 0xd4, 0xf7, 0xc5, 0x95, 0xbd, 0xe3, 0xd8, 0x02, 0xdd, 0x5f,
+ 0x51, 0xa3, 0x34, 0xed, 0x9c, 0x09, 0x42, 0xae, 0x68, 0x49, 0x68, 0x86,
+ 0x6d, 0x91, 0x06, 0x3e, 0x10, 0x94, 0x90, 0x70, 0x2b, 0x95, 0x94, 0x5b,
+ 0x4c, 0xac, 0x4f, 0xd9, 0x2d, 0x8a, 0x2d, 0xb1, 0xf3, 0xa4, 0xb3, 0x27,
+ 0xf3, 0xe2, 0x54, 0x65, 0x73, 0xa2, 0x03, 0x53, 0xe1, 0xc2, 0x0c, 0x71,
+ 0x9b, 0x4f, 0x9b, 0x6b, 0xb4, 0x36, 0x52, 0xcb, 0xa8, 0x16, 0xa0, 0x05,
+ 0x72, 0x53, 0xe7, 0xb1, 0x2a, 0xc2, 0xa8, 0x03, 0x8f, 0x77, 0x0c, 0x34,
+ 0x4d, 0x18, 0x6f, 0x8c, 0x3c, 0x75, 0xd8, 0x06, 0xf8, 0xb4, 0xb7, 0x58,
+ 0xd3, 0xb3, 0x50, 0x3b, 0xd4, 0x7f, 0xfc, 0x92, 0xda, 0x16, 0x85, 0x1e,
+ 0x7a, 0xad, 0xf7, 0x1b, 0xd9, 0x23, 0x82, 0x6b, 0x69, 0xfd, 0x23, 0x37,
+ 0x1a, 0xf8, 0x6e, 0x5d, 0x1b, 0xf4, 0x2e, 0x8b, 0xc6, 0x2f, 0x4a, 0x32,
+ 0x27, 0xf4, 0x63, 0x3e, 0x2b, 0xa3, 0x2e, 0x75, 0x23, 0xda, 0xe6, 0xfc,
+ 0xfa, 0x9b, 0x75, 0xf5, 0x93, 0x12, 0x02, 0xc5, 0x55, 0x2a, 0xbf, 0x66,
+ 0xf0, 0x99, 0xf5, 0x2b, 0x7e, 0xe8, 0x1b, 0x7d, 0x28, 0x6c, 0xca, 0x41,
+ 0x5e, 0x7b, 0xf6, 0xd2, 0x6b, 0x76, 0x62, 0xbd, 0x4f, 0x05, 0x2f, 0xdf,
+ 0x0d, 0x92, 0xbd, 0x39, 0x36, 0x65, 0xe7, 0x9b, 0x68, 0x29, 0x22, 0x80,
+ 0x2e, 0x60, 0x7d, 0x69, 0xa6, 0xcf, 0xf0, 0x4f, 0x64, 0x74, 0x81, 0x66,
+ 0xcc, 0x99, 0xb6, 0xba, 0x8e, 0xeb, 0x37, 0xdd, 0xed, 0xd5, 0xd5, 0x8d,
+ 0x68, 0xab, 0x16, 0x64, 0x23, 0x4c, 0x33, 0x05, 0x5d, 0x9f, 0xc3, 0xb5,
+ 0x49, 0x7d, 0x2e, 0x17, 0x02, 0x2e, 0x42, 0xac, 0x3a, 0xb4, 0x98, 0xae,
+ 0xf5, 0x8c, 0x1e, 0x40, 0xb7, 0xb1, 0x32, 0x48, 0x55, 0x9f, 0x2d, 0x60,
+ 0x20, 0xd9, 0xa6, 0x80, 0xde, 0x94, 0xa8, 0x52, 0x78, 0x92, 0x88, 0x8f,
+ 0xe7, 0x13, 0x5e, 0x89, 0xb3, 0x01, 0xce, 0x67, 0xdd, 0x0c, 0x23, 0x00,
+ 0xba, 0x0c, 0xb8, 0x78, 0x76, 0x7a, 0xb6, 0xb7, 0x69, 0x0b, 0xce, 0xb9,
+ 0x7a, 0x42, 0xe0, 0x26, 0x2c, 0x00, 0xa3, 0x45, 0xa2, 0x50, 0xb4, 0x6b,
+ 0xd4, 0x3d, 0x86, 0xb6, 0x25, 0xd0, 0xd3, 0x21, 0x5a, 0xf0, 0x3d, 0x38,
+ 0xfc, 0x5d, 0xd5, 0x8d, 0xd7, 0x54, 0xd2, 0x1d, 0x4b, 0x07, 0x38, 0xf9,
+ 0x59, 0x88, 0xd3, 0x53, 0x6b, 0x8a, 0x3e, 0x40, 0x6e, 0x86, 0xa8, 0xa7,
+ 0x4c, 0xda, 0x1d, 0x5a, 0xa8, 0xc3, 0x47, 0x67, 0x92, 0x9c, 0x78, 0x14,
+ 0x49, 0xe9, 0x92, 0x20, 0xaf, 0x7b, 0x10, 0x01, 0x09, 0x2d, 0x2f, 0xe5,
+ 0xfb, 0xd6, 0x66, 0x5b, 0x90, 0xb7, 0x94, 0xd8, 0x96, 0x41, 0xaa, 0x47,
+ 0xb1, 0x92, 0x66, 0x69, 0x10, 0x28, 0x8d, 0x42, 0x5a, 0x16, 0x99, 0x34,
+ 0x7f, 0x4b, 0x93, 0xb7, 0x27, 0xe3, 0x73, 0x3f, 0x86, 0x04, 0x3d, 0x2c,
+ 0x48, 0x20, 0x6c, 0x23, 0xe5, 0x79, 0x89, 0x45, 0x27, 0xc7, 0xe3, 0xf3,
+ 0x51, 0xac, 0x05, 0xc6, 0x7e, 0x32, 0xa6, 0xe2, 0x25, 0x0f, 0x78, 0x84,
+ 0xb3, 0x17, 0x19, 0x90, 0x8c, 0x83, 0x63, 0x0a, 0x40, 0x97, 0x57, 0x5e,
+ 0x56, 0x56, 0xc8, 0xa9, 0x34, 0xc5, 0x3f, 0x72, 0xde, 0xb7, 0xe4, 0x8c,
+ 0x6b, 0x88, 0xa8, 0x5e, 0x5e, 0x0c, 0x3d, 0x68, 0x4a, 0xd6, 0x77, 0xd0,
+ 0xec, 0xcc, 0x70, 0xaf, 0xb9, 0xa1, 0x3e, 0x86, 0x36, 0xe6, 0x86, 0xf0,
+ 0x13, 0x33, 0x92, 0xc0, 0x8a, 0xb6, 0xbc, 0xdd, 0x93, 0x24, 0x03, 0x84,
+ 0x31, 0xdc, 0x4c, 0xf4, 0xf4, 0xa3, 0x98, 0x8a, 0x08, 0xd1, 0xa1, 0xa3,
+ 0x34, 0xc7, 0x6c, 0x97, 0x80, 0x50, 0xcc, 0xee, 0x17, 0xc6, 0x29, 0xa5,
+ 0x2e, 0x1e, 0x51, 0x77, 0xe6, 0x3a, 0x64, 0x5b, 0x67, 0xec, 0x6f, 0xb2,
+ 0xb3, 0xee, 0x43, 0x55, 0xce, 0xa7, 0x8c, 0x2c, 0x5a, 0xb7, 0xa1, 0x45,
+ 0x19, 0x45, 0x82, 0x44, 0x0e, 0xb7, 0x52, 0x22, 0xc7, 0x48, 0xcf, 0x4e,
+ 0xb2, 0x4b, 0xae, 0x95, 0xef, 0x3b, 0xfc, 0x91, 0x33, 0xc8, 0x11, 0x27,
+ 0x1b, 0xc4, 0x00, 0xef, 0x62, 0x38, 0x4d, 0x16, 0xcb, 0xa6, 0x48, 0xde,
+ 0x1f, 0xbf, 0x3a, 0xe9, 0x42, 0x1d, 0x21, 0x2f, 0xd9, 0x2e, 0x95, 0xaa,
+ 0x84, 0x54, 0x68, 0x62, 0x47, 0x82, 0xa0, 0xcf, 0xb2, 0xc8, 0xcd, 0xf7,
+ 0x13, 0x56, 0x5d, 0x2f, 0xa9, 0x2e, 0xc6, 0x48, 0xbf, 0x6b, 0x77, 0x8d,
+ 0xad, 0xd7, 0xb6, 0x1f, 0x60, 0x3e, 0xf5, 0x8a, 0x69, 0x24, 0x5f, 0x33,
+ 0x9a, 0xd0, 0xdd, 0xaf, 0x58, 0x3c, 0x69, 0x7b, 0x24, 0x80, 0x19, 0x2d,
+ 0xd0, 0x6e, 0xe6, 0x2e, 0xda, 0x42, 0x35, 0x68, 0xa0, 0x59, 0x90, 0xf7,
+ 0x27, 0x4d, 0xbc, 0xe4, 0xba, 0x36, 0x68, 0x51, 0x59, 0x49, 0x15, 0xe9,
+ 0xc6, 0xeb, 0x77, 0xa7, 0x6f, 0x86, 0xe7, 0xa7, 0x9b, 0xc4, 0x23, 0x18,
+ 0xba, 0x3f, 0x3f, 0xa4, 0xb6, 0x0d, 0x67, 0x1d, 0xe6, 0x8b, 0xf8, 0xd9,
+ 0x36, 0x6a, 0x02, 0x6a, 0x74, 0x2d, 0x68, 0x30, 0x3d, 0x7d, 0x2b, 0x68,
+ 0x06, 0x53, 0xb0, 0x1a, 0x02, 0x3f, 0x86, 0x61, 0xa4, 0x49, 0x4a, 0xda,
+ 0xa2, 0x8d, 0x62, 0x71, 0x4a, 0x87, 0xc8, 0xed, 0x8b, 0x65, 0x7d, 0x9f,
+ 0x48, 0xb5, 0x6e, 0x4d, 0xdb, 0x64, 0x0c, 0xa9, 0x30, 0x34, 0xa0, 0xd0,
+ 0x87, 0x16, 0xf7, 0x89, 0x0a, 0x18, 0xb9, 0x48, 0xae, 0x29, 0xcd, 0xd1,
+ 0x4d, 0xab, 0xaa, 0xbc, 0xd5, 0x4b, 0x0b, 0x95, 0xf4, 0x66, 0x0f, 0xcd,
+ 0xd4, 0x69, 0x93, 0xaa, 0xfb, 0x5e, 0xac, 0x1c, 0x81, 0x7f, 0xd3, 0xfe,
+ 0xeb, 0x2b, 0x75, 0xbf, 0xa7, 0x6d, 0x04, 0x13, 0x4d, 0xa7, 0x1f, 0x36,
+ 0xd5, 0x92, 0x2a, 0x74, 0x7b, 0x32, 0xf8, 0x4e, 0x80, 0x87, 0xd9, 0x49,
+ 0xc1, 0x1f, 0x08, 0x44, 0x25, 0xc1, 0x19, 0xa1, 0x69, 0x9e, 0x2d, 0x78,
+ 0xd4, 0x26, 0x4e, 0x7f, 0x08, 0x8e, 0xaf, 0x20, 0x57, 0x93, 0x46, 0x3f,
+ 0x9b, 0xb9, 0x24, 0x7c, 0xc1, 0x3f, 0xcd, 0x1b, 0xee, 0x63, 0xaa, 0xf9,
+ 0x37, 0xc0, 0xa5, 0xe3, 0x3e, 0xca, 0xe9, 0x7d, 0x68, 0x77, 0x29, 0xe6,
+ 0x54, 0x4e, 0x78, 0x1f, 0xd3, 0xe5, 0x04, 0xbb, 0x44, 0xe1, 0x3e, 0xea,
+ 0x92, 0x7a, 0xc1, 0x30, 0xb8, 0x0a, 0x9a, 0x41, 0x43, 0xbb, 0xea, 0x03,
+ 0xf6, 0xde, 0x74, 0x55, 0x2c, 0x7e, 0xca, 0xb6, 0x7e, 0x23, 0x3d, 0x92,
+ 0x72, 0xfa, 0x6c, 0xdb, 0xb2, 0x8e, 0xbd, 0x49, 0x01, 0x25, 0xd7, 0x78,
+ 0x3a, 0x94, 0x55, 0xd4, 0x82, 0x00, 0xe0, 0xeb, 0x12, 0xf4, 0x27, 0x9c,
+ 0x50, 0x62, 0x5f, 0x44, 0xdc, 0xbf, 0x4e, 0x6b, 0x23, 0x93, 0xda, 0x23,
+ 0x6e, 0xae, 0xf0, 0x4d, 0x2f, 0xb5, 0x4c, 0xc5, 0xdb, 0xbd, 0x93, 0x81,
+ 0xb7, 0x1b, 0x3d, 0x3b, 0xa7, 0xa9, 0xef, 0x22, 0xd4, 0x38, 0x33, 0xc3,
+ 0xa3, 0xb9, 0x88, 0x28, 0xa0, 0x58, 0x52, 0xc2, 0x7f, 0x4a, 0x4d, 0xc3,
+ 0x6f, 0x62, 0x92, 0x29, 0xb5, 0x9d, 0x31, 0x9b, 0x44, 0x3f, 0x9a, 0x6c,
+ 0x68, 0x1d, 0xad, 0x2d, 0xec, 0x3a, 0x91, 0x5f, 0xed, 0xdb, 0x4a, 0x5f,
+ 0x12, 0x68, 0x9d, 0xe1, 0xf6, 0x7e, 0xfc, 0x31, 0x69, 0xb7, 0xb1, 0xde,
+ 0x1c, 0x84, 0x15, 0x26, 0x7e, 0x89, 0xcf, 0xb4, 0xf4, 0xa7, 0x1b, 0x54,
+ 0x29, 0x32, 0xcf, 0x19, 0x6d, 0x00, 0x05, 0x11, 0x23, 0x0b, 0xbb, 0xd1,
+ 0x94, 0xc6, 0xf4, 0xbb, 0xd6, 0xb2, 0x35, 0x24, 0x6f, 0xb8, 0xec, 0x0d,
+ 0xf2, 0x93, 0xa1, 0x64, 0x36, 0x4c, 0xf8, 0x81, 0xb4, 0xd5, 0xbc, 0x0b,
+ 0x0e, 0xa8, 0x20, 0x21, 0xdd, 0x27, 0x56, 0xed, 0x3c, 0x33, 0xd7, 0x14,
+ 0x58, 0x10, 0x94, 0xf7, 0x07, 0x5b, 0x6d, 0x33, 0x90, 0x0a, 0xd6, 0x85,
+ 0xdb, 0x9e, 0x7b, 0x74, 0x70, 0x36, 0xec, 0xa4, 0xca, 0xc4, 0xd1, 0x50,
+ 0xdb, 0x46, 0x05, 0x41, 0x08, 0x99, 0x20, 0x90, 0x66, 0x9c, 0xb7, 0xc6,
+ 0x4e, 0xd5, 0xd4, 0x3b, 0x31, 0x0e, 0xc1, 0xb2, 0xb3, 0x67, 0x5c, 0xd9,
+ 0x12, 0xa8, 0xee, 0xb7, 0x25, 0x29, 0x4f, 0x84, 0x28, 0x02, 0xfc, 0xbd,
+ 0x92, 0x3d, 0x5a, 0xe8, 0xc2, 0xac, 0x57, 0xcd, 0x1f, 0xf4, 0xdc, 0x8e,
+ 0xc0, 0x90, 0x36, 0x1a, 0x46, 0x5c, 0x10, 0x8b, 0x7f, 0xaa, 0x30, 0xc1,
+ 0xc6, 0x10, 0x5a, 0x32, 0xe5, 0xc2, 0x69, 0x7f, 0x37, 0x72, 0x15, 0x6b,
+ 0x88, 0x9c, 0x95, 0x69, 0x94, 0x4b, 0xcc, 0x61, 0xb8, 0x04, 0xb0, 0xdd,
+ 0xee, 0xc8, 0x32, 0xf4, 0x10, 0x89, 0x19, 0x0b, 0xf4, 0xc7, 0x8e, 0x2d,
+ 0x63, 0x8f, 0x0e, 0xf1, 0x58, 0xdd, 0x97, 0x6b, 0xe2, 0x42, 0x66, 0xd2,
+ 0x8b, 0xc6, 0x27, 0x18, 0xee, 0xd7, 0xcb, 0x56, 0x5a, 0x4b, 0xce, 0x1d,
+ 0x5c, 0x09, 0x8e, 0x65, 0x10, 0x31, 0x76, 0xd8, 0xa5, 0x30, 0x2d, 0x03,
+ 0x37, 0xac, 0xad, 0xf9, 0xe5, 0x93, 0x40, 0xd8, 0x27, 0x32, 0x72, 0x2b,
+ 0x19, 0x28, 0x50, 0x94, 0xeb, 0x64, 0x6f, 0x7b, 0xc7, 0x58, 0x4a, 0xdb,
+ 0xbb, 0xe8, 0xcd, 0xbd, 0xb7, 0xbd, 0x67, 0xb1, 0x23, 0x5a, 0x67, 0x44,
+ 0x2a, 0x68, 0xc8, 0x17, 0xc2, 0x16, 0xa8, 0x39, 0x48, 0x77, 0x77, 0x61,
+ 0xd3, 0x8f, 0xac, 0x5d, 0x44, 0x31, 0xb4, 0x95, 0x9c, 0xe1, 0x54, 0x1d,
+ 0x21, 0x11, 0xac, 0x0b, 0xfb, 0x7c, 0x72, 0xdd, 0x34, 0x55, 0x20, 0x01,
+ 0x6e, 0x65, 0xd4, 0xd7, 0x14, 0xac, 0xe9, 0x22, 0xca, 0xc9, 0x86, 0xfb,
+ 0x08, 0x3c, 0xd8, 0x44, 0xa2, 0x8a, 0x00, 0x59, 0x99, 0x95, 0xde, 0xf5,
+ 0x15, 0x1f, 0xb8, 0x4e, 0x88, 0x16, 0xf1, 0x55, 0x05, 0x8d, 0xd6, 0xe0,
+ 0x68, 0xa7, 0xdb, 0x7d, 0xca, 0xf6, 0x30, 0xcc, 0x4d, 0x44, 0x0c, 0x4e,
+ 0x32, 0xff, 0x42, 0x93, 0xf3, 0xf8, 0x5f, 0x7b, 0x51, 0x63, 0x5d, 0xf0,
+ 0x64, 0xc8, 0x03, 0x6a, 0x55, 0x38, 0xa7, 0xc3, 0xb5, 0xa2, 0xba, 0xec,
+ 0x07, 0xe1, 0xe7, 0x63, 0x6e, 0x7a, 0x76, 0x0a, 0x38, 0x27, 0x41, 0x9d,
+ 0xcd, 0x04, 0x9a, 0x64, 0xd9, 0xca, 0x71, 0x1a, 0x02, 0x71, 0x6a, 0xa8,
+ 0x0b, 0x7a, 0x29, 0x7f, 0x09, 0xbc, 0x9f, 0xe8, 0x01, 0x0d, 0x5d, 0x1b,
+ 0x7d, 0x7c, 0x36, 0xad, 0x47, 0x06, 0x36, 0x24, 0x8d, 0x61, 0x89, 0x22,
+ 0xaa, 0xcf, 0x74, 0xc9, 0xf5, 0x39, 0x90, 0xfa, 0xdd, 0x7b, 0xae, 0x75,
+ 0xe9, 0xf4, 0xee, 0xa8, 0xea, 0x96, 0xc1, 0xf8, 0x9a, 0xb4, 0x61, 0x51,
+ 0x1d, 0x9c, 0x8e, 0x6d, 0x1e, 0x8b, 0x09, 0x84, 0x5a, 0xb3, 0xed, 0xd1,
+ 0xa4, 0x5c, 0xdd, 0xf7, 0x32, 0xc7, 0xce, 0x74, 0x92, 0x83, 0x06, 0xcd,
+ 0xba, 0xe1, 0x59, 0x0b, 0x8d, 0x5e, 0x22, 0xc5, 0x80, 0x49, 0x41, 0x5b,
+ 0x8a, 0xb6, 0x46, 0x9a, 0xd4, 0xd9, 0x9a, 0x29, 0xc7, 0x56, 0x80, 0xbf,
+ 0xad, 0xa9, 0x1f, 0xb1, 0x9c, 0x5d, 0xce, 0xfb, 0xc0, 0x86, 0xb6, 0x17,
+ 0xba, 0x98, 0x11, 0x06, 0x26, 0xec, 0x08, 0x69, 0xd4, 0xfd, 0x64, 0x80,
+ 0xbf, 0x3d, 0xdd, 0x7e, 0xc1, 0xec, 0x74, 0x7c, 0x74, 0xfe, 0xba, 0xeb,
+ 0x1e, 0xac, 0x0c, 0x6b, 0xf3, 0x9f, 0xc3, 0x2c, 0xad, 0xae, 0x8d, 0xb9,
+ 0x42, 0x70, 0x56, 0x43, 0x6a, 0x91, 0x32, 0xdc, 0xde, 0x8e, 0x65, 0x82,
+ 0x7c, 0x42, 0x04, 0x8f, 0xbd, 0x8e, 0x4a, 0x4e, 0x46, 0xc2, 0x90, 0xc8,
+ 0xdd, 0x0f, 0xb6, 0xdc, 0x66, 0x2f, 0x8b, 0xc7, 0x2f, 0x8f, 0xb7, 0x52,
+ 0x00, 0xb4, 0x34, 0x11, 0xd7, 0x54, 0x07, 0xab, 0xd4, 0x33, 0xda, 0xbb,
+ 0x5a, 0x93, 0x83, 0xf8, 0xdd, 0x60, 0xc3, 0xa4, 0xb9, 0xdf, 0x4c, 0xb8,
+ 0xd1, 0x27, 0x77, 0xe4, 0x6b, 0x20, 0x6c, 0x60, 0x96, 0x44, 0xb1, 0x0d,
+ 0x6a, 0xa9, 0xee, 0xac, 0x32, 0x42, 0xc5, 0x63, 0x5d, 0x52, 0x3a, 0x9b,
+ 0x3d, 0x8c, 0xec, 0x07, 0x12, 0x54, 0x93, 0x85, 0xd4, 0xf9, 0xf2, 0xbf,
+ 0xe9, 0x7e, 0x6f, 0x65, 0xe4, 0xee, 0x3e, 0x8d, 0x10, 0x0e, 0x5a, 0xc0,
+ 0xaf, 0x24, 0x9c, 0xd3, 0xb7, 0xd8, 0x25, 0xc8, 0xfd, 0xb7, 0xb4, 0x9a,
+ 0x34, 0x92, 0xfb, 0xad, 0x0d, 0xb7, 0x7f, 0xf1, 0x5a, 0x88, 0xda, 0xa3,
+ 0x55, 0xf8, 0xa0, 0xf6, 0xad, 0x21, 0x94, 0x76, 0xf4, 0x43, 0x89, 0x2f,
+ 0xe6, 0x07, 0x1f, 0xba, 0x82, 0xd1, 0xeb, 0x4a, 0x57, 0x55, 0x6a, 0x2e,
+ 0xcf, 0x7c, 0x41, 0xb0, 0x29, 0x86, 0x3b, 0x5d, 0x95, 0x56, 0x54, 0x1a,
+ 0xc2, 0x42, 0xb8, 0x00, 0x24, 0x1d, 0x1d, 0x57, 0x63, 0xb8, 0x90, 0xbf,
+ 0x43, 0xf4, 0xa1, 0x4b, 0x32, 0x9b, 0xe8, 0xac, 0x35, 0x1a, 0x80, 0x51,
+ 0xfb, 0x53, 0xc7, 0x0f, 0xca, 0xdd, 0xe0, 0x9a, 0x79, 0x77, 0x78, 0x76,
+ 0x9e, 0x9c, 0x9f, 0xfa, 0x3e, 0x05, 0xae, 0x81, 0x27, 0xeb, 0x19, 0x2d,
+ 0xa3, 0xa2, 0x52, 0xde, 0x4e, 0xd4, 0x35, 0x0b, 0x11, 0x83, 0x9c, 0x2f,
+ 0x2c, 0xe4, 0x55, 0x02, 0xa3, 0x10, 0x48, 0xc2, 0x3e, 0xb5, 0x22, 0x95,
+ 0x6d, 0xa0, 0x5e, 0xd7, 0xe7, 0xcf, 0x0a, 0xac, 0xcd, 0x8d, 0xf6, 0xd4,
+ 0x58, 0xce, 0xec, 0x4e, 0x78, 0x7a, 0xb1, 0x56, 0x86, 0x9a, 0x61, 0x6a,
+ 0x6b, 0x1c, 0x39, 0x1d, 0x84, 0xe6, 0x72, 0x93, 0xce, 0xf2, 0xa9, 0x47,
+ 0x95, 0xd0, 0xeb, 0x58, 0x70, 0x2b, 0x02, 0x4e, 0x84, 0x61, 0x75, 0x55,
+ 0x1f, 0x16, 0x6b, 0x32, 0x42, 0x33, 0x5a, 0xc1, 0xe0, 0x17, 0xef, 0x1a,
+ 0x83, 0xec, 0x80, 0xda, 0x70, 0x3f, 0xd0, 0x7a, 0x90, 0x9e, 0x61, 0xb8,
+ 0x7b, 0x1a, 0xef, 0x3a, 0x53, 0x3a, 0x19, 0xd6, 0x99, 0xc6, 0xa8, 0x8d,
+ 0x67, 0xf3, 0xa2, 0x87, 0x5f, 0x7f, 0xed, 0xd9, 0x1b, 0xb8, 0x66, 0x4a,
+ 0xa4, 0x5d, 0xcd, 0xa5, 0x59, 0x24, 0xbc, 0x6d, 0x08, 0xe9, 0x77, 0xb1,
+ 0xa6, 0xb2, 0x45, 0x96, 0xb6, 0xea, 0x3c, 0xda, 0xc2, 0xd8, 0x7a, 0x69,
+ 0xe2, 0xa7, 0x21, 0xea, 0x69, 0x14, 0x57, 0x17, 0xfb, 0xd1, 0x70, 0xf8,
+ 0x35, 0x28, 0x31, 0x90, 0x6d, 0x96, 0xd7, 0x55, 0x26, 0xe8, 0x1d, 0x1b,
+ 0x58, 0x4e, 0xcc, 0x06, 0xec, 0x81, 0xb3, 0xc2, 0xa5, 0x74, 0x60, 0x1d,
+ 0x3c, 0x78, 0x19, 0xd7, 0x81, 0x5b, 0xf3, 0x28, 0xec, 0xfb, 0x9c, 0xf1,
+ 0xab, 0x16, 0xdd, 0xf7, 0xef, 0x5e, 0xff, 0x49, 0xb7, 0x66, 0x53, 0xa7,
+ 0x17, 0xb4, 0x96, 0x6b, 0x4f, 0xf7, 0x22, 0xf3, 0x72, 0x61, 0x05, 0x55,
+ 0xa6, 0x45, 0x75, 0xfe, 0x97, 0xe0, 0x42, 0x84, 0xf5, 0xdc, 0x8c, 0x8e,
+ 0x9e, 0x6c, 0x50, 0xa0, 0xd9, 0x3c, 0x37, 0x16, 0xbf, 0xc6, 0xde, 0xe8,
+ 0x29, 0x7c, 0x82, 0xaf, 0x0f, 0x9f, 0xee, 0xed, 0xee, 0x6c, 0x8e, 0x92,
+ 0x8d, 0xce, 0xed, 0xb6, 0xf9, 0xd9, 0xa3, 0xa8, 0x6d, 0xf7, 0x3b, 0xbb,
+ 0x5b, 0x10, 0xeb, 0x6e, 0x1c, 0xfd, 0x78, 0xf6, 0x36, 0x58, 0xa3, 0x59,
+ 0x53, 0x90, 0x4a, 0xd0, 0xb7, 0x46, 0xa7, 0x37, 0xb7, 0xc6, 0xd7, 0xa4,
+ 0x5e, 0x42, 0x34, 0x49, 0x22, 0xc1, 0xfa, 0xd7, 0x55, 0x4e, 0xc6, 0xde,
+ 0x1a, 0x91, 0x64, 0xed, 0xa4, 0x2c, 0xa6, 0xc6, 0x58, 0x3a, 0x25, 0xd8,
+ 0xcf, 0x6c, 0xcd, 0x9c, 0x82, 0x07, 0x57, 0xd7, 0x2f, 0xd6, 0xdf, 0x0c,
+ 0x70, 0x54, 0x8a, 0x30, 0xc7, 0xeb, 0x0d, 0x7e, 0x08, 0x84, 0x75, 0x5b,
+ 0x63, 0x4f, 0xed, 0xcc, 0x39, 0xc0, 0x41, 0xfe, 0x89, 0xf6, 0x69, 0xbb,
+ 0x43, 0x8f, 0x33, 0xf8, 0x3c, 0x5f, 0x22, 0xa4, 0xf3, 0xc8, 0x68, 0x20,
+ 0xde, 0xd8, 0xd0, 0xc8, 0xd6, 0xa6, 0xd7, 0xba, 0x1b, 0x78, 0xc0, 0x1c,
+ 0xed, 0x1b, 0xc5, 0x8b, 0xe5, 0xf1, 0x98, 0x33, 0xae, 0x73, 0x5b, 0x17,
+ 0x22, 0xf8, 0x0c, 0x94, 0xf6, 0x4e, 0xf8, 0x32, 0x83, 0x36, 0x20, 0x6a,
+ 0x2c, 0x0a, 0x84, 0x24, 0x1a, 0xee, 0xe0, 0x59, 0xb4, 0xb1, 0xa3, 0x21,
+ 0xad, 0x20, 0x58, 0xb3, 0x3b, 0xca, 0x44, 0x26, 0x83, 0xea, 0x59, 0x68,
+ 0x0a, 0x1c, 0xc8, 0x52, 0xd4, 0xf2, 0x61, 0x47, 0xab, 0x6a, 0x5b, 0x50,
+ 0x2a, 0x25, 0x65, 0x74, 0xe0, 0x05, 0xe2, 0x5c, 0x1c, 0x2e, 0x26, 0x46,
+ 0x39, 0x2a, 0xc7, 0x04, 0x13, 0xcf, 0x26, 0xfa, 0xd8, 0x53, 0x64, 0x4e,
+ 0x42, 0x6d, 0x08, 0xc5, 0xe1, 0xa4, 0x50, 0x30, 0xae, 0x37, 0xd0, 0xe6,
+ 0x05, 0xe7, 0xfa, 0xa2, 0x73, 0x79, 0xb3, 0x22, 0x1c, 0xd7, 0xf5, 0xc3,
+ 0xd8, 0xe0, 0x5c, 0x8b, 0xf9, 0x9e, 0x7e, 0x1e, 0x61, 0xbe, 0xb7, 0xa7,
+ 0xe7, 0x47, 0xfb, 0x82, 0x1a, 0xa8, 0xf0, 0x5a, 0xb9, 0x40, 0xdc, 0x70,
+ 0x72, 0x26, 0x95, 0x3b, 0x15, 0x52, 0x76, 0x4b, 0x4a, 0xa1, 0xee, 0xfa,
+ 0x20, 0x76, 0xe4, 0x51, 0x25, 0x41, 0xc7, 0x84, 0x63, 0x1d, 0x4d, 0x90,
+ 0xbe, 0xa7, 0x09, 0x7b, 0x80, 0x0f, 0x11, 0x3b, 0x9a, 0xf9, 0x89, 0xf6,
+ 0x3f, 0x04, 0x5b, 0x02, 0x22, 0x0f, 0x40, 0x6e, 0x58, 0x3f, 0x0c, 0x58,
+ 0x48, 0xe2, 0xe7, 0x70, 0x3a, 0xd8, 0x10, 0xc3, 0x84, 0x1a, 0x34, 0x87,
+ 0x7d, 0x85, 0x11, 0xa3, 0xa6, 0xe0, 0x0c, 0x77, 0x30, 0x55, 0x60, 0xe3,
+ 0xcb, 0x58, 0xab, 0x47, 0x4f, 0x25, 0x73, 0xa1, 0xf4, 0xee, 0xa1, 0x12,
+ 0x0f, 0x05, 0xb9, 0xc2, 0x7b, 0x00, 0xc5, 0xd8, 0x19, 0x6e, 0xcf, 0x93,
+ 0xf2, 0x89, 0x39, 0x47, 0xea, 0xab, 0x20, 0xd7, 0x8a, 0x35, 0xe1, 0x05,
+ 0x16, 0x2b, 0x4c, 0xe0, 0x80, 0x08, 0x6c, 0xfb, 0x06, 0x9d, 0xd7, 0x49,
+ 0xcd, 0x0b, 0xa4, 0xae, 0x65, 0x28, 0x4d, 0xe4, 0xe2, 0x4c, 0xee, 0x2c,
+ 0x1d, 0x07, 0x77, 0xf6, 0x61, 0x4b, 0xc4, 0x08, 0xa4, 0xab, 0x6f, 0x62,
+ 0x14, 0x4d, 0xbf, 0x06, 0x87, 0x11, 0x38, 0xe6, 0x88, 0x94, 0xc0, 0x8c,
+ 0x36, 0x1f, 0x79, 0xba, 0xdd, 0xe3, 0xd0, 0x61, 0x13, 0x8d, 0x96, 0xdc,
+ 0xc9, 0xf4, 0x18, 0xee, 0xe0, 0x62, 0x95, 0xb8, 0xfb, 0xb2, 0x50, 0x84,
+ 0xc8, 0x4f, 0x17, 0x64, 0x9d, 0x0f, 0x64, 0x8f, 0x56, 0x66, 0xf2, 0xbe,
+ 0x91, 0x8d, 0xc1, 0x43, 0x79, 0xa1, 0x49, 0x9a, 0xac, 0xd9, 0x03, 0x41,
+ 0x6a, 0xa6, 0x38, 0xd8, 0xe6, 0x64, 0x96, 0xe8, 0x30, 0x6d, 0xd3, 0x3f,
+ 0x42, 0x67, 0x33, 0xf9, 0xe9, 0x46, 0x49, 0xe2, 0x43, 0x1a, 0x52, 0x2c,
+ 0x8b, 0x4e, 0x85, 0x6c, 0x0c, 0x51, 0x1d, 0x6e, 0xe7, 0x0b, 0x42, 0xb0,
+ 0x48, 0xfe, 0x52, 0x5e, 0x88, 0x27, 0x92, 0xf4, 0xd4, 0x18, 0x38, 0xd8,
+ 0x25, 0xea, 0x47, 0x96, 0x86, 0xcb, 0xa6, 0x4b, 0x8e, 0x2e, 0xd0, 0x84,
+ 0xa4, 0x16, 0x81, 0xbb, 0xc9, 0x53, 0xc8, 0x2f, 0xb9, 0xe2, 0x16, 0x46,
+ 0x48, 0x86, 0x56, 0x28, 0x86, 0xb0, 0xde, 0x7f, 0xb7, 0x0b, 0x01, 0x95,
+ 0x4e, 0xc8, 0x29, 0x68, 0x06, 0x17, 0x70, 0x10, 0x06, 0xf1, 0x74, 0x45,
+ 0x1b, 0xe9, 0xa4, 0x59, 0x0a, 0xe1, 0xbb, 0xb3, 0x2b, 0x35, 0x4e, 0x60,
+ 0xde, 0x45, 0x6b, 0x09, 0x64, 0xe2, 0x4d, 0x0c, 0xe7, 0xa5, 0x93, 0x7b,
+ 0xd5, 0x17, 0xdc, 0xe5, 0x2a, 0x18, 0xb1, 0xae, 0x11, 0x45, 0x58, 0xe5,
+ 0xac, 0x93, 0xa0, 0x78, 0x7f, 0x5e, 0xff, 0xfa, 0x06, 0x50, 0x8f, 0xb7,
+ 0xab, 0xfd, 0x36, 0x7e, 0x1c, 0x79, 0x51, 0x2c, 0xdb, 0xd6, 0x51, 0xcf,
+ 0x9a, 0x94, 0xa8, 0xfc, 0x30, 0xb4, 0x4f, 0xcb, 0x61, 0xc6, 0x91, 0x71,
+ 0x6b, 0x01, 0x20, 0x15, 0x44, 0x5b, 0xd8, 0x1d, 0x87, 0x7a, 0xc4, 0x1b,
+ 0xf9, 0x0a, 0xcb, 0xc3, 0x0d, 0x08, 0x2b, 0x57, 0x51, 0x4d, 0xc3, 0x3c,
+ 0xe1, 0x9c, 0xc9, 0xe4, 0xe9, 0xe7, 0x4f, 0x9f, 0x6c, 0x26, 0x9d, 0x4c,
+ 0xdc, 0xcd, 0x88, 0xe5, 0xc1, 0x27, 0x6e, 0x59, 0xdb, 0x0a, 0xc1, 0x79,
+ 0x0e, 0x23, 0x05, 0x7a, 0x8d, 0x58, 0x24, 0x39, 0xb7, 0xe2, 0x23, 0x93,
+ 0x01, 0xfd, 0x2c, 0x59, 0x28, 0x07, 0x19, 0x34, 0xf4, 0x31, 0xb6, 0x70,
+ 0x92, 0x0d, 0x48, 0xf8, 0xb4, 0x76, 0xc2, 0xdb, 0xd5, 0xc6, 0x71, 0xb1,
+ 0x31, 0x94, 0x34, 0x4d, 0xfe, 0xdc, 0x04, 0x86, 0x43, 0xd4, 0xdd, 0xca,
+ 0x3e, 0x67, 0x68, 0xaa, 0xa2, 0x7a, 0x98, 0x5b, 0xe2, 0xda, 0xf6, 0x25,
+ 0xa4, 0xa1, 0xd9, 0xab, 0xc8, 0xd5, 0x8d, 0x7c, 0xf1, 0xc4, 0xb0, 0xef,
+ 0x81, 0xb5, 0xc2, 0x98, 0x36, 0x1d, 0x3a, 0x32, 0x98, 0x32, 0xe0, 0x47,
+ 0xe4, 0x7d, 0x49, 0x11, 0x94, 0x3d, 0x89, 0x22, 0x63, 0xcc, 0xb3, 0xb9,
+ 0x36, 0x9c, 0x63, 0xd5, 0xa3, 0xac, 0x5c, 0x71, 0x3a, 0x07, 0x2a, 0xf9,
+ 0xba, 0x44, 0xc6, 0x7c, 0x1f, 0x96, 0x97, 0xba, 0xed, 0x52, 0x85, 0xc9,
+ 0x69, 0xcd, 0xac, 0xb7, 0xc2, 0x4b, 0xb9, 0x4d, 0xd1, 0xbd, 0xba, 0x85,
+ 0x5d, 0xfa, 0x77, 0xcb, 0x95, 0x61, 0x4d, 0x27, 0x7f, 0xb5, 0x43, 0x88,
+ 0x9e, 0xd9, 0xc3, 0x92, 0x62, 0x1c, 0x4e, 0xf8, 0xfe, 0xc2, 0x7e, 0xd3,
+ 0xb3, 0x64, 0x03, 0x13, 0xde, 0xda, 0xda, 0x7c, 0x78, 0xd2, 0xf2, 0xe4,
+ 0x43, 0x93, 0x3c, 0x63, 0x47, 0x9c, 0xd7, 0xa2, 0xe6, 0xd2, 0x9b, 0x03,
+ 0x7d, 0xd3, 0x03, 0x8c, 0x19, 0x30, 0x47, 0x4a, 0xaa, 0x25, 0x39, 0xcc,
+ 0xef, 0x23, 0xe5, 0x63, 0x88, 0xac, 0xa6, 0xb2, 0xc0, 0xf6, 0xda, 0xc5,
+ 0x4d, 0xc3, 0x08, 0xa1, 0x22, 0x42, 0x28, 0x37, 0x10, 0x90, 0x8d, 0x07,
+ 0x86, 0x09, 0x43, 0x7d, 0xd3, 0x4d, 0xcb, 0x5b, 0x1c, 0x5c, 0x32, 0x9d,
+ 0x68, 0x13, 0x4e, 0xa1, 0xfa, 0xcc, 0x38, 0x2e, 0x15, 0xa9, 0x0e, 0xd2,
+ 0xa7, 0x6d, 0x86, 0x31, 0x9c, 0x06, 0x11, 0x94, 0x75, 0x7e, 0xd2, 0x75,
+ 0xdc, 0x8e, 0xb4, 0x67, 0x69, 0x85, 0x10, 0x78, 0x40, 0x23, 0x51, 0x3f,
+ 0xba, 0x35, 0x33, 0xc4, 0xb9, 0x1f, 0x04, 0x71, 0xd5, 0xc6, 0x69, 0x15,
+ 0x86, 0x9e, 0x30, 0x37, 0xcb, 0xdf, 0xa0, 0xd8, 0x34, 0xab, 0x27, 0x55,
+ 0x7e, 0xc1, 0x3f, 0x6d, 0x11, 0x73, 0xc0, 0x67, 0x14, 0x50, 0x50, 0x31,
+ 0x5d, 0x1d, 0x8d, 0x58, 0x43, 0x2c, 0x13, 0x4b, 0xc3, 0x95, 0x39, 0xa8,
+ 0x36, 0x09, 0x95, 0x83, 0x22, 0x9c, 0x86, 0x1a, 0xde, 0xb3, 0xea, 0x1b,
+ 0xd6, 0x41, 0xdb, 0xbe, 0xb1, 0xe7, 0x6d, 0x5f, 0x83, 0xc5, 0x65, 0xe9,
+ 0x81, 0x7c, 0x45, 0xfe, 0x71, 0x9d, 0xbc, 0xd5, 0xc7, 0x92, 0x8d, 0xf1,
+ 0xd9, 0xdb, 0xa3, 0x6f, 0x4e, 0x37, 0x1f, 0xf2, 0xa9, 0xb7, 0xe5, 0xbf,
+ 0x5d, 0x57, 0xaa, 0x89, 0xf2, 0x32, 0x7d, 0x58, 0x27, 0xdf, 0x8c, 0xc7,
+ 0xc3, 0x83, 0xb3, 0x63, 0x74, 0xcd, 0x1d, 0x9b, 0xff, 0xf6, 0xb4, 0x77,
+ 0x18, 0xa1, 0xb9, 0xc8, 0xf0, 0x7b, 0xa9, 0x9e, 0xae, 0x45, 0xcd, 0x48,
+ 0xe0, 0xb1, 0x46, 0x66, 0x16, 0x94, 0x07, 0x51, 0xef, 0x2c, 0xb2, 0x0d,
+ 0x86, 0xef, 0x9a, 0x3c, 0x67, 0xc7, 0x5b, 0xf8, 0x14, 0x7d, 0x12, 0x0b,
+ 0xea, 0x71, 0x1f, 0x2c, 0xc3, 0x9e, 0xb9, 0xa4, 0xf9, 0x20, 0xcb, 0x1a,
+ 0x02, 0x5a, 0xcb, 0x21, 0x8c, 0xe5, 0x47, 0xd7, 0x89, 0x8b, 0x5a, 0xc7,
+ 0x8b, 0xcf, 0xc8, 0x75, 0x4b, 0xd5, 0x45, 0x8a, 0xc3, 0xdc, 0x71, 0x15,
+ 0xc3, 0x44, 0x63, 0xb4, 0xcd, 0x19, 0xf5, 0xc4, 0x18, 0x6b, 0xd6, 0x63,
+ 0xd7, 0x29, 0xb2, 0x3e, 0x5c, 0x26, 0xc9, 0xfe, 0x3a, 0x67, 0x58, 0x67,
+ 0x45, 0xb9, 0xbc, 0xba, 0x66, 0x03, 0xab, 0xed, 0x87, 0x68, 0x35, 0xcf,
+ 0xb6, 0xed, 0x60, 0xcc, 0x24, 0x03, 0x16, 0xc4, 0x3b, 0xaa, 0xf7, 0x54,
+ 0x19, 0x45, 0x48, 0x59, 0xbd, 0xe1, 0xdc, 0xb7, 0xe9, 0x3f, 0xa5, 0xdd,
+ 0xe4, 0x0a, 0x0d, 0xe4, 0x82, 0xb2, 0x07, 0x88, 0xb6, 0x45, 0x33, 0x83,
+ 0xfa, 0x9a, 0x16, 0xf7, 0x70, 0xec, 0x4b, 0x98, 0x0b, 0xb5, 0xcf, 0x96,
+ 0x9b, 0xdb, 0x2c, 0xde, 0x54, 0x13, 0x98, 0xf8, 0x9c, 0x7e, 0xcd, 0x45,
+ 0xcf, 0xab, 0xb8, 0x95, 0x94, 0x79, 0xa3, 0x83, 0x1b, 0x73, 0x0a, 0xea,
+ 0x79, 0x31, 0xd0, 0x51, 0x06, 0xc6, 0x10, 0x96, 0x38, 0xb1, 0xa8, 0xc0,
+ 0xb2, 0xfd, 0x11, 0x21, 0x84, 0x7e, 0xb2, 0x1b, 0xe9, 0x45, 0x5d, 0xce,
+ 0x96, 0x0d, 0xb4, 0x00, 0x72, 0xdf, 0x53, 0x61, 0xd9, 0xa6, 0x86, 0xb9,
+ 0x81, 0xae, 0x5e, 0x4d, 0x34, 0xc1, 0x99, 0x03, 0x46, 0x11, 0xc7, 0xa4,
+ 0x6b, 0x76, 0x3c, 0x72, 0xc1, 0x2a, 0x0e, 0xa4, 0x8b, 0x67, 0x82, 0x68,
+ 0xca, 0x63, 0x61, 0xa8, 0x05, 0x52, 0xf2, 0x6e, 0x14, 0x38, 0x32, 0xdc,
+ 0x39, 0xdd, 0xa5, 0x16, 0x75, 0x2c, 0xd2, 0x5f, 0x95, 0xb5, 0x8b, 0x34,
+ 0x9c, 0xbe, 0x18, 0x93, 0x69, 0xbd, 0x59, 0xfa, 0x9a, 0x29, 0x73, 0x41,
+ 0xe7, 0xe3, 0xe2, 0xde, 0x7e, 0x8c, 0xbf, 0x93, 0x22, 0x8d, 0xcd, 0xaa,
+ 0xc0, 0x8f, 0x85, 0x15, 0x73, 0x9b, 0xd1, 0x96, 0x6b, 0x3b, 0xed, 0xc6,
+ 0xdd, 0xed, 0x2f, 0x75, 0x86, 0xfe, 0x9e, 0x90, 0x13, 0xec, 0x16, 0x63,
+ 0x37, 0x5a, 0x9b, 0xdc, 0x01, 0xbd, 0x11, 0x2f, 0x03, 0x11, 0x62, 0x84,
+ 0x27, 0x02, 0xd6, 0xa5, 0x3c, 0x12, 0xbb, 0x2a, 0x55, 0x8c, 0xc8, 0xd3,
+ 0x96, 0x72, 0x6f, 0x5e, 0x7e, 0xd9, 0xfb, 0x86, 0x2d, 0x83, 0x2b, 0x57,
+ 0xb7, 0xcf, 0x76, 0xbb, 0x33, 0x7a, 0x04, 0x41, 0xdc, 0xfa, 0xdd, 0x0f,
+ 0x03, 0x9b, 0xce, 0x26, 0x4b, 0xd4, 0x13, 0x41, 0x02, 0x1d, 0x09, 0x17,
+ 0x6e, 0x7c, 0x90, 0xbf, 0xd0, 0x19, 0xf8, 0x21, 0x2f, 0x8c, 0x4e, 0x58,
+ 0x6f, 0x2a, 0x73, 0x4a, 0x62, 0x66, 0x78, 0x6a, 0xab, 0x75, 0xea, 0x0f,
+ 0x6d, 0x64, 0x8d, 0x4b, 0x52, 0x25, 0x95, 0x99, 0x43, 0x8b, 0x81, 0x10,
+ 0xf2, 0xba, 0x24, 0xdf, 0x2f, 0x82, 0xda, 0xb1, 0x89, 0x15, 0x37, 0x18,
+ 0x03, 0x30, 0xe8, 0xc6, 0x20, 0x28, 0xf2, 0x3b, 0x97, 0xdf, 0x62, 0x91,
+ 0x07, 0xfd, 0x90, 0xbf, 0x11, 0x81, 0x74, 0x51, 0x45, 0x66, 0x17, 0x04,
+ 0x5b, 0x89, 0xba, 0x58, 0xe7, 0xc6, 0xd3, 0xcd, 0xe4, 0xb2, 0x59, 0x6c,
+ 0xec, 0x6c, 0x72, 0x4f, 0x0c, 0x86, 0x65, 0xf0, 0x3b, 0x24, 0x87, 0xfe,
+ 0x1b, 0xca, 0xab, 0x4d, 0x0e, 0xed, 0x67, 0x11, 0xf5, 0x27, 0x30, 0x43,
+ 0x14, 0xb0, 0x5e, 0xca, 0x09, 0x66, 0x82, 0xd9, 0x66, 0x45, 0xb6, 0x3c,
+ 0xb8, 0xeb, 0x17, 0x40, 0xd2, 0xdb, 0x82, 0x70, 0xa2, 0x51, 0xd8, 0x6b,
+ 0x6c, 0x87, 0xbc, 0xf1, 0x11, 0xb9, 0xa9, 0xf7, 0x08, 0x57, 0xfd, 0x1b,
+ 0xca, 0xcd, 0xa6, 0x43, 0x92, 0x21, 0x57, 0x55, 0x69, 0x2e, 0xc7, 0x2a,
+ 0x02, 0xa6, 0x2b, 0xd6, 0xc4, 0x39, 0x4a, 0xcf, 0x6e, 0xf2, 0xaa, 0x2c,
+ 0x00, 0xc6, 0x79, 0x93, 0x56, 0x39, 0xf2, 0x5c, 0xd6, 0xbe, 0x3d, 0x7d,
+ 0x73, 0xb4, 0xe6, 0xbb, 0x43, 0x2e, 0x73, 0xad, 0x9e, 0xbd, 0x0e, 0x5b,
+ 0x32, 0xd8, 0xdd, 0x8c, 0xb9, 0x0b, 0xcd, 0x65, 0x3e, 0xf9, 0xa8, 0xd0,
+ 0x19, 0xf7, 0x0c, 0x93, 0x98, 0xd9, 0xba, 0x72, 0xa3, 0x44, 0x4a, 0x0a,
+ 0x8c, 0x34, 0x69, 0x55, 0x0e, 0x43, 0x0e, 0x5c, 0xac, 0x95, 0x96, 0x1a,
+ 0x85, 0x68, 0xa7, 0x55, 0xfa, 0x6d, 0x42, 0x13, 0xaf, 0x95, 0x28, 0x29,
+ 0xf8, 0x5a, 0x96, 0xe6, 0x9c, 0xeb, 0xdd, 0x8b, 0x71, 0x7e, 0x4f, 0x36,
+ 0xcd, 0x7a, 0xfb, 0xea, 0x5b, 0xaf, 0xc9, 0x0c, 0x6f, 0xd6, 0x95, 0xbc,
+ 0x48, 0x95, 0x76, 0x32, 0x3e, 0x6c, 0xdf, 0xde, 0xf3, 0x75, 0xe6, 0x6a,
+ 0xfe, 0x84, 0x1b, 0x9d, 0x07, 0x77, 0xa7, 0x6f, 0x9f, 0x4f, 0xdf, 0x5d,
+ 0x13, 0xc5, 0x06, 0xf3, 0x8b, 0x45, 0x52, 0x57, 0x1d, 0xd9, 0x6e, 0xfe,
+ 0xde, 0xce, 0x5d, 0xa1, 0x8e, 0x35, 0xa1, 0x3f, 0xd1, 0x7c, 0xbe, 0x9c,
+ 0xe4, 0x7e, 0x82, 0x48, 0x80, 0x1e, 0xaf, 0xfa, 0x51, 0xe1, 0xf5, 0x3a,
+ 0xc2, 0x68, 0xbd, 0xe8, 0xc5, 0xe6, 0xca, 0x46, 0x16, 0xa1, 0xc6, 0xe3,
+ 0xf2, 0x8a, 0xf0, 0xab, 0x5c, 0xbe, 0x83, 0x7c, 0x69, 0xe0, 0x23, 0x09,
+ 0x0c, 0x7a, 0xf0, 0xcc, 0x5d, 0x26, 0x96, 0xd5, 0x48, 0x18, 0xd0, 0x9b,
+ 0x21, 0xa1, 0x6d, 0x8e, 0x8c, 0xa2, 0x62, 0x87, 0x9a, 0xb1, 0xa5, 0xa4,
+ 0xba, 0xb4, 0x51, 0xad, 0x67, 0xfe, 0xc6, 0x86, 0x8c, 0xde, 0x58, 0x6c,
+ 0xcf, 0xb3, 0xaa, 0x41, 0xbd, 0x8c, 0x14, 0xaf, 0x3f, 0x6a, 0x57, 0xdb,
+ 0xf3, 0x68, 0x96, 0x26, 0x6d, 0x59, 0xea, 0x65, 0x75, 0x83, 0x8a, 0x6f,
+ 0x69, 0xe6, 0xc7, 0x69, 0xf1, 0x6e, 0x3f, 0x64, 0x1f, 0x22, 0xb7, 0xbc,
+ 0x37, 0x43, 0x4a, 0x59, 0xae, 0x04, 0x15, 0x2e, 0xf9, 0x86, 0x67, 0x61,
+ 0x27, 0x68, 0x6d, 0x1c, 0x02, 0xff, 0x61, 0xfd, 0x35, 0x28, 0x50, 0x29,
+ 0x6b, 0x80, 0x70, 0x37, 0x55, 0x3a, 0x71, 0x7f, 0x19, 0xa6, 0xf5, 0x24,
+ 0xcf, 0xb5, 0x39, 0x1c, 0x45, 0x06, 0x33, 0x4a, 0x05, 0x8f, 0x63, 0x43,
+ 0xd9, 0xfd, 0xb0, 0x7d, 0x99, 0xa6, 0xdc, 0x1b, 0x48, 0x72, 0xb3, 0x52,
+ 0xee, 0x1a, 0x4a, 0x09, 0x4a, 0x28, 0x0c, 0x95, 0xb0, 0x61, 0xac, 0x5f,
+ 0x1e, 0xda, 0x48, 0x98, 0x23, 0xd0, 0x63, 0xd4, 0x1a, 0xbb, 0x7b, 0xc7,
+ 0x37, 0xbc, 0x95, 0x08, 0x43, 0x42, 0x68, 0xab, 0x1b, 0x36, 0x22, 0x6f,
+ 0x6f, 0x77, 0xfd, 0x67, 0x56, 0xe5, 0x6d, 0x74, 0x00, 0xc1, 0x8a, 0x72,
+ 0x98, 0xce, 0x16, 0xd1, 0x0c, 0xcf, 0xf1, 0x66, 0xab, 0x75, 0xee, 0xc1,
+ 0xc9, 0xd9, 0x5b, 0x60, 0x45, 0x52, 0x17, 0x86, 0xa2, 0xe6, 0x7c, 0x1a,
+ 0xfa, 0x19, 0x95, 0x6f, 0x14, 0x0c, 0xa9, 0x8a, 0xcc, 0xaa, 0x69, 0x08,
+ 0x2d, 0xc0, 0x51, 0x71, 0x32, 0x1c, 0x62, 0x96, 0x15, 0xe7, 0xb4, 0x15,
+ 0x89, 0x57, 0xdd, 0xcb, 0x02, 0x5e, 0x2d, 0x8b, 0xee, 0x72, 0xcc, 0x57,
+ 0xdd, 0xb7, 0xb5, 0x61, 0x8b, 0xad, 0xc1, 0x6b, 0xbf, 0x6b, 0xe1, 0x32,
+ 0x4b, 0xc5, 0xc6, 0x0c, 0xe4, 0x79, 0x93, 0x59, 0x50, 0x4e, 0xb1, 0xe8,
+ 0x6c, 0x8c, 0x5c, 0xfc, 0x49, 0x92, 0x4e, 0x04, 0xd0, 0x16, 0x85, 0x87,
+ 0x88, 0xab, 0x13, 0x36, 0x81, 0xd1, 0x10, 0xb6, 0x58, 0x14, 0x5d, 0xac,
+ 0x39, 0x21, 0x77, 0xd4, 0xfc, 0x0c, 0x80, 0x0f, 0x1f, 0x53, 0x12, 0x49,
+ 0x3b, 0x32, 0x5a, 0xb1, 0xc1, 0x6f, 0x07, 0xfc, 0xd5, 0x8b, 0x25, 0x49,
+ 0x88, 0xce, 0x17, 0x64, 0x7b, 0x59, 0x69, 0xe2, 0x27, 0xe8, 0x7b, 0xe2,
+ 0xf8, 0x62, 0x20, 0x31, 0x2a, 0x60, 0xce, 0xd2, 0x39, 0xf5, 0x4c, 0xd5,
+ 0x22, 0x19, 0xf2, 0xf9, 0x52, 0x3e, 0x73, 0x77, 0xc2, 0xcb, 0x54, 0x24,
+ 0x56, 0xab, 0x3d, 0x42, 0xa7, 0x76, 0x86, 0x3f, 0x43, 0x92, 0xd4, 0x1f,
+ 0x3e, 0x56, 0x0f, 0x89, 0xd7, 0x21, 0x43, 0x90, 0x07, 0xc0, 0x11, 0x1b,
+ 0x6d, 0x24, 0xcc, 0x5d, 0x08, 0x78, 0x08, 0x6d, 0xf8, 0x8a, 0x46, 0x78,
+ 0xd7, 0xcb, 0xe2, 0xa3, 0x99, 0x42, 0x08, 0x05, 0xa0, 0xb9, 0xee, 0xd4,
+ 0x4a, 0x87, 0xfb, 0x6f, 0xd3, 0x5f, 0x2c, 0xb2, 0x07, 0x8f, 0x40, 0x0d,
+ 0x10, 0x6e, 0x00, 0xec, 0xfd, 0xbe, 0x6b, 0x8f, 0xc6, 0x66, 0x37, 0xb5,
+ 0xe7, 0xc3, 0xcc, 0xca, 0x12, 0x30, 0x5a, 0xca, 0xa1, 0x3b, 0x2d, 0x3a,
+ 0x19, 0x52, 0x8a, 0xaf, 0xbc, 0x2b, 0x45, 0xe2, 0xd7, 0x0a, 0x9e, 0x86,
+ 0x6a, 0x3c, 0xb2, 0x40, 0x48, 0xb8, 0x04, 0xe2, 0x70, 0x59, 0x73, 0x05,
+ 0xa4, 0x6c, 0x2b, 0xf1, 0x83, 0xdf, 0xca, 0x2e, 0x32, 0x93, 0x36, 0x2e,
+ 0x45, 0x1f, 0x1f, 0xb4, 0xdb, 0x69, 0x3b, 0x18, 0x0b, 0xc9, 0x99, 0xb2,
+ 0x3a, 0x1b, 0x75, 0x99, 0xf6, 0xbb, 0xdc, 0x46, 0xe4, 0x96, 0xcb, 0x50,
+ 0xcc, 0x0a, 0xcb, 0x64, 0xf3, 0x28, 0xe8, 0xf2, 0x27, 0xa7, 0x92, 0x5b,
+ 0x88, 0x47, 0x28, 0xfb, 0xc3, 0x0e, 0x91, 0x8a, 0x47, 0x49, 0xc3, 0xb7,
+ 0xa1, 0x30, 0x7c, 0xdb, 0x96, 0x85, 0x6e, 0xa5, 0x01, 0x86, 0x40, 0xe4,
+ 0x44, 0x3f, 0x28, 0x03, 0x69, 0x78, 0xaa, 0x2f, 0x39, 0x7b, 0x1b, 0x22,
+ 0x1c, 0x88, 0xe3, 0x8f, 0x84, 0xef, 0xc3, 0x52, 0xd0, 0x9a, 0xee, 0xf2,
+ 0xb3, 0x1e, 0xa7, 0xd6, 0xaf, 0x17, 0x81, 0x6a, 0x51, 0x89, 0xa8, 0x0b,
+ 0x25, 0x60, 0x11, 0x08, 0x40, 0xe1, 0xbb, 0x4f, 0x23, 0x02, 0xe9, 0x93,
+ 0xc6, 0xca, 0xbe, 0xa2, 0x7c, 0x14, 0x72, 0x00, 0x06, 0x62, 0xf0, 0xd4,
+ 0x7a, 0x8c, 0xb8, 0xce, 0xcc, 0xb6, 0x6c, 0xd4, 0xb7, 0x12, 0xbc, 0xa5,
+ 0xe2, 0x46, 0x41, 0xa2, 0xe7, 0x4b, 0xc4, 0xd1, 0x82, 0xd2, 0x11, 0xc7,
+ 0xf9, 0x29, 0x23, 0xdc, 0x98, 0x87, 0x6e, 0xd3, 0xaa, 0xe0, 0xcc, 0x98,
+ 0xa9, 0x9f, 0x31, 0x6a, 0x84, 0xa9, 0x3d, 0x5a, 0x33, 0xae, 0x83, 0xa9,
+ 0x43, 0x8f, 0x51, 0x9d, 0xa3, 0x16, 0x3c, 0x6a, 0xc2, 0xe2, 0xd0, 0x58,
+ 0x22, 0x72, 0x61, 0x5b, 0xef, 0xb9, 0xf1, 0x8f, 0x8d, 0x78, 0x37, 0xfa,
+ 0x0f, 0x4d, 0x9b, 0x64, 0x7c, 0x72, 0x2c, 0xfb, 0x77, 0x28, 0x03, 0x8c,
+ 0x8e, 0x47, 0xe2, 0x30, 0x32, 0x43, 0xd4, 0x03, 0xbb, 0xb0, 0x36, 0x60,
+ 0xe9, 0xf3, 0x60, 0xef, 0x84, 0xd9, 0xf2, 0x69, 0x14, 0x79, 0x46, 0x0f,
+ 0xa5, 0x34, 0x07, 0x97, 0x28, 0x13, 0x1d, 0x23, 0x85, 0xbc, 0x3a, 0x7e,
+ 0x65, 0x16, 0x4a, 0x56, 0xc6, 0x95, 0x39, 0x3f, 0x5f, 0xdf, 0x27, 0x3d,
+ 0xc7, 0x92, 0x94, 0x5d, 0x17, 0x89, 0x87, 0x6f, 0x86, 0x70, 0x7d, 0x7d,
+ 0x3c, 0x42, 0x82, 0x27, 0xf5, 0x1a, 0x62, 0x4a, 0x96, 0x84, 0xf4, 0x22,
+ 0x8b, 0xbb, 0x92, 0xc8, 0x14, 0x00, 0x44, 0xc0, 0xf5, 0xd2, 0x70, 0x2a,
+ 0xa9, 0x29, 0xdc, 0x39, 0x90, 0x93, 0xcf, 0x4b, 0x32, 0x0f, 0x20, 0x6e,
+ 0x69, 0xc2, 0xde, 0x8c, 0x03, 0x2e, 0xe0, 0xd0, 0x43, 0x9d, 0x19, 0x11,
+ 0xca, 0x15, 0x8e, 0x17, 0x55, 0xf9, 0x31, 0x63, 0x79, 0x01, 0xa3, 0x10,
+ 0x88, 0x71, 0xac, 0x03, 0x8b, 0x07, 0xdd, 0xdc, 0x50, 0xdc, 0x1d, 0x88,
+ 0xb2, 0x4c, 0x82, 0x50, 0x39, 0xf7, 0x2a, 0x16, 0xa8, 0x19, 0x77, 0x8f,
+ 0xe5, 0x78, 0x1d, 0x18, 0x2f, 0xda, 0xd0, 0x87, 0x8f, 0xda, 0x84, 0x92,
+ 0x07, 0xff, 0x89, 0x32, 0xdb, 0xee, 0xba, 0x2f, 0xb3, 0x23, 0x5b, 0xfa,
+ 0xf8, 0x0e, 0xc4, 0x86, 0x97, 0xe0, 0xbc, 0x4c, 0x5e, 0xb2, 0x40, 0xb8,
+ 0xbb, 0x47, 0xf9, 0x73, 0xd7, 0x43, 0x89, 0x2e, 0xda, 0x43, 0xb5, 0x16,
+ 0xa7, 0x89, 0xeb, 0xfc, 0xc1, 0x25, 0x65, 0x9c, 0x7d, 0x39, 0x75, 0xb8,
+ 0xd5, 0xd2, 0x4b, 0x07, 0x38, 0x3b, 0x21, 0x10, 0x34, 0xb9, 0x38, 0xad,
+ 0xeb, 0x8d, 0xf3, 0x44, 0x61, 0x3e, 0xd1, 0xee, 0x00, 0x6e, 0x0c, 0x8d,
+ 0x1a, 0xc4, 0x3e, 0xf8, 0x57, 0xca, 0x14, 0x35, 0xc6, 0x48, 0x43, 0xc9,
+ 0x7b, 0xfc, 0xa5, 0xc0, 0x5c, 0xe0, 0xae, 0xb2, 0xb6, 0xc4, 0x8d, 0x71,
+ 0x70, 0x2c, 0x96, 0x16, 0xb5, 0x4d, 0xf0, 0xb5, 0x3a, 0x6e, 0xf3, 0x93,
+ 0x1c, 0x91, 0xa5, 0x19, 0x31, 0xe2, 0x15, 0x3a, 0x08, 0x6b, 0xcc, 0xa5,
+ 0xa3, 0x05, 0xe7, 0xd9, 0x89, 0x47, 0x24, 0xd5, 0x04, 0x3a, 0x59, 0x78,
+ 0x1b, 0xe1, 0x33, 0xd2, 0xf9, 0x46, 0xd2, 0xd4, 0xd0, 0xe0, 0x5a, 0x30,
+ 0xb7, 0xc1, 0x00, 0xda, 0x4f, 0xb6, 0x95, 0xe5, 0x04, 0xeb, 0x12, 0x66,
+ 0xcd, 0x6d, 0xa4, 0x27, 0x2c, 0x66, 0x93, 0xb8, 0x87, 0x06, 0xde, 0xdf,
+ 0xf7, 0x3f, 0xdf, 0x56, 0x64, 0x0e, 0x0a, 0x4d, 0xfa, 0xcf, 0xa0, 0x01,
+ 0x70, 0x44, 0x03, 0xa4, 0xe7, 0xcc, 0x4f, 0xed, 0xa3, 0x3d, 0x9d, 0x23,
+ 0x28, 0x49, 0x69, 0x8f, 0x32, 0x14, 0xda, 0xce, 0x6a, 0xe7, 0x09, 0x6c,
+ 0x7a, 0x3c, 0x3f, 0x75, 0x2c, 0xa7, 0x7c, 0xea, 0x29, 0x0d, 0xb2, 0x19,
+ 0xc7, 0x12, 0xdb, 0x5e, 0x47, 0xdf, 0xd9, 0xa8, 0x0f, 0x89, 0x5e, 0x8b,
+ 0xf8, 0x9d, 0x38, 0xed, 0x50, 0xd8, 0xcd, 0x76, 0x04, 0x46, 0x3f, 0x44,
+ 0x66, 0x6d, 0xec, 0xa3, 0x39, 0x30, 0x6b, 0xe8, 0x66, 0xa6, 0x53, 0x36,
+ 0xb4, 0x5f, 0x79, 0x4e, 0x5e, 0x8c, 0x9e, 0xb4, 0xce, 0x49, 0x33, 0x9b,
+ 0x0f, 0x6f, 0x2f, 0x1e, 0x08, 0x54, 0x9d, 0x9f, 0xbc, 0x41, 0xa2, 0x8e,
+ 0x8a, 0x1b, 0x74, 0xe4, 0x92, 0xb7, 0x71, 0x57, 0xb1, 0x7b, 0xf7, 0x1a,
+ 0x88, 0xb6, 0x61, 0xa5, 0x48, 0x24, 0x26, 0x63, 0x2b, 0xdd, 0xc5, 0x51,
+ 0x63, 0x91, 0x3a, 0xcd, 0x88, 0x88, 0x40, 0x10, 0x52, 0xc5, 0x2c, 0x8f,
+ 0xd6, 0x24, 0x6a, 0xfe, 0x7e, 0x76, 0x97, 0x4d, 0x96, 0x48, 0x2a, 0x20,
+ 0xc5, 0x9e, 0xa0, 0xef, 0x56, 0x47, 0x3b, 0x30, 0xdb, 0x56, 0x64, 0xc3,
+ 0xfc, 0xa0, 0x4b, 0x0c, 0x9b, 0x46, 0xa5, 0x8b, 0xe7, 0xd5, 0x07, 0x1e,
+ 0x4f, 0xce, 0x02, 0xc7, 0xef, 0xda, 0xbf, 0x0a, 0x02, 0xfb, 0x28, 0xef,
+ 0x21, 0x65, 0xc6, 0xf0, 0x53, 0x7e, 0x55, 0xb0, 0xba, 0xf8, 0x26, 0x9f,
+ 0x54, 0x65, 0x5d, 0x5e, 0x4a, 0xe1, 0x98, 0x33, 0x6d, 0x8f, 0x8f, 0xc7,
+ 0xc9, 0x6d, 0x76, 0xa1, 0xd5, 0xfc, 0xa3, 0xd0, 0xff, 0xcf, 0x52, 0x84,
+ 0xe2, 0x59, 0x55, 0x9e, 0x35, 0x44, 0x35, 0x8d, 0x60, 0x13, 0xb4, 0x1d,
+ 0x3a, 0x94, 0x0a, 0xf2, 0x13, 0x6c, 0x2f, 0xea, 0xf1, 0x3c, 0xc3, 0xd5,
+ 0xb4, 0xc8, 0xca, 0x48, 0x16, 0x03, 0x4f, 0x40, 0xaf, 0x15, 0x69, 0x31,
+ 0x4e, 0xfa, 0xd7, 0x45, 0x4a, 0x53, 0x62, 0x2b, 0x20, 0x47, 0x5b, 0x79,
+ 0xd2, 0x2e, 0xc5, 0x1b, 0xf6, 0x91, 0xdc, 0x9c, 0x41, 0x99, 0x9d, 0xcd,
+ 0x85, 0xb7, 0x35, 0x09, 0xea, 0x72, 0x2d, 0xa6, 0x65, 0x85, 0xcc, 0x31,
+ 0xaf, 0xb5, 0x1d, 0xf5, 0x80, 0x5e, 0x56, 0xe4, 0xe6, 0x07, 0xec, 0x72,
+ 0x28, 0x4f, 0x6f, 0xaf, 0x4b, 0xee, 0x04, 0x0a, 0x32, 0x3b, 0x9d, 0x0d,
+ 0x15, 0x89, 0xd2, 0xeb, 0x07, 0x52, 0xc1, 0xdd, 0x37, 0xfe, 0x46, 0x45,
+ 0x21, 0x5a, 0x65, 0x3f, 0x5c, 0x29, 0xbc, 0x64, 0x96, 0xbc, 0xca, 0xaf,
+ 0xfa, 0xfa, 0x9c, 0xc3, 0xe5, 0x07, 0x48, 0x1a, 0xa7, 0x18, 0x61, 0x46,
+ 0x72, 0x69, 0x56, 0x7c, 0x4a, 0x3b, 0x7c, 0xc0, 0x48, 0x5c, 0xa1, 0xf3,
+ 0xbc, 0x87, 0xfb, 0xfe, 0xc9, 0x01, 0x40, 0xeb, 0xbb, 0xf0, 0xe6, 0x62,
+ 0x8f, 0x80, 0xd7, 0xfc, 0xc4, 0xa9, 0xec, 0x2e, 0x66, 0x1e, 0x00, 0xe7,
+ 0x3c, 0xa4, 0xaf, 0xc7, 0x83, 0x2c, 0x1a, 0x7f, 0x8c, 0x64, 0x11, 0x79,
+ 0x21, 0x74, 0xf9, 0xf7, 0x14, 0xdb, 0x23, 0xff, 0x90, 0x28, 0xa5, 0x7f,
+ 0x74, 0x4b, 0xfa, 0xc1, 0xee, 0xf0, 0x22, 0x4b, 0xa9, 0xd5, 0xde, 0xcb,
+ 0x86, 0x14, 0xa6, 0x55, 0xf5, 0x6f, 0x5c, 0x8c, 0x90, 0x68, 0xca, 0xa4,
+ 0x57, 0x07, 0xf7, 0x35, 0x0f, 0x71, 0x0e, 0x95, 0x8b, 0x76, 0xf8, 0xf4,
+ 0xe0, 0xfd, 0xf9, 0xb7, 0xc9, 0x6e, 0xd0, 0x23, 0x48, 0xf1, 0x1d, 0x3a,
+ 0x82, 0xe1, 0xbc, 0x3b, 0x86, 0xee, 0x21, 0xa2, 0x3d, 0xe6, 0x46, 0xfd,
+ 0xcb, 0xb2, 0x98, 0x44, 0x9d, 0x0c, 0xdc, 0x1e, 0x4f, 0x60, 0x50, 0x58,
+ 0x93, 0xe2, 0x7b, 0x58, 0x2a, 0x4b, 0x5a, 0xa9, 0xf1, 0x7e, 0xcb, 0xc7,
+ 0xe1, 0x30, 0x0c, 0x6f, 0x9a, 0x89, 0xbb, 0xb0, 0x79, 0x6f, 0xef, 0xc1,
+ 0x60, 0xb2, 0x02, 0x7e, 0xa6, 0x91, 0x6e, 0x74, 0xd7, 0x23, 0x03, 0x86,
+ 0x8f, 0x96, 0x6d, 0xd6, 0x0e, 0x75, 0xf6, 0xdd, 0xeb, 0xc3, 0xce, 0x70,
+ 0xcf, 0x9e, 0x3f, 0xdd, 0xfe, 0x94, 0xc8, 0x6e, 0x6c, 0x95, 0x11, 0x16,
+ 0x49, 0xf2, 0xd2, 0xfc, 0xf1, 0xe5, 0xea, 0xfc, 0x08, 0xa5, 0x97, 0xfa,
+ 0x3a, 0x5c, 0x2c, 0x2d, 0xd7, 0xc2, 0x1a, 0x4e, 0x1a, 0xb6, 0x99, 0xf9,
+ 0x41, 0x77, 0x32, 0xca, 0x98, 0x19, 0xf0, 0xfd, 0x32, 0x3c, 0x65, 0x28,
+ 0x0e, 0xca, 0xab, 0x1a, 0x6a, 0x3d, 0xc2, 0xb0, 0x1c, 0xd8, 0x69, 0x81,
+ 0x5a, 0xbd, 0x5d, 0xcc, 0x39, 0x0d, 0x4f, 0x9e, 0xf4, 0x66, 0x52, 0xbb,
+ 0xc8, 0x1c, 0xe9, 0x79, 0xef, 0xdf, 0x9d, 0xd4, 0xe2, 0x78, 0xe7, 0x47,
+ 0x7b, 0x4b, 0x21, 0xc5, 0x3d, 0xa3, 0x35, 0x38, 0x0c, 0x5f, 0xb6, 0x5c,
+ 0x98, 0x73, 0xda, 0x50, 0xe9, 0x86, 0xed, 0xca, 0xee, 0x9c, 0xe9, 0x51,
+ 0xe1, 0xc6, 0x08, 0xbb, 0x2e, 0x67, 0x12, 0x2d, 0x44, 0xbc, 0x09, 0x6a,
+ 0xc4, 0x0d, 0xd8, 0x26, 0x83, 0xb6, 0x13, 0x3f, 0xe6, 0x26, 0x43, 0x63,
+ 0x10, 0xc1, 0xa1, 0x1a, 0x0e, 0x29, 0xf1, 0xd2, 0x90, 0x0b, 0x39, 0xcb,
+ 0x88, 0xa1, 0x30, 0x42, 0xd3, 0xa3, 0x13, 0x1f, 0xda, 0xfd, 0x0a, 0x3d,
+ 0x2e, 0x71, 0x33, 0xc6, 0x54, 0x03, 0x12, 0xd1, 0xd4, 0x1f, 0xcc, 0xc3,
+ 0x54, 0x21, 0x18, 0xec, 0x2c, 0xc4, 0xcc, 0xbf, 0x7b, 0x3f, 0xe5, 0x64,
+ 0xa6, 0xa1, 0x40, 0x77, 0xf6, 0x75, 0xcc, 0x79, 0xde, 0xee, 0x98, 0xe3,
+ 0xf3, 0x46, 0x14, 0xa3, 0xee, 0x87, 0x8a, 0x80, 0x22, 0xd4, 0xb3, 0x59,
+ 0xca, 0x43, 0x3e, 0x8c, 0x4d, 0xdd, 0x4c, 0x29, 0x33, 0x54, 0x7b, 0xe9,
+ 0x32, 0x87, 0xd1, 0x01, 0xfc, 0xcf, 0xbf, 0x87, 0xce, 0x88, 0x3f, 0xff,
+ 0x8c, 0x00, 0x24, 0x3a, 0x72, 0x5b, 0xc2, 0xe9, 0xd5, 0x58, 0xb7, 0xae,
+ 0xde, 0xbf, 0x2e, 0x4b, 0xc9, 0x95, 0x91, 0x28, 0x58, 0x4f, 0x3f, 0x38,
+ 0xba, 0xaf, 0xd6, 0x7f, 0xb7, 0x6e, 0x5b, 0x6c, 0xb2, 0xf3, 0x5d, 0x72,
+ 0xca, 0x45, 0x19, 0x94, 0x59, 0xdb, 0x2d, 0xe1, 0xfe, 0x20, 0x81, 0x8b,
+ 0xd7, 0xe9, 0xbb, 0xec, 0x2b, 0xbe, 0x40, 0x71, 0x1e, 0x70, 0x16, 0xbc,
+ 0x42, 0x35, 0x81, 0x0c, 0x56, 0x28, 0x4d, 0x8d, 0xda, 0x99, 0x59, 0x06,
+ 0xaa, 0x06, 0x7e, 0x9f, 0xc1, 0x86, 0x19, 0x31, 0xb2, 0x48, 0x5e, 0xf4,
+ 0x04, 0x56, 0xd6, 0x24, 0xb1, 0xf1, 0x3f, 0x8d, 0x70, 0x19, 0x34, 0xb7,
+ 0xe5, 0xdf, 0xfd, 0x08, 0xca, 0x9a, 0xd9, 0xa9, 0x64, 0x8d, 0x16, 0xf1,
+ 0xe1, 0x77, 0x3b, 0x54, 0x5a, 0xbb, 0xf6, 0x59, 0x28, 0x4b, 0x97, 0xa8,
+ 0xe1, 0x65, 0x89, 0x65, 0x6d, 0x80, 0x55, 0xb8, 0xf9, 0xf6, 0x93, 0x04,
+ 0x06, 0x32, 0x20, 0xcb, 0xe8, 0xef, 0x23, 0xfa, 0xf3, 0xcf, 0x3b, 0xc3,
+ 0xa7, 0x3f, 0xbb, 0xcf, 0xfe, 0x6e, 0xe7, 0xc3, 0xef, 0x76, 0xd7, 0x62,
+ 0xb5, 0xd3, 0x0e, 0x97, 0xc7, 0xcb, 0x9d, 0x26, 0xab, 0xad, 0xb8, 0x97,
+ 0x02, 0x32, 0xc9, 0x80, 0x70, 0x6d, 0xbd, 0x21, 0x3c, 0x22, 0x3b, 0x49,
+ 0x8e, 0xf5, 0x51, 0x37, 0x9a, 0xa5, 0xcd, 0xbd, 0xf5, 0xea, 0xbb, 0x2d,
+ 0xf9, 0x7d, 0x45, 0x2f, 0xa2, 0x73, 0xd0, 0xdf, 0x35, 0xd3, 0x99, 0x24,
+ 0x48, 0x21, 0x6c, 0x1c, 0xfe, 0x55, 0x48, 0x0f, 0xc9, 0xd8, 0x34, 0x4a,
+ 0x5b, 0x9a, 0xb4, 0xa2, 0x5b, 0x65, 0x72, 0x71, 0x61, 0x7f, 0x52, 0x64,
+ 0x41, 0x4d, 0xb3, 0xa2, 0x8e, 0xb2, 0x8b, 0x42, 0x2f, 0xbb, 0xd2, 0xe5,
+ 0xd4, 0x48, 0x4f, 0xc3, 0x44, 0x56, 0x6e, 0xb3, 0x03, 0x70, 0x61, 0x05,
+ 0x49, 0x91, 0x7f, 0x01, 0x8a, 0xa7, 0xe7, 0x84, 0x14, 0x01, 0x59, 0x92,
+ 0xb8, 0xb1, 0xf1, 0x61, 0xfc, 0x4c, 0x4f, 0x85, 0x11, 0x0f, 0xa4, 0xc9,
+ 0x31, 0x5e, 0x52, 0x58, 0xf3, 0x7d, 0xd3, 0x96, 0xbf, 0xa0, 0x07, 0x64,
+ 0xca, 0x85, 0x43, 0x82, 0x4c, 0xeb, 0x1e, 0x82, 0xf8, 0xa4, 0xf0, 0x88,
+ 0x20, 0x84, 0x02, 0x71, 0x56, 0xb7, 0x1c, 0x6e, 0x49, 0x57, 0x97, 0x0a,
+ 0xc7, 0x3f, 0xd5, 0x5a, 0x74, 0x8a, 0xe8, 0xaa, 0x38, 0x1f, 0x06, 0xc9,
+ 0x12, 0x74, 0x37, 0x4e, 0xef, 0x8d, 0x58, 0x63, 0xd8, 0xf5, 0x91, 0x55,
+ 0x85, 0xd4, 0x0f, 0xa6, 0x57, 0x5b, 0x9d, 0xac, 0x0f, 0xd7, 0x93, 0x0d,
+ 0xeb, 0xbd, 0x98, 0xa6, 0xf5, 0xf5, 0x66, 0x54, 0xfe, 0xdb, 0xc8, 0x84,
+ 0x93, 0x6b, 0xd2, 0x36, 0x0b, 0x7a, 0x21, 0x0b, 0xb4, 0x7e, 0x2b, 0xad,
+ 0x2b, 0x8b, 0x3b, 0xff, 0xa4, 0x6a, 0x63, 0x2b, 0x9e, 0xdd, 0xaf, 0xa2,
+ 0xfd, 0xe1, 0x59, 0x5c, 0x7b, 0xea, 0x03, 0xd9, 0x9a, 0xb3, 0x59, 0x36,
+ 0x1b, 0xe6, 0xf3, 0x79, 0x36, 0x8d, 0x24, 0x68, 0x72, 0x7a, 0xe2, 0x94,
+ 0x0b, 0x1b, 0xf4, 0x69, 0xcf, 0x53, 0x18, 0x01, 0x97, 0xd1, 0x00, 0x75,
+ 0x14, 0x66, 0x59, 0x02, 0x58, 0x22, 0x74, 0x05, 0x35, 0x8b, 0x41, 0xaa,
+ 0xe8, 0x16, 0x85, 0x9b, 0xd8, 0x5c, 0xd9, 0x40, 0x17, 0xf0, 0x7b, 0xbc,
+ 0x18, 0xc9, 0x6a, 0xbe, 0x3e, 0x0c, 0xbd, 0x96, 0x66, 0x36, 0x04, 0x5e,
+ 0x48, 0xae, 0x0b, 0x1f, 0x83, 0xeb, 0x36, 0x65, 0x1c, 0x42, 0x07, 0x58,
+ 0x46, 0x18, 0x36, 0xce, 0xc1, 0xc9, 0x0a, 0x64, 0x77, 0x38, 0x78, 0x05,
+ 0x48, 0xa4, 0xc8, 0x5d, 0x71, 0x47, 0x5a, 0x19, 0x42, 0x74, 0x90, 0x02,
+ 0x5a, 0x0d, 0xef, 0x07, 0x7f, 0x7a, 0xb7, 0xed, 0x7f, 0x0e, 0x3c, 0xfa,
+ 0xaa, 0x91, 0xad, 0xe4, 0x9e, 0xa7, 0x77, 0x6d, 0xc7, 0x6f, 0x07, 0x75,
+ 0xdc, 0x7f, 0x30, 0xb6, 0x23, 0x69, 0xfd, 0x91, 0x93, 0x6b, 0xa6, 0xa5,
+ 0xdb, 0x15, 0x6f, 0x53, 0xf8, 0x4a, 0x6c, 0xcf, 0x61, 0x90, 0xac, 0xe8,
+ 0x56, 0x40, 0x7e, 0xad, 0xaa, 0x9c, 0xd5, 0x92, 0x14, 0xc3, 0x15, 0x39,
+ 0x16, 0x3b, 0xc6, 0x23, 0x1c, 0x7f, 0xb3, 0xce, 0x89, 0x44, 0x69, 0x11,
+ 0x29, 0x48, 0xa9, 0x23, 0x59, 0x03, 0xa4, 0xee, 0x69, 0x79, 0xb8, 0xe1,
+ 0x96, 0x88, 0x4a, 0xdc, 0x43, 0xb7, 0x55, 0xed, 0xbc, 0x5a, 0x0f, 0xf6,
+ 0xe7, 0x9f, 0x49, 0xcd, 0x2a, 0x50, 0x80, 0xdc, 0x32, 0x98, 0x9f, 0x64,
+ 0x6f, 0x50, 0x68, 0x4e, 0x8d, 0x57, 0xa7, 0x3d, 0xc8, 0x40, 0x55, 0x76,
+ 0x45, 0xd0, 0x78, 0x64, 0xe0, 0x10, 0x40, 0x90, 0x11, 0x6f, 0x45, 0x04,
+ 0x0d, 0x61, 0x45, 0xe7, 0x31, 0xca, 0xe1, 0x49, 0x5e, 0x2e, 0xae, 0xab,
+ 0xb4, 0x0e, 0x31, 0xe4, 0xc7, 0xe3, 0x6f, 0x13, 0x78, 0xf3, 0xa9, 0x7b,
+ 0x30, 0x3f, 0x63, 0x85, 0xaf, 0x07, 0xb6, 0xfd, 0x09, 0xad, 0x08, 0x4a,
+ 0x22, 0x1d, 0xa6, 0xf5, 0x30, 0xe0, 0x0e, 0x4a, 0x25, 0xf2, 0xfb, 0x8b,
+ 0x92, 0xf3, 0x82, 0x7c, 0x5a, 0x54, 0xb9, 0x40, 0x69, 0x35, 0x05, 0x61,
+ 0x10, 0x1a, 0xfe, 0xd8, 0x1a, 0x8d, 0xb6, 0x48, 0x29, 0xd8, 0x32, 0xff,
+ 0xc9, 0xbd, 0x86, 0x7a, 0xdd, 0xde, 0xd7, 0xe6, 0x12, 0xa1, 0x6f, 0x51,
+ 0x18, 0x81, 0x82, 0xe9, 0xb3, 0x7b, 0xbf, 0x0b, 0xee, 0x5f, 0x97, 0x28,
+ 0x3c, 0xa1, 0x2e, 0xcc, 0x15, 0x10, 0x8d, 0xb2, 0x79, 0xc7, 0xc2, 0x0a,
+ 0xac, 0x11, 0x0e, 0xab, 0xd7, 0x82, 0x97, 0xa6, 0xad, 0x79, 0x5d, 0x57,
+ 0x08, 0xf6, 0xe0, 0xd3, 0x22, 0xf2, 0x46, 0x51, 0x6a, 0x01, 0x78, 0x95,
+ 0xae, 0xf4, 0x09, 0x3e, 0xd9, 0xed, 0x6c, 0x5f, 0x6e, 0x36, 0x7c, 0xba,
+ 0x58, 0x5e, 0x00, 0xdc, 0x9e, 0x72, 0xef, 0xc3, 0xea, 0x5d, 0x69, 0x05,
+ 0x10, 0xb4, 0x64, 0x5d, 0xd6, 0x59, 0x60, 0x53, 0x78, 0x6d, 0x99, 0xa5,
+ 0xd2, 0x28, 0x50, 0x5d, 0xf9, 0x23, 0xc8, 0xe1, 0x95, 0xda, 0x1c, 0xb0,
+ 0x43, 0x46, 0xca, 0xa4, 0x6d, 0xd0, 0x7e, 0x01, 0xff, 0x3b, 0x65, 0x00,
+ 0xc3, 0x01, 0x24, 0x29, 0x81, 0x31, 0xcf, 0xb9, 0xf5, 0x5b, 0xdb, 0xfb,
+ 0xca, 0x9b, 0x82, 0x59, 0x33, 0xf5, 0x07, 0x30, 0x94, 0x7f, 0x75, 0xf4,
+ 0x4e, 0xcc, 0x5b, 0x00, 0x26, 0x91, 0x66, 0xc5, 0xca, 0x54, 0xd0, 0x90,
+ 0x02, 0xce, 0xb0, 0x67, 0x4f, 0xe0, 0xb2, 0x22, 0xba, 0xd5, 0xd7, 0xe9,
+ 0xee, 0xd3, 0x67, 0x32, 0x6d, 0x45, 0x8b, 0x85, 0x76, 0xbc, 0xce, 0xbf,
+ 0xda, 0xda, 0xe2, 0x64, 0x39, 0x72, 0x70, 0x06, 0xd7, 0x2e, 0x62, 0x0d,
+ 0xf4, 0xec, 0x1f, 0xd7, 0xe3, 0x09, 0xf2, 0xea, 0xfd, 0xe0, 0x2c, 0xf5,
+ 0x04, 0xd1, 0x67, 0x4e, 0xe4, 0xf7, 0x1b, 0x93, 0x0d, 0xfc, 0x98, 0x2d,
+ 0xa3, 0x7f, 0xa5, 0x2b, 0xfa, 0x75, 0x09, 0xc4, 0x9a, 0x74, 0x28, 0x4e,
+ 0x14, 0x35, 0x85, 0x90, 0xeb, 0x3d, 0xea, 0x70, 0xee, 0xfb, 0x5d, 0x83,
+ 0xc8, 0x44, 0x50, 0x6c, 0x8b, 0xea, 0x4e, 0x70, 0x9d, 0x3f, 0xb2, 0x94,
+ 0x7d, 0xe4, 0x1c, 0xb7, 0x04, 0xe7, 0x69, 0xd2, 0x05, 0xbb, 0xf5, 0xb1,
+ 0x99, 0xcb, 0x8b, 0x20, 0x4b, 0x51, 0xbe, 0x69, 0x61, 0xe6, 0xe1, 0x15,
+ 0xf6, 0xaa, 0x02, 0xdc, 0x71, 0x61, 0x04, 0x09, 0x30, 0x96, 0x23, 0x40,
+ 0x60, 0x12, 0xb4, 0xfa, 0x9a, 0x58, 0x28, 0x09, 0x0e, 0xc6, 0xde, 0x23,
+ 0xeb, 0x23, 0x38, 0x07, 0x86, 0x15, 0xb6, 0x88, 0x0f, 0xc4, 0x61, 0x15,
+ 0x34, 0x10, 0xa3, 0x18, 0xf3, 0x8b, 0xd1, 0xf6, 0xbe, 0xf6, 0x24, 0x18,
+ 0x24, 0xdf, 0x14, 0x4b, 0xda, 0x0f, 0x5a, 0xf4, 0x37, 0xe3, 0xef, 0x82,
+ 0xd2, 0x6a, 0x7a, 0xe3, 0xc9, 0x1e, 0xbd, 0xf1, 0x76, 0xcc, 0x4f, 0xdd,
+ 0x96, 0xb3, 0x4b, 0xf3, 0x66, 0xec, 0xb9, 0xe7, 0xf4, 0x9c, 0xe1, 0xb8,
+ 0x69, 0x33, 0xab, 0x95, 0xa9, 0x56, 0xcc, 0xe4, 0xc9, 0x93, 0xc8, 0x4c,
+ 0x06, 0xbf, 0xf8, 0x43, 0xa7, 0xb8, 0xd7, 0x89, 0x99, 0xa8, 0xf1, 0x26,
+ 0x18, 0x07, 0x45, 0x67, 0xb6, 0xc5, 0xc6, 0xa7, 0x14, 0xbe, 0x8c, 0xb0,
+ 0xf5, 0x98, 0xae, 0xbc, 0x15, 0x90, 0x82, 0x1b, 0xa0, 0x25, 0x3d, 0xdf,
+ 0xdd, 0xdb, 0xd9, 0x7a, 0x36, 0x7a, 0x32, 0xda, 0xb5, 0xa9, 0xe0, 0x8c,
+ 0x24, 0xd2, 0x20, 0xf3, 0x2e, 0x12, 0xf2, 0x44, 0x12, 0x64, 0x5e, 0x08,
+ 0x54, 0x98, 0xfd, 0x09, 0x7c, 0x39, 0x2e, 0x09, 0x94, 0xc0, 0xc3, 0x76,
+ 0xfc, 0x6a, 0xe2, 0x58, 0x97, 0x7a, 0xea, 0x2d, 0x8d, 0x32, 0x48, 0xf1,
+ 0x6f, 0x53, 0x3d, 0x0c, 0x52, 0x31, 0x2e, 0xf2, 0xbf, 0x2e, 0xf3, 0xc6,
+ 0x68, 0x01, 0xf0, 0x28, 0x65, 0x17, 0xb6, 0xcf, 0x10, 0x4c, 0x06, 0xac,
+ 0x83, 0x4e, 0x44, 0x24, 0x1c, 0x22, 0x30, 0x28, 0x44, 0x4d, 0x0f, 0xf5,
+ 0x06, 0x15, 0xcb, 0x39, 0x64, 0x57, 0xc2, 0xed, 0xfd, 0x6a, 0x63, 0x42,
+ 0x4c, 0x48, 0x2f, 0xff, 0xd6, 0x98, 0xdf, 0x37, 0x08, 0x15, 0xa6, 0x71,
+ 0x3f, 0x24, 0x83, 0x62, 0x69, 0xb0, 0x57, 0x33, 0x12, 0x5d, 0x2b, 0x20,
+ 0xf9, 0x01, 0x57, 0x37, 0xb2, 0xd7, 0x1b, 0xeb, 0x0e, 0xa4, 0x93, 0xa3,
+ 0x43, 0x6b, 0xc7, 0xa5, 0x8b, 0x0e, 0x55, 0x17, 0x73, 0x50, 0x93, 0xa1,
+ 0x8f, 0x21, 0xa2, 0x3c, 0x44, 0xcf, 0x98, 0xb3, 0xea, 0x01, 0x0f, 0x34,
+ 0x43, 0xab, 0x0d, 0xdc, 0xdf, 0xf7, 0xb4, 0x31, 0x56, 0x1b, 0x28, 0xd4,
+ 0xa9, 0x47, 0x41, 0x99, 0xf1, 0xce, 0xf3, 0x36, 0x16, 0xbd, 0x8c, 0xf9,
+ 0xab, 0xb9, 0x6c, 0xef, 0xb7, 0xe7, 0xb2, 0xdd, 0xc7, 0x72, 0x99, 0x63,
+ 0x32, 0x3a, 0x67, 0x2b, 0x58, 0x8c, 0x78, 0x4c, 0xae, 0xde, 0x1e, 0x2e,
+ 0xf3, 0xd9, 0x4c, 0xf2, 0x35, 0x43, 0x46, 0x6b, 0xf1, 0x99, 0x65, 0xb3,
+ 0x1e, 0x2e, 0x63, 0x58, 0x55, 0xe6, 0xb1, 0xd5, 0x2c, 0xa6, 0xe0, 0x25,
+ 0xc9, 0x6a, 0x2e, 0x6b, 0xfb, 0x6c, 0x57, 0xf3, 0x99, 0x43, 0x23, 0x78,
+ 0x34, 0x97, 0x69, 0x17, 0x47, 0xc1, 0xf5, 0x7b, 0x04, 0x8f, 0xad, 0x68,
+ 0x5e, 0xbf, 0xf3, 0x22, 0xc6, 0x65, 0x7b, 0x8f, 0xe1, 0x32, 0xb3, 0xa1,
+ 0x33, 0xba, 0x2a, 0x5b, 0x5c, 0xf6, 0xe4, 0xb7, 0xe5, 0xb2, 0x04, 0xab,
+ 0x6a, 0x23, 0x23, 0x24, 0x07, 0xff, 0xe8, 0x3e, 0xa6, 0x18, 0x56, 0x47,
+ 0x0d, 0x00, 0x03, 0x7e, 0x99, 0xa4, 0x68, 0xe3, 0x49, 0x3c, 0xbc, 0x63,
+ 0xbe, 0x54, 0xd8, 0xf9, 0x15, 0x3b, 0xb6, 0xdb, 0xb5, 0x4c, 0xaa, 0x8c,
+ 0x63, 0x75, 0x7f, 0xd6, 0x98, 0xe9, 0xfe, 0xd6, 0xd6, 0xcf, 0xf0, 0xcb,
+ 0xed, 0xd3, 0xdd, 0xf7, 0x73, 0x57, 0x85, 0x8f, 0xa9, 0xb3, 0xe3, 0xd3,
+ 0xc3, 0xef, 0xc6, 0x12, 0xf3, 0x13, 0x9d, 0x43, 0x75, 0x12, 0xb6, 0xc1,
+ 0x8d, 0xae, 0x0a, 0xac, 0x8f, 0x40, 0xcd, 0x45, 0x72, 0x61, 0x32, 0xbc,
+ 0x1b, 0x68, 0xe0, 0x0d, 0xa9, 0xb6, 0x22, 0x8c, 0x01, 0xba, 0x25, 0x28,
+ 0x1a, 0x1c, 0xd3, 0x93, 0x51, 0x7b, 0x21, 0x5c, 0x79, 0x22, 0x32, 0x13,
+ 0xeb, 0x0d, 0x2b, 0xbc, 0x17, 0x37, 0x9a, 0xeb, 0x0a, 0x65, 0x8c, 0x78,
+ 0x74, 0x53, 0xc3, 0xee, 0xab, 0x66, 0x27, 0xf3, 0xfa, 0x16, 0xcd, 0x0f,
+ 0x16, 0x95, 0x66, 0x32, 0xc4, 0x8c, 0x5c, 0xfb, 0x5b, 0x75, 0xd7, 0xc6,
+ 0x20, 0x8e, 0x04, 0xc5, 0xd4, 0xa3, 0x37, 0xbd, 0x17, 0xa4, 0x8d, 0x53,
+ 0xb7, 0x0a, 0x0f, 0x01, 0x90, 0xae, 0x07, 0xc3, 0x7d, 0x05, 0x6a, 0xfb,
+ 0xec, 0x12, 0x75, 0x10, 0x4e, 0xda, 0xcd, 0xd0, 0xf8, 0xad, 0x7e, 0x62,
+ 0x86, 0xec, 0xba, 0xfa, 0xf8, 0x17, 0x29, 0xfd, 0x86, 0xff, 0xfe, 0x94,
+ 0xbe, 0x8b, 0xc0, 0x34, 0xfe, 0x75, 0x4d, 0xff, 0x94, 0x9c, 0x2c, 0xc1,
+ 0xe5, 0xf4, 0x77, 0x79, 0x12, 0x27, 0xb4, 0x5f, 0x1f, 0x6b, 0x91, 0x7c,
+ 0xde, 0x96, 0xae, 0x82, 0xdc, 0x5f, 0xb5, 0x8f, 0xd8, 0x16, 0xa4, 0x3a,
+ 0x5a, 0x29, 0x8c, 0x91, 0x9f, 0xc4, 0x15, 0xae, 0xcc, 0xc7, 0x15, 0x57,
+ 0x8c, 0x1c, 0xbf, 0x57, 0xac, 0x4b, 0x34, 0x91, 0x0d, 0x00, 0xcc, 0x6c,
+ 0xac, 0xeb, 0x07, 0x37, 0x42, 0x93, 0x79, 0xef, 0x6c, 0x7f, 0x1e, 0xba,
+ 0x24, 0xde, 0x6b, 0xfd, 0xb6, 0x03, 0xd7, 0x46, 0x3a, 0x19, 0xea, 0xa9,
+ 0x2e, 0x5c, 0xed, 0x62, 0xec, 0xb3, 0x91, 0x12, 0x6f, 0xb2, 0x7d, 0xa7,
+ 0x19, 0x1b, 0x4b, 0x17, 0x6c, 0xf7, 0x86, 0x75, 0x34, 0x40, 0xac, 0xa8,
+ 0x71, 0xb3, 0x49, 0x4f, 0x88, 0x44, 0x92, 0xa2, 0x02, 0xf9, 0x4e, 0x5e,
+ 0x0c, 0x0d, 0xd5, 0x7f, 0xe5, 0xa0, 0x7b, 0x7f, 0xff, 0x64, 0x9b, 0x76,
+ 0x55, 0x47, 0xa1, 0x5e, 0x88, 0xb3, 0x52, 0xe0, 0x99, 0x7e, 0xbf, 0x97,
+ 0x8e, 0xfe, 0x89, 0x28, 0x99, 0x4f, 0xdb, 0x56, 0xf4, 0xef, 0x06, 0x7e,
+ 0x5e, 0xe5, 0x45, 0x5a, 0x45, 0x7c, 0x36, 0xa2, 0x21, 0x2a, 0xa2, 0x96,
+ 0xe2, 0x51, 0xd9, 0x84, 0xcb, 0x94, 0x0d, 0x58, 0xd4, 0x7f, 0xd9, 0x1f,
+ 0x9a, 0xa1, 0x92, 0xb0, 0xbb, 0x98, 0x8d, 0x18, 0x71, 0x7a, 0x0e, 0x7b,
+ 0x0a, 0x06, 0xec, 0x59, 0x6c, 0x25, 0xa1, 0x0e, 0x38, 0x8d, 0x33, 0x5e,
+ 0x19, 0xda, 0xfa, 0xc8, 0xb4, 0x4a, 0x6f, 0x3d, 0x0b, 0x9a, 0x51, 0x09,
+ 0x2f, 0x11, 0x0e, 0x72, 0xa9, 0x6b, 0x54, 0x26, 0x44, 0x99, 0x2c, 0x31,
+ 0xed, 0xa3, 0x9e, 0x54, 0x99, 0x84, 0x94, 0x09, 0xd9, 0x1a, 0x59, 0x2b,
+ 0x04, 0x09, 0x6d, 0xd4, 0x8e, 0xab, 0x4c, 0x71, 0x02, 0xec, 0xaa, 0x15,
+ 0x08, 0x0a, 0xe8, 0x4f, 0xa3, 0x48, 0x21, 0x8e, 0x73, 0x67, 0x69, 0x56,
+ 0x6e, 0x2a, 0x50, 0x51, 0xf4, 0xaa, 0x22, 0x36, 0x78, 0xd1, 0xa5, 0x7a,
+ 0x81, 0x06, 0xc9, 0xf5, 0x75, 0xbe, 0xe8, 0x5e, 0xd1, 0xc3, 0x2f, 0xca,
+ 0x2f, 0x86, 0x9b, 0x16, 0x4e, 0xb6, 0xbc, 0xc9, 0x6a, 0xd8, 0x42, 0x98,
+ 0x2c, 0xe5, 0xb9, 0x5c, 0xc3, 0xc9, 0x22, 0xd7, 0x17, 0xe0, 0x09, 0x50,
+ 0x74, 0x20, 0xa0, 0xa1, 0x41, 0x3b, 0x3d, 0x9e, 0x19, 0x07, 0x8b, 0x59,
+ 0xde, 0x91, 0x3b, 0xc6, 0x50, 0xeb, 0x92, 0x73, 0x9a, 0x01, 0x60, 0x40,
+ 0xd9, 0x3f, 0xd2, 0x37, 0x83, 0xc3, 0x2c, 0xe5, 0xa2, 0x7d, 0x37, 0x11,
+ 0x16, 0x86, 0xca, 0x86, 0x97, 0x2a, 0x54, 0xbe, 0x7c, 0xb0, 0xde, 0xcd,
+ 0x8a, 0x9f, 0x4b, 0x71, 0x62, 0xd0, 0xe1, 0x43, 0xfd, 0x23, 0xf7, 0xdb,
+ 0x98, 0x5c, 0x67, 0x73, 0x69, 0x3b, 0xd8, 0x83, 0x1b, 0xd2, 0x0b, 0xb2,
+ 0xd1, 0x9e, 0x13, 0x27, 0x84, 0x5f, 0x36, 0x8b, 0xd1, 0xbc, 0xfc, 0x9b,
+ 0x21, 0x73, 0x4a, 0x7d, 0x8c, 0x83, 0x23, 0x61, 0xee, 0xfa, 0x82, 0xf7,
+ 0x85, 0xe2, 0x66, 0x85, 0xb5, 0x2a, 0x13, 0x0f, 0xe9, 0x57, 0xc0, 0x37,
+ 0x05, 0xf1, 0x31, 0x39, 0x34, 0x33, 0x3e, 0xfa, 0xf0, 0xfe, 0xed, 0xf8,
+ 0xfd, 0x59, 0x97, 0xb1, 0xcf, 0x4e, 0xdf, 0x9d, 0x1f, 0xbd, 0xfa, 0x70,
+ 0xf6, 0xee, 0xf4, 0xfc, 0xf4, 0xf0, 0xf4, 0x24, 0xd9, 0xd8, 0xd9, 0x5c,
+ 0x59, 0xd5, 0x6c, 0x3d, 0x10, 0x16, 0x29, 0xdc, 0x39, 0x63, 0x59, 0x66,
+ 0xd9, 0x59, 0x6c, 0xd0, 0x7a, 0xc2, 0xd1, 0x7e, 0x10, 0xee, 0x92, 0x1c,
+ 0x6b, 0x75, 0x19, 0xc3, 0x15, 0x81, 0xeb, 0x0d, 0x62, 0x3d, 0x4d, 0xae,
+ 0x96, 0x7c, 0x52, 0x5c, 0x96, 0x14, 0x63, 0xa3, 0x07, 0x0a, 0x97, 0x24,
+ 0x68, 0xf8, 0x05, 0xb1, 0x2b, 0xdd, 0x71, 0x4f, 0xbb, 0x3a, 0x0b, 0xed,
+ 0x01, 0x14, 0x30, 0xc7, 0x15, 0xf5, 0x6a, 0xb6, 0x60, 0xfc, 0x2c, 0xb4,
+ 0x1d, 0xb1, 0x6f, 0xa0, 0x29, 0x93, 0x04, 0x15, 0xcb, 0xc2, 0x6a, 0x74,
+ 0x23, 0x6a, 0xe8, 0x59, 0x86, 0x01, 0x74, 0xbc, 0x62, 0xe6, 0x5b, 0x48,
+ 0x93, 0x78, 0x99, 0x08, 0x62, 0xd0, 0x44, 0x5f, 0x49, 0xe4, 0x31, 0x0f,
+ 0xd0, 0x6f, 0x3d, 0xa9, 0x8a, 0x6a, 0xe0, 0x10, 0x40, 0x1b, 0x2f, 0x33,
+ 0xb6, 0xd4, 0xad, 0x37, 0x29, 0x1a, 0x8e, 0x94, 0x32, 0x20, 0x35, 0x47,
+ 0x24, 0xec, 0x91, 0xc6, 0x2b, 0x19, 0x17, 0x0b, 0x27, 0x12, 0xea, 0x8b,
+ 0x22, 0xaa, 0x8d, 0xfd, 0xc5, 0x3c, 0xc0, 0xc8, 0x4c, 0x44, 0x8a, 0x21,
+ 0x0d, 0x68, 0xef, 0x07, 0xcc, 0xd0, 0x12, 0xa9, 0x5d, 0x51, 0x54, 0xf7,
+ 0x75, 0x1b, 0x98, 0xd6, 0x6f, 0x56, 0xc1, 0x45, 0xd3, 0x98, 0xc8, 0xc0,
+ 0x22, 0xbd, 0xbd, 0xee, 0x4c, 0xab, 0x2b, 0x7e, 0x9e, 0x8f, 0x9e, 0x3d,
+ 0x1d, 0xed, 0x12, 0x4c, 0xd1, 0xe9, 0x8c, 0x42, 0x9b, 0xa2, 0x58, 0xc0,
+ 0xb9, 0x8c, 0x0f, 0x08, 0x26, 0x1b, 0x52, 0x42, 0x1c, 0xad, 0x64, 0xc4,
+ 0x98, 0x2d, 0xa5, 0x18, 0x0a, 0x7a, 0x93, 0x29, 0x90, 0x0d, 0xe3, 0xe3,
+ 0x69, 0x33, 0x0b, 0x82, 0xc1, 0x32, 0x9f, 0xd9, 0x77, 0xd9, 0xaf, 0x94,
+ 0x0f, 0xda, 0x95, 0xb5, 0xc7, 0xb6, 0xcf, 0xee, 0xf8, 0xf0, 0x4c, 0xe0,
+ 0x66, 0x1c, 0x30, 0x0e, 0xc4, 0x39, 0x5e, 0x37, 0xac, 0xba, 0x3d, 0xda,
+ 0x4e, 0xc6, 0x6f, 0xbe, 0x16, 0x0c, 0xed, 0xaf, 0xc7, 0x11, 0x4d, 0x00,
+ 0xfa, 0xbc, 0xbe, 0x3e, 0xf2, 0xe3, 0x8b, 0xb4, 0x38, 0x33, 0xbb, 0x3f,
+ 0xd0, 0x7f, 0xb5, 0x70, 0x08, 0x99, 0xf9, 0x6e, 0xc5, 0x49, 0xe0, 0xe4,
+ 0x53, 0x92, 0x0e, 0x3c, 0xdc, 0x1a, 0x73, 0x5e, 0x09, 0xab, 0x3c, 0xb6,
+ 0xe4, 0xd1, 0x6a, 0xec, 0xcb, 0xdd, 0xe0, 0xa0, 0x3d, 0x78, 0xc4, 0x9c,
+ 0xb3, 0xfb, 0xa1, 0x43, 0x26, 0x9a, 0x92, 0xde, 0x0e, 0xdd, 0x3b, 0xed,
+ 0xac, 0x75, 0x06, 0x32, 0xaa, 0x9a, 0x85, 0x63, 0x78, 0x96, 0x5d, 0x42,
+ 0x35, 0x44, 0x29, 0xfb, 0x00, 0xbf, 0x44, 0x90, 0xd9, 0x26, 0xcb, 0xc6,
+ 0x81, 0x10, 0xb1, 0x4d, 0xa8, 0x32, 0xf6, 0xb4, 0x6d, 0x0b, 0x9c, 0xba,
+ 0x6e, 0x08, 0x4b, 0x3d, 0x27, 0x05, 0x4f, 0x61, 0x76, 0x8f, 0x30, 0x64,
+ 0x7e, 0xc7, 0x67, 0xfb, 0x6f, 0x59, 0x55, 0x86, 0x39, 0x0f, 0x50, 0x1e,
+ 0x14, 0xbe, 0xd2, 0xa8, 0xdc, 0x07, 0x8a, 0xaf, 0xe5, 0x7e, 0x48, 0x5f,
+ 0x0d, 0xce, 0xdc, 0x1f, 0xcc, 0xda, 0xa8, 0x00, 0x5f, 0x0a, 0x05, 0x1c,
+ 0xbe, 0x12, 0xa0, 0x62, 0x73, 0x8d, 0x53, 0x7b, 0x32, 0x60, 0x46, 0xb5,
+ 0xf7, 0xf7, 0x5c, 0xb6, 0x1f, 0x98, 0x98, 0x50, 0xff, 0xa6, 0x64, 0xca,
+ 0xb8, 0xaa, 0x03, 0x1b, 0x5e, 0xa3, 0xd6, 0xa2, 0x0e, 0x62, 0x53, 0xf4,
+ 0xb9, 0x50, 0xa6, 0x0f, 0x93, 0xe4, 0x55, 0x56, 0xdc, 0xab, 0x4c, 0x77,
+ 0x09, 0xb3, 0x00, 0xca, 0xba, 0x61, 0x9f, 0xb8, 0xc3, 0x72, 0xe1, 0x16,
+ 0x5a, 0x97, 0x6e, 0x8a, 0xe1, 0x94, 0xda, 0x73, 0x8e, 0x49, 0xae, 0x2f,
+ 0x2c, 0x19, 0x20, 0xb4, 0xda, 0xb4, 0xd8, 0x00, 0x1c, 0x93, 0x46, 0xd9,
+ 0xf1, 0x3d, 0x1d, 0x71, 0x25, 0x19, 0x36, 0x11, 0xd7, 0x84, 0x49, 0x57,
+ 0x2f, 0x2f, 0xfe, 0x22, 0xed, 0x00, 0xc8, 0xb5, 0x50, 0x09, 0x19, 0x24,
+ 0xc1, 0xda, 0xec, 0xaa, 0x79, 0x80, 0xc3, 0x56, 0x46, 0x3a, 0x14, 0xb1,
+ 0xe1, 0x10, 0xff, 0xcf, 0xbd, 0x3c, 0x32, 0xc7, 0x62, 0x98, 0x52, 0xb4,
+ 0x1e, 0x3a, 0xeb, 0x51, 0x19, 0xf4, 0xfc, 0x0c, 0x2f, 0x49, 0xa6, 0x72,
+ 0xde, 0x6e, 0xe7, 0xf2, 0x65, 0x5a, 0x72, 0xae, 0xb8, 0xad, 0x5c, 0xa0,
+ 0xc7, 0x7b, 0xc7, 0x52, 0x49, 0x5d, 0x0f, 0xfe, 0x40, 0xff, 0x09, 0xd7,
+ 0xd0, 0x62, 0x59, 0x22, 0xb3, 0x0a, 0x12, 0x7a, 0x1c, 0x62, 0x09, 0xaf,
+ 0xf7, 0x7d, 0xe0, 0x0b, 0x77, 0x0d, 0xac, 0x1e, 0x1b, 0x52, 0xec, 0x31,
+ 0x1f, 0x78, 0x5f, 0x28, 0x7c, 0xa9, 0x72, 0xf7, 0xc2, 0x36, 0x15, 0x92,
+ 0xca, 0xb0, 0xb6, 0x21, 0x44, 0xa8, 0x57, 0x0b, 0x69, 0x36, 0x96, 0x5e,
+ 0x52, 0x51, 0x47, 0x95, 0xb9, 0x76, 0x05, 0xb4, 0x93, 0x0c, 0x6e, 0x27,
+ 0x6d, 0x55, 0xb4, 0xc6, 0x60, 0x51, 0x36, 0xdc, 0xe0, 0x85, 0xaa, 0x40,
+ 0x48, 0xd3, 0xa9, 0xc8, 0x47, 0xe8, 0x11, 0x59, 0x95, 0x64, 0x1a, 0xcd,
+ 0x6e, 0x3e, 0x27, 0x1c, 0x50, 0xb4, 0x50, 0xf2, 0x73, 0xb5, 0xf9, 0x85,
+ 0xe3, 0x4c, 0xfe, 0x1c, 0x27, 0xf2, 0xc2, 0xe5, 0xe4, 0x82, 0x7b, 0xe9,
+ 0x4d, 0x99, 0x53, 0x1a, 0xa8, 0x95, 0xc9, 0x1d, 0x7c, 0xf4, 0xf3, 0xb0,
+ 0x3d, 0x59, 0x34, 0x8b, 0xcf, 0xa6, 0x5f, 0xc2, 0xe5, 0xe1, 0x55, 0xfc,
+ 0xf2, 0xe9, 0xd6, 0xe1, 0x90, 0x82, 0x84, 0x70, 0x75, 0x41, 0x61, 0xa6,
+ 0x22, 0x6d, 0xf4, 0xbc, 0x78, 0xe2, 0x96, 0x66, 0x48, 0x66, 0x1a, 0xe5,
+ 0x61, 0xa4, 0x74, 0x2b, 0x69, 0x45, 0x73, 0xa7, 0x87, 0x8b, 0xef, 0x5a,
+ 0xf2, 0x74, 0x01, 0x5b, 0x0e, 0xe0, 0xd4, 0xdc, 0xd1, 0x03, 0x77, 0xc4,
+ 0xdd, 0xbd, 0x26, 0x20, 0xaf, 0x54, 0xc1, 0x16, 0x40, 0xf3, 0x30, 0x84,
+ 0xce, 0x1b, 0x6c, 0x58, 0xa7, 0x00, 0x42, 0xeb, 0x02, 0xc4, 0x5f, 0x33,
+ 0x9f, 0x2f, 0xc3, 0x86, 0xd1, 0x12, 0xad, 0xf3, 0x53, 0x83, 0x39, 0x8d,
+ 0x14, 0x0a, 0x90, 0x38, 0x6a, 0xb8, 0xaf, 0x95, 0xd7, 0xeb, 0x8b, 0xea,
+ 0x4c, 0x28, 0x7e, 0x17, 0xf7, 0x23, 0x6e, 0x59, 0x1c, 0x37, 0xc3, 0x30,
+ 0xc5, 0x74, 0x68, 0x84, 0xc0, 0x62, 0x85, 0x1f, 0xce, 0xb9, 0xaa, 0xec,
+ 0x5f, 0x38, 0x6b, 0xbb, 0x55, 0x48, 0xc1, 0xd9, 0xd9, 0xab, 0xfc, 0xf3,
+ 0x7b, 0x31, 0x32, 0xc6, 0xd2, 0xbf, 0xbb, 0x97, 0x2c, 0xad, 0xa8, 0xb7,
+ 0xd3, 0x15, 0x93, 0x0f, 0xd4, 0x53, 0x6a, 0xc5, 0xb2, 0xaa, 0x5d, 0xc3,
+ 0x04, 0xa1, 0xd9, 0x7b, 0x2e, 0xa8, 0xc6, 0x88, 0xc0, 0xc9, 0x28, 0xa4,
+ 0xe0, 0xc6, 0xfb, 0x12, 0xdb, 0x71, 0x01, 0x11, 0x01, 0xab, 0xa8, 0x3d,
+ 0x93, 0xf8, 0x49, 0xc4, 0x82, 0x7c, 0x51, 0x17, 0xdf, 0xea, 0x88, 0x23,
+ 0x08, 0x42, 0x12, 0x1f, 0xa2, 0x89, 0xe5, 0x2b, 0x61, 0x8b, 0x62, 0x3b,
+ 0x11, 0x83, 0xeb, 0x9a, 0x76, 0x0a, 0x19, 0xf4, 0xe7, 0x93, 0x94, 0x42,
+ 0xb6, 0xf1, 0x44, 0xd4, 0xb1, 0x9c, 0xb4, 0xa1, 0x3e, 0x45, 0x12, 0x1a,
+ 0x47, 0x37, 0x2f, 0x7c, 0xb7, 0x20, 0xf7, 0xdb, 0xbc, 0x6b, 0x56, 0x3a,
+ 0x6e, 0xe5, 0x6b, 0x14, 0xa8, 0x1f, 0xd8, 0x11, 0xe1, 0xb2, 0xe5, 0x1f,
+ 0xaa, 0x1b, 0xf7, 0x6e, 0x60, 0x27, 0x37, 0x7a, 0xb4, 0x5b, 0xa5, 0x35,
+ 0xbc, 0x24, 0x81, 0xf7, 0xaf, 0x05, 0x0f, 0xfd, 0x9a, 0xb5, 0x74, 0xca,
+ 0x23, 0xdc, 0x1a, 0xbc, 0x49, 0x6b, 0xa9, 0x02, 0x7f, 0x66, 0x05, 0xf3,
+ 0xf7, 0x2c, 0xc1, 0x8c, 0xc8, 0x9d, 0xd4, 0x5f, 0xd2, 0x9f, 0x2b, 0x96,
+ 0x61, 0x1f, 0xfc, 0xa5, 0x2b, 0x79, 0x98, 0x8c, 0xe0, 0x08, 0xfa, 0xf3,
+ 0xcf, 0xfb, 0xf0, 0xfb, 0x4d, 0x7f, 0xee, 0x9d, 0xc7, 0xd1, 0x40, 0xe6,
+ 0xf2, 0x09, 0xa6, 0x91, 0x2f, 0xae, 0x49, 0x99, 0x7c, 0x19, 0xab, 0xd1,
+ 0xf4, 0x08, 0x21, 0x8f, 0xfd, 0xf6, 0xdf, 0xaf, 0x66, 0x0e, 0xc9, 0x6e,
+ 0xc5, 0xf7, 0xe5, 0xb1, 0xdf, 0xfc, 0xfb, 0x7c, 0x64, 0x1f, 0xf4, 0xf3,
+ 0x40, 0x38, 0xbd, 0x92, 0x42, 0x98, 0x88, 0x1c, 0xfc, 0xd5, 0x82, 0x50,
+ 0x8a, 0x6b, 0x42, 0x49, 0x28, 0x1f, 0xa3, 0x77, 0x83, 0x26, 0x87, 0x22,
+ 0x0a, 0x21, 0x09, 0xff, 0x71, 0xa9, 0x05, 0x59, 0x1c, 0x52, 0x46, 0x7a,
+ 0xff, 0xbd, 0xe4, 0xff, 0x6e, 0x7d, 0x15, 0xdb, 0x20, 0x2d, 0x56, 0xa4,
+ 0x3b, 0x4f, 0x9b, 0x05, 0xa2, 0xff, 0x1c, 0x83, 0x03, 0x89, 0x7e, 0x6b,
+ 0x9b, 0xaa, 0xf9, 0xdd, 0x68, 0xb0, 0xca, 0x58, 0x8b, 0x42, 0x21, 0x8f,
+ 0xe6, 0x61, 0x6b, 0x50, 0xc2, 0x65, 0x08, 0x91, 0x9a, 0x91, 0x79, 0x5f,
+ 0xac, 0x2d, 0x06, 0x5b, 0xc4, 0x11, 0xea, 0x37, 0x79, 0x77, 0x00, 0xe5,
+ 0xdf, 0x0e, 0xa4, 0x43, 0xa0, 0x19, 0x8d, 0x58, 0x4a, 0x92, 0x90, 0x45,
+ 0xb6, 0xc8, 0x5e, 0x86, 0x60, 0x6e, 0x5c, 0xdb, 0xc2, 0x05, 0x60, 0x8c,
+ 0x23, 0x60, 0x56, 0x78, 0x78, 0xfa, 0xf6, 0xed, 0xd1, 0x61, 0x37, 0x34,
+ 0x68, 0x5b, 0xa9, 0x3b, 0xc5, 0x3e, 0x9a, 0x28, 0xcb, 0x7d, 0x82, 0x24,
+ 0x36, 0xc4, 0xdf, 0x47, 0xf7, 0xca, 0x54, 0x20, 0xd8, 0xf9, 0x97, 0xd2,
+ 0x86, 0x89, 0xe1, 0xb9, 0x65, 0xfb, 0x23, 0x35, 0xc1, 0x01, 0x33, 0xf8,
+ 0x00, 0x31, 0xdc, 0x18, 0xb6, 0x46, 0x3b, 0x54, 0xa8, 0x9d, 0x30, 0x58,
+ 0x65, 0x16, 0xa8, 0x70, 0x98, 0x4e, 0xb7, 0xa4, 0x2a, 0x40, 0xbf, 0xdd,
+ 0xc7, 0xc8, 0x8c, 0xe8, 0x49, 0xa5, 0x85, 0xc3, 0xf2, 0x92, 0x9b, 0xe6,
+ 0xcc, 0xd3, 0xea, 0x23, 0x05, 0xaf, 0xbd, 0x4a, 0x07, 0x94, 0x99, 0xa3,
+ 0xb9, 0xc0, 0x74, 0x1a, 0x43, 0x9e, 0x81, 0x8f, 0xdd, 0x2f, 0xa6, 0x92,
+ 0xc9, 0x48, 0x67, 0xe9, 0x7d, 0xad, 0xfe, 0xa6, 0xd7, 0x8b, 0xec, 0x96,
+ 0x3e, 0xc3, 0x70, 0x5b, 0x04, 0x1f, 0x13, 0xf6, 0x96, 0xe2, 0xfe, 0x10,
+ 0x1c, 0x43, 0x90, 0x0a, 0x14, 0x6c, 0xd5, 0x9c, 0xbb, 0x37, 0x01, 0x70,
+ 0x9f, 0x7a, 0xac, 0x72, 0xe5, 0x60, 0x40, 0xab, 0x6f, 0x05, 0x34, 0xb7,
+ 0x13, 0x3e, 0x0b, 0xb2, 0x8e, 0xa5, 0xac, 0xd2, 0x02, 0xe9, 0xa2, 0xb6,
+ 0xac, 0x0f, 0x7d, 0x8c, 0x29, 0x8d, 0x6d, 0x20, 0xdb, 0xa4, 0x6e, 0x0d,
+ 0xa1, 0xbb, 0x9b, 0xf6, 0xc4, 0xf9, 0xc6, 0xd4, 0x04, 0x03, 0x67, 0x85,
+ 0x3e, 0x61, 0x24, 0xd8, 0xd3, 0x2e, 0xa0, 0x3b, 0x10, 0x0f, 0xe1, 0x12,
+ 0x25, 0x90, 0xd3, 0x2b, 0x54, 0x9b, 0xd0, 0xc3, 0x38, 0xac, 0x81, 0x52,
+ 0x4b, 0xd2, 0x14, 0xe5, 0xc3, 0x03, 0xb1, 0x01, 0x10, 0xb1, 0x34, 0xd4,
+ 0xa5, 0x7d, 0x10, 0xda, 0x2b, 0x74, 0x19, 0xc7, 0x1c, 0xe4, 0x00, 0x9b,
+ 0xff, 0x2e, 0x96, 0x4d, 0x10, 0x36, 0x24, 0x10, 0x47, 0xc6, 0xef, 0xf9,
+ 0x6a, 0x18, 0xb6, 0xfb, 0x4c, 0xa7, 0xfe, 0x9e, 0x42, 0x7a, 0xc3, 0xc8,
+ 0xaf, 0x9b, 0x69, 0xfe, 0x10, 0xbc, 0x2e, 0xe0, 0xd5, 0x6d, 0x7b, 0xb2,
+ 0xb6, 0x0d, 0x03, 0x8a, 0x39, 0x56, 0xdd, 0x82, 0x17, 0xa1, 0xcb, 0x0b,
+ 0xf6, 0x15, 0x15, 0x11, 0xab, 0xb0, 0xba, 0x80, 0x85, 0xd1, 0x91, 0x7e,
+ 0xc6, 0xa6, 0x21, 0x37, 0x56, 0xd6, 0x77, 0x23, 0x7d, 0x1c, 0x00, 0xe8,
+ 0x99, 0x1f, 0xfa, 0xed, 0xaf, 0xa5, 0x8f, 0xd9, 0xfd, 0xa3, 0x14, 0x14,
+ 0xfb, 0xdc, 0xa7, 0x98, 0x41, 0xf2, 0xd2, 0xfc, 0xb1, 0xf2, 0xdb, 0x8f,
+ 0xff, 0x6c, 0x80, 0x68, 0xfb, 0xb8, 0x2b, 0xd7, 0xe1, 0x34, 0x3b, 0xa0,
+ 0xe6, 0xa0, 0x1d, 0xdd, 0x6d, 0x58, 0xec, 0xdb, 0xba, 0x8e, 0x57, 0x5e,
+ 0xc0, 0xae, 0xda, 0xd5, 0xbf, 0x83, 0x23, 0xe1, 0xf9, 0x18, 0x66, 0xb4,
+ 0x04, 0x9c, 0x1e, 0x77, 0x1f, 0x3f, 0x78, 0x05, 0xb7, 0xc0, 0x02, 0xba,
+ 0x59, 0x55, 0xb6, 0x56, 0xf8, 0x91, 0x84, 0x8b, 0x54, 0xce, 0x27, 0xff,
+ 0xa0, 0xae, 0x82, 0x02, 0xe5, 0x96, 0xa6, 0x82, 0xaf, 0xb4, 0x88, 0xf0,
+ 0x98, 0x5b, 0x29, 0x20, 0x49, 0xb7, 0xe2, 0xb8, 0x45, 0xa8, 0x90, 0x0a,
+ 0xab, 0x72, 0xdc, 0x1d, 0x7b, 0xe2, 0xa9, 0xdf, 0xfc, 0x58, 0x3c, 0x3e,
+ 0x41, 0xbb, 0xbd, 0x31, 0x2b, 0xb3, 0xb3, 0x39, 0xfb, 0x97, 0x73, 0xaa,
+ 0xfb, 0x13, 0xb4, 0xbb, 0x19, 0xda, 0x9e, 0x0f, 0x22, 0x92, 0xa2, 0x8d,
+ 0xd1, 0xfe, 0x2f, 0x4c, 0xd0, 0xf6, 0xf3, 0xb3, 0x53, 0x64, 0x67, 0x47,
+ 0x92, 0xb3, 0x85, 0xd0, 0x92, 0x9d, 0x29, 0xdd, 0x99, 0x57, 0x25, 0x68,
+ 0xfb, 0x19, 0xda, 0xab, 0x52, 0xb4, 0x01, 0x7d, 0xb1, 0x22, 0x41, 0xfb,
+ 0xd7, 0xe5, 0x67, 0xf7, 0x25, 0x68, 0xff, 0xf2, 0x0c, 0xed, 0xdf, 0x36,
+ 0x41, 0xfb, 0xb7, 0xcc, 0x3d, 0xc6, 0xe9, 0xa1, 0x1d, 0xc9, 0x27, 0x52,
+ 0xe9, 0xfb, 0xb2, 0x17, 0xb8, 0x5c, 0x4b, 0x2e, 0x5b, 0xe9, 0x2a, 0x5e,
+ 0x50, 0x59, 0x86, 0x61, 0x8d, 0xc6, 0x53, 0xdc, 0xc3, 0x2a, 0x21, 0xe1,
+ 0x95, 0x48, 0xbe, 0x9b, 0x1f, 0xf5, 0xdd, 0x8b, 0x9d, 0xf4, 0xba, 0x9e,
+ 0x71, 0x7f, 0x4d, 0x42, 0x36, 0x08, 0x4c, 0x44, 0x27, 0x67, 0x3a, 0xcf,
+ 0xfd, 0xf6, 0x22, 0xa7, 0x99, 0xd5, 0x3b, 0x7b, 0xce, 0x50, 0x97, 0xbf,
+ 0x2c, 0xa9, 0x7e, 0x39, 0x66, 0xb4, 0x4b, 0x79, 0xc8, 0xd8, 0x56, 0xe0,
+ 0x8b, 0xbf, 0x17, 0xaf, 0xc1, 0x27, 0x9a, 0xd9, 0x1e, 0xc3, 0x36, 0x00,
+ 0xa1, 0x5c, 0x13, 0x96, 0xbe, 0x00, 0x64, 0xc3, 0x5f, 0x07, 0xee, 0x10,
+ 0x2a, 0x72, 0x51, 0xa1, 0x5d, 0xe3, 0x14, 0xee, 0x8c, 0xf6, 0x18, 0x80,
+ 0x41, 0x03, 0x38, 0x32, 0xcf, 0x00, 0xf7, 0x0e, 0xdf, 0xe7, 0x86, 0x03,
+ 0x2e, 0xe3, 0x8c, 0x7b, 0x22, 0xea, 0x3b, 0xa3, 0xe4, 0x1d, 0xa9, 0x8f,
+ 0x46, 0x59, 0x37, 0x33, 0x92, 0xc1, 0xe5, 0x77, 0xb1, 0xe1, 0xda, 0x50,
+ 0xd7, 0x86, 0x7f, 0xde, 0xbf, 0x3b, 0x09, 0xa3, 0xd1, 0x88, 0x15, 0xec,
+ 0x6f, 0x6d, 0x21, 0x1f, 0xea, 0x3a, 0xbd, 0xbb, 0x1b, 0xd5, 0xd9, 0xd6,
+ 0xb4, 0x9c, 0xd4, 0x5b, 0xb4, 0x83, 0xfa, 0xe5, 0xeb, 0x66, 0x3e, 0x5b,
+ 0x95, 0xe3, 0x90, 0xd7, 0x5a, 0x27, 0xad, 0xc0, 0xde, 0x2e, 0xcf, 0x92,
+ 0xad, 0xad, 0xdc, 0x6f, 0x65, 0x01, 0xb9, 0x1f, 0xe0, 0xe0, 0xa1, 0x86,
+ 0xc0, 0x2c, 0xca, 0xfc, 0x1f, 0x7a, 0x3a, 0x51, 0x08, 0x29, 0x52, 0x68,
+ 0xee, 0xb7, 0x7e, 0xf7, 0x2a, 0x06, 0xc2, 0x0d, 0x62, 0x3b, 0x80, 0x80,
+ 0xab, 0xb3, 0x06, 0x22, 0xac, 0x4d, 0x33, 0x25, 0x7a, 0xab, 0xeb, 0xba,
+ 0x65, 0xaf, 0xb0, 0x2d, 0x24, 0xf8, 0xac, 0xa7, 0x11, 0xfb, 0x6f, 0x2e,
+ 0x12, 0x0c, 0x77, 0xd3, 0x2d, 0xff, 0x18, 0x65, 0xd7, 0x7f, 0xf4, 0x53,
+ 0x9c, 0x32, 0x9b, 0x7e, 0xf7, 0x92, 0x73, 0xeb, 0x56, 0xce, 0xc4, 0x3e,
+ 0xfc, 0x29, 0x66, 0x02, 0x18, 0x90, 0xa8, 0x7c, 0x6c, 0xcd, 0x01, 0x8f,
+ 0x7d, 0x8a, 0xef, 0xdf, 0xec, 0xf4, 0x7d, 0x76, 0x67, 0xc0, 0x9f, 0xbe,
+ 0xd9, 0xf9, 0x0d, 0x3f, 0xfc, 0xde, 0x39, 0xa8, 0x78, 0xe5, 0xf4, 0xe7,
+ 0xbe, 0x52, 0x78, 0x65, 0xf7, 0xca, 0x9e, 0xd6, 0x20, 0x22, 0xdf, 0xdc,
+ 0xdd, 0xb0, 0x1a, 0x9a, 0x28, 0xc6, 0xe6, 0x74, 0xae, 0x18, 0x77, 0x4e,
+ 0x5a, 0x07, 0xa0, 0x97, 0xcb, 0x50, 0x71, 0x47, 0x19, 0xa7, 0x89, 0xa1,
+ 0xb3, 0xe8, 0xd3, 0xd3, 0x52, 0xa1, 0xdc, 0x8c, 0xa1, 0x10, 0xbf, 0x86,
+ 0x32, 0x84, 0xf6, 0x23, 0xb8, 0x55, 0x6c, 0x88, 0xdb, 0x83, 0xec, 0xb7,
+ 0x15, 0xe3, 0xbe, 0xf3, 0x11, 0xc7, 0xd6, 0xaa, 0x9e, 0x28, 0x90, 0xd9,
+ 0x3e, 0xe0, 0xd9, 0x85, 0xf5, 0xa3, 0x41, 0xae, 0x74, 0x85, 0xa8, 0xa2,
+ 0x66, 0xdb, 0xfc, 0x4d, 0xef, 0x88, 0xef, 0x27, 0x6b, 0xc3, 0xf7, 0xc9,
+ 0xfe, 0x5a, 0x40, 0xa2, 0xd3, 0x42, 0x7a, 0x4a, 0xc1, 0xe3, 0x55, 0x01,
+ 0x89, 0x00, 0x6d, 0xea, 0x7c, 0xcd, 0xe4, 0x9a, 0x60, 0xd1, 0x9c, 0x39,
+ 0x61, 0xfb, 0xb1, 0x5c, 0x05, 0x21, 0xb7, 0xb9, 0xf6, 0xcb, 0xb6, 0xfd,
+ 0xd3, 0xe8, 0x22, 0x21, 0xa7, 0x8d, 0x6b, 0xb1, 0x00, 0xed, 0x89, 0x7b,
+ 0xc3, 0x90, 0x68, 0xa5, 0xd0, 0x21, 0x85, 0x2e, 0xa9, 0xec, 0x3e, 0x84,
+ 0x34, 0x45, 0x84, 0xb6, 0xd6, 0xc2, 0xb9, 0x45, 0x59, 0xd7, 0xf9, 0x85,
+ 0x91, 0xd4, 0x57, 0x22, 0x22, 0xeb, 0x8c, 0xb3, 0xa7, 0xb8, 0xd0, 0x9a,
+ 0xa8, 0xd9, 0xc2, 0x5f, 0xe8, 0x92, 0x08, 0x2b, 0x15, 0xd8, 0x07, 0x71,
+ 0x2e, 0x99, 0xd9, 0xb1, 0x60, 0xbb, 0xc9, 0x69, 0x68, 0xe6, 0xb6, 0x34,
+ 0xb9, 0xa8, 0xf2, 0xec, 0x92, 0x12, 0x1b, 0xb1, 0x22, 0x51, 0xbc, 0xba,
+ 0x42, 0x76, 0x46, 0xc0, 0x3f, 0x94, 0x92, 0x43, 0x79, 0xb5, 0x35, 0x41,
+ 0xdb, 0x22, 0xd9, 0x1a, 0x99, 0x8e, 0x2e, 0x93, 0xbb, 0xca, 0x28, 0x4f,
+ 0x80, 0xfa, 0x31, 0x63, 0x11, 0xa9, 0xf6, 0xf6, 0xea, 0xc9, 0x40, 0xad,
+ 0x6c, 0x07, 0x00, 0xd4, 0x36, 0x00, 0x78, 0x4c, 0x0f, 0x28, 0xbe, 0x88,
+ 0x5e, 0xb1, 0x9a, 0xac, 0xeb, 0xb0, 0x13, 0x46, 0x9f, 0x4c, 0xc6, 0x3b,
+ 0x17, 0xf4, 0x2f, 0xc9, 0xfa, 0x6f, 0xb7, 0x12, 0x5c, 0x95, 0x03, 0xef,
+ 0xe5, 0x41, 0x07, 0x40, 0x4d, 0xf1, 0xe4, 0xf7, 0x4b, 0x6a, 0xbd, 0x91,
+ 0xbc, 0xed, 0x6a, 0x39, 0x91, 0x34, 0x72, 0x4a, 0x97, 0xe3, 0xec, 0x34,
+ 0xbb, 0xba, 0x06, 0xf0, 0x0e, 0x28, 0xdc, 0xf7, 0xc3, 0xc0, 0xef, 0x83,
+ 0x2b, 0xde, 0x25, 0xc7, 0xf7, 0xa7, 0xc3, 0x7b, 0xd9, 0xf0, 0x28, 0xff,
+ 0x60, 0x1f, 0x79, 0x4a, 0x33, 0x08, 0xef, 0x64, 0xea, 0x54, 0xc0, 0x99,
+ 0xf0, 0x9a, 0x08, 0xef, 0xe7, 0xc1, 0x1b, 0x9d, 0xcf, 0x8b, 0xcc, 0x3b,
+ 0x6c, 0x61, 0x72, 0xb0, 0xc6, 0x01, 0x73, 0x70, 0x42, 0xd1, 0x65, 0xe6,
+ 0x79, 0xd0, 0x25, 0xd6, 0x97, 0xe5, 0x3a, 0xd4, 0x4d, 0x9e, 0x5a, 0x05,
+ 0xca, 0x7d, 0x88, 0xe9, 0x29, 0x20, 0xf3, 0x69, 0x6f, 0x25, 0x08, 0x49,
+ 0x7b, 0x86, 0xf3, 0x8a, 0xd4, 0x71, 0xbe, 0x1d, 0x8f, 0xc3, 0x84, 0xf8,
+ 0xc2, 0x18, 0x27, 0xe5, 0x55, 0x91, 0xff, 0x0d, 0xd0, 0x57, 0x14, 0xb2,
+ 0xec, 0x26, 0xb3, 0xb6, 0x4a, 0x12, 0x12, 0x2f, 0xfc, 0x4e, 0x69, 0x11,
+ 0xa1, 0x7c, 0x43, 0xca, 0x1c, 0x6e, 0x1d, 0x4a, 0xfe, 0x22, 0x98, 0x3c,
+ 0x9b, 0xf7, 0x47, 0x41, 0x06, 0xe9, 0xea, 0xce, 0xb6, 0x98, 0xcd, 0x94,
+ 0xe5, 0x0f, 0x07, 0x9b, 0xab, 0x5c, 0x21, 0x58, 0x41, 0xfd, 0xd0, 0x4e,
+ 0xbf, 0xbc, 0x84, 0x00, 0x8d, 0x57, 0x7f, 0x79, 0x01, 0x41, 0x1c, 0xe4,
+ 0x0d, 0xb0, 0x51, 0x74, 0x34, 0xfc, 0x9b, 0xc0, 0x43, 0xd0, 0x91, 0x0c,
+ 0x6c, 0xa3, 0x33, 0xc6, 0xca, 0xd7, 0x84, 0xc6, 0x7c, 0x91, 0x3e, 0x0a,
+ 0x4c, 0x53, 0x95, 0xcf, 0x34, 0x3c, 0x5b, 0x5d, 0x1c, 0x4d, 0x1b, 0xe8,
+ 0x78, 0x04, 0x80, 0x26, 0xb9, 0xf1, 0x15, 0xf5, 0x4a, 0xfc, 0xe9, 0x68,
+ 0xe8, 0xc4, 0x68, 0x0b, 0x19, 0xa3, 0x5e, 0xda, 0xba, 0x1f, 0xb1, 0x51,
+ 0xe8, 0xc0, 0x46, 0x9b, 0x0c, 0x13, 0xf8, 0x02, 0x74, 0x77, 0xb8, 0x97,
+ 0xa5, 0xf6, 0x8b, 0xdb, 0xf9, 0x61, 0x80, 0x11, 0xc1, 0x3c, 0x52, 0x15,
+ 0x95, 0xba, 0xee, 0xcd, 0xaf, 0xa9, 0x2e, 0x4b, 0xb9, 0xa2, 0xcb, 0x5a,
+ 0xae, 0x8d, 0x88, 0x9d, 0x22, 0x27, 0x84, 0x88, 0x8f, 0xdf, 0x36, 0xc6,
+ 0x6c, 0xdf, 0x62, 0x8c, 0x73, 0x1c, 0xb0, 0x96, 0x00, 0x03, 0x41, 0x0b,
+ 0x58, 0x1a, 0x9b, 0x8c, 0xc0, 0xc4, 0xb8, 0x88, 0xc8, 0xf2, 0xca, 0x80,
+ 0xa4, 0x0f, 0x8b, 0x5c, 0xf1, 0xd4, 0x0d, 0x17, 0x2a, 0x65, 0xbb, 0x8b,
+ 0xbd, 0x97, 0x41, 0x7a, 0x74, 0xf9, 0x4f, 0x50, 0x77, 0xf2, 0xab, 0x0a,
+ 0x4f, 0x3e, 0x6d, 0xdd, 0x89, 0xbb, 0x29, 0xe8, 0xd6, 0x09, 0xef, 0x09,
+ 0x44, 0x09, 0xc9, 0x25, 0xc3, 0x49, 0x4f, 0xb7, 0xa9, 0xed, 0x6f, 0xc5,
+ 0xaf, 0x75, 0x86, 0x8b, 0x1f, 0xa6, 0x41, 0xd2, 0xca, 0x89, 0xcd, 0x02,
+ 0x19, 0xb9, 0x21, 0x52, 0x63, 0xb3, 0x07, 0x67, 0x29, 0xa3, 0x02, 0xf1,
+ 0x69, 0x26, 0x08, 0x80, 0x7f, 0x70, 0xfd, 0xa5, 0x3e, 0xb5, 0x01, 0xb6,
+ 0x63, 0x64, 0xf3, 0x4b, 0xef, 0x3e, 0xfe, 0xf2, 0xc1, 0x0b, 0x19, 0xe7,
+ 0x8c, 0x5e, 0x73, 0x38, 0xbb, 0x9e, 0xbc, 0xb3, 0x5d, 0xaf, 0xb9, 0x7f,
+ 0x67, 0x13, 0x3f, 0x30, 0x68, 0x64, 0x8d, 0x10, 0xa7, 0x8a, 0x37, 0xca,
+ 0x83, 0xa3, 0xf7, 0x7b, 0x04, 0x5c, 0xa6, 0x71, 0x57, 0x35, 0x89, 0x8d,
+ 0x44, 0xbf, 0xc8, 0x9a, 0x5b, 0xd2, 0xe2, 0x40, 0x0f, 0x25, 0xa4, 0x27,
+ 0x05, 0x84, 0x44, 0x46, 0x0b, 0x89, 0xa5, 0x20, 0x02, 0x4a, 0x5a, 0x05,
+ 0x0a, 0xa3, 0x85, 0x5b, 0xbf, 0x88, 0xc6, 0x74, 0x83, 0xd3, 0x17, 0x6d,
+ 0x18, 0xe7, 0x42, 0xd4, 0x2d, 0xda, 0x68, 0xe6, 0x6d, 0xab, 0x3e, 0x48,
+ 0xf3, 0x94, 0xe4, 0x41, 0xdf, 0xc7, 0x6f, 0x8f, 0xb1, 0x1c, 0xdb, 0x28,
+ 0x3c, 0x05, 0x05, 0xc6, 0xf0, 0xae, 0xcc, 0x47, 0xf7, 0xbf, 0x15, 0xed,
+ 0x0f, 0x62, 0x96, 0x14, 0x97, 0x8b, 0x85, 0x86, 0xfb, 0x84, 0x0c, 0x7b,
+ 0x72, 0xe4, 0xb7, 0xe9, 0xc2, 0xfc, 0x8c, 0x42, 0x82, 0x00, 0xae, 0xe6,
+ 0xbe, 0xa6, 0x41, 0x52, 0x02, 0x18, 0xc0, 0x9f, 0x58, 0x27, 0x2c, 0x8e,
+ 0xfd, 0x09, 0xdb, 0xb1, 0x88, 0x71, 0x16, 0x6b, 0xa2, 0x55, 0x0b, 0x74,
+ 0x96, 0x7a, 0xa7, 0x34, 0x48, 0x2e, 0xc1, 0x16, 0xff, 0x72, 0x15, 0x0c,
+ 0xd4, 0x82, 0x37, 0xb0, 0x09, 0x1b, 0x1c, 0xb4, 0x16, 0x59, 0x8e, 0x22,
+ 0x4d, 0x74, 0xa1, 0xe9, 0xa0, 0xfe, 0x2a, 0x98, 0xbf, 0xe4, 0xec, 0x69,
+ 0x53, 0x55, 0xe7, 0xea, 0xb1, 0x3d, 0xd2, 0xc3, 0x5e, 0xd9, 0x84, 0xbe,
+ 0xa5, 0x2f, 0x08, 0xd0, 0xba, 0x8c, 0x6f, 0x5b, 0x4f, 0xf7, 0x45, 0x26,
+ 0x63, 0x09, 0x1c, 0xad, 0x53, 0x2b, 0xb1, 0x87, 0x48, 0x6c, 0x6e, 0x63,
+ 0x4c, 0x55, 0x10, 0xe3, 0xc3, 0xb3, 0xcd, 0xe4, 0xac, 0x83, 0xfb, 0x22,
+ 0xf0, 0x89, 0x6d, 0x39, 0x2c, 0xad, 0x3e, 0x19, 0x47, 0xb7, 0x1f, 0x23,
+ 0x44, 0xd1, 0xcb, 0x2d, 0x62, 0x34, 0x42, 0xbf, 0xbf, 0xb9, 0x60, 0xea,
+ 0xac, 0xe5, 0x00, 0x25, 0x19, 0x0c, 0x01, 0x22, 0x26, 0xa5, 0x7f, 0x4c,
+ 0x8d, 0x05, 0x5d, 0x52, 0x61, 0x1d, 0xb7, 0xd8, 0x13, 0xa7, 0xbc, 0xa2,
+ 0x9d, 0xcc, 0x82, 0xdc, 0x46, 0x10, 0x42, 0x73, 0xcc, 0x3d, 0xac, 0x23,
+ 0xe9, 0x72, 0x5b, 0xf3, 0xad, 0xd4, 0xe9, 0x45, 0x03, 0x19, 0x76, 0x95,
+ 0x15, 0x59, 0x0c, 0x0f, 0xec, 0x1e, 0x17, 0xb9, 0xb0, 0xf4, 0x74, 0xd4,
+ 0xc5, 0xe8, 0xf7, 0x82, 0x06, 0x32, 0xb9, 0xbc, 0x74, 0xfd, 0x38, 0x7a,
+ 0x70, 0x7c, 0x59, 0xc7, 0xa3, 0x26, 0xb7, 0x24, 0x11, 0xa9, 0xdb, 0x03,
+ 0x4c, 0x82, 0x49, 0xb9, 0xb8, 0x27, 0x62, 0x98, 0xc7, 0xea, 0xfa, 0x7a,
+ 0xd7, 0xc8, 0x8d, 0xdd, 0xd1, 0xe7, 0x8c, 0xfd, 0x7e, 0x6d, 0x2e, 0xeb,
+ 0x08, 0xe8, 0x37, 0xa7, 0x8f, 0x48, 0x3b, 0xec, 0xce, 0x78, 0xa2, 0x85,
+ 0x8f, 0x9c, 0xe2, 0x3f, 0xfc, 0x0f, 0xe2, 0x34, 0x00, 0x53, 0x76, 0x77,
+ 0x81, 0x18, 0x2a, 0x21, 0xb6, 0xda, 0xe4, 0xe6, 0xad, 0x9c, 0x69, 0x70,
+ 0x91, 0x37, 0x68, 0x9d, 0xa2, 0x56, 0x64, 0xfb, 0x68, 0xa2, 0xcd, 0x61,
+ 0x85, 0xb7, 0xa2, 0x15, 0xf0, 0xa3, 0xe4, 0x3f, 0x80, 0x81, 0x29, 0x6f,
+ 0x73, 0x11, 0x06, 0x92, 0x21, 0xbe, 0x3e, 0x7a, 0x7d, 0xfa, 0xee, 0xa8,
+ 0x5d, 0x9c, 0xd8, 0x00, 0x61, 0x2b, 0x41, 0xb0, 0xbf, 0x3b, 0x3b, 0x86,
+ 0x15, 0x14, 0xd0, 0x03, 0xc9, 0x54, 0xc8, 0xc9, 0xee, 0x4f, 0xce, 0x7e,
+ 0x78, 0x65, 0x67, 0x47, 0x5a, 0x42, 0xc1, 0xbd, 0xf8, 0x64, 0xd0, 0x01,
+ 0x53, 0xba, 0x7b, 0xb5, 0x93, 0x16, 0x40, 0x2d, 0x07, 0x4b, 0x49, 0x64,
+ 0xd0, 0xf9, 0x21, 0xc5, 0x82, 0x13, 0x63, 0xb4, 0x30, 0x1f, 0x9d, 0x1a,
+ 0xea, 0x9a, 0x0a, 0xed, 0xed, 0xa0, 0x81, 0xde, 0xcb, 0xd6, 0x11, 0xc3,
+ 0x4b, 0x71, 0x22, 0x71, 0x9a, 0x00, 0xbe, 0x8f, 0x10, 0xfd, 0x46, 0x49,
+ 0xf8, 0x21, 0x4d, 0x0a, 0xc1, 0x57, 0x62, 0x02, 0xfb, 0x9a, 0x72, 0xb2,
+ 0x11, 0x08, 0xe1, 0xdb, 0x8e, 0x1c, 0x2e, 0xc4, 0xb4, 0x16, 0x34, 0x76,
+ 0xc0, 0x50, 0x8b, 0x12, 0xee, 0xf1, 0x09, 0x19, 0x89, 0x90, 0x9b, 0x6f,
+ 0x6e, 0xd4, 0x54, 0xd6, 0xe0, 0x4d, 0xd5, 0xfe, 0x26, 0x51, 0x0b, 0x7a,
+ 0xfd, 0x0f, 0xeb, 0xae, 0x02, 0x84, 0xbb, 0xb4, 0xc6, 0xfb, 0x19, 0xbb,
+ 0x2e, 0x97, 0x9b, 0x0f, 0xe5, 0x6f, 0xe9, 0x8a, 0xfb, 0xaa, 0xaf, 0x25,
+ 0x74, 0x27, 0x29, 0x3d, 0x40, 0xb6, 0x5d, 0x32, 0x20, 0x32, 0x04, 0x87,
+ 0x5c, 0xa6, 0x3a, 0x8a, 0x06, 0xfc, 0xc2, 0x52, 0x8b, 0x86, 0x40, 0x16,
+ 0x5c, 0xe7, 0x3b, 0x15, 0x38, 0x08, 0x98, 0x69, 0x7b, 0x16, 0x84, 0x22,
+ 0xd0, 0x52, 0xb0, 0xbe, 0x2f, 0x1a, 0x3a, 0xa8, 0x2c, 0x53, 0x26, 0x65,
+ 0x15, 0x2d, 0xf7, 0x22, 0x46, 0x72, 0xac, 0x5b, 0x03, 0x57, 0xe2, 0xc5,
+ 0xd3, 0x17, 0x74, 0xb5, 0x23, 0x43, 0x49, 0xfa, 0x3e, 0x0a, 0x8a, 0x3c,
+ 0xa2, 0xa7, 0x0c, 0x11, 0x1e, 0x60, 0xb6, 0xfb, 0x6b, 0x80, 0xbb, 0x8b,
+ 0x14, 0xe7, 0x6c, 0xc6, 0xbd, 0x26, 0xc7, 0xde, 0x20, 0x21, 0x74, 0xd2,
+ 0x8a, 0x0d, 0x23, 0xd0, 0x3e, 0xc3, 0x3e, 0x79, 0xfd, 0x31, 0xd9, 0xf8,
+ 0xd7, 0x4d, 0xc6, 0x1b, 0xd1, 0xb4, 0x1c, 0xf2, 0xcd, 0xe6, 0xc5, 0x32,
+ 0xe0, 0x7c, 0x72, 0xce, 0xe5, 0x2d, 0xa2, 0x82, 0xe6, 0x58, 0xdf, 0x45,
+ 0xac, 0x02, 0xaf, 0x6e, 0xca, 0x45, 0xc2, 0xcd, 0x41, 0xab, 0x20, 0x38,
+ 0x26, 0xdb, 0xb5, 0xd2, 0x4e, 0xed, 0x2f, 0x52, 0x08, 0x6f, 0x44, 0x08,
+ 0x21, 0x40, 0xef, 0x8b, 0xc3, 0x55, 0xb5, 0xab, 0x51, 0xf2, 0xbe, 0x40,
+ 0x22, 0x9e, 0xf0, 0x9d, 0xdc, 0x13, 0x79, 0x61, 0xd6, 0x6f, 0x78, 0xda,
+ 0xdc, 0x14, 0x11, 0x21, 0xf4, 0xd7, 0xb6, 0xf0, 0x11, 0x21, 0xd9, 0x09,
+ 0x90, 0xe2, 0xd0, 0x8a, 0x58, 0xb3, 0x62, 0x2b, 0x49, 0x5e, 0x87, 0x5d,
+ 0x54, 0xb9, 0x0b, 0x24, 0xb1, 0xba, 0x59, 0x0e, 0xc6, 0xa6, 0x10, 0x78,
+ 0x36, 0x9b, 0x0d, 0xb9, 0x55, 0x03, 0x01, 0xd7, 0x93, 0x72, 0xcf, 0x35,
+ 0xd1, 0x48, 0x60, 0xf3, 0x0d, 0x9f, 0xe0, 0x66, 0x41, 0x69, 0x37, 0x20,
+ 0x63, 0x15, 0x5c, 0x44, 0x0a, 0xaf, 0x34, 0xb0, 0x46, 0x75, 0x7a, 0xce,
+ 0x19, 0x02, 0xe2, 0xf0, 0x92, 0xfa, 0xfa, 0x1e, 0x86, 0xb8, 0xb0, 0x29,
+ 0x11, 0x9a, 0xbc, 0x8d, 0xd1, 0xbe, 0xb0, 0xbe, 0xd2, 0xcd, 0x4f, 0x5a,
+ 0xa6, 0xa8, 0xb3, 0xa6, 0x76, 0x77, 0x78, 0x0a, 0x19, 0x88, 0x5d, 0xd3,
+ 0x23, 0xd9, 0x3f, 0x1c, 0xd1, 0x69, 0xca, 0xf5, 0xaa, 0xd2, 0x76, 0x1e,
+ 0xe7, 0xb2, 0x98, 0xb2, 0xb2, 0xf9, 0x12, 0xb3, 0xc9, 0xee, 0xa0, 0x24,
+ 0x19, 0x06, 0xf9, 0xd2, 0x66, 0x81, 0x7d, 0xd6, 0x53, 0x15, 0x44, 0x3d,
+ 0xd1, 0xb9, 0x21, 0xba, 0xf9, 0x36, 0x2f, 0x86, 0x6d, 0x53, 0x82, 0x80,
+ 0xca, 0x32, 0xc5, 0x34, 0x9e, 0x7d, 0xb8, 0xca, 0x1a, 0xfa, 0xed, 0xc6,
+ 0xde, 0x26, 0x91, 0x23, 0x3e, 0xdc, 0x82, 0xea, 0xe2, 0x51, 0x25, 0xdc,
+ 0x9e, 0x86, 0xad, 0x1a, 0x36, 0x0a, 0x89, 0x8b, 0x5f, 0x10, 0xda, 0x74,
+ 0xe0, 0x37, 0x9b, 0x5c, 0x5f, 0x55, 0x0b, 0x6e, 0x68, 0xfb, 0x00, 0x55,
+ 0xf9, 0xc9, 0x80, 0xa6, 0xfc, 0xea, 0xf1, 0x2b, 0x9f, 0x96, 0x42, 0x36,
+ 0x43, 0xb7, 0xf8, 0x70, 0x02, 0xa6, 0x4b, 0x99, 0x23, 0x42, 0x4e, 0xe5,
+ 0x5a, 0x3b, 0x9a, 0xb3, 0xdc, 0x84, 0xf8, 0xf8, 0x4d, 0x7c, 0xb8, 0xd6,
+ 0x96, 0xf0, 0x08, 0x3a, 0x2c, 0xce, 0x9f, 0x31, 0xef, 0x73, 0xea, 0x4d,
+ 0x48, 0x27, 0xec, 0x2a, 0xab, 0xec, 0x47, 0xc2, 0xcc, 0xd3, 0xeb, 0x79,
+ 0x39, 0xa5, 0xb2, 0xb8, 0xec, 0x41, 0x5a, 0xd0, 0x83, 0x4a, 0x0b, 0x29,
+ 0x27, 0xac, 0xfd, 0x75, 0x61, 0x10, 0x73, 0xf2, 0x75, 0xa7, 0x43, 0x30,
+ 0x96, 0xae, 0x6d, 0x99, 0x68, 0x83, 0xe9, 0x8c, 0x5f, 0xf6, 0x97, 0x50,
+ 0x24, 0xe5, 0xa4, 0xf1, 0x56, 0x40, 0x0f, 0xf4, 0x30, 0x2c, 0x6e, 0xab,
+ 0xc8, 0xca, 0xa8, 0xc6, 0x0c, 0x66, 0xfa, 0x43, 0x2b, 0xa3, 0x07, 0x83,
+ 0x5d, 0x36, 0x3f, 0x74, 0x88, 0xca, 0xde, 0x16, 0xf3, 0xe6, 0xc4, 0x87,
+ 0x6b, 0x6f, 0xb0, 0xee, 0x30, 0xe6, 0x10, 0xdb, 0x60, 0xe9, 0x3b, 0x10,
+ 0xaa, 0xad, 0xce, 0xe9, 0xc0, 0xd4, 0xb1, 0x0f, 0xf6, 0x6e, 0xb0, 0x7c,
+ 0x23, 0xa0, 0xc2, 0xac, 0x30, 0x87, 0x6f, 0x59, 0x4d, 0xb2, 0x0f, 0x98,
+ 0x1b, 0x63, 0xd7, 0x7f, 0x58, 0x4d, 0x90, 0x99, 0x00, 0x52, 0xdc, 0xcf,
+ 0x49, 0x23, 0x75, 0x12, 0x58, 0x50, 0x93, 0x53, 0x01, 0x68, 0x30, 0x5a,
+ 0x33, 0x7e, 0xcf, 0x26, 0x62, 0x0f, 0xdb, 0xbb, 0xef, 0x31, 0xd2, 0x32,
+ 0xe7, 0xb7, 0x2d, 0xca, 0xbc, 0xb0, 0x3d, 0xbf, 0xa0, 0x47, 0x78, 0x73,
+ 0x8c, 0x81, 0x57, 0xad, 0x8a, 0x01, 0xce, 0x3f, 0x52, 0x95, 0x9a, 0xd5,
+ 0xac, 0x3e, 0x44, 0xfa, 0x3a, 0x79, 0x8b, 0xe3, 0xa7, 0x75, 0xb7, 0x79,
+ 0x49, 0x52, 0x85, 0x69, 0x01, 0xfd, 0x5b, 0x22, 0x30, 0x09, 0xab, 0xc9,
+ 0x3d, 0x2d, 0x43, 0x3f, 0x68, 0x4f, 0x64, 0x30, 0xbb, 0x47, 0x8b, 0x70,
+ 0x7e, 0x32, 0x2e, 0xc1, 0x5b, 0x75, 0xab, 0x9e, 0x1c, 0x5f, 0xc1, 0x86,
+ 0xbf, 0x58, 0x8e, 0x4f, 0xfa, 0x64, 0x2e, 0x29, 0x62, 0x74, 0x97, 0x41,
+ 0x88, 0x9b, 0xef, 0xfe, 0xf7, 0x8b, 0xf0, 0xc5, 0xed, 0xd4, 0xba, 0x0c,
+ 0x6f, 0x9d, 0x54, 0x52, 0x35, 0x14, 0xcd, 0x94, 0x2e, 0xea, 0x72, 0xb6,
+ 0x24, 0x07, 0x44, 0xda, 0x5c, 0xf3, 0x0e, 0x5d, 0xea, 0x3c, 0x7b, 0xf7,
+ 0xb3, 0x68, 0x42, 0x4d, 0x3d, 0xd8, 0x51, 0xf3, 0x18, 0x32, 0xb4, 0xc1,
+ 0xb2, 0xc2, 0xe1, 0xfd, 0xdb, 0x2a, 0x4f, 0xbb, 0x29, 0xb2, 0x1e, 0xe2,
+ 0x36, 0xa5, 0x8a, 0x30, 0x5e, 0xff, 0x1d, 0x22, 0x5f, 0xed, 0xdc, 0x21,
+ 0xd3, 0x8c, 0x22, 0x08, 0xcc, 0x1d, 0x48, 0x2d, 0xb4, 0xb7, 0x51, 0xf2,
+ 0xd0, 0xd9, 0xec, 0x65, 0xdc, 0x6a, 0xfe, 0x00, 0xc3, 0x9a, 0x07, 0xdc,
+ 0xaa, 0x18, 0x1f, 0xc6, 0xae, 0x2a, 0x10, 0x75, 0xc2, 0x80, 0x3d, 0x94,
+ 0xef, 0x9b, 0x41, 0xeb, 0x60, 0xaf, 0x9a, 0x89, 0x7f, 0xa6, 0xfd, 0xc9,
+ 0x38, 0xd2, 0x1a, 0xa3, 0x83, 0x32, 0x6f, 0xdc, 0xcc, 0x7a, 0x78, 0xfd,
+ 0xbe, 0xf3, 0x9e, 0x90, 0x67, 0xe0, 0x79, 0xd9, 0xb9, 0xb3, 0xd6, 0x7c,
+ 0x11, 0x81, 0x4e, 0x50, 0x99, 0xf9, 0x8b, 0x64, 0x2e, 0x79, 0x92, 0x66,
+ 0x85, 0xef, 0x3b, 0xa2, 0x2f, 0x1a, 0x1d, 0x71, 0x45, 0xc5, 0x95, 0xd7,
+ 0x8d, 0xc7, 0x6e, 0x38, 0x5a, 0x5b, 0xe4, 0xc8, 0x10, 0x40, 0xea, 0x28,
+ 0x52, 0xaa, 0xd1, 0x98, 0x51, 0xcc, 0x29, 0xc0, 0x18, 0x4e, 0xa9, 0xe5,
+ 0x55, 0x58, 0xe1, 0xc1, 0x9f, 0xe4, 0xfc, 0x42, 0x86, 0xe7, 0xa6, 0x18,
+ 0xb7, 0xa8, 0xcb, 0xd0, 0xfe, 0x19, 0x39, 0x9d, 0xed, 0x59, 0x7d, 0x3c,
+ 0xe1, 0x2e, 0x5a, 0x5d, 0xbb, 0x22, 0x48, 0xf5, 0x24, 0x45, 0xb9, 0x83,
+ 0xcc, 0x9f, 0x5d, 0x4d, 0x87, 0xc2, 0x15, 0x6d, 0xb1, 0x3e, 0xac, 0x06,
+ 0x4c, 0x02, 0x23, 0x26, 0x5e, 0xe2, 0x3f, 0xd1, 0x72, 0x26, 0x18, 0x6f,
+ 0xd0, 0xaa, 0x09, 0x8d, 0x63, 0x33, 0x79, 0x27, 0x41, 0x78, 0xb2, 0x3e,
+ 0xee, 0x1b, 0x02, 0x7f, 0xa7, 0x01, 0x36, 0xf2, 0x91, 0xd1, 0x30, 0xb8,
+ 0x7c, 0x85, 0x54, 0x79, 0xea, 0xf5, 0x11, 0x4b, 0x69, 0xd8, 0x94, 0xd0,
+ 0x3d, 0xbb, 0x86, 0xb7, 0x76, 0x46, 0x3b, 0x03, 0xdf, 0x3f, 0xe2, 0x92,
+ 0x54, 0xc9, 0x4a, 0x4c, 0x6d, 0xd7, 0x00, 0xfa, 0x74, 0xd7, 0x23, 0xf6,
+ 0x8e, 0x3e, 0x5c, 0x87, 0x01, 0x0c, 0x04, 0x41, 0x9c, 0x69, 0x7d, 0x9b,
+ 0xde, 0x87, 0x26, 0xd4, 0xf6, 0xf0, 0xc9, 0x8b, 0x17, 0x2d, 0x25, 0xa9,
+ 0xf6, 0x5a, 0x2e, 0x3c, 0xdd, 0xde, 0xc6, 0xda, 0x82, 0x5a, 0x7d, 0xf3,
+ 0x8b, 0xe1, 0x0b, 0xbc, 0xd8, 0x7e, 0xad, 0xce, 0xcc, 0x16, 0x4c, 0xfb,
+ 0xdf, 0x1b, 0xd2, 0x6f, 0x22, 0x9f, 0xc3, 0x9d, 0xd3, 0xfb, 0xd6, 0x0b,
+ 0xfa, 0x5c, 0xe4, 0x2d, 0x3c, 0xcc, 0x74, 0x2c, 0x2f, 0x2f, 0xc9, 0xe5,
+ 0x4a, 0x4f, 0x2a, 0x5e, 0xd4, 0x6d, 0x5a, 0x4d, 0xc3, 0xe5, 0x6e, 0x0f,
+ 0x86, 0x3b, 0x7d, 0xcb, 0x45, 0xde, 0x03, 0x52, 0x35, 0x69, 0x3f, 0xc9,
+ 0xa3, 0x61, 0xec, 0x64, 0x2e, 0x65, 0xeb, 0x0e, 0xb4, 0x63, 0x66, 0xb4,
+ 0xf3, 0xe2, 0xc5, 0x80, 0x66, 0xf6, 0xf4, 0xc5, 0x8b, 0x5e, 0xa0, 0x02,
+ 0xef, 0x33, 0xb7, 0xa5, 0x73, 0x94, 0xd2, 0xeb, 0x8e, 0x69, 0x6a, 0x32,
+ 0xc7, 0xe3, 0xdf, 0xa1, 0xdf, 0x24, 0x5f, 0x24, 0x6f, 0x4f, 0xcf, 0x8f,
+ 0x3c, 0x1f, 0x22, 0xce, 0x17, 0x87, 0xb6, 0x3d, 0xa7, 0x08, 0xb2, 0x05,
+ 0x16, 0xe8, 0x6d, 0x09, 0xff, 0x8c, 0xb1, 0x9e, 0x43, 0xb7, 0x07, 0xca,
+ 0xaa, 0xd4, 0x77, 0xfd, 0x2f, 0x61, 0xee, 0x0e, 0x1a, 0x58, 0x5e, 0xe5,
+ 0x8d, 0x0f, 0x27, 0xb6, 0x61, 0x36, 0x7b, 0x13, 0xce, 0x38, 0x4e, 0xc7,
+ 0x94, 0xb0, 0xdf, 0x7a, 0x4d, 0x75, 0x48, 0x9c, 0xb2, 0x4d, 0xff, 0x28,
+ 0x17, 0xeb, 0x41, 0x29, 0x50, 0x36, 0x9b, 0xb2, 0x76, 0xee, 0x5e, 0x18,
+ 0xe2, 0x49, 0x39, 0x2e, 0xf0, 0xac, 0xdc, 0x21, 0x56, 0x94, 0x02, 0x6d,
+ 0xd5, 0xff, 0x78, 0x24, 0xf2, 0x47, 0x92, 0x90, 0x53, 0x86, 0xb4, 0x86,
+ 0x90, 0x86, 0xf1, 0x51, 0xb7, 0xd7, 0x6b, 0xe7, 0x9a, 0xb7, 0x7e, 0xe4,
+ 0x82, 0xf6, 0x21, 0xc0, 0xc9, 0xe4, 0x70, 0xd3, 0x34, 0x5b, 0x68, 0xf2,
+ 0x73, 0xd1, 0x1e, 0xc7, 0xf0, 0xf2, 0x65, 0x7e, 0xb5, 0xac, 0xe2, 0x89,
+ 0xc2, 0xe8, 0xa1, 0x2a, 0x39, 0x39, 0xda, 0x60, 0x24, 0xbd, 0x4d, 0xab,
+ 0x4c, 0x9b, 0xbe, 0x16, 0xf7, 0xf6, 0x6c, 0xab, 0xbf, 0x46, 0x2b, 0xd7,
+ 0xa8, 0xfb, 0x4b, 0xe0, 0xf3, 0xa1, 0x62, 0x43, 0xa3, 0x1d, 0x92, 0x3f,
+ 0x4b, 0x92, 0xc9, 0xa4, 0xcb, 0x49, 0xda, 0xb8, 0xda, 0x41, 0x71, 0x75,
+ 0xd3, 0x66, 0xd3, 0x65, 0x0a, 0x2c, 0x57, 0x90, 0x20, 0xcc, 0xfe, 0x5c,
+ 0x9f, 0xb9, 0x28, 0x13, 0x3d, 0x0b, 0xbf, 0xe0, 0x75, 0xe9, 0x35, 0x20,
+ 0x0a, 0xc1, 0x44, 0x48, 0xf2, 0x30, 0xcc, 0x10, 0xfe, 0xca, 0x9b, 0x64,
+ 0x9e, 0xbf, 0x2d, 0x66, 0x65, 0x3a, 0x75, 0x6e, 0xbe, 0x85, 0x26, 0x96,
+ 0x0b, 0x14, 0x9e, 0x6c, 0x6d, 0xd8, 0xac, 0xcb, 0xec, 0x34, 0xef, 0x71,
+ 0xb2, 0xe1, 0x01, 0xdd, 0x80, 0x43, 0x3d, 0x87, 0x1d, 0x4b, 0x29, 0xe2,
+ 0x14, 0x06, 0x6e, 0x21, 0x18, 0xa6, 0xd0, 0x41, 0x43, 0xfc, 0xce, 0xbb,
+ 0x65, 0x53, 0xb2, 0xd0, 0xff, 0x9b, 0x2e, 0x49, 0xcf, 0xf9, 0x96, 0x8c,
+ 0x8f, 0xff, 0xe7, 0xd1, 0xa7, 0x8c, 0x8f, 0x56, 0xe9, 0xad, 0x2d, 0x71,
+ 0xfd, 0x81, 0x81, 0x54, 0x25, 0x6e, 0x69, 0x11, 0x54, 0xd2, 0x99, 0x78,
+ 0x9b, 0xa8, 0xc7, 0x34, 0x6e, 0x0f, 0x04, 0xc0, 0xc1, 0x65, 0xe4, 0xe5,
+ 0x0c, 0x1d, 0x92, 0xa8, 0x44, 0x75, 0x88, 0x7a, 0x5c, 0x35, 0x81, 0xda,
+ 0x44, 0x76, 0x55, 0xf3, 0x3e, 0xce, 0xe1, 0xf4, 0x86, 0x13, 0x8a, 0xe2,
+ 0x12, 0x0c, 0x73, 0x16, 0xe9, 0xdc, 0x0d, 0xa4, 0x4e, 0x9a, 0x94, 0x99,
+ 0xeb, 0x03, 0x3d, 0x7a, 0x7d, 0x10, 0x08, 0x69, 0xed, 0x42, 0x81, 0xd4,
+ 0x2a, 0x79, 0xf9, 0xfe, 0xdd, 0x49, 0x4f, 0x61, 0xef, 0x18, 0x7b, 0x40,
+ 0xc4, 0x5a, 0x7b, 0x97, 0x01, 0x65, 0xaf, 0x4a, 0xce, 0x8c, 0x9a, 0xbd,
+ 0xe6, 0x03, 0x1b, 0xb6, 0x90, 0x4d, 0xc5, 0x55, 0x16, 0x73, 0xfc, 0xf9,
+ 0x1d, 0x7a, 0x48, 0x88, 0xbb, 0x04, 0x06, 0xbf, 0x1c, 0xf7, 0x72, 0x96,
+ 0x0a, 0xed, 0x96, 0x15, 0x25, 0x9e, 0x80, 0xf2, 0x91, 0xd6, 0x8a, 0xea,
+ 0x51, 0xef, 0x40, 0xd2, 0x4a, 0xcb, 0x48, 0xb8, 0x8e, 0xd2, 0x05, 0xf1,
+ 0x50, 0xb2, 0xf6, 0x47, 0x8a, 0x15, 0xad, 0xe9, 0x34, 0x87, 0x59, 0x18,
+ 0x0e, 0x56, 0x52, 0x50, 0x0a, 0x43, 0xcb, 0x5f, 0xda, 0x8e, 0x32, 0xd1,
+ 0xac, 0x35, 0x33, 0x20, 0x23, 0x9c, 0xe8, 0x3a, 0x89, 0xb4, 0xc7, 0xe2,
+ 0x22, 0x2b, 0x02, 0x03, 0x65, 0x7c, 0x60, 0xca, 0x8d, 0x4a, 0x4e, 0x64,
+ 0x7e, 0xfb, 0x12, 0x16, 0x64, 0x5d, 0x48, 0xa7, 0xd6, 0xca, 0x61, 0x8b,
+ 0x2d, 0x36, 0x9d, 0x51, 0xfb, 0x2c, 0xeb, 0xa7, 0xa5, 0x35, 0x4e, 0x4b,
+ 0xea, 0xb7, 0x44, 0x53, 0x4a, 0x0b, 0x1b, 0xf6, 0x68, 0xed, 0xec, 0x27,
+ 0x87, 0xe0, 0x74, 0xa1, 0xca, 0x03, 0x6d, 0x77, 0x38, 0x34, 0xdc, 0x51,
+ 0x48, 0xb3, 0x48, 0x6f, 0x5b, 0x3d, 0xde, 0xeb, 0xe9, 0xed, 0xd6, 0x83,
+ 0xe4, 0xec, 0x4d, 0xb7, 0x41, 0x41, 0x15, 0xb6, 0x30, 0xec, 0x07, 0x68,
+ 0x6b, 0xbb, 0xe5, 0xb2, 0x8c, 0x06, 0x9e, 0x86, 0x5e, 0xe9, 0xd5, 0x21,
+ 0x17, 0x19, 0x0f, 0x5f, 0xe5, 0xe6, 0x12, 0xa9, 0x19, 0x19, 0x0b, 0x5a,
+ 0x2e, 0xb7, 0xd1, 0xd6, 0x83, 0xc8, 0xc5, 0xe6, 0xc3, 0x10, 0x75, 0x72,
+ 0x22, 0x15, 0x48, 0xf6, 0x15, 0x1b, 0x5d, 0x34, 0x1c, 0xf1, 0x40, 0x58,
+ 0xc3, 0x69, 0x0b, 0xa9, 0xb3, 0xa9, 0x41, 0xb3, 0x54, 0x3b, 0x6b, 0x08,
+ 0xec, 0x0c, 0x79, 0xd8, 0x23, 0xd4, 0xb1, 0x78, 0x55, 0xc8, 0xf1, 0xaa,
+ 0x13, 0x5b, 0xc8, 0x21, 0x2d, 0xdc, 0x02, 0x63, 0x13, 0xc9, 0xb9, 0xae,
+ 0xf4, 0xb8, 0x1b, 0xb0, 0x36, 0x93, 0xb2, 0x3d, 0xb3, 0x38, 0xc6, 0xc7,
+ 0xe8, 0x90, 0x5c, 0x44, 0x3d, 0x31, 0xc3, 0x8e, 0x3a, 0x4b, 0xd0, 0x7e,
+ 0x5f, 0xf1, 0x0b, 0xf7, 0xbe, 0xb5, 0x30, 0x64, 0x37, 0xfb, 0x8c, 0x47,
+ 0x51, 0xac, 0xa2, 0x14, 0xe4, 0xa1, 0x58, 0xb2, 0x07, 0xf2, 0xcc, 0xe8,
+ 0x11, 0xff, 0x1e, 0xe4, 0xd4, 0xa2, 0xe4, 0xf7, 0x43, 0xd7, 0x10, 0x66,
+ 0xe3, 0x3e, 0x33, 0x1a, 0xb6, 0x4b, 0x4f, 0x82, 0x21, 0xf5, 0x59, 0x8f,
+ 0xd3, 0x42, 0x6e, 0x59, 0x37, 0x0d, 0x32, 0x42, 0xbc, 0x18, 0x38, 0x13,
+ 0x5d, 0x7a, 0x3b, 0x2d, 0x8b, 0xec, 0x8e, 0xb0, 0xe9, 0xfb, 0x87, 0x0b,
+ 0x95, 0xec, 0x1f, 0x0e, 0xde, 0xbd, 0x3d, 0x7e, 0xfb, 0xcd, 0x3e, 0x21,
+ 0x27, 0x66, 0xd5, 0x24, 0xa7, 0x8a, 0xbf, 0xbf, 0x2c, 0xa7, 0xf9, 0x84,
+ 0x25, 0x05, 0xc0, 0x1f, 0x2f, 0xdb, 0x35, 0x5c, 0x99, 0x84, 0x02, 0x8c,
+ 0x70, 0x09, 0x4a, 0xb6, 0x24, 0xed, 0x9c, 0x2a, 0xd0, 0xaa, 0xf2, 0x6a,
+ 0x69, 0x49, 0x3f, 0x81, 0x2a, 0x82, 0x80, 0x15, 0x02, 0xf9, 0x24, 0x8f,
+ 0x98, 0x69, 0xc9, 0x3b, 0x6a, 0x14, 0x85, 0x57, 0x27, 0x27, 0x49, 0x08,
+ 0x31, 0xcd, 0x89, 0xce, 0xc2, 0x5f, 0x9c, 0xdb, 0x86, 0x81, 0x6c, 0x66,
+ 0x34, 0x45, 0x9e, 0xcd, 0xe5, 0x4f, 0xd2, 0xa6, 0x25, 0xf5, 0x8c, 0xe9,
+ 0xfa, 0x43, 0x98, 0x73, 0x8c, 0x8c, 0x78, 0xa4, 0xb1, 0x62, 0x87, 0xf3,
+ 0x6a, 0x0a, 0x5b, 0xc8, 0x08, 0xc9, 0xf2, 0xb2, 0x21, 0xf5, 0xa8, 0x75,
+ 0x93, 0xb6, 0xbb, 0x88, 0xad, 0x0a, 0x0b, 0x5d, 0xb3, 0x95, 0xd3, 0xc2,
+ 0xf4, 0xe1, 0xd8, 0xb9, 0xf6, 0xe9, 0x64, 0xbd, 0x10, 0x6d, 0xe7, 0x28,
+ 0x0b, 0x3c, 0xe0, 0xe6, 0x69, 0x66, 0x6e, 0x45, 0x51, 0x8e, 0x6b, 0x92,
+ 0x96, 0xa1, 0xb8, 0xb8, 0xcd, 0xa4, 0x5f, 0xa8, 0xab, 0x77, 0x37, 0xc2,
+ 0x6e, 0x94, 0x8c, 0x4b, 0xf3, 0x7c, 0xa4, 0xbe, 0x46, 0x3b, 0x10, 0xbb,
+ 0x2e, 0xe3, 0x69, 0x23, 0xe9, 0xde, 0x36, 0x03, 0x10, 0x7d, 0xeb, 0x10,
+ 0x1d, 0x6e, 0xaf, 0x37, 0xcc, 0x1c, 0x00, 0xff, 0x5f, 0x64, 0x56, 0xa1,
+ 0xb8, 0xd7, 0x20, 0x24, 0x71, 0xc8, 0xda, 0xd0, 0x88, 0xd3, 0x35, 0x34,
+ 0x38, 0x1d, 0x16, 0xa5, 0x3f, 0xd2, 0x03, 0xbd, 0xc5, 0xfd, 0x82, 0x8a,
+ 0xee, 0x82, 0xa3, 0xcd, 0x2f, 0xbd, 0x2e, 0x71, 0xa9, 0xd8, 0x9d, 0x9e,
+ 0x83, 0x4f, 0x9a, 0x0a, 0xda, 0xa0, 0x3e, 0xd7, 0x93, 0x66, 0xa4, 0x61,
+ 0x06, 0xa9, 0x1a, 0xa7, 0x0c, 0xb2, 0x27, 0x0f, 0xf9, 0x88, 0x0e, 0xfe,
+ 0xcb, 0x72, 0xdd, 0x0c, 0x9c, 0x73, 0x21, 0x07, 0xda, 0x54, 0x13, 0x54,
+ 0x94, 0x5e, 0x8e, 0x36, 0xa3, 0x19, 0x60, 0x3c, 0x07, 0xb9, 0x91, 0xea,
+ 0xf4, 0xc6, 0xa5, 0x26, 0xf6, 0x0a, 0x3e, 0x2d, 0xab, 0xea, 0xde, 0xd1,
+ 0xd8, 0x50, 0xeb, 0x55, 0xd2, 0xa1, 0xd2, 0xc4, 0x2b, 0xb9, 0xf2, 0x83,
+ 0xea, 0x2d, 0xf4, 0x8c, 0x48, 0xbf, 0x4e, 0xae, 0x4d, 0x94, 0x70, 0x6c,
+ 0xaf, 0x10, 0x96, 0x18, 0x63, 0x5e, 0xdc, 0x94, 0xf8, 0x8d, 0x84, 0x53,
+ 0x23, 0xc9, 0x54, 0x79, 0x6f, 0x01, 0xd6, 0x79, 0x87, 0xaa, 0xea, 0xa0,
+ 0xd1, 0x72, 0x17, 0xb3, 0x16, 0x2e, 0x62, 0xf5, 0x7b, 0x09, 0xb9, 0xf6,
+ 0x41, 0x5d, 0x56, 0xe0, 0xc3, 0x44, 0xcc, 0x3b, 0x40, 0xba, 0xde, 0x35,
+ 0x5e, 0xce, 0x66, 0x75, 0xc6, 0x48, 0x97, 0x52, 0xbc, 0xaa, 0x17, 0x8e,
+ 0xdc, 0x37, 0xb9, 0xf5, 0xfd, 0xf4, 0xdf, 0x24, 0xb6, 0xa0, 0xcd, 0xd2,
+ 0xda, 0xd9, 0xaf, 0x94, 0x7b, 0xcb, 0x0d, 0x49, 0xe9, 0x04, 0x4f, 0xae,
+ 0xcb, 0x52, 0xaa, 0xa3, 0xfb, 0x84, 0x6d, 0xc2, 0x8d, 0xfb, 0x08, 0xbb,
+ 0xa5, 0x47, 0x7f, 0x68, 0xf7, 0x6b, 0x96, 0xb2, 0x87, 0xb0, 0xed, 0x5e,
+ 0xee, 0x34, 0x56, 0x0f, 0x35, 0xb7, 0x7d, 0xb7, 0xf1, 0x7c, 0xec, 0xe5,
+ 0x2c, 0xc2, 0x35, 0x84, 0xfd, 0x84, 0x14, 0xe0, 0xab, 0x3b, 0x4e, 0x1e,
+ 0xc9, 0x01, 0xf6, 0x89, 0x12, 0xbd, 0xec, 0x38, 0x2b, 0xd8, 0x01, 0xb7,
+ 0x83, 0x6b, 0x60, 0x36, 0x15, 0xed, 0x28, 0x11, 0x66, 0x9a, 0x37, 0x10,
+ 0x20, 0xbf, 0xdf, 0xdd, 0xee, 0x13, 0xf2, 0x34, 0x90, 0x56, 0x63, 0xd3,
+ 0x69, 0xac, 0xad, 0xfd, 0x85, 0x6b, 0xd0, 0x95, 0xb0, 0xd0, 0x1d, 0xb2,
+ 0x5c, 0x90, 0x9f, 0x6e, 0x48, 0xfc, 0x92, 0xd6, 0x7d, 0xf4, 0x8f, 0x5b,
+ 0xc5, 0xbf, 0xb6, 0x4f, 0x6a, 0x4f, 0x9b, 0x54, 0x27, 0xbf, 0xde, 0x79,
+ 0x7b, 0x4c, 0x03, 0xc5, 0x52, 0x21, 0x55, 0x96, 0xa8, 0x9f, 0xc4, 0x53,
+ 0xda, 0x9d, 0xce, 0x00, 0xbb, 0x1e, 0xfd, 0x30, 0xe5, 0x70, 0xd2, 0x68,
+ 0xa1, 0xf9, 0x9a, 0xce, 0x17, 0x49, 0x44, 0x64, 0x0d, 0xf4, 0x04, 0x68,
+ 0x42, 0x55, 0xea, 0x60, 0x58, 0x53, 0x11, 0x8f, 0xb3, 0x32, 0xc4, 0x09,
+ 0x12, 0x41, 0xca, 0xc6, 0x78, 0x2a, 0x89, 0xc5, 0x20, 0x08, 0x7d, 0xa9,
+ 0x7d, 0x31, 0x22, 0x3b, 0x72, 0x18, 0xf5, 0xf6, 0x47, 0xbb, 0x99, 0x48,
+ 0x9d, 0x83, 0xdf, 0xa2, 0x61, 0x8d, 0xdf, 0x5e, 0x4b, 0x36, 0x48, 0xaa,
+ 0x6e, 0x5a, 0xe5, 0x35, 0xac, 0xd4, 0xd7, 0xa6, 0x41, 0x6c, 0xc3, 0xa4,
+ 0x7c, 0x43, 0x76, 0xd3, 0xbc, 0x49, 0x7f, 0x35, 0x56, 0x5e, 0x65, 0xee,
+ 0x7f, 0xea, 0x45, 0xc8, 0x75, 0xae, 0x97, 0xcb, 0x59, 0xcc, 0xcc, 0xa1,
+ 0xb3, 0x2d, 0x9d, 0x37, 0xf2, 0xba, 0x5e, 0x8a, 0x11, 0x68, 0xa1, 0x90,
+ 0x2c, 0x12, 0x66, 0x32, 0x33, 0xf3, 0xc1, 0xa7, 0xeb, 0x19, 0xe5, 0x3f,
+ 0xf5, 0xaa, 0x27, 0xf0, 0x0e, 0x8b, 0xe2, 0x6b, 0x7b, 0xca, 0xb2, 0x1d,
+ 0x25, 0xbb, 0xc3, 0x0d, 0x12, 0xa5, 0xc1, 0x1f, 0x11, 0x61, 0x80, 0xbb,
+ 0xaa, 0x33, 0xdc, 0xda, 0xe9, 0xd9, 0xf9, 0xf1, 0xe9, 0xdb, 0x71, 0xf2,
+ 0xaf, 0x6b, 0x2b, 0x0b, 0x11, 0xdb, 0x80, 0xdf, 0x3f, 0x0e, 0xdc, 0x9e,
+ 0x24, 0x2f, 0xc5, 0xcf, 0xd0, 0x67, 0x1b, 0x7b, 0x4a, 0xfc, 0xc4, 0xdc,
+ 0xde, 0x46, 0xbe, 0xea, 0x9b, 0x82, 0x3a, 0x28, 0xbb, 0xd5, 0x01, 0x4a,
+ 0x0c, 0xb4, 0x65, 0x0b, 0x33, 0xd9, 0x35, 0xa2, 0x59, 0xd8, 0x3b, 0x9b,
+ 0xa5, 0x33, 0x7c, 0x5c, 0x02, 0x8b, 0xe4, 0x6b, 0x25, 0x1d, 0xcb, 0x0b,
+ 0x20, 0xf1, 0x2d, 0xd4, 0x52, 0xb6, 0xa0, 0x37, 0x58, 0x66, 0xaa, 0xa2,
+ 0x55, 0x47, 0x3a, 0x1f, 0x7e, 0x73, 0x74, 0x4e, 0x4e, 0x1a, 0xd4, 0x63,
+ 0xbb, 0x09, 0xc2, 0xd5, 0x25, 0x8a, 0x4f, 0x6a, 0x95, 0x33, 0x2d, 0xc3,
+ 0xa6, 0x43, 0x63, 0xb4, 0xe7, 0x59, 0x5a, 0x44, 0x8b, 0x2d, 0x8d, 0x46,
+ 0x7b, 0x68, 0xa8, 0x51, 0x3a, 0x48, 0x62, 0xf5, 0x9d, 0x78, 0xfd, 0x76,
+ 0x18, 0x40, 0xec, 0xec, 0xfd, 0xb9, 0xf8, 0xa9, 0x5e, 0x1d, 0x9d, 0x1c,
+ 0x9d, 0x1f, 0x75, 0x2d, 0xf7, 0x0b, 0x06, 0x59, 0x45, 0x51, 0x56, 0x93,
+ 0x4d, 0xae, 0x8b, 0x72, 0x56, 0x5e, 0xe5, 0xd2, 0x1d, 0x3a, 0xf9, 0x21,
+ 0xbb, 0x78, 0x75, 0xf0, 0x3d, 0xe9, 0x13, 0xe4, 0x73, 0x3a, 0x7b, 0x77,
+ 0x7a, 0xf6, 0xfa, 0xf8, 0xed, 0xab, 0x41, 0x72, 0x78, 0x7a, 0xf6, 0xa7,
+ 0x41, 0xf2, 0xe6, 0xf4, 0xfb, 0xa3, 0x48, 0x32, 0x3e, 0x21, 0x2f, 0x07,
+ 0x1c, 0x63, 0x9b, 0x48, 0x3a, 0xc3, 0xbb, 0xe0, 0x90, 0x85, 0x77, 0x89,
+ 0x1c, 0x74, 0x32, 0x52, 0x0c, 0xe9, 0xcc, 0x1d, 0xfa, 0xed, 0xd1, 0xc1,
+ 0xab, 0x41, 0x00, 0xac, 0x4f, 0x2d, 0x7e, 0xcc, 0xc7, 0x68, 0x7d, 0x76,
+ 0xd1, 0x80, 0x63, 0x67, 0xeb, 0x03, 0x1a, 0x02, 0x07, 0xb9, 0xf8, 0xc4,
+ 0x1a, 0x86, 0x05, 0x9e, 0xc4, 0xb4, 0x2f, 0xc7, 0x47, 0x7a, 0x44, 0x70,
+ 0x77, 0xe6, 0xd5, 0x05, 0x42, 0xa4, 0xac, 0xf9, 0x6a, 0xb6, 0xc0, 0x8a,
+ 0xa1, 0x00, 0x44, 0xcb, 0x05, 0xfd, 0x7c, 0xee, 0x1e, 0x6c, 0xab, 0x41,
+ 0x0b, 0xd4, 0x02, 0xf2, 0x88, 0x5d, 0x8f, 0xa9, 0xf4, 0xda, 0x44, 0x33,
+ 0x2d, 0x63, 0x26, 0x91, 0x56, 0x7d, 0xe9, 0xd0, 0x8b, 0x57, 0x6b, 0xd8,
+ 0x02, 0xf0, 0x2f, 0x00, 0x63, 0x44, 0x3c, 0x25, 0x90, 0xed, 0x35, 0xfb,
+ 0x23, 0xff, 0x58, 0x60, 0xcd, 0x22, 0x25, 0x06, 0xcb, 0x4b, 0xc3, 0x96,
+ 0x19, 0x27, 0xf7, 0xf1, 0x36, 0x59, 0xb7, 0x40, 0x32, 0x3c, 0x56, 0xa7,
+ 0xc4, 0x2a, 0x05, 0x4b, 0x4f, 0x8c, 0x3a, 0x66, 0x18, 0xd5, 0x4c, 0x7d,
+ 0x56, 0x6d, 0x31, 0xe1, 0x7b, 0x48, 0x68, 0x9d, 0x11, 0x7d, 0x5f, 0xb7,
+ 0x58, 0x71, 0xb7, 0xc4, 0x83, 0xe3, 0x13, 0x05, 0xf0, 0x30, 0x81, 0x2f,
+ 0xcb, 0x5c, 0xb0, 0xc1, 0xe5, 0x82, 0x27, 0x8d, 0x28, 0x29, 0xc4, 0x23,
+ 0x9a, 0x50, 0xe8, 0x6d, 0xc8, 0xb6, 0xb4, 0x9f, 0x9d, 0xae, 0xd2, 0x53,
+ 0x74, 0x53, 0x99, 0x43, 0x10, 0xa2, 0xc2, 0x3a, 0x5d, 0xef, 0x53, 0xdf,
+ 0x97, 0xb7, 0xb7, 0x7d, 0xe7, 0x7c, 0xec, 0xa4, 0x4d, 0xd4, 0xc9, 0x50,
+ 0x30, 0xe8, 0x51, 0x66, 0x1a, 0x90, 0x6e, 0xe3, 0x75, 0x8f, 0x60, 0xf4,
+ 0xbd, 0xb6, 0x16, 0x7a, 0xc2, 0x8a, 0xa8, 0x93, 0x63, 0x73, 0x1c, 0x22,
+ 0x20, 0x4e, 0xdc, 0x0c, 0x9a, 0x73, 0x37, 0xa0, 0x57, 0x81, 0xfa, 0x66,
+ 0xac, 0xf0, 0xc3, 0x67, 0xa7, 0x67, 0x7b, 0xd1, 0x2f, 0xd3, 0x2f, 0x1e,
+ 0xfa, 0x74, 0xb0, 0x67, 0xef, 0x8e, 0xce, 0xdf, 0xb5, 0xb3, 0x05, 0xa8,
+ 0x99, 0x55, 0x18, 0xb4, 0x39, 0x7e, 0x73, 0x10, 0x5f, 0x2f, 0xfd, 0xa2,
+ 0xef, 0xab, 0x90, 0x0d, 0xf4, 0xdd, 0x30, 0xe3, 0xdd, 0xc3, 0x24, 0xdb,
+ 0x8e, 0x7d, 0x6f, 0xfc, 0xa6, 0x87, 0xbe, 0xf4, 0x8b, 0x15, 0xab, 0xfc,
+ 0xf6, 0xe8, 0x24, 0xd2, 0x73, 0xea, 0xfb, 0x77, 0xaf, 0xff, 0xd4, 0x5e,
+ 0xe5, 0xde, 0x93, 0xc8, 0x57, 0x7f, 0x4b, 0x87, 0x7a, 0x56, 0x97, 0x33,
+ 0xa3, 0xb0, 0xa0, 0xde, 0x08, 0xe5, 0x46, 0xfb, 0xe6, 0x0a, 0xa8, 0xfe,
+ 0x3c, 0xa0, 0x3f, 0x7f, 0x1e, 0x8d, 0x46, 0x5f, 0x86, 0x38, 0xfd, 0xf0,
+ 0xce, 0xd8, 0x85, 0xd2, 0x83, 0x94, 0x72, 0xd8, 0xb1, 0xbd, 0x51, 0xd9,
+ 0x85, 0x4a, 0x36, 0x8a, 0x57, 0x2c, 0xd2, 0xbc, 0x42, 0x97, 0xaa, 0xe8,
+ 0x55, 0x4b, 0x8b, 0x71, 0xd5, 0x88, 0x56, 0x8f, 0x13, 0xd4, 0x3a, 0x3e,
+ 0xa8, 0x1b, 0xf5, 0xa6, 0xd4, 0xfe, 0xbb, 0xdb, 0x37, 0x9d, 0x06, 0x2e,
+ 0x10, 0xee, 0x14, 0x44, 0x9f, 0xad, 0xc8, 0x33, 0xcb, 0x56, 0x8e, 0xbb,
+ 0x65, 0x0b, 0xbd, 0x35, 0x64, 0xdd, 0x53, 0x3b, 0xfd, 0xa8, 0xdf, 0x42,
+ 0x6a, 0x79, 0x0f, 0x25, 0x98, 0x0e, 0x17, 0x72, 0x8a, 0x0b, 0x05, 0x8d,
+ 0x8f, 0xb3, 0x66, 0xb2, 0x45, 0xeb, 0xac, 0x5b, 0xba, 0x9f, 0x55, 0xde,
+ 0x02, 0xf7, 0x91, 0x9f, 0xcb, 0x8b, 0x2a, 0x6f, 0x4e, 0x6b, 0xf1, 0xca,
+ 0x66, 0x5c, 0xa1, 0xb9, 0xa7, 0xa3, 0xb3, 0x66, 0x10, 0xca, 0xb1, 0x56,
+ 0x8f, 0x2e, 0xbf, 0x4a, 0x56, 0x9b, 0xaf, 0x04, 0x82, 0xd0, 0x2b, 0xa5,
+ 0x0c, 0x15, 0x7e, 0xc8, 0x65, 0xe5, 0x21, 0x4a, 0xa1, 0x00, 0x1e, 0xfe,
+ 0x65, 0xeb, 0x2e, 0x50, 0xdf, 0x9c, 0xbf, 0xe9, 0x3d, 0xf5, 0xf9, 0x98,
+ 0x00, 0x63, 0xdb, 0xab, 0xf9, 0x4e, 0x2b, 0x0d, 0x6f, 0xc2, 0xaf, 0x6d,
+ 0xaa, 0x06, 0xa0, 0x10, 0xd6, 0xff, 0x75, 0x9d, 0x54, 0x60, 0xbc, 0x1e,
+ 0xc5, 0x5f, 0x50, 0x96, 0x25, 0x93, 0x86, 0x9e, 0x8a, 0x68, 0x0c, 0x96,
+ 0x28, 0x96, 0xf9, 0x6c, 0xf6, 0x99, 0xc7, 0x3c, 0x58, 0xc2, 0x28, 0xf9,
+ 0x21, 0x9f, 0x4d, 0x27, 0x69, 0x85, 0x6c, 0xbb, 0xf0, 0x62, 0x15, 0x36,
+ 0xe1, 0x93, 0x54, 0x97, 0xf8, 0xaa, 0x3b, 0x36, 0xda, 0xde, 0x28, 0xce,
+ 0xf5, 0x91, 0xc2, 0x34, 0xbb, 0x19, 0x14, 0xf6, 0xee, 0x2b, 0x8c, 0x64,
+ 0xf6, 0x51, 0x1a, 0xd3, 0x25, 0xd7, 0xee, 0x29, 0xd3, 0xde, 0x57, 0x8d,
+ 0x40, 0x0c, 0x9f, 0x84, 0x51, 0x94, 0x7c, 0x71, 0xf3, 0x04, 0x8e, 0xab,
+ 0x67, 0x03, 0xfe, 0xd7, 0x33, 0x57, 0x22, 0xe5, 0x99, 0x67, 0x6c, 0xc1,
+ 0xb0, 0xbe, 0x7f, 0x7c, 0xa6, 0x85, 0xd8, 0x5d, 0x69, 0x38, 0xf6, 0x50,
+ 0xf2, 0x79, 0x96, 0x5a, 0x5a, 0x69, 0xde, 0xd1, 0xd9, 0x12, 0x45, 0x8c,
+ 0xe4, 0xfa, 0xf3, 0x45, 0x45, 0xd0, 0x38, 0x4d, 0xfd, 0xf3, 0xaa, 0x9a,
+ 0x77, 0xa3, 0xed, 0x3f, 0x1f, 0x45, 0x1a, 0xc2, 0x47, 0x3f, 0x64, 0x53,
+ 0xd2, 0xdd, 0xd7, 0x08, 0xcc, 0x0c, 0x01, 0x3b, 0xca, 0xf7, 0x71, 0x25,
+ 0xef, 0xd1, 0x0f, 0xbd, 0x78, 0xe0, 0x43, 0xbc, 0xa5, 0x16, 0x9b, 0xf0,
+ 0x56, 0xb9, 0xc2, 0x4e, 0x5f, 0xba, 0xbb, 0x3f, 0x19, 0x6d, 0x3f, 0x3e,
+ 0x8b, 0xde, 0x99, 0xdd, 0x0c, 0x91, 0xc9, 0x3f, 0x01, 0x97, 0x48, 0x72,
+ 0x58, 0xd9, 0xc7, 0x73, 0x2b, 0x7b, 0xb5, 0x10, 0xb4, 0x53, 0x4b, 0x8a,
+ 0x1b, 0x02, 0x90, 0x1b, 0x77, 0x88, 0x20, 0x41, 0xd7, 0x67, 0x40, 0xf9,
+ 0x32, 0xe4, 0xcd, 0x06, 0xf3, 0x72, 0x97, 0x82, 0x2e, 0x82, 0x92, 0xa4,
+ 0xfd, 0x18, 0x9b, 0x95, 0x78, 0x80, 0x75, 0x2a, 0x1e, 0x76, 0xf4, 0x00,
+ 0xf6, 0x12, 0x42, 0x91, 0xf5, 0x2c, 0x9b, 0x5e, 0x19, 0xe5, 0x72, 0x3e,
+ 0xcf, 0xaa, 0x35, 0x92, 0x8d, 0x78, 0x15, 0xdd, 0x1d, 0x5e, 0x71, 0xdc,
+ 0x5d, 0xd1, 0xf6, 0x82, 0x62, 0x7a, 0x19, 0xc9, 0x2b, 0x69, 0xd8, 0xc8,
+ 0xae, 0x14, 0x10, 0xa1, 0x9a, 0x6c, 0x6a, 0x2b, 0x33, 0xcd, 0x4f, 0x72,
+ 0x6a, 0x16, 0xe5, 0x38, 0xc5, 0x14, 0x61, 0xc4, 0x21, 0xb4, 0x4c, 0x39,
+ 0x0a, 0xaf, 0x36, 0x5d, 0x2e, 0x66, 0x0c, 0x06, 0xc7, 0x49, 0x50, 0xde,
+ 0x1c, 0x63, 0xe0, 0x8b, 0xb6, 0xcd, 0x0e, 0xa3, 0x29, 0x90, 0x87, 0x96,
+ 0xaa, 0x5e, 0xe0, 0xab, 0x85, 0x4e, 0xbb, 0x0e, 0x91, 0x3d, 0xa7, 0x4f,
+ 0x5e, 0x64, 0x64, 0x01, 0x93, 0x85, 0x93, 0x18, 0x2d, 0x2f, 0xb8, 0x9f,
+ 0x80, 0xd1, 0x88, 0xea, 0x3e, 0xb3, 0x10, 0x33, 0x57, 0xe2, 0xef, 0x8b,
+ 0x19, 0x21, 0xb6, 0x50, 0xf5, 0x35, 0xd5, 0x28, 0x48, 0x0b, 0x0c, 0x63,
+ 0xef, 0x1b, 0x03, 0x9d, 0x1a, 0x13, 0x28, 0x6c, 0x6b, 0x24, 0xe8, 0xc5,
+ 0x8a, 0x2a, 0xea, 0x53, 0xc2, 0xd0, 0x07, 0xb7, 0xd7, 0xd8, 0xe7, 0x3e,
+ 0x25, 0x36, 0x50, 0x31, 0x37, 0x26, 0x7a, 0x7e, 0x91, 0xcf, 0xa8, 0x01,
+ 0x52, 0x50, 0xc1, 0x87, 0x5d, 0x43, 0xad, 0x48, 0x18, 0x64, 0x99, 0xa5,
+ 0x1f, 0xef, 0xbd, 0xae, 0x73, 0x54, 0xf5, 0x34, 0x23, 0x1f, 0x21, 0xb9,
+ 0x2b, 0x38, 0x5e, 0x01, 0xa7, 0xe7, 0x35, 0x7b, 0x05, 0xa8, 0x2c, 0x17,
+ 0x0d, 0xe8, 0x90, 0x9d, 0x90, 0x4d, 0x63, 0x66, 0xa2, 0xb4, 0x9f, 0x91,
+ 0xaa, 0x64, 0x37, 0x0a, 0x07, 0x7d, 0x1c, 0xc9, 0x03, 0x8a, 0xbf, 0x0e,
+ 0xae, 0xc2, 0x4c, 0xfb, 0x62, 0x89, 0x3f, 0x57, 0xd9, 0x8f, 0x2e, 0x6c,
+ 0x4d, 0x12, 0x14, 0xdf, 0x3a, 0xbb, 0x33, 0xd8, 0xf9, 0x9a, 0x26, 0xf1,
+ 0xc5, 0x6a, 0x0a, 0x99, 0xcb, 0x09, 0x10, 0xff, 0x07, 0x64, 0x8c, 0xc6,
+ 0xe5, 0xb8, 0xb7, 0xa9, 0x0c, 0xcb, 0xf9, 0xed, 0xd2, 0x30, 0x38, 0xe6,
+ 0x3c, 0x56, 0x98, 0x81, 0x6a, 0x99, 0x49, 0x66, 0x6d, 0xea, 0x2f, 0x12,
+ 0x2e, 0xff, 0xff, 0x4a, 0x16, 0xf9, 0x02, 0x89, 0xa2, 0x5f, 0x8a, 0xb7,
+ 0x2b, 0x06, 0x17, 0x89, 0xde, 0x46, 0x5c, 0xe9, 0x68, 0x24, 0xb9, 0xb9,
+ 0xc0, 0x90, 0xa2, 0x5b, 0x16, 0x57, 0x48, 0x10, 0xb9, 0x02, 0x48, 0x39,
+ 0x5b, 0xc4, 0x66, 0x1d, 0x75, 0x26, 0xac, 0x4f, 0xb6, 0x24, 0xcf, 0xb5,
+ 0x33, 0x1c, 0x01, 0x89, 0xe8, 0x44, 0x70, 0xee, 0xca, 0xf9, 0x85, 0x66,
+ 0x98, 0x76, 0xa1, 0x87, 0x06, 0x82, 0xdc, 0x71, 0x2f, 0xa5, 0x64, 0x11,
+ 0xe1, 0x45, 0x67, 0x2c, 0xeb, 0x9e, 0xb0, 0x15, 0xb2, 0xec, 0xf9, 0x4e,
+ 0x1b, 0xf1, 0x8a, 0x65, 0x19, 0xe5, 0x13, 0x56, 0xd9, 0x25, 0x89, 0xa5,
+ 0xae, 0xf2, 0x5b, 0x74, 0xbd, 0xc6, 0xa2, 0xe0, 0x91, 0x3c, 0xe0, 0x1f,
+ 0x13, 0xde, 0x91, 0xaa, 0x6c, 0x47, 0x54, 0x35, 0xfc, 0xee, 0xe8, 0xf5,
+ 0xfb, 0xf1, 0xd1, 0x2b, 0xc0, 0x5b, 0xc7, 0xba, 0x15, 0xe6, 0xe8, 0x0a,
+ 0x84, 0xf8, 0x6a, 0x53, 0xb2, 0x69, 0xac, 0xd2, 0xaf, 0x25, 0xee, 0xb8,
+ 0xcf, 0x79, 0xcd, 0xe0, 0x14, 0x2c, 0x2b, 0x63, 0xf2, 0xa2, 0x4f, 0x72,
+ 0xae, 0xc0, 0xf9, 0xe2, 0x55, 0x4f, 0x33, 0x6a, 0x7d, 0xf9, 0x92, 0x73,
+ 0xf9, 0x02, 0x10, 0x53, 0x34, 0xc9, 0x14, 0x48, 0x3b, 0x23, 0x70, 0xb3,
+ 0x85, 0x9e, 0xa0, 0x74, 0x5e, 0x2e, 0x0b, 0x0e, 0xf0, 0x50, 0xbe, 0xb8,
+ 0x9c, 0x01, 0xc4, 0xd0, 0xf8, 0x44, 0xc3, 0x04, 0x4d, 0x7b, 0xfa, 0x34,
+ 0xc2, 0x75, 0xcd, 0xc7, 0x40, 0xf5, 0x99, 0x2e, 0x51, 0x36, 0xf2, 0xc6,
+ 0xfa, 0x27, 0x24, 0x53, 0x3e, 0xec, 0x59, 0x0b, 0xd9, 0x0d, 0x44, 0x3c,
+ 0x12, 0x7e, 0x3c, 0x15, 0xa3, 0x18, 0x5f, 0x95, 0xe6, 0xb8, 0x5c, 0xcf,
+ 0x2d, 0x34, 0x00, 0x23, 0x28, 0xd5, 0x9b, 0xdd, 0x2b, 0xa8, 0x7b, 0x2d,
+ 0x90, 0x4f, 0x04, 0x79, 0x3c, 0x19, 0x43, 0xa6, 0x90, 0x86, 0xc3, 0x64,
+ 0x82, 0xdb, 0x97, 0x72, 0x1c, 0x58, 0x3d, 0x1f, 0x0b, 0xc8, 0x09, 0x68,
+ 0xc1, 0x14, 0x0c, 0x9d, 0x66, 0xd4, 0xd3, 0xab, 0xeb, 0x94, 0x56, 0x07,
+ 0x84, 0xde, 0x3b, 0x3a, 0x75, 0x9a, 0xf9, 0x3f, 0xb3, 0x57, 0xea, 0xce,
+ 0x6e, 0xec, 0x36, 0x9f, 0xa7, 0x77, 0x70, 0xb4, 0xf7, 0xb2, 0x03, 0xbc,
+ 0x22, 0x4c, 0x10, 0x7a, 0xae, 0x62, 0xfd, 0x15, 0xda, 0xa2, 0x2b, 0x35,
+ 0xe5, 0xf4, 0x4a, 0xbb, 0xd5, 0x22, 0xec, 0x09, 0xcd, 0x31, 0x4c, 0xa0,
+ 0x00, 0x32, 0xa5, 0xcc, 0x19, 0xb1, 0x8e, 0x94, 0x16, 0x49, 0x8e, 0xa8,
+ 0x0d, 0x6e, 0xdb, 0x88, 0x8f, 0x6d, 0xd2, 0x8f, 0x67, 0x25, 0x65, 0x5a,
+ 0xd4, 0x9e, 0x07, 0x3f, 0x02, 0x91, 0x4b, 0x12, 0xa8, 0x22, 0x2e, 0x54,
+ 0xb7, 0x1c, 0x47, 0xb6, 0xd0, 0x28, 0x0e, 0xc5, 0xd9, 0x04, 0x18, 0xca,
+ 0x7e, 0x7c, 0xe9, 0x7e, 0x8a, 0x65, 0xf0, 0x9b, 0x41, 0x26, 0xbe, 0x8e,
+ 0x93, 0xf1, 0x00, 0x83, 0x76, 0x1f, 0x03, 0x99, 0x36, 0xc0, 0x10, 0xb8,
+ 0xf0, 0x12, 0x7d, 0x4a, 0x15, 0x93, 0x26, 0x62, 0x76, 0x72, 0x77, 0x60,
+ 0x12, 0x62, 0xa8, 0x25, 0xa6, 0x15, 0xc1, 0x5d, 0x96, 0x16, 0xfe, 0x64,
+ 0xb1, 0x03, 0x66, 0x90, 0xbc, 0x9c, 0xa2, 0x0a, 0x99, 0xbb, 0xdc, 0xf5,
+ 0xc0, 0xb5, 0xc9, 0x6c, 0xd6, 0x29, 0xde, 0x72, 0x97, 0xcf, 0x97, 0x73,
+ 0xbc, 0x3e, 0x60, 0xb8, 0x81, 0x39, 0x69, 0xe0, 0xba, 0xa9, 0xc8, 0x91,
+ 0x6e, 0x94, 0xa3, 0x62, 0x2e, 0x59, 0x12, 0x6d, 0x60, 0xda, 0x86, 0x75,
+ 0x13, 0x7a, 0x8b, 0x1b, 0x58, 0x61, 0xa3, 0xfe, 0xdb, 0xf9, 0x33, 0x79,
+ 0x69, 0xac, 0xd3, 0x2f, 0x23, 0x38, 0x4b, 0xa9, 0x2f, 0x53, 0x45, 0x7e,
+ 0x80, 0x33, 0xa9, 0x60, 0x23, 0x9b, 0x7a, 0xee, 0x30, 0xe6, 0x38, 0xb2,
+ 0x2a, 0x79, 0x93, 0x7a, 0x25, 0xd4, 0xc0, 0x86, 0xef, 0x84, 0xdd, 0x69,
+ 0xa1, 0x2e, 0x80, 0xc5, 0x0a, 0xb6, 0x30, 0x3d, 0xed, 0x1b, 0x9c, 0x0a,
+ 0xcb, 0x45, 0x60, 0xbf, 0x88, 0xa0, 0x90, 0xfc, 0x0c, 0x7e, 0xdf, 0x7c,
+ 0x7e, 0x5b, 0x72, 0xfb, 0xc4, 0x47, 0x47, 0x71, 0x3f, 0xa1, 0xb2, 0xba,
+ 0xe3, 0xdb, 0x9d, 0xb8, 0x6c, 0x52, 0x03, 0xc4, 0x06, 0x09, 0xb2, 0x8e,
+ 0xb8, 0x64, 0x0b, 0x9b, 0xb1, 0x07, 0xf7, 0x49, 0x9c, 0xf2, 0xde, 0x0d,
+ 0x18, 0x2b, 0x04, 0xe9, 0x9d, 0x4f, 0xee, 0xee, 0x02, 0x0e, 0xf7, 0xdc,
+ 0x7a, 0x8c, 0xef, 0xcc, 0x3e, 0xbf, 0x27, 0xdb, 0x9f, 0xd3, 0x3f, 0x9f,
+ 0xde, 0x75, 0x5c, 0x7f, 0xa3, 0x28, 0x18, 0xb3, 0x83, 0x3c, 0x4d, 0x2f,
+ 0x4a, 0x4e, 0x25, 0x60, 0xa2, 0xa5, 0x11, 0x72, 0xb2, 0x74, 0xb8, 0x4d,
+ 0xd1, 0x95, 0x2f, 0x4c, 0xd0, 0x42, 0x46, 0xb9, 0xa0, 0xb8, 0xb8, 0x64,
+ 0x0f, 0x34, 0x04, 0x36, 0x4a, 0x02, 0x91, 0x52, 0xe9, 0xa4, 0x03, 0x1a,
+ 0xf2, 0x2d, 0x39, 0x88, 0x1c, 0x90, 0x8b, 0xbe, 0xc2, 0xd4, 0xa7, 0x23,
+ 0x65, 0xee, 0xab, 0x7c, 0xc6, 0xda, 0x19, 0x1d, 0xec, 0x3a, 0xd9, 0x31,
+ 0xbb, 0x90, 0x17, 0xcb, 0xc6, 0xa2, 0xe3, 0xe2, 0x9b, 0x16, 0xe6, 0x2d,
+ 0x42, 0xfd, 0x19, 0x0c, 0x02, 0xc5, 0x9b, 0xa1, 0xd3, 0x57, 0x7b, 0x49,
+ 0x0e, 0x7c, 0x4a, 0xd8, 0xbb, 0x20, 0x21, 0xb6, 0xd6, 0x2d, 0x1b, 0x71,
+ 0x78, 0xdb, 0xbe, 0x9e, 0x7a, 0xaf, 0x66, 0x77, 0x86, 0xda, 0x8c, 0x5a,
+ 0xe8, 0x5d, 0x6c, 0xf6, 0x4a, 0x1b, 0x79, 0xdd, 0x91, 0x22, 0xf9, 0x8b,
+ 0x2d, 0x21, 0x6e, 0x1b, 0x64, 0x42, 0xce, 0x95, 0x8d, 0x1c, 0x49, 0xdb,
+ 0xda, 0x94, 0x2d, 0xd0, 0xf8, 0xd1, 0xe6, 0xf6, 0xa4, 0x82, 0x0f, 0xf7,
+ 0xec, 0x99, 0xc5, 0xde, 0xe0, 0x5c, 0x74, 0xa3, 0xd1, 0x6b, 0x5a, 0x2f,
+ 0x33, 0x36, 0xac, 0xbd, 0xe1, 0x01, 0xe5, 0xbd, 0xec, 0xc7, 0x14, 0x34,
+ 0x61, 0x21, 0x6d, 0x03, 0x61, 0x64, 0x2f, 0x84, 0x01, 0xc2, 0x8e, 0x99,
+ 0x36, 0xc0, 0xa0, 0xd6, 0x18, 0x7c, 0x54, 0x6d, 0x1c, 0x11, 0x1e, 0xa9,
+ 0xec, 0x2e, 0x94, 0xcc, 0x31, 0x55, 0xe7, 0x9f, 0x28, 0x8e, 0xea, 0x94,
+ 0xe0, 0x9e, 0x97, 0xcd, 0xf5, 0xdf, 0xf2, 0x69, 0xf2, 0x52, 0x51, 0xc2,
+ 0xe3, 0xa0, 0x49, 0x74, 0x2c, 0xcc, 0x93, 0x66, 0xff, 0x6a, 0x56, 0x70,
+ 0xf5, 0xf1, 0x64, 0x43, 0x46, 0x30, 0xf6, 0xe6, 0x74, 0x89, 0x08, 0xc3,
+ 0xf8, 0x60, 0x7c, 0x92, 0x9c, 0x9d, 0x1c, 0x1c, 0xbf, 0x35, 0xef, 0x0c,
+ 0x43, 0xdf, 0x9b, 0xc5, 0x0a, 0x05, 0xd2, 0x54, 0xa0, 0x93, 0x76, 0xf0,
+ 0x44, 0xdb, 0x1f, 0x0a, 0xe1, 0x04, 0xa7, 0xb8, 0x57, 0x5b, 0xc5, 0x54,
+ 0xc3, 0xa5, 0xa6, 0x70, 0xf6, 0x25, 0x2f, 0x5a, 0xea, 0x6a, 0xde, 0x9f,
+ 0x24, 0xd6, 0x7b, 0x99, 0x13, 0x72, 0x2c, 0xcd, 0x0d, 0x76, 0xa3, 0xd9,
+ 0x30, 0xb1, 0xd5, 0x10, 0xed, 0x5c, 0x46, 0x0a, 0x26, 0x6f, 0xe6, 0xc4,
+ 0xcd, 0x29, 0x0d, 0x87, 0x78, 0x63, 0x03, 0x59, 0xb5, 0x93, 0xb8, 0x1f,
+ 0x4d, 0xed, 0x4c, 0x90, 0x9f, 0x4e, 0xc9, 0xee, 0x42, 0x25, 0xb9, 0x6e,
+ 0xbd, 0x22, 0x23, 0xa9, 0x56, 0xb7, 0xbe, 0x27, 0xd4, 0xb6, 0xae, 0xd7,
+ 0xc1, 0x65, 0x7d, 0x51, 0xde, 0x0d, 0xd4, 0x04, 0xc3, 0x12, 0x50, 0x03,
+ 0xeb, 0x92, 0xb6, 0xae, 0x8c, 0x64, 0x03, 0x0a, 0xa4, 0x54, 0xbf, 0x97,
+ 0x0c, 0x90, 0x4f, 0xb8, 0xf7, 0x61, 0x05, 0xd4, 0xdc, 0xa8, 0xba, 0x66,
+ 0x40, 0x3f, 0xd6, 0xb3, 0x8a, 0xdd, 0xe8, 0xc0, 0x05, 0xec, 0x96, 0x77,
+ 0xd5, 0x9d, 0x23, 0x94, 0x0d, 0xd8, 0xa4, 0x5f, 0x2b, 0xa8, 0xcd, 0x10,
+ 0xe0, 0xa3, 0x36, 0x37, 0xac, 0xec, 0x7d, 0xd2, 0xb1, 0x87, 0x3e, 0x15,
+ 0x40, 0x3b, 0x37, 0xcc, 0xe8, 0xeb, 0x30, 0x5d, 0xef, 0xe3, 0xe3, 0xae,
+ 0x0d, 0x44, 0x30, 0x15, 0x86, 0xd4, 0x44, 0x71, 0x26, 0x37, 0x02, 0x4f,
+ 0x62, 0xfe, 0x13, 0x3c, 0xb3, 0x25, 0xb9, 0xbe, 0x0f, 0xa5, 0xcc, 0x31,
+ 0xea, 0xbb, 0xae, 0x7c, 0x4c, 0xdc, 0x5f, 0x5f, 0x97, 0xb7, 0xc3, 0x18,
+ 0x82, 0xa4, 0x4d, 0x38, 0x11, 0x93, 0xab, 0xc6, 0xd3, 0x94, 0xf9, 0xdb,
+ 0x08, 0xa7, 0xd9, 0x2b, 0x9d, 0xc6, 0x70, 0x09, 0xb4, 0xd4, 0x7b, 0x28,
+ 0xec, 0x54, 0xc4, 0x39, 0x55, 0x97, 0xd1, 0x6e, 0xe4, 0x5e, 0x73, 0x8c,
+ 0xa2, 0x24, 0xf4, 0xa7, 0x2b, 0xa0, 0x46, 0xcd, 0xb3, 0xa6, 0x95, 0x45,
+ 0xed, 0xcd, 0x20, 0x10, 0xe0, 0x33, 0xa9, 0x31, 0xf8, 0xeb, 0x32, 0xcf,
+ 0x50, 0xe2, 0x9b, 0x91, 0xd3, 0x09, 0xa7, 0x56, 0x1a, 0x80, 0x63, 0xcc,
+ 0x04, 0x63, 0x72, 0xe5, 0x99, 0x34, 0x83, 0x37, 0xd3, 0x0d, 0x04, 0xb8,
+ 0x99, 0x3e, 0x5d, 0x6d, 0x30, 0x08, 0xcd, 0xe9, 0x39, 0xa4, 0x45, 0xce,
+ 0xcd, 0xd5, 0x09, 0xf7, 0xbe, 0x07, 0x84, 0xab, 0xd9, 0x84, 0x5a, 0xe2,
+ 0x87, 0x2a, 0x96, 0xfa, 0x63, 0x58, 0xc2, 0x37, 0x68, 0x35, 0x50, 0x85,
+ 0x43, 0x59, 0xa4, 0x58, 0x43, 0xdd, 0x77, 0x8b, 0x74, 0xb6, 0x55, 0x37,
+ 0x53, 0x52, 0x27, 0x96, 0xc5, 0x8c, 0xe6, 0x49, 0x23, 0xf5, 0xb4, 0xf3,
+ 0x8e, 0x00, 0x46, 0xbe, 0x47, 0x24, 0x75, 0x8c, 0x48, 0xaa, 0xdb, 0x50,
+ 0xee, 0xa1, 0x64, 0xc5, 0xa6, 0x34, 0xd5, 0xf2, 0x92, 0xcb, 0x6d, 0x72,
+ 0x67, 0x88, 0x5e, 0xe9, 0x53, 0x8b, 0x44, 0x14, 0xaf, 0x17, 0xb4, 0x6c,
+ 0xed, 0xf2, 0xaa, 0xcd, 0xbc, 0xa1, 0xfd, 0x32, 0x6c, 0x79, 0x51, 0xd6,
+ 0x48, 0xd1, 0x37, 0x2b, 0x34, 0xef, 0x4a, 0xbf, 0x93, 0x55, 0x1b, 0x3d,
+ 0x64, 0x00, 0xd9, 0x5f, 0x88, 0xd1, 0x07, 0xac, 0xd8, 0x27, 0x1e, 0x42,
+ 0x5f, 0xd3, 0x89, 0xfd, 0xf8, 0x78, 0xa4, 0xc3, 0xb0, 0x9c, 0xeb, 0x97,
+ 0xc2, 0xf3, 0xf9, 0xcd, 0x9b, 0x1c, 0x02, 0x29, 0x79, 0x80, 0x6d, 0xa5,
+ 0x84, 0xa4, 0x3f, 0xb7, 0x80, 0xea, 0x04, 0x4f, 0x39, 0xe2, 0x72, 0x32,
+ 0x1c, 0xb6, 0x14, 0x64, 0xaf, 0xc9, 0xcc, 0xa8, 0x54, 0x11, 0x17, 0xf5,
+ 0x58, 0x60, 0x5d, 0x09, 0xc4, 0x76, 0xd0, 0x55, 0x00, 0xea, 0x25, 0xe9,
+ 0xf9, 0xb3, 0x25, 0x7d, 0xd9, 0x79, 0x91, 0x80, 0x3f, 0xaa, 0x80, 0x44,
+ 0x51, 0xcc, 0x5e, 0x0b, 0x20, 0x4a, 0xc7, 0xdc, 0x83, 0x2f, 0x56, 0x44,
+ 0x7e, 0x8b, 0xec, 0xdb, 0x45, 0x78, 0x1c, 0xf5, 0xcc, 0x8e, 0x7c, 0x2f,
+ 0x3c, 0x4c, 0x26, 0xf0, 0xe8, 0x9e, 0xcb, 0x9e, 0x4a, 0x5f, 0x75, 0x3a,
+ 0x82, 0xef, 0x2b, 0x88, 0x78, 0x31, 0x4c, 0x56, 0x9b, 0x46, 0xd6, 0x9a,
+ 0x99, 0x6a, 0x3b, 0x0a, 0xfe, 0x83, 0x5a, 0x34, 0xc6, 0xf0, 0xd5, 0xfd,
+ 0x4f, 0x8e, 0x8b, 0x20, 0x47, 0x82, 0x1c, 0xd6, 0xdc, 0x04, 0x18, 0x62,
+ 0x8b, 0x95, 0x73, 0x29, 0xac, 0xad, 0xf5, 0x40, 0xb6, 0xa6, 0xa4, 0xaa,
+ 0x79, 0xa4, 0xaa, 0x89, 0x5f, 0xda, 0x50, 0x88, 0x3d, 0xbc, 0xb6, 0xd9,
+ 0xca, 0x25, 0x28, 0x5b, 0x4d, 0x24, 0xfe, 0xa9, 0x1a, 0xdc, 0xd3, 0x76,
+ 0xff, 0x5b, 0x01, 0x64, 0xfe, 0x55, 0x07, 0x2a, 0x7d, 0xdc, 0x89, 0xea,
+ 0xa9, 0x40, 0xfc, 0x7f, 0xf3, 0x44, 0xa5, 0xc9, 0xe3, 0xce, 0x54, 0xda,
+ 0x3d, 0x54, 0xa1, 0x58, 0xba, 0xeb, 0x9d, 0xf1, 0x6f, 0x78, 0xca, 0xf8,
+ 0x98, 0xfd, 0xa2, 0x73, 0xa6, 0x4c, 0xf1, 0xff, 0xf2, 0x29, 0xfb, 0xbc,
+ 0xa3, 0x48, 0x02, 0xdd, 0x7c, 0x45, 0x9b, 0x69, 0x3f, 0x9f, 0x95, 0x14,
+ 0x6c, 0x52, 0xd7, 0xb6, 0x2c, 0x10, 0x71, 0xbc, 0xd7, 0x34, 0x03, 0x67,
+ 0x46, 0x92, 0x3a, 0x10, 0xcf, 0x00, 0x3d, 0x9e, 0x5a, 0x99, 0xa7, 0xf8,
+ 0x36, 0x2b, 0x07, 0x0e, 0x5d, 0xc1, 0xda, 0xdf, 0x01, 0x18, 0x17, 0xb6,
+ 0x2d, 0x79, 0x22, 0x2d, 0xd0, 0x64, 0x59, 0x57, 0xe6, 0xbe, 0x5f, 0xe4,
+ 0x48, 0x30, 0x2e, 0x09, 0x36, 0xe3, 0x9b, 0xf1, 0x78, 0x78, 0x70, 0x76,
+ 0xfc, 0x80, 0xe9, 0x06, 0x54, 0x37, 0x37, 0xc9, 0x98, 0xf5, 0xdd, 0x9f,
+ 0x9a, 0xda, 0xfe, 0xb4, 0xd1, 0x95, 0xbb, 0x64, 0x3d, 0xa8, 0x5b, 0x95,
+ 0x17, 0x3a, 0x25, 0xdb, 0x2f, 0x8b, 0xf4, 0x75, 0x6d, 0x99, 0x80, 0xea,
+ 0x27, 0xf2, 0xfc, 0x20, 0x1c, 0x86, 0x27, 0x82, 0x68, 0x1f, 0xf0, 0xf1,
+ 0x00, 0x6e, 0x97, 0xec, 0xbc, 0x78, 0xb6, 0x63, 0x8e, 0xc5, 0x3d, 0xc7,
+ 0x0d, 0xe5, 0xfd, 0x27, 0xa3, 0xbd, 0xad, 0x27, 0xa3, 0x27, 0x24, 0xd5,
+ 0x5c, 0x22, 0x89, 0x8c, 0x1f, 0x0f, 0xc1, 0xd1, 0xb4, 0xde, 0x1e, 0x1d,
+ 0x26, 0x9c, 0xcc, 0x0f, 0x08, 0xdf, 0x8e, 0xd9, 0xc6, 0x39, 0xbf, 0x88,
+ 0x37, 0x8d, 0xd4, 0xe9, 0xcc, 0xcc, 0x1a, 0xb8, 0x3c, 0x02, 0x72, 0x24,
+ 0x6a, 0x8e, 0x00, 0x01, 0xa9, 0xb0, 0x33, 0x21, 0x79, 0xc7, 0x96, 0x89,
+ 0x50, 0xc6, 0xfc, 0x26, 0xac, 0xca, 0xf5, 0x68, 0xe2, 0x51, 0xec, 0x81,
+ 0x92, 0x9b, 0x27, 0xfd, 0xfb, 0xa3, 0x16, 0x50, 0x8f, 0x0d, 0xe5, 0xe2,
+ 0x00, 0x81, 0xa9, 0x24, 0xf2, 0xd0, 0xda, 0xb5, 0x75, 0x52, 0x4d, 0xe6,
+ 0xd6, 0xaa, 0xb9, 0xfc, 0xeb, 0xb4, 0x18, 0xfd, 0x52, 0x93, 0x2c, 0xa2,
+ 0x25, 0xb7, 0x2d, 0x2f, 0x9e, 0xbb, 0x08, 0x6a, 0xb1, 0xb8, 0xfa, 0x56,
+ 0xc4, 0x56, 0x56, 0xd7, 0xdf, 0x06, 0x06, 0xa0, 0xb3, 0xcc, 0x36, 0x98,
+ 0x37, 0x90, 0x1d, 0x7d, 0xd5, 0xe0, 0x11, 0x9b, 0xde, 0x7d, 0x6b, 0xab,
+ 0xca, 0xd2, 0x99, 0xbc, 0x28, 0xd6, 0x1f, 0xe2, 0xfb, 0xc1, 0x2f, 0x2f,
+ 0xd1, 0x1c, 0xb6, 0x0e, 0xe0, 0x55, 0xb9, 0x3f, 0x89, 0xc5, 0x1b, 0xe6,
+ 0xa7, 0x6d, 0xea, 0xaa, 0xeb, 0xc3, 0xb6, 0xa8, 0xcc, 0x75, 0x92, 0x2f,
+ 0x8c, 0x28, 0x7c, 0x44, 0xbd, 0x55, 0xff, 0xe6, 0x3f, 0x28, 0xef, 0x9c,
+ 0xb8, 0x88, 0x76, 0x92, 0x66, 0x70, 0x13, 0x41, 0xb1, 0x0a, 0x6e, 0x55,
+ 0x91, 0x20, 0x2d, 0x39, 0xd7, 0x33, 0x20, 0xc1, 0xc9, 0x88, 0x38, 0x73,
+ 0x19, 0x0f, 0xdd, 0xa4, 0x42, 0x63, 0x8c, 0x2a, 0x9a, 0x31, 0xb9, 0xf7,
+ 0x5c, 0x64, 0x4e, 0x07, 0x15, 0x18, 0x80, 0xcd, 0x91, 0xda, 0x56, 0xab,
+ 0x84, 0xbb, 0x15, 0x89, 0x0f, 0x8a, 0xde, 0xdf, 0x42, 0x18, 0x92, 0x0a,
+ 0xc7, 0xae, 0x8a, 0x07, 0x94, 0xb9, 0xa0, 0xf3, 0xa2, 0x7f, 0x59, 0x24,
+ 0x1b, 0xc8, 0x91, 0xcb, 0x7c, 0x48, 0x6a, 0xcd, 0xb9, 0x0a, 0xfd, 0x4d,
+ 0x36, 0x9f, 0x66, 0xf3, 0x41, 0xc3, 0xca, 0xaa, 0x7d, 0x09, 0x57, 0xd7,
+ 0x40, 0xf1, 0x0b, 0xe4, 0xec, 0xff, 0x13, 0x6a, 0xe0, 0xd3, 0xc4, 0xee,
+ 0xd5, 0x63, 0xb4, 0x41, 0xee, 0x8b, 0x02, 0x6d, 0x30, 0xf0, 0x5e, 0x7a,
+ 0x26, 0xd7, 0xff, 0xaf, 0x0d, 0xfe, 0x9f, 0xa4, 0x0d, 0xfe, 0xe2, 0x53,
+ 0xda, 0x3a, 0xa4, 0x43, 0xa9, 0xf6, 0xb0, 0xe7, 0xd2, 0x9d, 0xc4, 0x78,
+ 0x11, 0xd6, 0xec, 0xfe, 0x91, 0x07, 0xb4, 0x7b, 0x42, 0x93, 0x90, 0x15,
+ 0xfe, 0xdf, 0x38, 0xa2, 0x8f, 0x3a, 0x99, 0xff, 0xbf, 0xef, 0xe3, 0x7f,
+ 0xb7, 0x73, 0xd8, 0xaf, 0x0d, 0x6e, 0x18, 0x26, 0xbb, 0xa5, 0x34, 0x3f,
+ 0xee, 0x54, 0x0a, 0x3b, 0x7b, 0xd3, 0x69, 0x3e, 0x54, 0xa1, 0xcc, 0xb4,
+ 0x3b, 0x3e, 0xfb, 0xfe, 0xd9, 0x00, 0xd1, 0xe2, 0x71, 0x37, 0x35, 0xa6,
+ 0x4a, 0x4e, 0x5e, 0x1d, 0x9c, 0xfd, 0x82, 0xd3, 0xfe, 0x27, 0xf8, 0x37,
+ 0x17, 0x59, 0x36, 0x1d, 0x72, 0x14, 0xf2, 0x25, 0xfe, 0x11, 0x09, 0xdf,
+ 0xa7, 0x16, 0x71, 0x08, 0x6c, 0x4b, 0xc1, 0xc9, 0x30, 0x29, 0x02, 0x2f,
+ 0x1b, 0x35, 0xa5, 0x10, 0x1c, 0x30, 0xca, 0xc1, 0xad, 0x43, 0x1f, 0x4b,
+ 0x59, 0x4c, 0x37, 0xb9, 0x00, 0x1a, 0x5f, 0x06, 0xab, 0x48, 0x2e, 0x0b,
+ 0x9d, 0xef, 0x2b, 0x82, 0xbd, 0xb4, 0xb0, 0xdf, 0xde, 0x33, 0x38, 0xf8,
+ 0x61, 0x0f, 0x24, 0x3e, 0x04, 0xf7, 0x6e, 0x29, 0x1c, 0x40, 0x65, 0x98,
+ 0xd4, 0xbd, 0x6d, 0x72, 0xe1, 0x43, 0x8a, 0x64, 0xcd, 0x27, 0x44, 0x20,
+ 0xea, 0x7e, 0xbe, 0x2f, 0x39, 0x67, 0x25, 0x29, 0xfd, 0x9d, 0x68, 0x51,
+ 0x90, 0xe2, 0xed, 0x1c, 0x7d, 0xec, 0xca, 0x20, 0x9f, 0x3e, 0x9c, 0x8e,
+ 0xc2, 0xf3, 0xb5, 0x9f, 0x68, 0x53, 0xf3, 0xf8, 0xd2, 0x7f, 0x21, 0xb0,
+ 0xa8, 0xb9, 0x50, 0x57, 0x33, 0xb9, 0x24, 0x73, 0xcb, 0x9f, 0x95, 0x84,
+ 0x0d, 0xa9, 0xbb, 0x95, 0xba, 0xfc, 0x5d, 0xad, 0xd5, 0x9f, 0xc2, 0x3c,
+ 0x73, 0xef, 0xdd, 0xd5, 0xc9, 0xd1, 0x65, 0xd1, 0x54, 0xd4, 0x1e, 0xcc,
+ 0x4b, 0x24, 0xc5, 0x41, 0x5e, 0xd6, 0x5e, 0xf5, 0x18, 0xf5, 0x0f, 0xb8,
+ 0x44, 0x1b, 0x41, 0xa2, 0x5a, 0xd8, 0x2c, 0x9b, 0xcf, 0x77, 0x92, 0x35,
+ 0x93, 0x91, 0xdb, 0x5b, 0x60, 0xe5, 0x9a, 0x5f, 0x4e, 0x8c, 0x92, 0x0b,
+ 0xae, 0x33, 0x12, 0x76, 0x90, 0x70, 0xba, 0x08, 0x99, 0x3c, 0x3d, 0xbe,
+ 0x0a, 0xcd, 0xab, 0xf9, 0xf4, 0xcd, 0x55, 0x57, 0x77, 0x2f, 0x0e, 0x61,
+ 0x75, 0xd4, 0x3c, 0xb1, 0x62, 0x21, 0x35, 0xe2, 0x0c, 0x80, 0x34, 0x86,
+ 0x53, 0x0c, 0x93, 0x34, 0xf7, 0x94, 0x94, 0x7b, 0x2b, 0x35, 0xc2, 0x5d,
+ 0x79, 0x3f, 0x3e, 0xd9, 0xe3, 0x5a, 0x88, 0xf3, 0x93, 0xb1, 0xdf, 0xfd,
+ 0xa6, 0x46, 0x68, 0x1f, 0x45, 0xe1, 0x5f, 0x1f, 0x1d, 0x8c, 0xcf, 0x47,
+ 0x91, 0x35, 0x86, 0xe9, 0x57, 0x0e, 0x25, 0x82, 0xc0, 0x1e, 0x67, 0xe9,
+ 0x3d, 0xc1, 0x34, 0x4b, 0xa9, 0x39, 0xcd, 0x8d, 0xa7, 0xa6, 0x63, 0x93,
+ 0x99, 0xcb, 0x45, 0x71, 0x48, 0xe0, 0x0b, 0x13, 0x9c, 0x0c, 0xed, 0x24,
+ 0x05, 0xd9, 0xa6, 0x3f, 0x83, 0xb5, 0x80, 0x5c, 0x52, 0xce, 0x28, 0x2d,
+ 0x81, 0xbe, 0xd3, 0xf6, 0x44, 0x50, 0xa9, 0x86, 0xc0, 0xb9, 0xf4, 0x83,
+ 0x33, 0x18, 0xbd, 0xa3, 0xa4, 0xe6, 0x8d, 0x76, 0xae, 0x4a, 0x2b, 0x0e,
+ 0x5c, 0x7b, 0xfd, 0x76, 0x09, 0xf3, 0x8d, 0x80, 0xad, 0xc2, 0x42, 0x98,
+ 0xb4, 0xfe, 0xa8, 0xc1, 0x61, 0x74, 0x05, 0xa7, 0xb8, 0xf3, 0xca, 0x6c,
+ 0xfc, 0xae, 0x25, 0x64, 0x36, 0x1a, 0x38, 0x21, 0x54, 0x31, 0x1a, 0x14,
+ 0x8c, 0x91, 0x03, 0xa0, 0xc8, 0x66, 0x9b, 0x2b, 0x76, 0x5c, 0xd3, 0x50,
+ 0xfc, 0xae, 0xe5, 0x34, 0x5a, 0xbc, 0x53, 0x6a, 0x32, 0xb9, 0xce, 0xcc,
+ 0x2d, 0x32, 0xf2, 0xd0, 0x6e, 0x1e, 0x4d, 0x90, 0xcf, 0x02, 0x48, 0xd4,
+ 0x08, 0x79, 0x7e, 0x31, 0x41, 0x9e, 0x3c, 0x09, 0x09, 0x52, 0x65, 0x7f,
+ 0x9d, 0xc6, 0x3a, 0x99, 0xa0, 0x2e, 0x0f, 0x25, 0x81, 0x5c, 0x4a, 0xf7,
+ 0x8e, 0xdb, 0xb1, 0xd0, 0x54, 0xb7, 0xa8, 0x21, 0xa1, 0x56, 0x18, 0x39,
+ 0x80, 0x51, 0x32, 0xb0, 0x29, 0x2a, 0x19, 0xdc, 0xfa, 0x16, 0xde, 0xd9,
+ 0x6b, 0x9e, 0x9d, 0xc7, 0x21, 0x92, 0xa4, 0xee, 0x43, 0x3e, 0xb2, 0x52,
+ 0x64, 0x51, 0x62, 0x0c, 0xda, 0xda, 0x51, 0xd9, 0xbd, 0x3d, 0x3b, 0xc3,
+ 0xe1, 0x65, 0xb3, 0xb0, 0x0b, 0x5b, 0xc9, 0x1d, 0xdb, 0x31, 0x62, 0x10,
+ 0x6b, 0x18, 0x39, 0x50, 0x37, 0x54, 0x26, 0x6a, 0xa6, 0xf2, 0x6b, 0xd8,
+ 0x44, 0x5a, 0x24, 0xfa, 0x5c, 0xf2, 0x30, 0x9b, 0x48, 0x52, 0x0f, 0x65,
+ 0xe8, 0x4b, 0xce, 0xef, 0x74, 0x89, 0xf4, 0xa4, 0x79, 0x8e, 0x66, 0x3b,
+ 0x5b, 0xe5, 0xe5, 0x25, 0x0a, 0x97, 0x0d, 0x13, 0x36, 0x55, 0x6e, 0x14,
+ 0xfc, 0xd0, 0xd5, 0x07, 0x4c, 0x6f, 0x57, 0xfc, 0xc5, 0xdf, 0x74, 0xdf,
+ 0xe0, 0xd2, 0xd0, 0x95, 0x39, 0xdf, 0x21, 0x4d, 0x7a, 0xd8, 0xe1, 0xbc,
+ 0xba, 0x57, 0x17, 0xcd, 0x4a, 0x8e, 0x08, 0xf3, 0x59, 0xa9, 0x8b, 0x60,
+ 0x2d, 0xfe, 0x1a, 0xe0, 0x5b, 0x82, 0xf1, 0x1f, 0xcf, 0x1c, 0xa1, 0x40,
+ 0x05, 0xab, 0xb4, 0xd2, 0x01, 0x94, 0x07, 0xe4, 0x5a, 0x93, 0xd8, 0xb1,
+ 0x72, 0x05, 0x66, 0x2a, 0xe5, 0x6f, 0x81, 0x04, 0x2c, 0x9a, 0x64, 0x66,
+ 0x2e, 0x91, 0x19, 0x80, 0x40, 0xb2, 0x62, 0x52, 0xdd, 0x2f, 0xfc, 0x76,
+ 0x44, 0xd3, 0x07, 0xac, 0x9a, 0x07, 0xb8, 0xb2, 0x55, 0x43, 0xba, 0x63,
+ 0xe4, 0xff, 0x66, 0xa8, 0x93, 0xa6, 0x7a, 0xe9, 0xb1, 0xc1, 0x06, 0x63,
+ 0xa4, 0xf1, 0x0b, 0xcb, 0xc8, 0xb8, 0xd3, 0xcb, 0x8c, 0x8b, 0x28, 0x14,
+ 0x91, 0xe7, 0x32, 0x74, 0xaa, 0x13, 0x69, 0x6d, 0xdd, 0xd8, 0xa3, 0x4f,
+ 0xc3, 0xee, 0x80, 0xe9, 0x75, 0xb3, 0x1b, 0x1c, 0x80, 0xf1, 0xc9, 0x26,
+ 0x4a, 0x57, 0xa8, 0x98, 0xa7, 0xe5, 0xaa, 0x23, 0x21, 0xa6, 0x2d, 0x57,
+ 0x77, 0x99, 0x9d, 0xad, 0x7f, 0x58, 0xab, 0xb7, 0xd2, 0x20, 0x49, 0x0d,
+ 0x08, 0x22, 0x2c, 0xff, 0x18, 0xc9, 0x61, 0x6c, 0xee, 0x1a, 0xce, 0x1c,
+ 0x55, 0x5f, 0x9b, 0xb4, 0x88, 0xb7, 0x00, 0x19, 0xe6, 0xe9, 0x9b, 0xdd,
+ 0xa4, 0xaf, 0xb5, 0xce, 0x48, 0x7e, 0x0f, 0xb0, 0x93, 0x69, 0x86, 0xee,
+ 0x34, 0x8a, 0xb9, 0x4c, 0x95, 0xbe, 0xcc, 0x6d, 0xc8, 0x9c, 0x26, 0x8f,
+ 0xfd, 0xb3, 0x9d, 0xe7, 0xcf, 0x36, 0xa3, 0xd9, 0x08, 0xcc, 0x4c, 0x54,
+ 0x02, 0xdf, 0x34, 0x0b, 0x82, 0x71, 0x10, 0x36, 0xa2, 0x7f, 0xee, 0x8e,
+ 0x7c, 0x1a, 0x85, 0xdd, 0xda, 0xba, 0xd7, 0x74, 0x31, 0x25, 0x86, 0x20,
+ 0x32, 0x68, 0xff, 0x2a, 0x62, 0x14, 0x5e, 0x18, 0x59, 0x77, 0x22, 0xf7,
+ 0xc0, 0xc8, 0xa1, 0x99, 0x1c, 0xf4, 0xd6, 0x81, 0xd9, 0x3c, 0xdc, 0xd3,
+ 0x09, 0xec, 0xf1, 0xcc, 0xbc, 0x86, 0xe3, 0x3c, 0x53, 0xfc, 0x7d, 0xd4,
+ 0xfe, 0x97, 0x1f, 0xe0, 0x75, 0x03, 0xfc, 0xba, 0x5d, 0xde, 0xfb, 0xd4,
+ 0xbb, 0xbc, 0xf7, 0xc0, 0x2e, 0xef, 0x3d, 0x76, 0x97, 0x9f, 0x3f, 0x7d,
+ 0xf6, 0xf9, 0xaf, 0xdb, 0x65, 0x8f, 0xc8, 0xff, 0x3d, 0xbb, 0xec, 0xb1,
+ 0xd9, 0xaf, 0xdb, 0x65, 0x49, 0xa0, 0x09, 0x6a, 0x0f, 0xa5, 0xb2, 0x08,
+ 0xb9, 0xc3, 0x54, 0x3a, 0xc5, 0x39, 0xdf, 0x92, 0x6d, 0x13, 0x94, 0xe5,
+ 0x4a, 0x3f, 0x6d, 0xee, 0xe3, 0x6b, 0x54, 0xd3, 0x88, 0xe3, 0xc1, 0x41,
+ 0x50, 0x41, 0xe7, 0x5f, 0xcc, 0xa8, 0x1b, 0xec, 0xfa, 0x70, 0x5d, 0xc3,
+ 0xf9, 0x5a, 0x66, 0xef, 0xd5, 0x69, 0x71, 0xf6, 0xd2, 0x3f, 0x11, 0x7d,
+ 0xd3, 0x4f, 0x2e, 0x62, 0x8a, 0x79, 0xe9, 0x61, 0x6d, 0xa2, 0xdd, 0x9b,
+ 0x4b, 0x78, 0x18, 0xad, 0xcc, 0xe2, 0xa4, 0xc2, 0x5a, 0x33, 0x32, 0x19,
+ 0x00, 0x50, 0x3d, 0x57, 0x17, 0x46, 0x4f, 0x36, 0x57, 0x40, 0x41, 0xc9,
+ 0x4f, 0xf7, 0xb3, 0x4c, 0x2e, 0x76, 0x5a, 0x33, 0xe2, 0x14, 0xe4, 0xde,
+ 0xe8, 0xba, 0xc9, 0xa5, 0xfb, 0xa1, 0x64, 0x5a, 0xb9, 0xe4, 0xae, 0x91,
+ 0x84, 0x52, 0x8d, 0xd2, 0xda, 0x9a, 0x0e, 0x28, 0x67, 0x0e, 0x0a, 0xc7,
+ 0x62, 0xe6, 0x11, 0x50, 0xb8, 0x55, 0x79, 0x93, 0xdd, 0x3c, 0xc6, 0x9e,
+ 0x6e, 0x8b, 0xb1, 0xbc, 0xbe, 0xa0, 0xf1, 0xa6, 0xdd, 0x1a, 0x46, 0xe4,
+ 0xb4, 0xad, 0x20, 0x6d, 0x01, 0x08, 0x7c, 0x06, 0x54, 0xfd, 0x11, 0x00,
+ 0x56, 0x00, 0xae, 0x48, 0xd6, 0xa3, 0x1d, 0x43, 0xbd, 0xd7, 0xdb, 0xd9,
+ 0xd0, 0xf5, 0x03, 0x55, 0x49, 0x94, 0xd9, 0xdf, 0x78, 0x8d, 0xbe, 0xc5,
+ 0x22, 0x7e, 0x45, 0xd3, 0x9d, 0x2e, 0xe7, 0x0b, 0x85, 0xcc, 0xa5, 0x02,
+ 0xb2, 0x1c, 0xf9, 0x6e, 0x8a, 0x9b, 0xd3, 0x5f, 0xc9, 0xa7, 0xf5, 0x64,
+ 0x36, 0x15, 0x90, 0xfd, 0x78, 0xba, 0x5b, 0x02, 0x01, 0xa5, 0xb5, 0x8f,
+ 0xc7, 0x8d, 0xc3, 0xea, 0x0c, 0xd2, 0x31, 0xe8, 0x9c, 0xa1, 0xbb, 0xc6,
+ 0xc5, 0xf2, 0x4a, 0x91, 0x67, 0x6c, 0x25, 0x6c, 0x9b, 0x27, 0x51, 0xe2,
+ 0x46, 0x58, 0x74, 0x84, 0x2a, 0x07, 0xa4, 0xfb, 0xe2, 0x3e, 0x04, 0xe1,
+ 0x6a, 0xa8, 0x5f, 0xf5, 0x64, 0x55, 0x16, 0x5d, 0x77, 0xe9, 0x03, 0x2c,
+ 0xdc, 0xad, 0x1b, 0xbc, 0xdf, 0xdd, 0x4e, 0x9f, 0x2f, 0x9a, 0xc9, 0x62,
+ 0x78, 0x99, 0x12, 0x5e, 0x75, 0x80, 0x36, 0x22, 0x49, 0xb5, 0xc2, 0xf0,
+ 0xe7, 0x87, 0x67, 0xc9, 0xeb, 0x54, 0xba, 0x25, 0x26, 0x1b, 0x46, 0xdc,
+ 0x3e, 0x7f, 0xb2, 0xb3, 0xb7, 0xb9, 0xd2, 0x10, 0x69, 0x63, 0x30, 0xe2,
+ 0x5b, 0x45, 0x19, 0xcb, 0xff, 0x3f, 0x5f, 0x56, 0x24, 0x1e, 0x99, 0xd6,
+ 0xe6, 0x4b, 0x1f, 0xde, 0x9e, 0xbe, 0x3a, 0x3a, 0x39, 0xf8, 0x93, 0x85,
+ 0x12, 0x1a, 0xfb, 0xbd, 0x4f, 0x8c, 0xfd, 0x7e, 0xff, 0xa1, 0xce, 0xcc,
+ 0x9c, 0x9b, 0x78, 0xff, 0x13, 0xd7, 0xf8, 0x44, 0x01, 0x98, 0xb8, 0x18,
+ 0x63, 0x05, 0x8a, 0xa0, 0xf5, 0xd0, 0x6e, 0x8f, 0x76, 0x25, 0xc1, 0x5f,
+ 0x1a, 0xc3, 0x38, 0x7e, 0xf4, 0x8a, 0xa4, 0x53, 0xc1, 0x1a, 0x65, 0xd8,
+ 0x86, 0xb0, 0xe0, 0x8d, 0xd0, 0x9e, 0xf2, 0x49, 0x4e, 0xe6, 0x9a, 0x1c,
+ 0x61, 0x2a, 0xf2, 0xb8, 0xbc, 0x6c, 0x63, 0x15, 0x03, 0xd7, 0x01, 0xd5,
+ 0x1f, 0x2b, 0xbd, 0x89, 0x6d, 0x41, 0xdf, 0xe0, 0x66, 0xc8, 0x66, 0x45,
+ 0xd6, 0x0c, 0x65, 0x62, 0x2f, 0xcd, 0x7f, 0xbf, 0xb8, 0x49, 0x67, 0x01,
+ 0x5a, 0x08, 0xb5, 0x84, 0x56, 0x46, 0xb4, 0x29, 0xa5, 0xf4, 0xa6, 0xd7,
+ 0x30, 0x6e, 0x6c, 0x3b, 0xa7, 0xe9, 0x93, 0xe6, 0x5c, 0x04, 0x0d, 0xd2,
+ 0xce, 0xcf, 0xff, 0x74, 0x76, 0xf4, 0xc5, 0x4b, 0x92, 0x59, 0x5f, 0x52,
+ 0x29, 0x4f, 0xdd, 0x12, 0x61, 0x49, 0x73, 0xbf, 0x08, 0x7d, 0xf2, 0x3f,
+ 0xbe, 0x3a, 0x1e, 0x9f, 0x9d, 0x9c, 0x1e, 0x7e, 0xf1, 0xf2, 0x47, 0xb2,
+ 0x67, 0xcc, 0x4d, 0x71, 0xef, 0xbd, 0x6b, 0x7f, 0x66, 0xdb, 0x15, 0x85,
+ 0x28, 0x53, 0x47, 0x3f, 0x7c, 0x38, 0x7a, 0xfb, 0xfd, 0x17, 0x2f, 0x6f,
+ 0xd2, 0x6a, 0x40, 0xeb, 0xe3, 0xb7, 0x7b, 0xfa, 0xad, 0xb7, 0x58, 0x8d,
+ 0x34, 0xf1, 0x8b, 0xd9, 0xc7, 0x3a, 0xff, 0x5b, 0x96, 0x98, 0xd7, 0x67,
+ 0xcb, 0xb0, 0xb7, 0xc5, 0x39, 0x83, 0xf3, 0x18, 0x62, 0xd0, 0xdf, 0x92,
+ 0xaf, 0x4f, 0xbe, 0x23, 0xfc, 0x74, 0xeb, 0x29, 0x9e, 0x73, 0xdb, 0xc8,
+ 0xe4, 0xcb, 0xa7, 0x3b, 0xbb, 0x9b, 0xae, 0x59, 0x39, 0xfa, 0x2f, 0x98,
+ 0x19, 0x7f, 0x0c, 0x8a, 0xd0, 0xfe, 0x26, 0xe5, 0x74, 0xae, 0x3a, 0xa4,
+ 0x71, 0xe6, 0x13, 0xdb, 0x7d, 0xe2, 0x76, 0x43, 0x81, 0x03, 0x72, 0x82,
+ 0xa9, 0xd7, 0x7b, 0x85, 0xcc, 0xff, 0xc0, 0xe5, 0x78, 0xfe, 0xda, 0x03,
+ 0x3e, 0xfb, 0xda, 0xb1, 0x9e, 0x99, 0x8e, 0xb8, 0x2d, 0x57, 0x5e, 0x86,
+ 0x9f, 0x30, 0x98, 0xd5, 0xb5, 0xa9, 0x41, 0x6c, 0x73, 0x7b, 0x09, 0xff,
+ 0xc4, 0xe9, 0xec, 0x05, 0xfd, 0x51, 0x50, 0x57, 0x32, 0x60, 0x2f, 0x56,
+ 0xa9, 0x8c, 0xa7, 0x68, 0x33, 0x0f, 0x58, 0x5f, 0xf9, 0x9c, 0x60, 0x29,
+ 0xb2, 0xda, 0x3a, 0xb8, 0x3c, 0xf7, 0xd5, 0x2c, 0xbb, 0x4a, 0x27, 0xf7,
+ 0xb6, 0xed, 0x00, 0x36, 0x64, 0xda, 0x3d, 0x9d, 0xc0, 0xe7, 0x9a, 0x90,
+ 0xdd, 0x06, 0xe0, 0x84, 0x84, 0x81, 0x2e, 0x16, 0xb0, 0xe6, 0xac, 0xd7,
+ 0x8b, 0xa7, 0x66, 0x11, 0xc4, 0xb4, 0xc0, 0xab, 0x1f, 0x43, 0xc1, 0x76,
+ 0x9e, 0x6e, 0x73, 0x1f, 0xb1, 0x0d, 0x5c, 0x05, 0x2b, 0x69, 0xfa, 0xa4,
+ 0x1d, 0x32, 0xf8, 0x1b, 0x0e, 0x39, 0x41, 0x33, 0xc2, 0x2b, 0xfd, 0x92,
+ 0xfe, 0x1a, 0x6f, 0xce, 0x82, 0xee, 0xa2, 0xf0, 0xdb, 0xa0, 0xa9, 0x34,
+ 0xab, 0x67, 0x58, 0xb6, 0xad, 0xcf, 0x90, 0x1e, 0x72, 0xd4, 0xe3, 0xa3,
+ 0x71, 0xf1, 0x84, 0x38, 0xf0, 0xa9, 0xf5, 0xea, 0x53, 0xcf, 0x28, 0xd4,
+ 0x71, 0x10, 0x67, 0xf4, 0x8c, 0x67, 0xab, 0xfe, 0xe8, 0xf7, 0x11, 0xcf,
+ 0xae, 0x24, 0x63, 0x44, 0x3b, 0x60, 0xad, 0x6c, 0x76, 0x15, 0x62, 0x33,
+ 0x71, 0x85, 0x80, 0x3a, 0x09, 0x38, 0x43, 0x85, 0x22, 0x8a, 0xb6, 0xd7,
+ 0x80, 0x99, 0x66, 0xad, 0x2a, 0x28, 0x95, 0x94, 0xc2, 0x22, 0x77, 0x68,
+ 0xe4, 0x11, 0x98, 0x1a, 0xa9, 0x80, 0xd4, 0x8e, 0x12, 0x0d, 0x37, 0xc7,
+ 0x73, 0x08, 0x7e, 0x98, 0xd0, 0x06, 0x9a, 0x85, 0x49, 0xd3, 0x1a, 0xee,
+ 0x10, 0x94, 0x84, 0xd8, 0xcf, 0xa2, 0x2f, 0x8f, 0xfb, 0x3b, 0x74, 0xe1,
+ 0x4e, 0xaa, 0x7b, 0xba, 0x71, 0x05, 0xe6, 0x7c, 0xbc, 0x10, 0x82, 0xb0,
+ 0x1c, 0xb4, 0x9c, 0xa0, 0x35, 0x82, 0xd4, 0x8d, 0xa3, 0x91, 0xee, 0xc6,
+ 0xd0, 0x75, 0x38, 0xcd, 0x1b, 0xab, 0xa1, 0x45, 0x70, 0xd8, 0x6c, 0x37,
+ 0x0c, 0x8b, 0xe6, 0xc9, 0xbe, 0x5f, 0xe5, 0x0f, 0xe1, 0x08, 0xfa, 0xd8,
+ 0x16, 0x57, 0xd2, 0xaa, 0x08, 0x42, 0x68, 0x38, 0x50, 0xf5, 0x3a, 0x83,
+ 0x15, 0xd9, 0xad, 0x3f, 0x98, 0xb3, 0x31, 0xec, 0x80, 0x9f, 0xd2, 0xdd,
+ 0x6f, 0x0c, 0x24, 0x2a, 0xff, 0x4b, 0x5e, 0x7e, 0x7f, 0xf4, 0x6e, 0x7c,
+ 0x7c, 0xfa, 0xf6, 0xcb, 0xa8, 0xed, 0x2b, 0xbf, 0xb4, 0x9d, 0x6a, 0xb5,
+ 0x70, 0xd8, 0x75, 0x13, 0x25, 0x97, 0x97, 0x3a, 0x56, 0xb8, 0xad, 0x5d,
+ 0x5e, 0xd0, 0x23, 0x41, 0x93, 0xd2, 0x49, 0xb6, 0x68, 0xa0, 0x2f, 0xa9,
+ 0xd9, 0xac, 0x71, 0x34, 0x69, 0x0e, 0x06, 0x83, 0x6d, 0x7b, 0xa0, 0x7f,
+ 0xdb, 0xb1, 0x7f, 0xdb, 0x8d, 0x60, 0x7f, 0xf2, 0x6f, 0xf6, 0x62, 0x04,
+ 0xd2, 0x0e, 0xb7, 0xd6, 0x8d, 0x46, 0xdf, 0x99, 0x32, 0x29, 0xd8, 0xa6,
+ 0x36, 0x53, 0x1e, 0xc4, 0xd1, 0xe5, 0x63, 0x1a, 0xab, 0xde, 0x6c, 0xac,
+ 0x30, 0xd6, 0xc9, 0x7f, 0xbc, 0x3f, 0x3e, 0x1c, 0xb2, 0x1b, 0x1a, 0x02,
+ 0x66, 0xcb, 0xf0, 0xaf, 0x0d, 0x17, 0x05, 0x13, 0x8a, 0xa7, 0x50, 0x79,
+ 0x19, 0x0c, 0xcb, 0x05, 0xd7, 0xc0, 0x12, 0xf0, 0x16, 0xe3, 0xc6, 0xf8,
+ 0x14, 0x0d, 0xba, 0x0b, 0x8d, 0xb6, 0xdb, 0x2f, 0x9a, 0x87, 0x6f, 0x76,
+ 0xbc, 0xb2, 0x24, 0xfb, 0xdc, 0x4e, 0xec, 0xb9, 0x9d, 0xf0, 0xb9, 0xdd,
+ 0xd8, 0x73, 0xbb, 0xe1, 0x73, 0x7b, 0xb1, 0xe7, 0xbc, 0x0d, 0xf0, 0xdc,
+ 0x8e, 0x76, 0x2b, 0xad, 0x51, 0xee, 0xfe, 0xba, 0xdb, 0xb2, 0xcf, 0xf7,
+ 0x46, 0x3e, 0x2b, 0xfa, 0xc5, 0xa0, 0xe2, 0x62, 0xf0, 0x8a, 0xea, 0x7e,
+ 0x91, 0x5b, 0x41, 0x2f, 0x0e, 0x1d, 0xce, 0xe8, 0xad, 0x1d, 0xa7, 0xbf,
+ 0xf9, 0xe8, 0xce, 0xde, 0x70, 0x92, 0x2f, 0xae, 0xe9, 0x1a, 0x7c, 0x29,
+ 0x7f, 0x59, 0x12, 0xcc, 0x39, 0xf9, 0x87, 0x43, 0x65, 0xe8, 0x64, 0xec,
+ 0x03, 0xe9, 0x09, 0x76, 0x34, 0xde, 0x4a, 0xf0, 0x5a, 0xed, 0x60, 0xf4,
+ 0xba, 0x5e, 0xfe, 0x10, 0xc0, 0x92, 0x62, 0x98, 0xb6, 0x78, 0xcd, 0x2c,
+ 0x93, 0xf6, 0x1c, 0xe4, 0x38, 0xf7, 0xda, 0xf6, 0xea, 0xe4, 0x64, 0x78,
+ 0xee, 0x3a, 0xcd, 0x09, 0x10, 0x5d, 0x67, 0x32, 0xba, 0x2f, 0xc9, 0xf3,
+ 0x23, 0xc6, 0x5e, 0xa5, 0x46, 0xac, 0x85, 0x0e, 0xdc, 0x9a, 0xa9, 0xd5,
+ 0xfa, 0xd1, 0x22, 0x26, 0x72, 0x5f, 0xbf, 0x7f, 0x77, 0x12, 0xe8, 0xb7,
+ 0x09, 0x79, 0x82, 0xea, 0xfd, 0xad, 0x2d, 0xa2, 0xfc, 0xe8, 0x3a, 0xbd,
+ 0xbb, 0x1b, 0xd5, 0xd9, 0x96, 0x11, 0x6a, 0xf5, 0x16, 0x5c, 0xcc, 0xf2,
+ 0xed, 0xeb, 0x66, 0x3e, 0x7b, 0x40, 0x39, 0xa9, 0x2d, 0xe0, 0xf9, 0xec,
+ 0x5e, 0xcc, 0x4b, 0xa0, 0x69, 0xb8, 0xca, 0xfb, 0xdc, 0xdb, 0xd6, 0xb0,
+ 0x66, 0x4f, 0xba, 0xd1, 0x13, 0x8f, 0x1b, 0x2e, 0x37, 0xf7, 0x05, 0x6e,
+ 0x6d, 0x0b, 0x1e, 0x9e, 0x02, 0xa8, 0x9f, 0xf3, 0x4f, 0x1c, 0xb6, 0x1b,
+ 0xbd, 0x40, 0x25, 0xd2, 0x59, 0x10, 0x54, 0xb2, 0x20, 0x6e, 0x15, 0xda,
+ 0xb5, 0xc0, 0x3d, 0x11, 0xa3, 0x5a, 0xed, 0x87, 0x9f, 0x10, 0xb1, 0xe5,
+ 0x25, 0x47, 0x75, 0x9d, 0x4f, 0x2c, 0xb9, 0x29, 0x31, 0x92, 0x2c, 0x0a,
+ 0xa3, 0xf7, 0x98, 0x3f, 0xbf, 0x0c, 0x81, 0x04, 0xb0, 0x82, 0x6e, 0xfa,
+ 0x24, 0x99, 0x20, 0x54, 0x8d, 0xc7, 0xa4, 0xe7, 0xaf, 0x81, 0xf2, 0x9e,
+ 0x38, 0xef, 0x83, 0x7b, 0xc0, 0xb6, 0xad, 0x8d, 0xdf, 0x9d, 0xad, 0x0d,
+ 0x38, 0x6b, 0x96, 0xbe, 0x30, 0x34, 0xff, 0x4e, 0x60, 0xea, 0x52, 0xe3,
+ 0xb7, 0xa7, 0x4f, 0x36, 0x39, 0x5a, 0xcb, 0x73, 0xe4, 0x1a, 0xd8, 0x30,
+ 0x88, 0x87, 0x5f, 0xba, 0x14, 0xcf, 0xaa, 0xd5, 0xa2, 0xd1, 0x48, 0xe7,
+ 0xf6, 0x02, 0x39, 0xf7, 0x6a, 0xc0, 0xb9, 0x34, 0x2b, 0x74, 0x4b, 0x87,
+ 0x48, 0x6c, 0x78, 0x06, 0xf3, 0x1c, 0x75, 0xe2, 0x64, 0x65, 0xf5, 0x51,
+ 0xba, 0x54, 0x49, 0x5c, 0x05, 0x02, 0xa5, 0xbb, 0xd8, 0xb6, 0x80, 0x69,
+ 0xfb, 0x63, 0xbd, 0x35, 0x0b, 0xc1, 0x06, 0xe2, 0x37, 0x49, 0xac, 0x53,
+ 0xb4, 0x87, 0x57, 0x0d, 0xc1, 0xbe, 0x29, 0x96, 0xb4, 0x29, 0x18, 0x48,
+ 0xc7, 0x91, 0x61, 0x1e, 0xc0, 0x52, 0x7b, 0xd2, 0xd9, 0x7d, 0x25, 0x5e,
+ 0x64, 0xdb, 0x13, 0x4b, 0x58, 0x6c, 0x12, 0x0c, 0x2b, 0x05, 0x8a, 0x8e,
+ 0xb0, 0x84, 0x80, 0xb9, 0xf6, 0xd6, 0xf4, 0x29, 0x5e, 0x90, 0xb7, 0x23,
+ 0x23, 0x0d, 0x81, 0x8a, 0xed, 0xe0, 0xf6, 0xda, 0xeb, 0xd4, 0x14, 0xb7,
+ 0x4f, 0x54, 0x39, 0x75, 0x49, 0x44, 0x2a, 0xf6, 0x1e, 0x5c, 0xbf, 0xbf,
+ 0x7c, 0x7c, 0x2c, 0x9a, 0x25, 0x4f, 0x14, 0xd0, 0x2c, 0xe2, 0x47, 0xad,
+ 0xdf, 0xa1, 0xf6, 0xf6, 0x52, 0x40, 0x9b, 0x46, 0xb5, 0x69, 0xe0, 0x88,
+ 0xe0, 0x51, 0xc1, 0x31, 0x35, 0x51, 0x22, 0xe0, 0xd4, 0x4f, 0x41, 0x97,
+ 0x16, 0x61, 0xe8, 0xd2, 0x8d, 0x5e, 0x5b, 0x12, 0xc0, 0xf0, 0xe3, 0x17,
+ 0x9e, 0x92, 0x01, 0xa5, 0x42, 0xc5, 0x68, 0x3b, 0xa5, 0xbc, 0xb7, 0x72,
+ 0x46, 0x42, 0x19, 0x34, 0x8a, 0xf6, 0xef, 0x8a, 0xe0, 0x60, 0x91, 0x0b,
+ 0x58, 0xbf, 0x22, 0x10, 0xd7, 0x0c, 0xff, 0xd1, 0x74, 0x02, 0xd8, 0xaa,
+ 0x1b, 0x4b, 0xd9, 0xfd, 0x2c, 0x4c, 0xab, 0xf9, 0x40, 0x27, 0xf7, 0x83,
+ 0x10, 0x66, 0x9b, 0x0b, 0xff, 0x01, 0x17, 0x9d, 0x53, 0xd3, 0xa1, 0x14,
+ 0xfa, 0x19, 0x45, 0x3e, 0x6a, 0xb4, 0x4b, 0x73, 0x00, 0x00, 0x72, 0xc5,
+ 0x75, 0xef, 0x10, 0x1a, 0xc7, 0x1c, 0xf2, 0x2a, 0x25, 0x08, 0x2d, 0xf6,
+ 0x2e, 0xab, 0x16, 0xd2, 0x81, 0x14, 0x45, 0xbb, 0x2c, 0xab, 0xf7, 0x0a,
+ 0xd9, 0x02, 0xf3, 0xe6, 0xa1, 0xa2, 0xf9, 0x50, 0xf9, 0x20, 0xb5, 0xe8,
+ 0xd7, 0x6d, 0xd6, 0xce, 0xff, 0x59, 0x9b, 0xb5, 0xf3, 0x7f, 0xc7, 0x66,
+ 0xed, 0xfe, 0xba, 0xcd, 0xda, 0xfd, 0x3f, 0x6b, 0xb3, 0x76, 0xff, 0xef,
+ 0xd8, 0xac, 0xbd, 0x5f, 0xb7, 0x59, 0x7b, 0x9f, 0x60, 0xb3, 0xfe, 0x77,
+ 0x33, 0x48, 0xdf, 0xd2, 0x84, 0x71, 0x67, 0xa9, 0x92, 0xab, 0xe9, 0xed,
+ 0x56, 0x07, 0x34, 0x7a, 0x2e, 0x39, 0x9e, 0xe8, 0xf7, 0xa2, 0x32, 0xd7,
+ 0xbf, 0x00, 0x2b, 0xd0, 0x19, 0x7b, 0x51, 0x8f, 0x42, 0xa4, 0x37, 0x09,
+ 0xa5, 0x9a, 0x90, 0xd2, 0xdb, 0xde, 0x8c, 0x3b, 0xd9, 0x03, 0x35, 0x93,
+ 0xfa, 0xbb, 0x60, 0xa0, 0xd5, 0x29, 0xef, 0x04, 0xc6, 0xb0, 0x4e, 0x61,
+ 0x24, 0x91, 0x30, 0xda, 0x55, 0x78, 0xdf, 0x75, 0xa3, 0x8f, 0xf9, 0x15,
+ 0xc1, 0x25, 0xf6, 0x63, 0x6b, 0x68, 0x60, 0xbc, 0x1d, 0x17, 0xf7, 0xc2,
+ 0xd0, 0x2e, 0x30, 0xee, 0xac, 0xd6, 0xfe, 0xd0, 0xb8, 0xd5, 0x31, 0x1f,
+ 0x0a, 0x8e, 0x6b, 0x13, 0x86, 0xfe, 0xd0, 0x78, 0x3c, 0xf4, 0xdd, 0x31,
+ 0xb4, 0xfd, 0x33, 0x52, 0x0d, 0xb5, 0x87, 0x68, 0xbc, 0x51, 0x89, 0x73,
+ 0x96, 0x52, 0x7d, 0x17, 0x90, 0x8c, 0xa7, 0x8c, 0x22, 0x46, 0xa9, 0x42,
+ 0x47, 0xf2, 0xae, 0x8b, 0x4e, 0x32, 0xf3, 0x85, 0x10, 0x5d, 0xa5, 0x32,
+ 0xbf, 0xc5, 0xa4, 0x52, 0xc8, 0x13, 0x5e, 0x65, 0xcd, 0x59, 0x8f, 0xcb,
+ 0x42, 0x3f, 0xe3, 0xb0, 0x40, 0x80, 0x8f, 0x17, 0xe4, 0x4f, 0x28, 0x40,
+ 0x6e, 0xfe, 0x90, 0xca, 0xfc, 0xac, 0xbd, 0xde, 0x74, 0x92, 0x0d, 0xd3,
+ 0x7a, 0x92, 0xe7, 0xf1, 0x1e, 0xe6, 0x1a, 0xc8, 0x4e, 0x93, 0xcb, 0x25,
+ 0xa2, 0x12, 0xe6, 0xf9, 0x84, 0x82, 0x86, 0xb4, 0x02, 0x6e, 0xd8, 0x2a,
+ 0x80, 0x62, 0x34, 0x5d, 0x73, 0x62, 0xaf, 0x4a, 0x0d, 0x50, 0x0c, 0x22,
+ 0xce, 0x4e, 0x3a, 0x97, 0xd8, 0x62, 0xb3, 0x3b, 0x00, 0xcb, 0x05, 0xb6,
+ 0x91, 0xd7, 0xff, 0x74, 0xa0, 0xb1, 0x26, 0x76, 0x20, 0xb6, 0x20, 0x5a,
+ 0xdf, 0x07, 0xf6, 0xee, 0xda, 0x70, 0x8d, 0x5c, 0xb5, 0xb6, 0x6d, 0x24,
+ 0xa1, 0xd8, 0xa6, 0x52, 0xd0, 0x22, 0xaf, 0x2a, 0x2c, 0x56, 0x4f, 0x1e,
+ 0x81, 0x86, 0x66, 0x0c, 0x0b, 0xdd, 0x6b, 0x2b, 0x06, 0x74, 0xc6, 0xd2,
+ 0x08, 0x2b, 0xc9, 0x7c, 0x73, 0x06, 0x05, 0x86, 0x96, 0x4b, 0x65, 0xb2,
+ 0x3b, 0xae, 0x0e, 0x0e, 0x2d, 0x38, 0xb1, 0x19, 0xaf, 0xd1, 0xa8, 0x94,
+ 0x9e, 0x3d, 0x18, 0x1f, 0x1e, 0x1f, 0xb7, 0x6a, 0x89, 0x89, 0x78, 0x8c,
+ 0xe6, 0x0e, 0x0c, 0x98, 0x9a, 0x50, 0xed, 0xb3, 0x2a, 0x0e, 0xf0, 0xca,
+ 0x4d, 0x91, 0xcd, 0xf1, 0x43, 0x34, 0xc9, 0x48, 0x82, 0x5c, 0x5b, 0x56,
+ 0xa7, 0x9c, 0xa3, 0xb6, 0x2c, 0xcc, 0x34, 0x73, 0x02, 0xe7, 0xbb, 0x5e,
+ 0xce, 0xd3, 0xe2, 0xd3, 0x83, 0x0b, 0x76, 0xcf, 0x9d, 0x3d, 0x67, 0x60,
+ 0x0c, 0x9c, 0x2b, 0x3f, 0x58, 0x1d, 0xf2, 0x5a, 0xa4, 0x03, 0xd5, 0x59,
+ 0x25, 0xfd, 0x89, 0x19, 0x6f, 0x4f, 0x5a, 0x48, 0x99, 0x65, 0x02, 0x07,
+ 0x95, 0x47, 0x36, 0x6b, 0xd5, 0xf8, 0x37, 0x77, 0x67, 0x11, 0x41, 0x42,
+ 0x67, 0xa6, 0xeb, 0x57, 0xe4, 0xd0, 0xe0, 0x4a, 0xc1, 0xbc, 0xd3, 0xbd,
+ 0x1b, 0xf1, 0x91, 0x7f, 0xe6, 0x09, 0xf0, 0x0f, 0xc0, 0x83, 0xfc, 0x2f,
+ 0x07, 0xa0, 0xe7, 0x04, 0x00, 0xce, 0xd3, 0x75, 0x5b, 0x7d, 0xf8, 0x10,
+ 0x40, 0xf9, 0x58, 0xfb, 0xfd, 0x5a, 0xbc, 0x47, 0xd9, 0x23, 0x4e, 0x92,
+ 0xd9, 0xf7, 0xff, 0x2e, 0x4e, 0x0b, 0xd3, 0x73, 0x7c, 0x21, 0xe6, 0xef,
+ 0xe9, 0xb2, 0xc8, 0xef, 0x50, 0xa6, 0x63, 0x94, 0xa9, 0x97, 0xd4, 0x9f,
+ 0xab, 0xa7, 0xf7, 0xd4, 0x21, 0xab, 0x1f, 0x89, 0x16, 0x1d, 0x61, 0x15,
+ 0xef, 0xcd, 0xcb, 0x46, 0x13, 0x99, 0x53, 0x82, 0x12, 0x8f, 0x31, 0xf0,
+ 0x9b, 0x80, 0x40, 0xac, 0x47, 0x12, 0x9c, 0x8a, 0xac, 0x21, 0x53, 0x75,
+ 0x65, 0xb4, 0xae, 0x1d, 0x01, 0x3d, 0x07, 0x52, 0xdc, 0x82, 0x2a, 0x41,
+ 0x86, 0x88, 0xbf, 0x45, 0x99, 0x90, 0xfd, 0x84, 0xae, 0xf4, 0xa2, 0x5b,
+ 0xdc, 0xe7, 0x75, 0x9c, 0x14, 0xfe, 0x91, 0x5b, 0x1f, 0xfd, 0xc7, 0x62,
+ 0xb9, 0x58, 0xb6, 0x51, 0x9e, 0x6b, 0x33, 0x99, 0x77, 0xa3, 0x2d, 0x68,
+ 0x64, 0xe8, 0x42, 0xd2, 0xd2, 0x02, 0x3a, 0xbc, 0xbb, 0x3b, 0xfd, 0x2e,
+ 0x47, 0xc9, 0xdb, 0xd3, 0xf3, 0x23, 0x3e, 0xa0, 0xad, 0x76, 0x9c, 0x00,
+ 0xb2, 0xcc, 0x01, 0xa4, 0xbe, 0xa5, 0x19, 0x1b, 0xb3, 0xb0, 0xa0, 0xc2,
+ 0xf5, 0x78, 0x64, 0x51, 0x47, 0xd5, 0x7b, 0x88, 0xda, 0xd2, 0xbf, 0x01,
+ 0x99, 0xa5, 0xe9, 0x75, 0xed, 0x45, 0x48, 0xdf, 0xd6, 0xae, 0xfa, 0xe2,
+ 0xc5, 0xd4, 0xaf, 0xf3, 0xe2, 0xa3, 0x9d, 0x57, 0xc5, 0x8c, 0xe8, 0xbe,
+ 0xa6, 0x89, 0x69, 0x9d, 0xc6, 0x75, 0x41, 0xb2, 0xba, 0xed, 0x11, 0x29,
+ 0x6a, 0x14, 0x83, 0x13, 0x53, 0xfd, 0x24, 0x75, 0xca, 0xa2, 0x44, 0xc3,
+ 0x54, 0x01, 0x8a, 0x79, 0x63, 0x13, 0x8a, 0x0f, 0x6b, 0xa1, 0x76, 0x00,
+ 0xbe, 0x9c, 0xcf, 0x46, 0x7e, 0x29, 0x8c, 0x78, 0x7d, 0xb5, 0x02, 0x6f,
+ 0xc3, 0x68, 0xe7, 0xac, 0xb4, 0xf1, 0xe1, 0xa1, 0x2e, 0x57, 0xda, 0x89,
+ 0xa4, 0xbf, 0x4b, 0x45, 0x14, 0xc8, 0xab, 0x9d, 0x81, 0x47, 0x92, 0x63,
+ 0x23, 0x55, 0x00, 0x5c, 0x8a, 0xff, 0x6d, 0xaa, 0xda, 0x69, 0x4e, 0x78,
+ 0x5e, 0xf8, 0xec, 0x1e, 0x44, 0xec, 0xa4, 0xd3, 0xa5, 0x88, 0xa5, 0xe4,
+ 0x40, 0x9a, 0xa8, 0x64, 0xe4, 0x3b, 0xed, 0x7e, 0x67, 0xe4, 0x7f, 0x87,
+ 0x2b, 0xa0, 0x36, 0x03, 0x60, 0x3f, 0x80, 0x0b, 0x3a, 0xce, 0xf3, 0xbe,
+ 0x4d, 0xf3, 0xa4, 0xb4, 0x37, 0x46, 0x29, 0xc0, 0xcc, 0x00, 0x3f, 0x46,
+ 0x89, 0xe1, 0x48, 0xa6, 0x08, 0x4f, 0x22, 0x90, 0x27, 0x38, 0x7f, 0x1c,
+ 0xbd, 0xee, 0x70, 0x5f, 0x72, 0xc3, 0x3c, 0x4e, 0x18, 0x17, 0x89, 0xc6,
+ 0x48, 0xc3, 0xb2, 0x5a, 0x0a, 0x50, 0xd3, 0x33, 0x61, 0x36, 0x29, 0x37,
+ 0xf2, 0x8d, 0x76, 0x6d, 0xf4, 0xeb, 0x40, 0x49, 0xa2, 0x85, 0xc7, 0xd9,
+ 0xf6, 0xc4, 0xa5, 0x26, 0x7b, 0x65, 0x61, 0x4d, 0x9e, 0x78, 0xe3, 0x31,
+ 0x69, 0x2e, 0x93, 0x1c, 0xd1, 0x1b, 0xe1, 0x60, 0x7f, 0x90, 0x56, 0x7d,
+ 0xb9, 0xdf, 0xf6, 0xfa, 0x16, 0x87, 0xa1, 0xcb, 0x57, 0xc2, 0x79, 0xd2,
+ 0xc3, 0x08, 0xa0, 0x0d, 0x23, 0x69, 0x1b, 0x40, 0x4a, 0xbb, 0xaa, 0x99,
+ 0xc9, 0xda, 0xd5, 0xac, 0xbc, 0xb8, 0x30, 0x0b, 0x5f, 0xf3, 0x94, 0x52,
+ 0xf3, 0xe5, 0xc0, 0x35, 0xed, 0xcf, 0x23, 0x49, 0xab, 0x2b, 0xd8, 0xce,
+ 0x03, 0x4e, 0xac, 0x13, 0x6c, 0x5e, 0xba, 0x90, 0x35, 0x66, 0x20, 0xdf,
+ 0xd7, 0xd6, 0x1f, 0x91, 0x7b, 0x86, 0x3b, 0x6b, 0x28, 0x63, 0xd0, 0xc2,
+ 0x5a, 0x51, 0x04, 0x14, 0xa9, 0xd2, 0x4f, 0x75, 0x82, 0x9c, 0x2d, 0xd9,
+ 0x9b, 0xef, 0xdb, 0xea, 0xb9, 0x38, 0xd0, 0x96, 0xbb, 0x79, 0x1d, 0x86,
+ 0x6b, 0x40, 0x85, 0xf6, 0x82, 0xd6, 0xfe, 0x93, 0xfe, 0xb3, 0x33, 0xa0,
+ 0x3f, 0x77, 0xff, 0xbe, 0x86, 0x88, 0xce, 0xfe, 0xd6, 0xd6, 0xed, 0xed,
+ 0xed, 0x48, 0x81, 0x26, 0xcd, 0x96, 0x7d, 0x16, 0x96, 0x73, 0x12, 0xe2,
+ 0x5e, 0xcf, 0x07, 0xce, 0x93, 0xb5, 0x7c, 0x7e, 0xf5, 0xe7, 0x9d, 0xe1,
+ 0xce, 0xf6, 0xf6, 0xf6, 0xcf, 0xa3, 0x05, 0x91, 0xf8, 0x12, 0xc3, 0x9a,
+ 0x3f, 0xfd, 0x61, 0xb7, 0x78, 0x26, 0x5b, 0x71, 0x54, 0x60, 0xfe, 0xa5,
+ 0x22, 0x58, 0x18, 0xca, 0xa2, 0x3f, 0x15, 0x33, 0xf2, 0xbe, 0x27, 0x64,
+ 0x38, 0x3a, 0x9e, 0x7a, 0xa8, 0x58, 0x21, 0x9a, 0xc4, 0x05, 0xe7, 0x3a,
+ 0x3f, 0xdd, 0xdb, 0xdd, 0x4d, 0x58, 0xe5, 0xe0, 0x9a, 0x43, 0x4e, 0xd0,
+ 0x20, 0xb8, 0x89, 0x2c, 0x45, 0x3d, 0x00, 0xdf, 0x65, 0x04, 0xc9, 0x99,
+ 0x72, 0xec, 0xc7, 0xf0, 0x46, 0x5f, 0x4e, 0x2a, 0xf8, 0x96, 0xa0, 0x39,
+ 0x8d, 0xf4, 0x29, 0xa7, 0xf7, 0x6e, 0x60, 0xc3, 0xe5, 0x15, 0xc9, 0x56,
+ 0x6e, 0x7b, 0xdd, 0x08, 0x84, 0x10, 0xfa, 0x4f, 0x84, 0x5a, 0x9b, 0xed,
+ 0xf1, 0x8a, 0x4b, 0x0e, 0x48, 0xca, 0x05, 0xd1, 0x17, 0x9d, 0x57, 0x81,
+ 0xf0, 0xb8, 0xac, 0xa4, 0x9d, 0x1f, 0x92, 0x37, 0x6e, 0xd3, 0xfb, 0xd6,
+ 0x65, 0x6f, 0x28, 0xfe, 0xd2, 0xfc, 0x11, 0xf8, 0xbd, 0x6d, 0x55, 0x34,
+ 0xb1, 0x12, 0x56, 0xd8, 0x4c, 0xae, 0x83, 0x26, 0x2a, 0x10, 0xdf, 0xa4,
+ 0xba, 0x5f, 0x9b, 0xd5, 0xdc, 0x4b, 0x3f, 0xce, 0xde, 0x56, 0xc7, 0xae,
+ 0xd8, 0xda, 0x0c, 0x4a, 0xed, 0xad, 0x50, 0x5b, 0x31, 0x29, 0x8b, 0xcb,
+ 0x9c, 0x5b, 0xac, 0xf5, 0xfa, 0x3a, 0x6c, 0xbb, 0x6d, 0xfa, 0xa8, 0xd4,
+ 0xed, 0xd0, 0x19, 0x98, 0x5c, 0x67, 0x73, 0x91, 0x97, 0x1b, 0x9a, 0xf5,
+ 0xb9, 0x26, 0x4c, 0xb8, 0x16, 0x5e, 0x69, 0x6b, 0x97, 0xf2, 0x1b, 0xb3,
+ 0x98, 0x4d, 0x29, 0xa6, 0xb6, 0xb7, 0x9c, 0x74, 0xfd, 0xbb, 0x5a, 0x92,
+ 0xd5, 0x78, 0x91, 0xca, 0x75, 0xa2, 0x35, 0xfe, 0x88, 0x43, 0xc5, 0xb0,
+ 0x19, 0x8c, 0x4c, 0xcc, 0x2a, 0xdc, 0x62, 0xe6, 0x84, 0x5d, 0x0c, 0x45,
+ 0xf7, 0x91, 0x4b, 0x15, 0x49, 0x33, 0xe6, 0xc4, 0xbe, 0x3a, 0x3e, 0x34,
+ 0x42, 0xe9, 0xf5, 0xf9, 0xd9, 0x00, 0xf5, 0x3e, 0x03, 0x94, 0x33, 0x87,
+ 0x1d, 0x19, 0xcf, 0xe0, 0x2e, 0x02, 0xa3, 0x4a, 0xbf, 0xfa, 0xd4, 0xa5,
+ 0x0d, 0xba, 0x0a, 0x55, 0xad, 0x66, 0xf5, 0x7a, 0x69, 0x46, 0x92, 0x9f,
+ 0x5b, 0x5a, 0xa2, 0x4d, 0xb6, 0x7c, 0xf2, 0x74, 0xb4, 0xcd, 0x6b, 0x44,
+ 0xf3, 0x67, 0x4e, 0x0a, 0x92, 0xf2, 0x3b, 0xf8, 0x69, 0x34, 0x60, 0x99,
+ 0xc6, 0xd3, 0x0e, 0xec, 0x74, 0x06, 0x09, 0x43, 0xe4, 0x33, 0x3e, 0x86,
+ 0xfe, 0xd6, 0xcb, 0x00, 0x5d, 0xa9, 0x99, 0xfa, 0xb0, 0xb8, 0xc4, 0x96,
+ 0x1d, 0x6c, 0x73, 0x8a, 0xb4, 0x95, 0x89, 0x16, 0xcf, 0x0a, 0x78, 0x4e,
+ 0xac, 0x06, 0x12, 0x3c, 0x81, 0x5a, 0x05, 0x4e, 0x7d, 0x1f, 0xb8, 0x26,
+ 0x8b, 0x25, 0xdd, 0x02, 0x72, 0x63, 0x49, 0x01, 0x55, 0xab, 0x27, 0x79,
+ 0x4c, 0x3f, 0xe9, 0xeb, 0x5d, 0x69, 0x5b, 0xcb, 0x9c, 0x16, 0xd4, 0x87,
+ 0x9e, 0xfa, 0xce, 0x0f, 0xb8, 0x67, 0x0a, 0xda, 0xd3, 0x82, 0x79, 0x09,
+ 0x93, 0x40, 0xf0, 0x78, 0x51, 0xda, 0x41, 0xc8, 0xe7, 0x17, 0xec, 0xa6,
+ 0x8b, 0x55, 0x6a, 0xb1, 0xfb, 0x54, 0x14, 0x5f, 0xf7, 0x9e, 0x9c, 0x78,
+ 0xd1, 0x7c, 0x48, 0x7a, 0xdf, 0x9b, 0x2b, 0x7d, 0x3e, 0x4a, 0xbe, 0xce,
+ 0xa8, 0xa1, 0xfd, 0xbf, 0xb8, 0xb3, 0xfb, 0xb5, 0x60, 0x25, 0xb3, 0x06,
+ 0x1f, 0xab, 0x34, 0x04, 0x97, 0x6d, 0x6a, 0x52, 0x31, 0x9b, 0xd4, 0xaa,
+ 0x0b, 0xa3, 0xa7, 0x0c, 0x73, 0x24, 0x08, 0x39, 0x41, 0x3f, 0x5f, 0x0e,
+ 0xb7, 0x65, 0xc1, 0x84, 0x01, 0xa7, 0xe3, 0x15, 0x93, 0x8a, 0x58, 0xc0,
+ 0xcd, 0x05, 0x13, 0x54, 0xdc, 0x66, 0x6b, 0x7f, 0xa4, 0x60, 0xd6, 0x17,
+ 0x07, 0x36, 0x54, 0x1a, 0x47, 0xce, 0x82, 0xa2, 0x57, 0xb3, 0xdc, 0x6d,
+ 0xdb, 0x58, 0x22, 0x6d, 0xe9, 0x46, 0xca, 0xee, 0x18, 0x37, 0x16, 0x3c,
+ 0x75, 0x9b, 0x17, 0x7b, 0xbb, 0x42, 0x0b, 0x6f, 0x7b, 0x86, 0x07, 0x0a,
+ 0x18, 0x3d, 0x4c, 0xaf, 0x68, 0xa0, 0x68, 0x10, 0xaf, 0xd5, 0x2c, 0x97,
+ 0xe9, 0xfb, 0x9e, 0x5e, 0x39, 0xc0, 0x2b, 0xd2, 0x5e, 0x53, 0xb3, 0x23,
+ 0x7d, 0xd0, 0x04, 0xf5, 0xc0, 0x76, 0xf8, 0xb8, 0x54, 0xf1, 0x7a, 0x31,
+ 0x4b, 0x8b, 0x8f, 0x36, 0x61, 0x9d, 0x07, 0x1a, 0x50, 0x83, 0x76, 0xae,
+ 0x5b, 0x76, 0x3f, 0x14, 0xf2, 0xf0, 0x9d, 0x1d, 0xf4, 0x6f, 0x82, 0x9b,
+ 0x71, 0x9e, 0x56, 0x28, 0x69, 0x05, 0xd9, 0x24, 0xa9, 0xde, 0xdf, 0x14,
+ 0x5b, 0x8d, 0x0e, 0x46, 0xfe, 0x56, 0x3b, 0x88, 0x06, 0x6d, 0x28, 0x94,
+ 0xd5, 0x39, 0xfb, 0xdc, 0xa6, 0xe7, 0xf7, 0x30, 0xb6, 0x64, 0x38, 0x90,
+ 0x7c, 0x45, 0x8e, 0xef, 0x7c, 0xd1, 0xdc, 0x5b, 0x2d, 0x05, 0x0e, 0x9d,
+ 0x2e, 0x85, 0x37, 0xd6, 0xd6, 0x36, 0x19, 0x4f, 0x28, 0xa2, 0x46, 0x73,
+ 0xd1, 0x9c, 0x48, 0x46, 0x5d, 0x04, 0xe1, 0xb5, 0x67, 0xa4, 0xe3, 0x72,
+ 0x46, 0x9f, 0xd7, 0xc5, 0xc2, 0x66, 0x58, 0x2c, 0xb8, 0xb5, 0x7a, 0x57,
+ 0xe6, 0x80, 0xbe, 0x89, 0xa6, 0xd9, 0x5b, 0x00, 0x91, 0x0c, 0x19, 0xdc,
+ 0xbe, 0x16, 0x54, 0x2f, 0xc8, 0xbb, 0xb0, 0xb1, 0x96, 0xac, 0x6d, 0x7e,
+ 0xc2, 0x3c, 0x09, 0x8b, 0x4e, 0x6e, 0xae, 0x4c, 0xf3, 0xe7, 0xbe, 0x46,
+ 0x67, 0xfb, 0x2e, 0x4f, 0x7b, 0x75, 0x73, 0x7f, 0x76, 0x6a, 0x92, 0xa7,
+ 0xf1, 0x5c, 0xb1, 0x18, 0x2e, 0x5d, 0xa3, 0x2a, 0x17, 0x47, 0x8e, 0x65,
+ 0x4b, 0x8c, 0x92, 0x53, 0x67, 0xcb, 0x17, 0x03, 0x00, 0x55, 0x37, 0xd5,
+ 0x44, 0xb1, 0x7b, 0xe9, 0xef, 0x92, 0x0b, 0x9c, 0xce, 0xa2, 0xb7, 0x28,
+ 0x32, 0xe7, 0xeb, 0x1c, 0xd0, 0xf9, 0xf6, 0x1a, 0xf6, 0xa0, 0xc5, 0xb9,
+ 0x2b, 0xbb, 0xbb, 0x0d, 0x0d, 0xf7, 0x50, 0xfb, 0x72, 0x80, 0xc1, 0x05,
+ 0xa9, 0xfe, 0xbc, 0x88, 0x68, 0x33, 0xbf, 0xf8, 0x7a, 0x6b, 0xc9, 0xca,
+ 0x98, 0x99, 0x7d, 0xa3, 0x5e, 0xef, 0x56, 0xa1, 0x67, 0xd8, 0x13, 0xc2,
+ 0x53, 0x2a, 0x8b, 0x41, 0x80, 0x98, 0x86, 0x3c, 0x08, 0xf6, 0xf7, 0x21,
+ 0xcd, 0x74, 0xee, 0xf7, 0xdd, 0x62, 0xcb, 0x18, 0x6f, 0xea, 0x09, 0x74,
+ 0x1f, 0xa7, 0x93, 0xd2, 0x5f, 0x33, 0x2f, 0x6d, 0x28, 0x75, 0x33, 0x0c,
+ 0x53, 0x0d, 0xb8, 0x12, 0x34, 0x58, 0x92, 0x91, 0xf7, 0x22, 0x74, 0x04,
+ 0xc0, 0x2d, 0xe7, 0xa0, 0x7a, 0xed, 0xd3, 0xea, 0x9a, 0x1a, 0x44, 0x7a,
+ 0xce, 0x27, 0x41, 0xc1, 0x33, 0xa7, 0x28, 0x30, 0x56, 0xd0, 0x22, 0x84,
+ 0x51, 0xe7, 0x0d, 0x85, 0x81, 0xdd, 0x4e, 0xb9, 0x59, 0x94, 0x80, 0xeb,
+ 0xf2, 0xdd, 0x49, 0x9d, 0xcb, 0x0a, 0x76, 0xaa, 0x94, 0x0a, 0x67, 0x98,
+ 0x4c, 0x42, 0x34, 0xd2, 0x29, 0x23, 0x58, 0xd7, 0x3c, 0xa2, 0x10, 0xe7,
+ 0x9e, 0x52, 0x6b, 0xf9, 0xea, 0xa0, 0xcc, 0x61, 0x23, 0xb3, 0x19, 0x6a,
+ 0x9e, 0x88, 0x53, 0x3b, 0xca, 0x47, 0x1a, 0x58, 0xf2, 0x4a, 0x13, 0x6d,
+ 0x73, 0x73, 0xef, 0x23, 0x6b, 0x9b, 0xd3, 0x70, 0x93, 0x33, 0xed, 0x19,
+ 0x20, 0xf0, 0xa2, 0xca, 0xb3, 0x4b, 0x23, 0xa0, 0xb1, 0x24, 0x4e, 0x4a,
+ 0x0e, 0x5c, 0x76, 0x19, 0x81, 0xd1, 0x53, 0xb9, 0x83, 0xd9, 0x47, 0x2a,
+ 0xc9, 0xcf, 0xe1, 0xb6, 0x63, 0xb1, 0x6f, 0xe1, 0x1a, 0xb9, 0x09, 0x04,
+ 0x95, 0xda, 0x62, 0x15, 0xa9, 0x16, 0xc4, 0x45, 0x13, 0x7e, 0x49, 0xbc,
+ 0xa9, 0xbb, 0x99, 0x18, 0xac, 0xa0, 0x53, 0x6c, 0x3b, 0x46, 0xe3, 0x8b,
+ 0x7c, 0x73, 0x88, 0x6a, 0xe9, 0xb5, 0x1e, 0x8d, 0x5b, 0x09, 0xdc, 0x28,
+ 0xe3, 0xbb, 0xac, 0x32, 0xea, 0x47, 0x69, 0xd6, 0xfd, 0xfd, 0x53, 0x4d,
+ 0xed, 0x95, 0x7b, 0x5e, 0x54, 0x41, 0x39, 0xa5, 0xe8, 0xc1, 0x8c, 0xa9,
+ 0x07, 0xb1, 0x23, 0xae, 0xfe, 0x21, 0xda, 0xea, 0x9b, 0xa2, 0x0b, 0xb2,
+ 0x7f, 0xa4, 0xc3, 0xa1, 0x03, 0x18, 0xe3, 0x86, 0xfb, 0x28, 0xa5, 0xa9,
+ 0xaf, 0xd3, 0x29, 0x7f, 0x13, 0x16, 0xb9, 0xd1, 0x6e, 0x89, 0x5b, 0xc8,
+ 0x97, 0x6a, 0xce, 0x6d, 0x79, 0xd1, 0x40, 0xcb, 0x4c, 0xdd, 0xcc, 0xcf,
+ 0x73, 0xf2, 0xb6, 0xa9, 0x44, 0x8d, 0x16, 0x85, 0x89, 0x4e, 0xe9, 0x40,
+ 0xfb, 0x3b, 0xb9, 0x2b, 0xa4, 0xc4, 0xd7, 0xd7, 0xa4, 0x06, 0x93, 0x7a,
+ 0x06, 0x0f, 0xcb, 0x67, 0x71, 0x10, 0x7a, 0x22, 0xda, 0xdb, 0xf3, 0x93,
+ 0x37, 0x83, 0xce, 0xb1, 0x13, 0x7d, 0xd2, 0xc3, 0xb8, 0x53, 0x91, 0x23,
+ 0x3c, 0x15, 0xa2, 0x6c, 0x54, 0x89, 0xd0, 0xc3, 0xc6, 0x2e, 0x19, 0xe5,
+ 0x85, 0x48, 0x37, 0x90, 0xc4, 0xaa, 0x4a, 0x0a, 0x1f, 0xd5, 0xe9, 0xc2,
+ 0x74, 0x0d, 0xc3, 0x08, 0xc4, 0x84, 0x35, 0xf6, 0x1e, 0x7e, 0x2a, 0x73,
+ 0x51, 0x18, 0x61, 0xb3, 0xaa, 0xeb, 0xc1, 0xb9, 0x33, 0x49, 0xdc, 0x57,
+ 0x79, 0x29, 0x24, 0x5e, 0xb8, 0xa1, 0x4d, 0xf2, 0xaa, 0xbc, 0x2d, 0x86,
+ 0x27, 0x54, 0xbb, 0x9e, 0x9c, 0x94, 0x57, 0x74, 0x82, 0xde, 0xc6, 0x5d,
+ 0x66, 0xef, 0xcf, 0xde, 0x26, 0x1b, 0xa4, 0x5a, 0x24, 0x67, 0x16, 0xc5,
+ 0x91, 0x1e, 0xdd, 0x14, 0xe3, 0xae, 0x66, 0xad, 0xcb, 0xf6, 0xee, 0x3b,
+ 0xfa, 0xf1, 0xe0, 0xcd, 0xd9, 0xc9, 0xd1, 0x4f, 0x6c, 0xdf, 0x05, 0xcb,
+ 0xa1, 0x1f, 0x7f, 0xe5, 0x19, 0xbc, 0x08, 0x8f, 0x51, 0xc4, 0xd7, 0xcc,
+ 0xe4, 0xbe, 0xef, 0x2a, 0x67, 0xb1, 0xa8, 0x2c, 0x38, 0x1e, 0x9f, 0x1d,
+ 0x0f, 0x15, 0x7f, 0x91, 0x3b, 0xa2, 0xe7, 0x05, 0xd9, 0xa6, 0xb0, 0x3e,
+ 0xb5, 0x0d, 0x11, 0x71, 0xd1, 0x30, 0xf0, 0x88, 0xc9, 0x79, 0x18, 0x24,
+ 0x6f, 0x35, 0xad, 0x74, 0x80, 0x4d, 0xa7, 0x33, 0xf8, 0x2a, 0x47, 0xd3,
+ 0xbd, 0x6e, 0x3e, 0x20, 0x71, 0x87, 0x5c, 0xd3, 0x01, 0xba, 0xa9, 0xd7,
+ 0xd0, 0xb6, 0xce, 0x66, 0xec, 0x39, 0xee, 0xbd, 0x1f, 0x59, 0x44, 0x62,
+ 0x17, 0x51, 0x78, 0x14, 0xc4, 0x29, 0xa5, 0x10, 0x89, 0x0c, 0x16, 0xd7,
+ 0x49, 0xd7, 0x72, 0x08, 0xdf, 0x0a, 0xdd, 0x5e, 0x7e, 0xfb, 0xc9, 0xda,
+ 0x70, 0x99, 0xec, 0xaf, 0x7d, 0x42, 0x15, 0xc1, 0x77, 0xb3, 0x47, 0x9a,
+ 0xd9, 0x69, 0xc9, 0xb7, 0x0b, 0xca, 0x48, 0xeb, 0x15, 0x4f, 0xe7, 0xa7,
+ 0xeb, 0xc9, 0xf0, 0x90, 0x39, 0xe9, 0x62, 0x4d, 0x5d, 0x2c, 0xaf, 0xae,
+ 0x22, 0x00, 0x49, 0xd4, 0xf5, 0x37, 0x83, 0xeb, 0x8d, 0x3c, 0x59, 0xeb,
+ 0x75, 0xc2, 0x01, 0x14, 0x33, 0xff, 0x35, 0x04, 0x85, 0x45, 0x09, 0x2b,
+ 0xcb, 0x29, 0x69, 0xe3, 0x07, 0x1a, 0xff, 0x41, 0x7b, 0xca, 0x70, 0x38,
+ 0x56, 0x50, 0xd7, 0xbf, 0x5c, 0x4f, 0x24, 0xbc, 0x6d, 0xec, 0x68, 0xd6,
+ 0xdf, 0x20, 0xaf, 0xd7, 0x58, 0x4f, 0xbf, 0xe0, 0x16, 0x9a, 0x83, 0x64,
+ 0xfd, 0xe5, 0xba, 0x3c, 0xb7, 0x16, 0xd5, 0x42, 0xf9, 0x1d, 0x0e, 0xaf,
+ 0xb2, 0xe1, 0x30, 0xb1, 0x0e, 0x68, 0xd2, 0x6f, 0xf3, 0xe9, 0x34, 0x2b,
+ 0xc4, 0x1f, 0x49, 0x0d, 0xaa, 0x13, 0xc6, 0x4c, 0x1d, 0x88, 0x5b, 0xa4,
+ 0xab, 0x72, 0x60, 0xea, 0x3a, 0x73, 0x9e, 0x2b, 0x75, 0x4d, 0xe6, 0x19,
+ 0x68, 0x43, 0x85, 0x74, 0x86, 0x88, 0x90, 0xeb, 0x27, 0x2c, 0x5f, 0xed,
+ 0x3b, 0x29, 0x9c, 0x22, 0x4c, 0x9e, 0x09, 0x28, 0xfb, 0xd1, 0xf2, 0xd3,
+ 0x6e, 0x71, 0x27, 0x82, 0x8a, 0xa1, 0xef, 0xd8, 0x6b, 0x4d, 0x63, 0x46,
+ 0x5e, 0xaf, 0x08, 0x0d, 0xb0, 0xfc, 0x88, 0xce, 0xf1, 0x65, 0xd5, 0xf7,
+ 0x7d, 0x75, 0xab, 0x3b, 0xc6, 0xe3, 0xab, 0x56, 0x93, 0xf7, 0xa0, 0x94,
+ 0xd3, 0x83, 0xa2, 0x0b, 0xa8, 0x61, 0x3d, 0x08, 0xf1, 0xa1, 0xb8, 0xf3,
+ 0x23, 0xcb, 0x65, 0x8d, 0xca, 0xb9, 0x7a, 0x57, 0x09, 0x54, 0x6b, 0x8d,
+ 0x79, 0xcc, 0xc7, 0xed, 0x17, 0x6b, 0xb7, 0x3b, 0x25, 0x4b, 0x20, 0x01,
+ 0x7d, 0x3c, 0x56, 0xd6, 0xf9, 0xb7, 0xaa, 0x7f, 0x47, 0xfd, 0xa0, 0x84,
+ 0x7e, 0xd4, 0x33, 0x4c, 0xe4, 0x8d, 0xc6, 0xa4, 0xbe, 0x97, 0x53, 0x55,
+ 0x87, 0xa6, 0xe4, 0x2b, 0x89, 0x5a, 0xfa, 0xc1, 0x40, 0xa9, 0x3d, 0x65,
+ 0xaf, 0x6d, 0xa1, 0x2d, 0xf4, 0x38, 0x37, 0x42, 0x33, 0x36, 0x72, 0x84,
+ 0x56, 0xea, 0x51, 0x44, 0x85, 0x65, 0x9d, 0x14, 0x2c, 0x67, 0x33, 0x62,
+ 0xe0, 0x9b, 0xa7, 0x38, 0xa6, 0xbe, 0xaf, 0xf9, 0x51, 0x03, 0x2f, 0xed,
+ 0x22, 0x12, 0xd7, 0xc6, 0xfd, 0xb1, 0x57, 0x4d, 0xe1, 0x2c, 0xb8, 0x97,
+ 0x34, 0x26, 0xf2, 0x3e, 0x9b, 0xe1, 0x3f, 0x6a, 0x36, 0x2c, 0x0d, 0x9e,
+ 0xdd, 0x65, 0x93, 0x65, 0xd3, 0xae, 0xa9, 0xf4, 0xe6, 0xa4, 0x58, 0x69,
+ 0x3c, 0xad, 0x0d, 0x1c, 0x05, 0x81, 0x90, 0x5a, 0x3b, 0x53, 0xa0, 0xab,
+ 0xfd, 0xb5, 0x4d, 0x89, 0xa1, 0xa7, 0xac, 0xc1, 0xf3, 0x8f, 0x63, 0xc1,
+ 0x71, 0x9d, 0x73, 0x95, 0xb1, 0x3b, 0xdb, 0xe5, 0x89, 0x44, 0x3f, 0x6f,
+ 0x98, 0xb4, 0x9a, 0xc6, 0xbe, 0xfd, 0x9a, 0x1d, 0x9f, 0xde, 0xa7, 0x6d,
+ 0x67, 0x70, 0xf1, 0x89, 0xd6, 0xc1, 0x51, 0x0e, 0xbe, 0x5c, 0x5e, 0xc2,
+ 0x21, 0x71, 0x70, 0x63, 0xb8, 0x1b, 0xae, 0x0a, 0x7d, 0x55, 0xe9, 0x1f,
+ 0xf8, 0xa2, 0xd3, 0x59, 0x33, 0xac, 0x6f, 0x26, 0xf1, 0x1a, 0x18, 0xbf,
+ 0xc7, 0x35, 0x72, 0x09, 0xcc, 0xc3, 0xe3, 0x9b, 0xc9, 0xbe, 0xed, 0xff,
+ 0x55, 0x5b, 0x11, 0x11, 0x06, 0x1c, 0xeb, 0xfb, 0x62, 0x72, 0xfd, 0xea,
+ 0xed, 0x38, 0x3e, 0x34, 0xf3, 0x34, 0xef, 0x36, 0x5c, 0x18, 0x29, 0x9e,
+ 0x37, 0xb7, 0x11, 0xe1, 0x5c, 0xe2, 0x1a, 0x13, 0x70, 0x50, 0x73, 0xd5,
+ 0x1f, 0x78, 0xbf, 0x8b, 0x0f, 0xd7, 0x7a, 0xc1, 0x3a, 0xe3, 0xe8, 0x7a,
+ 0xe1, 0xa3, 0x2c, 0xfa, 0x07, 0x6a, 0x3f, 0x86, 0x29, 0x11, 0xa4, 0xac,
+ 0x62, 0x6a, 0x94, 0xdd, 0x59, 0x0a, 0xd8, 0x18, 0xae, 0x92, 0x21, 0xab,
+ 0xfe, 0x64, 0xab, 0x0b, 0xc3, 0x1c, 0xb3, 0xbc, 0x45, 0x2a, 0x87, 0xb7,
+ 0x20, 0xbf, 0xd4, 0x14, 0x1a, 0x8d, 0x24, 0x6b, 0x5c, 0x2d, 0x18, 0xec,
+ 0xf0, 0x3a, 0xad, 0x0e, 0xcb, 0xe2, 0x26, 0x3e, 0xab, 0x4e, 0x5d, 0x0d,
+ 0xd7, 0x8d, 0x7a, 0xdf, 0x9d, 0x98, 0xb7, 0xd3, 0x49, 0x03, 0x3c, 0x40,
+ 0x20, 0x60, 0x6a, 0x12, 0x62, 0x7c, 0xb8, 0x0d, 0x44, 0x28, 0x8e, 0xbe,
+ 0x3e, 0x7c, 0x75, 0x7c, 0xb8, 0xd9, 0x9d, 0xc9, 0x2b, 0xe0, 0x00, 0xf0,
+ 0x36, 0x69, 0xc7, 0x53, 0x52, 0x1c, 0x95, 0xe9, 0xbc, 0x29, 0xe0, 0x51,
+ 0x2b, 0xa6, 0x58, 0x45, 0xea, 0xf9, 0xe4, 0x1c, 0x05, 0x97, 0x68, 0xb3,
+ 0x03, 0x01, 0x05, 0xc1, 0x0e, 0xc9, 0x32, 0xcf, 0xe6, 0x14, 0x01, 0xb5,
+ 0x77, 0x34, 0x23, 0xf4, 0x91, 0x8e, 0x47, 0x9f, 0x1b, 0xc6, 0x87, 0x9b,
+ 0x92, 0x26, 0x49, 0x97, 0x3d, 0x17, 0x0f, 0xfc, 0x4b, 0x77, 0x11, 0x82,
+ 0x79, 0x1d, 0x7f, 0x59, 0x01, 0xb1, 0x19, 0x62, 0x95, 0x03, 0x38, 0xc1,
+ 0x86, 0xd0, 0x46, 0xed, 0xf2, 0x7f, 0xb6, 0x76, 0x2d, 0xb1, 0x6d, 0x31,
+ 0x29, 0xa8, 0x60, 0x24, 0xf5, 0x28, 0xf2, 0xda, 0x9e, 0xbc, 0xb6, 0xb7,
+ 0xea, 0xb5, 0xc8, 0x7b, 0x63, 0xf6, 0x37, 0xad, 0x38, 0x36, 0x41, 0x1d,
+ 0x8e, 0x7e, 0x60, 0x25, 0x2e, 0xe9, 0xab, 0xb7, 0xed, 0x01, 0x6c, 0x00,
+ 0x8e, 0x7e, 0x33, 0xd4, 0x5a, 0x54, 0xb9, 0xfe, 0x3d, 0xfd, 0x3d, 0xe2,
+ 0xea, 0x3a, 0xbb, 0x79, 0xe6, 0x85, 0x1f, 0x49, 0x4f, 0xc6, 0x8f, 0xac,
+ 0x96, 0x18, 0xbc, 0xf1, 0xb1, 0xba, 0x78, 0x62, 0xfe, 0xf3, 0x1d, 0xfd,
+ 0xe7, 0x92, 0xbd, 0xa5, 0xab, 0xe9, 0x7e, 0x62, 0x6c, 0xfe, 0x2c, 0x12,
+ 0xfb, 0x0e, 0xc8, 0x60, 0x57, 0xe1, 0x52, 0x13, 0xcc, 0x85, 0x32, 0xa3,
+ 0xd7, 0x39, 0xc6, 0x37, 0x90, 0x50, 0x1f, 0x7e, 0x54, 0xf5, 0x1d, 0x77,
+ 0xb3, 0x8c, 0xdd, 0x6f, 0xbe, 0x0e, 0xa6, 0x61, 0xb8, 0xfd, 0x6f, 0x24,
+ 0xcb, 0xec, 0x81, 0x36, 0x2c, 0xd7, 0x3a, 0xcc, 0x97, 0x7e, 0x16, 0x1e,
+ 0x7f, 0xc8, 0x1e, 0xf0, 0xb0, 0xca, 0x40, 0xed, 0xef, 0xde, 0x65, 0xbf,
+ 0x31, 0x7a, 0x09, 0xdd, 0x67, 0x8f, 0x5e, 0xb5, 0x7d, 0xa1, 0x3b, 0x10,
+ 0x45, 0x3d, 0xc7, 0xe3, 0x93, 0x47, 0x0f, 0xa4, 0x61, 0xd2, 0xd5, 0x99,
+ 0xa5, 0x30, 0x5a, 0xe4, 0x3f, 0x21, 0x3a, 0xbd, 0xb7, 0xae, 0x5f, 0xf9,
+ 0x5a, 0x37, 0x8e, 0x33, 0x3e, 0xd1, 0xff, 0xd0, 0x73, 0xd7, 0x2a, 0xe8,
+ 0xce, 0x96, 0x17, 0x33, 0xb3, 0x19, 0xe3, 0xe5, 0xe5, 0x65, 0x7e, 0x97,
+ 0x9c, 0x50, 0x49, 0x1e, 0xcb, 0x10, 0xa8, 0xdb, 0x9a, 0xe0, 0xd9, 0x47,
+ 0x7e, 0xbe, 0x74, 0xe8, 0x30, 0xf2, 0x69, 0x6c, 0x95, 0x11, 0xb9, 0xba,
+ 0x7a, 0x56, 0x7d, 0xd6, 0x16, 0xfc, 0xad, 0x7a, 0x79, 0xd9, 0x23, 0x84,
+ 0xcc, 0x14, 0xb2, 0x3a, 0xb4, 0x84, 0xb8, 0x47, 0x9e, 0xfe, 0xe7, 0x97,
+ 0xac, 0x7a, 0xcc, 0xab, 0xf6, 0x50, 0xac, 0xc0, 0xd3, 0x84, 0x14, 0x41,
+ 0x77, 0xa3, 0x43, 0xe3, 0x84, 0x27, 0x50, 0x87, 0x19, 0x30, 0x58, 0x4b,
+ 0x98, 0x51, 0xe5, 0x8b, 0x16, 0x44, 0xce, 0xcc, 0x9f, 0x14, 0x20, 0x1b,
+ 0xb3, 0xe1, 0x53, 0xc6, 0x00, 0x3c, 0xc8, 0xd8, 0xd5, 0xff, 0xac, 0x9c,
+ 0xab, 0x14, 0x4b, 0xf5, 0xa8, 0x0f, 0xa8, 0x40, 0x1b, 0x33, 0xce, 0xd5,
+ 0x3b, 0xce, 0x67, 0x39, 0x13, 0xbb, 0x74, 0x73, 0x15, 0x49, 0x7a, 0x08,
+ 0x6d, 0x76, 0x3e, 0x86, 0xb8, 0x48, 0x99, 0x52, 0x63, 0x64, 0x48, 0xf5,
+ 0x2c, 0x1d, 0xa9, 0x54, 0x9c, 0x43, 0x65, 0x3f, 0x12, 0xd7, 0x5d, 0x86,
+ 0xb7, 0xa4, 0x1f, 0x03, 0x69, 0x8a, 0x02, 0x5e, 0xc9, 0x4b, 0xd6, 0x84,
+ 0xa3, 0xdd, 0xd4, 0xb9, 0xe5, 0xaf, 0xa0, 0x80, 0xf8, 0x3a, 0x33, 0xcc,
+ 0x0f, 0x84, 0x60, 0x52, 0x6a, 0xa4, 0x2a, 0x99, 0xba, 0xe4, 0xb8, 0x9f,
+ 0xb2, 0x94, 0x0a, 0x13, 0xc7, 0x2b, 0x01, 0x1b, 0x10, 0xef, 0x46, 0x22,
+ 0x4e, 0x1a, 0x89, 0xa7, 0x20, 0x07, 0x33, 0x05, 0x7c, 0x18, 0x9c, 0x55,
+ 0x8c, 0x5a, 0xc5, 0x61, 0x1d, 0xc3, 0x7c, 0xd3, 0x98, 0x01, 0xda, 0x0e,
+ 0x05, 0x2a, 0xca, 0x48, 0xcd, 0xfe, 0x5a, 0xf9, 0x4a, 0xe8, 0x63, 0x4a,
+ 0xeb, 0x98, 0xc5, 0xd8, 0xc0, 0x76, 0x4f, 0xd6, 0x78, 0x3e, 0x6b, 0x02,
+ 0xfa, 0xa3, 0x41, 0x04, 0x64, 0xe9, 0xa9, 0x81, 0xc3, 0x26, 0x82, 0x8c,
+ 0xcf, 0x5e, 0xc8, 0x48, 0xe2, 0x85, 0xa8, 0xbc, 0x5f, 0x69, 0xb2, 0xdf,
+ 0x9a, 0x66, 0x89, 0xb4, 0x7c, 0x1b, 0x76, 0x38, 0x4b, 0x95, 0x08, 0xd4,
+ 0x08, 0xe7, 0xce, 0xa0, 0x74, 0x81, 0x76, 0xcd, 0x0c, 0x3a, 0x5c, 0x8b,
+ 0xeb, 0xfd, 0x96, 0x06, 0x89, 0x6d, 0x56, 0xdb, 0x32, 0x50, 0xf5, 0x2b,
+ 0xea, 0x8f, 0xa8, 0x97, 0x17, 0xc6, 0x8a, 0x6c, 0x96, 0x21, 0x3f, 0x4a,
+ 0x64, 0x11, 0xc0, 0x2c, 0x88, 0x12, 0xd1, 0x4e, 0x38, 0xf4, 0x14, 0x58,
+ 0xa3, 0x94, 0x13, 0xdc, 0x00, 0x16, 0x5e, 0x12, 0x2d, 0x2f, 0x18, 0x72,
+ 0x62, 0x56, 0xde, 0x76, 0xa5, 0xe3, 0x01, 0x05, 0xa3, 0xdd, 0xec, 0xda,
+ 0x55, 0x97, 0x66, 0x80, 0xdf, 0xff, 0xa7, 0xfe, 0xf2, 0x03, 0x11, 0xeb,
+ 0xef, 0x4a, 0x2c, 0x99, 0x76, 0x1a, 0xe0, 0x83, 0xc0, 0x0d, 0xf0, 0x7b,
+ 0x10, 0xe5, 0x2f, 0x94, 0xf9, 0xc6, 0x94, 0x21, 0x18, 0x2e, 0x0c, 0xf7,
+ 0xfb, 0x91, 0xbd, 0xba, 0x75, 0x08, 0xc2, 0x3b, 0x60, 0xa7, 0xc6, 0xc5,
+ 0x7d, 0xe0, 0x3a, 0x23, 0x1e, 0xfc, 0xa9, 0x18, 0x00, 0x64, 0xdd, 0x58,
+ 0x9e, 0x04, 0x4f, 0xc4, 0x1d, 0xb9, 0x79, 0x1b, 0x7f, 0xaa, 0x04, 0x59,
+ 0xcb, 0xd8, 0x5c, 0x12, 0x3e, 0xe2, 0x9f, 0xc7, 0x0d, 0x20, 0x9b, 0x51,
+ 0xaa, 0x74, 0x6e, 0x41, 0xad, 0x99, 0x91, 0xd2, 0x6a, 0x6a, 0x5d, 0x06,
+ 0x17, 0x0a, 0x7c, 0xc4, 0xac, 0xda, 0xdd, 0x7b, 0x80, 0x13, 0x09, 0xf8,
+ 0xbc, 0xbe, 0xca, 0x3d, 0x1c, 0x6d, 0x7c, 0xf5, 0xf7, 0xff, 0xc9, 0xd9,
+ 0xa2, 0x7f, 0x0f, 0xef, 0xb2, 0xd3, 0xf3, 0xa3, 0x7d, 0x4c, 0xe9, 0xf7,
+ 0xc3, 0xfa, 0x7e, 0x7e, 0x51, 0xce, 0xe4, 0xd4, 0x11, 0xed, 0x0d, 0x01,
+ 0xf5, 0x67, 0xcc, 0x23, 0x08, 0x9b, 0x0e, 0x3d, 0xe4, 0x9e, 0x41, 0xb4,
+ 0x2b, 0x0d, 0xec, 0xc5, 0xa4, 0x9c, 0x70, 0x11, 0x35, 0x55, 0xb4, 0x98,
+ 0xd3, 0xf7, 0xfb, 0x44, 0xe1, 0x78, 0xb8, 0xc5, 0xb5, 0x34, 0x32, 0xf7,
+ 0xe0, 0x72, 0xe3, 0x85, 0xbd, 0x51, 0xfa, 0x79, 0x8c, 0x62, 0xad, 0xbc,
+ 0x18, 0xe6, 0x11, 0x09, 0x0b, 0x33, 0xcd, 0x0f, 0xa8, 0xd4, 0xe5, 0x57,
+ 0x0f, 0xf9, 0x47, 0xc3, 0x73, 0xfa, 0x91, 0x24, 0x83, 0x6b, 0x00, 0x91,
+ 0xb8, 0x53, 0xeb, 0x91, 0x06, 0x91, 0xa2, 0xf8, 0x24, 0x96, 0xbf, 0x49,
+ 0xb6, 0x88, 0x11, 0x34, 0xc1, 0x3c, 0xf5, 0x5c, 0x7f, 0xc8, 0x80, 0xc5,
+ 0x9d, 0xdf, 0x64, 0xab, 0x47, 0x03, 0x5f, 0x90, 0x02, 0x32, 0x07, 0x10,
+ 0xad, 0x97, 0x49, 0xec, 0x20, 0x89, 0x18, 0xfd, 0x8f, 0x03, 0xdb, 0xa3,
+ 0x87, 0x86, 0xe3, 0xe8, 0x0f, 0xdc, 0x52, 0x92, 0x1d, 0x46, 0x4e, 0x40,
+ 0xaf, 0x37, 0x4e, 0x43, 0x45, 0x5a, 0x14, 0x0d, 0xc0, 0xb8, 0x0f, 0xac,
+ 0x15, 0x30, 0xb0, 0x2c, 0xb8, 0xfc, 0x66, 0xd9, 0x94, 0x03, 0xe1, 0x92,
+ 0x20, 0x38, 0xeb, 0xa1, 0xa2, 0x6c, 0x89, 0xd5, 0xc3, 0xb9, 0x54, 0x0a,
+ 0x89, 0xa0, 0x1d, 0x93, 0xcb, 0x11, 0x79, 0x2f, 0x4b, 0x76, 0x56, 0xe6,
+ 0xa8, 0x6e, 0x9a, 0x93, 0x7f, 0x39, 0x12, 0xf2, 0x4f, 0x62, 0xee, 0x46,
+ 0x04, 0xaa, 0xff, 0xdd, 0xcb, 0xc9, 0x60, 0x0b, 0x7d, 0xe8, 0xe5, 0x62,
+ 0x8c, 0x04, 0xd8, 0x75, 0xf5, 0x70, 0x5c, 0xa4, 0xf1, 0x6c, 0xb4, 0x1d,
+ 0x58, 0x84, 0x97, 0xcd, 0xe2, 0x83, 0x61, 0x8e, 0xea, 0xfe, 0x03, 0xa5,
+ 0x32, 0x63, 0xcf, 0x34, 0xfa, 0x81, 0x1f, 0x80, 0xb4, 0x8c, 0x92, 0xb1,
+ 0x5c, 0xd0, 0x38, 0x60, 0xf2, 0x59, 0xc9, 0xe6, 0xdc, 0x43, 0xcb, 0x68,
+ 0x27, 0x0d, 0xfb, 0xe8, 0x51, 0x1b, 0xed, 0xee, 0x8f, 0x4f, 0x82, 0x89,
+ 0x51, 0x96, 0xd2, 0x07, 0x64, 0x11, 0x58, 0x66, 0x32, 0x37, 0x5f, 0x56,
+ 0xe5, 0x13, 0xbf, 0x9b, 0x32, 0x1e, 0x00, 0x3f, 0x31, 0xfe, 0x2d, 0xa5,
+ 0x15, 0x44, 0xe1, 0xcf, 0x3b, 0xff, 0x83, 0x9f, 0xda, 0x45, 0xd6, 0x34,
+ 0x23, 0x16, 0x57, 0xa0, 0x99, 0x26, 0x25, 0x5f, 0x79, 0xa9, 0x20, 0x61,
+ 0x7f, 0x8a, 0xce, 0xff, 0xd0, 0x5f, 0x61, 0x57, 0x3a, 0x65, 0xcf, 0xf2,
+ 0xb4, 0xb6, 0x33, 0xe4, 0x25, 0xe0, 0x48, 0x61, 0xc1, 0x82, 0xea, 0xf7,
+ 0xe0, 0x39, 0xe4, 0x3c, 0x45, 0x52, 0x40, 0x46, 0x3d, 0x94, 0xe1, 0xec,
+ 0xf2, 0x2e, 0x65, 0xfa, 0x09, 0xa2, 0x6b, 0x1e, 0xae, 0xfe, 0xb6, 0xc2,
+ 0x1f, 0x6e, 0x48, 0xb4, 0x11, 0x76, 0xe7, 0x26, 0x67, 0x13, 0x80, 0x19,
+ 0x14, 0x2a, 0x51, 0x73, 0x14, 0x56, 0x0f, 0xb7, 0xd1, 0xee, 0xd3, 0xde,
+ 0xb3, 0xcf, 0x16, 0xa0, 0x86, 0x85, 0x06, 0xfd, 0x2c, 0x71, 0xa8, 0x35,
+ 0xac, 0xfa, 0xd3, 0x7a, 0x12, 0x2b, 0x7a, 0x14, 0xc8, 0xe2, 0x17, 0x7c,
+ 0xfe, 0xe9, 0x76, 0x84, 0xff, 0xff, 0x52, 0xe3, 0xb3, 0xf6, 0xd6, 0x4e,
+ 0xfe, 0x7d, 0x7c, 0xfa, 0x36, 0x29, 0x2f, 0xfe, 0x42, 0xc4, 0x65, 0x9d,
+ 0x8b, 0x52, 0xd4, 0xad, 0x50, 0xfe, 0x98, 0x45, 0x2a, 0x40, 0x90, 0xa8,
+ 0xfe, 0x21, 0x5f, 0xf8, 0x82, 0xef, 0xf8, 0x0c, 0xad, 0x8c, 0x51, 0x63,
+ 0x25, 0x52, 0x99, 0xf3, 0xd9, 0x29, 0x89, 0x46, 0x7e, 0x00, 0xf1, 0xf0,
+ 0xe0, 0x8e, 0x4c, 0x18, 0xb7, 0x03, 0x7e, 0x2f, 0xaf, 0xa6, 0x71, 0xa8,
+ 0x9a, 0x9e, 0xba, 0xc1, 0xc8, 0x5c, 0x7f, 0x12, 0x89, 0xba, 0x25, 0x11,
+ 0x3b, 0xdf, 0xa7, 0xcb, 0xee, 0x8b, 0x08, 0x5d, 0x78, 0x49, 0xd0, 0xa9,
+ 0xed, 0x92, 0x78, 0xfe, 0xad, 0x46, 0x3d, 0xed, 0x85, 0x78, 0x33, 0x7d,
+ 0x60, 0x49, 0x6e, 0x19, 0x0f, 0xce, 0x44, 0x01, 0x03, 0x3c, 0xe2, 0x82,
+ 0x3f, 0xe4, 0xe7, 0x1a, 0xdb, 0xee, 0x4c, 0x83, 0x6d, 0xf5, 0x87, 0x89,
+ 0xcb, 0x65, 0x77, 0xfe, 0x24, 0x9e, 0xef, 0x46, 0x26, 0x61, 0x96, 0xfb,
+ 0xc1, 0xf5, 0x99, 0x48, 0xde, 0xf2, 0xea, 0x69, 0xf9, 0x46, 0xc7, 0x72,
+ 0x1d, 0x28, 0x08, 0x6f, 0x54, 0x27, 0x23, 0xf3, 0x88, 0xda, 0x06, 0x49,
+ 0xc4, 0x54, 0xe8, 0x9c, 0x94, 0xbd, 0xe8, 0x1c, 0x6c, 0x76, 0xac, 0x3d,
+ 0xf7, 0xb2, 0x0b, 0x56, 0x22, 0x76, 0xc2, 0x34, 0x1e, 0x49, 0x56, 0xcf,
+ 0x41, 0x51, 0xb9, 0x36, 0x28, 0x44, 0x9c, 0x22, 0xff, 0xce, 0x9c, 0x3a,
+ 0x4a, 0x31, 0x5f, 0xfd, 0x9e, 0xed, 0xfa, 0x4d, 0x50, 0x24, 0x28, 0x75,
+ 0xf5, 0x10, 0x84, 0x08, 0x30, 0x74, 0x59, 0xb3, 0x63, 0xfc, 0x78, 0x4c,
+ 0xca, 0x59, 0xa0, 0xd8, 0x26, 0xb1, 0xf4, 0xdf, 0x36, 0x35, 0x9e, 0xef,
+ 0xf5, 0xec, 0x88, 0x7e, 0xba, 0xb6, 0x3b, 0x02, 0x4a, 0xe8, 0x0f, 0x59,
+ 0x0c, 0x92, 0x4a, 0x73, 0x59, 0x52, 0xc2, 0xbe, 0x63, 0x94, 0xc7, 0xb1,
+ 0xc5, 0x23, 0xf6, 0x04, 0xd2, 0xf1, 0x43, 0x5d, 0xcf, 0x48, 0x84, 0xe5,
+ 0x97, 0xf7, 0x66, 0x4a, 0x75, 0x2f, 0xf8, 0x94, 0xcf, 0xc2, 0xfc, 0x9c,
+ 0x9e, 0x1f, 0xcf, 0xc5, 0xb7, 0x5e, 0xc3, 0x47, 0xb0, 0xc8, 0x28, 0x35,
+ 0x8c, 0x81, 0xfc, 0x1f, 0x92, 0x0f, 0xa4, 0x5e, 0xe1, 0xf3, 0x2e, 0xce,
+ 0x2c, 0xf2, 0xdf, 0xaa, 0x81, 0xa3, 0x64, 0x5b, 0x1c, 0x29, 0x0f, 0x5e,
+ 0x8d, 0xad, 0x91, 0x68, 0x10, 0x97, 0x5a, 0xd1, 0x26, 0xc8, 0xd3, 0xd8,
+ 0x41, 0x51, 0xea, 0x7f, 0x80, 0x3b, 0x86, 0xf3, 0x21, 0xa4, 0xe4, 0xc4,
+ 0xb2, 0x18, 0x0d, 0x8a, 0x93, 0xa2, 0x19, 0x0d, 0xc3, 0x13, 0xd2, 0x71,
+ 0x66, 0x91, 0x3e, 0x05, 0x49, 0x04, 0x18, 0x07, 0xed, 0x0b, 0x51, 0x80,
+ 0xe1, 0xb6, 0x7a, 0xa3, 0x94, 0x02, 0xf2, 0x21, 0xd5, 0xbd, 0x0f, 0xf1,
+ 0x8b, 0xa4, 0xd7, 0x55, 0xe7, 0x89, 0x96, 0xcd, 0x81, 0x66, 0xca, 0xaa,
+ 0x0a, 0x2e, 0x36, 0x0c, 0xb0, 0x77, 0x71, 0x9f, 0x4f, 0xa8, 0xd3, 0x17,
+ 0x12, 0x3a, 0xd3, 0xcf, 0x1e, 0x75, 0x12, 0xa4, 0x01, 0x26, 0x4c, 0xe8,
+ 0x2b, 0x60, 0x15, 0x96, 0x1d, 0x56, 0x32, 0xca, 0x42, 0x84, 0x72, 0xa4,
+ 0x24, 0xd9, 0x5b, 0xe4, 0xdc, 0xe9, 0x4d, 0xe6, 0x2a, 0xe9, 0xdc, 0x24,
+ 0x9c, 0x4f, 0x6d, 0x05, 0xee, 0x2f, 0x93, 0xb8, 0xf6, 0xe2, 0x90, 0x7b,
+ 0x03, 0xd7, 0x46, 0x59, 0x75, 0x2e, 0x86, 0x87, 0x14, 0x9e, 0xa8, 0xac,
+ 0x96, 0x35, 0xe8, 0xb5, 0xe1, 0xad, 0xe1, 0xc1, 0x4b, 0xe3, 0x37, 0xbe,
+ 0x35, 0xda, 0xfa, 0xd7, 0x27, 0x51, 0x1f, 0x55, 0x3f, 0x34, 0xaa, 0x92,
+ 0xf6, 0x5d, 0x90, 0xc6, 0x0b, 0x70, 0x10, 0xac, 0x59, 0x0d, 0x76, 0x6d,
+ 0xf3, 0x97, 0x28, 0x49, 0x31, 0xde, 0x90, 0x44, 0xfe, 0x96, 0x65, 0x85,
+ 0xcc, 0x6e, 0xf9, 0xc5, 0x46, 0xed, 0x50, 0xed, 0xa9, 0xee, 0x77, 0x6a,
+ 0xfd, 0x89, 0x9b, 0x31, 0x20, 0xcc, 0xae, 0xb1, 0x61, 0xa6, 0xeb, 0x2b,
+ 0x56, 0xb8, 0x52, 0x1f, 0x3c, 0xe9, 0x84, 0x24, 0xfa, 0xc1, 0x76, 0x9b,
+ 0xe2, 0x30, 0x68, 0xd9, 0x50, 0xd6, 0xd4, 0xdc, 0xd0, 0x11, 0xa2, 0x8d,
+ 0x31, 0x61, 0x9d, 0x18, 0xd6, 0xa7, 0x23, 0x2e, 0x47, 0x8c, 0xa6, 0x19,
+ 0x15, 0xab, 0x46, 0xd3, 0x72, 0x67, 0x3b, 0x14, 0xae, 0x8c, 0x07, 0xe4,
+ 0x46, 0x0c, 0x96, 0x01, 0x5f, 0xb4, 0x68, 0xe1, 0x4c, 0x53, 0xfe, 0xe4,
+ 0x8a, 0x15, 0x78, 0x0e, 0xa6, 0xd5, 0x5f, 0xf4, 0x05, 0x5e, 0xfc, 0xd3,
+ 0x52, 0xc9, 0x94, 0x3c, 0x8e, 0x74, 0x5a, 0x8c, 0x13, 0x8e, 0x45, 0x8d,
+ 0xb6, 0xdc, 0x3e, 0xd0, 0x58, 0x29, 0xa5, 0xe5, 0x5c, 0x79, 0xad, 0xc0,
+ 0xb8, 0x3d, 0x9b, 0x33, 0xbb, 0xcd, 0x4d, 0x50, 0x2f, 0xa9, 0x5f, 0xc1,
+ 0xe5, 0x43, 0xca, 0x22, 0xc3, 0xea, 0xb1, 0x9f, 0xd3, 0x8e, 0x47, 0xd8,
+ 0xbf, 0xed, 0x1e, 0x65, 0x3d, 0xb3, 0xb2, 0x4b, 0x04, 0x71, 0x75, 0x5a,
+ 0x5a, 0xc3, 0xf5, 0x1b, 0xcd, 0x8a, 0x47, 0x7b, 0xcc, 0x9c, 0xfe, 0xd1,
+ 0x5b, 0xba, 0x7b, 0x2f, 0x73, 0x83, 0x1d, 0xbd, 0x2f, 0x1f, 0x75, 0x75,
+ 0xad, 0xbe, 0x98, 0x5b, 0x77, 0xef, 0xc3, 0x67, 0xb6, 0xef, 0x62, 0xde,
+ 0x89, 0x09, 0x44, 0x69, 0xaf, 0xa0, 0xff, 0x7b, 0xcd, 0xa9, 0xe6, 0xe4,
+ 0x2f, 0xa7, 0xde, 0x3d, 0x09, 0x4a, 0xc4, 0xe1, 0xff, 0xb8, 0x85, 0xff,
+ 0xc3, 0x79, 0xcb, 0xe3, 0x10, 0x02, 0x49, 0xa4, 0x98, 0x06, 0xc6, 0x88,
+ 0x3a, 0xfe, 0x38, 0x2b, 0x53, 0xfd, 0x77, 0xec, 0xc0, 0x1b, 0x3d, 0xfe,
+ 0x7a, 0x79, 0xb6, 0x17, 0x5f, 0x03, 0x66, 0xf4, 0x89, 0xd7, 0xd0, 0xef,
+ 0xbb, 0x1c, 0x25, 0x3e, 0xe8, 0xf6, 0xea, 0xe1, 0xa4, 0xe4, 0x87, 0xdd,
+ 0x9d, 0x7e, 0x53, 0x4d, 0xa6, 0x0c, 0x43, 0xb0, 0x23, 0x28, 0x97, 0x70,
+ 0x48, 0xe1, 0x01, 0xbb, 0x1c, 0x2f, 0x68, 0x25, 0x06, 0xd7, 0xca, 0xb7,
+ 0x6f, 0x8e, 0x28, 0xc9, 0xe8, 0x52, 0xf8, 0x90, 0x2e, 0x16, 0x72, 0x77,
+ 0x3e, 0xc2, 0x63, 0xc7, 0xb8, 0xba, 0xdc, 0x44, 0x9e, 0x1a, 0x19, 0x0e,
+ 0xb8, 0x98, 0xa0, 0xfc, 0xe8, 0xca, 0x13, 0x60, 0x20, 0x24, 0xcb, 0xe2,
+ 0x41, 0x96, 0x9f, 0xe9, 0xb9, 0xd9, 0x1a, 0x8f, 0xbf, 0xdd, 0xca, 0x9a,
+ 0x89, 0xde, 0xe1, 0x5b, 0x2e, 0x97, 0x56, 0x7c, 0x44, 0x0f, 0xeb, 0xe4,
+ 0xd0, 0x23, 0xd0, 0x4f, 0x96, 0x98, 0xdf, 0x46, 0x5f, 0x1e, 0xc1, 0xfb,
+ 0x20, 0x42, 0xdb, 0x63, 0xf2, 0x09, 0x96, 0x49, 0xed, 0x08, 0xf4, 0x23,
+ 0x6d, 0xc7, 0x17, 0x26, 0xbd, 0xc1, 0x90, 0xde, 0x77, 0xf7, 0x9b, 0x0f,
+ 0x9f, 0x6c, 0xb7, 0xb8, 0xe8, 0x52, 0xc8, 0xff, 0x47, 0x09, 0x74, 0xcb,
+ 0xc5, 0x7f, 0xcb, 0x7e, 0x7a, 0x69, 0x39, 0x48, 0x37, 0x7c, 0x78, 0xc2,
+ 0x0b, 0x72, 0xb5, 0xb1, 0xb6, 0xf4, 0xf0, 0x8c, 0x1f, 0x3d, 0xe1, 0xc7,
+ 0xcd, 0x58, 0x0b, 0x29, 0x48, 0xb3, 0xb7, 0x2a, 0x1b, 0xcd, 0x19, 0x51,
+ 0x14, 0x69, 0xc3, 0x40, 0x25, 0x44, 0x57, 0x61, 0xc6, 0x47, 0xd4, 0x05,
+ 0xad, 0x39, 0x6f, 0x9c, 0x44, 0x96, 0x0d, 0xed, 0xa0, 0x92, 0x4e, 0x5f,
+ 0x4b, 0xe6, 0xfd, 0x55, 0xf9, 0xe0, 0xec, 0x52, 0xe9, 0x83, 0x40, 0xd7,
+ 0x82, 0x17, 0x21, 0x9a, 0x28, 0xff, 0x78, 0x25, 0x74, 0x86, 0x75, 0x1e,
+ 0x1a, 0x8e, 0xf4, 0x3d, 0x2e, 0x1b, 0xbd, 0xa1, 0xf4, 0xa6, 0x9e, 0xbd,
+ 0xb0, 0x56, 0xca, 0x43, 0xc4, 0xa6, 0x9c, 0xa7, 0xd9, 0xcc, 0x5a, 0x35,
+ 0x0f, 0x5e, 0x49, 0xe6, 0x3a, 0x5b, 0x28, 0x79, 0x88, 0x2f, 0xa4, 0xeb,
+ 0x33, 0xb1, 0xe9, 0x40, 0x0f, 0xc6, 0x20, 0x79, 0x34, 0x2b, 0x20, 0x1e,
+ 0xa6, 0xa4, 0x75, 0xa8, 0xee, 0xd8, 0x4b, 0x4a, 0x66, 0xe1, 0x5f, 0xa6,
+ 0x13, 0xdb, 0xfe, 0xec, 0xa1, 0xd9, 0xa5, 0xdc, 0x09, 0xb5, 0x43, 0x05,
+ 0xce, 0xca, 0x6b, 0x69, 0x14, 0xc8, 0x35, 0x7c, 0xd4, 0x75, 0x9e, 0x0b,
+ 0xea, 0xa5, 0xcd, 0xb3, 0xf0, 0xa9, 0x55, 0x3b, 0xf9, 0xfc, 0x88, 0x0b,
+ 0x2f, 0xea, 0x5e, 0xc0, 0x54, 0x31, 0xf3, 0xc7, 0x1f, 0x9f, 0x4f, 0x70,
+ 0xe0, 0x39, 0xe3, 0x93, 0x54, 0xd2, 0xee, 0xc1, 0xc1, 0x5d, 0x76, 0xa1,
+ 0x27, 0xeb, 0x61, 0x37, 0x17, 0xea, 0x5d, 0x24, 0xa7, 0xcc, 0x25, 0x8f,
+ 0x76, 0x44, 0x04, 0x47, 0x1e, 0x67, 0x75, 0xf9, 0xb0, 0x16, 0x88, 0x1d,
+ 0xf0, 0x5a, 0xf6, 0x51, 0xef, 0x13, 0xf6, 0xb2, 0x1b, 0x3b, 0x88, 0x0e,
+ 0x4e, 0xa3, 0x4c, 0xf3, 0xb0, 0xe3, 0xdb, 0xec, 0x61, 0xfc, 0xc4, 0x88,
+ 0x55, 0xd0, 0x36, 0x12, 0x42, 0x2a, 0x2b, 0x7a, 0x08, 0x27, 0xc2, 0x22,
+ 0x5b, 0xfd, 0x31, 0x4c, 0x44, 0xb6, 0x64, 0xe4, 0xac, 0xa2, 0xab, 0x8c,
+ 0x1a, 0x65, 0xfc, 0x65, 0x5b, 0x53, 0x0a, 0x63, 0x35, 0xe3, 0x28, 0x29,
+ 0xbd, 0xee, 0x4a, 0xa3, 0x60, 0x53, 0x93, 0x3e, 0x39, 0x7c, 0x28, 0x20,
+ 0x84, 0xd8, 0x19, 0x05, 0xcf, 0x90, 0x91, 0x8d, 0xa2, 0x44, 0x8a, 0x9e,
+ 0x69, 0x98, 0x5e, 0x3c, 0x2c, 0xda, 0x07, 0x65, 0xff, 0x31, 0x5e, 0xbb,
+ 0xfa, 0x53, 0x62, 0x30, 0xdf, 0xa5, 0xe6, 0x0c, 0xc4, 0xaa, 0x6d, 0xea,
+ 0x14, 0xb7, 0x90, 0x6b, 0x50, 0xc5, 0x15, 0x52, 0x6d, 0x78, 0x3f, 0xee,
+ 0x93, 0xa9, 0x88, 0x8d, 0xd0, 0x4c, 0x23, 0x05, 0x59, 0x46, 0xad, 0x47,
+ 0xd9, 0x10, 0x5f, 0x16, 0xc6, 0xa2, 0x4e, 0x51, 0x8b, 0x45, 0xbb, 0x9c,
+ 0xdd, 0x35, 0x1c, 0x05, 0xc3, 0xef, 0x68, 0x2e, 0xd4, 0x09, 0x93, 0x52,
+ 0x2f, 0x1c, 0xbc, 0x73, 0xa4, 0x46, 0x49, 0x4a, 0xf2, 0xf1, 0x35, 0xeb,
+ 0x7d, 0xbc, 0x9b, 0x5e, 0x8d, 0xca, 0x2a, 0xa7, 0xfb, 0x06, 0x29, 0xd8,
+ 0x3a, 0x18, 0xf1, 0xfd, 0x00, 0xf2, 0x84, 0xac, 0xc7, 0xd8, 0x70, 0x1a,
+ 0xff, 0x4d, 0x12, 0x0e, 0x00, 0x07, 0x43, 0xcf, 0xc1, 0xaf, 0xf4, 0x3b,
+ 0x3b, 0xaa, 0xa0, 0xc0, 0xc4, 0xa0, 0x32, 0xb4, 0xa2, 0xcd, 0x36, 0x1b,
+ 0xd7, 0x34, 0x1a, 0xbb, 0x5a, 0xb7, 0x50, 0xca, 0x14, 0x30, 0x8c, 0x57,
+ 0x31, 0x28, 0x47, 0xe0, 0x59, 0xcb, 0xeb, 0x7a, 0x89, 0x0d, 0x7b, 0x7d,
+ 0x7c, 0x72, 0x64, 0xb3, 0x83, 0xff, 0xd7, 0xd6, 0x88, 0x48, 0x5e, 0x4d,
+ 0x82, 0x3c, 0x54, 0x2e, 0x87, 0xf7, 0xb0, 0x0d, 0xa4, 0x5e, 0xfe, 0xbb,
+ 0x01, 0x77, 0x66, 0xc6, 0x8f, 0x5b, 0xc5, 0xf2, 0x47, 0x6f, 0xbf, 0x3f,
+ 0x7e, 0x77, 0xfa, 0xf6, 0xcd, 0xd1, 0xdb, 0xf3, 0xcf, 0x3c, 0x71, 0x17,
+ 0x6b, 0xbb, 0x53, 0x87, 0x49, 0x30, 0x39, 0x05, 0x2d, 0x6f, 0x51, 0x33,
+ 0xcc, 0xbd, 0xae, 0xcc, 0x4a, 0xe5, 0x5f, 0x23, 0x7f, 0x38, 0xef, 0x21,
+ 0x8d, 0x3f, 0x51, 0x4e, 0xd9, 0x82, 0xfc, 0x54, 0x53, 0x8a, 0xfd, 0x8f,
+ 0x38, 0x62, 0x65, 0x7b, 0xdb, 0x53, 0x55, 0xf0, 0x1d, 0x75, 0x5a, 0x40,
+ 0x62, 0x3d, 0xf5, 0x31, 0xff, 0xcc, 0x92, 0x84, 0x63, 0xd5, 0x2e, 0x78,
+ 0xd4, 0x9a, 0x84, 0x63, 0xee, 0xf7, 0xb5, 0x24, 0xcc, 0x26, 0xd1, 0xd5,
+ 0x28, 0x72, 0x27, 0x14, 0x02, 0x7c, 0x16, 0xa8, 0x1a, 0x1a, 0x23, 0x64,
+ 0x21, 0xe1, 0x65, 0x88, 0x79, 0x88, 0xe9, 0x77, 0xb6, 0xcd, 0x56, 0x80,
+ 0x92, 0xee, 0xad, 0xe2, 0xcf, 0xea, 0x2c, 0xda, 0xdf, 0xda, 0xfa, 0xf9,
+ 0x25, 0x29, 0xab, 0x5f, 0xfe, 0x79, 0x9f, 0xf8, 0xe0, 0xe7, 0x10, 0xed,
+ 0xb9, 0xf6, 0xa6, 0x21, 0x32, 0xd7, 0xab, 0xd5, 0x25, 0xbe, 0xb5, 0xe4,
+ 0x84, 0x53, 0xfb, 0xc3, 0xd9, 0xbb, 0xd3, 0x1f, 0xff, 0xf4, 0x1b, 0x7f,
+ 0xc2, 0xcb, 0x16, 0xfb, 0x33, 0xe5, 0x11, 0xeb, 0xe0, 0x3f, 0xff, 0xe6,
+ 0x5f, 0x6b, 0x0f, 0x3f, 0x90, 0x7c, 0x10, 0x1c, 0xc5, 0x88, 0x42, 0xc6,
+ 0x38, 0x14, 0xdc, 0x8b, 0x24, 0x71, 0xc0, 0x14, 0x9e, 0x8f, 0xc3, 0x66,
+ 0x66, 0xe2, 0x8a, 0xab, 0xdb, 0x0c, 0x9a, 0x86, 0x4d, 0x01, 0x46, 0x0c,
+ 0x41, 0xe0, 0xf2, 0xfb, 0x14, 0x20, 0x83, 0x40, 0x30, 0x18, 0x26, 0x03,
+ 0x39, 0xd5, 0x96, 0x1e, 0x07, 0x27, 0x27, 0xbf, 0x29, 0x11, 0xcc, 0x05,
+ 0x51, 0x94, 0x6e, 0x2d, 0x43, 0xab, 0xa1, 0x6a, 0xe7, 0xbc, 0xd5, 0xa0,
+ 0xdb, 0x6f, 0x4f, 0x65, 0x36, 0x2f, 0xa1, 0x1c, 0x0f, 0xeb, 0xcc, 0xa8,
+ 0xb4, 0x29, 0x05, 0x97, 0xb4, 0xe5, 0x02, 0x4d, 0xac, 0xde, 0xe2, 0xcc,
+ 0xe4, 0xfa, 0xcb, 0x20, 0x4b, 0x8d, 0x7c, 0x73, 0x54, 0x4b, 0x02, 0x13,
+ 0x0a, 0x89, 0xcb, 0x4c, 0x4d, 0x2e, 0x32, 0x45, 0x19, 0x50, 0x69, 0x21,
+ 0xd6, 0x28, 0x3d, 0x8e, 0xf3, 0xa4, 0xd1, 0xef, 0x3e, 0x6b, 0x42, 0xa8,
+ 0x1a, 0x42, 0x0c, 0x30, 0x32, 0xaf, 0xca, 0xeb, 0x8f, 0x28, 0x91, 0xa2,
+ 0x13, 0x0a, 0x05, 0x49, 0xa1, 0x48, 0x48, 0xe5, 0xc5, 0x9c, 0x46, 0x8c,
+ 0x96, 0xe4, 0xaa, 0x53, 0xf3, 0x3a, 0x36, 0x3b, 0xba, 0x74, 0x53, 0xbe,
+ 0x8a, 0xc9, 0x8d, 0xca, 0x2e, 0xf5, 0xb4, 0x55, 0x2a, 0x29, 0x9d, 0x2b,
+ 0x38, 0xcf, 0xaf, 0xb6, 0x90, 0x29, 0x31, 0x84, 0x8d, 0x81, 0xe2, 0x13,
+ 0xd0, 0x03, 0xfc, 0xe9, 0xa6, 0xce, 0x66, 0x97, 0x71, 0xb0, 0x90, 0xa8,
+ 0xb4, 0x10, 0xb0, 0x92, 0x5a, 0xbb, 0xe4, 0x29, 0xb3, 0xd2, 0x66, 0x65,
+ 0x80, 0xd7, 0xa2, 0x40, 0x49, 0xe8, 0xaf, 0xd3, 0x6c, 0x41, 0x3f, 0x17,
+ 0xe6, 0x0e, 0x7e, 0x14, 0x79, 0xd9, 0xd5, 0x86, 0x73, 0x91, 0x9a, 0xee,
+ 0xed, 0x17, 0xd3, 0xb0, 0xfc, 0x90, 0x40, 0x73, 0xfd, 0xca, 0x4c, 0xb9,
+ 0x79, 0x87, 0x77, 0x89, 0x62, 0x20, 0xf1, 0x3e, 0xb5, 0x9e, 0x91, 0xdf,
+ 0x3c, 0x66, 0x38, 0x0f, 0x48, 0x84, 0xa7, 0x9a, 0x34, 0x94, 0x09, 0xde,
+ 0x24, 0xe2, 0x17, 0x67, 0x25, 0x1c, 0xb0, 0x61, 0x61, 0xd5, 0x91, 0x37,
+ 0xf1, 0x55, 0x13, 0xed, 0x9d, 0x69, 0x24, 0x83, 0xc1, 0x3c, 0x46, 0x2e,
+ 0x78, 0xc6, 0xc3, 0xf2, 0xc7, 0xb3, 0xf3, 0x84, 0xb6, 0xca, 0x73, 0x64,
+ 0x3d, 0x4e, 0x51, 0x01, 0xb3, 0x58, 0x48, 0x31, 0x9a, 0x24, 0xe6, 0x1f,
+ 0x19, 0x39, 0x0b, 0x16, 0x01, 0x03, 0x4a, 0xb8, 0x6d, 0x2d, 0xe9, 0x42,
+ 0x1d, 0x92, 0x87, 0x10, 0x54, 0xc6, 0x23, 0xb9, 0x5d, 0xeb, 0x09, 0x11,
+ 0xf9, 0xb1, 0x59, 0xc9, 0x52, 0x7a, 0x8e, 0x62, 0xd5, 0x0b, 0x2d, 0xda,
+ 0xd7, 0x50, 0x9d, 0xb9, 0x02, 0x67, 0x65, 0x1d, 0x43, 0x06, 0xbe, 0xa0,
+ 0xca, 0x8f, 0xac, 0xe9, 0x29, 0x2c, 0x70, 0x33, 0x92, 0x50, 0x96, 0xe4,
+ 0x44, 0x92, 0xd1, 0x45, 0x55, 0xf0, 0x10, 0x86, 0xdc, 0x69, 0x6b, 0x40,
+ 0xe9, 0xcb, 0x5c, 0x60, 0x1f, 0xc3, 0xd0, 0x60, 0x2c, 0x54, 0x6e, 0xb7,
+ 0x05, 0xfd, 0x55, 0xd4, 0x7b, 0x49, 0xff, 0x4c, 0x6d, 0xc3, 0x40, 0x7b,
+ 0x45, 0xee, 0x27, 0x6b, 0xfb, 0xfb, 0x3b, 0x6b, 0x71, 0xaf, 0x1d, 0xee,
+ 0x50, 0x82, 0x45, 0xda, 0xdf, 0xdf, 0xa6, 0x87, 0x38, 0x39, 0x31, 0xbb,
+ 0x97, 0x9a, 0x70, 0x7c, 0xc7, 0x2d, 0xe9, 0xd0, 0xec, 0xdd, 0x87, 0xf1,
+ 0xf8, 0xe4, 0xc3, 0xd7, 0x07, 0x87, 0xdf, 0x1d, 0xbd, 0x7d, 0x95, 0xbc,
+ 0xf4, 0x32, 0xeb, 0xbf, 0x0c, 0xb5, 0xdf, 0x87, 0x8a, 0x7b, 0xd6, 0x34,
+ 0xa5, 0x7f, 0x6d, 0xd0, 0x45, 0x3c, 0xcb, 0xbb, 0xd2, 0x8b, 0x73, 0xdb,
+ 0xa5, 0xc8, 0x24, 0x69, 0x0d, 0x83, 0x0a, 0x1c, 0xd4, 0x3b, 0x90, 0x0a,
+ 0xed, 0x4d, 0x49, 0xb4, 0xe0, 0x55, 0x25, 0xc2, 0x56, 0x70, 0xa8, 0xce,
+ 0x94, 0x59, 0xf7, 0x15, 0xd4, 0x20, 0xea, 0x69, 0xac, 0xd0, 0x04, 0x9c,
+ 0x78, 0x76, 0x19, 0xab, 0xb1, 0xf2, 0x5c, 0x15, 0xfa, 0xf1, 0xa4, 0xd5,
+ 0x69, 0x50, 0x93, 0xf4, 0xc8, 0x3b, 0xf1, 0x11, 0xb0, 0x07, 0x8a, 0xa4,
+ 0x94, 0x44, 0xba, 0xa1, 0x49, 0x25, 0x2c, 0x6d, 0x41, 0xea, 0x16, 0x9d,
+ 0x0a, 0x20, 0xa0, 0x99, 0xcb, 0xc0, 0x43, 0xa5, 0xe2, 0xab, 0xb5, 0x49,
+ 0xef, 0x9d, 0xf0, 0x8a, 0xa3, 0x33, 0xb9, 0x8d, 0xfc, 0x8f, 0x93, 0xd3,
+ 0x6f, 0x5e, 0x1d, 0xbf, 0x4b, 0x5e, 0xb6, 0x71, 0x1a, 0x23, 0x5b, 0x18,
+ 0xdd, 0xc3, 0x76, 0x0d, 0xd0, 0xc0, 0xa2, 0x42, 0x35, 0x1d, 0xb1, 0x1c,
+ 0x74, 0x0d, 0x72, 0x2a, 0x5d, 0x2a, 0xf9, 0x34, 0x6e, 0x02, 0x9d, 0x05,
+ 0x91, 0x24, 0x98, 0x2e, 0x27, 0x86, 0xb9, 0xff, 0x3a, 0x2b, 0xaf, 0xea,
+ 0x88, 0x13, 0x81, 0x19, 0xc5, 0x0e, 0x30, 0xb0, 0x78, 0x0d, 0x6c, 0xc0,
+ 0xb0, 0x88, 0xa0, 0x3f, 0xa7, 0x92, 0xb4, 0x8e, 0xc8, 0x59, 0x46, 0x78,
+ 0x1a, 0xb1, 0x10, 0x83, 0x17, 0x5f, 0xcd, 0xa7, 0xc9, 0x86, 0xa1, 0xf7,
+ 0x75, 0x76, 0xb7, 0x39, 0x4a, 0x5e, 0x95, 0x64, 0x1c, 0xf8, 0x89, 0x1d,
+ 0x75, 0xa6, 0x58, 0x7b, 0x8a, 0xe3, 0x64, 0xce, 0x71, 0x00, 0x1e, 0x9d,
+ 0xe2, 0x2e, 0x44, 0x89, 0xce, 0x28, 0xf9, 0x01, 0xdd, 0x60, 0x40, 0xbc,
+ 0x8b, 0xd2, 0xfc, 0x41, 0x18, 0xea, 0x91, 0x92, 0x14, 0x73, 0x14, 0xbe,
+ 0x3b, 0xfa, 0x93, 0xd9, 0x1c, 0xb2, 0x23, 0x18, 0xb4, 0xb4, 0x77, 0x63,
+ 0x18, 0xb3, 0x25, 0x6b, 0x02, 0xaa, 0x77, 0xe8, 0x6c, 0x07, 0xf1, 0x40,
+ 0x49, 0x82, 0xc8, 0x02, 0x9d, 0x20, 0x46, 0x95, 0x9f, 0x54, 0xa4, 0x10,
+ 0xc1, 0x57, 0x62, 0x2e, 0x5f, 0x8f, 0x2a, 0x92, 0x54, 0x93, 0x36, 0x92,
+ 0xee, 0x7e, 0x8d, 0x12, 0x6d, 0x70, 0x73, 0xa8, 0x68, 0x70, 0xc5, 0x1c,
+ 0x17, 0x32, 0x93, 0xda, 0x91, 0xce, 0xee, 0xff, 0x96, 0xd9, 0xae, 0x28,
+ 0x4d, 0x95, 0x5e, 0x92, 0x16, 0x65, 0x06, 0xa4, 0x02, 0x62, 0xf6, 0x63,
+ 0xf0, 0xe6, 0x51, 0x13, 0xd5, 0x6e, 0x16, 0x32, 0x20, 0xb0, 0x30, 0x04,
+ 0x07, 0x00, 0xa8, 0x4e, 0x44, 0xf1, 0xdc, 0x7e, 0x20, 0x00, 0xf4, 0xeb,
+ 0xb4, 0xfa, 0x28, 0x5e, 0x80, 0x5b, 0x47, 0x68, 0xce, 0xda, 0x9f, 0x85,
+ 0xc0, 0x93, 0xb7, 0xe0, 0x12, 0x20, 0xb7, 0xeb, 0x16, 0xec, 0x6b, 0xe7,
+ 0x9c, 0x01, 0xaa, 0x70, 0x8d, 0x84, 0x9e, 0x0d, 0x92, 0xaf, 0x4b, 0x92,
+ 0xc8, 0xf8, 0x21, 0x37, 0xd3, 0x19, 0x24, 0x6f, 0xc7, 0xe3, 0x48, 0xa5,
+ 0xfd, 0x6d, 0x39, 0xbb, 0x34, 0x8f, 0x99, 0x7d, 0x64, 0x75, 0xcf, 0xfc,
+ 0x79, 0x7e, 0x7a, 0x78, 0x7a, 0x62, 0xfe, 0x72, 0xf4, 0xfa, 0xf8, 0x47,
+ 0x67, 0x11, 0x32, 0xce, 0x5a, 0xab, 0xd4, 0x18, 0xf0, 0xe1, 0xcf, 0x07,
+ 0xbe, 0x0a, 0xca, 0x25, 0x12, 0x54, 0x1d, 0x81, 0x7b, 0x2d, 0xd0, 0x4e,
+ 0xac, 0xa6, 0xec, 0xe9, 0xb8, 0x00, 0x49, 0xca, 0xef, 0x7c, 0x18, 0x3d,
+ 0x4f, 0x5c, 0xc8, 0xc8, 0xb6, 0xcc, 0xc6, 0x71, 0x1c, 0x71, 0x92, 0xaf,
+ 0xe2, 0x4a, 0x97, 0x3c, 0xf7, 0xc9, 0x5c, 0x21, 0x61, 0x5a, 0x93, 0x33,
+ 0x52, 0x57, 0xba, 0x1a, 0xf1, 0x0f, 0x74, 0xb8, 0x4e, 0x3f, 0x48, 0x0f,
+ 0xe4, 0xdf, 0x88, 0x66, 0x7f, 0x91, 0xea, 0xe8, 0x30, 0xbc, 0x90, 0x41,
+ 0x23, 0xe6, 0x3a, 0x8d, 0xa2, 0x0d, 0x56, 0xd7, 0xd1, 0x06, 0x48, 0x0d,
+ 0x70, 0x23, 0xb6, 0xd7, 0x24, 0x04, 0x90, 0x8b, 0x15, 0xf9, 0x0c, 0xe4,
+ 0xc3, 0xf1, 0x90, 0x2a, 0x45, 0x53, 0x89, 0x03, 0x2f, 0x70, 0xc5, 0x37,
+ 0xfd, 0x07, 0xf9, 0xdf, 0x1c, 0xc1, 0x16, 0x6d, 0xfa, 0x1c, 0x72, 0x43,
+ 0x3a, 0x2d, 0xc2, 0x22, 0x90, 0xc4, 0x83, 0x45, 0xe8, 0x56, 0xa3, 0x3d,
+ 0x10, 0x47, 0x4f, 0xdb, 0xda, 0xac, 0xfb, 0x3e, 0x4d, 0xee, 0x49, 0xa1,
+ 0x81, 0xfb, 0x74, 0x50, 0xf1, 0x48, 0xa5, 0x3e, 0xf5, 0x93, 0x55, 0x63,
+ 0x90, 0x37, 0xe0, 0xaf, 0xcb, 0xfc, 0x26, 0x45, 0x95, 0xbe, 0xb9, 0xa6,
+ 0x86, 0x43, 0x7e, 0xa9, 0x33, 0x46, 0xfa, 0xab, 0x06, 0x49, 0xdb, 0xa3,
+ 0x3c, 0xfd, 0x35, 0x83, 0x3c, 0xed, 0x8c, 0x71, 0xfd, 0xab, 0x06, 0x19,
+ 0xaa, 0x71, 0xf0, 0xd9, 0x67, 0x47, 0x3f, 0x1e, 0x9f, 0x27, 0x87, 0xa7,
+ 0xaf, 0xdc, 0x01, 0x3b, 0x87, 0x85, 0x0a, 0x0e, 0x30, 0x17, 0x56, 0x61,
+ 0x78, 0x90, 0x1a, 0x99, 0xda, 0xae, 0x6c, 0x5c, 0x48, 0x41, 0x59, 0x29,
+ 0xb5, 0xd6, 0xfe, 0xe7, 0x15, 0x23, 0x6a, 0x52, 0x4e, 0x0c, 0x03, 0x82,
+ 0x7a, 0x68, 0x27, 0xf4, 0xf4, 0x9c, 0xf0, 0x3a, 0xaf, 0xd4, 0xf2, 0xa2,
+ 0x53, 0x49, 0x90, 0xcd, 0xe6, 0xa2, 0x17, 0x70, 0x8e, 0x8b, 0x94, 0x30,
+ 0x39, 0x0b, 0x46, 0x99, 0xa0, 0xc2, 0xee, 0xc6, 0xf9, 0x66, 0xcb, 0xcb,
+ 0x96, 0xe5, 0x24, 0xdd, 0xe8, 0x07, 0x52, 0xd3, 0x9f, 0x37, 0x3a, 0x15,
+ 0xbf, 0xd6, 0x61, 0x47, 0x0b, 0xbc, 0x5a, 0x9c, 0x2e, 0xbd, 0xa1, 0x21,
+ 0xe3, 0xe8, 0x26, 0x46, 0x16, 0x2d, 0x04, 0x89, 0xf4, 0xee, 0xa8, 0x5b,
+ 0x75, 0xed, 0x81, 0xb5, 0x66, 0x87, 0xb0, 0xdf, 0xd9, 0x95, 0x30, 0x72,
+ 0x9a, 0xcf, 0xd8, 0x67, 0x2c, 0x99, 0xef, 0xf9, 0xdf, 0x3c, 0xe7, 0xcc,
+ 0x9e, 0xb5, 0xc5, 0xcd, 0xca, 0x67, 0xc8, 0xf4, 0x99, 0xf2, 0x81, 0xa8,
+ 0xef, 0x8d, 0xb6, 0x79, 0x07, 0xcd, 0x80, 0x7c, 0x67, 0x82, 0x4a, 0xea,
+ 0xde, 0x7c, 0xa2, 0x29, 0xc5, 0x16, 0xfe, 0x14, 0xbd, 0x6b, 0x17, 0xed,
+ 0x4c, 0x00, 0xe7, 0xb1, 0x56, 0xb4, 0x19, 0xb9, 0xa4, 0xf3, 0x0a, 0x95,
+ 0xea, 0xc3, 0xcf, 0x62, 0x09, 0xab, 0xfa, 0x51, 0x85, 0xae, 0x91, 0xc6,
+ 0x31, 0x5e, 0x8f, 0x6f, 0x8b, 0x59, 0x49, 0x57, 0x36, 0xe8, 0x35, 0xe4,
+ 0x06, 0xa7, 0x1d, 0xbb, 0xc2, 0xc7, 0xb2, 0xd0, 0x2b, 0x73, 0x5a, 0x82,
+ 0x80, 0x03, 0xc1, 0x9e, 0x2b, 0x2f, 0x52, 0x82, 0xcd, 0x42, 0x5f, 0xf1,
+ 0xb4, 0x60, 0xcc, 0x06, 0xdd, 0x81, 0x38, 0x7a, 0x81, 0xab, 0xd9, 0x7e,
+ 0x2a, 0x7a, 0xb3, 0x5a, 0xeb, 0x52, 0x7a, 0xef, 0x0b, 0x16, 0x36, 0x30,
+ 0xc4, 0xb3, 0x45, 0xa6, 0xcd, 0x04, 0xf6, 0x07, 0xd6, 0x07, 0x01, 0x19,
+ 0x12, 0xa1, 0xee, 0xc4, 0xb7, 0x9e, 0xf5, 0x7c, 0x85, 0x91, 0x49, 0xdd,
+ 0x47, 0xfc, 0x78, 0xac, 0x92, 0x50, 0x9e, 0xf5, 0x46, 0x7b, 0xde, 0xe5,
+ 0x0b, 0x2f, 0xaa, 0x8b, 0x11, 0xed, 0x93, 0x9f, 0x8b, 0x1f, 0x3a, 0x23,
+ 0xf8, 0x07, 0x71, 0x9c, 0x18, 0x4b, 0x64, 0x26, 0x2b, 0x93, 0x9f, 0x20,
+ 0x69, 0x08, 0x9e, 0x64, 0x50, 0x79, 0xa2, 0xb3, 0x34, 0x2a, 0xb3, 0xef,
+ 0x06, 0x7c, 0x21, 0x9f, 0xa5, 0xbc, 0x65, 0x36, 0x1b, 0x81, 0x60, 0x96,
+ 0x5b, 0x7e, 0xe3, 0xd1, 0xf8, 0x47, 0x54, 0x82, 0x61, 0x2e, 0xa6, 0xd2,
+ 0xfe, 0x5b, 0xde, 0x08, 0x00, 0x9b, 0x3b, 0x61, 0x44, 0x5a, 0xed, 0xb2,
+ 0x62, 0xf8, 0x13, 0xa7, 0x79, 0x6a, 0x93, 0x20, 0x5e, 0x2e, 0xa9, 0x24,
+ 0x04, 0x66, 0x9b, 0xbc, 0x29, 0x03, 0x10, 0xf5, 0xf2, 0xb2, 0x11, 0x08,
+ 0x5b, 0x6e, 0x56, 0xcc, 0xf4, 0x31, 0x96, 0xc7, 0x95, 0x28, 0x5b, 0x1e,
+ 0xca, 0x3a, 0x37, 0xba, 0xe6, 0xeb, 0xd0, 0x9c, 0x75, 0x38, 0xf8, 0x23,
+ 0xb3, 0xeb, 0xf6, 0xf1, 0xd9, 0xd9, 0xb6, 0x74, 0xe0, 0x1e, 0xb6, 0x80,
+ 0xda, 0x22, 0x2a, 0xfc, 0x00, 0x60, 0xed, 0xdb, 0x14, 0x32, 0xc4, 0xe2,
+ 0x57, 0x38, 0x87, 0x95, 0x0d, 0xf1, 0x93, 0x52, 0x13, 0x56, 0x72, 0x15,
+ 0xb8, 0x5e, 0x53, 0x8e, 0xa8, 0x70, 0x31, 0x0a, 0x17, 0x7c, 0xcb, 0x75,
+ 0x35, 0x80, 0x33, 0xd7, 0x0a, 0x48, 0xce, 0xb1, 0x81, 0xec, 0xbd, 0xc9,
+ 0x62, 0x00, 0x64, 0x0a, 0xbf, 0xea, 0xe9, 0xcd, 0x0e, 0x7e, 0xcd, 0x5b,
+ 0xcf, 0x8e, 0x5d, 0xcf, 0x2d, 0x18, 0xe5, 0xec, 0x60, 0x3c, 0x56, 0x36,
+ 0x39, 0x0c, 0x39, 0x42, 0x32, 0x07, 0x08, 0x16, 0x4c, 0xc1, 0x3f, 0x23,
+ 0x16, 0x8d, 0x0c, 0xd2, 0x49, 0x30, 0xdb, 0x61, 0x99, 0xf6, 0x8a, 0x05,
+ 0x33, 0xb4, 0x09, 0x59, 0x2f, 0xf3, 0x95, 0xae, 0xf8, 0x76, 0x35, 0x25,
+ 0xe3, 0x86, 0x01, 0x27, 0xab, 0x10, 0x9d, 0x01, 0xec, 0xa2, 0x32, 0x1e,
+ 0x6e, 0x81, 0xbb, 0x45, 0xde, 0x6a, 0x27, 0xbe, 0xb3, 0x17, 0x2e, 0xfa,
+ 0x7b, 0x5e, 0xd5, 0xe0, 0x1f, 0x5a, 0xf4, 0xf7, 0x91, 0x45, 0x3f, 0x71,
+ 0x07, 0x87, 0x3f, 0x96, 0xec, 0xee, 0x3e, 0xd7, 0x02, 0x53, 0xc3, 0xc7,
+ 0xf8, 0x9e, 0xfb, 0xa0, 0xf7, 0x45, 0xf3, 0xdc, 0x10, 0xd9, 0xe9, 0x11,
+ 0xc7, 0x80, 0x3b, 0xbc, 0xde, 0xa7, 0x9e, 0xda, 0x4f, 0x19, 0xc3, 0x87,
+ 0xbc, 0x8f, 0xc6, 0xfc, 0x60, 0x29, 0x13, 0x08, 0x1f, 0x75, 0xe3, 0x91,
+ 0x0b, 0xe6, 0x96, 0x32, 0x81, 0x1b, 0xab, 0x4b, 0x76, 0x3e, 0xa5, 0xb3,
+ 0xf0, 0xbe, 0xf3, 0xcc, 0xba, 0xd0, 0xb7, 0x76, 0x35, 0x79, 0xea, 0x00,
+ 0xb2, 0x78, 0x96, 0xcd, 0xb9, 0xcf, 0x58, 0x46, 0xb0, 0x87, 0x2e, 0xf4,
+ 0xc3, 0xa0, 0x16, 0x97, 0x55, 0x8a, 0xa6, 0x21, 0xb3, 0xf4, 0x3e, 0x82,
+ 0xcc, 0x2a, 0x51, 0x42, 0x76, 0x55, 0xa5, 0x34, 0xfb, 0x82, 0xbc, 0x32,
+ 0xd0, 0x04, 0xc4, 0xfc, 0x27, 0x07, 0x02, 0xed, 0x68, 0x79, 0x69, 0xc3,
+ 0x74, 0xf2, 0xd5, 0x00, 0x58, 0xa9, 0x96, 0xde, 0xe2, 0x7c, 0x64, 0x44,
+ 0x4b, 0x88, 0x43, 0x1c, 0xef, 0x3c, 0x77, 0x5b, 0x64, 0xf7, 0x81, 0x4c,
+ 0x37, 0x86, 0x5b, 0xf3, 0xa8, 0xa7, 0xb2, 0x44, 0x63, 0xc1, 0x52, 0xe6,
+ 0x41, 0x19, 0x1a, 0x79, 0xe8, 0x31, 0xad, 0x3c, 0x05, 0x71, 0x87, 0xa5,
+ 0xf1, 0x19, 0x09, 0x3b, 0xe9, 0x1b, 0x31, 0x4a, 0x4e, 0x11, 0x81, 0x69,
+ 0x75, 0xca, 0x61, 0xe3, 0x2d, 0x75, 0xe0, 0x12, 0x6d, 0xc6, 0x7d, 0xe1,
+ 0x76, 0x58, 0xe7, 0xa4, 0x89, 0x8f, 0x5b, 0x2a, 0x64, 0xed, 0x85, 0xa2,
+ 0x91, 0xc6, 0x2c, 0x79, 0x77, 0x74, 0xfe, 0x0e, 0x39, 0x3e, 0x10, 0x00,
+ 0x81, 0xc9, 0x95, 0x56, 0x9b, 0x16, 0x6e, 0x51, 0xc4, 0x99, 0xd3, 0x43,
+ 0x9c, 0x80, 0x60, 0xb0, 0x5b, 0xbb, 0xdf, 0xfc, 0x4f, 0x7d, 0x8f, 0xeb,
+ 0x73, 0x33, 0xad, 0x86, 0x75, 0xd1, 0xfc, 0x36, 0x0c, 0xef, 0xee, 0xae,
+ 0xcb, 0x40, 0x45, 0x8f, 0x77, 0xb9, 0xe6, 0xa4, 0xd8, 0x6d, 0x24, 0x99,
+ 0x8d, 0x5a, 0x20, 0xaa, 0xde, 0x0d, 0x7a, 0x88, 0x33, 0xa0, 0xcb, 0x2a,
+ 0x72, 0xe5, 0xca, 0xa7, 0xf5, 0xfe, 0xe7, 0x29, 0x58, 0x2b, 0x53, 0xbe,
+ 0xc6, 0x3f, 0x65, 0xe9, 0x29, 0x7d, 0x0f, 0x92, 0x27, 0xdb, 0xdb, 0x91,
+ 0xa2, 0xa4, 0xf4, 0xc2, 0x08, 0x55, 0xd1, 0xe6, 0xa4, 0xee, 0x18, 0x6f,
+ 0x71, 0xc4, 0x0c, 0xea, 0x65, 0x4d, 0xa6, 0xc6, 0xf0, 0x92, 0x42, 0x58,
+ 0x44, 0xb1, 0xd0, 0xa8, 0xd8, 0x65, 0x19, 0xf3, 0x03, 0x0a, 0xa1, 0x95,
+ 0x68, 0x1d, 0xe1, 0xc2, 0x55, 0xd2, 0xb8, 0x7c, 0x3d, 0x9f, 0x0b, 0x7c,
+ 0x17, 0x1c, 0xfb, 0x0c, 0x66, 0x16, 0xc8, 0xef, 0xdd, 0xa7, 0x21, 0x47,
+ 0x8c, 0xcf, 0x4f, 0xdf, 0x09, 0x87, 0x85, 0x57, 0x33, 0x53, 0x04, 0x8f,
+ 0x38, 0xd0, 0xba, 0x41, 0x08, 0x5e, 0x38, 0xb5, 0xa8, 0x29, 0x16, 0x8c,
+ 0xdf, 0xfb, 0x2a, 0x4b, 0x00, 0x34, 0x96, 0x96, 0xa5, 0x7d, 0x2f, 0x58,
+ 0x11, 0xda, 0x76, 0x42, 0xcf, 0xa5, 0xf7, 0x12, 0x1f, 0xb3, 0x53, 0x3e,
+ 0xbf, 0x8c, 0xbe, 0x43, 0x7c, 0x24, 0x38, 0x3c, 0xd4, 0xb6, 0x42, 0x0a,
+ 0x3b, 0x34, 0xf1, 0x39, 0xe0, 0x45, 0x3e, 0x44, 0xa7, 0xae, 0xb3, 0x08,
+ 0x4b, 0x78, 0x59, 0xa7, 0xb5, 0x8a, 0xe9, 0xc7, 0x48, 0xad, 0xe4, 0xce,
+ 0x1b, 0x92, 0xd4, 0x9a, 0x72, 0x1c, 0x64, 0x12, 0x74, 0x27, 0x2a, 0xab,
+ 0xa9, 0xa4, 0x2e, 0xca, 0xc5, 0xa9, 0xc6, 0x82, 0xd3, 0xb3, 0xdd, 0xad,
+ 0x7f, 0x76, 0xfa, 0xee, 0xdc, 0xde, 0xf9, 0xf4, 0x59, 0xfc, 0xa0, 0x73,
+ 0x7a, 0xa8, 0xd6, 0x48, 0x0a, 0xb3, 0xe5, 0x66, 0xa3, 0x2d, 0x08, 0x82,
+ 0x51, 0x62, 0x13, 0xf0, 0x96, 0x60, 0x1c, 0x1d, 0x68, 0x80, 0xfe, 0xd3,
+ 0xd3, 0x92, 0x5d, 0x90, 0x56, 0xde, 0xb0, 0x13, 0x06, 0x17, 0x4d, 0x0f,
+ 0xc6, 0xaa, 0x53, 0x6e, 0xf7, 0x76, 0x42, 0xce, 0x20, 0x1b, 0xfa, 0xdd,
+ 0xd1, 0xf8, 0x9c, 0x67, 0x4e, 0x7f, 0x0b, 0x66, 0xce, 0x40, 0x2d, 0xf2,
+ 0xc3, 0x30, 0x80, 0x66, 0x39, 0x83, 0xb2, 0x8f, 0xc9, 0x77, 0x47, 0xe3,
+ 0x47, 0xda, 0x0b, 0xee, 0xed, 0x79, 0x99, 0xe6, 0x10, 0x9a, 0xc2, 0x27,
+ 0x38, 0xdf, 0xf8, 0xc1, 0x9a, 0x7c, 0x65, 0xcd, 0xa8, 0x65, 0x53, 0x6d,
+ 0x78, 0xeb, 0x8d, 0xf0, 0xc4, 0x8d, 0xb0, 0xa0, 0x9b, 0x4a, 0x06, 0x38,
+ 0x66, 0xd4, 0xa0, 0x19, 0x7e, 0x38, 0x54, 0x56, 0xc1, 0x65, 0xc1, 0x4c,
+ 0xc1, 0xcf, 0xb9, 0x71, 0x9e, 0xaa, 0xef, 0xce, 0xaa, 0x0a, 0xde, 0x54,
+ 0xe8, 0xc7, 0x9a, 0xee, 0x09, 0x6d, 0xa3, 0xc3, 0x72, 0x7b, 0xcc, 0xe9,
+ 0x5f, 0xa7, 0x28, 0x56, 0x97, 0x94, 0x75, 0x5e, 0xbb, 0x7f, 0x2f, 0x18,
+ 0x65, 0x2b, 0x2f, 0x96, 0x0c, 0xc3, 0x9d, 0x56, 0x33, 0x6a, 0x59, 0x66,
+ 0x84, 0x08, 0xac, 0x43, 0x7a, 0x2b, 0xd6, 0x5d, 0xc5, 0xfb, 0x86, 0xdc,
+ 0x3f, 0xe4, 0x54, 0x9c, 0xb8, 0x8b, 0x3a, 0x9d, 0xca, 0x21, 0x76, 0xba,
+ 0xbe, 0x39, 0xb0, 0x85, 0xbd, 0x26, 0x46, 0xc9, 0x59, 0x56, 0xa1, 0x9f,
+ 0x82, 0xe1, 0xd5, 0x7f, 0x73, 0xa3, 0xf1, 0x21, 0x41, 0xf4, 0xd5, 0x5c,
+ 0x9b, 0x24, 0x39, 0xcd, 0x3d, 0x66, 0x76, 0x16, 0x3f, 0xa1, 0xbf, 0x7a,
+ 0xad, 0x79, 0x82, 0xe5, 0xbe, 0x70, 0x2f, 0xd7, 0x66, 0x25, 0xc6, 0x42,
+ 0xef, 0x3e, 0xf2, 0x44, 0xf8, 0xca, 0x98, 0xef, 0x18, 0xc2, 0x8a, 0x66,
+ 0x3a, 0xcb, 0xd2, 0xf3, 0x70, 0xca, 0x23, 0x5c, 0xea, 0x33, 0x2d, 0x11,
+ 0xee, 0x0d, 0xc5, 0x97, 0xc1, 0xc1, 0x85, 0x6d, 0x34, 0x49, 0x05, 0x22,
+ 0xa4, 0xc8, 0x99, 0xb1, 0x0a, 0x92, 0xb4, 0x33, 0x5b, 0x35, 0xe6, 0xe7,
+ 0xff, 0x80, 0xb4, 0x16, 0x76, 0xb3, 0x4b, 0xdc, 0xb4, 0x9d, 0x4b, 0xf0,
+ 0x84, 0x39, 0xd1, 0xb2, 0x8d, 0xbd, 0xbf, 0x5a, 0xb3, 0x93, 0xca, 0x14,
+ 0x81, 0x0f, 0x26, 0xa7, 0x01, 0xc5, 0x82, 0xcd, 0xfd, 0xee, 0x2b, 0xff,
+ 0x4f, 0x9e, 0xba, 0xa1, 0x2e, 0x09, 0x75, 0xc2, 0xca, 0xf5, 0x83, 0x96,
+ 0x53, 0xce, 0x36, 0x44, 0xcb, 0xed, 0x93, 0x6c, 0x36, 0x62, 0x33, 0x22,
+ 0x38, 0xba, 0x3e, 0x4d, 0x9e, 0x8b, 0xe9, 0x4b, 0xb6, 0x6f, 0x71, 0xef,
+ 0xca, 0xc8, 0x46, 0x9c, 0x51, 0xc4, 0x7e, 0x33, 0xee, 0xb7, 0x28, 0xbf,
+ 0x11, 0xcf, 0xf1, 0xb5, 0xf8, 0x65, 0xa8, 0x85, 0x6a, 0x80, 0x5d, 0xbd,
+ 0x9c, 0x4b, 0xfd, 0x86, 0xf7, 0xa5, 0xcf, 0xc5, 0x93, 0x21, 0x75, 0x41,
+ 0x8a, 0xf6, 0xe8, 0x2d, 0x84, 0x14, 0x5d, 0xb1, 0x9a, 0x6d, 0x9b, 0xd1,
+ 0x29, 0x4a, 0x0b, 0x6a, 0xdb, 0x52, 0x2a, 0x02, 0x30, 0x4e, 0x62, 0x56,
+ 0x94, 0x5d, 0xf5, 0x28, 0x94, 0x1e, 0x86, 0x28, 0xd1, 0x5b, 0x1e, 0xe3,
+ 0x5f, 0xad, 0x00, 0x61, 0xac, 0xb2, 0xbf, 0x40, 0x91, 0x1c, 0xf1, 0x65,
+ 0xc3, 0x65, 0xfe, 0xbc, 0xca, 0x62, 0x99, 0x7a, 0xb6, 0xfc, 0x93, 0x17,
+ 0xe2, 0xa1, 0x12, 0x37, 0x08, 0x65, 0x55, 0x15, 0x59, 0x13, 0xa4, 0x96,
+ 0x3c, 0xdd, 0xb1, 0xbe, 0x4a, 0x2a, 0x97, 0x90, 0x8a, 0x46, 0xbf, 0x68,
+ 0x82, 0xba, 0x78, 0x8c, 0xbf, 0x4d, 0xde, 0xbc, 0x7a, 0x4a, 0xc9, 0x9c,
+ 0x57, 0x59, 0xb5, 0xa8, 0x28, 0x81, 0x5f, 0x79, 0xf8, 0xf4, 0x3b, 0x6f,
+ 0xb0, 0x5d, 0x97, 0x79, 0xa7, 0x80, 0xcf, 0x22, 0xcc, 0xc4, 0x5e, 0x30,
+ 0x5b, 0x48, 0xe0, 0x2c, 0x57, 0x03, 0x09, 0xb4, 0x2b, 0x1e, 0xb2, 0xe2,
+ 0x7e, 0x42, 0x6b, 0xf9, 0xac, 0x5b, 0x10, 0xd4, 0x12, 0x60, 0x4f, 0xf7,
+ 0x9c, 0x00, 0xab, 0xee, 0x17, 0x70, 0xdf, 0x5f, 0x91, 0x59, 0x10, 0x39,
+ 0x51, 0x4f, 0x59, 0x68, 0x1e, 0xf2, 0xb9, 0x27, 0x1d, 0x36, 0x7c, 0x0d,
+ 0xea, 0x79, 0x27, 0xe2, 0xf4, 0xf4, 0xa9, 0xef, 0x55, 0xa8, 0xa5, 0xa7,
+ 0xaf, 0x36, 0xb8, 0x20, 0x0d, 0xc5, 0x7b, 0xf6, 0x99, 0x7d, 0x96, 0xfc,
+ 0x46, 0x88, 0x12, 0x68, 0x27, 0xce, 0x9e, 0x37, 0x44, 0xf9, 0x55, 0x03,
+ 0x41, 0x15, 0x33, 0xd6, 0x77, 0x3c, 0xda, 0x7b, 0xaf, 0xbc, 0x68, 0x3b,
+ 0x4d, 0xd0, 0xa2, 0xcb, 0x32, 0x26, 0x16, 0x95, 0x2f, 0xae, 0xfd, 0xc3,
+ 0xf9, 0x8c, 0xef, 0xe8, 0xb3, 0x6e, 0x0d, 0x8c, 0xca, 0xc0, 0xcc, 0x87,
+ 0x7f, 0xd2, 0xa3, 0xce, 0xac, 0x7f, 0x78, 0x90, 0xf4, 0x95, 0xb3, 0x82,
+ 0xd7, 0xbd, 0x8f, 0xec, 0xc8, 0x99, 0x31, 0x4b, 0x2e, 0xaf, 0x8a, 0xfc,
+ 0x6f, 0x99, 0x97, 0x07, 0xac, 0x5d, 0x54, 0xbd, 0xc7, 0x77, 0x45, 0x60,
+ 0xdc, 0xa4, 0xb3, 0x5c, 0x84, 0x22, 0x25, 0xce, 0xb8, 0x07, 0xf6, 0x84,
+ 0x6b, 0xb9, 0xeb, 0x31, 0xe7, 0xbd, 0x99, 0x51, 0x91, 0xb6, 0x95, 0xb5,
+ 0x4a, 0xaa, 0x9e, 0x3d, 0x11, 0x9d, 0x4b, 0x75, 0x63, 0xba, 0x79, 0x89,
+ 0x10, 0x33, 0x80, 0x5b, 0x77, 0xc5, 0xf4, 0x33, 0xb9, 0xf6, 0x64, 0x2b,
+ 0x6d, 0x27, 0x55, 0xdb, 0x95, 0x96, 0xfe, 0x7a, 0x9b, 0x17, 0x52, 0xe4,
+ 0x14, 0xbc, 0xfe, 0xac, 0xc7, 0xfd, 0x58, 0xf3, 0x9d, 0x79, 0x04, 0x5e,
+ 0xf2, 0x9e, 0x7f, 0xee, 0x4e, 0x42, 0x0b, 0x18, 0x5c, 0x51, 0xa1, 0x07,
+ 0x3e, 0xfa, 0xbb, 0x9e, 0x25, 0x76, 0xa1, 0x64, 0xdc, 0xb2, 0x2b, 0xd2,
+ 0x20, 0xe9, 0xd2, 0x7e, 0x7e, 0x56, 0x92, 0x34, 0xf5, 0xbe, 0xc7, 0x2c,
+ 0xf5, 0x1a, 0xd1, 0x33, 0x67, 0x1c, 0x14, 0xc9, 0xb9, 0x07, 0xe4, 0xe1,
+ 0x9e, 0x7e, 0x21, 0xbc, 0xa1, 0xf7, 0xa5, 0x35, 0x56, 0xfb, 0xde, 0x78,
+ 0xbe, 0xed, 0x2b, 0xab, 0x53, 0xca, 0xc8, 0x61, 0xa0, 0xa1, 0xde, 0x17,
+ 0x98, 0x33, 0x8e, 0xcd, 0x35, 0x72, 0x65, 0x98, 0x1a, 0xcf, 0x38, 0x50,
+ 0x68, 0xf7, 0xd8, 0x6e, 0x4b, 0xe8, 0x9e, 0xfb, 0xea, 0x53, 0x72, 0xfc,
+ 0xca, 0x7b, 0x70, 0xcf, 0x2d, 0x30, 0x9d, 0x91, 0x36, 0x70, 0xcf, 0x7e,
+ 0xaa, 0x3a, 0xd9, 0xa0, 0xb7, 0x3c, 0x24, 0xcf, 0xe7, 0xcc, 0x19, 0x6f,
+ 0x4b, 0x0e, 0xbb, 0x81, 0xfc, 0xc1, 0x33, 0xcc, 0x0e, 0x87, 0x16, 0xaf,
+ 0xd3, 0x61, 0x75, 0x06, 0x7b, 0xff, 0xfc, 0xd9, 0x8a, 0x67, 0xe5, 0xd2,
+ 0xac, 0xed, 0x55, 0xef, 0xbd, 0xf7, 0x3c, 0x3c, 0xe6, 0x6a, 0x0e, 0x68,
+ 0x89, 0x9a, 0x39, 0x6a, 0x74, 0xd2, 0x92, 0x0d, 0x02, 0x70, 0xf9, 0x37,
+ 0x75, 0x0c, 0x56, 0x84, 0xcc, 0x5c, 0xff, 0x9b, 0x3f, 0xdf, 0xcf, 0xfd,
+ 0x3a, 0x37, 0xf6, 0x0a, 0xa2, 0xcf, 0x08, 0xa5, 0x39, 0xfa, 0x5d, 0xcf,
+ 0x5c, 0x7e, 0x28, 0xa8, 0xe3, 0x8d, 0xc0, 0x7b, 0x6e, 0xf4, 0x88, 0x65,
+ 0xe1, 0x24, 0x07, 0x1b, 0x81, 0x82, 0x96, 0x34, 0xf5, 0x11, 0xbc, 0x49,
+ 0xe6, 0x8b, 0x07, 0xca, 0xf3, 0xa1, 0x6e, 0x77, 0x8e, 0x41, 0x7d, 0xbd,
+ 0x64, 0x93, 0xdb, 0xae, 0xc8, 0x39, 0xd8, 0xbc, 0xd7, 0x76, 0x9d, 0xf4,
+ 0xc2, 0xdc, 0xa0, 0x36, 0x1e, 0x9a, 0xd9, 0xb2, 0x4d, 0x6e, 0xdb, 0x60,
+ 0x01, 0xd3, 0xe5, 0xb6, 0x2a, 0x11, 0x17, 0x17, 0xc8, 0xb1, 0x8d, 0xb4,
+ 0x27, 0x2d, 0x5f, 0x0a, 0x88, 0xbc, 0xcf, 0x88, 0x6a, 0x43, 0xe9, 0xad,
+ 0x84, 0xc5, 0x9a, 0x4d, 0x3e, 0xea, 0x91, 0x91, 0x41, 0x5c, 0xd9, 0x91,
+ 0xf7, 0xd6, 0x13, 0x4b, 0x5a, 0x18, 0x34, 0xef, 0x8e, 0xba, 0x56, 0x80,
+ 0x7b, 0x94, 0xb9, 0xe6, 0xdd, 0xf9, 0xf8, 0x6c, 0x9f, 0xe6, 0xcc, 0x71,
+ 0x43, 0x73, 0x20, 0x0e, 0xc7, 0xd9, 0x5f, 0xa5, 0x62, 0xba, 0x76, 0x4f,
+ 0x3f, 0xeb, 0x79, 0x7a, 0x2c, 0x8e, 0xbd, 0x63, 0xf4, 0xbc, 0x30, 0xfb,
+ 0xe0, 0xbf, 0xc4, 0x4c, 0xb3, 0x2c, 0xd4, 0xbf, 0xcf, 0xfe, 0x2f, 0x9a,
+ 0x19, 0xa4, 0x21, 0xe5, 0x15, 0xb9, 0x87, 0x3f, 0x77, 0x36, 0xcd, 0xf5,
+ 0xb2, 0xf8, 0x68, 0xf5, 0x45, 0x41, 0x24, 0xd6, 0x0d, 0x76, 0x2f, 0xbc,
+ 0xd0, 0xa3, 0xe1, 0xf9, 0x41, 0x6d, 0xce, 0xeb, 0x40, 0x3c, 0x14, 0xe2,
+ 0x76, 0x94, 0x98, 0xa7, 0x91, 0xaf, 0x4b, 0x8f, 0x06, 0x2f, 0xb6, 0xed,
+ 0xf5, 0x2b, 0xc0, 0x8c, 0x1f, 0x91, 0x80, 0x23, 0x5c, 0xa7, 0xf9, 0x75,
+ 0x8b, 0xbc, 0x20, 0x17, 0x84, 0x7b, 0xc4, 0x0d, 0xb0, 0xd3, 0xba, 0x04,
+ 0xba, 0xea, 0x06, 0xc3, 0x50, 0x78, 0x9e, 0x76, 0xe6, 0x9d, 0x31, 0x45,
+ 0x1d, 0xe7, 0xc2, 0xaf, 0x79, 0xa1, 0xde, 0xb6, 0x8e, 0x0b, 0xcd, 0xbe,
+ 0xb4, 0xa7, 0xcc, 0x4e, 0xf8, 0xb2, 0x31, 0xcd, 0x96, 0x53, 0x06, 0xa0,
+ 0x74, 0x00, 0x56, 0x4d, 0xf4, 0x6c, 0x37, 0xc2, 0x13, 0x1d, 0xa1, 0x83,
+ 0x92, 0x68, 0x07, 0xb3, 0x1e, 0x9e, 0x34, 0xb0, 0xb1, 0x5e, 0x3c, 0xd5,
+ 0x68, 0x92, 0xca, 0x55, 0x46, 0xc4, 0xb1, 0x6e, 0x40, 0xdf, 0x0f, 0xb8,
+ 0xb5, 0x27, 0xb3, 0x0f, 0x5c, 0x7e, 0xdd, 0x86, 0x9b, 0xbf, 0xcc, 0x01,
+ 0xc8, 0x3e, 0x3f, 0x36, 0xa6, 0x99, 0x0b, 0xba, 0x80, 0x0a, 0x2b, 0x7c,
+ 0x80, 0x2f, 0x98, 0x77, 0x91, 0xf8, 0xe1, 0xf3, 0x8a, 0xd5, 0xf0, 0x39,
+ 0xa7, 0x91, 0x9d, 0x89, 0xdc, 0xff, 0x0c, 0x8d, 0xb0, 0x60, 0xb5, 0x50,
+ 0x83, 0x42, 0xba, 0x88, 0x03, 0xed, 0x81, 0x00, 0xc3, 0xef, 0x75, 0x08,
+ 0x8c, 0x9d, 0xdb, 0x6c, 0x56, 0x0e, 0x8b, 0x5b, 0x7b, 0x5a, 0x28, 0x13,
+ 0x31, 0xa5, 0x7f, 0xfc, 0x91, 0x75, 0x04, 0x4a, 0x02, 0xf1, 0x23, 0xa4,
+ 0xb6, 0x3f, 0xad, 0xb9, 0x50, 0x59, 0xad, 0xa4, 0xcd, 0x42, 0x2c, 0xaf,
+ 0xca, 0x66, 0x19, 0x41, 0xf2, 0xb3, 0x8d, 0x0b, 0xc1, 0x18, 0xcb, 0x8a,
+ 0x33, 0xd4, 0xe4, 0x78, 0x3c, 0x65, 0x77, 0x35, 0xdc, 0xd2, 0xec, 0x06,
+ 0x92, 0x84, 0x0c, 0x74, 0x33, 0x83, 0x83, 0xf7, 0xe7, 0xdf, 0x9e, 0xbe,
+ 0x1b, 0x27, 0x5b, 0x04, 0xac, 0x74, 0xfe, 0xee, 0xf8, 0xeb, 0xf7, 0xe7,
+ 0xe6, 0x9f, 0x3a, 0xd2, 0xab, 0xb4, 0xc8, 0x8d, 0xe6, 0x61, 0x58, 0x35,
+ 0x2b, 0x8c, 0x20, 0xb8, 0xd2, 0xc5, 0x71, 0x83, 0x0f, 0xc3, 0x45, 0x65,
+ 0xa5, 0x78, 0x7a, 0x94, 0x90, 0x52, 0xce, 0x5c, 0x96, 0x20, 0xa2, 0x13,
+ 0x94, 0xbb, 0x5f, 0x3a, 0xaf, 0x48, 0xde, 0x81, 0x84, 0xd2, 0x74, 0xdc,
+ 0xe4, 0xfc, 0xdb, 0x83, 0xb7, 0xdf, 0x8d, 0xb5, 0xc9, 0xe0, 0x0f, 0x3f,
+ 0xfc, 0xd0, 0x0d, 0xdc, 0xc3, 0x3e, 0xb9, 0x4e, 0xef, 0xee, 0x46, 0x75,
+ 0xf6, 0xd9, 0x67, 0xe3, 0xa3, 0xa3, 0xe4, 0xe0, 0x64, 0x7c, 0xaa, 0x4f,
+ 0x5d, 0x36, 0x8b, 0x8d, 0x9d, 0x4d, 0xa3, 0x80, 0x5f, 0x65, 0x8d, 0xf9,
+ 0xcb, 0x67, 0x9f, 0xfd, 0x7f, 0xe3, 0x30, 0x39, 0xb1, 0xc8, 0xc9, 0x02,
+ 0x00,
};
#define BUF_SIZE 0x10000
static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
diff --git a/src/tool_hugehelp.h b/src/tool_hugehelp.h
index 16520b6ee..9f9396903 100644
--- a/src/tool_hugehelp.h
+++ b/src/tool_hugehelp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_libinfo.c b/src/tool_libinfo.c
index 19ec65ac6..de7ec4d18 100644
--- a/src/tool_libinfo.c
+++ b/src/tool_libinfo.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_libinfo.h b/src/tool_libinfo.h
index b3a9b9cdd..9563cc3ed 100644
--- a/src/tool_libinfo.h
+++ b/src/tool_libinfo.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_main.c b/src/tool_main.c
index 4803adbb3..b60454675 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -166,17 +166,17 @@ static CURLcode main_init(struct GlobalConfig *config)
config->first->global = config;
}
else {
- helpf(stderr, "error retrieving curl library information\n");
+ errorf(config, "error retrieving curl library information\n");
free(config->first);
}
}
else {
- helpf(stderr, "error initializing curl library\n");
+ errorf(config, "error initializing curl library\n");
free(config->first);
}
}
else {
- helpf(stderr, "error initializing curl\n");
+ errorf(config, "error initializing curl\n");
result = CURLE_FAILED_INIT;
}
@@ -273,12 +273,36 @@ static void restore_terminal(void)
/*
** curl tool main function.
*/
+#ifdef _UNICODE
+int wmain(int argc, wchar_t *argv[])
+#else
int main(int argc, char *argv[])
+#endif
{
CURLcode result = CURLE_OK;
struct GlobalConfig global;
memset(&global, 0, sizeof(global));
+#ifdef WIN32
+#ifdef _tcscmp
+ /* Undocumented diagnostic option to list the full paths of all loaded
+ modules. This is purposely pre-init. */
+ if(argc == 2 && !_tcscmp(argv[1], _T("--dump-module-paths"))) {
+ struct curl_slist *item, *head = GetLoadedModulePaths();
+ for(item = head; item; item = item->next)
+ printf("%s\n", item->data);
+ curl_slist_free_all(head);
+ return head ? 0 : 1;
+ }
+#endif /* _tcscmp */
+ /* win32_init must be called before other init routines. */
+ result = win32_init();
+ if(result) {
+ fprintf(stderr, "curl: (%d) Windows-specific init failed.\n", result);
+ return result;
+ }
+#endif
+
/* Perform any platform-specific terminal configuration */
configure_terminal();
@@ -294,30 +318,10 @@ int main(int argc, char *argv[])
/* Initialize the curl library - do not call any libcurl functions before
this point */
result = main_init(&global);
-
-#ifdef WIN32
- /* Undocumented diagnostic option to list the full paths of all loaded
- modules, regardless of whether or not initialization succeeded. */
- if(argc == 2 && !strcmp(argv[1], "--dump-module-paths")) {
- struct curl_slist *item, *head = GetLoadedModulePaths();
- for(item = head; item; item = item->next) {
- printf("%s\n", item->data);
- }
- curl_slist_free_all(head);
- if(!result)
- main_free(&global);
- }
- else
-#endif /* WIN32 */
if(!result) {
/* Start our curl operation */
result = operate(&global, argc, argv);
-#ifdef __SYMBIAN32__
- if(global.showerror)
- tool_pressanykey();
-#endif
-
/* Perform the main cleanup */
main_free(&global);
}
diff --git a/src/tool_metalink.c b/src/tool_metalink.c
index 889da4bff..2ad7115db 100644
--- a/src/tool_metalink.c
+++ b/src/tool_metalink.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -54,13 +54,6 @@
# define SHA256_CTX void *
# define HAVE_NSS_CONTEXT
static NSSInitContext *nss_context;
-#elif defined(USE_POLARSSL)
-# include <polarssl/md5.h>
-# include <polarssl/sha1.h>
-# include <polarssl/sha256.h>
-# define MD5_CTX md5_context
-# define SHA_CTX sha1_context
-# define SHA256_CTX sha256_context
#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \
(__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \
(defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
@@ -73,7 +66,7 @@
and later. If you're building for an older cat, well, sorry. */
# define COMMON_DIGEST_FOR_OPENSSL
# include <CommonCrypto/CommonDigest.h>
-#elif defined(WIN32)
+#elif defined(USE_WIN32_CRYPTO)
/* For Windows: If no other crypto library is provided, we fallback
to the hash functions provided within the Microsoft Windows CryptoAPI */
# include <wincrypt.h>
@@ -119,7 +112,7 @@ struct win32_crypto_hash {
*(str) = strdup((val)); \
if(!(val)) \
return PARAM_NO_MEM; \
-} WHILE_FALSE
+} while(0)
#if defined(USE_OPENSSL)
/* Functions are already defined */
@@ -325,63 +318,7 @@ static void SHA256_Final(unsigned char digest[32], SHA256_CTX *pctx)
nss_hash_final(pctx, digest, 32);
}
-#elif defined(USE_POLARSSL)
-
-static int MD5_Init(MD5_CTX *ctx)
-{
- md5_starts(ctx);
- return 1;
-}
-
-static void MD5_Update(MD5_CTX *ctx,
- const unsigned char *input,
- unsigned int inputLen)
-{
- md5_update(ctx, input, inputLen);
-}
-
-static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
-{
- md5_finish(ctx, digest);
-}
-
-static int SHA1_Init(SHA_CTX *ctx)
-{
- sha1_starts(ctx);
- return 1;
-}
-
-static void SHA1_Update(SHA_CTX *ctx,
- const unsigned char *input,
- unsigned int inputLen)
-{
- sha1_update(ctx, input, inputLen);
-}
-
-static void SHA1_Final(unsigned char digest[20], SHA_CTX *ctx)
-{
- sha1_finish(ctx, digest);
-}
-
-static int SHA256_Init(SHA256_CTX *ctx)
-{
- sha256_starts(ctx, 0); /* 0 = sha256 */
- return 1;
-}
-
-static void SHA256_Update(SHA256_CTX *ctx,
- const unsigned char *input,
- unsigned int inputLen)
-{
- sha256_update(ctx, input, inputLen);
-}
-
-static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx)
-{
- sha256_finish(ctx, digest);
-}
-
-#elif defined(WIN32)
+#elif defined(USE_WIN32_CRYPTO)
static void win32_crypto_final(struct win32_crypto_hash *ctx,
unsigned char *digest,
@@ -399,8 +336,8 @@ static void win32_crypto_final(struct win32_crypto_hash *ctx,
static int MD5_Init(MD5_CTX *ctx)
{
- if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
- PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash);
}
return 1;
@@ -420,8 +357,8 @@ static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx)
static int SHA1_Init(SHA_CTX *ctx)
{
- if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
- PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
CryptCreateHash(ctx->hCryptProv, CALG_SHA1, 0, 0, &ctx->hHash);
}
return 1;
@@ -441,8 +378,8 @@ static void SHA1_Final(unsigned char digest[20], SHA_CTX *ctx)
static int SHA256_Init(SHA256_CTX *ctx)
{
- if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL,
- PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
+ if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_AES,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
CryptCreateHash(ctx->hCryptProv, CALG_SHA_256, 0, 0, &ctx->hHash);
}
return 1;
@@ -462,45 +399,45 @@ static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx)
#endif /* CRYPTO LIBS */
-const digest_params MD5_DIGEST_PARAMS[] = {
+const struct digest_params MD5_DIGEST_PARAMS[] = {
{
- CURLX_FUNCTION_CAST(Curl_digest_init_func, MD5_Init),
- CURLX_FUNCTION_CAST(Curl_digest_update_func, MD5_Update),
- CURLX_FUNCTION_CAST(Curl_digest_final_func, MD5_Final),
+ CURLX_FUNCTION_CAST(digest_init_func, MD5_Init),
+ CURLX_FUNCTION_CAST(digest_update_func, MD5_Update),
+ CURLX_FUNCTION_CAST(digest_final_func, MD5_Final),
sizeof(MD5_CTX),
16
}
};
-const digest_params SHA1_DIGEST_PARAMS[] = {
+const struct digest_params SHA1_DIGEST_PARAMS[] = {
{
- CURLX_FUNCTION_CAST(Curl_digest_init_func, SHA1_Init),
- CURLX_FUNCTION_CAST(Curl_digest_update_func, SHA1_Update),
- CURLX_FUNCTION_CAST(Curl_digest_final_func, SHA1_Final),
+ CURLX_FUNCTION_CAST(digest_init_func, SHA1_Init),
+ CURLX_FUNCTION_CAST(digest_update_func, SHA1_Update),
+ CURLX_FUNCTION_CAST(digest_final_func, SHA1_Final),
sizeof(SHA_CTX),
20
}
};
-const digest_params SHA256_DIGEST_PARAMS[] = {
+const struct digest_params SHA256_DIGEST_PARAMS[] = {
{
- CURLX_FUNCTION_CAST(Curl_digest_init_func, SHA256_Init),
- CURLX_FUNCTION_CAST(Curl_digest_update_func, SHA256_Update),
- CURLX_FUNCTION_CAST(Curl_digest_final_func, SHA256_Final),
+ CURLX_FUNCTION_CAST(digest_init_func, SHA256_Init),
+ CURLX_FUNCTION_CAST(digest_update_func, SHA256_Update),
+ CURLX_FUNCTION_CAST(digest_final_func, SHA256_Final),
sizeof(SHA256_CTX),
32
}
};
-static const metalink_digest_def SHA256_DIGEST_DEF[] = {
+static const struct metalink_digest_def SHA256_DIGEST_DEF[] = {
{"sha-256", SHA256_DIGEST_PARAMS}
};
-static const metalink_digest_def SHA1_DIGEST_DEF[] = {
+static const struct metalink_digest_def SHA1_DIGEST_DEF[] = {
{"sha-1", SHA1_DIGEST_PARAMS}
};
-static const metalink_digest_def MD5_DIGEST_DEF[] = {
+static const struct metalink_digest_def MD5_DIGEST_DEF[] = {
{"md5", MD5_DIGEST_PARAMS}
};
@@ -511,7 +448,7 @@ static const metalink_digest_def MD5_DIGEST_DEF[] = {
* "Hash Function Textual Names". The latter is widely (and
* historically) used in Metalink version 3.
*/
-static const metalink_digest_alias digest_aliases[] = {
+static const struct metalink_digest_alias digest_aliases[] = {
{"sha-256", SHA256_DIGEST_DEF},
{"sha256", SHA256_DIGEST_DEF},
{"sha-1", SHA1_DIGEST_DEF},
@@ -520,13 +457,9 @@ static const metalink_digest_alias digest_aliases[] = {
{NULL, NULL}
};
-digest_context *Curl_digest_init(const digest_params *dparams)
+static struct digest_context *digest_init(const struct digest_params *dparams)
{
- digest_context *ctxt;
-
- /* Create digest context */
- ctxt = malloc(sizeof(*ctxt));
-
+ struct digest_context *ctxt = malloc(sizeof(*ctxt));
if(!ctxt)
return ctxt;
@@ -548,16 +481,16 @@ digest_context *Curl_digest_init(const digest_params *dparams)
return ctxt;
}
-int Curl_digest_update(digest_context *context,
- const unsigned char *data,
- unsigned int len)
+static int digest_update(struct digest_context *context,
+ const unsigned char *data,
+ unsigned int len)
{
(*context->digest_hash->digest_update)(context->digest_hashctx, data, len);
return 0;
}
-int Curl_digest_final(digest_context *context, unsigned char *result)
+static int digest_final(struct digest_context *context, unsigned char *result)
{
if(result)
(*context->digest_hash->digest_final)(result, context->digest_hashctx);
@@ -594,11 +527,11 @@ static unsigned char hex_to_uint(const char *s)
* Hash algorithm not available.
*/
static int check_hash(const char *filename,
- const metalink_digest_def *digest_def,
+ const struct metalink_digest_def *digest_def,
const unsigned char *digest, FILE *error)
{
unsigned char *result;
- digest_context *dctx;
+ struct digest_context *dctx;
int check_ok, flags, fd;
flags = O_RDONLY;
@@ -614,7 +547,7 @@ static int check_hash(const char *filename,
return -1;
}
- dctx = Curl_digest_init(digest_def->dparams);
+ dctx = digest_init(digest_def->dparams);
if(!dctx) {
fprintf(error, "Metalink: validating (%s) [%s] FAILED (%s)\n", filename,
digest_def->hash_name, "failed to initialize hash algorithm");
@@ -625,7 +558,7 @@ static int check_hash(const char *filename,
result = malloc(digest_def->dparams->digest_resultlen);
if(!result) {
close(fd);
- Curl_digest_final(dctx, NULL);
+ digest_final(dctx, NULL);
return -1;
}
while(1) {
@@ -637,13 +570,13 @@ static int check_hash(const char *filename,
else if(len == -1) {
fprintf(error, "Metalink: validating (%s) [%s] FAILED (%s)\n", filename,
digest_def->hash_name, strerror(errno));
- Curl_digest_final(dctx, result);
+ digest_final(dctx, result);
close(fd);
return -1;
}
- Curl_digest_update(dctx, buf, (unsigned int)len);
+ digest_update(dctx, buf, (unsigned int)len);
}
- Curl_digest_final(dctx, result);
+ digest_final(dctx, result);
check_ok = memcmp(result, digest,
digest_def->dparams->digest_resultlen) == 0;
/* sha*sum style verdict output */
@@ -660,7 +593,7 @@ static int check_hash(const char *filename,
}
int metalink_check_hash(struct GlobalConfig *config,
- metalinkfile *mlfile,
+ struct metalinkfile *mlfile,
const char *filename)
{
int rv;
@@ -675,11 +608,11 @@ int metalink_check_hash(struct GlobalConfig *config,
return rv;
}
-static metalink_checksum *
-checksum_from_hex_digest(const metalink_digest_def *digest_def,
+static struct metalink_checksum *
+checksum_from_hex_digest(const struct metalink_digest_def *digest_def,
const char *hex_digest)
{
- metalink_checksum *chksum;
+ struct metalink_checksum *chksum;
unsigned char *digest;
size_t i;
size_t len = strlen(hex_digest);
@@ -690,7 +623,7 @@ checksum_from_hex_digest(const metalink_digest_def *digest_def,
for(i = 0; i < len; i += 2) {
digest[i/2] = hex_to_uint(hex_digest + i);
}
- chksum = malloc(sizeof(metalink_checksum));
+ chksum = malloc(sizeof(struct metalink_checksum));
if(chksum) {
chksum->digest_def = digest_def;
chksum->digest = digest;
@@ -700,10 +633,9 @@ checksum_from_hex_digest(const metalink_digest_def *digest_def,
return chksum;
}
-static metalink_resource *new_metalink_resource(const char *url)
+static struct metalink_resource *new_metalink_resource(const char *url)
{
- metalink_resource *res;
- res = malloc(sizeof(metalink_resource));
+ struct metalink_resource *res = malloc(sizeof(struct metalink_resource));
if(res) {
res->next = NULL;
res->url = strdup(url);
@@ -719,7 +651,7 @@ static metalink_resource *new_metalink_resource(const char *url)
letter is in [0-9A-Za-z] and the length of the string equals to the
result length of digest * 2. */
static int check_hex_digest(const char *hex_digest,
- const metalink_digest_def *digest_def)
+ const struct metalink_digest_def *digest_def)
{
size_t i;
for(i = 0; hex_digest[i]; ++i) {
@@ -732,10 +664,9 @@ static int check_hex_digest(const char *hex_digest,
return digest_def->dparams->digest_resultlen * 2 == i;
}
-static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
+static struct metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
{
- metalinkfile *f;
- f = (metalinkfile*)malloc(sizeof(metalinkfile));
+ struct metalinkfile *f = malloc(sizeof(struct metalinkfile));
if(!f)
return NULL;
@@ -748,7 +679,7 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
f->checksum = NULL;
f->resource = NULL;
if(fileinfo->checksums) {
- const metalink_digest_alias *digest_alias;
+ const struct metalink_digest_alias *digest_alias;
for(digest_alias = digest_aliases; digest_alias->alias_name;
++digest_alias) {
metalink_checksum_t **p;
@@ -768,11 +699,11 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
}
if(fileinfo->resources) {
metalink_resource_t **p;
- metalink_resource root, *tail;
+ struct metalink_resource root, *tail;
root.next = NULL;
tail = &root;
for(p = fileinfo->resources; *p; ++p) {
- metalink_resource *res;
+ struct metalink_resource *res;
/* Filter by type if it is non-NULL. In Metalink v3, type
includes the type of the resource. In curl, we are only
interested in HTTP, HTTPS and FTP. In addition to them,
@@ -861,7 +792,7 @@ int parse_metalink(struct OperationConfig *config, struct OutStruct *outs,
url = new_getout(config);
if(url) {
- metalinkfile *mlfile = new_metalinkfile(*files);
+ struct metalinkfile *mlfile = new_metalinkfile(*files);
if(!mlfile)
break;
@@ -895,7 +826,7 @@ size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb,
{
struct per_transfer *per = userdata;
struct OutStruct *outs = &per->outs;
- struct OperationConfig *config = outs->config;
+ struct OperationConfig *config = per->config;
int rv;
/*
@@ -939,24 +870,23 @@ int check_metalink_content_type(const char *content_type)
return check_content_type(content_type, "application/metalink+xml");
}
-int count_next_metalink_resource(metalinkfile *mlfile)
+int count_next_metalink_resource(struct metalinkfile *mlfile)
{
int count = 0;
- metalink_resource *res;
+ struct metalink_resource *res;
for(res = mlfile->resource; res; res = res->next, ++count);
return count;
}
-static void delete_metalink_checksum(metalink_checksum *chksum)
+static void delete_metalink_checksum(struct metalink_checksum *chksum)
{
- if(chksum == NULL) {
+ if(!chksum)
return;
- }
Curl_safefree(chksum->digest);
Curl_safefree(chksum);
}
-static void delete_metalink_resource(metalink_resource *res)
+static void delete_metalink_resource(struct metalink_resource *res)
{
if(res == NULL) {
return;
@@ -965,16 +895,16 @@ static void delete_metalink_resource(metalink_resource *res)
Curl_safefree(res);
}
-void delete_metalinkfile(metalinkfile *mlfile)
+void delete_metalinkfile(struct metalinkfile *mlfile)
{
- metalink_resource *res;
+ struct metalink_resource *res;
if(mlfile == NULL) {
return;
}
Curl_safefree(mlfile->filename);
delete_metalink_checksum(mlfile->checksum);
for(res = mlfile->resource; res;) {
- metalink_resource *next;
+ struct metalink_resource *next;
next = res->next;
delete_metalink_resource(res);
res = next;
@@ -986,7 +916,7 @@ void clean_metalink(struct OperationConfig *config)
{
if(config) {
while(config->metalinkfile_list) {
- metalinkfile *mlfile = config->metalinkfile_list;
+ struct metalinkfile *mlfile = config->metalinkfile_list;
config->metalinkfile_list = config->metalinkfile_list->next;
delete_metalinkfile(mlfile);
}
diff --git a/src/tool_metalink.h b/src/tool_metalink.h
index f5ec306f7..abf75dd17 100644
--- a/src/tool_metalink.h
+++ b/src/tool_metalink.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,59 +28,53 @@ struct GlobalConfig;
struct OperationConfig;
/* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */
-typedef int (* Curl_digest_init_func)(void *context);
-
-typedef void (* Curl_digest_update_func)(void *context,
- const unsigned char *data,
- unsigned int len);
-typedef void (* Curl_digest_final_func)(unsigned char *result, void *context);
-
-typedef struct {
- Curl_digest_init_func digest_init; /* Initialize context procedure */
- Curl_digest_update_func digest_update; /* Update context with data */
- Curl_digest_final_func digest_final; /* Get final result procedure */
- unsigned int digest_ctxtsize; /* Context structure size */
- unsigned int digest_resultlen; /* Result length (bytes) */
-} digest_params;
-
-typedef struct {
- const digest_params *digest_hash; /* Hash function definition */
+typedef int (*digest_init_func)(void *context);
+
+typedef void (*digest_update_func)(void *context,
+ const unsigned char *data,
+ unsigned int len);
+typedef void (*digest_final_func)(unsigned char *result, void *context);
+
+struct digest_params {
+ digest_init_func digest_init; /* Initialize context procedure */
+ digest_update_func digest_update; /* Update context with data */
+ digest_final_func digest_final; /* Get final result procedure */
+ unsigned int digest_ctxtsize; /* Context structure size */
+ unsigned int digest_resultlen; /* Result length (bytes) */
+};
+
+struct digest_context {
+ const struct digest_params *digest_hash; /* Hash function definition */
void *digest_hashctx; /* Hash function context */
-} digest_context;
+};
-digest_context * Curl_digest_init(const digest_params *dparams);
-int Curl_digest_update(digest_context *context,
- const unsigned char *data,
- unsigned int len);
-int Curl_digest_final(digest_context *context, unsigned char *result);
-
-typedef struct {
+struct metalink_digest_def {
const char *hash_name;
- const digest_params *dparams;
-} metalink_digest_def;
+ const struct digest_params *dparams;
+};
-typedef struct {
+struct metalink_digest_alias {
const char *alias_name;
- const metalink_digest_def *digest_def;
-} metalink_digest_alias;
+ const struct metalink_digest_def *digest_def;
+};
-typedef struct metalink_checksum {
- const metalink_digest_def *digest_def;
+struct metalink_checksum {
+ const struct metalink_digest_def *digest_def;
/* raw digest value, not ascii hex digest */
unsigned char *digest;
-} metalink_checksum;
+};
-typedef struct metalink_resource {
+struct metalink_resource {
struct metalink_resource *next;
char *url;
-} metalink_resource;
+};
-typedef struct metalinkfile {
+struct metalinkfile {
struct metalinkfile *next;
char *filename;
- metalink_checksum *checksum;
- metalink_resource *resource;
-} metalinkfile;
+ struct metalink_checksum *checksum;
+ struct metalink_resource *resource;
+};
#ifdef USE_METALINK
@@ -95,18 +89,18 @@ typedef struct metalinkfile {
(CURL_REQ_LIBMETALINK_MINOR * 100) + \
CURL_REQ_LIBMETALINK_PATCH)
-extern const digest_params MD5_DIGEST_PARAMS[1];
-extern const digest_params SHA1_DIGEST_PARAMS[1];
-extern const digest_params SHA256_DIGEST_PARAMS[1];
+extern const struct digest_params MD5_DIGEST_PARAMS[1];
+extern const struct digest_params SHA1_DIGEST_PARAMS[1];
+extern const struct digest_params SHA256_DIGEST_PARAMS[1];
#include <metalink/metalink.h>
/*
* Counts the resource in the metalinkfile.
*/
-int count_next_metalink_resource(metalinkfile *mlfile);
+int count_next_metalink_resource(struct metalinkfile *mlfile);
-void delete_metalinkfile(metalinkfile *mlfile);
+void delete_metalinkfile(struct metalinkfile *mlfile);
void clean_metalink(struct OperationConfig *config);
/*
@@ -149,7 +143,7 @@ int check_metalink_content_type(const char *content_type);
* Metalink does not contain checksum.
*/
int metalink_check_hash(struct GlobalConfig *config,
- metalinkfile *mlfile,
+ struct metalinkfile *mlfile,
const char *filename);
/*
diff --git a/src/tool_msgs.c b/src/tool_msgs.c
index f5e1df25f..48877b30d 100644
--- a/src/tool_msgs.c
+++ b/src/tool_msgs.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -32,6 +32,7 @@
#define WARN_PREFIX "Warning: "
#define NOTE_PREFIX "Note: "
+#define ERROR_PREFIX "curl: "
static void voutf(struct GlobalConfig *config,
const char *prefix,
@@ -104,9 +105,9 @@ void warnf(struct GlobalConfig *config, const char *fmt, ...)
va_end(ap);
}
/*
- * Emit help formatted message on given stream.
+ * Emit help formatted message on given stream. This is for errors with or
+ * related to command line arguments.
*/
-
void helpf(FILE *errors, const char *fmt, ...)
{
if(fmt) {
@@ -122,3 +123,17 @@ void helpf(FILE *errors, const char *fmt, ...)
#endif
"for more information\n");
}
+
+/*
+ * Emit error message on error stream if not muted. When errors are not tied
+ * to command line arguments, use helpf() for such errors.
+ */
+void errorf(struct GlobalConfig *config, const char *fmt, ...)
+{
+ if(!config->mute) {
+ va_list ap;
+ va_start(ap, fmt);
+ voutf(config, ERROR_PREFIX, fmt, ap);
+ va_end(ap);
+ }
+}
diff --git a/src/tool_msgs.h b/src/tool_msgs.h
index d1cc7f8d5..2c4afd180 100644
--- a/src/tool_msgs.h
+++ b/src/tool_msgs.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,7 +25,7 @@
void warnf(struct GlobalConfig *config, const char *fmt, ...);
void notef(struct GlobalConfig *config, const char *fmt, ...);
-
void helpf(FILE *errors, const char *fmt, ...);
+void errorf(struct GlobalConfig *config, const char *fmt, ...);
#endif /* HEADER_CURL_TOOL_MSGS_H */
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 3087d2d14..e3fec0b4a 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,8 @@
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+# include <unistd.h>
#endif
#ifdef __VMS
@@ -318,8 +320,10 @@ static CURLcode pre_transfer(struct GlobalConfig *global,
if(S_ISREG(fileinfo.st_mode))
uploadfilesize = fileinfo.st_size;
- if(uploadfilesize != -1)
+ if(uploadfilesize != -1) {
+ struct OperationConfig *config = per->config; /* for the macro below */
my_setopt(per->curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
+ }
per->input.fd = per->infd;
}
return result;
@@ -331,7 +335,8 @@ static CURLcode pre_transfer(struct GlobalConfig *global,
static CURLcode post_per_transfer(struct GlobalConfig *global,
struct per_transfer *per,
CURLcode result,
- bool *retryp)
+ bool *retryp,
+ long *delay) /* milliseconds! */
{
struct OutStruct *outs = &per->outs;
CURL *curl = per->curl;
@@ -341,6 +346,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
return result;
*retryp = FALSE;
+ *delay = 0; /* for no retry, keep it zero */
if(per->infdopen)
close(per->infd);
@@ -380,7 +386,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
/* do not create (or even overwrite) the file in case we get no
data because of unmet condition */
curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
- if(!cond_unmet && !tool_create_output_file(outs))
+ if(!cond_unmet && !tool_create_output_file(outs, config))
result = CURLE_WRITE_ERROR;
}
@@ -423,10 +429,6 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
metalink_parser_context_delete(outs->metalink_parser);
#endif /* USE_METALINK */
- if(outs->is_cd_filename && outs->stream && !global->mute &&
- outs->filename)
- printf("curl: Saved to filename '%s'\n", outs->filename);
-
/* if retry-max-time is non-zero, make sure we haven't exceeded the
time */
if(per->retry_numretries &&
@@ -435,13 +437,14 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
config->retry_maxtime*1000L)) ) {
enum {
RETRY_NO,
+ RETRY_ALL_ERRORS,
RETRY_TIMEOUT,
RETRY_CONNREFUSED,
RETRY_HTTP,
RETRY_FTP,
RETRY_LAST /* not used */
} retry = RETRY_NO;
- long response;
+ long response = 0;
if((CURLE_OPERATION_TIMEDOUT == result) ||
(CURLE_COULDNT_RESOLVE_HOST == result) ||
(CURLE_COULDNT_RESOLVE_PROXY == result) ||
@@ -450,7 +453,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
retry = RETRY_TIMEOUT;
else if(config->retry_connrefused &&
(CURLE_COULDNT_CONNECT == result)) {
- long oserrno;
+ long oserrno = 0;
curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
if(ECONNREFUSED == oserrno)
retry = RETRY_CONNREFUSED;
@@ -461,7 +464,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
/* If it returned OK. _or_ failonerror was enabled and it
returned due to such an error, check for HTTP transient
errors to retry on. */
- long protocol;
+ long protocol = 0;
curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
if((protocol == CURLPROTO_HTTP) || (protocol == CURLPROTO_HTTPS)) {
/* This was HTTP(S) */
@@ -489,7 +492,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
}
} /* if CURLE_OK */
else if(result) {
- long protocol;
+ long protocol = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
@@ -504,15 +507,19 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
retry = RETRY_FTP;
}
+ if(result && !retry && config->retry_all_errors)
+ retry = RETRY_ALL_ERRORS;
+
if(retry) {
long sleeptime = 0;
curl_off_t retry_after = 0;
static const char * const m[]={
NULL,
- "timeout",
- "connection refused",
- "HTTP error",
- "FTP error"
+ "(retrying all errors)",
+ ": timeout",
+ ": connection refused",
+ ": HTTP error",
+ ": FTP error"
};
sleeptime = per->retry_sleep;
@@ -526,13 +533,12 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
sleeptime = (long)retry_after * 1000; /* milliseconds */
}
}
- warnf(config->global, "Transient problem: %s "
+ warnf(config->global, "Problem %s. "
"Will retry in %ld seconds. "
"%ld retries left.\n",
m[retry], sleeptime/1000L, per->retry_numretries);
per->retry_numretries--;
- tool_go_sleep(sleeptime);
if(!config->retry_delay) {
per->retry_sleep *= 2;
if(per->retry_sleep > RETRY_SLEEP_MAX)
@@ -575,14 +581,15 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
}
outs->bytes = 0; /* clear for next round */
}
- *retryp = TRUE; /* curl_easy_perform loop */
+ *retryp = TRUE;
+ *delay = sleeptime;
return CURLE_OK;
}
} /* if retry_numretries */
else if(per->metalink) {
/* Metalink: Decide to try the next resource or not. Try the next resource
if download was not successful. */
- long response;
+ long response = 0;
if(CURLE_OK == result) {
/* TODO We want to try next resource when download was
not successful. How to know that? */
@@ -617,7 +624,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
fputs("\n", per->progressbar.out);
if(config->writeout)
- ourWriteOut(per->curl, &per->outs, config->writeout);
+ ourWriteOut(per->curl, per, config->writeout);
/* Close the outs file */
if(outs->fopened && outs->stream) {
@@ -644,6 +651,12 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
if(per->heads.alloc_filename)
Curl_safefree(per->heads.filename);
+ if(per->etag_save.fopened && per->etag_save.stream)
+ fclose(per->etag_save.stream);
+
+ if(per->etag_save.alloc_filename)
+ Curl_safefree(per->etag_save.filename);
+
curl_easy_cleanup(per->curl);
if(outs->alloc_filename)
free(outs->filename);
@@ -686,7 +699,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
{
CURLcode result = CURLE_OK;
struct getout *urlnode;
- metalinkfile *mlfile_last = NULL;
+ struct metalinkfile *mlfile_last = NULL;
bool orig_noprogress = global->noprogress;
bool orig_isatty = global->isatty;
struct State *state = &config->state;
@@ -700,7 +713,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
httpgetfields = state->httpgetfields = strdup(config->postfields);
Curl_safefree(config->postfields);
if(!httpgetfields) {
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
result = CURLE_OUT_OF_MEMORY;
}
else if(SetHTTPrequest(config,
@@ -714,8 +727,10 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq))
result = CURLE_FAILED_INIT;
}
- if(result)
+ if(result) {
+ single_transfer_cleanup(config);
return result;
+ }
}
if(!state->urlnode) {
/* first time caller, setup things */
@@ -725,10 +740,10 @@ static CURLcode single_transfer(struct GlobalConfig *global,
while(config->state.urlnode) {
char *infiles; /* might be a glob pattern */
- URLGlob *inglob = state->inglob;
+ struct URLGlob *inglob = state->inglob;
bool metalink = FALSE; /* metalink download? */
- metalinkfile *mlfile;
- metalink_resource *mlres;
+ struct metalinkfile *mlfile;
+ struct metalink_resource *mlres;
urlnode = config->state.urlnode;
if(urlnode->flags & GETOUT_METALINK) {
@@ -762,7 +777,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(urlnode->outfile && !state->outfiles) {
state->outfiles = strdup(urlnode->outfile);
if(!state->outfiles) {
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
result = CURLE_OUT_OF_MEMORY;
break;
}
@@ -790,12 +805,12 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(inglob) {
result = glob_next_url(&state->uploadfile, inglob);
if(result == CURLE_OUT_OF_MEMORY)
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
}
else if(!state->up) {
state->uploadfile = strdup(infiles);
if(!state->uploadfile) {
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
result = CURLE_OUT_OF_MEMORY;
}
}
@@ -829,17 +844,12 @@ static CURLcode single_transfer(struct GlobalConfig *global,
separator = ((!state->outfiles ||
!strcmp(state->outfiles, "-")) && urlnum > 1);
- /* Here's looping around each globbed URL */
-
- if(state->li >= urlnum) {
- state->li = 0;
- state->up++;
- }
if(state->up < state->infilenum) {
struct per_transfer *per;
struct OutStruct *outs;
struct InStruct *input;
struct OutStruct *heads;
+ struct OutStruct *etag_save;
struct HdrCbData *hdrcbdata = NULL;
CURL *curl = curl_easy_init();
result = add_per_transfer(&per);
@@ -863,13 +873,13 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* default headers output stream is stdout */
heads = &per->heads;
heads->stream = stdout;
- heads->config = config;
/* Single header file for all URLs */
if(config->headerfile) {
/* open file for output: */
if(strcmp(config->headerfile, "-")) {
- FILE *newfile = fopen(config->headerfile, "wb");
+ FILE *newfile;
+ newfile = fopen(config->headerfile, per->prev == NULL?"wb":"ab");
if(!newfile) {
warnf(config->global, "Failed to open %s\n", config->headerfile);
result = CURLE_WRITE_ERROR;
@@ -888,7 +898,6 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
}
-
hdrcbdata = &per->hdrcbdata;
outs = &per->outs;
@@ -900,7 +909,76 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* default output stream is stdout */
outs->stream = stdout;
- outs->config = config;
+
+ /* --etag-compare */
+ if(config->etag_compare_file) {
+ char *etag_from_file = NULL;
+ char *header = NULL;
+
+ /* open file for reading: */
+ FILE *file = fopen(config->etag_compare_file, FOPEN_READTEXT);
+ if(!file && !config->etag_save_file) {
+ errorf(config->global,
+ "Failed to open %s\n", config->etag_compare_file);
+ result = CURLE_READ_ERROR;
+ break;
+ }
+
+ if((PARAM_OK == file2string(&etag_from_file, file)) &&
+ etag_from_file) {
+ header = aprintf("If-None-Match: %s", etag_from_file);
+ Curl_safefree(etag_from_file);
+ }
+ else
+ header = aprintf("If-None-Match: \"\"");
+
+ if(!header) {
+ if(file)
+ fclose(file);
+ errorf(config->global,
+ "Failed to allocate memory for custom etag header\n");
+ result = CURLE_OUT_OF_MEMORY;
+ break;
+ }
+
+ /* add Etag from file to list of custom headers */
+ add2list(&config->headers, header);
+
+ Curl_safefree(header);
+
+ if(file) {
+ fclose(file);
+ }
+ }
+
+ /* --etag-save */
+ etag_save = &per->etag_save;
+ etag_save->stream = stdout;
+
+ if(config->etag_save_file) {
+ /* open file for output: */
+ if(strcmp(config->etag_save_file, "-")) {
+ FILE *newfile = fopen(config->etag_save_file, "wb");
+ if(!newfile) {
+ warnf(
+ config->global,
+ "Failed to open %s\n", config->etag_save_file);
+
+ result = CURLE_WRITE_ERROR;
+ break;
+ }
+ else {
+ etag_save->filename = config->etag_save_file;
+ etag_save->s_isreg = TRUE;
+ etag_save->fopened = TRUE;
+ etag_save->stream = newfile;
+ }
+ }
+ else {
+ /* always use binary mode for protocol header output */
+ set_binmode(etag_save->stream);
+ }
+ }
if(metalink) {
/* For Metalink download, use name in Metalink file as
@@ -959,7 +1037,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(result)
break;
if(!*per->outfile && !config->content_disposition) {
- helpf(global->errors, "Remote file name has no length!\n");
+ errorf(global, "Remote file name has no length!\n");
result = CURLE_WRITE_ERROR;
break;
}
@@ -976,6 +1054,15 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
}
+ if(config->output_dir) {
+ char *d = aprintf("%s/%s", config->output_dir, per->outfile);
+ if(!d) {
+ result = CURLE_WRITE_ERROR;
+ break;
+ }
+ free(per->outfile);
+ per->outfile = d;
+ }
/* Create the directory hierarchy, if not pre-existent to a multiple
file output call */
@@ -1016,7 +1103,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
FILE *file = fopen(per->outfile, "ab");
#endif
if(!file) {
- helpf(global->errors, "Can't open '%s'!\n", per->outfile);
+ errorf(global, "Can't open '%s'!\n", per->outfile);
result = CURLE_WRITE_ERROR;
break;
}
@@ -1086,11 +1173,11 @@ static CURLcode single_transfer(struct GlobalConfig *global,
isatty(fileno(outs->stream)))
/* we send the output to a tty, therefore we switch off the progress
meter */
- global->noprogress = global->isatty = TRUE;
+ per->noprogress = global->noprogress = global->isatty = TRUE;
else {
/* progress meter is per download, so restore config
values */
- global->noprogress = orig_noprogress;
+ per->noprogress = global->noprogress = orig_noprogress;
global->isatty = orig_isatty;
}
@@ -1285,6 +1372,9 @@ static CURLcode single_transfer(struct GlobalConfig *global,
config->postfieldsize);
break;
case HTTPREQ_MIMEPOST:
+ /* free previous remainders */
+ curl_mime_free(config->mimepost);
+ config->mimepost = NULL;
result = tool2curlmime(curl, config->mimeroot, &config->mimepost);
if(result)
break;
@@ -1434,6 +1524,9 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->pinnedpubkey)
my_setopt_str(curl, CURLOPT_PINNEDPUBLICKEY, config->pinnedpubkey);
+ if(config->ssl_ec_curves)
+ my_setopt_str(curl, CURLOPT_SSL_EC_CURVES, config->ssl_ec_curves);
+
if(curlinfo->features & CURL_VERSION_SSL) {
/* Check if config->cert is a PKCS#11 URI and set the
* config->cert_type if necessary */
@@ -1475,11 +1568,90 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
}
+ /* In debug build of curl tool, using
+ * --cert loadmem=<filename>:<password> --cert-type p12
+ * must do the same thing than classic:
+ * --cert <filename>:<password> --cert-type p12
+ * but is designed to test blob */
+#if defined(CURLDEBUG) || defined(DEBUGBUILD)
+ if(config->cert && (strlen(config->cert) > 8) &&
+ (memcmp(config->cert, "loadmem=",8) == 0)) {
+ FILE *fInCert = fopen(config->cert + 8, "rb");
+ void *certdata = NULL;
+ long filesize = 0;
+ bool continue_reading = fInCert != NULL;
+ if(continue_reading)
+ continue_reading = fseek(fInCert, 0, SEEK_END) == 0;
+ if(continue_reading)
+ filesize = ftell(fInCert);
+ if(filesize < 0)
+ continue_reading = FALSE;
+ if(continue_reading)
+ continue_reading = fseek(fInCert, 0, SEEK_SET) == 0;
+ if(continue_reading)
+ certdata = malloc(((size_t)filesize) + 1);
+ if((!certdata) ||
+ ((int)fread(certdata, (size_t)filesize, 1, fInCert) != 1))
+ continue_reading = FALSE;
+ if(fInCert)
+ fclose(fInCert);
+ if((filesize > 0) && continue_reading) {
+ struct curl_blob structblob;
+ structblob.data = certdata;
+ structblob.len = (size_t)filesize;
+ structblob.flags = CURL_BLOB_COPY;
+ my_setopt_str(curl, CURLOPT_SSLCERT_BLOB, &structblob);
+ /* if test run well, we are sure we don't reuse
+ * original mem pointer */
+ memset(certdata, 0, (size_t)filesize);
+ }
+ free(certdata);
+ }
+ else
+#endif
my_setopt_str(curl, CURLOPT_SSLCERT, config->cert);
my_setopt_str(curl, CURLOPT_PROXY_SSLCERT, config->proxy_cert);
my_setopt_str(curl, CURLOPT_SSLCERTTYPE, config->cert_type);
my_setopt_str(curl, CURLOPT_PROXY_SSLCERTTYPE,
config->proxy_cert_type);
+
+
+#if defined(CURLDEBUG) || defined(DEBUGBUILD)
+ if(config->key && (strlen(config->key) > 8) &&
+ (memcmp(config->key, "loadmem=",8) == 0)) {
+ FILE *fInCert = fopen(config->key + 8, "rb");
+ void *certdata = NULL;
+ long filesize = 0;
+ bool continue_reading = fInCert != NULL;
+ if(continue_reading)
+ continue_reading = fseek(fInCert, 0, SEEK_END) == 0;
+ if(continue_reading)
+ filesize = ftell(fInCert);
+ if(filesize < 0)
+ continue_reading = FALSE;
+ if(continue_reading)
+ continue_reading = fseek(fInCert, 0, SEEK_SET) == 0;
+ if(continue_reading)
+ certdata = malloc(((size_t)filesize) + 1);
+ if((!certdata) ||
+ ((int)fread(certdata, (size_t)filesize, 1, fInCert) != 1))
+ continue_reading = FALSE;
+ if(fInCert)
+ fclose(fInCert);
+ if((filesize > 0) && continue_reading) {
+ struct curl_blob structblob;
+ structblob.data = certdata;
+ structblob.len = (size_t)filesize;
+ structblob.flags = CURL_BLOB_COPY;
+ my_setopt_str(curl, CURLOPT_SSLKEY_BLOB, &structblob);
+ /* if test run well, we are sure we don't reuse
+ * original mem pointer */
+ memset(certdata, 0, (size_t)filesize);
+ }
+ free(certdata);
+ }
+ else
+#endif
my_setopt_str(curl, CURLOPT_SSLKEY, config->key);
my_setopt_str(curl, CURLOPT_PROXY_SSLKEY, config->proxy_key);
my_setopt_str(curl, CURLOPT_SSLKEYTYPE, config->key_type);
@@ -1513,7 +1685,25 @@ static CURLcode single_transfer(struct GlobalConfig *global,
config->ssl_version | config->ssl_version_max);
my_setopt_enum(curl, CURLOPT_PROXY_SSLVERSION,
config->proxy_ssl_version);
+
+ {
+ long mask =
+ (config->ssl_allow_beast ? CURLSSLOPT_ALLOW_BEAST : 0) |
+ (config->ssl_revoke_best_effort ?
+ CURLSSLOPT_REVOKE_BEST_EFFORT : 0) |
+ (config->native_ca_store ?
+ CURLSSLOPT_NATIVE_CA : 0) |
+ (config->ssl_no_revoke ? CURLSSLOPT_NO_REVOKE : 0);
+
+ if(mask)
+ my_setopt_bitmask(curl, CURLOPT_SSL_OPTIONS, mask);
+ }
+
+ if(config->proxy_ssl_allow_beast)
+ my_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS,
+ (long)CURLSSLOPT_ALLOW_BEAST);
}
+
if(config->path_as_is)
my_setopt(curl, CURLOPT_PATH_AS_IS, 1L);
@@ -1521,8 +1711,8 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(!config->insecure_ok) {
char *home;
char *file;
- result = CURLE_OUT_OF_MEMORY;
- home = homedir();
+ result = CURLE_FAILED_INIT;
+ home = homedir(NULL);
if(home) {
file = aprintf("%s/.ssh/known_hosts", home);
if(file) {
@@ -1535,6 +1725,9 @@ static CURLcode single_transfer(struct GlobalConfig *global,
}
Curl_safefree(home);
}
+ else {
+ errorf(global, "Failed to figure out user's home dir!");
+ }
if(result)
break;
}
@@ -1579,7 +1772,14 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* we want the alternative style, then we have to implement it
ourselves! */
my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb);
- my_setopt(curl, CURLOPT_XFERINFODATA, &per->progressbar);
+ my_setopt(curl, CURLOPT_XFERINFODATA, per);
+ }
+ else if(per->uploadfile && !strcmp(per->uploadfile, ".")) {
+ /* when reading from stdin in non-blocking mode, we use the progress
+ function to unpause a busy read */
+ my_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+ my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_readbusy_cb);
+ my_setopt(curl, CURLOPT_XFERINFODATA, per);
}
/* new in libcurl 7.24.0: */
@@ -1655,12 +1855,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt(curl, CURLOPT_MAXFILESIZE_LARGE,
config->max_filesize);
- if(4 == config->ip_version)
- my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
- else if(6 == config->ip_version)
- my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
- else
- my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
+ my_setopt(curl, CURLOPT_IPRESOLVE, config->ip_version);
/* new in curl 7.15.5 */
if(config->ftp_ssl_reqd)
@@ -1751,6 +1946,10 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->mail_rcpt)
my_setopt_slist(curl, CURLOPT_MAIL_RCPT, config->mail_rcpt);
+ /* curl 7.69.x */
+ my_setopt(curl, CURLOPT_MAIL_RCPT_ALLLOWFAILS,
+ config->mail_rcpt_allowfails ? 1L : 0L);
+
/* curl 7.20.x */
if(config->ftp_pret)
my_setopt(curl, CURLOPT_FTP_USE_PRET, 1L);
@@ -1768,6 +1967,7 @@ static CURLcode single_transfer(struct GlobalConfig *global,
hdrcbdata->outs = outs;
hdrcbdata->heads = heads;
+ hdrcbdata->etag_save = etag_save;
hdrcbdata->global = global;
hdrcbdata->config = config;
@@ -1809,18 +2009,6 @@ static CURLcode single_transfer(struct GlobalConfig *global,
my_setopt_str(curl, CURLOPT_GSSAPI_DELEGATION,
config->gssapi_delegation);
- /* new in 7.25.0 and 7.44.0 */
- {
- long mask = (config->ssl_allow_beast ? CURLSSLOPT_ALLOW_BEAST : 0) |
- (config->ssl_no_revoke ? CURLSSLOPT_NO_REVOKE : 0);
- if(mask)
- my_setopt_bitmask(curl, CURLOPT_SSL_OPTIONS, mask);
- }
-
- if(config->proxy_ssl_allow_beast)
- my_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS,
- (long)CURLSSLOPT_ALLOW_BEAST);
-
if(config->mail_auth)
my_setopt_str(curl, CURLOPT_MAIL_AUTH, config->mail_auth);
@@ -1877,11 +2065,8 @@ static CURLcode single_transfer(struct GlobalConfig *global,
if(config->disallow_username_in_url)
my_setopt(curl, CURLOPT_DISALLOW_USERNAME_IN_URL, 1L);
-#ifdef USE_ALTSVC
- /* only if explicitly enabled in configure */
if(config->altsvc)
my_setopt_str(curl, CURLOPT_ALTSVC, config->altsvc);
-#endif
#ifdef USE_METALINK
if(!metalink && config->use_metalink) {
@@ -1908,6 +2093,15 @@ static CURLcode single_transfer(struct GlobalConfig *global,
per->retrystart = tvnow();
state->li++;
+ /* Here's looping around each globbed URL */
+ if(state->li >= urlnum) {
+ state->li = 0;
+ state->urlnum = 0; /* forced reglob of URLs */
+ glob_cleanup(state->urls);
+ state->urls = NULL;
+ state->up++;
+ Curl_safefree(state->uploadfile); /* clear it to get the next */
+ }
}
else {
/* Free this URL node data without destroying the
@@ -1957,10 +2151,11 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
struct per_transfer *per;
CURLcode result = CURLE_OK;
CURLMcode mcode;
+ bool sleeping = FALSE;
*addedp = FALSE;
*morep = FALSE;
result = create_transfer(global, share, addedp);
- if(result || !*addedp)
+ if(result)
return result;
for(per = transfers; per && (all_added < global->parallel_max);
per = per->next) {
@@ -1968,11 +2163,20 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
if(per->added)
/* already added */
continue;
+ if(per->startat && (time(NULL) < per->startat)) {
+ /* this is still delaying */
+ sleeping = TRUE;
+ continue;
+ }
result = pre_transfer(global, per);
if(result)
break;
+ /* parallel connect means that we don't set PIPEWAIT since pipewait
+ will make libcurl prefer multiplexing */
+ (void)curl_easy_setopt(per->curl, CURLOPT_PIPEWAIT,
+ global->parallel_connect ? 0L : 1L);
(void)curl_easy_setopt(per->curl, CURLOPT_PRIVATE, per);
(void)curl_easy_setopt(per->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
(void)curl_easy_setopt(per->curl, CURLOPT_XFERINFODATA, per);
@@ -1988,7 +2192,7 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global,
all_added++;
*addedp = TRUE;
}
- *morep = per ? TRUE : FALSE;
+ *morep = (per || sleeping) ? TRUE : FALSE;
return CURLE_OK;
}
@@ -2002,6 +2206,7 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
struct timeval start = tvnow();
bool more_transfers;
bool added_transfers;
+ time_t tick = time(NULL);
multi = curl_multi_init();
if(!multi)
@@ -2009,8 +2214,10 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
result = add_parallel_transfers(global, multi, share,
&more_transfers, &added_transfers);
- if(result)
+ if(result) {
+ curl_multi_cleanup(multi);
return result;
+ }
while(!mcode && (still_running || more_transfers)) {
mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
@@ -2022,27 +2229,39 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
if(!mcode) {
int rc;
CURLMsg *msg;
- bool removed = FALSE;
+ bool checkmore = FALSE;
do {
msg = curl_multi_info_read(multi, &rc);
if(msg) {
bool retry;
+ long delay;
struct per_transfer *ended;
CURL *easy = msg->easy_handle;
result = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
curl_multi_remove_handle(multi, easy);
- result = post_per_transfer(global, ended, result, &retry);
- if(retry)
- continue;
+ result = post_per_transfer(global, ended, result, &retry, &delay);
progress_finalize(ended); /* before it goes away */
all_added--; /* one fewer added */
- removed = TRUE;
- (void)del_per_transfer(ended);
+ checkmore = TRUE;
+ if(retry) {
+ ended->added = FALSE; /* add it again */
+ /* we delay retries in full integer seconds only */
+ ended->startat = delay ? time(NULL) + delay/1000 : 0;
+ }
+ else
+ (void)del_per_transfer(ended);
}
} while(msg);
- if(removed) {
+ if(!checkmore) {
+ time_t tock = time(NULL);
+ if(tick != tock) {
+ checkmore = TRUE;
+ tick = tock;
+ }
+ }
+ if(checkmore) {
/* one or more transfers completed, add more! */
(void)add_parallel_transfers(global, multi, share,
&more_transfers,
@@ -2082,6 +2301,7 @@ static CURLcode serial_transfers(struct GlobalConfig *global,
return result;
for(per = transfers; per;) {
bool retry;
+ long delay;
bool bailout = FALSE;
result = pre_transfer(global, per);
if(result)
@@ -2104,9 +2324,11 @@ static CURLcode serial_transfers(struct GlobalConfig *global,
/* store the result of the actual transfer */
returncode = result;
- result = post_per_transfer(global, per, result, &retry);
- if(retry)
+ result = post_per_transfer(global, per, result, &retry, &delay);
+ if(retry) {
+ tool_go_sleep(delay);
continue;
+ }
/* Bail out upon critical errors or --fail-early */
if(result || is_fatal_error(returncode) ||
@@ -2193,7 +2415,7 @@ static CURLcode transfer_per_config(struct GlobalConfig *global,
config->cacert = strdup(env);
if(!config->cacert) {
curl_free(env);
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
return CURLE_OUT_OF_MEMORY;
}
}
@@ -2214,7 +2436,7 @@ static CURLcode transfer_per_config(struct GlobalConfig *global,
config->cacert = strdup(env);
if(!config->cacert) {
curl_free(env);
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
return CURLE_OUT_OF_MEMORY;
}
}
@@ -2226,7 +2448,7 @@ static CURLcode transfer_per_config(struct GlobalConfig *global,
#ifdef WIN32
else {
result = FindWin32CACert(config, tls_backend_info->backend,
- "curl-ca-bundle.crt");
+ TEXT("curl-ca-bundle.crt"));
}
#endif
}
@@ -2281,7 +2503,8 @@ static CURLcode run_all_transfers(struct GlobalConfig *global,
/* cleanup if there are any left */
for(per = transfers; per;) {
bool retry;
- CURLcode result2 = post_per_transfer(global, per, result, &retry);
+ long delay;
+ CURLcode result2 = post_per_transfer(global, per, result, &retry, &delay);
if(!result)
/* don't overwrite the original error */
result = result2;
@@ -2305,6 +2528,7 @@ static CURLcode run_all_transfers(struct GlobalConfig *global,
CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
{
CURLcode result = CURLE_OK;
+ char *first_arg = curlx_convert_tchar_to_UTF8(argv[1]);
/* Setup proper locale from environment */
#ifdef HAVE_SETLOCALE
@@ -2313,8 +2537,8 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
/* Parse .curlrc if necessary */
if((argc == 1) ||
- (!curl_strequal(argv[1], "-q") &&
- !curl_strequal(argv[1], "--disable"))) {
+ (!curl_strequal(first_arg, "-q") &&
+ !curl_strequal(first_arg, "--disable"))) {
parseconfig(NULL, global); /* ignore possible failure */
/* If we had no arguments then make sure a url was specified in .curlrc */
@@ -2324,6 +2548,8 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
}
}
+ curlx_unicodefree(first_arg);
+
if(!result) {
/* Parse the command line arguments */
ParameterError res = parse_args(global, argc, argv);
@@ -2332,7 +2558,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
/* Check if we were asked for the help */
if(res == PARAM_HELP_REQUESTED)
- tool_help();
+ tool_help(global->help_category);
/* Check if we were asked for the manual */
else if(res == PARAM_MANUAL_REQUESTED)
hugehelp();
@@ -2401,7 +2627,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
#endif
}
else
- helpf(global->errors, "out of memory\n");
+ errorf(global, "out of memory\n");
}
}
diff --git a/src/tool_operate.h b/src/tool_operate.h
index 60257fc60..6cb3bd036 100644
--- a/src/tool_operate.h
+++ b/src/tool_operate.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -38,20 +38,27 @@ struct per_transfer {
struct timeval retrystart;
bool metalink; /* nonzero for metalink download. */
bool metalink_next_res;
- metalinkfile *mlfile;
- metalink_resource *mlres;
+ struct metalinkfile *mlfile;
+ struct metalink_resource *mlres;
char *this_url;
char *outfile;
bool infdopen; /* TRUE if infd needs closing */
int infd;
+ bool noprogress;
struct ProgressData progressbar;
struct OutStruct outs;
struct OutStruct heads;
+ struct OutStruct etag_save;
struct InStruct input;
struct HdrCbData hdrcbdata;
+ long num_headers;
+ bool was_last_header_empty;
char errorbuffer[CURL_ERROR_SIZE];
bool added; /* set TRUE when added to the multi handle */
+ time_t startat; /* when doing parallel transfers, this is a retry transfer
+ that has been set to sleep until this time before it
+ should get started (again) */
/* for parallel progress bar */
curl_off_t dltotal;
diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c
index 543bf4302..05c9d864a 100644
--- a/src/tool_operhlp.c
+++ b/src/tool_operhlp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -85,7 +85,7 @@ char *add_file_name_to_url(char *url, const char *filename)
else
ptr = url;
ptr = strrchr(ptr, '/');
- if(!ptr || !strlen(++ptr)) {
+ if(!ptr || !*++ptr) {
/* The URL has no file name part, add the local file name. In order
to be able to do so, we have to create a new URL in another
buffer.*/
@@ -115,16 +115,17 @@ char *add_file_name_to_url(char *url, const char *filename)
urlbuffer = aprintf("%s/%s", url, encfile);
curl_free(encfile);
- Curl_safefree(url);
- if(!urlbuffer)
- return NULL;
+ if(!urlbuffer) {
+ url = NULL;
+ goto end;
+ }
+ Curl_safefree(url);
url = urlbuffer; /* use our new URL instead! */
}
- else
- Curl_safefree(url);
}
+ end:
curl_easy_cleanup(curl);
return url;
}
diff --git a/src/tool_panykey.c b/src/tool_panykey.c
index b0e556307..e7ee99518 100644
--- a/src/tool_panykey.c
+++ b/src/tool_panykey.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
***************************************************************************/
#include "tool_setup.h"
-#if defined(__SYMBIAN32__) || defined(NETWARE)
+#if defined(NETWARE)
#ifdef NETWARE
# ifdef __NOVELL_LIBC__
@@ -37,11 +37,9 @@
void tool_pressanykey(void)
{
-#if defined(__SYMBIAN32__)
- getchar();
-#elif defined(NETWARE)
+#if defined(NETWARE)
pressanykey();
#endif
}
-#endif /* __SYMBIAN32__ || NETWARE */
+#endif /* NETWARE */
diff --git a/src/tool_panykey.h b/src/tool_panykey.h
index 6371a88a7..2e8846ced 100644
--- a/src/tool_panykey.h
+++ b/src/tool_panykey.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,14 +23,10 @@
***************************************************************************/
#include "tool_setup.h"
-#if defined(__SYMBIAN32__) || defined(NETWARE)
-
+#if defined(NETWARE)
void tool_pressanykey(void);
-
#else
-
#define tool_pressanykey() Curl_nop_stmt
-
#endif
#endif /* HEADER_CURL_TOOL_PANYKEY_H */
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index af47516b6..03cd44fee 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,6 +34,7 @@
#include "tool_msgs.h"
#include "tool_paramhlp.h"
#include "tool_version.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -56,100 +57,52 @@ struct getout *new_getout(struct OperationConfig *config)
return node;
}
+#define MAX_FILE2STRING (256*1024*1024) /* big enough ? */
+
ParameterError file2string(char **bufp, FILE *file)
{
- char *string = NULL;
+ struct curlx_dynbuf dyn;
+ curlx_dyn_init(&dyn, MAX_FILE2STRING);
if(file) {
- char *ptr;
- size_t alloc = 512;
- size_t alloc_needed;
char buffer[256];
- size_t stringlen = 0;
- string = malloc(alloc);
- if(!string)
- return PARAM_NO_MEM;
while(fgets(buffer, sizeof(buffer), file)) {
- size_t buflen;
- ptr = strchr(buffer, '\r');
+ char *ptr = strchr(buffer, '\r');
if(ptr)
*ptr = '\0';
ptr = strchr(buffer, '\n');
if(ptr)
*ptr = '\0';
- buflen = strlen(buffer);
- alloc_needed = stringlen + buflen + 1;
- if(alloc < alloc_needed) {
-#if SIZEOF_SIZE_T < 8
- if(alloc >= (size_t)SIZE_T_MAX/2) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
- }
-#endif
- /* doubling is enough since the string to add is always max 256 bytes
- and the alloc size start at 512 */
- alloc *= 2;
- ptr = realloc(string, alloc);
- if(!ptr) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
- }
- string = ptr;
- }
- strcpy(string + stringlen, buffer);
- stringlen += buflen;
+ if(curlx_dyn_add(&dyn, buffer))
+ return PARAM_NO_MEM;
}
}
- *bufp = string;
+ *bufp = curlx_dyn_ptr(&dyn);
return PARAM_OK;
}
+#define MAX_FILE2MEMORY (1024*1024*1024) /* big enough ? */
+
ParameterError file2memory(char **bufp, size_t *size, FILE *file)
{
- char *newbuf;
- char *buffer = NULL;
- size_t nused = 0;
-
if(file) {
size_t nread;
- size_t alloc = 512;
+ struct curlx_dynbuf dyn;
+ curlx_dyn_init(&dyn, MAX_FILE2MEMORY);
do {
- if(!buffer || (alloc == nused)) {
- /* size_t overflow detection for huge files */
- if(alloc + 1 > ((size_t)-1)/2) {
- Curl_safefree(buffer);
- return PARAM_NO_MEM;
- }
- alloc *= 2;
- /* allocate an extra char, reserved space, for null termination */
- newbuf = realloc(buffer, alloc + 1);
- if(!newbuf) {
- Curl_safefree(buffer);
+ char buffer[4096];
+ nread = fread(buffer, 1, sizeof(buffer), file);
+ if(nread)
+ if(curlx_dyn_addn(&dyn, buffer, nread))
return PARAM_NO_MEM;
- }
- buffer = newbuf;
- }
- nread = fread(buffer + nused, 1, alloc-nused, file);
- nused += nread;
} while(nread);
- /* null terminate the buffer in case it's used as a string later */
- buffer[nused] = '\0';
- /* free trailing slack space, if possible */
- if(alloc != nused) {
- newbuf = realloc(buffer, nused + 1);
- if(!newbuf) {
- Curl_safefree(buffer);
- return PARAM_NO_MEM;
- }
- buffer = newbuf;
- }
- /* discard buffer if nothing was read */
- if(!nused) {
- Curl_safefree(buffer); /* no string */
- }
+ *size = curlx_dyn_len(&dyn);
+ *bufp = curlx_dyn_ptr(&dyn);
+ }
+ else {
+ *size = 0;
+ *bufp = NULL;
}
- *size = nused;
- *bufp = buffer;
return PARAM_OK;
}
@@ -180,7 +133,7 @@ void cleanarg(char *str)
ParameterError str2num(long *val, const char *str)
{
if(str) {
- char *endptr;
+ char *endptr = NULL;
long num;
errno = 0;
num = strtol(str, &endptr, 10);
@@ -460,6 +413,7 @@ ParameterError str2offset(curl_off_t *val, const char *str)
return PARAM_BAD_NUMERIC;
}
+#define MAX_USERPWDLENGTH (100*1024)
static CURLcode checkpasswd(const char *kind, /* for what purpose */
const size_t i, /* operation index */
const bool last, /* TRUE if last operation */
@@ -479,12 +433,11 @@ static CURLcode checkpasswd(const char *kind, /* for what purpose */
if(!psep && **userpwd != ';') {
/* no password present, prompt for one */
- char passwd[256] = "";
+ char passwd[2048] = "";
char prompt[256];
- size_t passwdlen;
- size_t userlen = strlen(*userpwd);
- char *passptr;
+ struct curlx_dynbuf dyn;
+ curlx_dyn_init(&dyn, MAX_USERPWDLENGTH);
if(osep)
*osep = '\0';
@@ -500,22 +453,15 @@ static CURLcode checkpasswd(const char *kind, /* for what purpose */
/* get password */
getpass_r(prompt, passwd, sizeof(passwd));
- passwdlen = strlen(passwd);
-
if(osep)
*osep = ';';
- /* extend the allocated memory area to fit the password too */
- passptr = realloc(*userpwd,
- passwdlen + 1 + /* an extra for the colon */
- userlen + 1); /* an extra for the zero */
- if(!passptr)
+ if(curlx_dyn_addf(&dyn, "%s:%s", *userpwd, passwd))
return CURLE_OUT_OF_MEMORY;
- /* append the password separated with a colon */
- passptr[userlen] = ':';
- memcpy(&passptr[userlen + 1], passwd, passwdlen + 1);
- *userpwd = passptr;
+ /* return the new string */
+ free(*userpwd);
+ *userpwd = curlx_dyn_ptr(&dyn);
}
return CURLE_OK;
@@ -560,7 +506,7 @@ int ftpcccmethod(struct OperationConfig *config, const char *str)
return CURLFTPSSL_CCC_PASSIVE;
}
-long delegation(struct OperationConfig *config, char *str)
+long delegation(struct OperationConfig *config, const char *str)
{
if(curl_strequal("none", str))
return CURLGSSAPI_DELEGATION_NONE;
@@ -606,7 +552,7 @@ CURLcode get_args(struct OperationConfig *config, const size_t i)
if(!config->useragent) {
config->useragent = my_useragent();
if(!config->useragent) {
- helpf(config->global->errors, "out of memory\n");
+ errorf(config->global, "out of memory\n");
result = CURLE_OUT_OF_MEMORY;
}
}
diff --git a/src/tool_paramhlp.h b/src/tool_paramhlp.h
index f13a114fd..d925b8476 100644
--- a/src/tool_paramhlp.h
+++ b/src/tool_paramhlp.h
@@ -50,7 +50,7 @@ int ftpfilemethod(struct OperationConfig *config, const char *str);
int ftpcccmethod(struct OperationConfig *config, const char *str);
-long delegation(struct OperationConfig *config, char *str);
+long delegation(struct OperationConfig *config, const char *str);
ParameterError str2tls_max(long *val, const char *str);
diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c
index 9b32e54a0..abd493ae5 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,6 +31,7 @@
#include "tool_homedir.h"
#include "tool_msgs.h"
#include "tool_parsecfg.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
@@ -39,7 +40,9 @@
#define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':')))
static const char *unslashquote(const char *line, char *param);
-static char *my_get_line(FILE *fp);
+
+#define MAX_CONFIG_LINE_LENGTH (100*1024)
+static bool my_get_line(FILE *fp, struct curlx_dynbuf *, bool *error);
#ifdef WIN32
static FILE *execpath(const char *filename)
@@ -76,13 +79,13 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
FILE *file = NULL;
bool usedarg = FALSE;
int rc = 0;
- struct OperationConfig *operation = global->first;
+ struct OperationConfig *operation = global->last;
char *pathalloc = NULL;
if(!filename || !*filename) {
/* NULL or no file name attempts to load .curlrc from the homedir! */
- char *home = homedir(); /* portable homedir finder */
+ char *home = homedir(".curlrc");
#ifndef WIN32
if(home) {
pathalloc = curl_maprintf("%s%s.curlrc", home, DIR_CHAR);
@@ -97,6 +100,8 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
int i = 0;
char prefix = '.';
do {
+ /* if it was allocated in a previous attempt */
+ curl_free(pathalloc);
/* check for .curlrc then _curlrc in the home dir */
pathalloc = curl_maprintf("%s%s%ccurlrc", home, DIR_CHAR, prefix);
if(!pathalloc) {
@@ -133,17 +138,23 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
if(file) {
char *line;
- char *aline;
char *option;
char *param;
int lineno = 0;
bool dashed_option;
+ struct curlx_dynbuf buf;
+ bool fileerror;
+ curlx_dyn_init(&buf, MAX_CONFIG_LINE_LENGTH);
- while(NULL != (aline = my_get_line(file))) {
+ while(my_get_line(file, &buf, &fileerror)) {
int res;
bool alloced_param = FALSE;
lineno++;
- line = aline;
+ line = curlx_dyn_ptr(&buf);
+ if(!line) {
+ rc = 1; /* out of memory */
+ break;
+ }
/* line with # in the first non-blank column is a comment! */
while(*line && ISSPACE(*line))
@@ -156,7 +167,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
case '\n':
case '*':
case '\0':
- Curl_safefree(aline);
+ curlx_dyn_reset(&buf);
continue;
}
@@ -171,7 +182,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
/* ... and has ended here */
if(*line)
- *line++ = '\0'; /* zero terminate, we have a local copy of the data */
+ *line++ = '\0'; /* null-terminate, we have a local copy of the data */
#ifdef DEBUG_CONFIG
fprintf(stderr, "GOT: %s\n", option);
@@ -188,7 +199,6 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
param = malloc(strlen(line) + 1); /* parameter */
if(!param) {
/* out of memory */
- Curl_safefree(aline);
rc = 1;
break;
}
@@ -201,7 +211,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
line++;
if(*line) {
- *line = '\0'; /* zero terminate */
+ *line = '\0'; /* null-terminate */
/* to detect mistakes better, see if there's data following */
line++;
@@ -217,7 +227,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
break;
default:
warnf(operation->global, "%s:%d: warning: '%s' uses unquoted "
- "white space in the line that may cause side-effects!\n",
+ "whitespace in the line that may cause side-effects!\n",
filename, lineno, option);
}
}
@@ -231,6 +241,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
fprintf(stderr, "PARAM: \"%s\"\n",(param ? param : "(null)"));
#endif
res = getparameter(option, param, &usedarg, global, operation);
+ operation = global->last;
if(!res && param && *param && !usedarg)
/* we passed in a parameter that wasn't used! */
@@ -277,15 +288,18 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
if(alloced_param)
Curl_safefree(param);
- Curl_safefree(aline);
+ curlx_dyn_reset(&buf);
}
+ curlx_dyn_free(&buf);
if(file != stdin)
fclose(file);
+ if(fileerror)
+ rc = 1;
}
else
rc = 1; /* couldn't open the file */
- free(pathalloc);
+ curl_free(pathalloc);
return rc;
}
@@ -326,45 +340,29 @@ static const char *unslashquote(const char *line, char *param)
else
*param++ = *line++;
}
- *param = '\0'; /* always zero terminate */
+ *param = '\0'; /* always null-terminate */
return line;
}
/*
* Reads a line from the given file, ensuring is NUL terminated.
- * The pointer must be freed by the caller.
- * NULL is returned on an out of memory condition.
*/
-static char *my_get_line(FILE *fp)
+static bool my_get_line(FILE *fp, struct curlx_dynbuf *db,
+ bool *error)
{
char buf[4096];
- char *nl = NULL;
- char *line = NULL;
-
+ *error = FALSE;
do {
- if(NULL == fgets(buf, sizeof(buf), fp))
- break;
- if(!line) {
- line = strdup(buf);
- if(!line)
- return NULL;
+ /* fgets() returns s on success, and NULL on error or when end of file
+ occurs while no characters have been read. */
+ if(!fgets(buf, sizeof(buf), fp))
+ /* only if there's data in the line, return TRUE */
+ return curlx_dyn_len(db) ? TRUE : FALSE;
+ if(curlx_dyn_add(db, buf)) {
+ *error = TRUE; /* error */
+ return FALSE; /* stop reading */
}
- else {
- char *ptr;
- size_t linelen = strlen(line);
- ptr = realloc(line, linelen + strlen(buf) + 1);
- if(!ptr) {
- Curl_safefree(line);
- return NULL;
- }
- line = ptr;
- strcpy(&line[linelen], buf);
- }
- nl = strchr(line, '\n');
- } while(!nl);
+ } while(!strchr(buf, '\n'));
- if(nl)
- *nl = '\0';
-
- return line;
+ return TRUE; /* continue */
}
diff --git a/src/tool_parsecfg.h b/src/tool_parsecfg.h
index 340626190..49919a7f2 100644
--- a/src/tool_parsecfg.h
+++ b/src/tool_parsecfg.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_progress.c b/src/tool_progress.c
index a2667f38e..31cd56ae4 100644
--- a/src/tool_progress.c
+++ b/src/tool_progress.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -95,10 +95,17 @@ int xferinfo_cb(void *clientp,
curl_off_t ulnow)
{
struct per_transfer *per = clientp;
+ struct OperationConfig *config = per->config;
per->dltotal = dltotal;
per->dlnow = dlnow;
per->ultotal = ultotal;
per->ulnow = ulnow;
+
+ if(config->readbusy) {
+ config->readbusy = FALSE;
+ curl_easy_pause(per->curl, CURLPAUSE_CONT);
+ }
+
return 0;
}
diff --git a/src/tool_sdecls.h b/src/tool_sdecls.h
index ebec9eebb..ccc9f5aba 100644
--- a/src/tool_sdecls.h
+++ b/src/tool_sdecls.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -69,7 +69,6 @@ struct OutStruct {
bool s_isreg;
bool fopened;
FILE *stream;
- struct OperationConfig *config;
curl_off_t bytes;
curl_off_t init;
#ifdef USE_METALINK
diff --git a/src/tool_setopt.c b/src/tool_setopt.c
index 4c98d9057..0dd7a57a2 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,7 @@
#define NV1(e, v) {#e, (v)}
#define NVEND {NULL, 0} /* sentinel to mark end of list */
-const NameValue setopt_nv_CURLPROXY[] = {
+const struct NameValue setopt_nv_CURLPROXY[] = {
NV(CURLPROXY_HTTP),
NV(CURLPROXY_HTTP_1_0),
NV(CURLPROXY_HTTPS),
@@ -54,7 +54,7 @@ const NameValue setopt_nv_CURLPROXY[] = {
NVEND,
};
-const NameValue setopt_nv_CURL_SOCKS_PROXY[] = {
+const struct NameValue setopt_nv_CURL_SOCKS_PROXY[] = {
NV(CURLPROXY_SOCKS4),
NV(CURLPROXY_SOCKS5),
NV(CURLPROXY_SOCKS4A),
@@ -62,7 +62,7 @@ const NameValue setopt_nv_CURL_SOCKS_PROXY[] = {
NVEND,
};
-const NameValueUnsigned setopt_nv_CURLAUTH[] = {
+const struct NameValueUnsigned setopt_nv_CURLAUTH[] = {
NV(CURLAUTH_ANY), /* combination */
NV(CURLAUTH_ANYSAFE), /* combination */
NV(CURLAUTH_BASIC),
@@ -76,7 +76,7 @@ const NameValueUnsigned setopt_nv_CURLAUTH[] = {
NVEND,
};
-const NameValue setopt_nv_CURL_HTTP_VERSION[] = {
+const struct NameValue setopt_nv_CURL_HTTP_VERSION[] = {
NV(CURL_HTTP_VERSION_NONE),
NV(CURL_HTTP_VERSION_1_0),
NV(CURL_HTTP_VERSION_1_1),
@@ -86,7 +86,7 @@ const NameValue setopt_nv_CURL_HTTP_VERSION[] = {
NVEND,
};
-const NameValue setopt_nv_CURL_SSLVERSION[] = {
+const struct NameValue setopt_nv_CURL_SSLVERSION[] = {
NV(CURL_SSLVERSION_DEFAULT),
NV(CURL_SSLVERSION_TLSv1),
NV(CURL_SSLVERSION_SSLv2),
@@ -98,7 +98,7 @@ const NameValue setopt_nv_CURL_SSLVERSION[] = {
NVEND,
};
-const NameValue setopt_nv_CURL_TIMECOND[] = {
+const struct NameValue setopt_nv_CURL_TIMECOND[] = {
NV(CURL_TIMECOND_IFMODSINCE),
NV(CURL_TIMECOND_IFUNMODSINCE),
NV(CURL_TIMECOND_LASTMOD),
@@ -106,14 +106,14 @@ const NameValue setopt_nv_CURL_TIMECOND[] = {
NVEND,
};
-const NameValue setopt_nv_CURLFTPSSL_CCC[] = {
+const struct NameValue setopt_nv_CURLFTPSSL_CCC[] = {
NV(CURLFTPSSL_CCC_NONE),
NV(CURLFTPSSL_CCC_PASSIVE),
NV(CURLFTPSSL_CCC_ACTIVE),
NVEND,
};
-const NameValue setopt_nv_CURLUSESSL[] = {
+const struct NameValue setopt_nv_CURLUSESSL[] = {
NV(CURLUSESSL_NONE),
NV(CURLUSESSL_TRY),
NV(CURLUSESSL_CONTROL),
@@ -121,13 +121,16 @@ const NameValue setopt_nv_CURLUSESSL[] = {
NVEND,
};
-const NameValueUnsigned setopt_nv_CURLSSLOPT[] = {
+const struct NameValueUnsigned setopt_nv_CURLSSLOPT[] = {
NV(CURLSSLOPT_ALLOW_BEAST),
NV(CURLSSLOPT_NO_REVOKE),
+ NV(CURLSSLOPT_NO_PARTIALCHAIN),
+ NV(CURLSSLOPT_REVOKE_BEST_EFFORT),
+ NV(CURLSSLOPT_NATIVE_CA),
NVEND,
};
-const NameValue setopt_nv_CURL_NETRC[] = {
+const struct NameValue setopt_nv_CURL_NETRC[] = {
NV(CURL_NETRC_IGNORED),
NV(CURL_NETRC_OPTIONAL),
NV(CURL_NETRC_REQUIRED),
@@ -136,7 +139,7 @@ const NameValue setopt_nv_CURL_NETRC[] = {
/* These mappings essentially triplicated - see
* tool_libinfo.c and tool_paramhlp.c */
-const NameValue setopt_nv_CURLPROTO[] = {
+const struct NameValue setopt_nv_CURLPROTO[] = {
NV(CURLPROTO_ALL), /* combination */
NV(CURLPROTO_DICT),
NV(CURLPROTO_FILE),
@@ -164,7 +167,7 @@ const NameValue setopt_nv_CURLPROTO[] = {
};
/* These options have non-zero default values. */
-static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
+static const struct NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
NV1(CURLOPT_SSL_VERIFYPEER, 1),
NV1(CURLOPT_SSL_VERIFYHOST, 1),
NV1(CURLOPT_SSL_ENABLE_NPN, 1),
@@ -181,18 +184,18 @@ static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
ret = easysrc_add args; \
if(ret) \
goto nomem; \
-} WHILE_FALSE
+} while(0)
#define ADDF(args) do { \
ret = easysrc_addf args; \
if(ret) \
goto nomem; \
-} WHILE_FALSE
+} while(0)
#define NULL_CHECK(p) do { \
if(!p) { \
ret = CURLE_OUT_OF_MEMORY; \
goto nomem; \
} \
-} WHILE_FALSE
+} while(0)
#define DECL0(s) ADD((&easysrc_decl, s))
#define DECL1(f,a) ADDF((&easysrc_decl, f,a))
@@ -216,26 +219,34 @@ static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
/* Escape string to C string syntax. Return NULL if out of memory.
* Is this correct for those wacky EBCDIC guys? */
-static char *c_escape(const char *str, size_t len)
+
+#define MAX_STRING_LENGTH_OUTPUT 2000
+#define ZERO_TERMINATED -1
+
+static char *c_escape(const char *str, curl_off_t len)
{
const char *s;
unsigned char c;
char *escaped, *e;
+ unsigned int cutoff = 0;
- if(len == CURL_ZERO_TERMINATED)
+ if(len == ZERO_TERMINATED)
len = strlen(str);
- /* Check for possible overflow. */
- if(len > (~(size_t) 0) / 4)
- return NULL;
+ if(len > MAX_STRING_LENGTH_OUTPUT) {
+ /* cap ridiculously long strings */
+ len = MAX_STRING_LENGTH_OUTPUT;
+ cutoff = 3;
+ }
/* Allocate space based on worst-case */
- escaped = malloc(4 * len + 1);
+ escaped = malloc(4 * (size_t)len + 1 + cutoff);
if(!escaped)
return NULL;
e = escaped;
- for(s = str; (c = *s) != '\0'; s++) {
+ for(s = str; len; s++, len--) {
+ c = *s;
if(c == '\n') {
strcpy(e, "\\n");
e += 2;
@@ -256,13 +267,15 @@ static char *c_escape(const char *str, size_t len)
strcpy(e, "\\\"");
e += 2;
}
- else if(! isprint(c)) {
- msnprintf(e, 5, "\\%03o", (unsigned)c);
+ else if(!isprint(c)) {
+ msnprintf(e, 5, "\\x%02x", (unsigned)c);
e += 4;
}
else
*e++ = c;
}
+ while(cutoff--)
+ *e++ = '.';
*e = '\0';
return escaped;
}
@@ -270,7 +283,7 @@ static char *c_escape(const char *str, size_t len)
/* setopt wrapper for enum types */
CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- const NameValue *nvlist, long lval)
+ const struct NameValue *nvlist, long lval)
{
CURLcode ret = CURLE_OK;
bool skip = FALSE;
@@ -281,11 +294,12 @@ CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
if(config->libcurl && !skip && !ret) {
/* we only use this for real if --libcurl was used */
- const NameValue *nv = NULL;
+ const struct NameValue *nv = NULL;
for(nv = nvlist; nv->name; nv++) {
- if(nv->value == lval) break; /* found it */
+ if(nv->value == lval)
+ break; /* found it */
}
- if(! nv->name) {
+ if(!nv->name) {
/* If no definition was found, output an explicit value.
* This could happen if new values are defined and used
* but the NameValue list is not updated. */
@@ -303,7 +317,7 @@ CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
/* setopt wrapper for flags */
CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- const NameValue *nvlist, long lval)
+ const struct NameValue *nvlist, long lval)
{
CURLcode ret = CURLE_OK;
bool skip = FALSE;
@@ -316,7 +330,7 @@ CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
/* we only use this for real if --libcurl was used */
char preamble[80]; /* should accommodate any symbol name */
long rest = lval; /* bits not handled yet */
- const NameValue *nv = NULL;
+ const struct NameValue *nv = NULL;
msnprintf(preamble, sizeof(preamble),
"curl_easy_setopt(hnd, %s, ", name);
for(nv = nvlist; nv->name; nv++) {
@@ -345,7 +359,7 @@ CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
/* setopt wrapper for bitmasks */
CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- const NameValueUnsigned *nvlist,
+ const struct NameValueUnsigned *nvlist,
long lval)
{
CURLcode ret = CURLE_OK;
@@ -359,7 +373,7 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
/* we only use this for real if --libcurl was used */
char preamble[80];
unsigned long rest = (unsigned long)lval;
- const NameValueUnsigned *nv = NULL;
+ const struct NameValueUnsigned *nv = NULL;
msnprintf(preamble, sizeof(preamble),
"curl_easy_setopt(hnd, %s, ", name);
for(nv = nvlist; nv->name; nv++) {
@@ -400,7 +414,7 @@ static CURLcode libcurl_generate_slist(struct curl_slist *slist, int *slistno)
CLEAN1("slist%d = NULL;", *slistno);
for(; slist; slist = slist->next) {
Curl_safefree(escaped);
- escaped = c_escape(slist->data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(slist->data, ZERO_TERMINATED);
if(!escaped)
return CURLE_OUT_OF_MEMORY;
DATA3("slist%d = curl_slist_append(slist%d, \"%s\");",
@@ -414,13 +428,13 @@ static CURLcode libcurl_generate_slist(struct curl_slist *slist, int *slistno)
static CURLcode libcurl_generate_mime(CURL *curl,
struct GlobalConfig *config,
- tool_mime *toolmime,
+ struct tool_mime *toolmime,
int *mimeno); /* Forward. */
/* Wrapper to generate source code for a mime part. */
static CURLcode libcurl_generate_mime_part(CURL *curl,
struct GlobalConfig *config,
- tool_mime *part,
+ struct tool_mime *part,
int mimeno)
{
CURLcode ret = CURLE_OK;
@@ -451,7 +465,7 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
case TOOLMIME_DATA:
#ifdef CURL_DOES_CONVERSIONS
/* Data will be set in ASCII, thus issue a comment with clear text. */
- escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->data, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE1("/* \"%s\" */", escaped);
@@ -470,7 +484,7 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
#endif
if(!ret) {
Curl_safefree(escaped);
- escaped = c_escape(data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(data, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
mimeno, escaped);
@@ -479,7 +493,7 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
case TOOLMIME_FILE:
case TOOLMIME_FILEDATA:
- escaped = c_escape(part->data, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->data, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_filedata(part%d, \"%s\");", mimeno, escaped);
if(part->kind == TOOLMIME_FILEDATA && !filename) {
@@ -504,28 +518,28 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
if(!ret && part->encoder) {
Curl_safefree(escaped);
- escaped = c_escape(part->encoder, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->encoder, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_encoder(part%d, \"%s\");", mimeno, escaped);
}
if(!ret && filename) {
Curl_safefree(escaped);
- escaped = c_escape(filename, CURL_ZERO_TERMINATED);
+ escaped = c_escape(filename, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_filename(part%d, \"%s\");", mimeno, escaped);
}
if(!ret && part->name) {
Curl_safefree(escaped);
- escaped = c_escape(part->name, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->name, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_name(part%d, \"%s\");", mimeno, escaped);
}
if(!ret && part->type) {
Curl_safefree(escaped);
- escaped = c_escape(part->type, CURL_ZERO_TERMINATED);
+ escaped = c_escape(part->type, ZERO_TERMINATED);
NULL_CHECK(escaped);
CODE2("curl_mime_type(part%d, \"%s\");", mimeno, escaped);
}
@@ -553,7 +567,7 @@ nomem:
/* Wrapper to generate source code for a mime structure. */
static CURLcode libcurl_generate_mime(CURL *curl,
struct GlobalConfig *config,
- tool_mime *toolmime,
+ struct tool_mime *toolmime,
int *mimeno)
{
CURLcode ret = CURLE_OK;
@@ -619,7 +633,8 @@ CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
/* generic setopt wrapper for all other options.
* Some type information is encoded in the tag value. */
-CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
+CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *global,
+ struct OperationConfig *config,
const char *name, CURLoption tag, ...)
{
va_list arg;
@@ -637,7 +652,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
/* Value is expected to be a long */
long lval = va_arg(arg, long);
long defval = 0L;
- const NameValue *nv = NULL;
+ const struct NameValue *nv = NULL;
for(nv = setopt_nv_CURLNONZERODEFAULTS; nv->name; nv++) {
if(!strcmp(name, nv->name)) {
defval = nv->value;
@@ -679,7 +694,7 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
ret = curl_easy_setopt(curl, tag, pval);
}
- else {
+ else if(tag < CURLOPTTYPE_BLOB) {
/* Value is expected to be curl_off_t */
curl_off_t oval = va_arg(arg, curl_off_t);
msnprintf(buf, sizeof(buf),
@@ -690,17 +705,34 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
if(!oval)
skip = TRUE;
}
+ else {
+ /* Value is a blob */
+ void *pblob = va_arg(arg, void *);
+
+ /* blobs are never printable */
+ if(pblob) {
+ value = "blobpointer";
+ remark = TRUE;
+ }
+ else
+ skip = TRUE;
+
+ ret = curl_easy_setopt(curl, tag, pblob);
+ }
va_end(arg);
- if(config->libcurl && !skip && !ret) {
+ if(global->libcurl && !skip && !ret) {
/* we only use this for real if --libcurl was used */
if(remark)
REM2("%s set to a %s", name, value);
else {
if(escape) {
- escaped = c_escape(value, CURL_ZERO_TERMINATED);
+ curl_off_t len = ZERO_TERMINATED;
+ if(tag == CURLOPT_POSTFIELDS)
+ len = config->postfieldsize;
+ escaped = c_escape(value, len);
NULL_CHECK(escaped);
CODE2("curl_easy_setopt(hnd, %s, \"%s\");", name, escaped);
}
diff --git a/src/tool_setopt.h b/src/tool_setopt.h
index 63401337f..3db88c6bf 100644
--- a/src/tool_setopt.h
+++ b/src/tool_setopt.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,7 +35,7 @@
if(result) \
break; \
} \
- } WHILE_FALSE
+ } while(0)
/* allow removed features to simulate success: */
bool tool_setopt_skip(CURLoption tag);
@@ -43,27 +43,27 @@ bool tool_setopt_skip(CURLoption tag);
#ifndef CURL_DISABLE_LIBCURL_OPTION
/* Associate symbolic names with option values */
-typedef struct {
+struct NameValue {
const char *name;
long value;
-} NameValue;
+};
-typedef struct {
+struct NameValueUnsigned {
const char *name;
unsigned long value;
-} NameValueUnsigned;
-
-extern const NameValue setopt_nv_CURLPROXY[];
-extern const NameValue setopt_nv_CURL_SOCKS_PROXY[];
-extern const NameValue setopt_nv_CURL_HTTP_VERSION[];
-extern const NameValue setopt_nv_CURL_SSLVERSION[];
-extern const NameValue setopt_nv_CURL_TIMECOND[];
-extern const NameValue setopt_nv_CURLFTPSSL_CCC[];
-extern const NameValue setopt_nv_CURLUSESSL[];
-extern const NameValueUnsigned setopt_nv_CURLSSLOPT[];
-extern const NameValue setopt_nv_CURL_NETRC[];
-extern const NameValue setopt_nv_CURLPROTO[];
-extern const NameValueUnsigned setopt_nv_CURLAUTH[];
+};
+
+extern const struct NameValue setopt_nv_CURLPROXY[];
+extern const struct NameValue setopt_nv_CURL_SOCKS_PROXY[];
+extern const struct NameValue setopt_nv_CURL_HTTP_VERSION[];
+extern const struct NameValue setopt_nv_CURL_SSLVERSION[];
+extern const struct NameValue setopt_nv_CURL_TIMECOND[];
+extern const struct NameValue setopt_nv_CURLFTPSSL_CCC[];
+extern const struct NameValue setopt_nv_CURLUSESSL[];
+extern const struct NameValueUnsigned setopt_nv_CURLSSLOPT[];
+extern const struct NameValue setopt_nv_CURL_NETRC[];
+extern const struct NameValue setopt_nv_CURLPROTO[];
+extern const struct NameValueUnsigned setopt_nv_CURLAUTH[];
/* Map options to NameValue sets */
#define setopt_nv_CURLOPT_HTTP_VERSION setopt_nv_CURL_HTTP_VERSION
@@ -85,27 +85,28 @@ extern const NameValueUnsigned setopt_nv_CURLAUTH[];
CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- const NameValue *nv, long lval);
+ const struct NameValue *nv, long lval);
CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- const NameValue *nv, long lval);
+ const struct NameValue *nv, long lval);
CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
- const NameValueUnsigned *nv, long lval);
+ const struct NameValueUnsigned *nv, long lval);
CURLcode tool_setopt_mimepost(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
curl_mime *mimepost);
CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
const char *name, CURLoption tag,
struct curl_slist *list);
-CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
+CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *global,
+ struct OperationConfig *config,
const char *name, CURLoption tag, ...);
#define my_setopt(x,y,z) \
- SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt(x, FALSE, global, config, #y, y, z), y)
#define my_setopt_str(x,y,z) \
- SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z), y)
+ SETOPT_CHECK(tool_setopt(x, TRUE, global, config, #y, y, z), y)
#define my_setopt_enum(x,y,z) \
SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z), y)
@@ -122,9 +123,9 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
#define my_setopt_slist(x,y,z) \
SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z), y)
-#define res_setopt(x,y,z) tool_setopt(x, FALSE, global, #y, y, z)
+#define res_setopt(x,y,z) tool_setopt(x, FALSE, global, config, #y, y, z)
-#define res_setopt_str(x,y,z) tool_setopt(x, TRUE, global, #y, y, z)
+#define res_setopt_str(x,y,z) tool_setopt(x, TRUE, global, config, #y, y, z)
#else /* CURL_DISABLE_LIBCURL_OPTION */
diff --git a/src/tool_setup.h b/src/tool_setup.h
index 854973e41..60a7ccd33 100644
--- a/src/tool_setup.h
+++ b/src/tool_setup.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_sleep.c b/src/tool_sleep.c
index edb5aedc0..0fd74a6d9 100644
--- a/src/tool_sleep.c
+++ b/src/tool_sleep.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,8 @@
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+# include <unistd.h>
#endif
#ifdef HAVE_POLL_H
diff --git a/src/tool_sleep.h b/src/tool_sleep.h
index 3aaab52d7..59be6aa33 100644
--- a/src/tool_sleep.h
+++ b/src/tool_sleep.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_strdup.c b/src/tool_strdup.c
index e6e151bd6..c8e938d16 100644
--- a/src/tool_strdup.c
+++ b/src/tool_strdup.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -30,18 +30,13 @@ char *strdup(const char *str)
if(!str)
return (char *)NULL;
- len = strlen(str);
+ len = strlen(str) + 1;
- if(len >= ((size_t)-1) / sizeof(char))
- return (char *)NULL;
-
- newstr = malloc((len + 1)*sizeof(char));
+ newstr = malloc(len);
if(!newstr)
return (char *)NULL;
- memcpy(newstr, str, (len + 1)*sizeof(char));
-
+ memcpy(newstr, str, len);
return newstr;
-
}
#endif
diff --git a/src/tool_strdup.h b/src/tool_strdup.h
index f84b202e0..e30e40310 100644
--- a/src/tool_strdup.h
+++ b/src/tool_strdup.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c
index 450cdcf32..23238b14b 100644
--- a/src/tool_urlglob.c
+++ b/src/tool_urlglob.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,15 +28,16 @@
#include "tool_doswin.h"
#include "tool_urlglob.h"
#include "tool_vms.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
#define GLOBERROR(string, column, code) \
glob->error = string, glob->pos = column, code
-static CURLcode glob_fixed(URLGlob *glob, char *fixed, size_t len)
+static CURLcode glob_fixed(struct URLGlob *glob, char *fixed, size_t len)
{
- URLPattern *pat = &glob->pattern[glob->size];
+ struct URLPattern *pat = &glob->pattern[glob->size];
pat->type = UPTSet;
pat->content.Set.size = 1;
pat->content.Set.ptr_s = 0;
@@ -74,14 +75,14 @@ static int multiply(unsigned long *amount, long with)
return 0;
}
-static CURLcode glob_set(URLGlob *glob, char **patternp,
+static CURLcode glob_set(struct URLGlob *glob, char **patternp,
size_t *posp, unsigned long *amount,
int globindex)
{
/* processes a set expression with the point behind the opening '{'
','-separated elements are collected until the next closing '}'
*/
- URLPattern *pat;
+ struct URLPattern *pat;
bool done = FALSE;
char *buf = glob->glob_buffer;
char *pattern = *patternp;
@@ -168,7 +169,7 @@ static CURLcode glob_set(URLGlob *glob, char **patternp,
return CURLE_OK;
}
-static CURLcode glob_range(URLGlob *glob, char **patternp,
+static CURLcode glob_range(struct URLGlob *glob, char **patternp,
size_t *posp, unsigned long *amount,
int globindex)
{
@@ -178,7 +179,7 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
- num range with leading zeros: e.g. "001-999]"
expression is checked for well-formedness and collected until the next ']'
*/
- URLPattern *pat;
+ struct URLPattern *pat;
int rc;
char *pattern = *patternp;
char *c;
@@ -319,6 +320,8 @@ static CURLcode glob_range(URLGlob *glob, char **patternp,
return CURLE_OK;
}
+#define MAX_IP6LEN 128
+
static bool peek_ipv6(const char *str, size_t *skip)
{
/*
@@ -326,30 +329,35 @@ static bool peek_ipv6(const char *str, size_t *skip)
* - Valid globs contain a hyphen and <= 1 colon.
* - IPv6 literals contain no hyphens and >= 2 colons.
*/
- size_t i = 0;
- size_t colons = 0;
- if(str[i++] != '[') {
+ char hostname[MAX_IP6LEN];
+ CURLU *u;
+ char *endbr = strchr(str, ']');
+ size_t hlen;
+ CURLUcode rc;
+ if(!endbr)
return FALSE;
- }
- for(;;) {
- const char c = str[i++];
- if(ISALNUM(c) || c == '.' || c == '%') {
- /* ok */
- }
- else if(c == ':') {
- colons++;
- }
- else if(c == ']') {
- *skip = i;
- return colons >= 2 ? TRUE : FALSE;
- }
- else {
- return FALSE;
- }
- }
+
+ hlen = endbr - str + 1;
+ if(hlen >= MAX_IP6LEN)
+ return FALSE;
+
+ u = curl_url();
+ if(!u)
+ return FALSE;
+
+ memcpy(hostname, str, hlen);
+ hostname[hlen] = 0;
+
+ /* ask to "guess scheme" as then it works without a https:// prefix */
+ rc = curl_url_set(u, CURLUPART_URL, hostname, CURLU_GUESS_SCHEME);
+
+ curl_url_cleanup(u);
+ if(!rc)
+ *skip = hlen;
+ return rc ? FALSE : TRUE;
}
-static CURLcode glob_parse(URLGlob *glob, char *pattern,
+static CURLcode glob_parse(struct URLGlob *glob, char *pattern,
size_t pos, unsigned long *amount)
{
/* processes a literal string component of a URL
@@ -427,14 +435,14 @@ static CURLcode glob_parse(URLGlob *glob, char *pattern,
return res;
}
-CURLcode glob_url(URLGlob **glob, char *url, unsigned long *urlnum,
+CURLcode glob_url(struct URLGlob **glob, char *url, unsigned long *urlnum,
FILE *error)
{
/*
* We can deal with any-size, just make a buffer with the same length
* as the specified URL!
*/
- URLGlob *glob_expand;
+ struct URLGlob *glob_expand;
unsigned long amount = 0;
char *glob_buffer;
CURLcode res;
@@ -446,7 +454,7 @@ CURLcode glob_url(URLGlob **glob, char *url, unsigned long *urlnum,
return CURLE_OUT_OF_MEMORY;
glob_buffer[0] = 0;
- glob_expand = calloc(1, sizeof(URLGlob));
+ glob_expand = calloc(1, sizeof(struct URLGlob));
if(!glob_expand) {
Curl_safefree(glob_buffer);
return CURLE_OUT_OF_MEMORY;
@@ -483,7 +491,7 @@ CURLcode glob_url(URLGlob **glob, char *url, unsigned long *urlnum,
return CURLE_OK;
}
-void glob_cleanup(URLGlob* glob)
+void glob_cleanup(struct URLGlob *glob)
{
size_t i;
int elem;
@@ -506,9 +514,9 @@ void glob_cleanup(URLGlob* glob)
Curl_safefree(glob);
}
-CURLcode glob_next_url(char **globbed, URLGlob *glob)
+CURLcode glob_next_url(char **globbed, struct URLGlob *glob)
{
- URLPattern *pat;
+ struct URLPattern *pat;
size_t i;
size_t len;
size_t buflen = glob->urllen + 1;
@@ -600,34 +608,29 @@ CURLcode glob_next_url(char **globbed, URLGlob *glob)
return CURLE_OK;
}
-CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
+#define MAX_OUTPUT_GLOB_LENGTH (10*1024)
+
+CURLcode glob_match_url(char **result, char *filename, struct URLGlob *glob)
{
- char *target;
- size_t allocsize;
char numbuf[18];
char *appendthis = (char *)"";
size_t appendlen = 0;
- size_t stringlen = 0;
+ struct curlx_dynbuf dyn;
*result = NULL;
- /* We cannot use the glob_buffer for storage here since the filename may
- * be longer than the URL we use. We allocate a good start size, then
- * we need to realloc in case of need.
+ /* We cannot use the glob_buffer for storage since the filename may be
+ * longer than the URL we use.
*/
- allocsize = strlen(filename) + 1; /* make it at least one byte to store the
- trailing zero */
- target = malloc(allocsize);
- if(!target)
- return CURLE_OUT_OF_MEMORY;
+ curlx_dyn_init(&dyn, MAX_OUTPUT_GLOB_LENGTH);
while(*filename) {
if(*filename == '#' && ISDIGIT(filename[1])) {
char *ptr = filename;
unsigned long num = strtoul(&filename[1], &filename, 10);
- URLPattern *pat = NULL;
+ struct URLPattern *pat = NULL;
- if(num < glob->size) {
+ if(num && (num < glob->size)) {
unsigned long i;
num--; /* make it zero based */
/* find the correct glob entry */
@@ -664,7 +667,7 @@ CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
default:
fprintf(stderr, "internal error: invalid pattern type (%d)\n",
(int)pat->type);
- Curl_safefree(target);
+ curlx_dyn_free(&dyn);
return CURLE_FAILED_INIT;
}
}
@@ -679,36 +682,24 @@ CURLcode glob_match_url(char **result, char *filename, URLGlob *glob)
appendthis = filename++;
appendlen = 1;
}
- if(appendlen + stringlen >= allocsize) {
- char *newstr;
- /* we append a single byte to allow for the trailing byte to be appended
- at the end of this function outside the while() loop */
- allocsize = (appendlen + stringlen) * 2;
- newstr = realloc(target, allocsize + 1);
- if(!newstr) {
- Curl_safefree(target);
- return CURLE_OUT_OF_MEMORY;
- }
- target = newstr;
- }
- memcpy(&target[stringlen], appendthis, appendlen);
- stringlen += appendlen;
+ if(curlx_dyn_addn(&dyn, appendthis, appendlen))
+ return CURLE_OUT_OF_MEMORY;
}
- target[stringlen]= '\0';
#if defined(MSDOS) || defined(WIN32)
{
char *sanitized;
- SANITIZEcode sc = sanitize_file_name(&sanitized, target,
+ SANITIZEcode sc = sanitize_file_name(&sanitized, curlx_dyn_ptr(&dyn),
(SANITIZE_ALLOW_PATH |
SANITIZE_ALLOW_RESERVED));
- Curl_safefree(target);
+ curlx_dyn_free(&dyn);
if(sc)
return CURLE_URL_MALFORMAT;
- target = sanitized;
+ *result = sanitized;
+ return CURLE_OK;
}
-#endif /* MSDOS || WIN32 */
-
- *result = target;
+#else
+ *result = curlx_dyn_ptr(&dyn);
return CURLE_OK;
+#endif /* MSDOS || WIN32 */
}
diff --git a/src/tool_urlglob.h b/src/tool_urlglob.h
index 55ac34611..5ed76671e 100644
--- a/src/tool_urlglob.h
+++ b/src/tool_urlglob.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -29,7 +29,7 @@ typedef enum {
UPTNumRange
} URLPatternType;
-typedef struct {
+struct URLPattern {
URLPatternType type;
int globindex; /* the number of this particular glob or -1 if not used
within {} or [] */
@@ -53,24 +53,24 @@ typedef struct {
unsigned long step;
} NumRange;
} content;
-} URLPattern;
+};
/* the total number of globs supported */
#define GLOB_PATTERN_NUM 100
-typedef struct {
- URLPattern pattern[GLOB_PATTERN_NUM];
+struct URLGlob {
+ struct URLPattern pattern[GLOB_PATTERN_NUM];
size_t size;
size_t urllen;
char *glob_buffer;
char beenhere;
const char *error; /* error message */
size_t pos; /* column position of error or 0 */
-} URLGlob;
+};
-CURLcode glob_url(URLGlob**, char *, unsigned long *, FILE *);
-CURLcode glob_next_url(char **, URLGlob *);
-CURLcode glob_match_url(char **, char *, URLGlob *);
-void glob_cleanup(URLGlob* glob);
+CURLcode glob_url(struct URLGlob**, char *, unsigned long *, FILE *);
+CURLcode glob_next_url(char **, struct URLGlob *);
+CURLcode glob_match_url(char **, char *, struct URLGlob *);
+void glob_cleanup(struct URLGlob *glob);
#endif /* HEADER_CURL_TOOL_URLGLOB_H */
diff --git a/src/tool_util.c b/src/tool_util.c
index 9990a4634..de98b8282 100644
--- a/src/tool_util.c
+++ b/src/tool_util.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -27,27 +27,35 @@
#if defined(WIN32) && !defined(MSDOS)
+/* set in win32_init() */
+extern LARGE_INTEGER tool_freq;
+extern bool tool_isVistaOrGreater;
+
+/* In case of bug fix this function has a counterpart in timeval.c */
struct timeval tvnow(void)
{
- /*
- ** GetTickCount() is available on _all_ Windows versions from W95 up
- ** to nowadays. Returns milliseconds elapsed since last system boot,
- ** increases monotonically and wraps once 49.7 days have elapsed.
- **
- ** GetTickCount64() is available on Windows version from Windows Vista
- ** and Windows Server 2008 up to nowadays. The resolution of the
- ** function is limited to the resolution of the system timer, which
- ** is typically in the range of 10 milliseconds to 16 milliseconds.
- */
struct timeval now;
-#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && \
- (!defined(__MINGW32__) || defined(__MINGW64_VERSION_MAJOR))
- ULONGLONG milliseconds = GetTickCount64();
-#else
- DWORD milliseconds = GetTickCount();
+ if(tool_isVistaOrGreater) { /* QPC timer might have issues pre-Vista */
+ LARGE_INTEGER count;
+ QueryPerformanceCounter(&count);
+ now.tv_sec = (long)(count.QuadPart / tool_freq.QuadPart);
+ now.tv_usec = (long)((count.QuadPart % tool_freq.QuadPart) * 1000000 /
+ tool_freq.QuadPart);
+ }
+ else {
+ /* Disable /analyze warning that GetTickCount64 is preferred */
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:28159)
+#endif
+ DWORD milliseconds = GetTickCount();
+#if defined(_MSC_VER)
+#pragma warning(pop)
#endif
- now.tv_sec = (long)(milliseconds / 1000);
- now.tv_usec = (long)((milliseconds % 1000) * 1000);
+
+ now.tv_sec = (long)(milliseconds / 1000);
+ now.tv_usec = (long)((milliseconds % 1000) * 1000);
+ }
return now;
}
@@ -66,7 +74,7 @@ struct timeval tvnow(void)
struct timespec tsnow;
if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
now.tv_sec = tsnow.tv_sec;
- now.tv_usec = tsnow.tv_nsec / 1000;
+ now.tv_usec = (int)(tsnow.tv_nsec / 1000);
}
/*
** Even when the configure process has truly detected monotonic clock
diff --git a/src/tool_util.h b/src/tool_util.h
index 5339c1167..8e4a3f4a6 100644
--- a/src/tool_util.h
+++ b/src/tool_util.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_version.h b/src/tool_version.h
index 7c8087f81..54f821b43 100644
--- a/src/tool_version.h
+++ b/src/tool_version.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,7 +25,7 @@
#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
-#define CURL_VERSION "7.67.0"
+#define CURL_VERSION "7.73.0"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
diff --git a/src/tool_vms.c b/src/tool_vms.c
index 54871a65e..7871b20f3 100644
--- a/src/tool_vms.c
+++ b/src/tool_vms.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -122,13 +122,13 @@ void vms_special_exit(int code, int vms_show)
*/
/* Structure to hold a DECC$* feature name and its desired value. */
-typedef struct {
+struct decc_feat_t {
char *name;
int value;
-} decc_feat_t;
+};
/* Array of DECC$* feature names and their desired values. */
-static decc_feat_t decc_feat_array[] = {
+static struct decc_feat_t decc_feat_array[] = {
/* Preserve command-line case with SET PROCESS/PARSE_STYLE=EXTENDED */
{ "DECC$ARGV_PARSE_STYLE", 1 },
/* Preserve case for file names on ODS5 disks. */
diff --git a/src/tool_vms.h b/src/tool_vms.h
index 96c86f1ce..135936986 100644
--- a/src/tool_vms.h
+++ b/src/tool_vms.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/src/tool_writeout.c b/src/tool_writeout.c
index 27b2ac50d..393e16861 100644
--- a/src/tool_writeout.c
+++ b/src/tool_writeout.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -25,90 +25,88 @@
#include "curlx.h"
#include "tool_cfgable.h"
#include "tool_writeout.h"
+#include "tool_writeout_json.h"
#include "memdebug.h" /* keep this as LAST include */
-typedef enum {
- VAR_NONE, /* must be the first */
- VAR_TOTAL_TIME,
- VAR_NAMELOOKUP_TIME,
- VAR_CONNECT_TIME,
- VAR_APPCONNECT_TIME,
- VAR_PRETRANSFER_TIME,
- VAR_STARTTRANSFER_TIME,
- VAR_SIZE_DOWNLOAD,
- VAR_SIZE_UPLOAD,
- VAR_SPEED_DOWNLOAD,
- VAR_SPEED_UPLOAD,
- VAR_HTTP_CODE,
- VAR_HTTP_CODE_PROXY,
- VAR_HEADER_SIZE,
- VAR_REQUEST_SIZE,
- VAR_EFFECTIVE_URL,
- VAR_CONTENT_TYPE,
- VAR_NUM_CONNECTS,
- VAR_REDIRECT_TIME,
- VAR_REDIRECT_COUNT,
- VAR_FTP_ENTRY_PATH,
- VAR_REDIRECT_URL,
- VAR_SSL_VERIFY_RESULT,
- VAR_PROXY_SSL_VERIFY_RESULT,
- VAR_EFFECTIVE_FILENAME,
- VAR_PRIMARY_IP,
- VAR_PRIMARY_PORT,
- VAR_LOCAL_IP,
- VAR_LOCAL_PORT,
- VAR_HTTP_VERSION,
- VAR_SCHEME,
- VAR_STDOUT,
- VAR_STDERR,
- VAR_NUM_OF_VARS /* must be the last */
-} replaceid;
-
-struct variable {
- const char *name;
- replaceid id;
-};
-
-
-static const struct variable replacements[]={
- {"url_effective", VAR_EFFECTIVE_URL},
- {"http_code", VAR_HTTP_CODE},
- {"response_code", VAR_HTTP_CODE},
- {"http_connect", VAR_HTTP_CODE_PROXY},
- {"time_total", VAR_TOTAL_TIME},
- {"time_namelookup", VAR_NAMELOOKUP_TIME},
- {"time_connect", VAR_CONNECT_TIME},
- {"time_appconnect", VAR_APPCONNECT_TIME},
- {"time_pretransfer", VAR_PRETRANSFER_TIME},
- {"time_starttransfer", VAR_STARTTRANSFER_TIME},
- {"size_header", VAR_HEADER_SIZE},
- {"size_request", VAR_REQUEST_SIZE},
- {"size_download", VAR_SIZE_DOWNLOAD},
- {"size_upload", VAR_SIZE_UPLOAD},
- {"speed_download", VAR_SPEED_DOWNLOAD},
- {"speed_upload", VAR_SPEED_UPLOAD},
- {"content_type", VAR_CONTENT_TYPE},
- {"num_connects", VAR_NUM_CONNECTS},
- {"time_redirect", VAR_REDIRECT_TIME},
- {"num_redirects", VAR_REDIRECT_COUNT},
- {"ftp_entry_path", VAR_FTP_ENTRY_PATH},
- {"redirect_url", VAR_REDIRECT_URL},
- {"ssl_verify_result", VAR_SSL_VERIFY_RESULT},
- {"proxy_ssl_verify_result", VAR_PROXY_SSL_VERIFY_RESULT},
- {"filename_effective", VAR_EFFECTIVE_FILENAME},
- {"remote_ip", VAR_PRIMARY_IP},
- {"remote_port", VAR_PRIMARY_PORT},
- {"local_ip", VAR_LOCAL_IP},
- {"local_port", VAR_LOCAL_PORT},
- {"http_version", VAR_HTTP_VERSION},
- {"scheme", VAR_SCHEME},
- {"stdout", VAR_STDOUT},
- {"stderr", VAR_STDERR},
- {NULL, VAR_NONE}
+static const struct writeoutvar variables[] = {
+ {"url_effective", VAR_EFFECTIVE_URL, 0,
+ CURLINFO_EFFECTIVE_URL, JSON_STRING},
+ {"method", VAR_EFFECTIVE_METHOD, 0,
+ CURLINFO_EFFECTIVE_METHOD, JSON_STRING},
+ {"http_code", VAR_HTTP_CODE, 0,
+ CURLINFO_RESPONSE_CODE, JSON_LONG},
+ {"response_code", VAR_HTTP_CODE, 0,
+ CURLINFO_RESPONSE_CODE, JSON_LONG},
+ {"num_headers", VAR_NUM_HEADERS, 0,
+ 0, JSON_LONG},
+ {"http_connect", VAR_HTTP_CODE_PROXY, 0,
+ CURLINFO_HTTP_CONNECTCODE, JSON_LONG},
+ {"time_total", VAR_TOTAL_TIME, 0,
+ CURLINFO_TOTAL_TIME_T, JSON_TIME},
+ {"time_namelookup", VAR_NAMELOOKUP_TIME, 0,
+ CURLINFO_NAMELOOKUP_TIME_T, JSON_TIME},
+ {"time_connect", VAR_CONNECT_TIME, 0,
+ CURLINFO_CONNECT_TIME_T, JSON_TIME},
+ {"time_appconnect", VAR_APPCONNECT_TIME, 0,
+ CURLINFO_APPCONNECT_TIME_T, JSON_TIME},
+ {"time_pretransfer", VAR_PRETRANSFER_TIME, 0,
+ CURLINFO_PRETRANSFER_TIME_T, JSON_TIME},
+ {"time_starttransfer", VAR_STARTTRANSFER_TIME, 0,
+ CURLINFO_STARTTRANSFER_TIME_T, JSON_TIME},
+ {"size_header", VAR_HEADER_SIZE, 0,
+ CURLINFO_HEADER_SIZE, JSON_LONG},
+ {"size_request", VAR_REQUEST_SIZE, 0,
+ CURLINFO_REQUEST_SIZE, JSON_LONG},
+ {"size_download", VAR_SIZE_DOWNLOAD, 0,
+ CURLINFO_SIZE_DOWNLOAD_T, JSON_OFFSET},
+ {"size_upload", VAR_SIZE_UPLOAD, 0,
+ CURLINFO_SIZE_UPLOAD_T, JSON_OFFSET},
+ {"speed_download", VAR_SPEED_DOWNLOAD, 0,
+ CURLINFO_SPEED_DOWNLOAD_T, JSON_OFFSET},
+ {"speed_upload", VAR_SPEED_UPLOAD, 0,
+ CURLINFO_SPEED_UPLOAD_T, JSON_OFFSET},
+ {"content_type", VAR_CONTENT_TYPE, 0,
+ CURLINFO_CONTENT_TYPE, JSON_STRING},
+ {"num_connects", VAR_NUM_CONNECTS, 0,
+ CURLINFO_NUM_CONNECTS, JSON_LONG},
+ {"time_redirect", VAR_REDIRECT_TIME, 0,
+ CURLINFO_REDIRECT_TIME_T, JSON_TIME},
+ {"num_redirects", VAR_REDIRECT_COUNT, 0,
+ CURLINFO_REDIRECT_COUNT, JSON_LONG},
+ {"ftp_entry_path", VAR_FTP_ENTRY_PATH, 0,
+ CURLINFO_FTP_ENTRY_PATH, JSON_STRING},
+ {"redirect_url", VAR_REDIRECT_URL, 0,
+ CURLINFO_REDIRECT_URL, JSON_STRING},
+ {"ssl_verify_result", VAR_SSL_VERIFY_RESULT, 0,
+ CURLINFO_SSL_VERIFYRESULT, JSON_LONG},
+ {"proxy_ssl_verify_result", VAR_PROXY_SSL_VERIFY_RESULT, 0,
+ CURLINFO_PROXY_SSL_VERIFYRESULT, JSON_LONG},
+ {"filename_effective", VAR_EFFECTIVE_FILENAME, 0,
+ 0, JSON_FILENAME},
+ {"remote_ip", VAR_PRIMARY_IP, 0,
+ CURLINFO_PRIMARY_IP, JSON_STRING},
+ {"remote_port", VAR_PRIMARY_PORT, 0,
+ CURLINFO_PRIMARY_PORT, JSON_LONG},
+ {"local_ip", VAR_LOCAL_IP, 0,
+ CURLINFO_LOCAL_IP, JSON_STRING},
+ {"local_port", VAR_LOCAL_PORT, 0,
+ CURLINFO_LOCAL_PORT, JSON_LONG},
+ {"http_version", VAR_HTTP_VERSION, 0,
+ CURLINFO_HTTP_VERSION, JSON_VERSION},
+ {"scheme", VAR_SCHEME, 0,
+ CURLINFO_SCHEME, JSON_STRING},
+ {"stdout", VAR_STDOUT, 1,
+ 0, JSON_NONE},
+ {"stderr", VAR_STDERR, 1,
+ 0, JSON_NONE},
+ {"json", VAR_JSON, 1,
+ 0, JSON_NONE},
+ {NULL, VAR_NONE, 1,
+ 0, JSON_NONE}
};
-void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
+void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo)
{
FILE *stream = stdout;
const char *ptr = writeinfo;
@@ -137,22 +135,32 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
continue;
}
keepit = *end;
- *end = 0; /* zero terminate */
- for(i = 0; replacements[i].name; i++) {
- if(curl_strequal(ptr, replacements[i].name)) {
+ *end = 0; /* null-terminate */
+ for(i = 0; variables[i].name; i++) {
+ if(curl_strequal(ptr, variables[i].name)) {
match = TRUE;
- switch(replacements[i].id) {
+ switch(variables[i].id) {
case VAR_EFFECTIVE_URL:
if((CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &stringp))
&& stringp)
fputs(stringp, stream);
break;
+ case VAR_EFFECTIVE_METHOD:
+ if((CURLE_OK == curl_easy_getinfo(curl,
+ CURLINFO_EFFECTIVE_METHOD,
+ &stringp))
+ && stringp)
+ fputs(stringp, stream);
+ break;
case VAR_HTTP_CODE:
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &longinfo))
fprintf(stream, "%03ld", longinfo);
break;
+ case VAR_NUM_HEADERS:
+ fprintf(stream, "%ld", per->num_headers);
+ break;
case VAR_HTTP_CODE_PROXY:
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE,
@@ -272,14 +280,13 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
fprintf(stream, "%ld", longinfo);
break;
case VAR_EFFECTIVE_FILENAME:
- if(outs->filename)
- fprintf(stream, "%s", outs->filename);
+ if(per->outs.filename)
+ fputs(per->outs.filename, stream);
break;
case VAR_PRIMARY_IP:
- if(CURLE_OK ==
- curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP,
- &stringp))
- fprintf(stream, "%s", stringp);
+ if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP,
+ &stringp)) && stringp)
+ fputs(stringp, stream);
break;
case VAR_PRIMARY_PORT:
if(CURLE_OK ==
@@ -288,10 +295,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
fprintf(stream, "%ld", longinfo);
break;
case VAR_LOCAL_IP:
- if(CURLE_OK ==
- curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
- &stringp))
- fprintf(stream, "%s", stringp);
+ if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
+ &stringp)) && stringp)
+ fputs(stringp, stream);
break;
case VAR_LOCAL_PORT:
if(CURLE_OK ==
@@ -323,10 +329,9 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
}
break;
case VAR_SCHEME:
- if(CURLE_OK ==
- curl_easy_getinfo(curl, CURLINFO_SCHEME,
- &stringp))
- fprintf(stream, "%s", stringp);
+ if((CURLE_OK == curl_easy_getinfo(curl, CURLINFO_SCHEME,
+ &stringp)) && stringp)
+ fputs(stringp, stream);
break;
case VAR_STDOUT:
stream = stdout;
@@ -334,6 +339,8 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
case VAR_STDERR:
stream = stderr;
break;
+ case VAR_JSON:
+ ourWriteOutJSON(variables, curl, per, stream);
default:
break;
}
diff --git a/src/tool_writeout.h b/src/tool_writeout.h
index 8d3f645ff..377f0b2b3 100644
--- a/src/tool_writeout.h
+++ b/src/tool_writeout.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,7 +22,66 @@
*
***************************************************************************/
#include "tool_setup.h"
+#include "tool_operate.h"
-void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo);
+typedef enum {
+ VAR_NONE, /* must be the first */
+ VAR_TOTAL_TIME,
+ VAR_NAMELOOKUP_TIME,
+ VAR_CONNECT_TIME,
+ VAR_APPCONNECT_TIME,
+ VAR_PRETRANSFER_TIME,
+ VAR_STARTTRANSFER_TIME,
+ VAR_SIZE_DOWNLOAD,
+ VAR_SIZE_UPLOAD,
+ VAR_SPEED_DOWNLOAD,
+ VAR_SPEED_UPLOAD,
+ VAR_HTTP_CODE,
+ VAR_HTTP_CODE_PROXY,
+ VAR_HEADER_SIZE,
+ VAR_NUM_HEADERS,
+ VAR_REQUEST_SIZE,
+ VAR_EFFECTIVE_METHOD,
+ VAR_EFFECTIVE_URL,
+ VAR_CONTENT_TYPE,
+ VAR_NUM_CONNECTS,
+ VAR_REDIRECT_TIME,
+ VAR_REDIRECT_COUNT,
+ VAR_FTP_ENTRY_PATH,
+ VAR_REDIRECT_URL,
+ VAR_SSL_VERIFY_RESULT,
+ VAR_PROXY_SSL_VERIFY_RESULT,
+ VAR_EFFECTIVE_FILENAME,
+ VAR_PRIMARY_IP,
+ VAR_PRIMARY_PORT,
+ VAR_LOCAL_IP,
+ VAR_LOCAL_PORT,
+ VAR_HTTP_VERSION,
+ VAR_SCHEME,
+ VAR_STDOUT,
+ VAR_STDERR,
+ VAR_JSON,
+ VAR_NUM_OF_VARS /* must be the last */
+} writeoutid;
+
+typedef enum {
+ JSON_NONE,
+ JSON_STRING,
+ JSON_LONG,
+ JSON_OFFSET,
+ JSON_TIME,
+ JSON_VERSION,
+ JSON_FILENAME
+} jsontype;
+
+struct writeoutvar {
+ const char *name;
+ writeoutid id;
+ int is_ctrl;
+ CURLINFO cinfo;
+ jsontype jsontype;
+};
+
+void ourWriteOut(CURL *curl, struct per_transfer *per, const char *writeinfo);
#endif /* HEADER_CURL_TOOL_WRITEOUT_H */
diff --git a/src/tool_writeout_json.c b/src/tool_writeout_json.c
new file mode 100644
index 000000000..bae7f5c15
--- /dev/null
+++ b/src/tool_writeout_json.c
@@ -0,0 +1,203 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "tool_setup.h"
+
+#define ENABLE_CURLX_PRINTF
+
+/* use our own printf() functions */
+#include "curlx.h"
+#include "tool_cfgable.h"
+#include "tool_writeout_json.h"
+#include "tool_writeout.h"
+
+
+static const char *http_version[] = {
+ "0", /* CURL_HTTP_VERSION_NONE */
+ "1", /* CURL_HTTP_VERSION_1_0 */
+ "1.1", /* CURL_HTTP_VERSION_1_1 */
+ "2", /* CURL_HTTP_VERSION_2 */
+ "3" /* CURL_HTTP_VERSION_3 */
+};
+
+static void jsonEscape(FILE *stream, const char *in)
+{
+ const char *i = in;
+ const char *in_end = in + strlen(in);
+
+ for(; i < in_end; i++) {
+ switch(*i) {
+ case '\\':
+ fputs("\\\\", stream);
+ break;
+ case '\"':
+ fputs("\\\"", stream);
+ break;
+ case '\b':
+ fputs("\\b", stream);
+ break;
+ case '\f':
+ fputs("\\f", stream);
+ break;
+ case '\n':
+ fputs("\\n", stream);
+ break;
+ case '\r':
+ fputs("\\r", stream);
+ break;
+ case '\t':
+ fputs("\\t", stream);
+ break;
+ default:
+ if (*i < 32) {
+ fprintf(stream, "u%04x", *i);
+ }
+ else {
+ fputc(*i, stream);
+ }
+ break;
+ };
+ }
+}
+
+static int writeTime(FILE *str, CURL *curl, const char *key, CURLINFO ci)
+{
+ curl_off_t val = 0;
+ if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
+ curl_off_t s = val / 1000000l;
+ curl_off_t ms = val % 1000000l;
+ fprintf(str, "\"%s\":%" CURL_FORMAT_CURL_OFF_T
+ ".%06" CURL_FORMAT_CURL_OFF_T, key, s, ms);
+ return 1;
+ }
+ return 0;
+}
+
+static int writeString(FILE *str, CURL *curl, const char *key, CURLINFO ci)
+{
+ char *valp = NULL;
+ if((CURLE_OK == curl_easy_getinfo(curl, ci, &valp)) && valp) {
+ fprintf(str, "\"%s\":\"", key);
+ jsonEscape(str, valp);
+ fprintf(str, "\"");
+ return 1;
+ }
+ return 0;
+}
+
+static int writeLong(FILE *str, CURL *curl, const char *key, CURLINFO ci,
+ struct per_transfer *per, const struct writeoutvar *wovar)
+{
+ if(wovar->id == VAR_NUM_HEADERS) {
+ fprintf(str, "\"%s\":%ld", key, per->num_headers);
+ return 1;
+ }
+ else {
+ long val = 0;
+ if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
+ fprintf(str, "\"%s\":%ld", key, val);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int writeOffset(FILE *str, CURL *curl, const char *key, CURLINFO ci)
+{
+ curl_off_t val = 0;
+ if(CURLE_OK == curl_easy_getinfo(curl, ci, &val)) {
+ fprintf(str, "\"%s\":%" CURL_FORMAT_CURL_OFF_T, key, val);
+ return 1;
+ }
+ return 0;
+}
+
+static int writeFilename(FILE *str, const char *key, const char *filename)
+{
+ if(filename) {
+ fprintf(str, "\"%s\":\"", key);
+ jsonEscape(str, filename);
+ fprintf(str, "\"");
+ }
+ else {
+ fprintf(str, "\"%s\":null", key);
+ }
+ return 1;
+}
+
+static int writeVersion(FILE *str, CURL *curl, const char *key, CURLINFO ci)
+{
+ long version = 0;
+ if(CURLE_OK == curl_easy_getinfo(curl, ci, &version) &&
+ (version >= 0) &&
+ (version < (long)(sizeof(http_version)/sizeof(char *)))) {
+ fprintf(str, "\"%s\":\"%s\"", key, http_version[version]);
+ return 1;
+ }
+ return 0;
+}
+
+void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
+ struct per_transfer *per, FILE *stream)
+{
+ int i;
+
+ fputs("{", stream);
+ for(i = 0; mappings[i].name != NULL; i++) {
+ const struct writeoutvar *wovar = &mappings[i];
+ const char *name = mappings[i].name;
+ CURLINFO cinfo = mappings[i].cinfo;
+ int ok = 0;
+
+ if(mappings[i].is_ctrl == 1) {
+ continue;
+ }
+
+ switch(mappings[i].jsontype) {
+ case JSON_STRING:
+ ok = writeString(stream, curl, name, cinfo);
+ break;
+ case JSON_LONG:
+ ok = writeLong(stream, curl, name, cinfo, per, wovar);
+ break;
+ case JSON_OFFSET:
+ ok = writeOffset(stream, curl, name, cinfo);
+ break;
+ case JSON_TIME:
+ ok = writeTime(stream, curl, name, cinfo);
+ break;
+ case JSON_FILENAME:
+ ok = writeFilename(stream, name, per->outs.filename);
+ break;
+ case JSON_VERSION:
+ ok = writeVersion(stream, curl, name, cinfo);
+ break;
+ default:
+ break;
+ }
+
+ if(ok) {
+ fputs(",", stream);
+ }
+ }
+
+ fprintf(stream, "\"curl_version\":\"%s\"}", curl_version());
+}
diff --git a/src/tool_writeout_json.h b/src/tool_writeout_json.h
new file mode 100644
index 000000000..0390ae5c8
--- /dev/null
+++ b/src/tool_writeout_json.h
@@ -0,0 +1,30 @@
+#ifndef HEADER_CURL_TOOL_WRITEOUT_JSON_H
+#define HEADER_CURL_TOOL_WRITEOUT_JSON_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "tool_setup.h"
+#include "tool_writeout.h"
+
+void ourWriteOutJSON(const struct writeoutvar mappings[], CURL *curl,
+ struct per_transfer *per, FILE *stream);
+
+#endif /* HEADER_CURL_TOOL_WRITEOUT_H */
diff --git a/src/tool_xattr.h b/src/tool_xattr.h
index 56bd9e4a0..0339b9b97 100644
--- a/src/tool_xattr.h
+++ b/src/tool_xattr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/test-driver b/test-driver
index 8e575b017..89dba1e07 100755
--- a/test-driver
+++ b/test-driver
@@ -1,9 +1,9 @@
#! /bin/sh
# test-driver - basic testsuite driver script.
-scriptversion=2013-07-13.22; # UTC
+scriptversion=2018-03-07.03; # UTC
-# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@ scriptversion=2013-07-13.22; # UTC
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -140,9 +140,9 @@ echo ":copy-in-global-log: $gcopy" >> $trs_file
# Local Variables:
# mode: shell-script
# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 63b4cda03..9f3e4753e 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,4 +1,51 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+add_custom_target(testdeps)
add_subdirectory(data)
add_subdirectory(libtest)
add_subdirectory(server)
add_subdirectory(unit)
+
+function(add_runtests targetname test_flags)
+ # Use a special '$TFLAGS' placeholder as last argument which will be
+ # replaced by the contents of the environment variable in runtests.pl.
+ # This is a workaround for CMake's limitation where commands executed by
+ # 'make' or 'ninja' cannot portably reference environment variables.
+ string(REPLACE " " ";" test_flags_list "${test_flags}")
+ add_custom_target(${targetname}
+ COMMAND
+ "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/runtests.pl"
+ ${test_flags_list}
+ "\$TFLAGS"
+ DEPENDS testdeps
+ VERBATIM USES_TERMINAL
+ )
+endfunction()
+
+add_runtests(test "")
+add_runtests(test-quiet "-a -s")
+add_runtests(test-am "-a -am")
+add_runtests(test-full "-a -p -r")
+# !flaky means that it'll skip all tests using the flaky keyword
+add_runtests(test-nonflaky "-a -p !flaky")
+add_runtests(test-torture "-a -t")
+add_runtests(test-event "-a -e")
diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT
deleted file mode 100644
index 8a9eb3579..000000000
--- a/tests/FILEFORMAT
+++ /dev/null
@@ -1,478 +0,0 @@
- The test suite's file format is very simple and extensible, closely
-resembling XML. All data for a single test case resides in a single
-ASCII file. Labels mark the beginning and the end of all sections, and each
-label must be written in its own line. Comments are either XML-style
-(enclosed with <!-- and -->) or C-style (beginning with #) and must appear
-on their own lines and not alongside actual test data. Most test data files
-are syntactically valid XML, although a few files are not (lack of
-support for character entities and the preservation of CR/LF characters at
-the end of lines are the biggest differences).
-
- The file begins with a 'testcase' tag, which encompasses the remainder of
-the file.
-
-<testcase>
-
- Each file is split up in three main sections: reply, client and verify. The
-reply section is used for the server to know what to send as a reply for the
-requests curl sends, the client section defines how the client should behave
-while the verify section defines how to verify that the data stored after a
-command has been run ended up correctly.
-
- Each main section has a number of available subsections that can be
-specified, that will be checked/used if specified. This document includes all
-the subsections currently supported.
-
-Main sections are 'info', 'reply', 'client' and 'verify'.
-
-<info>
-<keywords>
-A newline-separated list of keywords describing what this test case uses and
-tests. Try to use an already used keyword. These keywords will be used for
-statistical/informational purposes and for choosing or skipping classes
-of tests. "Keywords" must begin with an alphabetic character, "-", "["
-or "{" and may actually consist of multiple words separated by spaces
-which are treated together as a single identifier.
-</keywords>
-</info>
-
-<reply>
-<data [nocheck="yes"] [sendzero="yes"] [base64="yes"]>
-data to be sent to the client on its request and later verified that it arrived
-safely. Set nocheck="yes" to prevent the test script from verifying the arrival
-of this data.
-
-If the data contains 'swsclose' anywhere within the start and end tag, and
-this is a HTTP test, then the connection will be closed by the server after
-this response is sent. If not, the connection will be kept persistent.
-
-If the data contains 'swsbounce' anywhere within the start and end tag, the
-HTTP server will detect if this is a second request using the same test and
-part number and will then increase the part number with one. This is useful
-for auth tests and similar.
-
-'sendzero' set to yes means that the (FTP) server will "send" the data even if
-the size is zero bytes. Used to verify curl's behaviour on zero bytes
-transfers.
-
-'base64' set to yes means that the data provided in the test-file is a chunk
-of data encoded with base64. It is the only way a test case can contain binary
-data. (This attribute can in fact be used on any section, but it doesn't make
-much sense for other sections than "data").
-
-For FTP file listings, the <data> section will be used *only* if you make sure
-that there has been a CWD done first to a directory named 'test-[num]' where
-[num] is the test case number. Otherwise the ftp server can't know from which
-test file to load the list content.
-
-</data>
-<dataNUM>
-Send back this contents instead of the <data> one. The num is set by:
-A) The test number in the request line is >10000 and this is the remainder
-of [test case number]%10000.
-B) The request was HTTP and included digest details, which adds 1000 to NUM
-C) If a HTTP request is NTLM type-1, it adds 1001 to num
-D) If a HTTP request is NTLM type-3, it adds 1002 to num
-E) If a HTTP request is Basic and num is already >=1000, it adds 1 to num
-F) If a HTTP request is Negotiate, num gets incremented by one for each
-request with Negotiate authorization header on the same test case.
-
-Dynamically changing num in this way allows the test harness to be used to
-test authentication negotiation where several different requests must be sent
-to complete a transfer. The response to each request is found in its own data
-section. Validating the entire negotiation sequence can be done by
-specifying a datacheck section.
-</dataNUM>
-<connect>
-The connect section is used instead of the 'data' for all CONNECT
-requests. The remainder of the rules for the data section then apply but with
-a connect prefix.
-</connect>
-<datacheck [mode="text"] [nonewline="yes"]>
-if the data is sent but this is what should be checked afterwards. If
-'nonewline' is set, we will cut off the trailing newline of this given data
-before comparing with the one actually received by the client.
-
-Use the mode="text" attribute if the output is in text mode on platforms that
-have a text/binary difference.
-</datacheck>
-<datacheckNUM [nonewline="yes"] [mode="text"]>
-The contents of numbered datacheck sections are appended to the non-numbered
-one.
-</datacheckNUM>
-<size>
-number to return on a ftp SIZE command (set to -1 to make this command fail)
-</size>
-<mdtm>
-what to send back if the client sends a (FTP) MDTM command, set to -1 to
-have it return that the file doesn't exist
-</mdtm>
-<postcmd>
-special purpose server-command to control its behavior *after* the
-reply is sent
-For HTTP/HTTPS, these are supported:
-
-wait [secs]
- - Pause for the given time
-</postcmd>
-<servercmd>
-Special-commands for the server.
-For FTP/SMTP/POP/IMAP, these are supported:
-
-REPLY [command] [return value] [response string]
- - Changes how the server responds to the [command]. [response string] is
- evaluated as a perl string, so it can contain embedded \r\n, for example.
- There's a special [command] named "welcome" (without quotes) which is the
- string sent immediately on connect as a welcome.
-REPLYLF (like above but sends the response terminated with LF-only and not
- CRLF)
-COUNT [command] [num]
- - Do the REPLY change for [command] only [num] times and then go back to the
- built-in approach
-DELAY [command] [secs]
- - Delay responding to this command for the given time
-RETRWEIRDO
- - Enable the "weirdo" RETR case when multiple response lines appear at once
- when a file is transferred
-RETRNOSIZE
- - Make sure the RETR response doesn't contain the size of the file
-NOSAVE
- - Don't actually save what is received
-SLOWDOWN
- - Send FTP responses with 0.01 sec delay between each byte
-PASVBADIP
- - makes PASV send back an illegal IP in its 227 response
-CAPA [capabilities]
- - Enables support for and specifies a list of space separated capabilities to
- return to the client for the IMAP CAPABILITY, POP3 CAPA and SMTP EHLO
- commands
-AUTH [mechanisms]
- - Enables support for SASL authentication and specifies a list of space
- separated mechanisms for IMAP, POP3 and SMTP
-
-For HTTP/HTTPS:
-auth_required if this is set and a POST/PUT is made without auth, the
- server will NOT wait for the full request body to get sent
-idle do nothing after receiving the request, just "sit idle"
-stream continuously send data to the client, never-ending
-writedelay: [secs] delay this amount between reply packets
-skip: [num] instructs the server to ignore reading this many bytes from a PUT
- or POST request
-
-rtp: part [num] channel [num] size [num]
- stream a fake RTP packet for the given part on a chosen channel
- with the given payload size
-
-connection-monitor When used, this will log [DISCONNECT] to the server.input
- log when the connection is disconnected.
-upgrade when an HTTP upgrade header is found, the server will upgrade
- to http2
-swsclose instruct server to close connection after response
-
-For TFTP:
-writedelay: [secs] delay this amount between reply packets (each packet being
- 512 bytes payload)
-</servercmd>
-</reply>
-
-<client>
-
-<server>
-What server(s) this test case requires/uses:
-
-file
-ftp
-ftp-ipv6
-ftps
-http
-http-ipv6
-http-proxy
-http-unix
-https
-httptls+srp
-httptls+srp-ipv6
-http/2
-imap
-none
-pop3
-rtsp
-rtsp-ipv6
-scp
-sftp
-smtp
-socks4
-socks5
-
-Give only one per line. This subsection is mandatory.
-</server>
-
-<features>
-A list of features that MUST be present in the client/library for this test to
-be able to run. If a required feature is not present then the test will be
-SKIPPED.
-
-Alternatively a feature can be prefixed with an exclamation mark to indicate a
-feature is NOT required. If the feature is present then the test will be
-SKIPPED.
-
-Features testable here are:
-
-crypto
-debug
-getrlimit
-GnuTLS
-GSS-API
-http/2
-idn
-ipv6
-Kerberos
-large_file
-libz
-manual
-Metalink
-NSS
-NTLM
-OpenSSL
-PSL
-socks
-SPNEGO
-SSL
-SSLpinning
-SSPI
-TLS-SRP
-TrackMemory
-threaded-resolver
-unittest
-unix-sockets
-WinSSL
-ld_preload
-alt-svc
-
-as well as each protocol that curl supports. A protocol only needs to be
-specified if it is different from the server (useful when the server
-is 'none').
-</features>
-
-<killserver>
-Using the same syntax as in <server> but when mentioned here these servers
-are explicitly KILLED when this test case is completed. Only use this if there
-is no other alternatives. Using this of course requires subsequent tests to
-restart servers.
-</killserver>
-
-<precheck>
-A command line that if set gets run by the test script before the test. If an
-output is displayed by the command or if the return code is non-zero, the test
-will be skipped and the (single-line) output will be displayed as reason for
-not running the test. Variables are substituted as in the <command> section.
-</precheck>
-
-<postcheck>
-A command line that if set gets run by the test script after the test. If
-the command exists with a non-zero status code, the test will be considered
-to have failed. Variables are substituted as in the <command> section.
-</postcheck>
-
-<tool>
-Name of tool to use instead of "curl". This tool must be built and exist
-either in the libtest/ directory (if the tool starts with 'lib') or in the
-unit/ directory (if the tool starts with 'unit').
-</tool>
-
-<name>
-test case description
-</name>
-
-<setenv>
-variable1=contents1
-variable2=contents2
-
-Set the given environment variables to the specified value before the actual
-command is run. They are cleared again after the command has been run.
-Variables are first substituted as in the <command> section.
-</setenv>
-
-<command [option="no-output/no-include/force-output"] [timeout="secs"]
- [delay="secs"][type="perl"]>
-command line to run, there's a bunch of %variables that get replaced
-accordingly.
-
-Note that the URL that gets passed to the server actually controls what data
-that is returned. The last slash in the URL must be followed by a number. That
-number (N) will be used by the test-server to load test case N and return the
-data that is defined within the <reply><data></data></reply> section.
-
-If there's no test number found above, the HTTP test server will use the
-number following the last dot in the given hostname (made so that a CONNECT
-can still pass on test number) so that "foo.bar.123" gets treated as test case
-123. Alternatively, if an IPv6 address is provided to CONNECT, the last
-hexadecimal group in the address will be used as the test number! For example
-the address "[1234::ff]" would be treated as test case 255.
-
-Set type="perl" to write the test case as a perl script. It implies that
-there's no memory debugging and valgrind gets shut off for this test.
-
-Set option="no-output" to prevent the test script to slap on the --output
-argument that directs the output to a file. The --output is also not added if
-the verify/stdout section is used.
-
-Set option="force-output" to make use of --output even when the test is
-otherwise written to verify stdout.
-
-Set option="no-include" to prevent the test script to slap on the --include
-argument.
-
-Set timeout="secs" to override default server logs advisor read lock timeout.
-This timeout is used by the test harness, once that the command has completed
-execution, to wait for the test server to write out server side log files and
-remove the lock that advised not to read them. The "secs" parameter is the not
-negative integer number of seconds for the timeout. This 'timeout' attribute
-is documented for completeness sake, but is deep test harness stuff and only
-needed for very singular and specific test cases. Avoid using it.
-
-Set delay="secs" to introduce a time delay once that the command has completed
-execution and before the <postcheck> section runs. The "secs" parameter is the
-not negative integer number of seconds for the delay. This 'delay' attribute
-is intended for very specific test cases, and normally not needed.
-
-Available substitute variables include:
-%CLIENT6IP - IPv6 address of the client running curl
-%CLIENTIP - IPv4 address of the client running curl
-%CURL - Path to the curl executable
-%FTP2PORT - Port number of the FTP server 2
-%FTP6PORT - IPv6 port number of the FTP server
-%FTPPORT - Port number of the FTP server
-%FTPSPORT - Port number of the FTPS server
-%FTPTIME2 - Timeout in seconds that should be just sufficient to receive
- a response from the test FTP server
-%FTPTIME3 - Even longer than %FTPTIME2
-%GOPHER6PORT - IPv6 port number of the Gopher server
-%GOPHERPORT - Port number of the Gopher server
-%HOST6IP - IPv6 address of the host running this test
-%HOSTIP - IPv4 address of the host running this test
-%HTTP6PORT - IPv6 port number of the HTTP server
-%HTTPUNIXPATH - Path to the Unix socket of the HTTP server
-%HTTPPORT - Port number of the HTTP server
-%HTTPSPORT - Port number of the HTTPS server
-%HTTPTLS6PORT - IPv6 port number of the HTTP TLS server
-%HTTPTLSPORT - Port number of the HTTP TLS server
-%IMAP6PORT - IPv6 port number of the IMAP server
-%IMAPPORT - Port number of the IMAP server
-%POP36PORT - IPv6 port number of the POP3 server
-%POP3PORT - Port number of the POP3 server
-%PROXYPORT - Port number of the HTTP proxy
-%PWD - Current directory
-%POSIX_PWD - Current directory somewhat mingw friendly
-%FILE_PWD - Current directory, on windows prefixed with a slash
-%RTSP6PORT - IPv6 port number of the RTSP server
-%RTSPPORT - Port number of the RTSP server
-%SMTP6PORT - IPv6 port number of the SMTP server
-%SMTPPORT - Port number of the SMTP server
-%SOCKSPORT - Port number of the SOCKS4/5 server
-%SRCDIR - Full path to the source dir
-%SSHPORT - Port number of the SCP/SFTP server
-%TFTP6PORT - IPv6 port number of the TFTP server
-%TFTPPORT - Port number of the TFTP server
-%USER - Login ID of the user running the test
-</command>
-
-<file name="log/filename">
-This creates the named file with this content before the test case is run,
-which is useful if the test case needs a file to act on.
-Variables are substituted on the contents of the file as in the <command>
-section.
-</file>
-
-<stdin [nonewline="yes"]>
-Pass this given data on stdin to the tool.
-
-If 'nonewline' is set, we will cut off the trailing newline of this given data
-before comparing with the one actually received by the client
-</stdin>
-
-</client>
-
-<verify>
-<errorcode>
-numerical error code curl is supposed to return. Specify a list of accepted
-error codes by separating multiple numbers with comma. See test 237 for an
-example.
-</errorcode>
-<strip>
-One regex per line that is removed from the protocol dumps before the
-comparison is made. This is very useful to remove dependencies on dynamically
-changing protocol data such as port numbers or user-agent strings.
-</strip>
-<strippart>
-One perl op per line that operates on the protocol dump. This is pretty
-advanced. Example: "s/^EPRT .*/EPRT stripped/"
-</strippart>
-
-<protocol [nonewline="yes"]>
-
-the protocol dump curl should transmit, if 'nonewline' is set, we will cut off
-the trailing newline of this given data before comparing with the one actually
-sent by the client Variables are substituted as in the <command> section. The
-<strip> and <strippart> rules are applied before comparisons are made.
-
-</protocol>
-
-<proxy [nonewline="yes"]>
-
-The protocol dump curl should transmit to a HTTP proxy (when the http-proxy
-server is used), if 'nonewline' is set, we will cut off the trailing newline
-of this given data before comparing with the one actually sent by the client
-Variables are substituted as in the <command> section. The <strip> and
-<strippart> rules are applied before comparisons are made.
-
-</proxy>
-
-<stdout [mode="text"] [nonewline="yes"]>
-This verifies that this data was passed to stdout. Variables are
-substituted as in the <command> section.
-
-Use the mode="text" attribute if the output is in text mode on platforms that
-have a text/binary difference.
-
-If 'nonewline' is set, we will cut off the trailing newline of this given data
-before comparing with the one actually received by the client
-</stdout>
-<file name="log/filename" [mode="text"]>
-The file's contents must be identical to this after the test is complete.
-Use the mode="text" attribute if the output is in text mode on platforms that
-have a text/binary difference.
-Variables are substituted as in the <command> section.
-</file>
-<file1>
-1 to 4 can be appended to 'file' to compare more files.
-</file1>
-<file2>
-</file2>
-<file3>
-</file3>
-<file4>
-</file4>
-<stripfile>
-One perl op per line that operates on the output file or stdout before being
-compared with what is stored in the test file. This is pretty
-advanced. Example: "s/^EPRT .*/EPRT stripped/"
-</stripfile>
-<stripfile1>
-1 to 4 can be appended to 'stripfile' to strip the correspending <fileN>
-content
-</stripfile1>
-<stripfile2>
-</stripfile2>
-<stripfile3>
-</stripfile3>
-<stripfile4>
-</stripfile4>
-<upload>
-the contents of the upload data curl should have sent
-</upload>
-<valgrind>
-disable - disables the valgrind log check for this test
-</valgrind>
-</verify>
-
-</testcase>
diff --git a/tests/FILEFORMAT.md b/tests/FILEFORMAT.md
new file mode 100644
index 000000000..0f66de277
--- /dev/null
+++ b/tests/FILEFORMAT.md
@@ -0,0 +1,554 @@
+# curl test suite file format
+
+The curl test suite's file format is very simple and extensible, closely
+resembling XML. All data for a single test case resides in a single ASCII
+file. Labels mark the beginning and the end of all sections, and each label
+must be written in its own line. Comments are either XML-style (enclosed with
+`<!--` and `-->`) or shell script style (beginning with `#`) and must appear
+on their own lines and not alongside actual test data. Most test data files
+are syntactically valid XML, although a few files are not (lack of support for
+character entities and the preservation of CR/LF characters at the end of
+lines are the biggest differences).
+
+Each test case source exists as a file matching the format
+`tests/data/testNUM`, where NUM is the unique test number, and must begin with
+a 'testcase' tag, which encompasses the remainder of the file.
+
+# Preprocessing
+
+When a test is to be executed, the source file is first preprocessed and
+variables are substituted by the their respective contents and the output
+version of the test file is stored as `log/testNUM`. That version is what will
+be read and used by the test servers.
+
+## Base64 Encoding
+
+In the preprocess stage, a special instruction can be used to have runtests.pl
+base64 encode a certain section and insert in the generated output file. This
+is in particular good for test cases where the test tool is expected to pass
+in base64 encoded content that might use dynamic information that is unique
+for this particular test invocation, like the server port number.
+
+To insert a base64 encoded string into the output, use this syntax:
+
+ %b64[ data to encode ]b64%
+
+The data to encode can then use any of the existing variables mentioned below,
+or even percent-encoded individual bytes. As an example, insert the HTTP
+server's port number (in ASCII) followed by a space and the hexadecimal byte
+9a:
+
+ %b64[%HTTPPORT %9a]b64%
+
+## Hexadecimal decoding
+
+In the preprocess stage, a special instruction can be used to have runtests.pl
+generate a sequence of binary bytes.
+
+To insert a sequence of bytes from a hex encoded string, use this syntax:
+
+ %hex[ %XX-encoded data to decode ]hex%
+
+For example, to insert the binary octets 0, 1 and 255 into the test file:
+
+ %hex[ %00%01%FF ]hex%
+
+## Repeat content
+
+In the preprocess stage, a special instruction can be used to have runtests.pl
+generate a repetetive sequence of bytes.
+
+To insert a sequence of repeat bytes, use this syntax to make the `<string>`
+get repeated `<number>` of times. The number has to be 1 or large and the
+string may contain `%HH` hexadecimal codes:
+
+ %repeat[<number> x <string>]%
+
+For example, to insert the word hello a 100 times:
+
+ %repeat[100 x hello]%
+
+# Variables
+
+When the test is preprocessed, a range of "variables" in the test file will be
+replaced by their content at that time.
+
+Available substitute variables include:
+
+- `%CLIENT6IP` - IPv6 address of the client running curl
+- `%CLIENTIP` - IPv4 address of the client running curl
+- `%CURL` - Path to the curl executable
+- `%FILE_PWD` - Current directory, on windows prefixed with a slash
+- `%FTP6PORT` - IPv6 port number of the FTP server
+- `%FTPPORT` - Port number of the FTP server
+- `%FTPSPORT` - Port number of the FTPS server
+- `%FTPTIME2` - Timeout in seconds that should be just sufficient to receive a
+ response from the test FTP server
+- `%FTPTIME3` - Even longer than %FTPTIME2
+- `%GOPHER6PORT` - IPv6 port number of the Gopher server
+- `%GOPHERPORT` - Port number of the Gopher server
+- `%HOST6IP` - IPv6 address of the host running this test
+- `%HOSTIP` - IPv4 address of the host running this test
+- `%HTTP6PORT` - IPv6 port number of the HTTP server
+- `%HTTPPORT` - Port number of the HTTP server
+- `%HTTP2PORT` - Port number of the HTTP/2 server
+- `%HTTPSPORT` - Port number of the HTTPS server
+- `%HTTPSPROXYPORT` - Port number of the HTTPS-proxy
+- `%HTTPTLS6PORT` - IPv6 port number of the HTTP TLS server
+- `%HTTPTLSPORT` - Port number of the HTTP TLS server
+- `%HTTPUNIXPATH` - Path to the Unix socket of the HTTP server
+- `%IMAP6PORT` - IPv6 port number of the IMAP server
+- `%IMAPPORT` - Port number of the IMAP server
+- `%MQTTPORT` - Port number of the MQTT server
+- `%TELNETPORT` - Port number of the telnet server
+- `%NOLISTENPORT` - Port number where no service is listening
+- `%POP36PORT` - IPv6 port number of the POP3 server
+- `%POP3PORT` - Port number of the POP3 server
+- `%POSIX_PWD` - Current directory somewhat mingw friendly
+- `%PROXYPORT` - Port number of the HTTP proxy
+- `%PWD` - Current directory
+- `%RTSP6PORT` - IPv6 port number of the RTSP server
+- `%RTSPPORT` - Port number of the RTSP server
+- `%SMBPORT` - Port number of the SMB server
+- `%SMBSPORT` - Port number of the SMBS server
+- `%SMTP6PORT` - IPv6 port number of the SMTP server
+- `%SMTPPORT` - Port number of the SMTP server
+- `%SOCKSPORT` - Port number of the SOCKS4/5 server
+- `%SRCDIR` - Full path to the source dir
+- `%SSHPORT` - Port number of the SCP/SFTP server
+- `%SSHSRVMD5` - MD5 of SSH server's public key
+- `%SSH_PWD` - Current directory friendly for the SSH server
+- `%TFTP6PORT` - IPv6 port number of the TFTP server
+- `%TFTPPORT` - Port number of the TFTP server
+- `%USER` - Login ID of the user running the test
+- `%VERSION` - the full version number of the tested curl
+
+# `<testcase>`
+
+Each test is always specified entirely within the testcase tag. Each test case
+is split up in four main sections: `info`, `reply`, `client` and `verify`.
+
+- **info** provides information about the test case
+
+- **reply** is used for the server to know what to send as a reply for the
+requests curl sends
+
+- **client** defines how the client should behave
+
+- **verify** defines how to verify that the data stored after a command has
+been run ended up correctly
+
+Each main section has a number of available subsections that can be specified,
+that will be checked/used if specified.
+
+## `<info>`
+
+### `<keywords>`
+A newline-separated list of keywords describing what this test case uses and
+tests. Try to use an already used keyword. These keywords will be used for
+statistical/informational purposes and for choosing or skipping classes
+of tests. "Keywords" must begin with an alphabetic character, "-", "["
+or "{" and may actually consist of multiple words separated by spaces
+which are treated together as a single identifier.
+
+## `<reply>`
+
+### `<data [nocheck="yes"] [sendzero="yes"] [base64="yes"] [hex="yes"]>`
+
+data to be sent to the client on its request and later verified that it
+arrived safely. Set `nocheck="yes"` to prevent the test script from verifying
+the arrival of this data.
+
+If the data contains `swsclose` anywhere within the start and end tag, and
+this is a HTTP test, then the connection will be closed by the server after
+this response is sent. If not, the connection will be kept persistent.
+
+If the data contains `swsbounce` anywhere within the start and end tag, the
+HTTP server will detect if this is a second request using the same test and
+part number and will then increase the part number with one. This is useful
+for auth tests and similar.
+
+`sendzero=yes` means that the (FTP) server will "send" the data even if the
+size is zero bytes. Used to verify curl's behaviour on zero bytes transfers.
+
+`base64=yes` means that the data provided in the test-file is a chunk of data
+encoded with base64. It is the only way a test case can contain binary
+data. (This attribute can in fact be used on any section, but it doesn't make
+much sense for other sections than "data").
+
+`hex=yes` means that the data is a sequence of hex pairs. It will get decoded
+and used as "raw" data.
+
+For FTP file listings, the `<data>` section will be used *only* if you make
+sure that there has been a CWD done first to a directory named `test-[num]`
+where [num] is the test case number. Otherwise the ftp server can't know from
+which test file to load the list content.
+
+### `<dataNUM>`
+
+Send back this contents instead of the <data> one. The num is set by:
+
+ - The test number in the request line is >10000 and this is the remainder
+ of [test case number]%10000.
+ - The request was HTTP and included digest details, which adds 1000 to NUM
+ - If a HTTP request is NTLM type-1, it adds 1001 to num
+ - If a HTTP request is NTLM type-3, it adds 1002 to num
+ - If a HTTP request is Basic and num is already >=1000, it adds 1 to num
+ - If a HTTP request is Negotiate, num gets incremented by one for each
+ request with Negotiate authorization header on the same test case.
+
+Dynamically changing num in this way allows the test harness to be used to
+test authentication negotiation where several different requests must be sent
+to complete a transfer. The response to each request is found in its own data
+section. Validating the entire negotiation sequence can be done by specifying
+a datacheck section.
+
+### `<connect>`
+The connect section is used instead of the 'data' for all CONNECT
+requests. The remainder of the rules for the data section then apply but with
+a connect prefix.
+
+### `<datacheck [mode="text"] [nonewline="yes"]>`
+if the data is sent but this is what should be checked afterwards. If
+`nonewline=yes` is set, runtests will cut off the trailing newline from the
+data before comparing with the one actually received by the client.
+
+Use the `mode="text"` attribute if the output is in text mode on platforms
+that have a text/binary difference.
+
+### `<datacheckNUM [nonewline="yes"] [mode="text"]>`
+The contents of numbered datacheck sections are appended to the non-numbered
+one.
+
+### `<size>`
+number to return on a ftp SIZE command (set to -1 to make this command fail)
+
+### `<mdtm>`
+what to send back if the client sends a (FTP) MDTM command, set to -1 to
+have it return that the file doesn't exist
+
+### `<postcmd>`
+special purpose server-command to control its behavior *after* the
+reply is sent
+For HTTP/HTTPS, these are supported:
+
+`wait [secs]` - Pause for the given time
+
+### `<servercmd>`
+Special-commands for the server.
+
+The first line of this file will always be set to `Testnum [number]` by the
+test script, to allow servers to read that to know what test the client is
+about to issue.
+
+#### For FTP/SMTP/POP/IMAP
+
+- `REPLY [command] [return value] [response string]` - Changes how the server
+ responds to the [command]. [response string] is evaluated as a perl string,
+ so it can contain embedded \r\n, for example. There's a special [command]
+ named "welcome" (without quotes) which is the string sent immediately on
+ connect as a welcome.
+- `REPLYLF` (like above but sends the response terminated with LF-only and not
+ CRLF)
+- `COUNT [command] [num]` - Do the `REPLY` change for `[command]` only `[num]`
+ times and then go back to the built-in approach
+- `DELAY [command] [secs]` - Delay responding to this command for the given
+ time
+- `RETRWEIRDO` - Enable the "weirdo" RETR case when multiple response lines
+ appear at once when a file is transferred
+- `RETRNOSIZE` - Make sure the RETR response doesn't contain the size of the
+ file
+- `NOSAVE` - Don't actually save what is received
+- `SLOWDOWN` - Send FTP responses with 0.01 sec delay between each byte
+- `PASVBADIP` - makes PASV send back an illegal IP in its 227 response
+- `CAPA [capabilities]` - Enables support for and specifies a list of space
+ separated capabilities to return to the client for the IMAP `CAPABILITY`,
+ POP3 `CAPA` and SMTP `EHLO` commands
+- `AUTH [mechanisms]` - Enables support for SASL authentication and specifies
+ a list of space separated mechanisms for IMAP, POP3 and SMTP
+- `STOR [msg]` respond with this instead of default after `STOR`
+
+#### For HTTP/HTTPS
+
+- `auth_required` if this is set and a POST/PUT is made without auth, the
+ server will NOT wait for the full request body to get sent
+- `idle` - do nothing after receiving the request, just "sit idle"
+- `stream` - continuously send data to the client, never-ending
+- `writedelay: [secs]` delay this amount between reply packets
+- `skip: [num]` - instructs the server to ignore reading this many bytes from
+ a PUT or POST request
+- `rtp: part [num] channel [num] size [num]` - stream a fake RTP packet for
+ the given part on a chosen channel with the given payload size
+- `connection-monitor` - When used, this will log `[DISCONNECT]` to the
+ `server.input` log when the connection is disconnected.
+- `upgrade` - when an HTTP upgrade header is found, the server will upgrade to
+ http2
+- `swsclose` - instruct server to close connection after response
+- `no-expect` - don't read the request body if Expect: is present
+
+#### For TFTP
+`writedelay: [secs]` delay this amount between reply packets (each packet
+ being 512 bytes payload)
+
+## `<client>`
+
+### `<server>`
+What server(s) this test case requires/uses. Available servers:
+
+- `file`
+- `ftp-ipv6`
+- `ftp`
+- `ftps`
+- `http-ipv6`
+- `http-proxy`
+- `http-unix`
+- `http/2`
+- `http`
+- `https`
+- `httptls+srp-ipv6`
+- `httptls+srp`
+- `imap`
+- `mqtt`
+- `none`
+- `pop3`
+- `rtsp-ipv6`
+- `rtsp`
+- `scp`
+- `sftp`
+- `smtp`
+- `socks4`
+- `socks5`
+
+Give only one per line. This subsection is mandatory.
+
+### `<features>`
+A list of features that MUST be present in the client/library for this test to
+be able to run. If a required feature is not present then the test will be
+SKIPPED.
+
+Alternatively a feature can be prefixed with an exclamation mark to indicate a
+feature is NOT required. If the feature is present then the test will be
+SKIPPED.
+
+Features testable here are:
+
+- `alt-svc`
+- `cookies`
+- `crypto`
+- `debug`
+- `DoH`
+- `getrlimit`
+- `GnuTLS`
+- `GSS-API`
+- `HTTP-auth`
+- `http/2`
+- `idn`
+- `ipv6`
+- `Kerberos`
+- `large_file`
+- `ld_preload`
+- `libz`
+- `manual`
+- `Metalink`
+- `Mime`
+- `netrc`
+- `NSS`
+- `NTLM`
+- `OpenSSL`
+- `parsedate`
+- `proxy`
+- `PSL`
+- `Schannel`
+- `shuffle-dns`
+- `socks`
+- `SPNEGO`
+- `SSL`
+- `SSLpinning`
+- `SSPI`
+- `threaded-resolver`
+- `TLS-SRP`
+- `TrackMemory`
+- `typecheck`
+- `unittest`
+- `unix-sockets`
+- `verbose-strings`
+- `win32`
+
+as well as each protocol that curl supports. A protocol only needs to be
+specified if it is different from the server (useful when the server
+is `none`).
+
+### `<killserver>`
+Using the same syntax as in `<server>` but when mentioned here these servers
+are explicitly KILLED when this test case is completed. Only use this if there
+is no other alternatives. Using this of course requires subsequent tests to
+restart servers.
+
+### `<precheck>`
+A command line that if set gets run by the test script before the test. If an
+output is displayed by the command or if the return code is non-zero, the test
+will be skipped and the (single-line) output will be displayed as reason for
+not running the test.
+
+### `<postcheck>`
+A command line that if set gets run by the test script after the test. If
+the command exists with a non-zero status code, the test will be considered
+to have failed.
+
+### `<tool>`
+Name of tool to invoke instead of "curl". This tool must be built and exist
+either in the libtest/ directory (if the tool name starts with 'lib') or in
+the unit/ directory (if the tool name starts with 'unit').
+
+### `<name>`
+Brief test case description, shown when the test runs.
+
+### `<setenv>`
+ variable1=contents1
+ variable2=contents2
+
+Set the given environment variables to the specified value before the actual
+command is run. They are cleared again after the command has been run.
+
+### `<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl/shell"]>`
+Command line to run.
+
+Note that the URL that gets passed to the server actually controls what data
+that is returned. The last slash in the URL must be followed by a number. That
+number (N) will be used by the test-server to load test case N and return the
+data that is defined within the `<reply><data></data></reply>` section.
+
+If there's no test number found above, the HTTP test server will use the
+number following the last dot in the given hostname (made so that a CONNECT
+can still pass on test number) so that "foo.bar.123" gets treated as test case
+123. Alternatively, if an IPv6 address is provided to CONNECT, the last
+hexadecimal group in the address will be used as the test number! For example
+the address "[1234::ff]" would be treated as test case 255.
+
+Set `type="perl"` to write the test case as a perl script. It implies that
+there's no memory debugging and valgrind gets shut off for this test.
+
+Set `type="shell"` to write the test case as a shell script. It implies that
+there's no memory debugging and valgrind gets shut off for this test.
+
+Set `option="no-output"` to prevent the test script to slap on the `--output`
+argument that directs the output to a file. The `--output` is also not added
+if the verify/stdout section is used.
+
+Set `option="force-output"` to make use of `--output` even when the test is
+otherwise written to verify stdout.
+
+Set `option="no-include"` to prevent the test script to slap on the
+`--include` argument.
+
+Set `option="binary-trace"` to use `--trace` instead of `--trace-ascii` for
+tracing. Suitable for binary-oriented protocols such as MQTT.
+
+Set `timeout="secs"` to override default server logs advisor read lock
+timeout. This timeout is used by the test harness, once that the command has
+completed execution, to wait for the test server to write out server side log
+files and remove the lock that advised not to read them. The "secs" parameter
+is the not negative integer number of seconds for the timeout. This `timeout`
+attribute is documented for completeness sake, but is deep test harness stuff
+and only needed for very singular and specific test cases. Avoid using it.
+
+Set `delay="secs"` to introduce a time delay once that the command has
+completed execution and before the `<postcheck>` section runs. The "secs"
+parameter is the not negative integer number of seconds for the delay. This
+'delay' attribute is intended for very specific test cases, and normally not
+needed.
+
+### `<file name="log/filename" [nonewline="yes"]>`
+This creates the named file with this content before the test case is run,
+which is useful if the test case needs a file to act on.
+
+If 'nonewline="yes"` is used, the created file will have the final newline
+stripped off.
+
+### `<stdin [nonewline="yes"]>`
+Pass this given data on stdin to the tool.
+
+If 'nonewline' is set, we will cut off the trailing newline of this given data
+before comparing with the one actually received by the client
+
+## `<verify>`
+### `<errorcode>`
+numerical error code curl is supposed to return. Specify a list of accepted
+error codes by separating multiple numbers with comma. See test 237 for an
+example.
+
+### `<strip>`
+One regex per line that is removed from the protocol dumps before the
+comparison is made. This is very useful to remove dependencies on dynamically
+changing protocol data such as port numbers or user-agent strings.
+
+### `<strippart>`
+One perl op per line that operates on the protocol dump. This is pretty
+advanced. Example: `s/^EPRT .*/EPRT stripped/`.
+
+### `<protocol [nonewline="yes"]>`
+
+the protocol dump curl should transmit, if 'nonewline' is set, we will cut off
+the trailing newline of this given data before comparing with the one actually
+sent by the client The `<strip>` and `<strippart>` rules are applied before
+comparisons are made.
+
+### `<proxy [nonewline="yes"]>`
+
+The protocol dump curl should transmit to a HTTP proxy (when the http-proxy
+server is used), if 'nonewline' is set, we will cut off the trailing newline
+of this given data before comparing with the one actually sent by the client
+The `<strip>` and `<strippart>` rules are applied before comparisons are made.
+
+### `<stderr [mode="text"] [nonewline="yes"]>`
+This verifies that this data was passed to stderr.
+
+Use the mode="text" attribute if the output is in text mode on platforms that
+have a text/binary difference.
+
+If 'nonewline' is set, we will cut off the trailing newline of this given data
+before comparing with the one actually received by the client
+
+### `<stdout [mode="text"] [nonewline="yes"]>`
+This verifies that this data was passed to stdout.
+
+Use the mode="text" attribute if the output is in text mode on platforms that
+have a text/binary difference.
+
+If 'nonewline' is set, we will cut off the trailing newline of this given data
+before comparing with the one actually received by the client
+
+### `<file name="log/filename" [mode="text"]>`
+The file's contents must be identical to this after the test is complete. Use
+the mode="text" attribute if the output is in text mode on platforms that have
+a text/binary difference.
+
+### `<file1>`
+1 to 4 can be appended to 'file' to compare more files.
+
+### `<file2>`
+
+### `<file3>`
+
+### `<file4>`
+
+### `<stripfile>`
+One perl op per line that operates on the output file or stdout before being
+compared with what is stored in the test file. This is pretty
+advanced. Example: "s/^EPRT .*/EPRT stripped/"
+
+### `<stripfile1>`
+1 to 4 can be appended to 'stripfile' to strip the corresponding <fileN>
+content
+
+### `<stripfile2>`
+
+### `<stripfile3>`
+
+### `<stripfile4>`
+
+### `<upload>`
+the contents of the upload data curl should have sent
+
+### `<valgrind>`
+disable - disables the valgrind log check for this test
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f830ae417..7424fe6bf 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -24,21 +24,16 @@ HTMLPAGES = testcurl.html runtests.html
PDFPAGES = testcurl.pdf runtests.pdf
MANDISTPAGES = runtests.1.dist testcurl.1.dist
-# the path to the impacket python lib used for SMB tests
-IMP = python_dependencies/impacket
-SMBDEPS = $(IMP)/__init__.py $(IMP)/nmb.py $(IMP)/nt_errors.py \
- $(IMP)/ntlm.py $(IMP)/smb.py $(IMP)/smb3.py $(IMP)/smb3structs.py \
- $(IMP)/smbserver.py $(IMP)/spnego.py $(IMP)/structure.py \
- $(IMP)/uuid.py $(IMP)/version.py smbserver.py curl_test_data.py
-
EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl \
- getpart.pm FILEFORMAT README stunnel.pem memanalyze.pl testcurl.pl \
+ getpart.pm FILEFORMAT.md README.md stunnel.pem memanalyze.pl testcurl.pl \
valgrind.pm ftp.pm sshserver.pl sshhelp.pm pathhelp.pm testcurl.1 runtests.1 \
serverhelp.pm tftpserver.pl rtspserver.pl directories.pm symbol-scan.pl \
CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl \
manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \
- negtelnetserver.py $(SMBDEPS) objnames-test08.sh objnames-test10.sh \
- objnames.inc disable-scan.pl manpage-syntax.pl
+ negtelnetserver.py smbserver.py curl_test_data.py \
+ objnames-test08.sh objnames-test10.sh objnames.inc \
+ disable-scan.pl manpage-syntax.pl error-codes.pl badsymbols.pl \
+ azure.pm appveyor.pm version-scan.pl options-scan.pl
DISTCLEANFILES = configurehelp.pm
diff --git a/tests/README b/tests/README.md
index bfd234a10..4b524a045 100644
--- a/tests/README
+++ b/tests/README.md
@@ -1,85 +1,54 @@
- _ _ ____ _
- ___| | | | _ \| |
- / __| | | | |_) | |
- | (__| |_| | _ <| |___
- \___|\___/|_| \_\_____|
-
-The curl Test Suite
-
- 1. Running
- 1.1 Requires to run
- 1.2 Port numbers used by test servers
- 1.3 Test servers
- 1.4 Run
- 1.5 Shell startup scripts
- 1.6 Memory test
- 1.7 Debug
- 1.8 Logs
- 1.9 Test input files
- 1.10 Code coverage
- 1.11 Remote testing
-
- 2. Numbering
- 2.1 Test case numbering
-
- 3. Write tests
- 3.1 test data
- 3.2 curl tests
- 3.3 libcurl tests
- 3.4 unit tests
-
- 4. TODO
- 4.1 More protocols
- 4.2 SOCKS auth
-
-==============================================================================
-
-1. Running
-
- 1.1 Requires to run
-
- perl (and a unix-style shell)
- python (and a unix-style shell)
- diff (when a test fails, a diff is shown)
- stunnel (for HTTPS and FTPS tests)
- OpenSSH or SunSSH (for SCP, SFTP and SOCKS4/5 tests)
- nghttpx (for HTTP/2 tests)
- nroff (for --manual tests)
-
- 1.2 Port numbers used by test servers
-
- - TCP/8990 for HTTP
- - TCP/8991 for HTTPS
- - TCP/8992 for FTP
- - TCP/8993 for FTPS
- - TCP/8994 for HTTP IPv6
- - TCP/8995 for FTP (2)
- - TCP/8996 for FTP IPv6
- - UDP/8997 for TFTP
- - UDP/8998 for TFTP IPv6
- - TCP/8999 for SCP/SFTP
- - TCP/9000 for SOCKS
- - TCP/9001 for POP3
- - TCP/9002 for POP3 IPv6
- - TCP/9003 for IMAP
- - TCP/9004 for IMAP IPv6
- - TCP/9005 for SMTP
- - TCP/9006 for SMTP IPv6
- - TCP/9007 for RTSP
- - TCP/9008 for RTSP IPv6
- - TCP/9009 for GOPHER
- - TCP/9010 for GOPHER IPv6
- - TCP/9011 for HTTPS server with TLS-SRP support
- - TCP/9012 for HTTPS IPv6 server with TLS-SRP support
- - TCP/9013 for HTTP proxy server for CONNECT
- - TCP/9014 for HTTP pipelining server
- - TCP/9015 for HTTP/2 server
- - TCP/9016 for DICT server
- - TCP/9017 for SMB server
- - TCP/9018 for SMBS server (reserved)
- - TCP/9019 for TELNET server with negotiation support
-
- 1.3 Test servers
+# The curl Test Suite
+
+# Running
+
+## Requires to run
+
+ - perl (and a unix-style shell)
+ - python (and a unix-style shell, for SMB and TELNET tests)
+ - python-impacket (for SMB tests)
+ - diff (when a test fails, a diff is shown)
+ - stunnel (for HTTPS and FTPS tests)
+ - OpenSSH or SunSSH (for SCP, SFTP and SOCKS4/5 tests)
+ - nghttpx (for HTTP/2 tests)
+ - nroff (for --manual tests)
+
+### Installation of python-impacket
+
+ The Python-based test servers support both recent Python 2 and 3.
+ You can figure out your default Python interpreter with python -V
+
+ Please install python-impacket in the correct Python environment.
+ You can use pip or your OS' package manager to install 'impacket'.
+
+ On Debian/Ubuntu the package names are:
+
+ - Python 2: 'python-impacket'
+ - Python 3: 'python3-impacket'
+
+ On FreeBSD the package names are:
+
+ - Python 2: 'py27-impacket'
+ - Python 3: 'py37-impacket'
+
+ On any system where pip is available:
+
+ - Python 2: 'pip2 install impacket'
+ - Python 3: 'pip3 install impacket'
+
+ You may also need to manually install the Python package 'six'
+ as that may be a missing requirement for impacket on Python 3.
+
+### Port numbers used by test servers
+
+ All test servers run on "random" port numbers. All tests should be written
+ to use suitable variables instead of fixed port numbers so that test cases
+ continue to work independent on what port numbers the test servers actually
+ use.
+
+ See [FILEFORMAT](FILEFORMAT.md) for the port number variables.
+
+### Test servers
The test suite runs simple FTP, POP3, IMAP, SMTP, HTTP and TFTP stand-alone
servers on the ports listed above to which it makes requests. For SSL tests,
@@ -96,27 +65,28 @@ The curl Test Suite
The HTTP server supports listening on a Unix domain socket, the default
location is 'http.sock'.
- 1.4 Run
+### Run
- './configure && make && make test'. This builds the test suite support code
+ `./configure && make && make test`. This builds the test suite support code
and invokes the 'runtests.pl' perl script to run all the tests. Edit the top
variables of that script in case you have some specific needs, or run the
script manually (after the support code has been built).
- The script breaks on the first test that doesn't do OK. Use -a to prevent
- the script from aborting on the first error. Run the script with -v for more
- verbose output. Use -d to run the test servers with debug output enabled as
- well. Specifying -k keeps all the log files generated by the test intact.
-
- Use -s for shorter output, or pass test numbers to run specific tests only
- (like "./runtests.pl 3 4" to test 3 and 4 only). It also supports test case
- ranges with 'to', as in "./runtests 3 to 9" which runs the seven tests from
- 3 to 9. Any test numbers starting with ! are disabled, as are any test
- numbers found in the files data/DISABLED or data/DISABLED.local (one per
+ The script breaks on the first test that doesn't do OK. Use `-a` to prevent
+ the script from aborting on the first error. Run the script with `-v` for
+ more verbose output. Use `-d` to run the test servers with debug output
+ enabled as well. Specifying `-k` keeps all the log files generated by the
+ test intact.
+
+ Use `-s` for shorter output, or pass test numbers to run specific tests only
+ (like `./runtests.pl 3 4` to test 3 and 4 only). It also supports test case
+ ranges with 'to', as in `./runtests.pl 3 to 9` which runs the seven tests
+ from 3 to 9. Any test numbers starting with ! are disabled, as are any test
+ numbers found in the files `data/DISABLED` or `data/DISABLED.local` (one per
line). The latter is meant for local temporary disables and will be ignored
by git.
- When -s is not present, each successful test will display on one line the
+ When `-s` is not present, each successful test will display on one line the
test number and description and on the next line a set of flags, the test
result, current test sequence, total number of tests to be run and an
estimated amount of time to complete the test run. The flags consist of
@@ -131,7 +101,7 @@ The curl Test Suite
m memory
v valgrind
- 1.5 Shell startup scripts
+### Shell startup scripts
Tests which use the ssh test server, SCP/SFTP/SOCKS tests, might be badly
influenced by the output of system wide or user specific shell startup
@@ -147,51 +117,51 @@ The curl Test Suite
output of a shell startup script. Locate, cleanup or adjust the shell
script.
- 1.6 Memory test
+### Memory test
The test script will check that all allocated memory is freed properly IF
- curl has been built with the CURLDEBUG define set. The script will
+ curl has been built with the `CURLDEBUG` define set. The script will
automatically detect if that is the case, and it will use the
'memanalyze.pl' script to analyze the memory debugging output.
Also, if you run tests on a machine where valgrind is found, the script will
- use valgrind to run the test with (unless you use -n) to further verify
+ use valgrind to run the test with (unless you use `-n`) to further verify
correctness.
- runtests.pl's -t option will enable torture testing mode, which runs each
+ runtests.pl's `-t` option will enable torture testing mode, which runs each
test many times and makes each different memory allocation fail on each
successive run. This tests the out of memory error handling code to ensure
that memory leaks do not occur even in those situations. It can help to
- compile curl with CPPFLAGS=-DMEMDEBUG_LOG_SYNC when using this option, to
+ compile curl with `CPPFLAGS=-DMEMDEBUG_LOG_SYNC` when using this option, to
ensure that the memory log file is properly written even if curl crashes.
- 1.7 Debug
+### Debug
If a test case fails, you can conveniently get the script to invoke the
debugger (gdb) for you with the server running and the exact same command
- line parameters that failed. Just invoke 'runtests.pl <test number> -g' and
+ line parameters that failed. Just invoke `runtests.pl <test number> -g` and
then just type 'run' in the debugger to perform the command through the
debugger.
- 1.8 Logs
+### Logs
All logs are generated in the log/ subdirectory (it is emptied first in the
- runtests.pl script). Use runtests.pl -k to force it to keep the temporary
- files after the test run since successful runs will clean it up otherwise.
+ runtests.pl script). They remain in there after a test run.
- 1.9 Test input files
+### Test input files
- All test cases are put in the data/ subdirectory. Each test is stored in the
- file named according to the test number.
+ All test cases are put in the `data/` subdirectory. Each test is stored in
+ the file named according to the test number.
- See FILEFORMAT for the description of the test case files.
+ See [FILEFORMAT.md](FILEFORMAT.md) for a description of the test case file
+ format.
- 1.10 Code coverage
+### Code coverage
- gcc provides a tool that can determine the code coverage figures for
- the test suite. To use it, configure curl with
- CFLAGS='-fprofile-arcs -ftest-coverage -g -O0'. Make sure you run the normal
- and torture tests to get more full coverage, i.e. do:
+ gcc provides a tool that can determine the code coverage figures for the
+ test suite. To use it, configure curl with `CFLAGS='-fprofile-arcs
+ -ftest-coverage -g -O0`. Make sure you run the normal and torture tests to
+ get more full coverage, i.e. do:
make test
make test-torture
@@ -204,7 +174,7 @@ The curl Test Suite
The text mode tool gcov may also be used, but it doesn't handle object files
in more than one directory very well.
- 1.11 Remote testing
+### Remote testing
The runtests.pl script provides some hooks to allow curl to be tested on a
machine where perl can not be run. The test framework in this case runs on
@@ -212,63 +182,48 @@ The curl Test Suite
system using ssh or some other remote execution method. See the comments at
the beginning of runtests.pl for details.
-2. Numbering
+## Test case numbering
- 2.1 Test case numbering
-
- Test cases used to be numbered by category, but the ranges filled
+ Test cases used to be numbered by category ranges, but the ranges filled
up. Subsets of tests can now be selected by passing keywords to the
- runtests.pl script via the make TFLAGS variable.
+ runtests.pl script via the make `TFLAGS` variable.
- New tests should now be added by finding a free number in
- tests/data/Makefile.inc.
+ New tests are added by finding a free number in `tests/data/Makefile.inc`.
-3. Write tests
+## Write tests
Here's a quick description on writing test cases. We basically have three
kinds of tests: the ones that test the curl tool, the ones that build small
applications and test libcurl directly and the unit tests that test
individual (possibly internal) functions.
- 3.1 test data
+### test data
Each test has a master file that controls all the test data. What to read,
what the protocol exchange should look like, what exit code to expect and
what command line arguments to use etc.
- These files are tests/data/test[num] where [num] is described in section 2
- of this document, and the XML-like file format of them is described in the
- separate tests/FILEFORMAT document.
+ These files are `tests/data/test[num]` where `[num]` is just a unique
+ identifier described above, and the XML-like file format of them is
+ described in the separate [FILEFORMAT.md](FILEFORMAT.md) document.
- 3.2 curl tests
+### curl tests
A test case that runs the curl tool and verifies that it gets the correct
data, it sends the correct data, it uses the correct protocol primitives
etc.
- 3.3 libcurl tests
+### libcurl tests
The libcurl tests are identical to the curl ones, except that they use a
specific and dedicated custom-built program to run instead of "curl". This
- tool is built from source code placed in tests/libtest and if you want to
+ tool is built from source code placed in `tests/libtest` and if you want to
make a new libcurl test that is where you add your code.
- 3.4 unit tests
+### unit tests
- Unit tests are tests in the 13xx sequence and they are placed in tests/unit.
- There's a tests/unit/README describing the specific set of checks and macros
- that may be used when writing tests that verify behaviors of specific
- individual functions.
+ Unit tests are placed in `tests/unit`. There's a tests/unit/README
+ describing the specific set of checks and macros that may be used when
+ writing tests that verify behaviors of specific individual functions.
The unit tests depend on curl being built with debug enabled.
-
-4. TODO
-
- 4.1 More protocols
-
- Add tests for TELNET, LDAP, DICT...
-
- 4.2 SOCKS auth
-
- SOCKS4/5 test deficiencies - no proxy authentication tests as SSH (the
- test mechanism) doesn't support them
diff --git a/tests/appveyor.pm b/tests/appveyor.pm
new file mode 100644
index 000000000..1b3889dc0
--- /dev/null
+++ b/tests/appveyor.pm
@@ -0,0 +1,115 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2020, Marc Hoersken, <info@marc-hoersken.de>
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+use strict;
+use warnings;
+
+my %APPVEYOR_TEST_NAMES;
+
+sub appveyor_check_environment {
+ if(defined $ENV{'APPVEYOR_API_URL'} && $ENV{'APPVEYOR_API_URL'}) {
+ return 1;
+ }
+ return 0;
+}
+
+sub appveyor_create_test_result {
+ my ($curl, $testnum, $testname)=@_;
+ $testname =~ s/\\/\\\\/g;
+ $testname =~ s/\'/\\\'/g;
+ $testname =~ s/\"/\\\"/g;
+ my $appveyor_baseurl="$ENV{'APPVEYOR_API_URL'}";
+ my $appveyor_result=`$curl --silent --noproxy "*" \\
+ --header "Content-Type: application/json" \\
+ --data "
+ {
+ 'testName': '$testname',
+ 'testFramework': 'runtests.pl',
+ 'fileName': 'tests/data/test$testnum',
+ 'outcome': 'Running'
+ }
+ " \\
+ "$appveyor_baseurl/api/tests"`;
+ print "AppVeyor API result: $appveyor_result\n" if ($appveyor_result);
+ $APPVEYOR_TEST_NAMES{$testnum}=$testname;
+}
+
+sub appveyor_update_test_result {
+ my ($curl, $testnum, $error, $start, $stop)=@_;
+ my $testname=$APPVEYOR_TEST_NAMES{$testnum};
+ if(!defined $testname) {
+ return;
+ }
+ if(!defined $stop) {
+ $stop = $start;
+ }
+ my $appveyor_duration = sprintf("%.0f", ($stop-$start)*1000);
+ my $appveyor_outcome;
+ my $appveyor_category;
+ if($error == 2) {
+ $appveyor_outcome = 'Ignored';
+ $appveyor_category = 'Error';
+ }
+ elsif($error < 0) {
+ $appveyor_outcome = 'NotRunnable';
+ $appveyor_category = 'Warning';
+ }
+ elsif(!$error) {
+ $appveyor_outcome = 'Passed';
+ $appveyor_category = 'Information';
+ }
+ else {
+ $appveyor_outcome = 'Failed';
+ $appveyor_category = 'Error';
+ }
+ my $appveyor_baseurl="$ENV{'APPVEYOR_API_URL'}";
+ my $appveyor_result=`$curl --silent --noproxy "*" --request PUT \\
+ --header "Content-Type: application/json" \\
+ --data "
+ {
+ 'testName': '$testname',
+ 'testFramework': 'runtests.pl',
+ 'fileName': 'tests/data/test$testnum',
+ 'outcome': '$appveyor_outcome',
+ 'durationMilliseconds': $appveyor_duration,
+ 'ErrorMessage': 'Test $testnum $appveyor_outcome'
+ }
+ " \\
+ "$appveyor_baseurl/api/tests"`;
+ print "AppVeyor API result: $appveyor_result\n" if ($appveyor_result);
+ if($appveyor_category eq 'Error') {
+ $appveyor_result=`$curl --silent --noproxy "*" \\
+ --header "Content-Type: application/json" \\
+ --data "
+ {
+ 'message': '$appveyor_outcome: $testname',
+ 'category': '$appveyor_category',
+ 'details': 'Test $testnum $appveyor_outcome'
+ }
+ " \\
+ "$appveyor_baseurl/api/build/messages"`;
+ print "AppVeyor API result: $appveyor_result\n" if ($appveyor_result);
+ }
+}
+
+1;
diff --git a/tests/azure.pm b/tests/azure.pm
new file mode 100644
index 000000000..98d777ba6
--- /dev/null
+++ b/tests/azure.pm
@@ -0,0 +1,149 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2020, Marc Hoersken, <info@marc-hoersken.de>
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+use strict;
+use warnings;
+
+use POSIX qw(strftime);
+
+sub azure_check_environment {
+ if(defined $ENV{'AZURE_ACCESS_TOKEN'} && $ENV{'AZURE_ACCESS_TOKEN'} &&
+ defined $ENV{'AGENT_JOBNAME'} && $ENV{'BUILD_BUILDID'} &&
+ defined $ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'} &&
+ defined $ENV{'SYSTEM_TEAMPROJECTID'}) {
+ return 1;
+ }
+ return 0;
+}
+
+sub azure_create_test_run {
+ my ($curl)=@_;
+ my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
+ my $azure_run=`$curl --silent --noproxy "*" \\
+ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
+ --header "Content-Type: application/json" \\
+ --data "
+ {
+ 'name': '$ENV{'AGENT_JOBNAME'}',
+ 'automated': true,
+ 'build': {'id': '$ENV{'BUILD_BUILDID'}'}
+ }
+ " \\
+ "$azure_baseurl/_apis/test/runs?api-version=5.1"`;
+ if($azure_run =~ /"id":(\d+)/) {
+ return $1;
+ }
+ return "";
+}
+
+sub azure_create_test_result {
+ my ($curl, $azure_run_id, $testnum, $testname)=@_;
+ $testname =~ s/\\/\\\\/g;
+ $testname =~ s/\'/\\\'/g;
+ $testname =~ s/\"/\\\"/g;
+ my $title_testnum=sprintf("%04d", $testnum);
+ my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
+ my $azure_result=`$curl --silent --noproxy "*" \\
+ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
+ --header "Content-Type: application/json" \\
+ --data "
+ [
+ {
+ 'build': {'id': '$ENV{'BUILD_BUILDID'}'},
+ 'testCase': {'id': $testnum},
+ 'testCaseTitle': '$title_testnum: $testname',
+ 'testCaseRevision': 2,
+ 'automatedTestName': 'curl.tests.$testnum',
+ 'outcome': 'InProgress'
+ }
+ ]
+ " \\
+ "$azure_baseurl/_apis/test/runs/$azure_run_id/results?api-version=5.1"`;
+ if($azure_result =~ /\[\{"id":(\d+)/) {
+ return $1;
+ }
+ return "";
+}
+
+sub azure_update_test_result {
+ my ($curl, $azure_run_id, $azure_result_id, $testnum, $error, $start, $stop)=@_;
+ if(!defined $stop) {
+ $stop = $start;
+ }
+ my $azure_start = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime $start;
+ my $azure_complete = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime $stop;
+ my $azure_duration = sprintf("%.0f", ($stop-$start)*1000);
+ my $azure_outcome;
+ if($error == 2) {
+ $azure_outcome = 'NotApplicable';
+ }
+ elsif($error < 0) {
+ $azure_outcome = 'NotExecuted';
+ }
+ elsif(!$error) {
+ $azure_outcome = 'Passed';
+ }
+ else {
+ $azure_outcome = 'Failed';
+ }
+ my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
+ my $azure_result=`$curl --silent --noproxy "*" --request PATCH \\
+ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
+ --header "Content-Type: application/json" \\
+ --data "
+ [
+ {
+ 'id': $azure_result_id,
+ 'outcome': '$azure_outcome',
+ 'startedDate': '$azure_start',
+ 'completedDate': '$azure_complete',
+ 'durationInMs': $azure_duration
+ }
+ ]
+ " \\
+ "$azure_baseurl/_apis/test/runs/$azure_run_id/results?api-version=5.1"`;
+ if($azure_result =~ /\[\{"id":(\d+)/) {
+ return $1;
+ }
+ return "";
+}
+
+sub azure_update_test_run {
+ my ($curl, $azure_run_id)=@_;
+ my $azure_baseurl="$ENV{'SYSTEM_TEAMFOUNDATIONCOLLECTIONURI'}$ENV{'SYSTEM_TEAMPROJECTID'}";
+ my $azure_run=`$curl --silent --noproxy "*" --request PATCH \\
+ --header "Authorization: Bearer $ENV{'AZURE_ACCESS_TOKEN'}" \\
+ --header "Content-Type: application/json" \\
+ --data "
+ {
+ 'state': 'Completed'
+ }
+ " \\
+ "$azure_baseurl/_apis/test/runs/$azure_run_id?api-version=5.1"`;
+ if($azure_run =~ /"id":(\d+)/) {
+ return $1;
+ }
+ return "";
+}
+
+1;
diff --git a/tests/badsymbols.pl b/tests/badsymbols.pl
new file mode 100755
index 000000000..431e8e4f8
--- /dev/null
+++ b/tests/badsymbols.pl
@@ -0,0 +1,132 @@
+#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010-2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# This script grew out of help from Przemyslaw Iskra and Balint Szilakszi
+# a late evening in the #curl IRC channel on freenode.
+#
+
+use strict;
+use warnings;
+use vars qw($Cpreprocessor);
+
+#
+# configurehelp perl module is generated by configure script
+#
+my $rc = eval {
+ require configurehelp;
+ configurehelp->import(qw(
+ $Cpreprocessor
+ ));
+ 1;
+};
+# Set default values if configure has not generated a configurehelp.pm file.
+# This is the case with cmake.
+if (!$rc) {
+ $Cpreprocessor = 'cpp';
+}
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+# need an include directory when building out-of-tree
+my $i = ($ARGV[1]) ? "-I$ARGV[1] " : '';
+
+my $incdir = "$root/include/curl";
+
+my $verbose=0;
+my $summary=0;
+my $misses=0;
+
+my @syms;
+my %doc;
+my %rem;
+
+sub scanenums {
+ my ($file)=@_;
+ my $skipit = 0;
+
+ open H_IN, "-|", "$Cpreprocessor $i$file" || die "Cannot preprocess $file";
+ while ( <H_IN> ) {
+ if( /^#(line|) (\d+) \"(.*)\"/) {
+ # if the included file isn't in our incdir, then we skip this section
+ # until next #line
+ #
+ if($3 !~ /^$incdir/) {
+ $skipit = 1;
+ next;
+ }
+ # parse this!
+ $skipit = 0;
+ next;
+ }
+ if($skipit) {
+ next;
+ }
+ if ( /enum\s+(\S+\s+)?{/ .. /}/ ) {
+ s/^\s+//;
+ chomp;
+ s/[,\s].*//;
+ if(($_ !~ /\}(;|)/) &&
+ ($_ ne "typedef") &&
+ ($_ ne "enum") &&
+ ($_ !~ /^[ \t]*$/)) {
+ push @syms, $_;
+ }
+ }
+ }
+ close H_IN || die "Error preprocessing $file";
+}
+
+sub scanheader {
+ my ($f)=@_;
+ scanenums($f);
+ open H, "<$f";
+ while(<H>) {
+ if (/^#define +([^ \n]*)/) {
+ push @syms, $1;
+ }
+ }
+ close H;
+}
+
+
+opendir(my $dh, $incdir) || die "Can't opendir: $!";
+my @hfiles = grep { /\.h$/ } readdir($dh);
+closedir $dh;
+
+for(@hfiles) {
+ scanheader("$incdir/$_");
+}
+
+my $errors = 0;
+for my $s (@syms) {
+ if($s !~ /^(lib|)curl/i) {
+ print "Bad symbols in public header files:\n" if(!$errors);
+ $errors++;
+ print " $s\n";
+ }
+}
+if($errors) {
+ exit 1;
+}
+printf "%d fine symbols found\n", scalar(@syms);
diff --git a/tests/certs/Makefile.am b/tests/certs/Makefile.am
index 6a1c22aa6..f5665f7fa 100644
--- a/tests/certs/Makefile.am
+++ b/tests/certs/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/certs/scripts/Makefile.am b/tests/certs/scripts/Makefile.am
index 1db622204..271fb0e4f 100644
--- a/tests/certs/scripts/Makefile.am
+++ b/tests/certs/scripts/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/certs/scripts/genroot.sh b/tests/certs/scripts/genroot.sh
index f66fc6554..963f34350 100755
--- a/tests/certs/scripts/genroot.sh
+++ b/tests/certs/scripts/genroot.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# (c) CopyRight EdelWeb for EdelKey and OpenEvidence, 2000-2004, 2009
+# (c) CopyRight 2000 - 2020, EdelWeb for EdelKey and OpenEvidence
# Author: Peter Sylvester
# "libre" for integration with curl
diff --git a/tests/certs/scripts/genserv.sh b/tests/certs/scripts/genserv.sh
index f0f440320..dcbc0486b 100755
--- a/tests/certs/scripts/genserv.sh
+++ b/tests/certs/scripts/genserv.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# (c) CopyRight EdelWeb for EdelKey and OpenEvidence, 2000-2004, 2009
+# (c) CopyRight 2000 - 2020, EdelWeb for EdelKey and OpenEvidence
# Author: Peter Sylvester
# "libre" for integration with curl
diff --git a/tests/curl_test_data.py b/tests/curl_test_data.py
index 21747407d..a46cb73af 100755
--- a/tests/curl_test_data.py
+++ b/tests/curl_test_data.py
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -30,7 +30,7 @@ import logging
log = logging.getLogger(__name__)
-REPLY_DATA = re.compile("<reply>\s*<data>(.*?)</data>", re.MULTILINE | re.DOTALL)
+REPLY_DATA = re.compile("<reply>[ \t\n\r]*<data[^<]*>(.*?)</data>", re.MULTILINE | re.DOTALL)
class TestData(object):
diff --git a/tests/data/CMakeLists.txt b/tests/data/CMakeLists.txt
index dec92e544..480dee62d 100644
--- a/tests/data/CMakeLists.txt
+++ b/tests/data/CMakeLists.txt
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Loads 'TESTCASES' from for the 'make show' target in runtests.pl
transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
diff --git a/tests/data/DISABLED b/tests/data/DISABLED
index 61bdf1351..1806a5dbe 100644
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@ -2,29 +2,24 @@
# test cases are run by runtests.pl. Just add the plain test case numbers, one
# per line.
# Lines starting with '#' letters are treated as comments.
+#
+# Uses SRP to "a server not supporting it" but modern stunnel versions
+# will silently accept it and remain happy
+323
+#
594
+836
+882
+938
1209
1211
+# fnmatch differences are just too common to make testing them sensible
+1307
1316
+# test 1510 causes problems on the CI on github
+# example: https://travis-ci.org/curl/curl/builds/81633600
+1510
1512
-836
-882
-938
# test 1801 causes problems on Mac OS X and github
# https://github.com/curl/curl/issues/380
1801
-# test 1510 causes problems on the CI on github
-# example: https://travis-ci.org/curl/curl/builds/81633600
-1510
-# Pipelining test that is causing false positives a little too often
-1903
-# fnmatch differences are just too common to make testing them sensible
-1307
-# Pipelining is deprecated
-530
-536
-584
-1900
-1901
-1902
-2033
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 4ec0364ba..6e694ec06 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
iall:
install:
test:
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 557f92891..8a63358d0 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -57,25 +57,29 @@ test298 test299 test300 test301 test302 test303 test304 test305 test306 \
test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
test325 test326 test327 test328 test329 test330 test331 test332 test333 \
-test334 test335 test336 test337 test338 \
-test340 \
-\
-test350 test351 test352 test353 test354 test355 test356 \
-test393 test394 test395 \
+test334 test335 test336 test337 test338 test339 test340 test341 test342 \
+test343 test344 test345 test346 test347 test348 \
+test350 test351 test352 test353 test354 test355 test356 test357 test358 \
+test359 \
+test393 test394 test395 test396 test397 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \
\
+test430 test431 test432 test433 test434 \
+\
+test490 test491 test492 \
+\
test500 test501 test502 test503 test504 test505 test506 test507 test508 \
test509 test510 test511 test512 test513 test514 test515 test516 test517 \
test518 test519 test520 test521 test522 test523 test524 test525 test526 \
-test527 test528 test529 test530 test531 test532 test533 test534 test535 \
+test527 test528 test529 test531 test532 test533 test534 test535 \
test537 test538 test539 test540 test541 test542 test543 test544 \
test545 test546 test547 test548 test549 test550 test551 test552 test553 \
test554 test555 test556 test557 test558 test559 test560 test561 test562 \
test563 test564 test565 test566 test567 test568 test569 test570 test571 \
test572 test573 test574 test575 test576 test577 test578 test579 test580 \
-test581 test582 test583 test584 test585 test586 test587 test588 test589 \
+test581 test582 test583 test585 test586 test587 test588 test589 \
test590 test591 test592 test593 test594 test595 test596 test597 test598 \
test599 test600 test601 test602 test603 test604 test605 test606 test607 \
test608 test609 test610 test611 test612 test613 test614 test615 test616 \
@@ -84,7 +88,8 @@ test626 test627 test628 test629 test630 test631 test632 test633 test634 \
test635 test636 test637 test638 test639 test640 test641 test642 \
test643 test644 test645 test646 test647 test648 test649 test650 test651 \
test652 test653 test654 test655 test656 test658 test659 test660 test661 \
-test662 test663 \
+test662 test663 test664 test665 test666 test667 test668 test669 \
+test670 test671 test672 test673 test674 \
\
test700 test701 test702 test703 test704 test705 test706 test707 test708 \
test709 test710 test711 test712 test713 test714 test715 test716 test717 \
@@ -94,13 +99,12 @@ test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
-test845 test846 test847 test848 test849 \
-\
-test850 test851 test852 test853 test854 test855 test856 test857 test858 \
-test859 test860 test861 test862 test863 test864 test865 test866 test867 \
-test868 test869 test870 test871 test872 test873 test874 test875 test876 \
-test877 test878 test879 test880 test881 test882 test883 test884 test885 \
-test886 test887 test888 test889 test890 test891 test892 test893 \
+test845 test846 test847 test848 test849 test850 test851 test852 test853 \
+test854 test855 test856 test857 test858 test859 test860 test861 test862 \
+test863 test864 test865 test866 test867 test868 test869 test870 test871 \
+test872 test873 test874 test875 test876 test877 test878 test879 test880 \
+test881 test882 test883 test884 test885 test886 test887 test888 test889 \
+test890 test891 test892 test893 test894 test895 test896 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
@@ -108,7 +112,8 @@ test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 test953 \
-test954 \
+test954 test955 test956 test957 test958 test959 test960 test961 test962 \
+test963 test964 test965 test966 test967 test968 test969 test970 test971 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
@@ -130,59 +135,66 @@ test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
-test1160 test1161 test1162 test1163 test1164 test1165 test1166 \
-test1170 test1171 test1172 test1173 test1174 \
+test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 \
+test1168 test1170 test1171 test1172 test1173 test1174 test1175 \
+test1176 test1177 test1178 test1179 \
+\
+test1190 test1191 test1192 test1193 test1194 test1195 test1196 test1197 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
-test1216 test1217 test1218 test1219 \
-test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
-test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
-test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
-test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
-test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
-test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
-test1268 test1269 \
+test1216 test1217 test1218 test1219 test1220 test1221 test1222 test1223 \
+test1224 test1225 test1226 test1227 test1228 test1229 test1230 test1231 \
+test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 \
+test1240 test1241 test1242 test1243 test1244 test1245 test1246 test1247 \
+test1248 test1249 test1250 test1251 test1252 test1253 test1254 test1255 \
+test1256 test1257 test1258 test1259 test1260 test1261 test1262 test1263 \
+test1264 test1265 test1266 test1267 test1268 test1269 test1270 test1271 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
-test1288 test1289 test1290 test1291 test1292 \
-test1298 test1299 \
-test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
-test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
-test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
-test1324 test1325 test1326 test1327 test1328 test1329 test1330 test1331 \
-test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 \
-test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 \
-test1348 test1349 test1350 test1351 test1352 test1353 test1354 test1355 \
-test1356 test1357 test1358 test1359 test1360 test1361 test1362 test1363 \
-test1364 test1365 test1366 test1367 test1368 test1369 test1370 test1371 \
-test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 \
-test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 \
-test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \
-test1396 test1397 test1398 test1399 \
-\
+test1288 test1289 test1290 test1291 test1292 test1293 test1294 test1295 \
+test1296 test1297 test1298 test1299 test1300 test1301 test1302 test1303 \
+test1304 test1305 test1306 test1307 test1308 test1309 test1310 test1311 \
+test1312 test1313 test1314 test1315 test1316 test1317 test1318 test1319 \
+test1320 test1321 test1322 test1323 test1324 test1325 test1326 test1327 \
+test1328 test1329 test1330 test1331 test1332 test1333 test1334 test1335 \
+test1336 test1337 test1338 test1339 test1340 test1341 test1342 test1343 \
+test1344 test1345 test1346 test1347 test1348 test1349 test1350 test1351 \
+test1352 test1353 test1354 test1355 test1356 test1357 test1358 test1359 \
+test1360 test1361 test1362 test1363 test1364 test1365 test1366 test1367 \
+test1368 test1369 test1370 test1371 test1372 test1373 test1374 test1375 \
+test1376 test1377 test1378 test1379 test1380 test1381 test1382 test1383 \
+test1384 test1385 test1386 test1387 test1388 test1389 test1390 test1391 \
+test1392 test1393 test1394 test1395 test1396 test1397 test1398 test1399 \
test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \
test1416 test1417 test1418 test1419 test1420 test1421 test1422 test1423 \
-test1424 test1425 test1426 test1427 \
-test1428 test1429 test1430 test1431 test1432 test1433 test1434 test1435 \
-test1436 test1437 test1438 test1439 test1440 test1441 test1442 test1443 \
-test1444 test1445 test1446 test1447 test1448 test1449 test1450 test1451 \
-test1452 test1453 test1454 test1455 test1456 test1457 test1458\
+test1424 test1425 test1426 test1427 test1428 test1429 test1430 test1431 \
+test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 \
+test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 \
+test1448 test1449 test1450 test1451 test1452 test1453 test1454 test1455 \
+test1456 test1457 test1458 test1459 test1460 test1461 test1462 test1463 \
+test1464 test1465 \
+\
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \
+test1524 test1525 test1526 test1527 test1528 test1529 test1530 test1531 \
+test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 \
+test1540 \
\
-test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
-test1533 test1534 test1535 test1536 test1537 test1538 \
-test1540 test1541 \
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
-test1558 test1559 test1560 test1561 test1562 test1563 \
+test1558 test1559 test1560 test1561 test1562 test1563 test1564 test1565 \
+test1566 test1567 \
\
test1590 test1591 test1592 test1593 test1594 test1595 test1596 \
\
test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
-test1608 test1609 test1620 test1621 \
+test1608 test1609 test1610 test1611 test1612 \
+\
+test1620 test1621 \
+\
+test1630 test1631 test1632 test1633 \
\
test1650 test1651 test1652 test1653 test1654 test1655 \
\
@@ -190,20 +202,23 @@ test1700 test1701 test1702 \
\
test1800 test1801 \
\
-test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
+ test1904 test1905 test1906 test1907 \
+test1908 test1909 test1910 test1911 test1912 test1913 test1914 \
\
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
-test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
+test2032 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
test2064 test2065 test2066 test2067 test2068 test2069 \
+test2064 test2065 test2066 test2067 test2068 test2069 test2070 \
test2071 test2072 test2073 test2074 test2075 test2076 test2077 \
test2078 \
test2080 \
test2100 \
\
-test3000 test3001
+test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 \
+test3008 test3009 test3010 test3011 test3012 test3013 test3014 test3015
diff --git a/tests/data/test1 b/tests/data/test1
index 7c0e1602a..461375b62 100644
--- a/tests/data/test1
+++ b/tests/data/test1
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/1
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test10 b/tests/data/test10
index 806aa697f..c5053b5db 100644
--- a/tests/data/test10
+++ b/tests/data/test10
@@ -43,12 +43,10 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/10 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
diff --git a/tests/data/test1001 b/tests/data/test1001
index 53d7da381..6edaade79 100644
--- a/tests/data/test1001
+++ b/tests/data/test1001
@@ -81,14 +81,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -97,6 +94,7 @@ GET http://%HOSTIP:%HTTPPORT/1001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1001", response="6af4d89c952f4dd4cc215a6878dc499d"
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test1002 b/tests/data/test1002
index 5b6ef9431..7ec7501f7 100644
--- a/tests/data/test1002
+++ b/tests/data/test1002
@@ -80,14 +80,11 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1002.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -96,6 +93,7 @@ GET http://%HOSTIP:%HTTPPORT/1002.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload1", response="198aa9b6acb4b0c71d02a197a5e41f54"
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
@@ -105,7 +103,7 @@ st
GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.16.1
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -114,7 +112,7 @@ GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload2", response="d711f0d2042786d930de635ba0d1a1d0"
Content-Range: bytes 2-4/5
-User-Agent: curl/7.16.1
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test1004 b/tests/data/test1004
index 955163b36..05e92a598 100644
--- a/tests/data/test1004
+++ b/tests/data/test1004
@@ -43,12 +43,10 @@ http://%HOSTIP:%HTTPPORT/1004 --proxy ""
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1004 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1008 b/tests/data/test1008
index 9fca722c8..a076fa0d4 100644
--- a/tests/data/test1008
+++ b/tests/data/test1008
@@ -86,6 +86,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -109,23 +110,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1008:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1008:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1008:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10080002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.1008:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1011 b/tests/data/test1011
index 566867dd6..6d3297a76 100644
--- a/tests/data/test1011
+++ b/tests/data/test1011
@@ -56,19 +56,17 @@ http://%HOSTIP:%HTTPPORT/blah/1011 -L -d "moo"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /blah/1011 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooGET /blah/moo.html&testcase=/10110002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1012 b/tests/data/test1012
index 4edc1731e..943db91c0 100644
--- a/tests/data/test1012
+++ b/tests/data/test1012
@@ -56,19 +56,17 @@ http://%HOSTIP:%HTTPPORT/blah/1012 -L -d "moo" --post301
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1012 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /blah/moo.html&testcase=/10120002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1015 b/tests/data/test1015
index a2b2cefa1..c568b8678 100644
--- a/tests/data/test1015
+++ b/tests/data/test1015
@@ -38,13 +38,10 @@ content to _?!#$'|<>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /1015 HTTP/1.1
-User-Agent: curl/7.17.2-CVS (i686-pc-linux-gnu) libcurl/7.17.2-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.5.2-CVS libidn/1.1 libssh2/0.19.0-C
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 133
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1021 b/tests/data/test1021
index 689341d60..10a0314ad 100644
--- a/tests/data/test1021
+++ b/tests/data/test1021
@@ -91,6 +91,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -114,27 +115,27 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.1021:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.1021:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10210002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.1021:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1024 b/tests/data/test1024
index 086ef267a..4971eedbd 100644
--- a/tests/data/test1024
+++ b/tests/data/test1024
@@ -81,20 +81,20 @@ http://%HOSTIP:%HTTPPORT/want/1024 -L -c log/jar1024
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1024 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /data/10240002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/10240003.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: firstcookie=want
diff --git a/tests/data/test1025 b/tests/data/test1025
index 494f8f8d5..66f7532b4 100644
--- a/tests/data/test1025
+++ b/tests/data/test1025
@@ -81,22 +81,22 @@ http://%HOSTIP:%HTTPPORT/want/1025 -L -c log/jar1025 -b forcedcookie=yes
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1025 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: forcedcookie=yes
GET /data/10250002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: forcedcookie=yes
GET /want/10250003.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: firstcookie=want; forcedcookie=yes
diff --git a/tests/data/test1028 b/tests/data/test1028
index fd5162a70..c10d58126 100644
--- a/tests/data/test1028
+++ b/tests/data/test1028
@@ -19,7 +19,7 @@ Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake swsclose
Content-Type: text/html
Funny-head: yesyes
-Location: ftp://127.0.0.1:8992/10280002
+Location: ftp://%HOSTIP:%FTPPORT/10280002
Content-Length: 0
Connection: close
@@ -47,21 +47,15 @@ HTTP Location: redirect to FTP URL
<command>
http://%HOSTIP:%HTTPPORT/10280001 -L
</command>
-# The data section doesn't do variable substitution, so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%FTPPORT' ne '8992' );"
-</precheck>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /10280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
diff --git a/tests/data/test1029 b/tests/data/test1029
index c77209cad..9a351a4f3 100644
--- a/tests/data/test1029
+++ b/tests/data/test1029
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1029 -w '%{redirect_url}\n'
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1029 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1030 b/tests/data/test1030
index 5a8ed4cd6..735c08b7a 100644
--- a/tests/data/test1030
+++ b/tests/data/test1030
@@ -79,12 +79,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1030 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -96,7 +94,7 @@ four is the number of lines
PUT /1030 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1030", response="01cb59db1ddaac246b072d5f5f0716d9"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1031 b/tests/data/test1031
index 9cfbab5c5..b12785a0c 100644
--- a/tests/data/test1031
+++ b/tests/data/test1031
@@ -59,16 +59,15 @@ http://%HOSTIP:%HTTPPORT/want/this/1031 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/this/1031 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/this/1031?coolsite=yes/10310002.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1032 b/tests/data/test1032
index b0b6834cc..0c38ae132 100644
--- a/tests/data/test1032
+++ b/tests/data/test1032
@@ -42,13 +42,11 @@ HTTP HEAD with --range
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /1032 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=1-3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1033 b/tests/data/test1033
index 9ad5d2526..908dd32c0 100644
--- a/tests/data/test1033
+++ b/tests/data/test1033
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1033
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1033 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1034 b/tests/data/test1034
index b4ffc8a98..89083a294 100644
--- a/tests/data/test1034
+++ b/tests/data/test1034
@@ -43,7 +43,7 @@ HTTP over proxy with malformatted IDN host name
url = "http://invalid-utf8-â.local/page/1034"
</stdin>
<command>
--K - -x %HOSTIP:%HTTPPORT
+-K - -x %HOSTIP:%NOLISTENPORT
</command>
</client>
diff --git a/tests/data/test1035 b/tests/data/test1035
index a316c51e1..b67eab281 100644
--- a/tests/data/test1035
+++ b/tests/data/test1035
@@ -35,16 +35,13 @@ perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(lan
HTTP over proxy with too long IDN host name
</name>
<command>
-http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 -x %HOSTIP:%HTTPPORT
+http://too-long-IDN-name-cürl-rüles-la-la-la-dee-da-flooby-nooby.local/page/1035 -x %HOSTIP:%NOLISTENPORT
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
3
</errorcode>
diff --git a/tests/data/test1040 b/tests/data/test1040
index e21ed8199..d480bb448 100644
--- a/tests/data/test1040
+++ b/tests/data/test1040
@@ -65,13 +65,11 @@ http://%HOSTIP:%HTTPPORT/1040 -C -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1040 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=100-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1041 b/tests/data/test1041
index c77d616a8..4797cf937 100644
--- a/tests/data/test1041
+++ b/tests/data/test1041
@@ -50,15 +50,13 @@ http://%HOSTIP:%HTTPPORT/1041 -Tlog/test1041.txt -C -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# curl doesn't do a HEAD request on the remote file so it has no idea whether
# it can skip part of the file or not. Instead, it sends the entire file.
<protocol>
PUT /1041 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 0-99/100
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 100
Expect: 100-continue
diff --git a/tests/data/test1042 b/tests/data/test1042
index dfebaa152..d374d2ab5 100644
--- a/tests/data/test1042
+++ b/tests/data/test1042
@@ -80,13 +80,11 @@ http://%HOSTIP:%HTTPPORT/1042 -C 200
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1042 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=200-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1043 b/tests/data/test1043
index 4ab498762..e200b61ea 100644
--- a/tests/data/test1043
+++ b/tests/data/test1043
@@ -70,13 +70,11 @@ http://%HOSTIP:%HTTPPORT/1043 -C -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1043 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=40-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1045 b/tests/data/test1045
index fa8ad4b44..9de169bab 100644
--- a/tests/data/test1045
+++ b/tests/data/test1045
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1045 --interface %CLIENTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1045 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1046 b/tests/data/test1046
index e86e1329c..0f04b8a33 100644
--- a/tests/data/test1046
+++ b/tests/data/test1046
@@ -47,12 +47,10 @@ perl -e "print 'Test requires default test client host address' if ( '%CLIENT6IP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1046 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1051 b/tests/data/test1051
index 080e1d1d5..7a8eae1bd 100644
--- a/tests/data/test1051
+++ b/tests/data/test1051
@@ -73,9 +73,6 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# The primary reason libcurl sends the data part twice in this test is that
# the test HTTP server is blocking until it has read the entire request,
@@ -85,6 +82,7 @@ the
<protocol>
PUT /want/1051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
@@ -100,6 +98,7 @@ the
feature
PUT /want/data/10510002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
diff --git a/tests/data/test1052 b/tests/data/test1052
index 10c16b4a7..e0c2f32a6 100644
--- a/tests/data/test1052
+++ b/tests/data/test1052
@@ -69,9 +69,6 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# The primary reason libcurl sends the data part twice in this test is that
# the test HTTP server is blocking until it has read the entire request,
@@ -80,6 +77,7 @@ the
<protocol>
PUT /want/1052 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
@@ -94,6 +92,7 @@ the
feature
PUT /want/data/10520002.txt?coolsite=yes HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
diff --git a/tests/data/test1053 b/tests/data/test1053
index 239a1100f..5f3ec2932 100644
--- a/tests/data/test1053
+++ b/tests/data/test1053
@@ -71,12 +71,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/1053 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 410
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
@@ -99,8 +99,8 @@ bar
------------------------------9ef8d6205763--
POST /we/want/data/10530002.txt?coolsite=yes HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 410
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test1054 b/tests/data/test1054
index 54d023267..ac6671f6e 100644
--- a/tests/data/test1054
+++ b/tests/data/test1054
@@ -58,18 +58,17 @@ http://%HOSTIP:%HTTPPORT/blah/1054 -L -d @log/test1054.txt --post301
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1054 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
field=dataPOST /blah/moo/testcase/10540002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1055 b/tests/data/test1055
index 510d490f4..4788ae77d 100644
--- a/tests/data/test1055
+++ b/tests/data/test1055
@@ -18,7 +18,7 @@ HTTP/1.1 307 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake swsclose
Content-Type: text/html
-Location: ftp://127.0.0.1:8992/1055
+Location: ftp://%HOSTIP:%FTPPORT/1055
Content-Length: 0
Connection: close
@@ -38,10 +38,6 @@ HTTP PUT Location: redirect to FTP URL
<command>
http://%HOSTIP:%HTTPPORT/1055 -L -T log/test1055.txt
</command>
-# The data section doesn't do variable substitution, so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%FTPPORT' ne '8992' );"
-</precheck>
<file name="log/test1055.txt">
Weird
file
@@ -58,12 +54,10 @@ the
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1055 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
Expect: 100-continue
diff --git a/tests/data/test1056 b/tests/data/test1056
index 52b013614..7ccdb2199 100644
--- a/tests/data/test1056
+++ b/tests/data/test1056
@@ -13,7 +13,7 @@ IPv6
<reply>
<data>
HTTP/1.1 302 OK swsclose
-Location: http://[::1%259999]:8994/moo/10560002
+Location: http://[::1%259999]:%HTTP6PORT/moo/10560002
Date: Thu, 31 Jul 2008 14:49:00 GMT
Connection: close
@@ -27,7 +27,7 @@ body
</data2>
<datacheck>
HTTP/1.1 302 OK swsclose
-Location: http://[::1%259999]:8994/moo/10560002
+Location: http://[::1%259999]:%HTTP6PORT/moo/10560002
Date: Thu, 31 Jul 2008 14:49:00 GMT
Connection: close
@@ -55,25 +55,20 @@ HTTP follow redirect from IPv4 to IPv6 with scope
<command>
http://%HOSTIP:%HTTPPORT/we/are/all/twits/1056 -L
</command>
-# The data section doesn't do variable substitution, so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOST6IP' ne '[::1]' || '%HTTP6PORT' ne '8994' );"
-</precheck>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/1056 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /moo/10560002 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1058 b/tests/data/test1058
index 4eb34da73..d177b5fd7 100644
--- a/tests/data/test1058
+++ b/tests/data/test1058
@@ -39,13 +39,11 @@ http://%HOSTIP:%HTTPPORT/want/1058 -r -101
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1058 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=-101
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1059 b/tests/data/test1059
index 615e625c9..32e5aec3a 100644
--- a/tests/data/test1059
+++ b/tests/data/test1059
@@ -46,12 +46,10 @@ ftp://test-number:1059/wanted/page -p -x %HOSTIP:%HTTPPORT
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
CONNECT test-number:1059 HTTP/1.1
Host: test-number:1059
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</protocol>
diff --git a/tests/data/test1060 b/tests/data/test1060
index c4b264c10..889a39054 100644
--- a/tests/data/test1060
+++ b/tests/data/test1060
@@ -18,7 +18,7 @@ HTTP proxy Digest auth
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Content-Length: 40000
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
And you should ignore this data. aaaaaaaaaaaaaaaa
And you should ignore this data. aaaaaaaaaaaaaaaa
@@ -845,7 +845,7 @@ Server: no
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Content-Length: 40000
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
HTTP/1.1 200 OK swsbounce
Server: no
@@ -881,21 +881,21 @@ http://test.remote.haxx.se.1060:8990/path/10600002 --proxy http://%HOSTIP:%HTTPP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.haxx.se.1060:8990 HTTP/1.1
Host: test.remote.haxx.se.1060:8990
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.haxx.se.1060:8990 HTTP/1.1
Host: test.remote.haxx.se.1060:8990
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.haxx.se.1060:8990", response="e1fbed39c26f4efe284adc0e576ff638"
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10600002 HTTP/1.1
Host: test.remote.haxx.se.1060:8990
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1061 b/tests/data/test1061
index 6ddddfee2..1c1c3b1de 100644
--- a/tests/data/test1061
+++ b/tests/data/test1061
@@ -19,7 +19,7 @@ HTTP proxy Digest auth
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Transfer-Encoding: chunked
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
9c40
And you should ignore this data. aaaaaaaaaaaaaaaa
@@ -850,7 +850,7 @@ Server: no
HTTP/1.1 407 Authorization Required to proxy me my dear
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"
Transfer-Encoding: chunked
-X-tra-long-header: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X-tra-long-header: %repeat[16080 x a]%
HTTP/1.1 200 OK swsbounce
Server: no
@@ -886,21 +886,21 @@ http://test.remote.haxx.se.1061:8990/path/10610002 --proxy http://%HOSTIP:%HTTPP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.haxx.se.1061:8990 HTTP/1.1
Host: test.remote.haxx.se.1061:8990
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.haxx.se.1061:8990 HTTP/1.1
Host: test.remote.haxx.se.1061:8990
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.haxx.se.1061:8990", response="4e23449fa93224834299e7282a70472c"
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/10610002 HTTP/1.1
Host: test.remote.haxx.se.1061:8990
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1064 b/tests/data/test1064
index dd05ddf3a..3d2f4d2cb 100644
--- a/tests/data/test1064
+++ b/tests/data/test1064
@@ -44,18 +44,17 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1064.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 5
test
PUT /10640002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 5
diff --git a/tests/data/test1065 b/tests/data/test1065
index 5688ff964..1d27ffb4b 100644
--- a/tests/data/test1065
+++ b/tests/data/test1065
@@ -45,18 +45,17 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1065.upload1 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 5
test
GET /10650002.url2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1066 b/tests/data/test1066
index bacedefbb..8175af172 100644
--- a/tests/data/test1066
+++ b/tests/data/test1066
@@ -41,16 +41,15 @@ http://%HOSTIP:%HTTPPORT/want/1066 http://%HOSTIP:%HTTPPORT/want/10660001 --dump
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1066 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/10660001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1067 b/tests/data/test1067
index 9fc7a6fa4..4706a0a58 100644
--- a/tests/data/test1067
+++ b/tests/data/test1067
@@ -59,17 +59,16 @@ http://%HOSTIP:%HTTPPORT/want/1067 -L --referer "firstone.html;auto"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1067 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Referer: firstone.html
GET /want/data/10670002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Referer: http://%HOSTIP:%HTTPPORT/want/1067
diff --git a/tests/data/test1068 b/tests/data/test1068
index f9bfec90f..15a702d11 100644
--- a/tests/data/test1068
+++ b/tests/data/test1068
@@ -38,12 +38,10 @@ more than one byte
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /bzz/1068 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test1070 b/tests/data/test1070
index d202a9c07..6056e5d93 100644
--- a/tests/data/test1070
+++ b/tests/data/test1070
@@ -32,7 +32,7 @@ http
HTTP POST with server closing connection before (all) data is received
</name>
<command>
- -d @log/input1070 http://%HOSTIP:%HTTPPORT/1070
+ -d @log/input1070 http://%HOSTIP:%HTTPPORT/1070 -H "Expect: 100-continue"
</command>
<file name="log/input1070">
This creates the named file with this content before the test case is run,
@@ -48,16 +48,14 @@ OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /1070 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
+Expect: 100-continue
Content-Length: 2313
Content-Type: application/x-www-form-urlencoded
-Expect: 100-continue
This creates
</protocol>
diff --git a/tests/data/test1071 b/tests/data/test1071
index 4352e6111..d89b74bd0 100644
--- a/tests/data/test1071
+++ b/tests/data/test1071
@@ -85,12 +85,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1071 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -102,6 +100,7 @@ four is the number of lines
PUT /1071 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1071", response="df4cef6b52a30e65d472dd848d2055a1"
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
diff --git a/tests/data/test1072 b/tests/data/test1072
index 14b6d804c..128f0944c 100644
--- a/tests/data/test1072
+++ b/tests/data/test1072
@@ -55,12 +55,10 @@ which is impossible in HTTP/1.0
<errorcode>
25
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1072 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test1073 b/tests/data/test1073
index 481f9098f..80f5ec0dc 100644
--- a/tests/data/test1073
+++ b/tests/data/test1073
@@ -49,12 +49,10 @@ which is impossible in HTTP/1.0
<errorcode>
25
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1073 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test1074 b/tests/data/test1074
index 3464b4183..840d46195 100644
--- a/tests/data/test1074
+++ b/tests/data/test1074
@@ -59,16 +59,15 @@ Connection: close
surprise2
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1074 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /wantmore/10740001 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1075 b/tests/data/test1075
index 4b30c593a..f0f255ab6 100644
--- a/tests/data/test1075
+++ b/tests/data/test1075
@@ -64,12 +64,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1075 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -81,6 +79,7 @@ four is the number of lines
PUT /1075 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1076 b/tests/data/test1076
index ad079eb94..8322be23a 100644
--- a/tests/data/test1076
+++ b/tests/data/test1076
@@ -56,19 +56,17 @@ http://%HOSTIP:%HTTPPORT/blah/1076 -L -d "moo" --post302
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1076 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /blah/moo.html&testcase=/10760002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1077 b/tests/data/test1077
index e917e8a56..8b1d288de 100644
--- a/tests/data/test1077
+++ b/tests/data/test1077
@@ -57,17 +57,16 @@ FTP over HTTP proxy with downgrade to HTTP 1.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/1077 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/10770002 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1078 b/tests/data/test1078
index d705dbca4..65c77ed7c 100644
--- a/tests/data/test1078
+++ b/tests/data/test1078
@@ -53,22 +53,22 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT %HOSTIP.1078:%HTTPPORT HTTP/1.0
Host: %HOSTIP.1078:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1078 HTTP/1.1
Host: %HOSTIP.1078:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/that/page/1078 HTTP/1.0
Host: %HOSTIP.1078:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1079 b/tests/data/test1079
index ac7b899fb..460439d53 100644
--- a/tests/data/test1079
+++ b/tests/data/test1079
@@ -58,17 +58,16 @@ http://%HOSTIP:%HTTPPORT/1079 -u testuser:testpass --digest
<errorcode>
52
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1079 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1079 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1079", response="e340c7cdca0950462070f46ee139e9f7"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1080 b/tests/data/test1080
index e0f7d62ae..9fa48576d 100644
--- a/tests/data/test1080
+++ b/tests/data/test1080
@@ -36,16 +36,15 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1080 http://%HOSTIP:%HTTPPORT/we/want/our/1
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1080 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/our/1080 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1081 b/tests/data/test1081
index d9f895fd2..2a5a765e6 100644
--- a/tests/data/test1081
+++ b/tests/data/test1081
@@ -44,16 +44,15 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1081 http://%HOSTIP:%HTTPPORT/we/want/our/1
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1081 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/our/10810002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1082 b/tests/data/test1082
index 8e4078b2d..0df70afae 100644
--- a/tests/data/test1082
+++ b/tests/data/test1082
@@ -42,12 +42,10 @@ perl -e "print 'Test requires default test client host address' if ( '%CLIENTIP'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1082 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1083 b/tests/data/test1083
index 1b1db0539..89beea0fc 100644
--- a/tests/data/test1083
+++ b/tests/data/test1083
@@ -46,12 +46,10 @@ perl -e "if ('%CLIENT6IP' ne '[::1]') {print 'Test requires default test client
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1083 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1084 b/tests/data/test1084
index 1cfab68dc..db6ab5e94 100644
--- a/tests/data/test1084
+++ b/tests/data/test1084
@@ -27,7 +27,7 @@ none
HTTP GET with invalid --interface
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1084 --interface non-existing-host.haxx.se.
+http://%HOSTIP:%NOLISTENPORT/1084 --interface non-existing-host.haxx.se.
</command>
</client>
diff --git a/tests/data/test1085 b/tests/data/test1085
index db02e6033..ac1f0629c 100644
--- a/tests/data/test1085
+++ b/tests/data/test1085
@@ -29,7 +29,7 @@ none
HTTP-IPv6 GET with invalid --interface
</name>
<command>
--g "http://%HOST6IP:%HTTP6PORT/1085" --interface non-existing-host.haxx.se.
+-g "http://%HOST6IP:%NOLISTENPORT/1085" --interface non-existing-host.haxx.se.
</command>
# Ensure the IPv6 stack is operational before running this test (other tests
# use the startup of the IPv6 test server as a substitute check for this).
diff --git a/tests/data/test1087 b/tests/data/test1087
index 883d98642..f67429403 100644
--- a/tests/data/test1087
+++ b/tests/data/test1087
@@ -88,23 +88,23 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/10871000 HTTP/1.1
Host: first.host.it.is
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://first.host.it.is/we/want/that/page/10871000 HTTP/1.1
Host: first.host.it.is
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://goto.second.host.now/10871002 HTTP/1.1
Host: goto.second.host.now
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1088 b/tests/data/test1088
index f2b6fc263..649cb88ec 100644
--- a/tests/data/test1088
+++ b/tests/data/test1088
@@ -89,24 +89,24 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/10881000 HTTP/1.1
Host: first.host.it.is
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://first.host.it.is/we/want/that/page/10881000 HTTP/1.1
Host: first.host.it.is
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://goto.second.host.now/10881002 HTTP/1.1
Host: goto.second.host.now
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1089 b/tests/data/test1089
index d2a18a21d..d4b879136 100644
--- a/tests/data/test1089
+++ b/tests/data/test1089
@@ -50,16 +50,15 @@ http://%HOSTIP:%HTTPPORT/1089 -w "%{num_connects}\n%{num_redirects}\n%{size_down
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1089 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /10890001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1090 b/tests/data/test1090
index 3304f911d..9ae803fb7 100644
--- a/tests/data/test1090
+++ b/tests/data/test1090
@@ -57,16 +57,15 @@ http://%HOSTIP:%HTTPPORT/1090 -w "%{num_connects}\n%{num_redirects}\n%{size_down
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1090 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /10900001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1092 b/tests/data/test1092
index 725a274ba..d3ea90244 100644
--- a/tests/data/test1092
+++ b/tests/data/test1092
@@ -43,12 +43,10 @@ FTP with type=i over HTTP proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/1092;type=i HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1095 b/tests/data/test1095
index 6bfe54f33..3e562b037 100644
--- a/tests/data/test1095
+++ b/tests/data/test1095
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/1095 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1095 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1095 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="test \"this\" realm!!", nonce="1053604145", uri="/1095", response="a1c7931ece9e8617bae2715045e4f49f"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1096 b/tests/data/test1096
index 30748c1b4..a6c32c3a1 100644
--- a/tests/data/test1096
+++ b/tests/data/test1096
@@ -11,6 +11,7 @@ FAILURE
<reply>
<servercmd>
REPLY RETR 550 no such file!
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test1097 b/tests/data/test1097
index 7eb7b5f3d..218d57bbe 100644
--- a/tests/data/test1097
+++ b/tests/data/test1097
@@ -45,7 +45,9 @@ https
</server>
<features>
NTLM
+SSL
!SSPI
+proxy
</features>
<name>
HTTP POST using CONNECT with --proxy-ntlm but no auth is required
@@ -57,19 +59,16 @@ http://test.a.galaxy.far.far.away.1097:%HTTPPORT/1097 --proxy http://%HOSTIP:%HT
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
CONNECT test.a.galaxy.far.far.away.1097:%HTTPPORT HTTP/1.1
Host: test.a.galaxy.far.far.away.1097:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.12 libssh2/1.0.1_CVS
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
POST /1097 HTTP/1.1
-User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.12 libssh2/1.0.1_CVS
Host: test.a.galaxy.far.far.away.1097:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1098 b/tests/data/test1098
index 0d397340c..a8d25cbe2 100644
--- a/tests/data/test1098
+++ b/tests/data/test1098
@@ -43,17 +43,16 @@ ftp://ftp-site/moo/1098 ftp://ftp-site/moo/1098 --proxy http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://ftp-site/moo/1098 HTTP/1.1
Host: ftp-site:21
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET ftp://ftp-site/moo/1098 HTTP/1.1
Host: ftp-site:21
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test11 b/tests/data/test11
index 9d93f80e0..3eed8a17f 100644
--- a/tests/data/test11
+++ b/tests/data/test11
@@ -59,16 +59,15 @@ http://%HOSTIP:%HTTPPORT/want/11 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/11 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/110002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1100 b/tests/data/test1100
index d60a93a77..5bb807200 100644
--- a/tests/data/test1100
+++ b/tests/data/test1100
@@ -63,6 +63,7 @@ This is the final page !
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -88,14 +89,10 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
POST /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -103,14 +100,14 @@ Content-Type: application/x-www-form-urlencoded
POST /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 18
Content-Type: application/x-www-form-urlencoded
stuff to send awayGET /1100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.19.5-CVS (i686-pc-linux-gnu) libcurl/7.19.5-CVS GnuTLS/2.6.6 zlib/1.2.3.3 c-ares/1.6.1-CVS libidn/1.14 libssh2/1.1
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1101 b/tests/data/test1101
index 75c66195e..eaf16bd68 100644
--- a/tests/data/test1101
+++ b/tests/data/test1101
@@ -40,13 +40,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/gimme/1101
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /gimme/1101 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1104 b/tests/data/test1104
index e66da58ad..2c5b9fcf7 100644
--- a/tests/data/test1104
+++ b/tests/data/test1104
@@ -68,17 +68,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/1104 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/want/data/11040002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: test2=true
diff --git a/tests/data/test1105 b/tests/data/test1105
index 782044583..8142ad266 100644
--- a/tests/data/test1105
+++ b/tests/data/test1105
@@ -41,12 +41,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /we/want/1105?parm1=this*that/other/thing&parm2=foobar/1105 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1106 b/tests/data/test1106
index 37a77e36e..e23c33c04 100644
--- a/tests/data/test1106
+++ b/tests/data/test1106
@@ -44,12 +44,10 @@ ftp://%HOSTIP:23456/1106
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:23456/1106 HTTP/1.1
Host: %HOSTIP:23456
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1109 b/tests/data/test1109
index b68b5a22f..e504ce9da 100644
--- a/tests/data/test1109
+++ b/tests/data/test1109
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1109#test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1109 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1110 b/tests/data/test1110
index 94cfe9105..50bd4d20c 100644
--- a/tests/data/test1110
+++ b/tests/data/test1110
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1110?q=foobar#fragment
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1110?q=foobar HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1111 b/tests/data/test1111
index d9db12c7f..1ba21bffd 100644
--- a/tests/data/test1111
+++ b/tests/data/test1111
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1111?q=foobar#fragment#fragment2
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1111?q=foobar HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1115 b/tests/data/test1115
index f9d6e3645..0b1f034ee 100644
--- a/tests/data/test1115
+++ b/tests/data/test1115
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1115
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1115 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1116 b/tests/data/test1116
index b72cbd60e..ce5305d79 100644
--- a/tests/data/test1116
+++ b/tests/data/test1116
@@ -56,12 +56,10 @@ http://%HOSTIP:%HTTPPORT/1116 -D log/heads1116
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1116 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1117 b/tests/data/test1117
index 963f1efec..79c9fd4bb 100644
--- a/tests/data/test1117
+++ b/tests/data/test1117
@@ -68,18 +68,17 @@ Content-Type: text/plain
partial body
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1117 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=10-22
+User-Agent: curl/%VERSION
Accept: */*
GET /wantmore/11170001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=10-22
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1118 b/tests/data/test1118
index bc776aff6..702b2dfe8 100644
--- a/tests/data/test1118
+++ b/tests/data/test1118
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT?email=name@example.com/1118
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?email=name@example.com/1118 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1119 b/tests/data/test1119
index 017f598f3..2f1b54c23 100644
--- a/tests/data/test1119
+++ b/tests/data/test1119
@@ -22,4 +22,9 @@ Verify that symbols-in-versions and headers are in sync
</command>
</client>
+<verify>
+<stdout>
+OK
+</stdout>
+</verify>
</testcase>
diff --git a/tests/data/test1121 b/tests/data/test1121
index 405066ff6..839c55364 100644
--- a/tests/data/test1121
+++ b/tests/data/test1121
@@ -34,12 +34,10 @@ HTTP multiple provided Host: headers
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1121 HTTP/1.1
Host: host1
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1122 b/tests/data/test1122
index 78d50d77b..d5b51a2cf 100644
--- a/tests/data/test1122
+++ b/tests/data/test1122
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1122 --tr-encoding
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1122 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1123 b/tests/data/test1123
index bd441a995..841a326ad 100644
--- a/tests/data/test1123
+++ b/tests/data/test1123
@@ -186,12 +186,10 @@ http://%HOSTIP:%HTTPPORT/1123 --tr-encoding
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1123 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1124 b/tests/data/test1124
index 58f63f930..61c5cfb6c 100644
--- a/tests/data/test1124
+++ b/tests/data/test1124
@@ -54,12 +54,10 @@ http://%HOSTIP:%HTTPPORT/1124 --tr-encoding
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1124 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1125 b/tests/data/test1125
index 1883734d9..51e3db783 100644
--- a/tests/data/test1125
+++ b/tests/data/test1125
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1125 --tr-encoding -H "Connection: close"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1125 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: close, TE
TE: gzip
diff --git a/tests/data/test1126 b/tests/data/test1126
index 52f4db411..4f99072c0 100644
--- a/tests/data/test1126
+++ b/tests/data/test1126
@@ -38,12 +38,10 @@ http://%HOSTIP:%HTTPPORT/1126 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1126 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1127 b/tests/data/test1127
index 3cc42c26a..e1453a601 100644
--- a/tests/data/test1127
+++ b/tests/data/test1127
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1127 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1127 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1128 b/tests/data/test1128
index a20487b43..a18f487ec 100644
--- a/tests/data/test1128
+++ b/tests/data/test1128
@@ -48,17 +48,16 @@ http://%HOSTIP:%HTTPPORT/1128 http://%HOSTIP:%HTTPPORT/11280001 -z "dec 12 12:00
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1128 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
GET /11280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1129 b/tests/data/test1129
index f47141cd3..cadf80647 100644
--- a/tests/data/test1129
+++ b/tests/data/test1129
@@ -33,16 +33,16 @@ Content-Type: text/html
# we use skip to make the test server never read the full payload off
# the socket and instead return the response at once
<servercmd>
-skip: 1025
+skip: 1053700
</servercmd>
</reply>
#
# Client-side
<client>
-# 1025 x 'x'
+# 1053700 x 'x'
<file name="log/file1129">
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+%repeat[1053700 x x]%
</file>
<server>
http
@@ -74,21 +74,20 @@ Content-Type: text/html
-foo-
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1129 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
-Content-Length: 1025
+Content-Length: 1053700
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
POST /11290001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
-Content-Length: 1025
+Content-Length: 1053700
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
diff --git a/tests/data/test1130 b/tests/data/test1130
index eb1e59f5b..01836cd71 100644
--- a/tests/data/test1130
+++ b/tests/data/test1130
@@ -74,12 +74,10 @@ Content-Type: text/html
-foo-
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1130 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Expect: 100-continue
Content-Length: 100
@@ -87,6 +85,7 @@ Content-Type: application/x-www-form-urlencoded
POST /11300001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Expect: 100-continue
Content-Length: 100
diff --git a/tests/data/test1131 b/tests/data/test1131
index 96843af54..64df118f7 100644
--- a/tests/data/test1131
+++ b/tests/data/test1131
@@ -74,18 +74,17 @@ Content-Type: text/html
FAILURE2
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1131 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 100
Expect: 100-continue
PUT /11310001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 100
Expect: 100-continue
diff --git a/tests/data/test1133 b/tests/data/test1133
index 737f9d9e2..555bafcdd 100644
--- a/tests/data/test1133
+++ b/tests/data/test1133
@@ -40,15 +40,14 @@ foo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
+^(Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
</strip>
<protocol>
POST /we/want/1133 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1264
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
------------------------------24e78000bd32
diff --git a/tests/data/test1134 b/tests/data/test1134
index e290b5369..52aafcce1 100644
--- a/tests/data/test1134
+++ b/tests/data/test1134
@@ -45,18 +45,17 @@ http://%HOSTIP:%HTTPPORT/1134 -u user1:password1 --next http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1134 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjE6cGFzc3dvcmQx
+User-Agent: curl/%VERSION
Accept: */*
GET /11340001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic MnVzZXI6cGFzc3dvcmQy
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1135 b/tests/data/test1135
index eca6860fb..37a55427f 100644
--- a/tests/data/test1135
+++ b/tests/data/test1135
@@ -92,6 +92,7 @@ CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
+CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
diff --git a/tests/data/test1138 b/tests/data/test1138
index 0c91d204d..a69d40fd2 100644
--- a/tests/data/test1138
+++ b/tests/data/test1138
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/1138 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/1138 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/moo.html/?name=%d8%a2%d8%ba%d8%a7%d8%b2-%d8%b3%d9%85-%d8%b2%d8%af%d8%a7%db%8c%db%8c-%d8%a7%d8%b2-%d8%a8%d8%a7%d8%b2%d8%a7%d8%b1-%d9%be%d9%88%d9%84&testcase=/11380002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1139 b/tests/data/test1139
index 72761c670..b5267b012 100644
--- a/tests/data/test1139
+++ b/tests/data/test1139
@@ -15,13 +15,19 @@ documentation
none
</server>
- <name>
+<name>
Verify that all libcurl options have man pages
- </name>
+</name>
<command type="perl">
%SRCDIR/manpage-scan.pl %SRCDIR/.. %PWD/..
</command>
</client>
+<verify>
+<stderr>
+0
+</stderr>
+</verify>
+
</testcase>
diff --git a/tests/data/test1140 b/tests/data/test1140
index b9458be9f..f083eec39 100644
--- a/tests/data/test1140
+++ b/tests/data/test1140
@@ -23,4 +23,10 @@ Verify the nroff of man pages
</command>
</client>
+<verify>
+<stdout>
+OK
+</stdout>
+</verify>
+
</testcase>
diff --git a/tests/data/test1141 b/tests/data/test1141
index b0cff8e37..063d3b284 100644
--- a/tests/data/test1141
+++ b/tests/data/test1141
@@ -54,17 +54,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/1141 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://foo.example.com/want/11410001 HTTP/1.1
Host: foo.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1142 b/tests/data/test1142
index 5f1e2b35a..3577ac468 100644
--- a/tests/data/test1142
+++ b/tests/data/test1142
@@ -49,12 +49,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/1142 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1143 b/tests/data/test1143
index 7776cfa87..8239c444f 100644
--- a/tests/data/test1143
+++ b/tests/data/test1143
@@ -37,12 +37,10 @@ MSYS2_ARG_CONV_EXCL=http:/
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1143 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1144 b/tests/data/test1144
index 84c22dba2..588355569 100644
--- a/tests/data/test1144
+++ b/tests/data/test1144
@@ -54,12 +54,10 @@ HTTP HEAD, receive no headers only body
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /1144 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1148 b/tests/data/test1148
index ba498698a..a4839e27c 100644
--- a/tests/data/test1148
+++ b/tests/data/test1148
@@ -37,9 +37,6 @@ progress-bar
<command>
http://%HOSTIP:%HTTPPORT/1148 -# --stderr log/stderrlog1148
</command>
-<precheck>
-perl -e '$ENV{"LC_NUMERIC"} = "en_US.UTF-8"; print "Test requires point as decimal separator" if system("./libtest/chkdecimalpoint");'
-</precheck>
<setenv>
LC_ALL=
LC_NUMERIC=en_US.UTF-8
@@ -48,22 +45,23 @@ LC_NUMERIC=en_US.UTF-8
#
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1148 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-# This allows the last 4 letters of the bar to get updated without it
-# matters. We're mostly checking the width of it anyway.
+
+# Check that the progress finished at 100% and has the right bar width.
+# Note the dot in 100.0% is regex to match any character since different
+# locales use different separators.
<file name="log/stderrlog1148" mode="text">
- bar 100.0%
+correct
</file>
<stripfile>
-s/####################################################################..../bar/
+s/.*\r#{72} 100.0%/correct/
</stripfile>
+
</verify>
</testcase>
diff --git a/tests/data/test1150 b/tests/data/test1150
index e86c7e154..f951f570e 100644
--- a/tests/data/test1150
+++ b/tests/data/test1150
@@ -39,17 +39,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://test.remote.example.com.1150:150/path HTTP/1.1
Host: test.remote.example.com.1150:150
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.example.com.1150:1234/path/ HTTP/1.1
Host: test.remote.example.com.1150:1234
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1151 b/tests/data/test1151
index d793944c3..e3abcbe99 100644
--- a/tests/data/test1151
+++ b/tests/data/test1151
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/1151 -c log/cookies1151.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1151 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1154 b/tests/data/test1154
index cb056d1a8..8213528c9 100644
--- a/tests/data/test1154
+++ b/tests/data/test1154
@@ -15,7 +15,7 @@ Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Content-Length: 6
Connection: close
-Long: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Long: %repeat[102400 x A]%
-foo-
</data>
@@ -30,7 +30,7 @@ Long: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
http
</server>
<name>
-HTTP GET
+HTTP GET with 100K (too long) response header
</name>
<command>
http://%HOSTIP:%HTTPPORT/1154
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1154
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1154 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1155 b/tests/data/test1155
index 3db824d58..90d33bd71 100644
--- a/tests/data/test1155
+++ b/tests/data/test1155
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1155 -c log/cookies1155.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1157 b/tests/data/test1157
index b0bbf244f..baf12edb4 100644
--- a/tests/data/test1157
+++ b/tests/data/test1157
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1157 -H @log/heads1157.txt
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1157 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1158 b/tests/data/test1158
index 62adc579d..f2b40e01b 100644
--- a/tests/data/test1158
+++ b/tests/data/test1158
@@ -43,12 +43,12 @@ foo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
+^(Content-Type: multipart/form-data;|Content-Type: multipart/mixed; boundary=|-------).*
</strip>
<protocol>
POST /we/want/1158 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 954
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
diff --git a/tests/data/test1159 b/tests/data/test1159
index a51601659..ea07f238f 100644
--- a/tests/data/test1159
+++ b/tests/data/test1159
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1159 -w '%{redirect_url}\n'
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1159 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1160 b/tests/data/test1160
index 63dd0a7a0..cc864b3d1 100644
--- a/tests/data/test1160
+++ b/tests/data/test1160
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/1160 -c log/cookies1160.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1160 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1161 b/tests/data/test1161
index ee6f1d04a..f7b610e3e 100644
--- a/tests/data/test1161
+++ b/tests/data/test1161
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/1161 -c log/cookies1161.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1161 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1164 b/tests/data/test1164
index a5ce6d11a..f62b0f66e 100644
--- a/tests/data/test1164
+++ b/tests/data/test1164
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/1164 -w '%{size_download}\n' --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1164 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1166 b/tests/data/test1166
index 3cae80ecd..292d09fc3 100644
--- a/tests/data/test1166
+++ b/tests/data/test1166
@@ -36,16 +36,15 @@ http://%HOSTIP:%HTTPPORT/want/1166 http://%HOSTIP:%HTTPPORT/want/1166
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/1166 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/1166 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1167 b/tests/data/test1167
new file mode 100644
index 000000000..9eebe1c4e
--- /dev/null
+++ b/tests/data/test1167
@@ -0,0 +1,24 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Verify curl prefix of public symbols in header files
+ </name>
+
+<command type="perl">
+%SRCDIR/badsymbols.pl %SRCDIR/..
+</command>
+</client>
+
+</testcase>
diff --git a/tests/data/test1168 b/tests/data/test1168
new file mode 100644
index 000000000..b2f08fb61
--- /dev/null
+++ b/tests/data/test1168
@@ -0,0 +1,77 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.1 301 This is a weirdo text message swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Location: /data/11680002.txt
+Connection: close
+
+This server reply is for testing a simple Location: following
+
+</data>
+<data2>
+HTTP/1.1 200 Followed here fine swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 52
+
+If this is received, the location following worked
+
+</data2>
+<datacheck>
+HTTP/1.1 301 This is a weirdo text message swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Location: /data/11680002.txt
+Connection: close
+
+HTTP/1.1 200 Followed here fine swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 52
+
+If this is received, the location following worked
+
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP redirect with credentials using # in user and password
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/want/1168 -L -u "catmai#d:#DZaRJYrixKE*gFY"
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /want/1168 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic Y2F0bWFpI2Q6I0RaYVJKWXJpeEtFKmdGWQ==
+User-Agent: curl/%VERSION
+Accept: */*
+
+GET /data/11680002.txt HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic Y2F0bWFpI2Q6I0RaYVJKWXJpeEtFKmdGWQ==
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1170 b/tests/data/test1170
index a4d9eb84b..39ff3c8c9 100644
--- a/tests/data/test1170
+++ b/tests/data/test1170
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1170 --tr-encoding -H "Connection:"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1170 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1171 b/tests/data/test1171
index 0f7ee90d3..bc98d312e 100644
--- a/tests/data/test1171
+++ b/tests/data/test1171
@@ -55,12 +55,10 @@ http://%HOSTIP:%HTTPPORT/1171 --tr-encoding -H "Connection;"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1171 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: TE
TE: gzip
diff --git a/tests/data/test1172 b/tests/data/test1172
index 6e61720bd..a099057f2 100644
--- a/tests/data/test1172
+++ b/tests/data/test1172
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1172 --no-http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1172 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1174 b/tests/data/test1174
index b316fde8c..7768696ff 100644
--- a/tests/data/test1174
+++ b/tests/data/test1174
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1174
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1174 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1175 b/tests/data/test1175
new file mode 100644
index 000000000..61f068915
--- /dev/null
+++ b/tests/data/test1175
@@ -0,0 +1,25 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+symbols-in-versions
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Verify that symbols-in-versions and libcurl-errors.3 are in sync
+ </name>
+
+<command type="perl">
+%SRCDIR/error-codes.pl %SRCDIR
+</command>
+</client>
+
+</testcase>
diff --git a/tests/data/test1176 b/tests/data/test1176
new file mode 100644
index 000000000..ce992e341
--- /dev/null
+++ b/tests/data/test1176
@@ -0,0 +1,66 @@
+<testcase>
+<info>
+<keywords>
+globbing
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET
+ </name>
+ <command option="no-output">
+http://%HOSTIP:%HTTPPORT/1176 -o 'log/base-#0'
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1176 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/base-#0">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1177 b/tests/data/test1177
new file mode 100644
index 000000000..85b520ce0
--- /dev/null
+++ b/tests/data/test1177
@@ -0,0 +1,25 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+CURL_VERSION
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Verify that CURL_VERSION_* in headers and docs are in sync
+ </name>
+
+<command type="perl">
+%SRCDIR/version-scan.pl %SRCDIR/../docs/libcurl/curl_version_info.3 %SRCDIR/../include/curl/curl.h
+</command>
+</client>
+
+</testcase>
diff --git a/tests/data/test1178 b/tests/data/test1178
new file mode 100644
index 000000000..91ef78c8f
--- /dev/null
+++ b/tests/data/test1178
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP proxy
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP proxy auth with credentials longer than 256 bytes
+ </name>
+# 400 x 'A' : 600 x 'B' ...
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/that/page/1178 -x http://%HOSTIP:%HTTPPORT -U AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET http://%HOSTIP:%HTTPPORT/we/want/that/page/1178 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Proxy-Authorization: Basic QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI=
+User-Agent: curl/%VERSION
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1179 b/tests/data/test1179
new file mode 100644
index 000000000..206ee7cae
--- /dev/null
+++ b/tests/data/test1179
@@ -0,0 +1,43 @@
+<testcase>
+<info>
+<keywords>
+cmdline
+wrong option
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+# make this test require manual as the error message is different without it
+<features>
+manual
+</features>
+<name>
+error when using unknown command line option
+</name>
+<command>
+--never-implemented http://never.use.this.example.com/1179
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+2
+</errorcode>
+<stderr mode="text">
+curl: option --never-implemented: is unknown
+curl: try 'curl --help' or 'curl --manual' for more information
+</stderr>
+</verify>
+</testcase>
diff --git a/tests/data/test118 b/tests/data/test118
index 6cd086ca2..94985e319 100644
--- a/tests/data/test118
+++ b/tests/data/test118
@@ -12,6 +12,7 @@ FAILURE
<servercmd>
REPLY RETR 314 bluah you f00l!
REPLY EPSV 314 bluah you f00l!
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test119 b/tests/data/test119
index 00a24287b..95d1021ca 100644
--- a/tests/data/test119
+++ b/tests/data/test119
@@ -11,6 +11,7 @@ FAILURE
<reply>
<servercmd>
REPLY RETR 314 bluah you f00l!
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test1190 b/tests/data/test1190
new file mode 100644
index 000000000..007a15013
--- /dev/null
+++ b/tests/data/test1190
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT SUBSCRIBE
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+hello
+</data>
+<datacheck hex="yes">
+00 04 31 31 39 30 68 65 6c 6c 6f 5b 4c 46 5d 0a
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT SUBSCRIBE
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/1190
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020000
+client SUBSCRIBE 9 000100043131393000
+server SUBACK 3 9003000100
+server PUBLISH c 300c00043131393068656c6c6f0a
+server DISCONNECT 0 e000
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1191 b/tests/data/test1191
new file mode 100644
index 000000000..a36bc3113
--- /dev/null
+++ b/tests/data/test1191
@@ -0,0 +1,50 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT PUBLISH
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT PUBLISH
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/1191 -d something
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020000
+client PUBLISH f 000431313931736f6d657468696e67
+client DISCONNECT 0 e000
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1192 b/tests/data/test1192
new file mode 100644
index 000000000..691c7783f
--- /dev/null
+++ b/tests/data/test1192
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT SUBSCRIBE
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+hello
+</data>
+<datacheck hex="yes">
+00 04 31 31 39 30 68 65 6c 6c 6f 5b 4c 46 5d 0a
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT SUBSCRIBE 2k topic
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/1192
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020000
+client SUBSCRIBE 80a 0001080541414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141412f3131393200
+server SUBACK 3 9003000100
+server PUBLISH 80d 308d10080541414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141412f3131393268656c6c6f0a
+server DISCONNECT 0 e000
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1193 b/tests/data/test1193
new file mode 100644
index 000000000..8da9abb21
--- /dev/null
+++ b/tests/data/test1193
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT PUBLISH
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT PUBLISH 2k payload
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/1193 -d @log/payload1193
+</command>
+<file name="log/payload1193">
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020000
+client PUBLISH 7c2 000431313933313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839
+client DISCONNECT 0 e000
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1194 b/tests/data/test1194
new file mode 100644
index 000000000..497891add
--- /dev/null
+++ b/tests/data/test1194
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT SUBSCRIBE
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+hello
+</data>
+<datacheck hex="yes">
+00 04 31 31 39 30 68 65 6c 6c 6f 5b 4c 46 5d 0a
+</datacheck>
+<servercmd>
+PUBLISH-before-SUBACK TRUE
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT SUBSCRIBE with PUBLISH befoire SUBACK
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/1194
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020000
+client SUBSCRIBE 9 000100043131393400
+server PUBLISH c 300c00043131393468656c6c6f0a
+server SUBACK 3 9003000100
+server DISCONNECT 0 e000
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1195 b/tests/data/test1195
new file mode 100644
index 000000000..0dfaccd53
--- /dev/null
+++ b/tests/data/test1195
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT SUBSCRIBE
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+hello
+</data>
+<datacheck hex="yes">
+00 04 31 31 39 30 68 65 6c 6c 6f 5b 4c 46 5d 0a
+</datacheck>
+<servercmd>
+PUBLISH-before-SUBACK TRUE
+short-PUBLISH TRUE
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT SUBSCRIBE with short PUBLISH
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/1195
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020000
+client SUBSCRIBE 9 000100043131393500
+server PUBLISH c 300c00043131393568656c6c
+</protocol>
+
+# 18 is CURLE_PARTIAL_FILE
+<errorcode>
+18
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1196 b/tests/data/test1196
new file mode 100644
index 000000000..c07efd927
--- /dev/null
+++ b/tests/data/test1196
@@ -0,0 +1,62 @@
+<testcase>
+<info>
+<keywords>
+MQTT
+MQTT SUBSCRIBE
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+hello
+</data>
+<datacheck hex="yes">
+00 04 31 31 39 30 68 65 6c 6c 6f 5b 4c 46 5d 0a
+</datacheck>
+
+# error 1 - "Connection Refused, unacceptable protocol version"
+<servercmd>
+error-CONNACK 1
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+mqtt
+</features>
+<server>
+mqtt
+</server>
+<name>
+MQTT with error in CONNACK
+</name>
+<command option="binary-trace">
+mqtt://%HOSTIP:%MQTTPORT/1196
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# These are hexadecimal protocol dumps from the client
+#
+# Strip out the random part of the client id from the CONNECT message
+# before comparison
+<strippart>
+s/^(.* 00044d5154540402003c000c6375726c).*/$1/
+</strippart>
+<protocol>
+client CONNECT 18 00044d5154540402003c000c6375726c
+server CONNACK 2 20020001
+</protocol>
+
+# 8 is CURLE_WEIRD_SERVER_REPLY
+<errorcode>
+8
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1197 b/tests/data/test1197
new file mode 100644
index 000000000..1abd9aeb5
--- /dev/null
+++ b/tests/data/test1197
@@ -0,0 +1,87 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+--write-out
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 OK swsbounce swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 8
+Connection: close
+Content-Type: text/plain
+Location: ./11970001
+
+monster
+</data>
+<data1 nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 15
+Connection: close
+Content-Type: text/plain; charset=us-ascii
+
+bigger monster
+</data1>
+
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP POST redirected to GET and --write-out method
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1197 -w "%{method}\n" -L -d "twinkle twinkle little star"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+POST /1197 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 27
+Content-Type: application/x-www-form-urlencoded
+
+twinkle twinkle little starGET /11970001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+
+<stdout>
+HTTP/1.1 302 OK swsbounce swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 8
+Connection: close
+Content-Type: text/plain
+Location: ./11970001
+
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 15
+Connection: close
+Content-Type: text/plain; charset=us-ascii
+
+bigger monster
+GET
+</stdout>
+
+</verify>
+</testcase>
diff --git a/tests/data/test12 b/tests/data/test12
index 06dbdf56f..8f93abbaa 100644
--- a/tests/data/test12
+++ b/tests/data/test12
@@ -42,13 +42,11 @@ http://%HOSTIP:%HTTPPORT/want/12 -r 100-200
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/12 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=100-200
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1204 b/tests/data/test1204
index d2f06b68e..50738011c 100644
--- a/tests/data/test1204
+++ b/tests/data/test1204
@@ -61,17 +61,16 @@ http://%HOSTIP:%HTTPPORT/1204 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1204 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1204 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1205 b/tests/data/test1205
index 7e4a882c7..8509d3fd5 100644
--- a/tests/data/test1205
+++ b/tests/data/test1205
@@ -37,12 +37,10 @@ http://%HOSTIP:%HTTPPORT/1205
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1205 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1210 b/tests/data/test1210
index df931988c..71053f218 100644
--- a/tests/data/test1210
+++ b/tests/data/test1210
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1210 -J -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1210 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1212 b/tests/data/test1212
index a50601f78..7c2af2e54 100644
--- a/tests/data/test1212
+++ b/tests/data/test1212
@@ -37,13 +37,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/ulion/1212 --socks5 non-existing-host.haxx.
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /ulion/1212 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1213 b/tests/data/test1213
index 46a6938cb..54a8f2d99 100644
--- a/tests/data/test1213
+++ b/tests/data/test1213
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com.1213/ HTTP/1.1
Host: we.want.that.site.com.1213
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1214 b/tests/data/test1214
index 73c799a4a..985fd383b 100644
--- a/tests/data/test1214
+++ b/tests/data/test1214
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com.1214/?moo=foo HTTP/1.1
Host: we.want.that.site.com.1214
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1215 b/tests/data/test1215
index 8edfd9b4e..7aa1c4237 100644
--- a/tests/data/test1215
+++ b/tests/data/test1215
@@ -58,6 +58,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -84,21 +85,18 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.30.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/1215 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.30.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1216 b/tests/data/test1216
index c4f977b60..622713323 100644
--- a/tests/data/test1216
+++ b/tests/data/test1216
@@ -46,18 +46,17 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.fake/c/1216 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: moo3=indeed; moo2=indeed
GET http://bexample.fake/c/1216 HTTP/1.1
Host: bexample.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1218 b/tests/data/test1218
index 37c8f4ef0..b9914d25f 100644
--- a/tests/data/test1218
+++ b/tests/data/test1218
@@ -39,23 +39,23 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.fake/c/1218 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.fake/c/1218 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: bug=fixed
GET http://bexample.fake/c/1218 HTTP/1.1
Host: bexample.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1223 b/tests/data/test1223
index 2885bc59a..f448f5c14 100644
--- a/tests/data/test1223
+++ b/tests/data/test1223
@@ -37,12 +37,10 @@ http://%HOSTIP:%HTTPPORT/1223 -w 'IP %{remote_ip} and PORT %{remote_port}\n'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1223 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1228 b/tests/data/test1228
index 50af6bc2c..529c7e55d 100644
--- a/tests/data/test1228
+++ b/tests/data/test1228
@@ -38,17 +38,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.fake/hoge/1228 HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.fake/hogege/ HTTP/1.1
Host: example.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: path1=root
diff --git a/tests/data/test1229 b/tests/data/test1229
index 225ba3cc4..0cb45358a 100644
--- a/tests/data/test1229
+++ b/tests/data/test1229
@@ -65,17 +65,16 @@ http://%5cuser%22:password@%HOSTIP:%HTTPPORT/1229 --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1229 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1229 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="\\user\"", realm="testrealm", nonce="1053604145", uri="/1229", response="f2694d426040712584c156d3de72b8d6"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1230 b/tests/data/test1230
index 860ce21a4..a439b17ed 100644
--- a/tests/data/test1230
+++ b/tests/data/test1230
@@ -62,16 +62,15 @@ http://[1234:1234:1234::4ce]:%HTTPPORT/wanted/page/1230 -p -x %HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
CONNECT [1234:1234:1234::4ce]:%HTTPPORT HTTP/1.1
Host: [1234:1234:1234::4ce]:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /wanted/page/1230 HTTP/1.1
Host: [1234:1234:1234::4ce]:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1231 b/tests/data/test1231
index 61998d1c3..7b085c523 100644
--- a/tests/data/test1231
+++ b/tests/data/test1231
@@ -44,16 +44,15 @@ http://%HOSTIP:%HTTPPORT/../../hej/but/who/../1231?stupid=me/../1231#soo/../1231
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /hej/but/1231?stupid=me/../1231 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /hej/but/12310001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1232 b/tests/data/test1232
index 7425d44d8..7a74cb12d 100644
--- a/tests/data/test1232
+++ b/tests/data/test1232
@@ -49,17 +49,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1232:8990/hej/but/1232?stupid=me/../1232 HTTP/1.1
Host: test.remote.haxx.se.1232:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.haxx.se.1232:8990/hej/but/12320001 HTTP/1.1
Host: test.remote.haxx.se.1232:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1234 b/tests/data/test1234
index 41c4bc06d..577ba51aa 100644
--- a/tests/data/test1234
+++ b/tests/data/test1234
@@ -19,7 +19,7 @@ none
abusing {}-globbing
</name>
<command>
-"%HOSTIP:%HTTPPORT/1234[0-1]{" "%HOSTIP:%HTTPPORT/{}{}{}{"
+"%HOSTIP:%NOLISTENPORT/1234[0-1]{" "%HOSTIP:%NOLISTENPORT/{}{}{}{"
</command>
</client>
diff --git a/tests/data/test1235 b/tests/data/test1235
index 9e51219ff..3fffb4209 100644
--- a/tests/data/test1235
+++ b/tests/data/test1235
@@ -40,28 +40,25 @@ multiple requests using {}{} in the URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /12350001 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /12350002 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /12350001 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /12350002 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1236 b/tests/data/test1236
index 0829be313..7408a7bae 100644
--- a/tests/data/test1236
+++ b/tests/data/test1236
@@ -19,7 +19,7 @@ none
</name>
# 2^62 == 4611686018427387904
<command>
-"%HOSTIP:%HTTPPORT/1234[0-1]{" "%HOSTIP:%HTTPPORT/[1-4611686018427387904][1-4611686018427387904]"
+"%HOSTIP:%NOLISTENPORT/1234[0-1]{" "%HOSTIP:%NOLISTENPORT/[1-4611686018427387904][1-4611686018427387904]"
</command>
</client>
diff --git a/tests/data/test1237 b/tests/data/test1237
index 21da17dcf..a016e5fb6 100644
--- a/tests/data/test1237
+++ b/tests/data/test1237
@@ -33,13 +33,11 @@ URL with 1000+ letter user name + password
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1237 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1238 b/tests/data/test1238
index a0eef417d..88c9a5b3b 100644
--- a/tests/data/test1238
+++ b/tests/data/test1238
@@ -24,6 +24,14 @@ writedelay: 2
<server>
tftp
</server>
+# Always kill the TFTP server to not affect following tests, due
+# to this test potentially keeping the TFTP server busy waiting
+# for another 5 seconds after this test has already terminated.
+# On some platforms and CI not enough time passes between this
+# test and the next tests 1242 and 1243, causing them to fail.
+<killserver>
+tftp
+</killserver>
<name>
slow TFTP retrieve cancel due to -Y and -y
</name>
diff --git a/tests/data/test1239 b/tests/data/test1239
index b3503d9c4..375d92b68 100644
--- a/tests/data/test1239
+++ b/tests/data/test1239
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1239 -z "-dec 12 12:00:00 1999 GMT" -w '%{response_code
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Unmodified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test1240 b/tests/data/test1240
index 643595058..44ce1f69b 100644
--- a/tests/data/test1240
+++ b/tests/data/test1240
@@ -31,16 +31,15 @@ glob [0-1] with stuff after range (7.33.0 regression)
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /00/1240 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /01/1240 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1241 b/tests/data/test1241
index bc6c61801..0089828f8 100644
--- a/tests/data/test1241
+++ b/tests/data/test1241
@@ -48,17 +48,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1241:8990/../../hej/but/who/../1241?stupid=me/../1241 HTTP/1.1
Host: test.remote.haxx.se.1241:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.haxx.se.1241:8990/../../hej/but/who/../12410001 HTTP/1.1
Host: test.remote.haxx.se.1241:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1244 b/tests/data/test1244
index d0769ad85..c2ac4a4d1 100644
--- a/tests/data/test1244
+++ b/tests/data/test1244
@@ -32,10 +32,13 @@ wrong
http
https
</server>
- <name>
+<features>
+proxy
+</features>
+<name>
HTTP GET same URL - different proxy ports
- </name>
- <command>
+</name>
+<command>
http://%HOSTIP:%HTTPPORT/1244 -x %HOSTIP:%HTTPPORT --next http://%HOSTIP:%HTTPPORT/124400001 -x %HOSTIP:%HTTPSPORT
</command>
</client>
@@ -47,12 +50,10 @@ http://%HOSTIP:%HTTPPORT/1244 -x %HOSTIP:%HTTPPORT --next http://%HOSTIP:%HTTPPO
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/1244 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1245 b/tests/data/test1245
index 851d78d3b..d60ff2bc1 100644
--- a/tests/data/test1245
+++ b/tests/data/test1245
@@ -18,7 +18,7 @@ HTTP/1.1 301 OK swsclose
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Content-Length: 0
-Location: ftp://127.0.0.1:8992/1245
+Location: ftp://%HOSTIP:%FTPPORT/1245
Connection: close
</data>
@@ -37,21 +37,15 @@ ftp
<command>
--location --proto +all,-ftp --proto-redir -all,+ftp http://%HOSTIP:%HTTPPORT/1245
</command>
-# The data section doesn't do variable substitution, so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%FTPPORT' ne '8992' );"
-</precheck>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1245 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1246 b/tests/data/test1246
index a35bc89c3..bc3d2b000 100644
--- a/tests/data/test1246
+++ b/tests/data/test1246
@@ -48,17 +48,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1246:%HTTPPORT/ HTTP/1.1
Host: test.remote.haxx.se.1246:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://no-scheme-url.com.1246:%HTTPPORT/ HTTP/1.1
Host: no-scheme-url.com.1246:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1247 b/tests/data/test1247
index 48c5ccdf4..ff127eb57 100644
--- a/tests/data/test1247
+++ b/tests/data/test1247
@@ -17,7 +17,7 @@ HTTP
# Client-side
<client>
<server>
-none
+http
</server>
<name>
--fail-early
diff --git a/tests/data/test1248 b/tests/data/test1248
index 28e7a8527..7410483b8 100644
--- a/tests/data/test1248
+++ b/tests/data/test1248
@@ -29,19 +29,17 @@ http
Access a non-proxied host with using the combination of --proxy option and --noproxy option
</name>
<command>
-http://user:secret@%HOSTIP:%HTTPPORT/1248 --proxy http://dummy:%PROXYPORT/ --noproxy %HOSTIP --max-time 5
+http://user:secret@%HOSTIP:%HTTPPORT/1248 --proxy http://dummy:%NOLISTENPORT/ --noproxy %HOSTIP --max-time 5
</command>
</client>
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1248 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1249 b/tests/data/test1249
index ab5614068..13a14630a 100644
--- a/tests/data/test1249
+++ b/tests/data/test1249
@@ -32,19 +32,17 @@ Access a non-proxied host with using the combination of --proxy option and NO_PR
NO_PROXY=%HOSTIP
</setenv>
<command>
-http://user:secret@%HOSTIP:%HTTPPORT/1249 --proxy http://dummy:%PROXYPORT/ --max-time 5
+http://user:secret@%HOSTIP:%HTTPPORT/1249 --proxy http://dummy:%NOLISTENPORT/ --max-time 5
</command>
</client>
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1249 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1250 b/tests/data/test1250
index bf67b7fe7..acd670e50 100644
--- a/tests/data/test1250
+++ b/tests/data/test1250
@@ -39,13 +39,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/1250 --noproxy %HOSTIP --max-time 5
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1250 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1251 b/tests/data/test1251
index f37a685e8..f5cf51303 100644
--- a/tests/data/test1251
+++ b/tests/data/test1251
@@ -40,13 +40,11 @@ http://user:secret@%HOSTIP:%HTTPPORT/1251 --max-time 5
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1251 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpzZWNyZXQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1252 b/tests/data/test1252
index cbaef48b7..e68fcb918 100644
--- a/tests/data/test1252
+++ b/tests/data/test1252
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/1252 --proxy http://%HOSTIP:%HTTPPORT --noproxy %HOSTIP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1252 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1253 b/tests/data/test1253
index 8f240b0af..7ad1f86f2 100644
--- a/tests/data/test1253
+++ b/tests/data/test1253
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1253 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1254 b/tests/data/test1254
index c05975488..b2f27f94e 100644
--- a/tests/data/test1254
+++ b/tests/data/test1254
@@ -42,12 +42,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1254 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1255 b/tests/data/test1255
index d82310f67..9148a56ce 100644
--- a/tests/data/test1255
+++ b/tests/data/test1255
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1255 --noproxy %HOSTIP
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1255 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1256 b/tests/data/test1256
index e86afbb53..1ba0a0983 100644
--- a/tests/data/test1256
+++ b/tests/data/test1256
@@ -43,12 +43,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1256 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1257 b/tests/data/test1257
index 16a7c1af6..b05c524ba 100644
--- a/tests/data/test1257
+++ b/tests/data/test1257
@@ -43,12 +43,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://somewhere.example.com/1257 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1258 b/tests/data/test1258
index 6fa88e16e..297460c85 100644
--- a/tests/data/test1258
+++ b/tests/data/test1258
@@ -36,16 +36,15 @@ http://%HOSTIP:%HTTPPORT/we/want/1258 http://%HOSTIP:%HTTPPORT/we/want?hoge=fuga
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1258 HTTP/1.1
Host: localhost
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want?hoge=fuga HTTP/1.1
Host: localhost
+User-Agent: curl/%VERSION
Accept: */*
Cookie: I-am=here
diff --git a/tests/data/test1259 b/tests/data/test1259
index bad4ee25e..0bfa71cdc 100644
--- a/tests/data/test1259
+++ b/tests/data/test1259
@@ -33,13 +33,11 @@ HTTP URL with semicolon in password
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1259 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dXNlcjpwYXNzO3dvcmQ=
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1260 b/tests/data/test1260
index 1d86ecd4e..b246882cb 100644
--- a/tests/data/test1260
+++ b/tests/data/test1260
@@ -22,7 +22,7 @@ http
HTTP URL with rubbish after port number
</name>
<command>
--g "http://[%HOSTIP]:%HTTPPORT:80/we/want/1260" "http://%HOSTIP:%HTTPPORT:80/we/want/1260" "http://user@example.com:80@localhost"
+-g "http://[%HOSTIP]:%NOLISTENPORT:80/we/want/1260" "http://%HOSTIP:%NOLISTENPORT:80/we/want/1260" "http://user@example.com:80@localhost"
</command>
</client>
diff --git a/tests/data/test1261 b/tests/data/test1261
index 7f887994e..ef3cded57 100644
--- a/tests/data/test1261
+++ b/tests/data/test1261
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/we/want/our/1261 -w '%{redirect_url}\n' --location --ma
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/our/1261 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1263 b/tests/data/test1263
index 7462db4d4..88b13775e 100644
--- a/tests/data/test1263
+++ b/tests/data/test1263
@@ -23,7 +23,7 @@ http
HTTP URL with rubbish after IPv6 bracket
</name>
<command>
--g "http://[%HOSTIP]test:%HTTPPORT/we/want/1263" "http://[%HOSTIP][%HOSTIP]:%HTTPPORT/we/want/1263" "http://user@[::1]@localhost"
+-g "http://[%HOSTIP]test:%NOLISTENPORT/we/want/1263" "http://[%HOSTIP][%HOSTIP]:%NOLISTENPORT/we/want/1263" "http://user@[::1]@localhost"
</command>
</client>
diff --git a/tests/data/test1265 b/tests/data/test1265
index 5d3ef6dc8..12d524319 100644
--- a/tests/data/test1265
+++ b/tests/data/test1265
@@ -40,12 +40,10 @@ http://%HOST6IP:%HTTP6PORT/1265
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1265 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1266 b/tests/data/test1266
index cab11efa0..1de936e03 100644
--- a/tests/data/test1266
+++ b/tests/data/test1266
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1266 --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1266 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1267 b/tests/data/test1267
index 82d37445d..06500e87b 100644
--- a/tests/data/test1267
+++ b/tests/data/test1267
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/1267 --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1269 b/tests/data/test1269
index c77663633..7cf86cab3 100644
--- a/tests/data/test1269
+++ b/tests/data/test1269
@@ -20,7 +20,7 @@ none
too large --retry-delay value
</name>
<command>
---retry 3 --retry-delay 9223372036854776 http://%HOSTIP:%HTTPPORT/1269
+--retry 3 --retry-delay 9223372036854776 http://%HOSTIP:%NOLISTENPORT/1269
</command>
</client>
diff --git a/tests/data/test1270 b/tests/data/test1270
new file mode 100644
index 000000000..680e1e47c
--- /dev/null
+++ b/tests/data/test1270
@@ -0,0 +1,67 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+redirect_url
+followlocation
+--write-out
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 Captive Portal
+Server: ohlala/2000
+Date: Tue, 17 Dec 2019 13:08:30 GMT
+Cache-Control: no-cache,no-store,must-revalidate,post-check=0,pre-check=0
+Location: https://moo.moo.moo
+Content-Type: text/html; charset=utf-8
+X-Frame-Options: SAMEORIGIN
+Strict-Transport-Security: max-age=604800
+Content-Length: 0
+Connection: close
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Basic 'redirect_url'
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/our/1270 -w '%{redirect_url}\n' -s
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /we/want/our/1270 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+
+<stdout>
+HTTP/1.1 302 Captive Portal
+Server: ohlala/2000
+Date: Tue, 17 Dec 2019 13:08:30 GMT
+Cache-Control: no-cache,no-store,must-revalidate,post-check=0,pre-check=0
+Location: https://moo.moo.moo
+Content-Type: text/html; charset=utf-8
+X-Frame-Options: SAMEORIGIN
+Strict-Transport-Security: max-age=604800
+Content-Length: 0
+Connection: close
+
+https://moo.moo.moo/
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1271 b/tests/data/test1271
new file mode 100644
index 000000000..ce89c38f2
--- /dev/null
+++ b/tests/data/test1271
@@ -0,0 +1,46 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+--write-out
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 This is a weirdo text message swsclose
+Content-Length: 4
+Connection: close
+
+Moo
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+--write-out from file with empty file
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/our/1271 -w @log/blank1271
+</command>
+<file name="log/blank1271">
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /we/want/our/1271 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1280 b/tests/data/test1280
index 15c1e2fd1..0b7bc0045 100644
--- a/tests/data/test1280
+++ b/tests/data/test1280
@@ -33,24 +33,25 @@ http://%HOSTIP:%HTTPPORT/[a-d]/1280
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /a/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /b/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /c/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /d/1280 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1283 b/tests/data/test1283
index ac275e92e..d4c0ad964 100644
--- a/tests/data/test1283
+++ b/tests/data/test1283
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/[a-a][1-1][b-b:1][2-2:1]/1283 -o "log/outfile1283_#1#2#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /a1b2/1283 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1284 b/tests/data/test1284
index 8437a4082..4509a9b91 100644
--- a/tests/data/test1284
+++ b/tests/data/test1284
@@ -66,12 +66,10 @@ HTTP POST --digest with user-specified Content-Length header
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /1284 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -79,6 +77,7 @@ Content-Type: application/x-www-form-urlencoded
POST /1284 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1284", response="5763079608de439072861a59ac733515"
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1285 b/tests/data/test1285
index 16c66238a..62828ba4f 100644
--- a/tests/data/test1285
+++ b/tests/data/test1285
@@ -72,18 +72,17 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1285 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
PUT /1285 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1285", response="dc185587d5e8391b347eef194c2a3cd6"
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1286 b/tests/data/test1286
index 41782cb0f..c64a79b47 100644
--- a/tests/data/test1286
+++ b/tests/data/test1286
@@ -77,9 +77,7 @@ HTTP GET --digest increasing nonce-count
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
+
# Reorder the fields in 'Authorization: Digest' header.
# Since regular and SSPI digest auth header fields may not have the same order
# or whitespace we homogenize so that both may be tested. Also:
@@ -93,16 +91,19 @@ if(s/^(Authorization: Digest )([^\r\n]+)(\r?\n)$//) { $_ = $1 . join(', ', map {
<protocol>
GET /1286 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1286 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest cnonce=REMOVED, nc=00000001, nonce="1053604144", qop=auth, realm="testrealm", response=REMOVED, uri="/1286", username="auser"
+User-Agent: curl/%VERSION
Accept: */*
GET /12860001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest cnonce=REMOVED, nc=00000002, nonce="1053604144", qop=auth, realm="testrealm", response=REMOVED, uri="/12860001", username="auser"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1287 b/tests/data/test1287
index 976fd6ecf..d53a72b8e 100644
--- a/tests/data/test1287
+++ b/tests/data/test1287
@@ -68,18 +68,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.1287:%HTTPPORT HTTP/1.1
Host: test.1287:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1287 HTTP/1.1
Host: test.1287:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1288 b/tests/data/test1288
index d8a1e524c..a841709be 100644
--- a/tests/data/test1288
+++ b/tests/data/test1288
@@ -52,18 +52,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT %HOSTIP.1288:%HTTPPORT HTTP/1.1
Host: %HOSTIP.1288:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1288 HTTP/1.1
Host: %HOSTIP.1288:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1290 b/tests/data/test1290
index e556303bf..871dcd763 100644
--- a/tests/data/test1290
+++ b/tests/data/test1290
@@ -35,12 +35,10 @@ Verify URL globbing ignores []
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/[]/page/1290 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1292 b/tests/data/test1292
index 880a4b465..dee0def3e 100644
--- a/tests/data/test1292
+++ b/tests/data/test1292
@@ -37,12 +37,10 @@ Replaced internal headers with a blank one
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1292 HTTP/1.1
Host:
+User-Agent: curl/%VERSION
Accept:
</protocol>
diff --git a/tests/data/test1293 b/tests/data/test1293
new file mode 100644
index 000000000..df72b755a
--- /dev/null
+++ b/tests/data/test1293
@@ -0,0 +1,65 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+-F
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Multipart formpost to two URLs, the first failing
+ </name>
+ <command>
+http://0 http://%HOSTIP:%HTTPPORT/1293 -F=
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /1293 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 126
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data
+
+
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1294 b/tests/data/test1294
new file mode 100644
index 000000000..4fa1cb1d9
--- /dev/null
+++ b/tests/data/test1294
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+debug
+</features>
+<server>
+http
+</server>
+<name>
+HTTP GET with split initial request send
+</name>
+<setenv>
+# Oliver Twist
+
+# make the first send cut off after this amount of data
+CURL_SMALLREQSEND=128
+</setenv>
+<command>
+http://%HOSTIP:%HTTPPORT/012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679/1294 -H "Among other public buildings in a certain town, which for many reasons it will be prudent to refrain from mentioning, and to which I will assign no fictitious name, there is one anciently common to most towns, great or small to wit, a workhouse; and in this workhouse was born; on a day and date which I need not trouble myself to repeat, inasmuch as it can be of no possible consequence to the reader, in this stage of the business at all events; the item of mortality whose name is prefixed to the head of this chapter: 511"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679/1294 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Among other public buildings in a certain town, which for many reasons it will be prudent to refrain from mentioning, and to which I will assign no fictitious name, there is one anciently common to most towns, great or small to wit, a workhouse; and in this workhouse was born; on a day and date which I need not trouble myself to repeat, inasmuch as it can be of no possible consequence to the reader, in this stage of the business at all events; the item of mortality whose name is prefixed to the head of this chapter: 511
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1295 b/tests/data/test1295
new file mode 100644
index 000000000..50e5fa2e2
--- /dev/null
+++ b/tests/data/test1295
@@ -0,0 +1,66 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+debug
+</features>
+<server>
+http
+</server>
+<name>
+HTTP POST with split initial request send
+</name>
+<setenv>
+# The Hound of the Baskervilles
+#
+# make the first send cut off after this amount of data
+CURL_SMALLREQSEND=100
+</setenv>
+<command>
+http://%HOSTIP:%HTTPPORT/012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679/1295 -H "012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679: 300" -d "Mr. Sherlock Holmes, who was usually very late in the mornings, save upon those not infrequent occasions when he was up all night, was seated at the breakfast table."
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+POST /012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679/1295 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679012345679: 300
+Content-Length: 165
+Content-Type: application/x-www-form-urlencoded
+
+Mr. Sherlock Holmes, who was usually very late in the mornings, save upon those not infrequent occasions when he was up all night, was seated at the breakfast table.
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1296 b/tests/data/test1296
new file mode 100644
index 000000000..55b01c4c4
--- /dev/null
+++ b/tests/data/test1296
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP Basic
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+<name>
+HTTP URL with %0a in name part
+</name>
+
+<command>
+http://user%0aname:password@%HOSTIP:%HTTPPORT/1296
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1296 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcgpuYW1lOnBhc3N3b3Jk
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
+
diff --git a/tests/data/test1297 b/tests/data/test1297
new file mode 100644
index 000000000..6cffff85d
--- /dev/null
+++ b/tests/data/test1297
@@ -0,0 +1,65 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP CONNECT
+HTTP proxy
+proxytunnel
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<connect>
+HTTP/1.1 200 Mighty fine indeed
+Server: test tunnel 2000
+
+</connect>
+
+<data nocheck="yes">
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+http-proxy
+</server>
+<name>
+CONNECT to peer that returns nothing
+</name>
+<command>
+--proxytunnel --proxy %HOSTIP:%PROXYPORT http://%HOSTIP.1297:%HTTPPORT/we/want/that/page/1297
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<proxy>
+CONNECT %HOSTIP.1297:%HTTPPORT HTTP/1.1
+Host: %HOSTIP.1297:%HTTPPORT
+User-Agent: curl/%VERSION
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+GET /we/want/that/page/1297 HTTP/1.1
+Host: %HOSTIP.1297:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+# 52 - got nothing
+<errorcode>
+52
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1298 b/tests/data/test1298
index 061a4e1e0..6a34aa32b 100644
--- a/tests/data/test1298
+++ b/tests/data/test1298
@@ -42,12 +42,10 @@ HTTP GET special path with --request-target
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET XXX HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 1298
diff --git a/tests/data/test1299 b/tests/data/test1299
index 51e0e7983..2cf293a41 100644
--- a/tests/data/test1299
+++ b/tests/data/test1299
@@ -41,12 +41,10 @@ Send "OPTIONS *" with --request-target
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
OPTIONS * HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Testno: 1299
diff --git a/tests/data/test13 b/tests/data/test13
index 18f7f8114..121697947 100644
--- a/tests/data/test13
+++ b/tests/data/test13
@@ -31,12 +31,10 @@ http://%HOSTIP:%HTTPPORT/want/13 -X DELETE
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
DELETE /want/13 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1300 b/tests/data/test1300
index 100888561..118341213 100644
--- a/tests/data/test1300
+++ b/tests/data/test1300
@@ -18,9 +18,5 @@ unittest
<name>
llist unit tests
</name>
-<tool>
-unit1300
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1301 b/tests/data/test1301
index 8506c0005..5aea24b65 100644
--- a/tests/data/test1301
+++ b/tests/data/test1301
@@ -18,9 +18,5 @@ unittest
<name>
curl_strcasecompare unit tests
</name>
-<tool>
-unit1301
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1302 b/tests/data/test1302
index 27ea86248..9e9039cac 100644
--- a/tests/data/test1302
+++ b/tests/data/test1302
@@ -18,9 +18,5 @@ unittest
<name>
base64 encode/decode unit tests
</name>
-<tool>
-unit1302
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1303 b/tests/data/test1303
index 925b47e15..bb23352df 100644
--- a/tests/data/test1303
+++ b/tests/data/test1303
@@ -18,9 +18,5 @@ unittest
<name>
Curl_timeleft unit tests
</name>
-<tool>
-unit1303
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1304 b/tests/data/test1304
index d518de9e4..b402bfc8b 100644
--- a/tests/data/test1304
+++ b/tests/data/test1304
@@ -18,13 +18,9 @@ unittest
<name>
netrc parsing unit tests
</name>
-<tool>
-unit1304
-</tool>
<file name="log/netrc1304">
machine example.com login admin password passwd
machine curl.example.com login none password none
</file>
</client>
-
</testcase>
diff --git a/tests/data/test1305 b/tests/data/test1305
index 91149b3ad..52efbcbb0 100644
--- a/tests/data/test1305
+++ b/tests/data/test1305
@@ -19,12 +19,8 @@ unittest
<name>
internal hash create/destroy testing
</name>
-<tool>
-unit1305
-</tool>
<command>
1305
</command>
</client>
-
</testcase>
diff --git a/tests/data/test1307 b/tests/data/test1307
index c4f7ac729..f0e96bfa0 100644
--- a/tests/data/test1307
+++ b/tests/data/test1307
@@ -20,9 +20,5 @@ ftp
<name>
internal Curl_fnmatch() testing
</name>
-<tool>
-unit1307
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1308 b/tests/data/test1308
index 88e9771dd..3755ef8b4 100644
--- a/tests/data/test1308
+++ b/tests/data/test1308
@@ -20,12 +20,8 @@ http
<name>
formpost unit tests
</name>
-<tool>
-unit1308
-</tool>
<file name="log/test-1308">
Piece of the file that is to uploaded as a formpost
</file>
</client>
-
</testcase>
diff --git a/tests/data/test1309 b/tests/data/test1309
index 0e0cad1e8..7005d5f13 100644
--- a/tests/data/test1309
+++ b/tests/data/test1309
@@ -18,9 +18,6 @@ unittest
<name>
splay unit tests
</name>
-<tool>
-unit1309
-</tool>
</client>
<verify>
@@ -1564,5 +1561,4 @@ removed payload 1013[1]
removed payload 1013[2]
</stdout>
</verify>
-
</testcase>
diff --git a/tests/data/test1310 b/tests/data/test1310
index 9ffe0d586..cb9db8281 100644
--- a/tests/data/test1310
+++ b/tests/data/test1310
@@ -86,20 +86,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1310 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAA
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /1310 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAE8AAAAYABgAZwAAAAAAAABAAAAACAAIAEAAAAAHAAcASAAAAAAAAAAAAAAAggEAAHRlc3R1c2VyVU5LTk9XTlpkQwKRCZFMhjj0tw47wEjKHRHlvzfxQamFcheMuv8v+xeqphEO5V41xRd7R9deOQ==
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1311 b/tests/data/test1311
index e47647c38..4078d7bb4 100644
--- a/tests/data/test1311
+++ b/tests/data/test1311
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1311 -J -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1311 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1312 b/tests/data/test1312
index bed492c16..54659b55b 100644
--- a/tests/data/test1312
+++ b/tests/data/test1312
@@ -47,12 +47,10 @@ CURL_TESTDIR=%PWD/log
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1312 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1313 b/tests/data/test1313
index 2331ae9ee..3d9c0940d 100644
--- a/tests/data/test1313
+++ b/tests/data/test1313
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1313 -J -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1313 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1314 b/tests/data/test1314
index 3963bd93f..55e3299e4 100644
--- a/tests/data/test1314
+++ b/tests/data/test1314
@@ -63,17 +63,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://firstplace.example.com/want/1314 HTTP/1.1
Host: firstplace.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://somewhere.example.com/reply/1314 HTTP/1.1
Host: somewhere.example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1315 b/tests/data/test1315
index 888ddc5c1..ffc7bdc7b 100644
--- a/tests/data/test1315
+++ b/tests/data/test1315
@@ -40,12 +40,12 @@ dummy data
# Verify data after the test has been "shot"
<verify>
<strip>
-(^User-Agent:.*|-----+\w+)
+-----+\w+
</strip>
<protocol>
POST /we/want/1315 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 797
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test1317 b/tests/data/test1317
index d41886a5f..7964b10bd 100644
--- a/tests/data/test1317
+++ b/tests/data/test1317
@@ -43,12 +43,10 @@ HTTP with --resolve
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1317 HTTP/1.1
Host: example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1318 b/tests/data/test1318
index dc182dccb..8ce468db1 100644
--- a/tests/data/test1318
+++ b/tests/data/test1318
@@ -43,16 +43,15 @@ HTTP with --resolve and same host name using different cases
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1318 HTTP/1.1
Host: MiXeDcAsE.cOm:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /13180001 HTTP/1.1
Host: mixedcase.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1319 b/tests/data/test1319
index 8fc968c89..b37a97055 100644
--- a/tests/data/test1319
+++ b/tests/data/test1319
@@ -63,9 +63,6 @@ pop3://pop.1319:%POP3PORT/1319 -p -x %HOSTIP:%PROXYPORT -u user:secret
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
CAPA
USER user
@@ -76,7 +73,7 @@ QUIT
<proxy>
CONNECT pop.1319:%POP3PORT HTTP/1.1
Host: pop.1319:%POP3PORT
-User-Agent: curl/7.24.0-DEV (i686-pc-linux-gnu) libcurl/7.24.0-DEV OpenSSL/1.0.0e zlib/1.2.3.4 c-ares/1.7.6-DEV libidn/1.23 libssh2/1.4.0_DEV librtmp/2.2e
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
diff --git a/tests/data/test1320 b/tests/data/test1320
index da4079e93..2db0e3dee 100644
--- a/tests/data/test1320
+++ b/tests/data/test1320
@@ -46,9 +46,6 @@ smtp://smtp.1320:%SMTPPORT/1320 --mail-rcpt recipient@example.com --mail-from se
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
EHLO 1320
MAIL FROM:<sender@example.com>
@@ -66,7 +63,7 @@ body
<proxy>
CONNECT smtp.1320:%SMTPPORT HTTP/1.1
Host: smtp.1320:%SMTPPORT
-User-Agent: curl/7.24.0-DEV (i686-pc-linux-gnu) libcurl/7.24.0-DEV OpenSSL/1.0.0e zlib/1.2.3.4 c-ares/1.7.6-DEV libidn/1.23 libssh2/1.4.0_DEV librtmp/2.2e
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
diff --git a/tests/data/test1321 b/tests/data/test1321
index cc9117774..460779784 100644
--- a/tests/data/test1321
+++ b/tests/data/test1321
@@ -59,9 +59,6 @@ IMAP FETCH tunneled through HTTP proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
A001 CAPABILITY
A002 LOGIN user secret
@@ -72,7 +69,7 @@ A005 LOGOUT
<proxy>
CONNECT imap.1321:%IMAPPORT HTTP/1.1
Host: imap.1321:%IMAPPORT
-User-Agent: curl/7.24.0-DEV (i686-pc-linux-gnu) libcurl/7.24.0-DEV OpenSSL/1.0.0e zlib/1.2.3.4 c-ares/1.7.6-DEV libidn/1.23 libssh2/1.4.0_DEV librtmp/2.2e
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
diff --git a/tests/data/test1322 b/tests/data/test1322
index 974989517..71b8cb20e 100644
--- a/tests/data/test1322
+++ b/tests/data/test1322
@@ -44,12 +44,10 @@ HTTP with --resolve and hostname with trailing dot
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1322 HTTP/1.1
Host: example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1323 b/tests/data/test1323
index c5e598cc4..66bac61ff 100644
--- a/tests/data/test1323
+++ b/tests/data/test1323
@@ -17,12 +17,12 @@ curlx_tvdiff
<server>
none
</server>
+<features>
+unittest
+</features>
<name>
curlx_tvdiff
</name>
-<tool>
-unit1323
-</tool>
</client>
#
diff --git a/tests/data/test1324 b/tests/data/test1324
index d7e663a0f..0c89edbd1 100644
--- a/tests/data/test1324
+++ b/tests/data/test1324
@@ -43,12 +43,10 @@ HTTP with --resolve and [ipv6address]
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1324 HTTP/1.1
Host: example.com:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1325 b/tests/data/test1325
index 6da1cbc6a..bbf679df4 100644
--- a/tests/data/test1325
+++ b/tests/data/test1325
@@ -58,18 +58,17 @@ http://%HOSTIP:%HTTPPORT/we/1325 -L -d "moo"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /we/1325 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /we/13250002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1328 b/tests/data/test1328
index 06088884a..0fd0c38de 100644
--- a/tests/data/test1328
+++ b/tests/data/test1328
@@ -54,16 +54,15 @@ HTTP GET a globbed range with -f
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /13280000 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /13280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1330 b/tests/data/test1330
index 1fb5a6687..f7ac9b0dd 100644
--- a/tests/data/test1330
+++ b/tests/data/test1330
@@ -20,11 +20,6 @@ none
unittest
TrackMemory
</features>
-# tool is what to use instead of 'curl'
-<tool>
-unit1330
-</tool>
-
<name>
unit tests memory tracking operational
</name>
@@ -45,7 +40,9 @@ s/ =.*//
s/\(.*\)/()/
s/:\d+/:/
s:^(MEM )(.*/)(.*):$1$3:
+s/\r\n/\n/
+s/^MEM getenv.c: realloc\(\)[\n]$//
+s/^MEM getenv.c: free\(\)[\n]$//
</stripfile>
</verify>
-
</testcase>
diff --git a/tests/data/test1331 b/tests/data/test1331
index 865abd969..09aabf879 100644
--- a/tests/data/test1331
+++ b/tests/data/test1331
@@ -71,18 +71,17 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://z.x.com/1331 HTTP/1.1
Host: z.x.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://z.x.com/1331 HTTP/1.1
Host: z.x.com
Proxy-Authorization: Basic bXluYW1lOm15cGFzc3dvcmQ=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: proxycookie=weirdo
diff --git a/tests/data/test1332 b/tests/data/test1332
index 3447b2ddd..3271b5701 100644
--- a/tests/data/test1332
+++ b/tests/data/test1332
@@ -57,19 +57,17 @@ http://%HOSTIP:%HTTPPORT/blah/1332 -L -d "moo" --post303
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /blah/1332 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
mooPOST /blah/moo.html&testcase=/13320002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1333 b/tests/data/test1333
index 50ca42a29..3ef8ed49f 100644
--- a/tests/data/test1333
+++ b/tests/data/test1333
@@ -38,12 +38,10 @@ HTTP POST zero length, chunked-encoded
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /1333 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1334 b/tests/data/test1334
index 59116e388..0885357fc 100644
--- a/tests/data/test1334
+++ b/tests/data/test1334
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1334 -O -D log/heads1334
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1334 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1335 b/tests/data/test1335
index bb499e73f..9cf1f3ef4 100644
--- a/tests/data/test1335
+++ b/tests/data/test1335
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1335 -O -D -
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1335 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1336 b/tests/data/test1336
index ebe562b6a..f6fcb9431 100644
--- a/tests/data/test1336
+++ b/tests/data/test1336
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1336
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1336 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1337 b/tests/data/test1337
index 80a99facf..d7f556cd3 100644
--- a/tests/data/test1337
+++ b/tests/data/test1337
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1337
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1337 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1338 b/tests/data/test1338
index d96f80467..8941a64a4 100644
--- a/tests/data/test1338
+++ b/tests/data/test1338
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1338 -J -O -D log/heads1338
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1338 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1339 b/tests/data/test1339
index a3c1f0e54..f08e87cdf 100644
--- a/tests/data/test1339
+++ b/tests/data/test1339
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1339 -J -O -D -
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1339 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1340 b/tests/data/test1340
index 81f1ed68d..c2e065db2 100644
--- a/tests/data/test1340
+++ b/tests/data/test1340
@@ -40,19 +40,17 @@ HTTP GET with -O -J and Content-Disposition, -D file
CURL_TESTDIR=%PWD/log
</setenv>
<command option="no-output,no-include">
-http://%HOSTIP:%HTTPPORT/1340 -J -O -D log/heads1340
+http://%HOSTIP:%HTTPPORT/1340 -J -O -D log/heads1340 -w "curl: Saved to filename %{filename_effective}\n"
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1340 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
@@ -73,7 +71,7 @@ Content-Disposition: filename=name1340; charset=funny; option=strange
</file2>
<file3 name="log/stdout1340" mode="text">
-curl: Saved to filename '%PWD/log/name1340'
+curl: Saved to filename %PWD/log/name1340
</file3>
</verify>
diff --git a/tests/data/test1341 b/tests/data/test1341
index b364edeb1..060fc093d 100644
--- a/tests/data/test1341
+++ b/tests/data/test1341
@@ -40,19 +40,17 @@ HTTP GET with -O -J and Content-Disposition, -D stdout
CURL_TESTDIR=%PWD/log
</setenv>
<command option="no-output,no-include">
-http://%HOSTIP:%HTTPPORT/1341 -J -O -D -
+http://%HOSTIP:%HTTPPORT/1341 -J -O -D - -w "curl: Saved to filename %{filename_effective}\n"
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1341 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
@@ -70,7 +68,7 @@ Connection: close
Content-Type: text/html
Content-Disposition: filename=name1341; charset=funny; option=strange
-curl: Saved to filename '%PWD/log/name1341'
+curl: Saved to filename %PWD/log/name1341
</file2>
</verify>
diff --git a/tests/data/test1342 b/tests/data/test1342
index 1d7889d1e..012b63437 100644
--- a/tests/data/test1342
+++ b/tests/data/test1342
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1342 -i -O -D log/heads1342
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1342 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1343 b/tests/data/test1343
index a05cab04c..636afab24 100644
--- a/tests/data/test1343
+++ b/tests/data/test1343
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1343 -i -O -D -
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1343 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1344 b/tests/data/test1344
index ac354f0dd..4d8bd4aff 100644
--- a/tests/data/test1344
+++ b/tests/data/test1344
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1344
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1344 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1345 b/tests/data/test1345
index 6d1201e16..f69a56adf 100644
--- a/tests/data/test1345
+++ b/tests/data/test1345
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1345
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1345 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1346 b/tests/data/test1346
index 347214e69..83cdaa8c4 100644
--- a/tests/data/test1346
+++ b/tests/data/test1346
@@ -45,12 +45,10 @@ http://%HOSTIP:%HTTPPORT/1346 -i -O
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1346 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1347 b/tests/data/test1347
index 8eac42cb2..f16abcd02 100644
--- a/tests/data/test1347
+++ b/tests/data/test1347
@@ -49,12 +49,10 @@ perl %SRCDIR/libtest/notexists.pl log/name1347
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1347 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1364 b/tests/data/test1364
index e8c981d77..777d9b248 100644
--- a/tests/data/test1364
+++ b/tests/data/test1364
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1364
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1364 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1365 b/tests/data/test1365
index 4a09cfd6a..c69ee4b7c 100644
--- a/tests/data/test1365
+++ b/tests/data/test1365
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1365
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1365 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1366 b/tests/data/test1366
index 62e3b0c42..c87455fc0 100644
--- a/tests/data/test1366
+++ b/tests/data/test1366
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1366 log/name1366
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1366 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1367 b/tests/data/test1367
index d4bd3d777..68bc33363 100644
--- a/tests/data/test1367
+++ b/tests/data/test1367
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1367 log/name1367
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1367 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1368 b/tests/data/test1368
index 6a926ab68..37805176b 100644
--- a/tests/data/test1368
+++ b/tests/data/test1368
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1368
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1368 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1369 b/tests/data/test1369
index 5176ed0b0..1a5944633 100644
--- a/tests/data/test1369
+++ b/tests/data/test1369
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1369
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1369 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1370 b/tests/data/test1370
index d0abbdd68..ec5e7b54c 100644
--- a/tests/data/test1370
+++ b/tests/data/test1370
@@ -42,12 +42,10 @@ perl %SRCDIR/libtest/notexists.pl log/1370 log/name1370
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1370 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1371 b/tests/data/test1371
index fe3977fae..d3e187adc 100644
--- a/tests/data/test1371
+++ b/tests/data/test1371
@@ -42,12 +42,10 @@ perl %SRCDIR/libtest/notexists.pl log/1371 log/name1371
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1371 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1372 b/tests/data/test1372
index a2b8ec961..49c89f96f 100644
--- a/tests/data/test1372
+++ b/tests/data/test1372
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1372
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1372 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1373 b/tests/data/test1373
index ae906d7bd..3ceaacaf9 100644
--- a/tests/data/test1373
+++ b/tests/data/test1373
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1373
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1373 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1374 b/tests/data/test1374
index f8d9d0dd0..e143b41db 100644
--- a/tests/data/test1374
+++ b/tests/data/test1374
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1374 log/name1374
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1374 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1375 b/tests/data/test1375
index 595f03ac1..f6219a1ea 100644
--- a/tests/data/test1375
+++ b/tests/data/test1375
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1375 log/name1375
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1375 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1376 b/tests/data/test1376
index f34c27745..1d12c4c6a 100644
--- a/tests/data/test1376
+++ b/tests/data/test1376
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1376
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1376 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1377 b/tests/data/test1377
index f542b11c7..f24561654 100644
--- a/tests/data/test1377
+++ b/tests/data/test1377
@@ -41,12 +41,10 @@ perl %SRCDIR/libtest/notexists.pl log/1377 log/name1377
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1377 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test138 b/tests/data/test138
index 4eb73e6cf..873313848 100644
--- a/tests/data/test138
+++ b/tests/data/test138
@@ -15,6 +15,7 @@ this is file contents
</size>
<servercmd>
RETRNOSIZE
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test1394 b/tests/data/test1394
index 34d4a0e37..d3ffb2d33 100644
--- a/tests/data/test1394
+++ b/tests/data/test1394
@@ -17,14 +17,10 @@ unittest
<name>
unit test for parse_cert_parameter()
</name>
-<tool>
-unit1394
-</tool>
</client>
<verify>
<stdout mode="text">
</stdout>
</verify>
-
</testcase>
diff --git a/tests/data/test1395 b/tests/data/test1395
index 967c8d492..409e0d631 100644
--- a/tests/data/test1395
+++ b/tests/data/test1395
@@ -17,10 +17,5 @@ unittest
<name>
Curl_dedotdotify
</name>
-<tool>
-unit1395
-</tool>
-
</client>
-
</testcase>
diff --git a/tests/data/test1396 b/tests/data/test1396
index 8ffe35f4c..d8b432d8b 100644
--- a/tests/data/test1396
+++ b/tests/data/test1396
@@ -19,9 +19,6 @@ unittest
<name>
curl_easy_escape and curl_easy_unescape
</name>
-<tool>
-unit1396
-</tool>
</client>
</testcase>
diff --git a/tests/data/test1397 b/tests/data/test1397
index 5f479b468..84f962abe 100644
--- a/tests/data/test1397
+++ b/tests/data/test1397
@@ -19,9 +19,6 @@ unittest
<name>
Check wildcard certificate matching function Curl_cert_hostcheck
</name>
-<tool>
-unit1397
-</tool>
</client>
</testcase>
diff --git a/tests/data/test1398 b/tests/data/test1398
index dd50baa62..436cac82d 100644
--- a/tests/data/test1398
+++ b/tests/data/test1398
@@ -18,9 +18,6 @@ unittest
<name>
curl_msnprintf unit tests
</name>
-<tool>
-unit1398
-</tool>
</client>
</testcase>
diff --git a/tests/data/test1399 b/tests/data/test1399
index fe3879df1..6d6ec7a5b 100644
--- a/tests/data/test1399
+++ b/tests/data/test1399
@@ -18,9 +18,5 @@ unittest
<name>
Curl_pgrsTime unit tests
</name>
-<tool>
-unit1399
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test14 b/tests/data/test14
index 21a4865b4..f6c568ede 100644
--- a/tests/data/test14
+++ b/tests/data/test14
@@ -30,13 +30,10 @@ http://%HOSTIP:%HTTPPORT/want/14 -i --head
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /want/14 HTTP/1.1
-User-Agent: curl/7.4.2-pre4 (sparc-sun-solaris2.7) libcurl 7.4.2-pre4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1400 b/tests/data/test1400
index c0d409bac..eea8d3fbe 100644
--- a/tests/data/test1400
+++ b/tests/data/test1400
@@ -37,13 +37,10 @@ http://%HOSTIP:%HTTPPORT/we/want/1400 --libcurl log/test1400.c
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1400 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1401 b/tests/data/test1401
index ec3b25cc9..b20607c31 100644
--- a/tests/data/test1401
+++ b/tests/data/test1401
@@ -41,14 +41,11 @@ http://%HOSTIP:%HTTPPORT/we/want/1401 --libcurl log/test1401.c --basic -u fake:u
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1401 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: stripped
Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: MyUA
Accept: */*
Cookie: chocolate=chip
X-Files: Mulder
diff --git a/tests/data/test1402 b/tests/data/test1402
index bf7eb7b82..296554790 100644
--- a/tests/data/test1402
+++ b/tests/data/test1402
@@ -38,13 +38,10 @@ http://%HOSTIP:%HTTPPORT/we/want/1402 --libcurl log/test1402.c -d "foo=bar" -d "
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /we/want/1402 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 16
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1403 b/tests/data/test1403
index 731d274b3..6d21ce85e 100644
--- a/tests/data/test1403
+++ b/tests/data/test1403
@@ -38,13 +38,10 @@ http://%HOSTIP:%HTTPPORT/we/want/1403 --libcurl log/test1403.c -G -d "foo=bar" -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1403?foo=bar&baz=quux HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1404 b/tests/data/test1404
index d3c66a9d5..8f61ec00f 100644
--- a/tests/data/test1404
+++ b/tests/data/test1404
@@ -44,12 +44,12 @@ dummy data
# Verify data after the test has been "shot"
<verify>
<strip>
-(^User-Agent:.*|-----+\w+)
+-----+\w+
</strip>
<protocol>
POST /we/want/1404 HTTP/1.1
-User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 882
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test1408 b/tests/data/test1408
index bf775ed39..6d3131fb6 100644
--- a/tests/data/test1408
+++ b/tests/data/test1408
@@ -55,16 +55,15 @@ HTTP receive cookies over IPV6
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /path/14080001 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
GET /path/14080002 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: time=1
diff --git a/tests/data/test1409 b/tests/data/test1409
index 5ceb53be3..8d54b4c95 100644
--- a/tests/data/test1409
+++ b/tests/data/test1409
@@ -17,7 +17,7 @@ none
Pass in string to -C
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1409 -C wrong
+http://%HOSTIP:%NOLISTENPORT/1409 -C wrong
</command>
</client>
diff --git a/tests/data/test1410 b/tests/data/test1410
index 97ad05698..a8b89db3f 100644
--- a/tests/data/test1410
+++ b/tests/data/test1410
@@ -17,7 +17,7 @@ none
Pass in negative number to --max-time
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1410 --max-time -4
+http://%HOSTIP:%NOLISTENPORT/1410 --max-time -4
</command>
</client>
diff --git a/tests/data/test1411 b/tests/data/test1411
index 3ffd586de..93e3b4b8b 100644
--- a/tests/data/test1411
+++ b/tests/data/test1411
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/1411 -T log/empty1411
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /1411 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
diff --git a/tests/data/test1412 b/tests/data/test1412
index 36d3d1d93..808ed17f2 100644
--- a/tests/data/test1412
+++ b/tests/data/test1412
@@ -106,29 +106,27 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1412 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1412 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1412", response="0390dbe89e31adca0413d11f91f30e7f"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/14120001", response="0085df91870374c8bf4e94415e7fbf8e"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1413 b/tests/data/test1413
index 6e889a8a2..96467f169 100644
--- a/tests/data/test1413
+++ b/tests/data/test1413
@@ -56,16 +56,15 @@ http://%HOSTIP:%HTTPPORT/this/1413 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /this/1413 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /this/moo.html/14130002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1415 b/tests/data/test1415
index 94ce02c59..7c9e389f9 100644
--- a/tests/data/test1415
+++ b/tests/data/test1415
@@ -53,12 +53,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.com/we/want/1415 HTTP/1.1
Host: example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1416 b/tests/data/test1416
index 546575e5d..f6e9bbfe4 100644
--- a/tests/data/test1416
+++ b/tests/data/test1416
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/1416
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1416 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1417 b/tests/data/test1417
index 4d3971ea8..a141b11d2 100644
--- a/tests/data/test1417
+++ b/tests/data/test1417
@@ -56,12 +56,10 @@ http://%HOSTIP:%HTTPPORT/1417 -D log/heads1417
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1417 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1418 b/tests/data/test1418
index c137b1c59..51d2e5f0a 100644
--- a/tests/data/test1418
+++ b/tests/data/test1418
@@ -93,26 +93,27 @@ http://%HOSTIP:%HTTPPORT/1418 -u testuser:testpass --anyauth http://%HOSTIP:%HTT
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1418 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1418 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/1418", response="986238b7e0077754944c966f56d9bc77"
+User-Agent: curl/%VERSION
Accept: */*
GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540"
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1419 b/tests/data/test1419
index f29ce4444..6d05f0b5a 100644
--- a/tests/data/test1419
+++ b/tests/data/test1419
@@ -51,16 +51,15 @@ http://%HOSTIP:%HTTPPORT/1419 --anyauth http://%HOSTIP:%HTTPPORT/14190003
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1419 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /14190003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test1421 b/tests/data/test1421
index dea49e781..c219770e3 100644
--- a/tests/data/test1421
+++ b/tests/data/test1421
@@ -55,17 +55,16 @@ Content-Length: 6
-foo-
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://test.remote.haxx.se.1421:8990/ HTTP/1.1
Host: test.remote.haxx.se.1421:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://different.remote.haxx.se.1421:8990/ HTTP/1.1
Host: different.remote.haxx.se.1421:8990
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1422 b/tests/data/test1422
index cbb2d63bc..4108091f4 100644
--- a/tests/data/test1422
+++ b/tests/data/test1422
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/1422 -J -O file://%PWD/log/name1422
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1422 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1423 b/tests/data/test1423
index 908ff8c29..b0fcef3ba 100644
--- a/tests/data/test1423
+++ b/tests/data/test1423
@@ -40,12 +40,10 @@ perl %SRCDIR/libtest/notexists.pl log/1423
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1423 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1424 b/tests/data/test1424
index 17bc46a1d..8f922e620 100644
--- a/tests/data/test1424
+++ b/tests/data/test1424
@@ -57,12 +57,10 @@ http://%HOSTIP:%HTTPPORT/1424 -z "dec 12 11:00:00 1999 GMT" -o log/outfile1424
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1424 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 11:00:00 GMT
diff --git a/tests/data/test1425 b/tests/data/test1425
index ce9ba97fb..7122cd637 100644
--- a/tests/data/test1425
+++ b/tests/data/test1425
Binary files differ
diff --git a/tests/data/test1426 b/tests/data/test1426
index 851d8c3fb..1344b8ebd 100644
--- a/tests/data/test1426
+++ b/tests/data/test1426
Binary files differ
diff --git a/tests/data/test1427 b/tests/data/test1427
index 03cab4b93..648b1da56 100644
--- a/tests/data/test1427
+++ b/tests/data/test1427
@@ -15,7 +15,7 @@ none
too large -m timeout value
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1427 -m 184467440737095510
+http://%HOSTIP:%NOLISTENPORT/1427 -m 184467440737095510
</command>
</client>
diff --git a/tests/data/test1428 b/tests/data/test1428
index f09c02dd9..0ff74d4be 100644
--- a/tests/data/test1428
+++ b/tests/data/test1428
@@ -60,13 +60,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.1428:%HTTPPORT HTTP/1.1
Host: test.1428:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
header-type: proxy
@@ -75,7 +72,7 @@ header-type: proxy
GET /we/want/that/page/1428 HTTP/1.1
Host: test.1428:%HTTPPORT
Authorization: Basic aWFtOm15OjtzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
header-type: server
diff --git a/tests/data/test1429 b/tests/data/test1429
index b6a66c75f..4f3989cf5 100644
--- a/tests/data/test1429
+++ b/tests/data/test1429
@@ -57,12 +57,10 @@ Funny-head: yesyes
-foo-
234
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1429 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1430 b/tests/data/test1430
index e3c9b1d60..5acc7f12e 100644
--- a/tests/data/test1430
+++ b/tests/data/test1430
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1430
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1430 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1431 b/tests/data/test1431
index bec3ebbde..58500879c 100644
--- a/tests/data/test1431
+++ b/tests/data/test1431
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/1431
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1431 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1432 b/tests/data/test1432
index 7f41c65be..fadbe8385 100644
--- a/tests/data/test1432
+++ b/tests/data/test1432
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1432
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1432 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1433 b/tests/data/test1433
index a159daff3..6656114d5 100644
--- a/tests/data/test1433
+++ b/tests/data/test1433
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/1433
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1433 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1434 b/tests/data/test1434
index 0b33bb958..55031be71 100644
--- a/tests/data/test1434
+++ b/tests/data/test1434
@@ -76,13 +76,11 @@ http://%HOSTIP:%HTTPPORT/1434 -C 100
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1434 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=100-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1435 b/tests/data/test1435
index bd171a453..73262498e 100644
--- a/tests/data/test1435
+++ b/tests/data/test1435
@@ -33,12 +33,10 @@ simple HTTP GET over Unix socket
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1435 HTTP/1.1
Host: server-interpreted.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1436 b/tests/data/test1436
index e40a3bf4b..040b3b389 100644
--- a/tests/data/test1436
+++ b/tests/data/test1436
@@ -47,20 +47,20 @@ HTTP requests with multiple connections over Unix socket
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /14360001 HTTP/1.1
Host: one.example.com
+User-Agent: curl/%VERSION
Accept: */*
GET /14360002 HTTP/1.1
Host: two.example.com
+User-Agent: curl/%VERSION
Accept: */*
GET /14360003 HTTP/1.1
Host: one.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1437 b/tests/data/test1437
index 19ccece04..07346a9e8 100644
--- a/tests/data/test1437
+++ b/tests/data/test1437
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/1437 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1437 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1437 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="testuser", realm="testrealm", nonce="2", uri="/1437", response="4376eb639bf8e7343a6e7b56e1b89c4f", algorithm="MD5"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="testuser", realm="testrealm", nonce="2", uri="/1437", response="4376eb639bf8e7343a6e7b56e1b89c4f", algorithm=MD5
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1438 b/tests/data/test1438
index 8aaedb71e..14818829e 100644
--- a/tests/data/test1438
+++ b/tests/data/test1438
@@ -48,11 +48,9 @@ HTTP
<protocol>
GET /1438 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-<strip>
-^User-Agent:.*
-</strip>
</verify>
</testcase>
diff --git a/tests/data/test1439 b/tests/data/test1439
index cb906adbc..a76ccf002 100644
--- a/tests/data/test1439
+++ b/tests/data/test1439
@@ -26,7 +26,7 @@ http
</server>
<name>
-Check if %{scheme} returns HTTP
+Check if %{http_version} returns 1.1
</name>
<command>
http://%HOSTIP:%HTTPPORT/1439 --write-out '%{http_version}'
@@ -48,11 +48,9 @@ testdata
<protocol>
GET /1439 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-<strip>
-^User-Agent:.*
-</strip>
</verify>
</testcase>
diff --git a/tests/data/test1443 b/tests/data/test1443
index 696886706..7da739e54 100644
--- a/tests/data/test1443
+++ b/tests/data/test1443
@@ -52,12 +52,10 @@ perl -e 'exit((stat("log/1443"))[9] != 960898200)'
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1443 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1446 b/tests/data/test1446
index 96d634e1c..637df583f 100644
--- a/tests/data/test1446
+++ b/tests/data/test1446
@@ -24,7 +24,7 @@ perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test1446.dir
SFTP with --remote-time
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test1446.dir/rofile.txt --insecure --remote-time
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test1446.dir/rofile.txt --insecure --remote-time
</command>
<postcheck>
perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test1446.dir && \
diff --git a/tests/data/test1447 b/tests/data/test1447
index d1182942e..8a651f009 100644
--- a/tests/data/test1447
+++ b/tests/data/test1447
@@ -24,7 +24,7 @@ proxy
Provide illegal proxy name
</name>
<command>
---proxy "http://a:b@/x" http://%HOSTIP:%HTTPPORT
+--proxy "http://a:b@/x" http://%HOSTIP:%NOLISTENPORT
</command>
</client>
diff --git a/tests/data/test1448 b/tests/data/test1448
index e04f47bde..38c022756 100644
--- a/tests/data/test1448
+++ b/tests/data/test1448
@@ -17,7 +17,7 @@ HTTP/1.1 302 OK swsbounce
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 9
Content-Type: text/plain
-Location: http://åäö.se:8990/14480001
+Location: http://åäö.se:%HTTPPORT/14480001
redirect
</data>
@@ -41,7 +41,7 @@ http
idn
</features>
<setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
</setenv>
<precheck>
@@ -52,23 +52,22 @@ Redirect following to UTF-8 IDN host name
</name>
<command>
-http://åäö.se:%HTTPPORT/1448 --resolve xn--4cab6c.se:%HTTPPORT:%HOSTIP -L --connect-to %HOSTIP:8990:%HOSTIP:%HTTPPORT
+http://åäö.se:%HTTPPORT/1448 --resolve xn--4cab6c.se:%HTTPPORT:%HOSTIP -L --connect-to %HOSTIP:%HTTPPORT:%HOSTIP:%HTTPPORT
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1448 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /14480001 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1451 b/tests/data/test1451
index 0c114e186..9337b8b99 100644
--- a/tests/data/test1451
+++ b/tests/data/test1451
@@ -8,7 +8,9 @@ SMB
#
# Server-side
<reply>
-<data>Basic SMB test complete</data>
+<data nocheck="yes">
+Basic SMB test complete
+</data>
</reply>
#
@@ -20,17 +22,22 @@ smb
<features>
smb
</features>
- <name>
+<name>
Basic SMB request
- </name>
- <command>
+</name>
+<command>
-u 'curltest:curltest' smb://%HOSTIP:%SMBPORT/TESTS/1451
</command>
+<precheck>
+python -c "__import__('pkgutil').find_loader('impacket') or (__import__('sys').stdout.write('Test only works if Python package impacket is installed\n'), __import__('sys').exit(1))"
+</precheck>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<stdout>Basic SMB test complete</stdout>
+<stdout>
+Basic SMB test complete
+</stdout>
</verify>
</testcase>
diff --git a/tests/data/test1452 b/tests/data/test1452
index 76b0eba0c..6c76ef84a 100644
--- a/tests/data/test1452
+++ b/tests/data/test1452
@@ -3,7 +3,6 @@
<keywords>
TELNET
UPLOAD
-flaky
</keywords>
</info>
@@ -30,13 +29,15 @@ Basic TELNET negotiation
test1452
</stdin>
<command>
-telnet://%HOSTIP:%NEGTELNETPORT --upload-file -
+telnet://%HOSTIP:%TELNETPORT --upload-file -
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<stdout>test1452</stdout>
+<stdout nonewline="yes">
+test1452
+</stdout>
</verify>
</testcase>
diff --git a/tests/data/test1453 b/tests/data/test1453
index eaf9dd3b9..76b5acda4 100644
--- a/tests/data/test1453
+++ b/tests/data/test1453
@@ -23,7 +23,7 @@ tftp
Too long tftp filename
</name>
<command>
-tftp://%HOSTIP:%TFTPPORT/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz
+tftp://%HOSTIP:%NOLISTENPORT/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz
</command>
</client>
diff --git a/tests/data/test1455 b/tests/data/test1455
index cbe6fe22e..b8a864f81 100644
--- a/tests/data/test1455
+++ b/tests/data/test1455
@@ -37,7 +37,7 @@ http
HTTP GET when PROXY Protocol enabled
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1455 --haproxy-protocol
+http://%HOSTIP:%HTTPPORT/1455 --haproxy-protocol -H "Testno: 1455"
</command>
<features>
proxy
@@ -47,9 +47,6 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^PROXY TCP4 %CLIENTIP %HOSTIP (\d*) %HTTPPORT/proxy-line/
</strippart>
@@ -57,7 +54,9 @@ s/^PROXY TCP4 %CLIENTIP %HOSTIP (\d*) %HTTPPORT/proxy-line/
proxy-line
GET /1455 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
+Testno: 1455
</protocol>
</verify>
diff --git a/tests/data/test1456 b/tests/data/test1456
index 27d63f505..59e073918 100644
--- a/tests/data/test1456
+++ b/tests/data/test1456
@@ -40,7 +40,7 @@ http-ipv6
HTTP-IPv6 GET with PROXY protocol
</name>
<command>
--g "http://%HOST6IP:%HTTP6PORT/1456" --local-port 44444 --haproxy-protocol
+-g "http://%HOST6IP:%HTTP6PORT/1456" --haproxy-protocol
</command>
<features>
proxy
@@ -50,13 +50,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
+# Strip off the (random) local port number. This test used to use a fixed
+# local port number that frequently causes the test to fail
+<strippart>
+s/PROXY TCP6 ::1 ::1 (\d+) (\d+)/PROXY TCP6 ::1 ::1 $2/
+</strippart>
<protocol>
-PROXY TCP6 ::1 ::1 44444 %HTTP6PORT
+PROXY TCP6 ::1 ::1 %HTTP6PORT
GET /1456 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1457 b/tests/data/test1457
index 575748f46..ab447ac54 100644
--- a/tests/data/test1457
+++ b/tests/data/test1457
@@ -51,11 +51,9 @@ line2
<protocol>
GET /1457 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
-<strip>
-^User-Agent:.*
-</strip>
</verify>
</testcase>
diff --git a/tests/data/test1458 b/tests/data/test1458
index 072e43ce9..c4f25f57e 100644
--- a/tests/data/test1458
+++ b/tests/data/test1458
@@ -43,12 +43,10 @@ HTTP with wildcard --resolve
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1458 HTTP/1.1
Host: example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1459 b/tests/data/test1459
new file mode 100644
index 000000000..3e89595e4
--- /dev/null
+++ b/tests/data/test1459
@@ -0,0 +1,46 @@
+<testcase>
+<info>
+<keywords>
+SFTP
+known_hosts
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+sftp
+</server>
+<precheck>
+mkdir -p %PWD/log/test1459.dir/.ssh
+</precheck>
+<features>
+sftp
+</features>
+ <name>
+SFTP with corrupted known_hosts
+ </name>
+ <command>
+-u : sftp://%HOSTIP:%SSHPORT/ -l
+</command>
+<file name="log/test1459.dir/.ssh/known_hosts">
+|1|qy29Y1x/+/F39AzdG5515YSSw+c=|iB2WX5jrU3ZTWc+ZfGau7HHEvBc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAynDN8cDJ3xNzRjTNNGciSHSxpubxhZ6YnkLdp1TkrGW8n\
+R93Ey5VtBeBblYTRlFXBWJgKFcTKBRJ/O4qBZwbUgt10AHj31i6h8NehfT19tR8wG/YCmj3KtYLHmwdzmW1edEL9G2NdX2KiKYv7/zuly3QvmP0QA0NhWkAz0KdWNM=
+</file>
+<setenv>
+CURL_HOME=%PWD/log/test1459.dir
+</setenv>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+60
+</errorcode>
+<valgrind>
+disable
+</valgrind>
+</verify>
+</testcase>
+
diff --git a/tests/data/test1460 b/tests/data/test1460
new file mode 100644
index 000000000..1cc13353e
--- /dev/null
+++ b/tests/data/test1460
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+-J
+</keywords>
+</info>
+
+#
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 swsclose
+ 12345
+fooo
+54 3 2 1
+Content-Disposition: filename=name1460; charset=funny; option=strange
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+# this relies on the debug feature to allow us to set directory to store the
+# -J output in
+<features>
+debug
+</features>
+<server>
+http
+</server>
+<name>
+HTTP GET with -Ji and Content-Disposition with existing file
+</name>
+<setenv>
+CURL_TESTDIR=%PWD/log
+</setenv>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/1460 -Ji -O
+</command>
+<file name="log/name1460">
+initial content
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# Warning: --include and --remote-header-name cannot be combined.
+<errorcode>
+2
+</errorcode>
+<file name="log/name1460">
+initial content
+</file>
+
+</verify>
+</testcase>
diff --git a/tests/data/test1461 b/tests/data/test1461
new file mode 100644
index 000000000..4b8f6c410
--- /dev/null
+++ b/tests/data/test1461
@@ -0,0 +1,53 @@
+<testcase>
+<info>
+<keywords>
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+ <name>
+curl important --help
+ </name>
+ <command>
+--help
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+ -d, --data <data> HTTP POST data
+ -f, --fail Fail silently (no output at all) on HTTP errors
+ -h, --help <category> Get help for commands
+ -i, --include Include protocol response headers in the output
+ -o, --output <file> Write to file instead of stdout
+ -O, --remote-name Write output to a file named as the remote file
+ -s, --silent Silent mode
+ -T, --upload-file <file> Transfer local FILE to destination
+ -u, --user <user:password> Server user and password
+ -A, --user-agent <name> Send User-Agent <name> to server
+ -v, --verbose Make the operation more talkative
+ -V, --version Show version number and quit
+
+This is not the full help, this menu is stripped into categories.
+Use "--help category" to get an overview of all categories.
+For all options use the manual or "--help all".
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1462 b/tests/data/test1462
new file mode 100644
index 000000000..a9e7af0a6
--- /dev/null
+++ b/tests/data/test1462
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+ <name>
+curl invalid category --help
+ </name>
+ <command>
+--help sdfafdsfadsfsd
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+Invalid category provided, here is a list of all categories:
+
+ auth Different types of authentication methods
+ connection Low level networking operations
+ curl The command line tool itself
+ dns General DNS options
+ file FILE protocol options
+ ftp FTP protocol options
+ http HTTP and HTTPS protocol options
+ imap IMAP protocol options
+ misc Options that don't fit into any other category
+ output The output of curl
+ pop3 POP3 protocol options
+ post HTTP Post specific options
+ proxy All options related to proxies
+ scp SCP protocol options
+ sftp SFTP protocol options
+ smtp SMTP protocol options
+ ssh SSH protocol options
+ telnet TELNET protocol options
+ tftp TFTP protocol options
+ tls All TLS/SSL related options
+ upload All options for uploads
+ verbose Options related to any kind of command line output of curl
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1463 b/tests/data/test1463
new file mode 100644
index 000000000..7e1fe9b84
--- /dev/null
+++ b/tests/data/test1463
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+FILE
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+file
+</features>
+ <name>
+curl file category --help
+ </name>
+ <command>
+--help file
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+file: FILE protocol options
+ -I, --head Show document info only
+ -r, --range <range> Retrieve only the bytes within RANGE
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1464 b/tests/data/test1464
new file mode 100644
index 000000000..167e80d6d
--- /dev/null
+++ b/tests/data/test1464
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+FILE
+--help
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+file
+</features>
+ <name>
+curl file category --help with lower/upper mix
+ </name>
+ <command>
+--help fIlE
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<stdout mode="text">
+Usage: curl [options...] <url>
+file: FILE protocol options
+ -I, --head Show document info only
+ -r, --range <range> Retrieve only the bytes within RANGE
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test1465 b/tests/data/test1465
new file mode 100644
index 000000000..d1e553865
--- /dev/null
+++ b/tests/data/test1465
Binary files differ
diff --git a/tests/data/test15 b/tests/data/test15
index 3b1fa4369..a82fa0cf6 100644
--- a/tests/data/test15
+++ b/tests/data/test15
@@ -44,12 +44,10 @@ Content-Length: 26
Repeated nonsense-headers
http://%HOSTIP:%HTTPPORT/want/15 200 26
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/15 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test150 b/tests/data/test150
index f28be0464..2179163de 100644
--- a/tests/data/test150
+++ b/tests/data/test150
@@ -57,6 +57,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -82,20 +83,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /150 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /150 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1502 b/tests/data/test1502
index 4c084d644..9e7bcf257 100644
--- a/tests/data/test1502
+++ b/tests/data/test1502
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1502 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1502 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1503 b/tests/data/test1503
index 8665de60c..288639463 100644
--- a/tests/data/test1503
+++ b/tests/data/test1503
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1503 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1503 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1504 b/tests/data/test1504
index b8463c526..5ca66076e 100644
--- a/tests/data/test1504
+++ b/tests/data/test1504
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1504 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1504 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1505 b/tests/data/test1505
index c6e5a7ca1..14e1141d4 100644
--- a/tests/data/test1505
+++ b/tests/data/test1505
@@ -45,9 +45,6 @@ http://google.com:%HTTPPORT/1505 %HTTPPORT %HOSTIP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1505 HTTP/1.1
Host: google.com:%HTTPPORT
diff --git a/tests/data/test1508 b/tests/data/test1508
index b276b8b31..fbdc322a0 100644
--- a/tests/data/test1508
+++ b/tests/data/test1508
@@ -18,7 +18,7 @@ lib1508
Close a multi handle without using it
</name>
<command>
-http://%HOSTIP:%HTTPPORT/path/1508
+http://%HOSTIP:%NOLISTENPORT/path/1508
</command>
</client>
diff --git a/tests/data/test151 b/tests/data/test151
index 8f20d1d8b..03a55b4dc 100644
--- a/tests/data/test151
+++ b/tests/data/test151
@@ -34,13 +34,10 @@ http://%HOSTIP:%HTTPPORT/151
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /151 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test152 b/tests/data/test152
index 2cc521614..2c48b0379 100644
--- a/tests/data/test152
+++ b/tests/data/test152
@@ -35,13 +35,10 @@ http://%HOSTIP:%HTTPPORT/152 --fail
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /152 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1524 b/tests/data/test1524
new file mode 100644
index 000000000..349054020
--- /dev/null
+++ b/tests/data/test1524
@@ -0,0 +1,75 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+followlocation
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 303 OK swsclose
+Location: moo.html&testcase=/15240002
+Connection: close
+
+</data>
+<data2>
+HTTP/1.1 200 OK swsclose
+Location: this should be ignored
+Connection: close
+
+body
+</data2>
+<datacheck>
+HTTP/1.1 303 OK swsclose
+Location: moo.html&testcase=/15240002
+Connection: close
+
+HTTP/1.1 200 OK swsclose
+Location: this should be ignored
+Connection: close
+
+body
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP PUT with 303 redirect
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/blah/1524 -L -T log/upload1524.txt
+</command>
+<file name="log/upload1524.txt">
+moo
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+PUT /blah/1524 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 4
+Expect: 100-continue
+
+moo
+GET /blah/moo.html&testcase=/15240002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test153 b/tests/data/test153
index 77f7adb01..a582595ac 100644
--- a/tests/data/test153
+++ b/tests/data/test153
@@ -89,34 +89,34 @@ http://%HOSTIP:%HTTPPORT/1530001 -u testuser:testpass --digest http://%HOSTIP:%H
<verify>
<strip>
^Authorization.*cnonce
-^User-Agent:.*
</strip>
<protocol>
GET /1530001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /1530001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530001", response="f4f83139396995bac665f24a1f1055c7"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530002", response="f84511b014fdd0ba6494f42871079c32"
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="testuser", realm="testrealm", nonce="999999", uri="/1530002", cnonce="MTA4MzIy", nc="00000001", qop="auth", response="25291c357671604a16c0242f56721c07", algorithm="MD5"
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
+Authorization: Digest username="testuser", realm="testrealm", nonce="999999", uri="/1530002", cnonce="MTA4MzIy", nc="00000001", qop="auth", response="25291c357671604a16c0242f56721c07", algorithm=MD5
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1538 b/tests/data/test1538
index 9374debb7..03481d56e 100644
--- a/tests/data/test1538
+++ b/tests/data/test1538
@@ -127,7 +127,10 @@ e91: SSL server certificate status verification FAILED
e92: Stream error in the HTTP/2 framing layer
e93: API function called from within callback
e94: An authentication function returned an error
-e95: Unknown error
+e95: HTTP/3 error
+e96: QUIC connection error
+e97: proxy handshake error
+e98: Unknown error
m-1: Please call curl_multi_perform() soon
m0: No error
m1: Invalid multi handle
@@ -138,7 +141,9 @@ m5: Invalid socket argument
m6: Unknown option
m7: The easy handle is already added to a multi handle
m8: API function called from within callback
-m9: Unknown error
+m9: Wakeup is unavailable or failed
+m10: A libcurl function was given a bad argument
+m11: Unknown error
s0: No error
s1: Unknown share option
s2: Share currently in use
diff --git a/tests/data/test1539 b/tests/data/test1539
new file mode 100644
index 000000000..b8546f270
--- /dev/null
+++ b/tests/data/test1539
@@ -0,0 +1,43 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+Content-Length
+chunked Transfer-Encoding
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Sun, 19 Jan 2014 18:50:58 GMT
+Server: test-server/fake swsclose
+Connection: close
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib1539
+</tool>
+<name>
+HTTP 1.0 POST with read callback and unknown data size
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/1539
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+25
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test154 b/tests/data/test154
index 3d693f4b3..616051cbc 100644
--- a/tests/data/test154
+++ b/tests/data/test154
@@ -82,12 +82,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /154 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -95,7 +93,7 @@ Expect: 100-continue
PUT /154 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/154", response="b71551e12d1c456e47d8388ecb2edeca"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test155 b/tests/data/test155
index 0a2bb0fa2..6e19a4f26 100644
--- a/tests/data/test155
+++ b/tests/data/test155
@@ -76,6 +76,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -107,12 +108,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
@@ -120,13 +119,14 @@ Expect: 100-continue
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
PUT /155 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1550 b/tests/data/test1550
index b78756e9a..c305dd6f2 100644
--- a/tests/data/test1550
+++ b/tests/data/test1550
@@ -20,10 +20,10 @@ lib1550
</tool>
<name>
-verify setting pipeling blacklisting options
+verify setting pipeling blocklisting options
</name>
<command>
-http://%HOSTIP:%HTTPPORT/1550
+http://%HOSTIP:%NOLISTENPORT/1550
</command>
</client>
</testcase>
diff --git a/tests/data/test1551 b/tests/data/test1551
index 507266a85..c41a14643 100644
--- a/tests/data/test1551
+++ b/tests/data/test1551
@@ -47,9 +47,6 @@ http://%HOSTIP:%HTTPPORT/1551
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1551 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1554 b/tests/data/test1554
index be48e02eb..fffa6adb5 100644
--- a/tests/data/test1554
+++ b/tests/data/test1554
@@ -29,6 +29,12 @@ run 1: foobar and so on fun!
<- Mutex unlock
-> Mutex lock
<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
run 1: foobar and so on fun!
-> Mutex lock
<- Mutex unlock
@@ -38,6 +44,14 @@ run 1: foobar and so on fun!
<- Mutex unlock
-> Mutex lock
<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
run 1: foobar and so on fun!
-> Mutex lock
<- Mutex unlock
@@ -47,6 +61,14 @@ run 1: foobar and so on fun!
<- Mutex unlock
-> Mutex lock
<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
run 1: foobar and so on fun!
-> Mutex lock
<- Mutex unlock
@@ -54,6 +76,10 @@ run 1: foobar and so on fun!
<- Mutex unlock
-> Mutex lock
<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
</datacheck>
</reply>
diff --git a/tests/data/test1556 b/tests/data/test1556
index 0f99abd81..f64e76e99 100644
--- a/tests/data/test1556
+++ b/tests/data/test1556
@@ -20,7 +20,7 @@ Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes
-Long: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Long: %repeat[100001 x A]%
-foo-
</data>
@@ -46,9 +46,6 @@ http://%HOSTIP:%HTTPPORT/1556
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1556 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1558 b/tests/data/test1558
index 8436c0685..f1538c2a8 100644
--- a/tests/data/test1558
+++ b/tests/data/test1558
@@ -23,12 +23,8 @@ lib1558
<name>
CURLINFO_PROTOCOL for file:// transfer
</name>
-<setenv>
-# force MSYS2 to not convert the file: URL
-MSYS2_ARG_CONV_EXCL=file:
-</setenv>
<command>
-file:%FILE_PWD/log/data1558
+file://%FILE_PWD/log/data1558
</command>
<file name="log/data1558">
hello
diff --git a/tests/data/test156 b/tests/data/test156
index 098de218d..fafedc299 100644
--- a/tests/data/test156
+++ b/tests/data/test156
@@ -40,13 +40,10 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /156 HTTP/1.1
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test1560 b/tests/data/test1560
index a0e603bfc..0a132a1c1 100644
--- a/tests/data/test1560
+++ b/tests/data/test1560
@@ -22,6 +22,7 @@ imap
ldap
dict
ftp
+ipv6
</features>
<name>
URL API
diff --git a/tests/data/test1561 b/tests/data/test1561
index 69352fda2..bfdb439df 100644
--- a/tests/data/test1561
+++ b/tests/data/test1561
@@ -73,18 +73,15 @@ Cookies set over HTTP can't override secure ones
</command>
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /15610001 HTTP/1.1
Host: www.example.com
-User-Agent: curl/7.62.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
GET /15610002 HTTP/1.1
Host: www.example.com
-User-Agent: curl/7.62.0-DEV
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1562 b/tests/data/test1562
index 59cb9ccba..af29f54bc 100644
--- a/tests/data/test1562
+++ b/tests/data/test1562
@@ -48,21 +48,21 @@ Expire secure cookies over HTTPS
</command>
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /15620001 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
GET /15620002 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: foo=123
GET /15620001 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1563 b/tests/data/test1563
index a3597b9b5..7d88ddc68 100644
--- a/tests/data/test1563
+++ b/tests/data/test1563
@@ -33,15 +33,13 @@ http://%HOSTIP:%HTTPPORT/15630001 -L -H "Host: www.example.com"
</command>
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
1
</errorcode>
<protocol>
GET /15630001 HTTP/1.1
Host: www.example.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1564 b/tests/data/test1564
new file mode 100644
index 000000000..279665bd1
--- /dev/null
+++ b/tests/data/test1564
@@ -0,0 +1,31 @@
+<testcase>
+<info>
+<keywords>
+multi
+wakeup
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<tool>
+lib1564
+</tool>
+<name>
+wakeup before poll with no easy handles
+</name>
+<command>
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1541 b/tests/data/test1565
index e18bb47df..f554e0f34 100644
--- a/tests/data/test1541
+++ b/tests/data/test1565
@@ -3,13 +3,20 @@
<keywords>
HTTP
HTTP GET
+multi
multi-threaded
-connection-sharing
+wakeup
</keywords>
</info>
# Server-side
<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Content-Length: 3
+
+OK
+</data>
</reply>
# Client-side
@@ -18,12 +25,12 @@ connection-sharing
http
</server>
<tool>
-lib1541
+lib1565
</tool>
- <name>
-connection sharing using 67 parallel threads for 7 seconds
- </name>
- <command>
+<name>
+wakeup from another thread
+</name>
+<command>
http://%HOSTIP:%HTTPPORT/1
</command>
</client>
diff --git a/tests/data/test1566 b/tests/data/test1566
new file mode 100644
index 000000000..90cb40a5e
--- /dev/null
+++ b/tests/data/test1566
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+--etag-compare
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 304 Not modified
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Connection: close
+Content-Type: text/html
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+--etag-compare that gets a 304 back shouldn't overwrite the file
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/1566 -o log/output1566 --etag-compare log/etag1566
+</command>
+<file name="log/etag1566">
+"123456"
+</file>
+<file1 name="log/output1566">
+downloaded already
+</file1>
+
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1566 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+If-None-Match: "123456"
+
+</protocol>
+
+# verify that the target file is untouched
+<file name="log/output1566">
+downloaded already
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1567 b/tests/data/test1567
new file mode 100644
index 000000000..ff779df08
--- /dev/null
+++ b/tests/data/test1567
@@ -0,0 +1,70 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+URL API
+CURLOPT_CURLU
+CURLOPT_FOLLOWLOCATION
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 302 OK
+Content-Length: 6
+Location: /15670002
+
+-foo-
+</data>
+<data2>
+HTTP/1.1 200 OK
+Content-Length: 11
+
+redirected
+</data2>
+<datacheck>
+redirected
+redirected
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib1567
+</tool>
+
+ <name>
+re-run redirected transfer without setting CURLU URL again
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1567
+</command>
+</client>
+
+<verify>
+<protocol>
+GET /1567 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /15670002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /1567 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /15670002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test157 b/tests/data/test157
index 77700f6ad..fee7a6a44 100644
--- a/tests/data/test157
+++ b/tests/data/test157
@@ -34,12 +34,10 @@ http://%HOSTIP:%HTTPPORT/157 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /157 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test158 b/tests/data/test158
index dca51b163..238399a05 100644
--- a/tests/data/test158
+++ b/tests/data/test158
@@ -31,14 +31,13 @@ http://%HOSTIP:%HTTPPORT/158 -F name=daniel
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^Content-Type: multipart/form-data.*
^-----------------------.*
</strip>
<protocol>
POST /158 HTTP/1.1
-User-Agent: curl/7.11.2-CVS (i686-pc-linux-gnu) libcurl/7.11.2-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 145
Content-Type: multipart/form-data; boundary=----------------------------4f12fcdaa3bc
diff --git a/tests/data/test159 b/tests/data/test159
index 5a062176e..bb94583bd 100644
--- a/tests/data/test159
+++ b/tests/data/test159
@@ -43,6 +43,7 @@ This is not the real page either!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -68,14 +69,11 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /159 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1591 b/tests/data/test1591
index 526933a0e..ce0c2687a 100644
--- a/tests/data/test1591
+++ b/tests/data/test1591
@@ -40,9 +40,6 @@ more than one byte
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /bzz/1591 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1593 b/tests/data/test1593
index 405aa84e5..6719a3261 100644
--- a/tests/data/test1593
+++ b/tests/data/test1593
@@ -35,9 +35,6 @@ http://%HOSTIP:%HTTPPORT/1593
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
# Note here the lack of If-Modified-Since
<protocol>
GET /1593 HTTP/1.1
diff --git a/tests/data/test1594 b/tests/data/test1594
index 4907ca2be..f29fdd687 100644
--- a/tests/data/test1594
+++ b/tests/data/test1594
@@ -36,9 +36,6 @@ http://%HOSTIP:%HTTPPORT/1594
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1594 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1595 b/tests/data/test1595
index 29b2b865f..0216788e0 100644
--- a/tests/data/test1595
+++ b/tests/data/test1595
@@ -35,9 +35,6 @@ http://%HOSTIP:%HTTPPORT/1595
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1595 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1596 b/tests/data/test1596
index 77a10f08a..62ceab4b8 100644
--- a/tests/data/test1596
+++ b/tests/data/test1596
@@ -36,9 +36,6 @@ http://%HOSTIP:%HTTPPORT/1596
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1596 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test16 b/tests/data/test16
index 399aa9420..f8510adcf 100644
--- a/tests/data/test16
+++ b/tests/data/test16
@@ -40,13 +40,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/16 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZUB1c2VyOmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZw==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test160 b/tests/data/test160
index df80aef97..4b1c5eddc 100644
--- a/tests/data/test160
+++ b/tests/data/test160
@@ -56,16 +56,15 @@ Connection: close
surprise2
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/160 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /wantmore/1600001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1600 b/tests/data/test1600
index 88040747a..33413d7c3 100644
--- a/tests/data/test1600
+++ b/tests/data/test1600
@@ -19,9 +19,5 @@ NTLM
<name>
NTLM unit tests
</name>
-<tool>
-unit1600
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1601 b/tests/data/test1601
index 125493bb0..2065fdd1d 100644
--- a/tests/data/test1601
+++ b/tests/data/test1601
@@ -18,9 +18,5 @@ unittest
<name>
MD5 unit tests
</name>
-<tool>
-unit1601
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1602 b/tests/data/test1602
index 4717058ce..56e243ff8 100644
--- a/tests/data/test1602
+++ b/tests/data/test1602
@@ -18,9 +18,5 @@ unittest
<name>
Internal hash create/add/destroy testing, exercising clean functions
</name>
-<tool>
-unit1602
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1603 b/tests/data/test1603
index 805c9e378..406d197ee 100644
--- a/tests/data/test1603
+++ b/tests/data/test1603
@@ -18,9 +18,5 @@ unittest
<name>
Internal hash add, retrieval, deletion testing
</name>
-<tool>
-unit1603
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1604 b/tests/data/test1604
index cf207750d..39daf9ddc 100644
--- a/tests/data/test1604
+++ b/tests/data/test1604
@@ -17,9 +17,5 @@ unittest
<name>
Test WIN32/MSDOS filename sanitization
</name>
-<tool>
-unit1604
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1605 b/tests/data/test1605
index 09ef66942..a123b01a1 100644
--- a/tests/data/test1605
+++ b/tests/data/test1605
@@ -17,9 +17,5 @@ unittest
<name>
Test negative data lengths as input to libcurl functions
</name>
-<tool>
-unit1605
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1606 b/tests/data/test1606
index 15488d407..83e984427 100644
--- a/tests/data/test1606
+++ b/tests/data/test1606
@@ -18,9 +18,5 @@ unittest
<name>
verify speedcheck
</name>
-<tool>
-unit1606
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1607 b/tests/data/test1607
index 9628324e4..6d28d6eb4 100644
--- a/tests/data/test1607
+++ b/tests/data/test1607
@@ -18,9 +18,5 @@ unittest
<name>
CURLOPT_RESOLVE parsing
</name>
-<tool>
-unit1607
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1608 b/tests/data/test1608
index 702310757..fbc623895 100644
--- a/tests/data/test1608
+++ b/tests/data/test1608
@@ -18,9 +18,5 @@ unittest
<name>
verify DNS shuffling
</name>
-<tool>
-unit1608
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1609 b/tests/data/test1609
index c1b7c7a11..6d28d6eb4 100644
--- a/tests/data/test1609
+++ b/tests/data/test1609
@@ -18,9 +18,5 @@ unittest
<name>
CURLOPT_RESOLVE parsing
</name>
-<tool>
-unit1609
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1610 b/tests/data/test1610
new file mode 100644
index 000000000..fff973371
--- /dev/null
+++ b/tests/data/test1610
@@ -0,0 +1,22 @@
+<testcase>
+<info>
+<keywords>
+unittest
+SHA256
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+ <name>
+SHA256 unit tests
+ </name>
+</client>
+</testcase>
diff --git a/tests/data/test1611 b/tests/data/test1611
new file mode 100644
index 000000000..008aea7ec
--- /dev/null
+++ b/tests/data/test1611
@@ -0,0 +1,22 @@
+<testcase>
+<info>
+<keywords>
+unittest
+MD4
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+ <name>
+MD4 unit tests
+ </name>
+</client>
+</testcase>
diff --git a/tests/data/test1612 b/tests/data/test1612
new file mode 100644
index 000000000..3e92b6791
--- /dev/null
+++ b/tests/data/test1612
@@ -0,0 +1,22 @@
+<testcase>
+<info>
+<keywords>
+unittest
+HMAC
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+<features>
+unittest
+</features>
+ <name>
+HMAC unit tests
+ </name>
+</client>
+</testcase>
diff --git a/tests/data/test162 b/tests/data/test162
index 099641a87..d15474585 100644
--- a/tests/data/test162
+++ b/tests/data/test162
@@ -27,6 +27,7 @@ isn't because there's no Proxy-Authorization: NTLM header
<client>
<features>
NTLM
+SSL
!SSPI
proxy
</features>
@@ -43,14 +44,11 @@ http://%HOSTIP:%HTTPPORT/162 --proxy http://%HOSTIP:%HTTPPORT --proxy-user foo:b
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/162 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1620 b/tests/data/test1620
index 83b08c7a8..038bbcc1b 100644
--- a/tests/data/test1620
+++ b/tests/data/test1620
@@ -18,9 +18,5 @@ unittest
<name>
unit tests for url.c
</name>
-<tool>
-unit1620
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1621 b/tests/data/test1621
index 1117d1bd2..62c81052f 100644
--- a/tests/data/test1621
+++ b/tests/data/test1621
@@ -19,9 +19,5 @@ https
<name>
unit tests for stripcredentials from URL
</name>
-<tool>
-unit1621
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test163 b/tests/data/test163
index b4e2d260f..e4f720612 100644
--- a/tests/data/test163
+++ b/tests/data/test163
@@ -46,12 +46,12 @@ yes please
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/163 HTTP/1.1
-User-Agent: curl/7.11.2-CVS (i686-pc-linux-gnu) libcurl/7.11.2-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.0.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 304
Content-Type: multipart/form-data; boundary=----------------------------c2d1767eb6ac
diff --git a/tests/data/test1630 b/tests/data/test1630
new file mode 100644
index 000000000..7bf406636
--- /dev/null
+++ b/tests/data/test1630
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTPS-proxy
+HTTPS-proxy Basic auth
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 22
+
+the content goes here
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+https-proxy
+</server>
+ <name>
+HTTPS-proxy with Basic auth to HTTP without auth
+ </name>
+ <command>
+ -U fake@user:loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong -x https://%HOSTIP:%HTTPSPROXYPORT http://we.want.that.site.com/1630 --proxy-insecure
+</command>
+<features>
+proxy
+</features>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<proxy>
+GET http://we.want.that.site.com/1630 HTTP/1.1
+Host: we.want.that.site.com
+Proxy-Authorization: Basic ZmFrZUB1c2VyOmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZw==
+User-Agent: curl/%VERSION
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</proxy>
+</verify>
+</testcase>
diff --git a/tests/data/test1631 b/tests/data/test1631
new file mode 100644
index 000000000..be4a24a31
--- /dev/null
+++ b/tests/data/test1631
@@ -0,0 +1,86 @@
+<testcase>
+<info>
+<keywords>
+FTP
+HTTPS-proxy
+</keywords>
+</info>
+
+# Server-side
+<reply>
+
+# This is the HTTPS proxy response
+<connect>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 0
+
+</connect>
+
+# This is the FTP server response. The Life and Adventures of Robinson Crusoe
+<data>
+I was born in the year 1632, in the city of York, of a good family, though not
+of that country, myfather being a foreigner of Bremen, who settled first at
+Hull. He got a good estate by merchandise,and leaving off his trade, lived
+afterwards at York, from whence he had married my mother, whoserelations were
+named Robinson, a very good family in that country, and from whom I was
+calledRobinson Kreutznaer; but, by the usual corruption of words in England,
+we are now called—nay wecall ourselves and write our name—Crusoe; and so my
+companions always called me.
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+https-proxy
+</server>
+ <name>
+FTP through HTTPS-proxy
+ </name>
+ <command>
+-p -x https://%HOSTIP:%HTTPSPROXYPORT ftp://ftp.site.thru.https.proxy:%FTPPORT/1631 --proxy-insecure
+</command>
+<features>
+http
+proxy
+</features>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+
+# The second CONNECT will be made to the dynamic port number the FTP server
+# opens for us, so we can't compare with a known pre-existing number!
+<strippart>
+s/((https.proxy):(\d+))/$2:12345/
+s/^(User-Agent: curl).*/$1/
+</strippart>
+<proxy>
+CONNECT ftp.site.thru.https.proxy:12345 HTTP/1.1
+Host: ftp.site.thru.https.proxy:12345
+User-Agent: curl
+Proxy-Connection: Keep-Alive
+
+CONNECT ftp.site.thru.https.proxy:12345 HTTP/1.1
+Host: ftp.site.thru.https.proxy:12345
+User-Agent: curl
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+SIZE 1631
+RETR 1631
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1632 b/tests/data/test1632
new file mode 100644
index 000000000..296137bff
--- /dev/null
+++ b/tests/data/test1632
@@ -0,0 +1,104 @@
+<testcase>
+<info>
+<keywords>
+FTP
+HTTPS-proxy
+</keywords>
+</info>
+
+# Server-side
+<reply>
+
+# This is the HTTPS proxy response
+<connect>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes
+Content-Length: 0
+
+</connect>
+
+# This is the FTP server response. The Life and Adventures of Robinson Crusoe
+<data>
+I was born in the year 1632, in the city of York, of a good family, though not
+of that country, myfather being a foreigner of Bremen, who settled first at
+Hull. He got a good estate by merchandise,and leaving off his trade, lived
+afterwards at York, from whence he had married my mother, whoserelations were
+named Robinson, a very good family in that country, and from whom I was
+calledRobinson Kreutznaer; but, by the usual corruption of words in England,
+we are now called—nay wecall ourselves and write our name—Crusoe; and so my
+companions always called me.
+</data>
+
+<data2>
+I had two elder brothers, one of whom was lieutenant-colonel to an
+English regiment of foot inFlanders, formerly commanded by the famous Colonel
+Lockhart, and was killed at the battle nearDunkirk against the Spaniards.
+What became of my second brother I never knew, any more thanmy father or
+mother knew what became of me.
+</data2>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+https-proxy
+</server>
+ <name>
+FTP through HTTPS-proxy, with connection re-use
+ </name>
+ <command>
+-p -x https://%HOSTIP:%HTTPSPROXYPORT ftp://ftp.site.thru.https.proxy:%FTPPORT/1632 --proxy-insecure ftp://ftp.site.thru.https.proxy:%FTPPORT/16320002
+</command>
+<features>
+http
+proxy
+</features>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+
+# The second and third CONNECT will be made to the dynamic port number the FTP
+# server opens for us, so we can't compare with known pre-existing numbers!
+
+<strippart>
+s/((https.proxy):(\d+))/$2:12345/
+s/^(User-Agent: curl).*/$1/
+</strippart>
+<proxy>
+CONNECT ftp.site.thru.https.proxy:12345 HTTP/1.1
+Host: ftp.site.thru.https.proxy:12345
+User-Agent: curl
+Proxy-Connection: Keep-Alive
+
+CONNECT ftp.site.thru.https.proxy:12345 HTTP/1.1
+Host: ftp.site.thru.https.proxy:12345
+User-Agent: curl
+Proxy-Connection: Keep-Alive
+
+CONNECT ftp.site.thru.https.proxy:12345 HTTP/1.1
+Host: ftp.site.thru.https.proxy:12345
+User-Agent: curl
+Proxy-Connection: Keep-Alive
+
+</proxy>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+SIZE 1632
+RETR 1632
+EPSV
+SIZE 16320002
+RETR 16320002
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1633 b/tests/data/test1633
new file mode 100644
index 000000000..6b6e1eb9f
--- /dev/null
+++ b/tests/data/test1633
@@ -0,0 +1,98 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 301 OK
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Location: /16330002
+
+</data>
+<data2>
+HTTP/1.1 429 too many requests
+Retry-After: 1
+Content-Length: 0
+Connection: close
+
+</data2>
+
+<datacheck>
+HTTP/1.1 301 OK
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Location: /16330002
+
+HTTP/1.1 429 too many requests
+Retry-After: 1
+Content-Length: 0
+Connection: close
+
+HTTP/1.1 301 OK
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Location: /16330002
+
+HTTP/1.1 429 too many requests
+Retry-After: 1
+Content-Length: 0
+Connection: close
+
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/1633 -d moo --retry 1 -L
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+POST /1633 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 3
+Content-Type: application/x-www-form-urlencoded
+
+mooGET /16330002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+POST /1633 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 3
+Content-Type: application/x-www-form-urlencoded
+
+mooGET /16330002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test164 b/tests/data/test164
index 9240611dd..97e2c5eac 100644
--- a/tests/data/test164
+++ b/tests/data/test164
@@ -54,13 +54,11 @@ http://%HOSTIP:%HTTPPORT/want/164 -r 0-10,12-15
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/164 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=0-10,12-15
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test165 b/tests/data/test165
index 9009425aa..355394272 100644
--- a/tests/data/test165
+++ b/tests/data/test165
@@ -32,7 +32,7 @@ idn
proxy
</features>
<setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
</setenv>
<precheck>
@@ -49,17 +49,16 @@ http://www.åäö.se/page/165 -x %HOSTIP:%HTTPPORT http://www.große.de/page/165
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://www.xn--4cab6c.se/page/165 HTTP/1.1
Host: www.xn--4cab6c.se
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://www.xn--groe-xna.de/page/165 HTTP/1.1
Host: www.xn--groe-xna.de
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test1650 b/tests/data/test1650
index 13ca023e0..6248b9814 100644
--- a/tests/data/test1650
+++ b/tests/data/test1650
@@ -14,14 +14,10 @@ none
</server>
<features>
unittest
-http/2
+DoH
</features>
<name>
DOH
</name>
-<tool>
-unit1650
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1651 b/tests/data/test1651
index 28a9b714c..d29974bf2 100644
--- a/tests/data/test1651
+++ b/tests/data/test1651
@@ -18,9 +18,5 @@ unittest
<name>
x509 parsing
</name>
-<tool>
-unit1651
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test1652 b/tests/data/test1652
index c41169019..678d19517 100644
--- a/tests/data/test1652
+++ b/tests/data/test1652
@@ -16,8 +16,5 @@ unittest
<name>
infof
</name>
-<tool>
-unit1652
-</tool>
</client>
</testcase>
diff --git a/tests/data/test1653 b/tests/data/test1653
index 0de2c14b5..59ec3f396 100644
--- a/tests/data/test1653
+++ b/tests/data/test1653
@@ -16,8 +16,5 @@ unittest
<name>
urlapi
</name>
-<tool>
-unit1653
-</tool>
</client>
</testcase>
diff --git a/tests/data/test1654 b/tests/data/test1654
index 6a82daa08..6155635ab 100644
--- a/tests/data/test1654
+++ b/tests/data/test1654
@@ -26,9 +26,6 @@ alt-svc
<command>
log/1654
</command>
-<tool>
-unit1654
-</tool>
<file name="log/1654" mode="text">
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
# a comment
diff --git a/tests/data/test1655 b/tests/data/test1655
index 0c10bedf4..e161fb662 100644
--- a/tests/data/test1655
+++ b/tests/data/test1655
@@ -14,13 +14,10 @@ none
</server>
<features>
unittest
+DoH
</features>
<name>
unit test for doh_encode
</name>
-<tool>
-unit1655
-</tool>
</client>
-
</testcase>
diff --git a/tests/data/test166 b/tests/data/test166
index f170752e6..697a2452a 100644
--- a/tests/data/test166
+++ b/tests/data/test166
@@ -38,12 +38,12 @@ data inside the file
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/166 HTTP/1.1
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 223
Content-Type: multipart/form-data; boundary=----------------------------b0b3d6d23991
diff --git a/tests/data/test167 b/tests/data/test167
index e08555ecc..5067e779a 100644
--- a/tests/data/test167
+++ b/tests/data/test167
@@ -57,14 +57,11 @@ http://data.from.server.requiring.digest.hohoho.com/167 --proxy http://%HOSTIP:%
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/167 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Basic Zm9vOmJhcg==
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -72,7 +69,7 @@ GET http://data.from.server.requiring.digest.hohoho.com/167 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Basic Zm9vOmJhcg==
Authorization: Digest username="digest", realm="weirdorealm", nonce="12345", uri="/167", response="13c7c02a252cbe1c46d8669898a3be26"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test168 b/tests/data/test168
index fb8762044..ddad8bb77 100644
--- a/tests/data/test168
+++ b/tests/data/test168
@@ -71,20 +71,17 @@ http://data.from.server.requiring.digest.hohoho.com/168 --proxy http://%HOSTIP:%
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/168 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/168 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/168", response="fb8608e00ad9239a3dedb14bc8575976"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -92,7 +89,7 @@ GET http://data.from.server.requiring.digest.hohoho.com/168 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/168", response="fb8608e00ad9239a3dedb14bc8575976"
Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/168", response="ca87f2d768a231e2d637a55698d5c416"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test169 b/tests/data/test169
index 8013bcc17..6d30b2ade 100644
--- a/tests/data/test169
+++ b/tests/data/test169
@@ -77,6 +77,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -100,28 +101,25 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/169 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Authorization: Digest username="digest", realm="r e a l m", nonce="abcdef", uri="/169", response="95d48591985a03c4b49cb962aa7bd3e6"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test170 b/tests/data/test170
index 49d595bbc..58c2a3fe1 100644
--- a/tests/data/test170
+++ b/tests/data/test170
@@ -19,6 +19,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
proxy
</features>
@@ -32,14 +33,11 @@ http://a.galaxy.far.far.away/170 --proxy http://%HOSTIP:%HTTPPORT --proxy-user f
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://a.galaxy.far.far.away/170 HTTP/1.1
Host: a.galaxy.far.far.away
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
diff --git a/tests/data/test1700 b/tests/data/test1700
index 9ab46c9cd..ff1e2724f 100644
--- a/tests/data/test1700
+++ b/tests/data/test1700
@@ -54,17 +54,18 @@ http://%HOSTIP:%HTTP2PORT/1700 --http2 http://%HOSTIP:%HTTP2PORT/17000001
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^X-Forwarded-Proto:.*
^Via:.*
</strip>
<protocol>
GET /1700 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
GET /17000001 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1701 b/tests/data/test1701
index 494328877..d89861734 100644
--- a/tests/data/test1701
+++ b/tests/data/test1701
@@ -45,13 +45,13 @@ http://%HOSTIP:%HTTP2PORT/1701 --http2 -d "datatosend"
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^X-Forwarded-Proto:.*
^Via:.*
</strip>
<protocol nonewline="yes">
POST /1701 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test1702 b/tests/data/test1702
index 903a737c9..15757674d 100644
--- a/tests/data/test1702
+++ b/tests/data/test1702
@@ -44,13 +44,13 @@ http://%HOSTIP:%HTTP2PORT/1702 --http2 --head
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^X-Forwarded-Proto:.*
^Via:.*
</strip>
<protocol>
HEAD /1702 HTTP/1.1
Host: %HOSTIP:%HTTP2PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test171 b/tests/data/test171
index 482c0b7e2..d6a823033 100644
--- a/tests/data/test171
+++ b/tests/data/test171
@@ -40,12 +40,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://z.x.com/171 HTTP/1.1
Host: z.x.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test172 b/tests/data/test172
index ad3628429..dda8a38cf 100644
--- a/tests/data/test172
+++ b/tests/data/test172
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/we/want/172 -b log/jar172.txt -b "tool=curl; name=fool"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/172 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: nodomain=value; partmatch=present; tool=curl; name=fool
diff --git a/tests/data/test173 b/tests/data/test173
index 865ef7ba2..1484cbe03 100644
--- a/tests/data/test173
+++ b/tests/data/test173
@@ -46,12 +46,12 @@ line8
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/173 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 360
Content-Type: multipart/form-data; boundary=----------------------------5dbea401cd8c
diff --git a/tests/data/test174 b/tests/data/test174
index 9767f2f52..e5a9d6fcb 100644
--- a/tests/data/test174
+++ b/tests/data/test174
@@ -35,13 +35,10 @@ http://%HOSTIP:%HTTPPORT/174 -u testuser:testpass --anyauth -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /174 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test175 b/tests/data/test175
index 9e005f1f5..8b49a32b5 100644
--- a/tests/data/test175
+++ b/tests/data/test175
@@ -62,20 +62,17 @@ http://%HOSTIP:%HTTPPORT/175 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /175 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /175 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test176 b/tests/data/test176
index 73c53ca87..5fe310fac 100644
--- a/tests/data/test176
+++ b/tests/data/test176
@@ -48,6 +48,7 @@ content for you
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -63,21 +64,18 @@ http://%HOSTIP:%HTTPPORT/176 -u auser:apasswd --ntlm -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /176 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /176 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test177 b/tests/data/test177
index 495dea9b4..e31f1b7fa 100644
--- a/tests/data/test177
+++ b/tests/data/test177
@@ -38,13 +38,10 @@ http://%HOSTIP:%HTTPPORT/177 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /177 HTTP/1.1
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test178 b/tests/data/test178
index d22d8149f..b67e353ac 100644
--- a/tests/data/test178
+++ b/tests/data/test178
@@ -41,12 +41,10 @@ http://%HOSTIP:%HTTPPORT/178
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /178 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test179 b/tests/data/test179
index 3a94c00ba..9f7bdedcf 100644
--- a/tests/data/test179
+++ b/tests/data/test179
@@ -45,12 +45,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://supertrooper.fake/c/179 HTTP/1.1
Host: supertrooper.fake
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: moo2=indeed
diff --git a/tests/data/test18 b/tests/data/test18
index e1d76398c..0fe92f79b 100644
--- a/tests/data/test18
+++ b/tests/data/test18
@@ -47,23 +47,20 @@ multiple requests using {} in URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /18 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /180002 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /180003 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test180 b/tests/data/test180
index 0b2ca0373..1074e267c 100644
--- a/tests/data/test180
+++ b/tests/data/test180
@@ -44,12 +44,10 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/180 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 78
diff --git a/tests/data/test1800 b/tests/data/test1800
index 011018400..89f4292b3 100644
--- a/tests/data/test1800
+++ b/tests/data/test1800
@@ -39,16 +39,14 @@ http://%HOSTIP:%HTTPPORT/1800 --http2
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1800 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: %H2CVER
-HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
+HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA
</protocol>
</verify>
diff --git a/tests/data/test1801 b/tests/data/test1801
index b827ab51e..15367d221 100644
--- a/tests/data/test1801
+++ b/tests/data/test1801
@@ -49,12 +49,10 @@ http://%HOSTIP:%HTTPPORT/1801 --http2
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1801 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: %H2CVER
diff --git a/tests/data/test181 b/tests/data/test181
index b6b55cb99..c2f813579 100644
--- a/tests/data/test181
+++ b/tests/data/test181
@@ -44,12 +44,10 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /we/want/181 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 79
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test183 b/tests/data/test183
index cf992a26f..d72081c47 100644
--- a/tests/data/test183
+++ b/tests/data/test183
@@ -37,19 +37,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://deathstar.another.galaxy/183 HTTP/1.1
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
Host: deathstar.another.galaxy
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://a.galaxy.far.far.away/183 HTTP/1.1
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
Host: a.galaxy.far.far.away
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test184 b/tests/data/test184
index 42e652e3b..1afb10df8 100644
--- a/tests/data/test184
+++ b/tests/data/test184
@@ -57,18 +57,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://deathstar.another.galaxy/184 HTTP/1.1
Host: another.visitor.stay.a.while.stay.foreeeeeever
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://yet.another.host/184 HTTP/1.1
Host: yet.another.host
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test185 b/tests/data/test185
index 3bc58a041..ba48fd87b 100644
--- a/tests/data/test185
+++ b/tests/data/test185
@@ -57,18 +57,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://deathstar.another.galaxy/185 HTTP/1.1
Host: another.visitor.stay.a.while.stay.foreeeeeever
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.6b zlib/1.1.4 libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://deathstar.another.galaxy/go/west/185 HTTP/1.1
Host: another.visitor.stay.a.while.stay.foreeeeeever
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test186 b/tests/data/test186
index 4abc74a2b..f5a75c6fd 100644
--- a/tests/data/test186
+++ b/tests/data/test186
@@ -36,12 +36,12 @@ http://%HOSTIP:%HTTPPORT/we/want/186 -F "name=daniel;type=moo/foo" -F "html= <bo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/186 HTTP/1.1
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.1 c-ares/1.2.0 libidn/0.5.2
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 320
Content-Type: multipart/form-data; boundary=----------------------------212d9006ceb5
diff --git a/tests/data/test187 b/tests/data/test187
index b82a6c60e..a18654122 100644
--- a/tests/data/test187
+++ b/tests/data/test187
@@ -60,16 +60,15 @@ http://%HOSTIP:%HTTPPORT?oh=what-weird=test/187 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?oh=what-weird=test/187 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /root/1870002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test188 b/tests/data/test188
index d8ca1cd47..14e95c8e8 100644
--- a/tests/data/test188
+++ b/tests/data/test188
@@ -57,20 +57,17 @@ http://%HOSTIP:%HTTPPORT/188 -C 50 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /188 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.6 (sparc-sun-solaris2.7) libcurl 7.6-pre4 (SSL 0.9.6) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
GET /188 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.2 libidn/0.5.2
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test189 b/tests/data/test189
index 65780f804..3435a52be 100644
--- a/tests/data/test189
+++ b/tests/data/test189
@@ -51,20 +51,17 @@ http://%HOSTIP:%HTTPPORT/189 -C 50 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /189 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.6 (sparc-sun-solaris2.7) libcurl 7.6-pre4 (SSL 0.9.6) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
GET /189 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=50-
-User-Agent: curl/7.12.2-CVS (i686-pc-linux-gnu) libcurl/7.12.2-CVS OpenSSL/0.9.7d zlib/1.2.1.2 libidn/0.5.2
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test19 b/tests/data/test19
index 8e1bf5eb4..f053baf08 100644
--- a/tests/data/test19
+++ b/tests/data/test19
@@ -24,7 +24,7 @@ http
attempt connect to non-listening socket
</name>
<command>
-%HOSTIP:2
+%HOSTIP:%NOLISTENPORT
</command>
</client>
diff --git a/tests/data/test1900 b/tests/data/test1900
deleted file mode 100644
index 2e3c93a0d..000000000
--- a/tests/data/test1900
+++ /dev/null
@@ -1,61 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 4 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-Handle 1 Completed with status 0
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1900.txt
-</command>
-<file name="log/urls1900.txt">
-0 1k.txt
-1000 100k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1901 b/tests/data/test1901
deleted file mode 100644
index 83cdf7290..000000000
--- a/tests/data/test1901
+++ /dev/null
@@ -1,63 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-flaky
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-Handle 4 Completed with status 0
-Handle 1 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining, blacklisted site
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1901.txt
-</command>
-<file name="log/urls1901.txt">
-blacklist_site 127.0.0.1:%HTTPPIPEPORT
-0 1k.txt
-1000 100k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-0 1k.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1902 b/tests/data/test1902
deleted file mode 100644
index 3c999316b..000000000
--- a/tests/data/test1902
+++ /dev/null
@@ -1,62 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-flaky
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 1 Completed with status 0
-Handle 4 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining, broken pipe
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1902.txt
-</command>
-<file name="log/urls1902.txt">
-0 1k.txt
-1000 connection_close.txt
-1 1k.txt
-2 1k.txt
-3 1k.txt
-4 1k.txt
-5 1k.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1903 b/tests/data/test1903
deleted file mode 100644
index 219ffe11c..000000000
--- a/tests/data/test1903
+++ /dev/null
@@ -1,62 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-flaky
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data>
-Adding handle 0
-Handle 0 Completed with status 0
-Adding handle 1
-Adding handle 2
-Adding handle 3
-Adding handle 4
-Adding handle 5
-Adding handle 6
-Handle 2 Completed with status 0
-Handle 3 Completed with status 0
-Handle 4 Completed with status 0
-Handle 5 Completed with status 0
-Handle 6 Completed with status 0
-Handle 1 Completed with status 0
-</data>
-</reply>
-
-# Client-side
-<client>
-<server>
-http-pipe
-</server>
-<features>
-http
-</features>
-<tool>
-lib1900
-</tool>
- <name>
-HTTP GET using pipelining, penalized on content-length
- </name>
- <command>
-http://%HOSTIP:%HTTPPIPEPORT/ log/urls1903.txt
-</command>
-<file name="log/urls1903.txt">
-0 1k.txt
-1000 100k.txt
-550 alphabet.txt
-10 alphabet.txt
-10 alphabet.txt
-10 alphabet.txt
-10 alphabet.txt
-</file>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-</verify>
-</testcase>
diff --git a/tests/data/test1904 b/tests/data/test1904
index 760285472..f75e87dab 100644
--- a/tests/data/test1904
+++ b/tests/data/test1904
@@ -61,20 +61,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.1904:%HTTPPORT HTTP/1.1
Host: test.1904:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /we/want/that/page/1904 HTTP/1.1
Host: test.1904:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test1905 b/tests/data/test1905
index 0459b10b4..1fafddf60 100644
--- a/tests/data/test1905
+++ b/tests/data/test1905
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/we/want/1905
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/1905 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1906 b/tests/data/test1906
index 0ff2b2be0..0c476a154 100644
--- a/tests/data/test1906
+++ b/tests/data/test1906
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/1906
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1906 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1907 b/tests/data/test1907
index 93f37051e..85cabde16 100644
--- a/tests/data/test1907
+++ b/tests/data/test1907
@@ -37,9 +37,6 @@ lib1907
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /1907 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test1908 b/tests/data/test1908
new file mode 100644
index 000000000..b63e03ad3
--- /dev/null
+++ b/tests/data/test1908
@@ -0,0 +1,81 @@
+<testcase>
+<info>
+<keywords>
+CURLINFO_EFFECTIVE_URL
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK swsbounce
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Content-Length: 0
+alt-svc: h2="3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example:443"; ma=315360000; persist=1
+
+</data>
+
+# This is the second response
+<data1 nocheck="yes">
+HTTP/1.1 200 OK
+Connection: close
+Content-Length: 0
+alt-svc: h2="second.example:443"; ma=315360000;
+
+</data1>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+# require debug so that alt-svc can work over plain old HTTP
+<features>
+alt-svc
+debug
+</features>
+<name>
+alt-svc cache save after resetting the handle
+</name>
+<setenv>
+# make debug-curl accept Alt-Svc over plain HTTP
+CURL_ALTSVC_HTTP="yeah"
+</setenv>
+<tool>
+lib1908
+</tool>
+
+<command>
+%HOSTIP:%HTTPPORT/1908
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1908 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /1908 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+<stripfile>
+# strip out the (dynamic) expire date from the file so that the rest
+# matches
+s/\"([^\"]*)\"/TIMESTAMP/
+</stripfile>
+<file name="log/altsvc-1908" mode="text">
+# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
+# This file was generated by libcurl! Edit at your own risk.
+h1 127.0.0.1 %HTTPPORT h2 3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example 443 TIMESTAMP 1 0
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test1909 b/tests/data/test1909
new file mode 100644
index 000000000..ba082529a
--- /dev/null
+++ b/tests/data/test1909
@@ -0,0 +1,64 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+retry
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK swsclose swsbounce
+Content-Length: 5
+Connection: close
+
+bbb
+</data>
+<data1>
+HTTP/1.1 200 OK
+Content-Length: 5
+Connection: close
+
+data
+</data1>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET --retry-all-errors to overcome partial transfer
+ </name>
+ <command option="no-output,no-include">
+--retry 1 --retry-all-errors -o log/outfile1909 http://%HOSTIP:%HTTPPORT/1909
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1909 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+GET /1909 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+
+<file1 name="log/outfile1909">
+data
+</file1>
+
+</verify>
+</testcase>
diff --git a/tests/data/test1910 b/tests/data/test1910
new file mode 100644
index 000000000..cd44c0269
--- /dev/null
+++ b/tests/data/test1910
@@ -0,0 +1,65 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP Basic
+CURLOPT_FOLLOWLOCATION
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 0
+Location: /19100002
+
+</data>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 4
+
+hej
+</data2>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+<name>
+HTTP credentials with newline and redirect
+</name>
+<tool>
+lib1910
+</tool>
+
+<command>
+%HOSTIP:%HTTPPORT/1910
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /1910 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcgpuYW1lOnBhc3MKd29yZA==
+Accept: */*
+
+GET /19100002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Authorization: Basic dXNlcgpuYW1lOnBhc3MKd29yZA==
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1911 b/tests/data/test1911
new file mode 100644
index 000000000..ec5f531af
--- /dev/null
+++ b/tests/data/test1911
@@ -0,0 +1,29 @@
+<testcase>
+<info>
+<keywords>
+curl_easy_option
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<name>
+verify that curl_easy_setopt() rejects too long string inputs
+</name>
+<tool>
+lib1911
+</tool>
+
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1912 b/tests/data/test1912
new file mode 100644
index 000000000..ed6b27b5b
--- /dev/null
+++ b/tests/data/test1912
@@ -0,0 +1,30 @@
+<testcase>
+<info>
+<keywords>
+curl_easy_option
+typecheck
+</keywords>
+</info>
+
+# Server-side
+<reply>
+</reply>
+
+# Client-side
+<client>
+<server>
+none
+</server>
+<name>
+Cross validate that gcc-typecheck macros match the option types.
+</name>
+<tool>
+lib1912
+</tool>
+
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test1913 b/tests/data/test1913
new file mode 100644
index 000000000..daf749025
--- /dev/null
+++ b/tests/data/test1913
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+FTP
+CURLOPT_NOBODY
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<servercmd>
+REPLY SIZE 550 no such file
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+
+# require debug so that alt-svc can work over plain old HTTP
+<name>
+FTP with NOBODY set, getting a missing file
+</name>
+<tool>
+lib1913
+</tool>
+
+<command>
+ftp://%HOSTIP:%FTPPORT/not-there/1913
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+78
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test1914 b/tests/data/test1914
new file mode 100644
index 000000000..1aa3e48c0
--- /dev/null
+++ b/tests/data/test1914
@@ -0,0 +1,42 @@
+<testcase>
+<info>
+<keywords>
+FTP
+CURLOPT_NOBODY
+CURLOPT_FILETIME
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<servercmd>
+REPLY MDTM 550 no such file
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+
+# require debug so that alt-svc can work over plain old HTTP
+<name>
+FTP with NOBODY and FILETIME set, getting a missing file
+</name>
+<tool>
+lib1913
+</tool>
+
+<command>
+ftp://%HOSTIP:%FTPPORT/not-there/1913 1
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+78
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test192 b/tests/data/test192
index 42cebc031..9a54a1a06 100644
--- a/tests/data/test192
+++ b/tests/data/test192
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/192 -w "%{num_connects}\n"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /192 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test193 b/tests/data/test193
index c5425bb3f..6a9c674e0 100644
--- a/tests/data/test193
+++ b/tests/data/test193
@@ -48,16 +48,15 @@ http://%HOSTIP:%HTTPPORT/193 -w "%{num_connects}\n" -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /193 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /193 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test194 b/tests/data/test194
index 730446f79..323ac0f38 100644
--- a/tests/data/test194
+++ b/tests/data/test194
@@ -55,13 +55,11 @@ http://%HOSTIP:%HTTPPORT/want/194 -C 87 --fail
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/194 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=87-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test197 b/tests/data/test197
index 4d06cc5da..052a0ad34 100644
--- a/tests/data/test197
+++ b/tests/data/test197
@@ -44,16 +44,15 @@ http://%HOSTIP:%HTTPPORT/197 --retry 1000
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /197 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /197 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test198 b/tests/data/test198
index 0200366c5..56dd74b4c 100644
--- a/tests/data/test198
+++ b/tests/data/test198
@@ -53,16 +53,15 @@ http://%HOSTIP:%HTTPPORT/198 --retry 1000
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /198 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /198 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test199 b/tests/data/test199
index 72675b535..69a3cecc6 100644
--- a/tests/data/test199
+++ b/tests/data/test199
@@ -42,16 +42,15 @@ HTTP with -d, -G and {}
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /199?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /199?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2 b/tests/data/test2
index 9f9c50618..bd53ed58c 100644
--- a/tests/data/test2
+++ b/tests/data/test2
@@ -36,13 +36,11 @@ HTTP GET with user and password
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2001 b/tests/data/test2001
index 9232499f9..4286f1d1e 100644
--- a/tests/data/test2001
+++ b/tests/data/test2001
@@ -63,12 +63,10 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20010001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
diff --git a/tests/data/test2002 b/tests/data/test2002
index efe75fa3b..cad7cdf82 100644
--- a/tests/data/test2002
+++ b/tests/data/test2002
@@ -72,12 +72,10 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20020001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
diff --git a/tests/data/test2003 b/tests/data/test2003
index 68ae71429..12b4722d9 100644
--- a/tests/data/test2003
+++ b/tests/data/test2003
@@ -72,12 +72,10 @@ moo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20030001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
USER anonymous
@@ -104,6 +102,7 @@ SIZE 20030002
RETR 20030002
GET /20030001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
QUIT
diff --git a/tests/data/test2004 b/tests/data/test2004
index 5b3b68d0c..f9add83d5 100644
--- a/tests/data/test2004
+++ b/tests/data/test2004
@@ -30,7 +30,7 @@ sftp
TFTP RRQ followed by SFTP retrieval followed by FILE followed by SCP retrieval then again in reverse order
</name>
<command option="no-include">
---key curl_client_key --pubkey curl_client_key.pub -u %USER: tftp://%HOSTIP:%TFTPPORT//2004 sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test2004.txt tftp://%HOSTIP:%TFTPPORT//2004 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: tftp://%HOSTIP:%TFTPPORT//2004 sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt scp://%HOSTIP:%SSHPORT%SSH_PWD/log/test2004.txt file://localhost%FILE_PWD/log/test2004.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test2004.txt tftp://%HOSTIP:%TFTPPORT//2004 --insecure
</command>
<file name="log/test2004.txt">
This is test data
diff --git a/tests/data/test2005 b/tests/data/test2005
index f78b4be56..f26bf239a 100644
--- a/tests/data/test2005
+++ b/tests/data/test2005
@@ -64,12 +64,10 @@ perl %SRCDIR/libtest/notexists.pl log/2005 log/name2005
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2005 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2006 b/tests/data/test2006
index 1f5971726..addf86f01 100644
--- a/tests/data/test2006
+++ b/tests/data/test2006
@@ -73,19 +73,28 @@ perl %SRCDIR/libtest/notexists.pl log/2006 log/name2006
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2006 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<file1 name="log/download2006">
Some data delivered from an HTTP resource
</file1>
+
+# The Content-Length replace here is to handle with 4/5 digit port number in
+# the content
+<stripfile2>
+s/Last-Modified:.*//
+s/Content-Length: 49[67]/Content-Length: yeps/
+</stripfile2>
<file2 name="log/heads2006">
+Content-Length: yeps
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:49:01 GMT
Server: test-server/fake
@@ -106,9 +115,6 @@ Metalink: fetching (log/download2006) from (http://%HOSTIP:%HTTPPORT/2006) OK
Metalink: validating (log/download2006)...
Metalink: validating (log/download2006) [sha-256] OK
</file4>
-<stripfile2>
-s/Last-Modified:.*//
-</stripfile2>
<stripfile4>
$_ = '' if (($_ !~ /^Metalink: /) && ($_ !~ /error/i) && ($_ !~ /warn/i))
</stripfile4>
diff --git a/tests/data/test2007 b/tests/data/test2007
index a8e5f1b45..4c456151a 100644
--- a/tests/data/test2007
+++ b/tests/data/test2007
@@ -74,22 +74,27 @@ perl %SRCDIR/libtest/notexists.pl log/2007 log/name2007
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2007 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<file1 name="log/download2007">
Something delivered from an HTTP resource
</file1>
+# The Content-Length replace here is to handle with 4/5 digit port number in
+# the content
<stripfile2>
s/Last-Modified:.*//
+s/Content-Length: 49[67]/Content-Length: yeps/
</stripfile2>
<file2 name="log/heads2007">
+Content-Length: yeps
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:50:02 GMT
Server: test-server/fake
diff --git a/tests/data/test2008 b/tests/data/test2008
index 1a0033285..ec41adb35 100644
--- a/tests/data/test2008
+++ b/tests/data/test2008
@@ -66,22 +66,27 @@ perl %SRCDIR/libtest/notexists.pl log/2008 log/name2008 log/outfile2008
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2008 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<file1 name="log/download2008">
Some stuff delivered from an HTTP resource
</file1>
+# The Content-Length replace here is to handle with 4/5 digit port number in
+# the content
<stripfile2>
s/Last-Modified:.*//
+s/Content-Length: 49[67]/Content-Length: yeps/
</stripfile2>
<file2 name="log/heads2008">
+Content-Length: yeps
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 15:23:48 GMT
Server: test-server/fake
diff --git a/tests/data/test2009 b/tests/data/test2009
index 08308d03e..aa71a0ac1 100644
--- a/tests/data/test2009
+++ b/tests/data/test2009
@@ -67,22 +67,27 @@ perl %SRCDIR/libtest/notexists.pl log/2009 log/name2009 log/outfile2009
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2009 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<file1 name="log/download2009">
Some contents delivered from an HTTP resource
</file1>
+# The Content-Length replace here is to handle with 4/5 digit port number in
+# the content
<stripfile2>
s/Last-Modified:.*//
+s/Content-Length: 49[67]/Content-Length: yeps/
</stripfile2>
<file2 name="log/heads2009">
+Content-Length: yeps
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 16:27:17 GMT
Server: test-server/fake
diff --git a/tests/data/test2010 b/tests/data/test2010
index 068c481b5..cd0c48354 100644
--- a/tests/data/test2010
+++ b/tests/data/test2010
@@ -66,22 +66,27 @@ perl %SRCDIR/libtest/notexists.pl log/2010 log/name2010 log/outfile2010
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
<file1 name="log/download2010">
Contents delivered from an HTTP resource
</file1>
+# The Content-Length replace here is to handle with 4/5 digit port number in
+# the content
<stripfile2>
s/Last-Modified:.*//
+s/Content-Length: 49[67]/Content-Length: yeps/
</stripfile2>
<file2 name="log/heads2010">
+Content-Length: yeps
+Accept-ranges: bytes
+
+
HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 17:37:27 GMT
Server: test-server/fake
diff --git a/tests/data/test2011 b/tests/data/test2011
index a84502317..1d081afcb 100644
--- a/tests/data/test2011
+++ b/tests/data/test2011
@@ -64,12 +64,10 @@ perl %SRCDIR/libtest/notexists.pl log/2011 log/name2011
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2011 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2012 b/tests/data/test2012
index 6751269d5..ae627a9af 100644
--- a/tests/data/test2012
+++ b/tests/data/test2012
@@ -63,12 +63,10 @@ perl %SRCDIR/libtest/notexists.pl log/2012 log/name2012
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2012 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2023 b/tests/data/test2023
index 382b6cb8a..0b155b2d2 100644
--- a/tests/data/test2023
+++ b/tests/data/test2023
@@ -128,9 +128,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20230100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2024 b/tests/data/test2024
index cd06b7c9f..c062b4c0f 100644
--- a/tests/data/test2024
+++ b/tests/data/test2024
@@ -142,9 +142,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20240100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2025 b/tests/data/test2025
index 6dfc70a7d..7a8fff152 100644
--- a/tests/data/test2025
+++ b/tests/data/test2025
@@ -195,6 +195,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -223,9 +224,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20250100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2026 b/tests/data/test2026
index afbd4f31e..a505737d7 100644
--- a/tests/data/test2026
+++ b/tests/data/test2026
@@ -178,9 +178,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20260100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2027 b/tests/data/test2027
index 3302a155d..3983e8854 100644
--- a/tests/data/test2027
+++ b/tests/data/test2027
@@ -201,9 +201,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20270100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2028 b/tests/data/test2028
index 2042eecf1..c7b70c8f2 100644
--- a/tests/data/test2028
+++ b/tests/data/test2028
@@ -231,6 +231,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -259,9 +260,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20280100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2029 b/tests/data/test2029
index 82d80857b..67313c414 100644
--- a/tests/data/test2029
+++ b/tests/data/test2029
@@ -168,6 +168,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -196,9 +197,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20290100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2030 b/tests/data/test2030
index 893f986f7..1d281ab9f 100644
--- a/tests/data/test2030
+++ b/tests/data/test2030
@@ -220,6 +220,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -248,9 +249,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20300100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2031 b/tests/data/test2031
index 979962134..dabba3749 100644
--- a/tests/data/test2031
+++ b/tests/data/test2031
@@ -234,6 +234,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -262,9 +263,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20310100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2032 b/tests/data/test2032
index ec5771f81..52574fe77 100644
--- a/tests/data/test2032
+++ b/tests/data/test2032
@@ -66,6 +66,7 @@ Data connection 2: 402
<client>
<features>
NTLM
+SSL
!SSPI
</features>
<server>
@@ -94,9 +95,6 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20320100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test2033 b/tests/data/test2033
deleted file mode 100644
index a13c1d425..000000000
--- a/tests/data/test2033
+++ /dev/null
@@ -1,124 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-HTTP GET
-HTTP Basic auth
-HTTP NTLM auth
-pipelining
-flaky
-</keywords>
-</info>
-# Server-side
-<reply>
-
-<!-- Basic auth -->
-<data100>
-HTTP/1.1 401 Need Basic or NTLM auth
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 29
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is a bad password page!
-</data100>
-
-<!-- NTLM auth -->
-<data200>
-HTTP/1.1 401 Need Basic or NTLM auth (2)
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 27
-WWW-Authenticate: NTLM
-WWW-Authenticate: Basic realm="testrealm"
-
-This is not the real page!
-</data200>
-
-<data1201>
-HTTP/1.1 401 NTLM intermediate (2)
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 33
-WWW-Authenticate: NTLM TlRMTVNTUAACAAAACAAIADAAAACGgAEAq6U1NAWaJCIAAAAAAAAAAAAAAAA4AAAATlRMTUF1dGg=
-
-This is still not the real page!
-</data1201>
-
-<data1202>
-HTTP/1.1 200 Things are fine in server land
-Server: Microsoft-IIS/5.0
-Content-Type: text/html; charset=iso-8859-1
-Content-Length: 32
-
-Finally, this is the real page!
-</data1202>
-
-<datacheck>
-Data connection 0: 228
-Data connection 1: 228
-Data connection 2: 402
-</datacheck>
-
-</reply>
-
-# Client-side
-<client>
-<features>
-NTLM
-!SSPI
-</features>
-<server>
-http
-</server>
-<tool>
-lib2033
-</tool>
-
- <name>
-NTLM connection mapping, pipelining enabled
- </name>
- <setenv>
-# we force our own host name, in order to make the test machine independent
-CURL_GETHOSTNAME=curlhost
-# we try to use the LD_PRELOAD hack, if not a debug build
-LD_PRELOAD=%PWD/libtest/.libs/libhostname.so
- </setenv>
- <command>
-http://%HOSTIP:%HTTPPORT/2032
-</command>
-<precheck>
-chkhostname curlhost
-</precheck>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<strip>
-^User-Agent:.*
-</strip>
-<protocol>
-GET /20320100 HTTP/1.1
-Host: 127.0.0.1:%HTTPPORT
-Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-Accept: */*
-
-GET /20320100 HTTP/1.1
-Host: 127.0.0.1:%HTTPPORT
-Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-Accept: */*
-
-GET /20320200 HTTP/1.1
-Host: 127.0.0.1:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-Accept: */*
-
-GET /20320200 HTTP/1.1
-Host: 127.0.0.1:%HTTPPORT
-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoABAI+/Fp9IERAQ74OsdNPbBpg7o8CVwLSO4DtFyIcZHUMKVktWIu92s2892OVpd2JzqnRlc3R1c2VyY3VybGhvc3Q=
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test2034 b/tests/data/test2034
index 9bf0a817c..57e3d8627 100644
--- a/tests/data/test2034
+++ b/tests/data/test2034
@@ -45,12 +45,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2034 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2036 b/tests/data/test2036
index 0ab8b66c5..f022d1444 100644
--- a/tests/data/test2036
+++ b/tests/data/test2036
@@ -22,16 +22,13 @@ http
HTTP, -O with no slash at all in the URL
</name>
<command option="no-output">
-%HOSTIP:%HTTPPORT -O
+%HOSTIP:%NOLISTENPORT -O
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
23
</errorcode>
diff --git a/tests/data/test2037 b/tests/data/test2037
index d630538e2..84a6676cd 100644
--- a/tests/data/test2037
+++ b/tests/data/test2037
@@ -45,12 +45,11 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
</strip>
<protocol>
GET /2037 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2040 b/tests/data/test2040
index ac600174e..cec8a6bcc 100644
--- a/tests/data/test2040
+++ b/tests/data/test2040
@@ -47,17 +47,16 @@ HTTP Basic authorization, then without authorization
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /20400100 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
+User-Agent: curl/%VERSION
Accept: */*
GET /20400200 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2041 b/tests/data/test2041
index 50018e401..d10abaa02 100644
--- a/tests/data/test2041
+++ b/tests/data/test2041
@@ -45,12 +45,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2041 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2043 b/tests/data/test2043
index 7a91f5b60..754a9b92e 100644
--- a/tests/data/test2043
+++ b/tests/data/test2043
@@ -10,7 +10,7 @@ HTTP GET
# Client-side
<client>
<features>
-WinSSL
+Schannel
</features>
<server>
none
@@ -19,7 +19,7 @@ none
Disable certificate revocation checks
</name>
<command>
---ssl-no-revoke -I https://revoked.grc.com/
+--ssl-no-revoke -I https://revoked.badssl.com/
</command>
</client>
diff --git a/tests/data/test2046 b/tests/data/test2046
index dcd202f04..e85c00f23 100644
--- a/tests/data/test2046
+++ b/tests/data/test2046
@@ -41,7 +41,7 @@ http
idn
</features>
<setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
</setenv>
<precheck>
@@ -59,16 +59,15 @@ http://åäö.se:%HTTPPORT/2046 --resolve xn--4cab6c.se:%HTTPPORT:%HOSTIP -w "%{
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2046 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /20460001 HTTP/1.1
Host: xn--4cab6c.se:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2047 b/tests/data/test2047
index bc7350971..cda2f918e 100644
--- a/tests/data/test2047
+++ b/tests/data/test2047
@@ -40,9 +40,10 @@ http
</server>
<features>
idn
+proxy
</features>
<setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
</setenv>
<precheck>
@@ -60,17 +61,16 @@ http://åäö.se/2047 -x %HOSTIP:%HTTPPORT -w "%{num_connects}\n%{num_redirects}
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://xn--4cab6c.se/2047 HTTP/1.1
Host: xn--4cab6c.se
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://xn--4cab6c.se/20470001 HTTP/1.1
Host: xn--4cab6c.se
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test2049 b/tests/data/test2049
index efa576e98..0653e5900 100644
--- a/tests/data/test2049
+++ b/tests/data/test2049
@@ -38,24 +38,25 @@ http://www1.example.com:8081/2049 --connect-to ::%HOSTIP:%HTTPPORT --next http:/
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2049 HTTP/1.1
Host: www1.example.com:8081
+User-Agent: curl/%VERSION
Accept: */*
GET /2049 HTTP/1.1
Host: www2.example.com:8082
+User-Agent: curl/%VERSION
Accept: */*
GET /2049 HTTP/1.1
Host: www3.example.com:8083
+User-Agent: curl/%VERSION
Accept: */*
GET /2049 HTTP/1.1
Host: www4.example.com:8084
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2050 b/tests/data/test2050
index 5eef3dae2..d4b7e6417 100644
--- a/tests/data/test2050
+++ b/tests/data/test2050
@@ -61,18 +61,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT connect.example.com.2050:%HTTPPORT HTTP/1.1
Host: connect.example.com.2050:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /2050 HTTP/1.1
Host: www.example.com.2050
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2051 b/tests/data/test2051
index e8c6bed1d..97f113800 100644
--- a/tests/data/test2051
+++ b/tests/data/test2051
@@ -38,20 +38,20 @@ http://%HOSTIP:%HTTPPORT/2051 -w "%{num_connects}\n" --next --connect-to ::%HOST
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2051 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2052 b/tests/data/test2052
index 082002f2c..70549db62 100644
--- a/tests/data/test2052
+++ b/tests/data/test2052
@@ -38,16 +38,15 @@ http://www.example.com:%HTTPPORT/2052 --resolve www.example.com:%HTTPPORT:%HOSTI
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2052 HTTP/1.1
Host: www.example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2052 HTTP/1.1
Host: www.example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2053 b/tests/data/test2053
index 98e78454e..abf1366cc 100644
--- a/tests/data/test2053
+++ b/tests/data/test2053
@@ -38,16 +38,15 @@ http://10.0.0.1:8081/2053 --connect-to 10.0.0.1:8081:%HOSTIP:%HTTPPORT --next ht
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2053 HTTP/1.1
Host: 10.0.0.1:8081
+User-Agent: curl/%VERSION
Accept: */*
GET /2053 HTTP/1.1
Host: [fc00::1]:8082
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2054 b/tests/data/test2054
index 2a0b54ebc..a79c59ca3 100644
--- a/tests/data/test2054
+++ b/tests/data/test2054
@@ -38,24 +38,25 @@ http://%HOSTIP:%HTTPPORT/2054 --connect-to foo::bar: --connect-to :123::456 --ne
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2054 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2054 HTTP/1.1
Host: www.example.com:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2054 HTTP/1.1
Host: %HOSTIP:8083
+User-Agent: curl/%VERSION
Accept: */*
GET /2054 HTTP/1.1
Host: www.example.com:8084
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2055 b/tests/data/test2055
index a5fac62be..5608b81f9 100644
--- a/tests/data/test2055
+++ b/tests/data/test2055
@@ -62,18 +62,17 @@ http://www.example.com.2055/2055 --connect-to ::connect.example.com.2055:%HTTPPO
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT connect.example.com.2055:%HTTPPORT HTTP/1.1
Host: connect.example.com.2055:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol>
GET /2055 HTTP/1.1
Host: www.example.com.2055
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2056 b/tests/data/test2056
index 5d2584eec..fc3d14773 100644
--- a/tests/data/test2056
+++ b/tests/data/test2056
@@ -53,13 +53,11 @@ CURL_STUB_GSS_CREDS="KRB5_Alice"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2056 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Negotiate IktSQjVfQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjE6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2057 b/tests/data/test2057
index 92d7824c1..f9c379076 100644
--- a/tests/data/test2057
+++ b/tests/data/test2057
@@ -69,18 +69,17 @@ CURL_STUB_GSS_CREDS="NTLM_Alice"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2057 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjI6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+User-Agent: curl/%VERSION
Accept: */*
GET /2057 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Negotiate Ik5UTE1fQWxpY2UiOkhUVFBAMTI3LjAuMC4xOjM6QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQ==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2058 b/tests/data/test2058
index 65a907f43..e1a801466 100644
--- a/tests/data/test2058
+++ b/tests/data/test2058
@@ -81,22 +81,20 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/2058 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
GET http://%HOSTIP:%HTTPPORT/2058 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2058", response="fbed69f9f3fd304c8f1acb1a43eb32688b933c0e28055c16b926cbcec070aeed", algorithm="SHA-256"
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2058", response="fbed69f9f3fd304c8f1acb1a43eb32688b933c0e28055c16b926cbcec070aeed", algorithm=SHA-256
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test2059 b/tests/data/test2059
index 4272a7b41..4b3ed0f50 100644
--- a/tests/data/test2059
+++ b/tests/data/test2059
@@ -81,22 +81,20 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/2059 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
GET http://%HOSTIP:%HTTPPORT/2059 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2059", response="fc09be8192851e284e73e8b719b32a2f6f91cca0594e68713da8c49dc2c1656e", algorithm="SHA-512-256", userhash=true
+Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2059", response="fc09be8192851e284e73e8b719b32a2f6f91cca0594e68713da8c49dc2c1656e", algorithm=SHA-512-256, userhash=true
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test206 b/tests/data/test206
index f99ac4c71..494326495 100644
--- a/tests/data/test206
+++ b/tests/data/test206
@@ -85,22 +85,21 @@ http://test.remote.haxx.se.206:8990/path/2060002 --proxy http://%HOSTIP:%HTTPPOR
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.haxx.se.206:8990 HTTP/1.1
Host: test.remote.haxx.se.206:8990
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.haxx.se.206:8990 HTTP/1.1
Host: test.remote.haxx.se.206:8990
Proxy-Authorization: Digest username="silly", realm="weirdorealm", nonce="12345", uri="test.remote.haxx.se.206:8990", response="003e36decb4dbf6366b3ecb9b87c24ec"
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/2060002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.haxx.se.206:8990
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test2060 b/tests/data/test2060
index a0b291dc2..dfb4bd5b3 100644
--- a/tests/data/test2060
+++ b/tests/data/test2060
@@ -81,22 +81,20 @@ test
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/2060 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
GET http://%HOSTIP:%HTTPPORT/2060 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2060", response="3ce1e25ffa611bdbe90e2ab367b9602fa223db9f6de76ac667f0d6157e2178a6", algorithm="SHA-512-256"
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2060", response="3ce1e25ffa611bdbe90e2ab367b9602fa223db9f6de76ac667f0d6157e2178a6", algorithm=SHA-512-256
Content-Range: bytes 2-4/5
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
diff --git a/tests/data/test2061 b/tests/data/test2061
index af3758c97..6953423a3 100644
--- a/tests/data/test2061
+++ b/tests/data/test2061
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2061 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2061 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2061 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2061", response="9dc55255f1a2537b838311674b621d45346b862a81631bb20e4ce356ef25062d", algorithm="SHA-256"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2061", response="9dc55255f1a2537b838311674b621d45346b862a81631bb20e4ce356ef25062d", algorithm=SHA-256
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2062 b/tests/data/test2062
index d5ce6899f..6075263de 100644
--- a/tests/data/test2062
+++ b/tests/data/test2062
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2062 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2062 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2062 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2062", response="2af735ec3508f4dff99248ffbbe9de9002bfd7cc770cfa2b026cb334042a54e3", algorithm="SHA-512-256"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2062", response="2af735ec3508f4dff99248ffbbe9de9002bfd7cc770cfa2b026cb334042a54e3", algorithm=SHA-512-256
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2063 b/tests/data/test2063
index 220fe4ebe..557e59361 100644
--- a/tests/data/test2063
+++ b/tests/data/test2063
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2063 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2063 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2063 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="1053604145", uri="/2063", response="43f7ab531dff687b5dc75617daa59d1fd67d648341d6d2655ca65ef5064cfb51", algorithm="SHA-512-256", userhash=true
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="1053604145", uri="/2063", response="43f7ab531dff687b5dc75617daa59d1fd67d648341d6d2655ca65ef5064cfb51", algorithm=SHA-512-256, userhash=true
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2064 b/tests/data/test2064
index aa20c0bc0..fc196f258 100644
--- a/tests/data/test2064
+++ b/tests/data/test2064
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2064 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2064 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2064 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2064", response="a9c3ec1036068b336cbabefe9dfcad52ee8b89bc7c91ddbb5bb415c6acdf38a5", algorithm="SHA-256"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2064", response="a9c3ec1036068b336cbabefe9dfcad52ee8b89bc7c91ddbb5bb415c6acdf38a5", algorithm=SHA-256
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2065 b/tests/data/test2065
index d3afe0b13..f352e6bcc 100644
--- a/tests/data/test2065
+++ b/tests/data/test2065
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2065 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2065 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2065 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2065", response="5a5f20b0e601aeddc6f96422c2332d49ff431c49ab143b5f836ef76e9ac78f5e", algorithm="SHA-512-256"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2065", response="5a5f20b0e601aeddc6f96422c2332d49ff431c49ab143b5f836ef76e9ac78f5e", algorithm=SHA-512-256
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2066 b/tests/data/test2066
index e6ec28a1e..31a143d69 100644
--- a/tests/data/test2066
+++ b/tests/data/test2066
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/2066 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2066 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2066 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="2053604145", uri="/2066", response="a2e2ae589f575fb132991d6f550ef14bf7ef697d2fef1242d2498f07eafc77dc", algorithm="SHA-512-256", userhash=true
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+Authorization: Digest username="75af8a3500f771e58a52093a25e7905d6e428a511285c12ea1420c73078dfd61", realm="testrealm", nonce="2053604145", uri="/2066", response="a2e2ae589f575fb132991d6f550ef14bf7ef697d2fef1242d2498f07eafc77dc", algorithm=SHA-512-256, userhash=true
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2067 b/tests/data/test2067
index faa7c57fa..0ae407606 100644
--- a/tests/data/test2067
+++ b/tests/data/test2067
@@ -66,19 +66,18 @@ HTTP POST --digest with SHA256 and user-specified Content-Length header
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2067 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /2067 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2067", response="67b97af219c92fa7e8685e5bebb8e74892f6c6792e911c52bd2dfbf0b49272eb", algorithm="SHA-256"
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2067", response="67b97af219c92fa7e8685e5bebb8e74892f6c6792e911c52bd2dfbf0b49272eb", algorithm=SHA-256
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test2068 b/tests/data/test2068
index 43a50e626..21003bdb2 100644
--- a/tests/data/test2068
+++ b/tests/data/test2068
@@ -66,19 +66,18 @@ HTTP POST --digest with SHA-512-256, userhash=false and user-specified Content-L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2068 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /2068 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2068", response="4bc9c97a72f1856bcec9b0e1518c6b7ee28773f91357d56840bdc30bd89ca68f", algorithm="SHA-512-256"
+Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/2068", response="4bc9c97a72f1856bcec9b0e1518c6b7ee28773f91357d56840bdc30bd89ca68f", algorithm=SHA-512-256
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test2069 b/tests/data/test2069
index e8040a5e0..fb3d15dcd 100644
--- a/tests/data/test2069
+++ b/tests/data/test2069
@@ -66,19 +66,18 @@ HTTP POST --digest with SHA-512-256, userhash=true and user-specified Content-Le
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2069 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
POST /2069 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2069", response="ff13d977110a471f30de75e747976e4de78d7a3d2425cd23ff46e67f4bc9ead7", algorithm="SHA-512-256", userhash=true
+Authorization: Digest username="fddc3bc7b753b73ab0848fd83cb20cbbca971258eb8d20c941dd5e0b010d66be", realm="testrealm", nonce="1053604144", uri="/2069", response="ff13d977110a471f30de75e747976e4de78d7a3d2425cd23ff46e67f4bc9ead7", algorithm=SHA-512-256, userhash=true
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test207 b/tests/data/test207
index caff81057..1ce2338a3 100644
--- a/tests/data/test207
+++ b/tests/data/test207
@@ -48,12 +48,10 @@ http://%HOSTIP:%HTTPPORT/207
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /207 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2070 b/tests/data/test2070
new file mode 100644
index 000000000..1039e84a5
--- /dev/null
+++ b/tests/data/test2070
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+HTTPS
+HTTP GET
+PEM certificate
+</keywords>
+</info>type
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 7
+
+MooMoo
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+Schannel
+!MinGW
+</features>
+<server>
+https Server-localhost-sv.pem
+</server>
+ <name>
+Ignore certificate revocation "best effort" strategy
+ </name>
+ <setenv>
+# This test is pointless if we're not using the schannel backend
+CURL_SSL_BACKEND=schannel
+ </setenv>
+ <command>
+--cacert %SRCDIR/certs/EdelCurlRoot-ca.crt --ssl-revoke-best-effort https://localhost:%HTTPSPORT/2070
+</command>
+# Ensure that we're running on localhost because we're checking the host name
+<precheck>
+perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0.0.1' );"
+</precheck>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /2070 HTTP/1.1
+Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test2073 b/tests/data/test2073
index ed942f018..160ddbbcb 100644
--- a/tests/data/test2073
+++ b/tests/data/test2073
@@ -42,11 +42,12 @@ http://%HOSTIP:%HTTPPORT/2073 -F 'name=a;filename=a.pdf' --next http://%HOSTIP:%
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /2073 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 189
@@ -56,6 +57,7 @@ Content-Type: application/pdf
a
POST /2073 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 184
diff --git a/tests/data/test2074 b/tests/data/test2074
index ecff8fe7e..e3e18126c 100644
--- a/tests/data/test2074
+++ b/tests/data/test2074
@@ -43,13 +43,11 @@ http://%HOSTIP:%HTTPPORT/2074 --oauth2-bearer mF_9.B5f-4.1JqM
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2074 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Bearer mF_9.B5f-4.1JqM
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2076 b/tests/data/test2076
index 2c477b1a5..5974286f6 100644
--- a/tests/data/test2076
+++ b/tests/data/test2076
@@ -57,17 +57,16 @@ HTTP with digest auth and URI contains query
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /2076?query HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /2076?query HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1", uri="/2076?query", response="5758bd3bbde7f33236e6ccd278eb59af"
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2078 b/tests/data/test2078
index 99bc2dbee..c881b0499 100644
--- a/tests/data/test2078
+++ b/tests/data/test2078
@@ -38,12 +38,10 @@ http://%HOSTIP:%HTTPPORT/2078 -u : --negotiate --data name=value
<errorcode>
0
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /2078 HTTP/1.1
-Host: 127.0.0.1:8990
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test208 b/tests/data/test208
index 1c86558a8..abb30df97 100644
--- a/tests/data/test208
+++ b/tests/data/test208
@@ -50,13 +50,11 @@ the
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT ftp://daniel:mysecret@host.com/we/want/208 HTTP/1.1
Host: host.com:21
Authorization: Basic ZGFuaWVsOm15c2VjcmV0
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 78
diff --git a/tests/data/test209 b/tests/data/test209
index aded6d2d2..afe16bfa6 100644
--- a/tests/data/test209
+++ b/tests/data/test209
@@ -77,6 +77,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -100,23 +101,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.209:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.209:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.209:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
GET /path/2090002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.209:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test2100 b/tests/data/test2100
index 0414b58d8..4352f61b4 100644
--- a/tests/data/test2100
+++ b/tests/data/test2100
Binary files differ
diff --git a/tests/data/test213 b/tests/data/test213
index 82d82c483..bb579971d 100644
--- a/tests/data/test213
+++ b/tests/data/test213
@@ -77,6 +77,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -100,23 +101,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0
Host: test.remote.example.com.213:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.213:%HTTPPORT HTTP/1.0
Host: test.remote.example.com.213:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
POST /path/2130002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.213:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 6
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test214 b/tests/data/test214
index 930182f5d..3f305ee19 100644
--- a/tests/data/test214
+++ b/tests/data/test214
@@ -40,12 +40,10 @@ MSYS2_ARG_CONV_EXCL=http://
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /{}\/214 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test217 b/tests/data/test217
index 4ab51a2f3..b06734473 100644
--- a/tests/data/test217
+++ b/tests/data/test217
@@ -41,12 +41,10 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
CONNECT test.remote.example.com.217:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.217:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</protocol>
diff --git a/tests/data/test218 b/tests/data/test218
index 138c4b7b1..4951c264b 100644
--- a/tests/data/test218
+++ b/tests/data/test218
@@ -39,12 +39,10 @@ just some tiny teeny contents
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /218 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Expect: 100-continue
diff --git a/tests/data/test219 b/tests/data/test219
index 49f17e43f..2b638950e 100644
--- a/tests/data/test219
+++ b/tests/data/test219
@@ -24,7 +24,7 @@ proxy
try using proxy with unsupported scheme
</name>
<command>
--x foo://%HOSTIP:%HTTPPORT/219 http://%HOSTIP:%HTTPPORT/219
+-x foo://%HOSTIP:%NOLISTENPORT/219 http://%HOSTIP:%NOLISTENPORT/219
</command>
</client>
diff --git a/tests/data/test22 b/tests/data/test22
index f45f8627c..57dd7ddaa 100644
--- a/tests/data/test22
+++ b/tests/data/test22
@@ -32,13 +32,10 @@ get HTTP with URL > 10000 bytes
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/22 HTTP/1.1
-User-Agent: curl/7.4.2 (sparc-sun-solaris2.7) libcurl 7.4.2 (SSL 0.9.6)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test220 b/tests/data/test220
index 7fd264345..4b2e41672 100644
--- a/tests/data/test220
+++ b/tests/data/test220
@@ -54,15 +54,13 @@ http://%HOSTIP:%HTTPPORT/220 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /220 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test221 b/tests/data/test221
index 3a85439d0..3fab37f52 100644
--- a/tests/data/test221
+++ b/tests/data/test221
@@ -54,15 +54,13 @@ http://%HOSTIP:%HTTPPORT/221 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /221 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test222 b/tests/data/test222
index 865266e07..27d169fed 100644
--- a/tests/data/test222
+++ b/tests/data/test222
@@ -185,15 +185,13 @@ http://%HOSTIP:%HTTPPORT/222 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /222 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test223 b/tests/data/test223
index 884967e3f..52bbb7c6f 100644
--- a/tests/data/test223
+++ b/tests/data/test223
@@ -75,15 +75,13 @@ http://%HOSTIP:%HTTPPORT/223 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /223 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test224 b/tests/data/test224
index a56046873..b632ffd29 100644
--- a/tests/data/test224
+++ b/tests/data/test224
@@ -90,15 +90,13 @@ http://%HOSTIP:%HTTPPORT/224 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /224 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test230 b/tests/data/test230
index 2174434b3..eb696da02 100644
--- a/tests/data/test230
+++ b/tests/data/test230
@@ -186,15 +186,13 @@ http://%HOSTIP:%HTTPPORT/230 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /230 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test232 b/tests/data/test232
index d0860c616..e0e703422 100644
--- a/tests/data/test232
+++ b/tests/data/test232
@@ -185,15 +185,13 @@ http://%HOSTIP:%HTTPPORT/232 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /232 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test233 b/tests/data/test233
index a38d8c95e..eb732eae6 100644
--- a/tests/data/test233
+++ b/tests/data/test233
@@ -75,20 +75,19 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/233 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://goto.second.host.now/2330002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test234 b/tests/data/test234
index 9e197cd1d..3c5146a37 100644
--- a/tests/data/test234
+++ b/tests/data/test234
@@ -77,14 +77,12 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/234 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -92,6 +90,7 @@ GET http://goto.second.host.now/2340002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test235 b/tests/data/test235
index 625023221..94abb951c 100644
--- a/tests/data/test235
+++ b/tests/data/test235
@@ -7,6 +7,9 @@ FTP
# Server-side
<reply>
+<servercmd>
+REPLY SIZE 500 command not understood
+</servercmd>
</reply>
# Client-side
diff --git a/tests/data/test236 b/tests/data/test236
index 9ba706f1d..92e34bc3e 100644
--- a/tests/data/test236
+++ b/tests/data/test236
@@ -11,6 +11,7 @@ FTP
REPLY SIZE 550 access to this file is very much denied
REPLY APPE 550 I said: access to this file is very much denied
REPLY STOR 550 I said: access to this file is very much denied
+REPLY SIZE 500 command not understood
</servercmd>
</reply>
diff --git a/tests/data/test239 b/tests/data/test239
index a6f1fd59b..b9e187235 100644
--- a/tests/data/test239
+++ b/tests/data/test239
@@ -52,6 +52,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -75,14 +76,11 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -91,7 +89,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://%HOSTIP:%HTTPPORT/239 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 6
diff --git a/tests/data/test24 b/tests/data/test24
index a2b28a9fd..54147eddf 100644
--- a/tests/data/test24
+++ b/tests/data/test24
@@ -30,13 +30,10 @@ http://%HOSTIP:%HTTPPORT/24 --fail --silent --show-error
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /24 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test240 b/tests/data/test240
index cd8594d63..0d452ee25 100644
--- a/tests/data/test240
+++ b/tests/data/test240
@@ -45,12 +45,10 @@ HTTP-IPv6 GET
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET /240 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test241 b/tests/data/test241
index 46eae1f72..e530aaff5 100644
--- a/tests/data/test241
+++ b/tests/data/test241
@@ -43,12 +43,10 @@ HTTP-IPv6 GET (using ip6-localhost)
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET /241 HTTP/1.1
Host: ip6-localhost:%HTTP6PORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test242 b/tests/data/test242
index 9457c58c3..aee927ea7 100644
--- a/tests/data/test242
+++ b/tests/data/test242
@@ -40,13 +40,11 @@ HTTP-IPv6 GET with username+password in URL
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET /242 HTTP/1.1
Host: %HOST6IP:%HTTP6PORT
Authorization: Basic Zm9vYmFyOmJhcmZvbw==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test243 b/tests/data/test243
index f83218e14..87826a82e 100644
--- a/tests/data/test243
+++ b/tests/data/test243
@@ -73,6 +73,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -96,13 +97,10 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 6
@@ -111,7 +109,7 @@ Content-Type: application/x-www-form-urlencoded
postitPOST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -120,7 +118,7 @@ Content-Type: application/x-www-form-urlencoded
POST http://%HOSTIP:%HTTPPORT/243 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 6
diff --git a/tests/data/test245 b/tests/data/test245
index cbb5ee31d..5750b4fa3 100644
--- a/tests/data/test245
+++ b/tests/data/test245
@@ -63,13 +63,10 @@ http://%HOSTIP:%HTTPPORT/245 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /245 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -77,7 +74,7 @@ Content-Type: application/x-www-form-urlencoded
POST /245 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/245", response="379a439b1737ba257c1d2f103914b18b"
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test246 b/tests/data/test246
index acf47da5d..b5469f3e5 100644
--- a/tests/data/test246
+++ b/tests/data/test246
@@ -73,13 +73,10 @@ http://%HOSTIP:%HTTPPORT/246 -u auser:apasswd --digest -d "junkelijunk"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /246 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.12.1-CVS (i686-pc-linux-gnu) libcurl/7.12.1-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.6
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
@@ -87,7 +84,7 @@ Content-Type: application/x-www-form-urlencoded
POST /246 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/246", response="761e6fc9a760c39d587092e8d840e740"
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test249 b/tests/data/test249
index 4f99c2af7..6b3dc6ef1 100644
--- a/tests/data/test249
+++ b/tests/data/test249
@@ -39,12 +39,10 @@ http://%HOSTIP:%HTTPPORT/249 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /249 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test25 b/tests/data/test25
index 15030ae92..d694cdc75 100644
--- a/tests/data/test25
+++ b/tests/data/test25
@@ -73,38 +73,35 @@ http://%HOSTIP:%HTTPPORT/want/25 -L --max-redirs 5
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /want/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data/reply/data/reply/data/reply/data/reply/data/reply/25 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test256 b/tests/data/test256
index 1567c6292..e873d579c 100644
--- a/tests/data/test256
+++ b/tests/data/test256
@@ -45,14 +45,12 @@ proxy
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/256 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic ZGFuaWVsOnN0ZW5iZXJn
Range: bytes=78-
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test257 b/tests/data/test257
index 59a419bb1..e43baf56e 100644
--- a/tests/data/test257
+++ b/tests/data/test257
@@ -85,27 +85,24 @@ machine anotherone.com login user2 password passwd2
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://supersite.com/want/257 HTTP/1.1
Host: supersite.com
Authorization: Basic dXNlcjE6cGFzc3dkMQ==
-User-Agent: curl/7.14.0-CVS (i686-pc-linux-gnu) libcurl/7.14.0-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://anotherone.com/2570002 HTTP/1.1
Host: anotherone.com
Authorization: Basic dXNlcjI6cGFzc3dkMg==
-User-Agent: curl/7.14.0-CVS (i686-pc-linux-gnu) libcurl/7.14.0-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://athird.com/2570003 HTTP/1.1
Host: athird.com
-User-Agent: curl/7.14.0-CVS (i686-pc-linux-gnu) libcurl/7.14.0-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test258 b/tests/data/test258
index 6c10564b8..c89d5f37e 100644
--- a/tests/data/test258
+++ b/tests/data/test258
@@ -77,12 +77,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST http://remotehost:54321/we/want/258 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 409
@@ -107,8 +107,8 @@ bar
------------------------------7c633d5c27ce--
POST http://remotehost:54321/we/want/258 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Proxy-Authorization: Digest username="uuuser", realm="many secrets", nonce="911", uri="/we/want/258", response="2501654ca391f0b5c8c12a1da77e34cd"
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 409
diff --git a/tests/data/test259 b/tests/data/test259
index 58d25120f..d1da02432 100644
--- a/tests/data/test259
+++ b/tests/data/test259
@@ -73,12 +73,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST http://remotehost:54321/we/want/259 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Expect: 100-continue
@@ -104,8 +104,8 @@ bar
------------------------------7c633d5c27ce--
POST http://remotehost:54321/we/want/259 HTTP/1.1
Host: remotehost:54321
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Proxy-Authorization: Digest username="uuuser", realm="many secrets", nonce="911", uri="/we/want/259", response="b479994d13e60f3aa192a67c5892ddc5"
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Expect: 100-continue
diff --git a/tests/data/test26 b/tests/data/test26
index 072dbf7d3..073fed3d3 100644
--- a/tests/data/test26
+++ b/tests/data/test26
@@ -31,13 +31,10 @@ http://%HOSTIP:%HTTPPORT/want/26 -o - -o -
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl.*
-</strip>
<protocol>
GET /want/26 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test260 b/tests/data/test260
index 589e86e8a..1e6dbe2e0 100644
--- a/tests/data/test260
+++ b/tests/data/test260
@@ -42,12 +42,10 @@ HTTP GET URL without slash but with questionmark
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?260 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test262 b/tests/data/test262
index 4c28f22d7..8f803cfbf 100644
--- a/tests/data/test262
+++ b/tests/data/test262
Binary files differ
diff --git a/tests/data/test263 b/tests/data/test263
index e10c20741..6c054a11d 100644
--- a/tests/data/test263
+++ b/tests/data/test263
@@ -41,12 +41,10 @@ HTTP-IPv6 GET with proxy specified using IPv6-numerical address
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:
-</strip>
<protocol>
GET http://veryveryremotesite.com/263 HTTP/1.1
Host: veryveryremotesite.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test264 b/tests/data/test264
index 5aca0e6c5..836c979a6 100644
--- a/tests/data/test264
+++ b/tests/data/test264
@@ -37,13 +37,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/264 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test265 b/tests/data/test265
index ff7d5945e..c62047303 100644
--- a/tests/data/test265
+++ b/tests/data/test265
@@ -78,6 +78,7 @@ http
</server>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -101,23 +102,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.265:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
CONNECT test.remote.example.com.265:%HTTPPORT HTTP/1.1
Host: test.remote.example.com.265:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
POST /path/2650002 HTTP/1.1
-User-Agent: curl/7.12.3-CVS (i686-pc-linux-gnu) libcurl/7.12.3-CVS OpenSSL/0.9.6b zlib/1.1.4
Host: test.remote.example.com.265:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 6
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test266 b/tests/data/test266
index 6b07a782b..0997ae7b6 100644
--- a/tests/data/test266
+++ b/tests/data/test266
@@ -56,12 +56,10 @@ http://%HOSTIP:%HTTPPORT/266 -D log/heads266
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /266 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test267 b/tests/data/test267
index 06b662c91..ed10b22a3 100644
--- a/tests/data/test267
+++ b/tests/data/test267
@@ -56,6 +56,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -81,14 +82,11 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Header1: yes
Header2: no
@@ -98,7 +96,7 @@ Content-Type: application/x-www-form-urlencoded
POST /267 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Header1: yes
Header2: no
diff --git a/tests/data/test268 b/tests/data/test268
index c9c7311ab..70a5a73dd 100644
--- a/tests/data/test268
+++ b/tests/data/test268
@@ -42,12 +42,10 @@ HTTP POST a non-existing file
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /268 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test269 b/tests/data/test269
index 6b7159b0b..ffecfedbf 100644
--- a/tests/data/test269
+++ b/tests/data/test269
@@ -40,12 +40,10 @@ http://%HOSTIP:%HTTPPORT/269 --ignore-content-length
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /269 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test27 b/tests/data/test27
index 6fed3d994..54b4f8a62 100644
--- a/tests/data/test27
+++ b/tests/data/test27
@@ -33,21 +33,21 @@ Get same cookie page several times
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl.*
-</strip>
<protocol>
GET /want/27 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/27 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: thewinneris=nowayyouwin
GET /want/27 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: thewinneris=nowayyouwin
diff --git a/tests/data/test273 b/tests/data/test273
index ce0be331e..45c293512 100644
--- a/tests/data/test273
+++ b/tests/data/test273
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/273 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /273 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /273 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/273", response="576ae57b1db0039f8c0de43ef58e49e3"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test274 b/tests/data/test274
index 579341c82..dd1b816de 100644
--- a/tests/data/test274
+++ b/tests/data/test274
@@ -34,13 +34,10 @@ http://%HOSTIP:%HTTPPORT/want/274 -L --max-redirs 0
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET /want/274 HTTP/1.1
-User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test275 b/tests/data/test275
index 6065b4d81..cff99d588 100644
--- a/tests/data/test275
+++ b/tests/data/test275
@@ -64,14 +64,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT remotesite.com.275:%HTTPPORT HTTP/1.1
Host: remotesite.com.275:%HTTPPORT
Proxy-Authorization: Basic eW91YXJlOnlvdXJzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
@@ -79,11 +76,13 @@ Proxy-Connection: Keep-Alive
GET /we/want/that/page/275 HTTP/1.1
Host: remotesite.com.275:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/that/page/275 HTTP/1.1
Host: remotesite.com.275:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test276 b/tests/data/test276
index 34e2235e1..2fa554d9d 100644
--- a/tests/data/test276
+++ b/tests/data/test276
@@ -59,16 +59,15 @@ HTTP Location: following with multiple question marks in URLs
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want?uri=http://anything/276?secondq/276 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /data/2760002.txt?coolsite=http://anotherurl/?a_second/2760002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test277 b/tests/data/test277
index d3e9d0fa4..7b60d40ea 100644
--- a/tests/data/test277
+++ b/tests/data/test277
@@ -33,17 +33,14 @@ http://%HOSTIP:%HTTPPORT/want/277 -F name=daniel -H "Content-Type: text/info"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^--------------------------[a-z0-9]*/--------------------------/
s/boundary=------------------------[a-z0-9]*/boundary=------------------------/
</strippart>
<protocol>
POST /want/277 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 146
Content-Type: text/info; boundary=------------------------
diff --git a/tests/data/test278 b/tests/data/test278
index 620f56b17..d706c33ce 100644
--- a/tests/data/test278
+++ b/tests/data/test278
@@ -37,13 +37,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/278 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTo=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test279 b/tests/data/test279
index d5f4194f1..d26ddd9d8 100644
--- a/tests/data/test279
+++ b/tests/data/test279
@@ -38,13 +38,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/279 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTo=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test28 b/tests/data/test28
index 1f80d5f48..703c6d35b 100644
--- a/tests/data/test28
+++ b/tests/data/test28
@@ -58,16 +58,15 @@ http://%HOSTIP:%HTTPPORT/want/28 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/28 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /online/1,1795,Welcome,00.html/280002.txt?logout=TRUE HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test281 b/tests/data/test281
index d399fc05b..f78b0c146 100644
--- a/tests/data/test281
+++ b/tests/data/test281
@@ -46,12 +46,10 @@ Weird
<errorcode>
22
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/281 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 38
Expect: 100-continue
diff --git a/tests/data/test282 b/tests/data/test282
index aa8aba5a2..578c102a5 100644
--- a/tests/data/test282
+++ b/tests/data/test282
@@ -32,12 +32,10 @@ http://%HOSTIP:%HTTPPORT/282
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /282 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test288 b/tests/data/test288
index e62eabd3c..26e1b842a 100644
--- a/tests/data/test288
+++ b/tests/data/test288
@@ -28,7 +28,7 @@ file
file:// with (unsupported) proxy, authentication and range
</name>
<setenv>
-all_proxy=http://fake:user@%HOSTIP:%HTTPPORT/
+all_proxy=http://fake:user@%HOSTIP:%NOLISTENPORT/
</setenv>
<command option="no-include">
file://localhost%FILE_PWD/log/test288.txt
diff --git a/tests/data/test29 b/tests/data/test29
index 9a7bd9ef9..b8a59c34a 100644
--- a/tests/data/test29
+++ b/tests/data/test29
@@ -36,12 +36,10 @@ http://%HOSTIP:%HTTPPORT/want/29 -m 2
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/29 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test292 b/tests/data/test292
index 800e8d178..12d131dbf 100644
--- a/tests/data/test292
+++ b/tests/data/test292
@@ -43,12 +43,10 @@ http://%HOSTIP:%HTTPPORT/292 --max-filesize 1000
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /292 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test293 b/tests/data/test293
index d75fc9a3c..2181a8216 100644
--- a/tests/data/test293
+++ b/tests/data/test293
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/293 --max-filesize 2
<errorcode>
63
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /293 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test299 b/tests/data/test299
index cfa743020..b3fa47361 100644
--- a/tests/data/test299
+++ b/tests/data/test299
@@ -39,13 +39,11 @@ FTP over HTTP proxy with user:pass not in url
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://michal:aybabtu@host.com/we/want/299 HTTP/1.1
Host: host.com:21
Authorization: Basic bWljaGFsOmF5YmFidHU=
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test3 b/tests/data/test3
index 0fe276467..0dc3b4618 100644
--- a/tests/data/test3
+++ b/tests/data/test3
@@ -43,13 +43,11 @@ HTTP POST with auth and contents but with content-length set to 0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /3 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic ZmFrZTotdXNlcg==
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 37
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test30 b/tests/data/test30
index 70b8005f5..ab4425db5 100644
--- a/tests/data/test30
+++ b/tests/data/test30
@@ -27,12 +27,10 @@ http://%HOSTIP:%HTTPPORT/want/30
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/30 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test300 b/tests/data/test300
index 7b4222d12..63e308d6d 100644
--- a/tests/data/test300
+++ b/tests/data/test300
@@ -39,12 +39,10 @@ simple HTTPS GET
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /300 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3000 b/tests/data/test3000
index e62e53168..1fc58f2f3 100644
--- a/tests/data/test3000
+++ b/tests/data/test3000
@@ -44,12 +44,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /3000 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3001 b/tests/data/test3001
index 706c3f752..a16bdb45a 100644
--- a/tests/data/test3001
+++ b/tests/data/test3001
@@ -44,12 +44,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /3001 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3002 b/tests/data/test3002
new file mode 100644
index 000000000..ac6820214
--- /dev/null
+++ b/tests/data/test3002
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP with multiple and invalid (first) --mail-rcpt and --mail-rcpt-allowfails
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/3002 --mail-rcpt-allowfails --mail-rcpt invalid.one --mail-rcpt recipient.two@example.com --mail-rcpt recipient.three@example.com --mail-rcpt recipient.four@example.com --mail-rcpt recipient.five@example.com --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 3002
+MAIL FROM:<sender@example.com>
+RCPT TO:<invalid.one>
+RCPT TO:<recipient.two@example.com>
+RCPT TO:<recipient.three@example.com>
+RCPT TO:<recipient.four@example.com>
+RCPT TO:<recipient.five@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test3003 b/tests/data/test3003
new file mode 100644
index 000000000..7515affbc
--- /dev/null
+++ b/tests/data/test3003
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP with multiple and invalid (last) --mail-rcpt and --mail-rcpt-allowfails
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/3003 --mail-rcpt-allowfails --mail-rcpt recipient.one@example.com --mail-rcpt recipient.two@example.com --mail-rcpt recipient.three@example.com --mail-rcpt recipient.four@example.com --mail-rcpt invalid.five --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 3003
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient.one@example.com>
+RCPT TO:<recipient.two@example.com>
+RCPT TO:<recipient.three@example.com>
+RCPT TO:<recipient.four@example.com>
+RCPT TO:<invalid.five>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test3004 b/tests/data/test3004
new file mode 100644
index 000000000..e021cde41
--- /dev/null
+++ b/tests/data/test3004
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP with multiple and invalid (middle) --mail-rcpt and --mail-rcpt-allowfails
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/3004 --mail-rcpt-allowfails --mail-rcpt recipient.one@example.com --mail-rcpt recipient.two@example.com --mail-rcpt invalid.three --mail-rcpt recipient.four@example.com --mail-rcpt recipient.five@example.com --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 3004
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient.one@example.com>
+RCPT TO:<recipient.two@example.com>
+RCPT TO:<invalid.three>
+RCPT TO:<recipient.four@example.com>
+RCPT TO:<recipient.five@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test3005 b/tests/data/test3005
new file mode 100644
index 000000000..256555ac9
--- /dev/null
+++ b/tests/data/test3005
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP with multiple and invalid (all but one) --mail-rcpt and --mail-rcpt-allowfails
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/3005 --mail-rcpt-allowfails --mail-rcpt invalid.one --mail-rcpt recipient.two@example.com --mail-rcpt invalid.three --mail-rcpt invalid.four --mail-rcpt invalid.five --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 3005
+MAIL FROM:<sender@example.com>
+RCPT TO:<invalid.one>
+RCPT TO:<recipient.two@example.com>
+RCPT TO:<invalid.three>
+RCPT TO:<invalid.four>
+RCPT TO:<invalid.five>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test3006 b/tests/data/test3006
new file mode 100644
index 000000000..f54d71c8d
--- /dev/null
+++ b/tests/data/test3006
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP with multiple invalid (all) --mail-rcpt and --mail-rcpt-allowfails
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/3006 --mail-rcpt-allowfails --mail-rcpt invalid.one --mail-rcpt invalid.two --mail-rcpt invalid.three --mail-rcpt invalid.four --mail-rcpt invalid.five --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 55 - CURLE_SEND_ERROR
+<errorcode>
+55
+</errorcode>
+<protocol>
+EHLO 3006
+MAIL FROM:<sender@example.com>
+RCPT TO:<invalid.one>
+RCPT TO:<invalid.two>
+RCPT TO:<invalid.three>
+RCPT TO:<invalid.four>
+RCPT TO:<invalid.five>
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test3007 b/tests/data/test3007
new file mode 100644
index 000000000..b0d690262
--- /dev/null
+++ b/tests/data/test3007
@@ -0,0 +1,47 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+ <name>
+SMTP with invalid --mail-rcpt and --mail-rcpt-allowfails
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/3007 --mail-rcpt-allowfails --mail-rcpt invalid.one --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 55 - CURLE_SEND_ERROR
+<errorcode>
+55
+</errorcode>
+<protocol>
+EHLO 3007
+MAIL FROM:<sender@example.com>
+RCPT TO:<invalid.one>
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test3008 b/tests/data/test3008
new file mode 100644
index 000000000..0010eeb86
--- /dev/null
+++ b/tests/data/test3008
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+-O
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3008 -O --output-dir %PWD/log
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3008 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/3008">
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test3009 b/tests/data/test3009
new file mode 100644
index 000000000..f9bf11b0e
--- /dev/null
+++ b/tests/data/test3009
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+-O
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir a non-existing directory
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3009 -O --output-dir %PWD/not-there
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3009 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<errorcode>
+23
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test301 b/tests/data/test301
index c40469578..760497a17 100644
--- a/tests/data/test301
+++ b/tests/data/test301
@@ -40,13 +40,11 @@ HTTPS GET with user and password
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /301 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test3010 b/tests/data/test3010
new file mode 100644
index 000000000..1372a79d2
--- /dev/null
+++ b/tests/data/test3010
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP Basic
+RETRY-AFTER
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 301 Moved Permanently
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 0
+Retry-After: 2
+Location: /30100002
+
+</data>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Content-Length: 0
+
+</data2>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+<name>
+HTTP retry-after reset
+</name>
+<tool>
+lib3010
+</tool>
+
+<command>
+%HOSTIP:%HTTPPORT/3010
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<stdout>
+Retry-After: 2
+Retry-After: 0
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test3011 b/tests/data/test3011
new file mode 100644
index 000000000..267d6eeeb
--- /dev/null
+++ b/tests/data/test3011
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+-O
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir with --create-dirs
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3011 -O --output-dir %PWD/log/tmp --create-dirs
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3011 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/tmp/3011">
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test3012 b/tests/data/test3012
new file mode 100644
index 000000000..b4441cb18
--- /dev/null
+++ b/tests/data/test3012
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+-O
+-J
+--output-dir
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Disposition: inline; filename="MMM3012MMM"
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+--output-dir with -J
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3012 -OJ --output-dir %PWD/log
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3012 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/MMM3012MMM">
+-foo-
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test3013 b/tests/data/test3013
new file mode 100644
index 000000000..206b9e37a
--- /dev/null
+++ b/tests/data/test3013
@@ -0,0 +1,68 @@
+<testcase>
+<info>
+<keywords>
+-O
+-J
+--output-dir
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Disposition: inline; filename="MMM3013MMM"
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+</features>
+<name>
+Two --output-dir with --next in between
+</name>
+<command option="no-output,no-include">
+http://%HOSTIP:%HTTPPORT/this/is/the/3013 -O --output-dir %PWD/log http://%HOSTIP:%HTTPPORT/another/3013 -o second3013 --output-dir %PWD/log
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /this/is/the/3013 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+GET /another/3013 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/3013">
+-foo-
+</file>
+<file2 name="log/second3013">
+-foo-
+</file2>
+</verify>
+</testcase>
diff --git a/tests/data/test3014 b/tests/data/test3014
new file mode 100644
index 000000000..e36a0e02b
--- /dev/null
+++ b/tests/data/test3014
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+--write-out
+</keywords>
+</info>
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 9
+Connection: close
+Content-Type: text/plain
+
+testdata
+</data>
+
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+
+<name>
+Check if %{num_headers} returns correct number of headers
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/1439 --write-out '%{num_headers}'
+</command>
+</client>
+
+# Verify data
+<verify>
+<stdout nonewline="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 9
+Connection: close
+Content-Type: text/plain
+
+testdata
+4
+</stdout>
+<protocol>
+GET /1439 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test3015 b/tests/data/test3015
new file mode 100644
index 000000000..9c86d024b
--- /dev/null
+++ b/tests/data/test3015
@@ -0,0 +1,78 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+followlocation
+chunked Transfer-Encoding
+--write-out
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 302 OK
+Date: Sun, 13 Sep 2020 15:00 GMT
+Content-Length: 8
+Connection: close
+Content-Type: text/plain
+Location: ./30150001
+
+monster
+</data>
+<data1 nocheck="yes">
+HTTP/1.1 200 OK
+Date: Sun, 13 Sep 2020 15:00 GMT
+Transfer-Encoding: chunked
+Connection: close
+Content-Type: text/plain; charset=us-ascii
+
+0007
+bigger
+0008
+monster
+
+0
+
+</data1>
+
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP GET -w num_headers with redirected fetch (2 connects)
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/3015 -w "%{num_headers}\n" -L -o/dev/null
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /3015 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+GET /30150001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+
+<stdout mode="text">
+4
+</stdout>
+
+</verify>
+</testcase>
diff --git a/tests/data/test302 b/tests/data/test302
index 7bb162b41..bdef98eea 100644
--- a/tests/data/test302
+++ b/tests/data/test302
@@ -24,6 +24,7 @@ And you should ignore this data.
<client>
<features>
SSL
+proxy
</features>
<server>
https
@@ -42,9 +43,6 @@ HTTPS GET over HTTP proxy fails
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<data>
</data>
</verify>
diff --git a/tests/data/test303 b/tests/data/test303
index 01dd9ebb1..e05da5b2f 100644
--- a/tests/data/test303
+++ b/tests/data/test303
@@ -39,12 +39,10 @@ HTTPS with 8 secs timeout
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/303 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test304 b/tests/data/test304
index fedf18ff5..50baf1ca7 100644
--- a/tests/data/test304
+++ b/tests/data/test304
@@ -41,15 +41,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST /we/want/304 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1386
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------c3b2ef7f0bb8
------------------------------c3b2ef7f0bb8
diff --git a/tests/data/test305 b/tests/data/test305
index 858a0040e..f60226cba 100644
--- a/tests/data/test305
+++ b/tests/data/test305
@@ -25,9 +25,6 @@ https://%HOSTIP:%HTTPSPORT/want/305 --cacert moooo
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
77
</errorcode>
diff --git a/tests/data/test306 b/tests/data/test306
index 17306f949..b9150af87 100644
--- a/tests/data/test306
+++ b/tests/data/test306
@@ -52,12 +52,10 @@ HTTPS GET, receive no headers only data!
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /306 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test307 b/tests/data/test307
index 03c2b3c2d..5fb9faa47 100644
--- a/tests/data/test307
+++ b/tests/data/test307
@@ -43,12 +43,10 @@ simple HTTPS GET with openssl engine
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /307 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test309 b/tests/data/test309
index dd0431206..c766fca67 100644
--- a/tests/data/test309
+++ b/tests/data/test309
@@ -14,7 +14,7 @@ followlocation
HTTP/1.1 301 This is a weirdo text message swsclose
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
-Location: https://127.0.0.1:8991/data/3090002.txt?coolsite=yes
+Location: https://127.0.0.1:%HTTPSPORT/data/3090002.txt?coolsite=yes
Connection: close
This server reply is for testing a simple Location: following to HTTPS URL
@@ -33,7 +33,7 @@ If this is received, the location following worked
HTTP/1.1 301 This is a weirdo text message swsclose
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
-Location: https://127.0.0.1:8991/data/3090002.txt?coolsite=yes
+Location: https://127.0.0.1:%HTTPSPORT/data/3090002.txt?coolsite=yes
Connection: close
HTTP/1.1 200 Followed here fine swsclose
@@ -61,24 +61,19 @@ HTTP Location: redirect to HTTPS URL
<command>
-k http://%HOSTIP:%HTTPPORT/want/309 -L
</command>
-# The data section doesn't do variable substitution, so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%HTTPSPORT' ne '8991' );"
-</precheck>
</client>
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/309 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /data/3090002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test31 b/tests/data/test31
index 633b480a9..0bf563357 100644
--- a/tests/data/test31
+++ b/tests/data/test31
@@ -86,12 +86,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/31 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test310 b/tests/data/test310
index e7a9379ab..128c9176d 100644
--- a/tests/data/test310
+++ b/tests/data/test310
@@ -44,12 +44,10 @@ perl -e "print 'Test requires default test server host' if ( '%HOSTIP' ne '127.0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /310 HTTP/1.1
Host: localhost:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test314 b/tests/data/test314
index f4703cdeb..899200dc1 100644
--- a/tests/data/test314
+++ b/tests/data/test314
@@ -181,15 +181,13 @@ http://%HOSTIP:%HTTPPORT/314 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /314 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test315 b/tests/data/test315
index c75d9ae7b..605bb0f2d 100644
--- a/tests/data/test315
+++ b/tests/data/test315
@@ -71,15 +71,13 @@ http://%HOSTIP:%HTTPPORT/315 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /315 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test316 b/tests/data/test316
index a293b46cd..6b95b37fd 100644
--- a/tests/data/test316
+++ b/tests/data/test316
@@ -181,15 +181,13 @@ http://%HOSTIP:%HTTPPORT/316 --compressed
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<strippart>
s/^Accept-Encoding: .*/Accept-Encoding: xxx/
</strippart>
<protocol>
GET /316 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Accept-Encoding: xxx
diff --git a/tests/data/test317 b/tests/data/test317
index 68a9b5c79..b7723c72c 100644
--- a/tests/data/test317
+++ b/tests/data/test317
@@ -75,13 +75,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/317 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Authorization: s3cr3t
@@ -89,6 +87,7 @@ Authorization: s3cr3t
GET http://goto.second.host.now/3170002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test318 b/tests/data/test318
index fd82c7aed..6e3621e7c 100644
--- a/tests/data/test318
+++ b/tests/data/test318
@@ -75,13 +75,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/318 HTTP/1.1
Host: first.host.it.is
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Authorization: s3cr3t
@@ -89,6 +87,7 @@ Authorization: s3cr3t
GET http://goto.second.host.now/3180002 HTTP/1.1
Host: goto.second.host.now
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Authorization: s3cr3t
diff --git a/tests/data/test319 b/tests/data/test319
index 6a61a143a..855ea3e56 100644
--- a/tests/data/test319
+++ b/tests/data/test319
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/319 --raw
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /319 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test32 b/tests/data/test32
index 992ffcbcf..e2c5edfba 100644
--- a/tests/data/test32
+++ b/tests/data/test32
@@ -42,13 +42,10 @@ HTTP with -d and -G
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /32?foo=moo&moo=poo HTTP/1.1
-User-Agent: curl/7.9.5 (i686-pc-linux-gnu) libcurl 7.9.5-cvs (OpenSSL 0.9.5) (ipv6 enabled)
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test325 b/tests/data/test325
index 922f37ba2..93d7e21a3 100644
--- a/tests/data/test325
+++ b/tests/data/test325
@@ -49,12 +49,10 @@ HTTPS with attempted redirect to denied HTTP
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /325 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test326 b/tests/data/test326
index 1a4aae5f9..09ca9c0ad 100644
--- a/tests/data/test326
+++ b/tests/data/test326
@@ -53,12 +53,10 @@ http://%HOSTIP:%HTTPPORT/326 --raw
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /326 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test327 b/tests/data/test327
index 3a1c07162..808a4e9d1 100644
--- a/tests/data/test327
+++ b/tests/data/test327
@@ -49,16 +49,15 @@ http://%HOSTIP:%HTTPPORT/we/want/327 -b none -c log/cookies327 http://%HOSTIP:%H
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/327 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/want/3270002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: foobar=name
diff --git a/tests/data/test328 b/tests/data/test328
index 93c00e182..bc353a578 100644
--- a/tests/data/test328
+++ b/tests/data/test328
@@ -42,12 +42,12 @@ http://%HOSTIP:%HTTPPORT/hello/328 --compressed
# Verify data after the test has been "shot"
<verify>
<strip>
-^User-Agent:.*
^Accept-Encoding:.*
</strip>
<protocol>
GET /hello/328 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test329 b/tests/data/test329
index 2274d475b..e766c83ef 100644
--- a/tests/data/test329
+++ b/tests/data/test329
@@ -52,17 +52,16 @@ http://%HOSTIP:%HTTPPORT/we/want/329 -b log/jar329.txt -H "Host: host.foo.com" h
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/329 HTTP/1.1
Host: host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: test=no
GET /we/want/3290002 HTTP/1.1
Host: host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test33 b/tests/data/test33
index 9f7c31fb1..6b3c9d72c 100644
--- a/tests/data/test33
+++ b/tests/data/test33
@@ -42,14 +42,11 @@ http://%HOSTIP:%HTTPPORT/33 -Tlog/test33.txt -C 50
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /33 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 50-99/100
-User-Agent: curl/7.6 (sparc-sun-solaris2.7) libcurl 7.6-pre4 (SSL 0.9.6) (krb4 enabled)
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 50
Expect: 100-continue
diff --git a/tests/data/test330 b/tests/data/test330
index 6cda172f6..40cc09740 100644
--- a/tests/data/test330
+++ b/tests/data/test330
@@ -73,18 +73,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://first.host.it.is/we/want/that/page/317 HTTP/1.1
Host: first.host.it.is
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: test=yes
GET http://goto.second.host.now/3170002 HTTP/1.1
Host: goto.second.host.now
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test331 b/tests/data/test331
index 2ffac81f7..f6b008543 100644
--- a/tests/data/test331
+++ b/tests/data/test331
@@ -48,17 +48,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://moo/we/want/331 HTTP/1.1
Host: moo
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://moo/we/want/3310002 HTTP/1.1
Host: moo
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
Cookie: moo=yes
diff --git a/tests/data/test333 b/tests/data/test333
index 198af9c86..0fd0591e8 100644
--- a/tests/data/test333
+++ b/tests/data/test333
@@ -20,7 +20,7 @@ none
Try a non-boolean command line option with --no-
</name>
<command>
---no-proxy "hey" http://%HOSTIP:%HTTPPORT/333
+--no-proxy "hey" http://%HOSTIP:%NOLISTENPORT/333
</command>
</client>
diff --git a/tests/data/test334 b/tests/data/test334
index c02a65b8d..f43af2381 100644
--- a/tests/data/test334
+++ b/tests/data/test334
@@ -31,12 +31,10 @@ http://%HOSTIP:%HTTPPORT/want/334
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/334 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test335 b/tests/data/test335
index 5817365e3..e3e1950f1 100644
--- a/tests/data/test335
+++ b/tests/data/test335
@@ -1,5 +1,5 @@
-# Mostly a duplicate of test168
<testcase>
+# Mostly a duplicate of test168
<info>
<keywords>
HTTP
@@ -73,20 +73,17 @@ http://digest:alot@data.from.server.requiring.digest.hohoho.com/335 --proxy http
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
@@ -94,7 +91,7 @@ GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/335", response="08a2e2e684047f4219a38ddc189ac00c"
-User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test338 b/tests/data/test338
index f8dab6528..83fe7263d 100644
--- a/tests/data/test338
+++ b/tests/data/test338
@@ -1,5 +1,5 @@
-# See https://github.com/curl/curl/issues/4499
<testcase>
+# See https://github.com/curl/curl/issues/4499
<info>
<keywords>
HTTP
@@ -45,16 +45,15 @@ http://%HOSTIP:%HTTPPORT/338 --next http://%HOSTIP:%HTTPPORT/338 --anyauth -u fo
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /338 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /338 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test339 b/tests/data/test339
new file mode 100644
index 000000000..eca35947d
--- /dev/null
+++ b/tests/data/test339
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 funky chunky!
+Server: fakeit/0.9 fakeitbad/1.0
+Transfer-Encoding: chunked
+Trailer: chunky-trailer
+Connection: mooo
+ETag: W/"asdf"
+
+40
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+30
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+21;heresatest=moooo
+cccccccccccccccccccccccccccccccc
+
+0
+chunky-trailer: header data
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Check if --etag-save saved correct etag to a file
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/339 --etag-save log/etag339
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /339 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/etag339">
+W/"asdf"
+</file>
+</verify>
+
+</testcase>
diff --git a/tests/data/test34 b/tests/data/test34
index a332b8c4b..fa4928d5c 100644
--- a/tests/data/test34
+++ b/tests/data/test34
@@ -52,12 +52,10 @@ http://%HOSTIP:%HTTPPORT/34
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /34 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test341 b/tests/data/test341
new file mode 100644
index 000000000..726000d16
--- /dev/null
+++ b/tests/data/test341
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 funky chunky!
+Server: fakeit/0.9 fakeitbad/1.0
+Transfer-Encoding: chunked
+Trailer: chunky-trailer
+Connection: mooo
+ETag: "asdf"
+
+40
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+30
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+21;heresatest=moooo
+cccccccccccccccccccccccccccccccc
+
+0
+chunky-trailer: header data
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Try to open a non existing file with --etag-compare should return an error
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/341 --etag-compare log/etag341
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+26
+</errorcode>
+</verify>
+
+</testcase>
diff --git a/tests/data/test342 b/tests/data/test342
new file mode 100644
index 000000000..5a1615f1d
--- /dev/null
+++ b/tests/data/test342
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 304 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Check if --etag-compare set correct etag in header
+</name>
+<file name="log/etag342">
+"21025-dc7-39462498"
+</file>
+<command>
+http://%HOSTIP:%HTTPPORT/342 --etag-compare log/etag342
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /342 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+If-None-Match: "21025-dc7-39462498"
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test343 b/tests/data/test343
new file mode 100644
index 000000000..6e8077629
--- /dev/null
+++ b/tests/data/test343
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-11111"
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Both --etag-compare and --etag-save to save new Etag
+</name>
+<file name="log/etag343">
+"21025-dc7-39462498"
+</file>
+<command>
+http://%HOSTIP:%HTTPPORT/343 --etag-compare log/etag343 --etag-save log/out343
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /343 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+If-None-Match: "21025-dc7-39462498"
+
+</protocol>
+<file name="log/out343">
+"21025-dc7-11111"
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test344 b/tests/data/test344
new file mode 100644
index 000000000..5672366ec
--- /dev/null
+++ b/tests/data/test344
@@ -0,0 +1,56 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-11111"
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Both --etag-compare and -save store new Etag using non-existing file
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/344 --etag-compare log/etag344 --etag-save log/etag344
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /344 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+If-None-Match: ""
+
+</protocol>
+<file name="log/etag344">
+"21025-dc7-11111"
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test345 b/tests/data/test345
new file mode 100644
index 000000000..87687324e
--- /dev/null
+++ b/tests/data/test345
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-11111"
+Accept-Ranges: bytes
+Content-Length: 0
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+Both --etag-compare and -save store new Etag using one pre-existing file
+</name>
+<file name="log/etag345">
+"21025-dc7-39462498"
+</file>
+<command>
+http://%HOSTIP:%HTTPPORT/345 --etag-compare log/etag345 --etag-save log/etag345
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /345 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+If-None-Match: "21025-dc7-39462498"
+
+</protocol>
+<file name="log/etag345">
+"21025-dc7-11111"
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test346 b/tests/data/test346
new file mode 100644
index 000000000..3ec7a1a9e
--- /dev/null
+++ b/tests/data/test346
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+proxy
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+proxy
+</features>
+<server>
+http
+</server>
+<name>
+HTTP GET over proxy with credentials using blank passwords
+</name>
+<command>
+-x http://%HOSTIP:%HTTPPORT/346 -U puser: -u suser: http://remote.example/346
+</command>
+</client>
+
+#
+<verify>
+<protocol>
+GET http://remote.example/346 HTTP/1.1
+Host: remote.example
+Proxy-Authorization: Basic cHVzZXI6
+Authorization: Basic c3VzZXI6
+User-Agent: curl/%VERSION
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test347 b/tests/data/test347
new file mode 100644
index 000000000..3d55a5bd2
--- /dev/null
+++ b/tests/data/test347
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 funky chunky!
+Server: fakeit/0.9 fakeitbad/1.0
+Transfer-Encoding: chunked
+Trailer: chunky-trailer
+Connection: mooo
+ETag:
+
+40
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+30
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+21;heresatest=moooo
+cccccccccccccccccccccccccccccccc
+
+0
+chunky-trailer: header data
+
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+--etag-save with blank incoming header
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/347 --etag-save log/etag347
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /347 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<file name="log/etag347">
+</file>
+</verify>
+
+</testcase>
diff --git a/tests/data/test348 b/tests/data/test348
new file mode 100644
index 000000000..befd9fb81
--- /dev/null
+++ b/tests/data/test348
@@ -0,0 +1,61 @@
+<testcase>
+<info>
+<keywords>
+FTP
+EPSV
+STOR
+</keywords>
+</info>
+
+<reply>
+<servercmd>
+STOR 552 disk full
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+FTP upload file with 552 disk full response
+ </name>
+<file name="log/test348.txt">
+data
+ to
+ see
+that FTP
+works
+ so does it?
+</file>
+ <command>
+ftp://%HOSTIP:%FTPPORT/348 -T log/test348.txt
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<upload>
+data
+ to
+ see
+that FTP
+works
+ so does it?
+</upload>
+<protocol>
+USER anonymous
+PASS ftp@example.com
+PWD
+EPSV
+TYPE I
+STOR 348
+QUIT
+</protocol>
+# 70 - CURLE_REMOTE_DISK_FULL
+<errorcode>
+70
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test35 b/tests/data/test35
index 85733a456..5b6aba0af 100644
--- a/tests/data/test35
+++ b/tests/data/test35
Binary files differ
diff --git a/tests/data/test355 b/tests/data/test355
index e9c4cb28f..1cab2dd4a 100644
--- a/tests/data/test355
+++ b/tests/data/test355
@@ -44,12 +44,10 @@ h1 example.com 80 h1 %HOSTIP %HTTPPORT "20290222 22:19:28" 0 0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /355 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test356 b/tests/data/test356
index c1234b450..469ab0d1e 100644
--- a/tests/data/test356
+++ b/tests/data/test356
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/356 --alt-svc "log/altsvc-356"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /356 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test357 b/tests/data/test357
new file mode 100644
index 000000000..9e7ed86a5
--- /dev/null
+++ b/tests/data/test357
@@ -0,0 +1,96 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+Expect
+</keywords>
+</info>
+# Server-side
+<reply>
+# 417 means the server didn't like the Expect header
+<data>
+HTTP/1.1 417 OK swsbounce
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 0
+
+</data>
+<data1>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 10
+
+blablabla
+</data1>
+<datacheck>
+HTTP/1.1 417 OK swsbounce
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 0
+
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 10
+
+blablabla
+</datacheck>
+<servercmd>
+no-expect
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP PUT with Expect: 100-continue and 417 response
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/357 -T log/test357.txt
+</command>
+<file name="log/test357.txt">
+Weird
+ file
+ to
+ upload
+for
+ testing
+the
+ PUT
+ feature
+</file>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+PUT /we/want/357 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 78
+Expect: 100-continue
+
+PUT /we/want/357 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 78
+
+Weird
+ file
+ to
+ upload
+for
+ testing
+the
+ PUT
+ feature
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test358 b/tests/data/test358
new file mode 100644
index 000000000..82ff8adf7
--- /dev/null
+++ b/tests/data/test358
@@ -0,0 +1,94 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+Alt-Svc
+HTTP/2
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+Alt-Svc: h2=":%HTTP2PORT", ma=315360000; persist=0
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+alt-svc
+debug
+</features>
+<server>
+http
+http/2
+</server>
+ <name>
+HTTPS GET translated by alt-svc lookup to HTTP/2 GET
+ </name>
+<setenv>
+# make debug-curl accept Alt-Svc over plain HTTP
+CURL_ALTSVC_HTTP="yeah"
+</setenv>
+ <command>
+--http2 --alt-svc "log/altsvc-358" "http://%HOSTIP:%HTTPPORT/358" "http://%HOSTIP:%HTTPPORT/358"
+</command>
+<file name="log/altsvc-358">
+h2 %HOSTIP %HTTPPORT h2 %HOSTIP %HTTP2PORT "20290222 22:19:28" 0 0
+</file>
+
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<stdout>
+HTTP/1.1 101 Switching Protocols
+Connection: Upgrade
+Upgrade: h2c
+
+HTTP/2 200
+date: Thu, 09 Nov 2010 14:49:00 GMT
+content-length: 6
+content-type: text/html
+funny-head: yesyes
+alt-svc: h2=":%HTTP2PORT", ma=315360000; persist=0
+server: nghttpx
+via: 1.1 nghttpx
+
+-foo-
+HTTP/2 200
+date: Thu, 09 Nov 2010 14:49:00 GMT
+content-length: 6
+content-type: text/html
+funny-head: yesyes
+alt-svc: h2=":%HTTP2PORT", ma=315360000; persist=0
+server: nghttpx
+via: 1.1 nghttpx
+
+-foo-
+</stdout>
+<stripfile>
+# strip out the (dynamic) expire date from the file so that the rest
+# matches
+s/\"2([^\"]*)\"/TIMESTAMP/
+</stripfile>
+<file name="log/altsvc-358" mode="text">
+# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
+# This file was generated by libcurl! Edit at your own risk.
+h2 %HOSTIP %HTTPPORT h2 %HOSTIP %HTTP2PORT TIMESTAMP 0 0
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test359 b/tests/data/test359
new file mode 100644
index 000000000..c0faee21d
--- /dev/null
+++ b/tests/data/test359
@@ -0,0 +1,94 @@
+<testcase>
+<info>
+<keywords>
+HTTPS
+HTTPS GET
+Alt-Svc
+HTTP/2
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+Alt-Svc: h2=":%HTTP2PORT", ma=315360000; persist=0
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+alt-svc
+debug
+</features>
+<server>
+https
+http/2
+</server>
+ <name>
+HTTPS GET translated by alt-svc lookup to HTTP/2 GET
+ </name>
+<setenv>
+# make debug-curl accept Alt-Svc over plain HTTP
+CURL_ALTSVC_HTTP="yeah"
+</setenv>
+ <command>
+--http2 --alt-svc "log/altsvc-359" "http://%HOSTIP:%HTTPSPORT/359" "http://%HOSTIP:%HTTPSPORT/359"
+</command>
+<file name="log/altsvc-359">
+h2 %HOSTIP %HTTPSPORT h2 %HOSTIP %HTTP2PORT "20290222 22:19:28" 0 0
+</file>
+
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<stdout>
+HTTP/1.1 101 Switching Protocols
+Connection: Upgrade
+Upgrade: h2c
+
+HTTP/2 200
+date: Thu, 09 Nov 2010 14:49:00 GMT
+content-length: 6
+content-type: text/html
+funny-head: yesyes
+alt-svc: h2=":%HTTP2PORT", ma=315360000; persist=0
+server: nghttpx
+via: 1.1 nghttpx
+
+-foo-
+HTTP/2 200
+date: Thu, 09 Nov 2010 14:49:00 GMT
+content-length: 6
+content-type: text/html
+funny-head: yesyes
+alt-svc: h2=":%HTTP2PORT", ma=315360000; persist=0
+server: nghttpx
+via: 1.1 nghttpx
+
+-foo-
+</stdout>
+<stripfile>
+# strip out the (dynamic) expire date from the file so that the rest
+# matches
+s/\"2([^\"]*)\"/TIMESTAMP/
+</stripfile>
+<file name="log/altsvc-359" mode="text">
+# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
+# This file was generated by libcurl! Edit at your own risk.
+h2 %HOSTIP %HTTPSPORT h2 %HOSTIP %HTTP2PORT TIMESTAMP 0 0
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test36 b/tests/data/test36
index 4e3fd8c87..91db26ec6 100644
--- a/tests/data/test36
+++ b/tests/data/test36
@@ -52,12 +52,10 @@ http://%HOSTIP:%HTTPPORT/36
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /36 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test37 b/tests/data/test37
index 768762300..1dedfde79 100644
--- a/tests/data/test37
+++ b/tests/data/test37
@@ -33,12 +33,10 @@ http://%HOSTIP:%HTTPPORT/37
<errorcode>
52
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /37 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test38 b/tests/data/test38
index db257f2f8..518aae95b 100644
--- a/tests/data/test38
+++ b/tests/data/test38
@@ -41,13 +41,11 @@ download on.
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/38 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=78-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test39 b/tests/data/test39
index 1867b6081..de9a51631 100644
--- a/tests/data/test39
+++ b/tests/data/test39
@@ -40,15 +40,14 @@ foo
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|-------).*
+^(Content-Type: multipart/form-data;|-------).*
</strip>
<protocol>
POST /we/want/39 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 1184
-Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
------------------------------24e78000bd32
diff --git a/tests/data/test393 b/tests/data/test393
index f03e9a246..67ce1c10f 100644
--- a/tests/data/test393
+++ b/tests/data/test393
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/393 --max-filesize 2000000
<errorcode>
63
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /393 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test394 b/tests/data/test394
index b82039b4d..ec7a06d92 100644
--- a/tests/data/test394
+++ b/tests/data/test394
@@ -46,12 +46,10 @@ http://%HOSTIP:%HTTPPORT/394
<errorcode>
8
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /394 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test395 b/tests/data/test395
index 2a569bf3b..fae55dbf0 100644
--- a/tests/data/test395
+++ b/tests/data/test395
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/395
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /395 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test396 b/tests/data/test396
new file mode 100644
index 000000000..01be58ac3
--- /dev/null
+++ b/tests/data/test396
@@ -0,0 +1,200 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+compressed
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data base64="yes">
+SFRUUC8xLjEgMjAwIE9LDQpEYXRlOiBNb24sIDI5IE5vdiAyMDA0IDIxOjU2OjUzIEdNVA0KU2Vy
+dmVyOiBBcGFjaGUvMS4zLjMxIChEZWJpYW4gR05VL0xpbnV4KSBtb2RfZ3ppcC8xLjMuMjYuMWEg
+UEhQLzQuMy45LTEgbW9kX3NzbC8yLjguMjAgT3BlblNTTC8wLjkuN2QgbW9kX3BlcmwvMS4yOQ0K
+VmFyeTogQWNjZXB0LUVuY29kaW5nDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1J
+U08tODg1OS0xDQpDb250ZW50LUVuY29kaW5nOiB6c3RkDQpDb250ZW50LUxlbmd0aDogMTMwOQ0K
+DQootS/9ZLESfSgAhj+9KODQugGwA7ZypiefqCCMWuEChf2B/kAy8O+aCN/J85sQo2WYoY3AzAu3
+ALMArADzIbf2pNpzu3kaHt3a+7pumz3QvrNJn6zxUdptGFLvNOy67bymt1gZRqqBqhqopndRkImC
+WNNUYZLrGFaqAWoasKZHVZBrglyVCoXJljJq+kbJsKImFCan5j0IgxD2kFdKljRBHrJtWNa+0GLG
+t6t0Y2+db98wD3D3dh7PwZLBVGAep877k0Ku1hbWuWeJqMgcQCAAQAgreFCQiuS6IBAYhgcBp05p
+tdrvMUnUg6Da+d6eR7eMAhjTU/ubEztOjRRyTNXz9lh739eZvfb42ruTgRxSd+6LNDLIIdsbw3Lv
+5/fMsM699c68G27U5mZebw1yXDCYbOvqdSvdYvxH7kWyt+7bIUcko6Vc977nhbXai24X3bccJD5K
+GwNyfHyRhGUhAkIhslwYEl4UYYBweVHG8nCxZF6UOWBASIAcUUQm4UWYKCKTWXh/3XJc9+8yPCkj
+3qrx30GObzo3Ht/Px1B6783X6PddJCZey7W1Se0G2a373CC/5z3vYYj1x47mHWT5WcbbjLdZy6zl
+xvnGOWSOpc2psaNx88PNT/XJqk/24dwP50Jmn7K9N9thyPxYcyKnod4xvLSLm0bANB2tRs8i2Fc7
+Lzdd+6x7hpGLIVVht3ZW0zCcJNIVnaFkYkhdUoRiaEkkqyKZeKQdZzmGlQmFXdToDCeUFMFubc2b
+Y0iRSNZFkWDtVnuNxp003ulhCDmkv7W3aj0MIYzht0eIVkUklkWj3GYvUKypimSTfihJpKIi1kSj
+ZSgQ8C4YTG3uzsvQmlgUTE6G00Num9XaHwTNadyn0VOrLWtzLSHDiISaKlfFmlDTNFXUdVGRSVUx
+rDzW7411btMZMkPvigGBNbXOkL0lJ2Yb1DuGHO+s9sU82rPGd9u5XWSIZVvXuZprO1+7XXvIckqu
+aUJhWEkVJVEwTdN2zWV4eVs3r9uv9uBRcIbBAesPgOiggZVzaGZABgAggEEBQELCICNKAyHz5wz5
+Gr+3SMoKzoiT4JcFlMRJ8E0BVdBikl8WJGONBZ5ErsE5h2Oju5HWDnZ50LZofbucqKR8qlj/gvM2
+pP8JtMX1f4XHv4sy+T9yUDCHs9YmJmw5hnGWowLZWgC0/j7rTMyJRnY3KrwRdj/wXTFmjnFucfZu
+/94DmfjeEDOFz0C0f3YgYWUsI+2YO9YVXGtiM3AJTNsy5j6K9jkAKLew5bRCRJqMYqloGVw2M0JH
+f4ZlSeeJaBsx6A24uIythC24JsTWGU7cNBP0NL3qbNPMIllkjj1n95If2W0cQobpYDaGF2ja1bjg
+5MAexBa5GWSJY2kGTsRGwkEd3Ad5qiG3zWSmXQGb7VwHzPvskUlDyLuenXPmlGEajIyyvcZ1Dns9
+S2Ru2G3YO5OHEHZNu4aZS8MuG5GPrZkBNbsTDMDQBg0rr/EM2GW5AKf9gZiRlINAzPQ5ltqgBSFC
+GNOIHYGDMjg5MNphi1sImR3WcGKBiIA8sM64mdAQ0sxEb84XSBFzplx8N2jz0O5guS/GeNfaqg7r
+yLrOzSoJKq2aJUadLQgFtLV6UcfzOw296pBr0/ms+rHmnTs5jnmC0eqLUKV72l4Ym3HYkknmcEsY
+QP51NUQZGktcjt2485yobNJeXv/S9pzH3nguOoYl36mAbjiMjYXDkIwI+7N0JMiHzrs7y3WvSOFZ
+</data>
+
+<datacheck>
+HTTP/1.1 200 OK
+Date: Mon, 29 Nov 2004 21:56:53 GMT
+Server: Apache/1.3.31 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.9-1 mod_ssl/2.8.20 OpenSSL/0.9.7d mod_perl/1.29
+Vary: Accept-Encoding
+Content-Type: text/html; charset=ISO-8859-1
+Content-Encoding: zstd
+Content-Length: 1309
+
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE project-listing SYSTEM "http://freshmeat.net/backend/fm-projects-0.4.dtd">
+<project-listing>
+ <project>
+ <project_id>1612</project_id>
+ <date_added>1998-08-21 04:01:29</date_added>
+ <date_updated>2004-10-18 02:22:23</date_updated>
+ <projectname_short>curl</projectname_short>
+ <projectname_full>curl and libcurl</projectname_full>
+ <desc_short>Command line tool and library for client-side URL transfers.</desc_short>
+ <desc_full>curl and libcurl is a tool for transferring files
+using URL syntax. It supports HTTP, HTTPS, FTP,
+FTPS, DICT, TELNET, LDAP, FILE, and GOPHER, as
+well as HTTP-post, HTTP-put, cookies, FTP upload,
+resumed transfers, passwords, portnumbers, SSL
+certificates, Kerberos, and proxies. It is powered
+by libcurl, the client-side URL transfer library.
+There are bindings to libcurl for over 20
+languages and environments.
+</desc_full>
+ <vitality_score>5784.57</vitality_score>
+ <vitality_percent>3.16</vitality_percent>
+ <vitality_rank>169</vitality_rank>
+ <popularity_score>6594.54</popularity_score>
+ <popularity_percent>13.81</popularity_percent>
+ <popularity_rank>105</popularity_rank>
+ <rating>8.50</rating>
+ <rating_count>21</rating_count>
+ <rating_rank>183</rating_rank>
+ <subscriptions>323</subscriptions>
+ <branch_name>Default</branch_name>
+ <url_project_page>http://freshmeat.net/projects/curl/</url_project_page>
+ <url_homepage>http://freshmeat.net/redir/curl/1612/url_homepage/</url_homepage>
+ <url_tgz>http://freshmeat.net/redir/curl/1612/url_tgz/</url_tgz>
+ <url_bz2>http://freshmeat.net/redir/curl/1612/url_bz2/</url_bz2>
+ <url_zip>http://freshmeat.net/redir/curl/1612/url_zip/</url_zip>
+ <url_changelog>http://freshmeat.net/redir/curl/1612/url_changelog/</url_changelog>
+ <url_rpm>http://freshmeat.net/redir/curl/1612/url_rpm/</url_rpm>
+ <url_deb>http://freshmeat.net/redir/curl/1612/url_deb/</url_deb>
+ <url_osx>http://freshmeat.net/redir/curl/1612/url_osx/</url_osx>
+ <url_bsdport>http://freshmeat.net/redir/curl/1612/url_bsdport/</url_bsdport>
+ <url_purchase></url_purchase>
+ <url_cvs>http://freshmeat.net/redir/curl/1612/url_cvs/</url_cvs>
+ <url_list>http://freshmeat.net/redir/curl/1612/url_list/</url_list>
+ <url_mirror>http://freshmeat.net/redir/curl/1612/url_mirror/</url_mirror>
+ <url_demo></url_demo>
+ <license>MIT/X Consortium License</license>
+ <latest_release>
+ <latest_release_version>7.12.2</latest_release_version>
+ <latest_release_id>176085</latest_release_id>
+ <latest_release_date>2004-10-18 02:22:23</latest_release_date>
+ </latest_release>
+ <screenshot_thumb></screenshot_thumb>
+ <authors>
+ <author>
+ <author_name>Daniel Stenberg</author_name>
+ <author_url>http://freshmeat.net/~bagder/</author_url>
+ <author_role>Owner</author_role>
+ </author>
+ </authors>
+ <descriminators>
+ <trove_id>12</trove_id>
+ <trove_id>226</trove_id>
+ <trove_id>3</trove_id>
+ <trove_id>2</trove_id>
+ <trove_id>188</trove_id>
+ <trove_id>216</trove_id>
+ <trove_id>200</trove_id>
+ <trove_id>220</trove_id>
+ <trove_id>164</trove_id>
+ <trove_id>90</trove_id>
+ <trove_id>89</trove_id>
+ <trove_id>809</trove_id>
+ <trove_id>150</trove_id>
+ <trove_id>224</trove_id>
+ <trove_id>900</trove_id>
+ <trove_id>839</trove_id>
+ </descriminators>
+ <dependencies>
+ <dependency type="recommended">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>7464</dependency_branch_id>
+ <dependency_project_id>7464</dependency_project_id>
+ <dependency_project_title>OpenSSL (Default)</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>7443</dependency_project_id>
+ <dependency_project_title>OpenLDAP</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>12351</dependency_project_id>
+ <dependency_project_title>zlib</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>32047</dependency_project_id>
+ <dependency_project_title>Heimdal</dependency_project_title>
+ </dependency>
+ <dependency type="optional">
+ <dependency_release_id>0</dependency_release_id>
+ <dependency_branch_id>0</dependency_branch_id>
+ <dependency_project_id>44532</dependency_project_id>
+ <dependency_project_title>c-ares</dependency_project_title>
+ </dependency>
+ </dependencies>
+ </project>
+</project-listing>
+</datacheck>
+
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+zstd
+</features>
+<server>
+http
+</server>
+ <name>
+HTTP GET zstd compressed content
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/396 --compressed
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
+<protocol>
+GET /396 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Accept-Encoding: xxx
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test397 b/tests/data/test397
new file mode 100644
index 000000000..0afd21c60
--- /dev/null
+++ b/tests/data/test397
@@ -0,0 +1,196 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+compressed
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+# Length of not-encoded content is 16512 what is greater than default value of
+# CURL_MAX_WRITE_SIZE (16384)
+<data base64="yes">
+SFRUUC8xLjEgMjAwIE9LDQpEYXRlOiBNb24sIDI5IE5vdiAyMDA0IDIxOjU2OjUzIEdNVA0KU2Vy
+dmVyOiBBcGFjaGUvMS4zLjMxIChEZWJpYW4gR05VL0xpbnV4KSBtb2RfZ3ppcC8xLjMuMjYuMWEg
+UEhQLzQuMy45LTEgbW9kX3NzbC8yLjguMjAgT3BlblNTTC8wLjkuN2QgbW9kX3BlcmwvMS4yOQ0K
+VmFyeTogQWNjZXB0LUVuY29kaW5nDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1J
+U08tODg1OS0xDQpDb250ZW50LUVuY29kaW5nOiB6c3RkDQpDb250ZW50LUxlbmd0aDogNDcNCg0K
+KLUv/WSAPw0BAIgwMTIzNDU2Nzg5QUJDREVGCgQAfJ9geAAEGh3Sq006l4KvuZw=
+</data>
+
+<datacheck>
+HTTP/1.1 200 OK
+Date: Mon, 29 Nov 2004 21:56:53 GMT
+Server: Apache/1.3.31 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.9-1 mod_ssl/2.8.20 OpenSSL/0.9.7d mod_perl/1.29
+Vary: Accept-Encoding
+Content-Type: text/html; charset=ISO-8859-1
+Content-Encoding: zstd
+Content-Length: 47
+
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+</datacheck>
+
+</reply>
+
+#
+# Client-side
+<client>
+<features>
+zstd
+</features>
+<server>
+http
+</server>
+ <name>
+HTTP GET zstd compressed content of size more than CURL_MAX_WRITE_SIZE
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/397 --compressed
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^Accept-Encoding: .*/Accept-Encoding: xxx/
+</strippart>
+<protocol>
+GET /397 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Accept-Encoding: xxx
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test4 b/tests/data/test4
index 542347db5..fe5789ad6 100644
--- a/tests/data/test4
+++ b/tests/data/test4
@@ -37,12 +37,10 @@ Replaced internal and added custom HTTP headers
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /4 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
extra-header: here
Accept: replaced
X-Custom-Header:
@@ -51,6 +49,7 @@ X-Test2: foo;
GET /4 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
extra-header: here
Accept: replaced
X-Custom-Header:
diff --git a/tests/data/test40 b/tests/data/test40
index 6be0d1615..42bd8e13b 100644
--- a/tests/data/test40
+++ b/tests/data/test40
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/40 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/40 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/moo.html/?name=d+a+niel&testcase=/400002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test42 b/tests/data/test42
index e303f3a27..abb3412ee 100644
--- a/tests/data/test42
+++ b/tests/data/test42
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/42 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/42 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/m%20o%20o.html/420002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test43 b/tests/data/test43
index 196017013..28035c899 100644
--- a/tests/data/test43
+++ b/tests/data/test43
@@ -63,17 +63,16 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/want/43 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/want/data/430002.txt?coolsite=yes HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test430 b/tests/data/test430
new file mode 100644
index 000000000..4a669ff7e
--- /dev/null
+++ b/tests/data/test430
@@ -0,0 +1,101 @@
+<testcase>
+# Derived from on https://github.com/curl/curl/issues/5120
+<info>
+<keywords>
+--next
+--config
+POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data1>
+<data2>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/2
+
+-foo-
+</data2>
+<data3>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/3
+
+-foo-
+</data3>
+</reply>
+
+#
+# Client-side
+<client>
+<file1 name="log/config430-a">
+--next
+url = %HOSTIP:%HTTPPORT/4300001
+header = "a: a"
+data = "a"
+</file1>
+<file2 name="log/config430-b">
+--next
+url = %HOSTIP:%HTTPPORT/4300002
+header = "b: b"
+data = "b"
+</file2>
+<file3 name="log/config430-c">
+--next
+url = %HOSTIP:%HTTPPORT/4300003
+header = "c: c"
+data = "c"
+</file3>
+
+<server>
+http
+</server>
+ <name>
+Three -K uses with --next and --data in each
+ </name>
+ <command>
+-K log/config430-a -K log/config430-b -K log/config430-c
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+POST /4300001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+a: a
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+aPOST /4300002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+b: b
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+bPOST /4300003 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+c: c
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+c
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test431 b/tests/data/test431
new file mode 100644
index 000000000..8f045482b
--- /dev/null
+++ b/tests/data/test431
@@ -0,0 +1,95 @@
+<testcase>
+# Derived from on https://github.com/curl/curl/issues/5120
+<info>
+<keywords>
+--next
+--config
+POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data1>
+<data2>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/2
+
+-foo-
+</data2>
+<data3>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/3
+
+-foo-
+</data3>
+</reply>
+
+#
+# Client-side
+<client>
+<file1 name="log/config431-a">
+--next
+url = %HOSTIP:%HTTPPORT/4310001
+header = "a: a"
+data = "a"
+</file1>
+<file2 name="log/config431-b">
+--next
+url = %HOSTIP:%HTTPPORT/4310002
+header = "b: b"
+data = "b"
+</file2>
+
+<server>
+http
+</server>
+ <name>
+Two -K uses with --next and then one on cmdline
+ </name>
+ <command>
+-K log/config431-a -K log/config431-b --next -d c %HOSTIP:%HTTPPORT/4310003 -H "c: c"
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+POST /4310001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+a: a
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+aPOST /4310002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+b: b
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+bPOST /4310003 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+c: c
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+c
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test432 b/tests/data/test432
new file mode 100644
index 000000000..a7bc37886
--- /dev/null
+++ b/tests/data/test432
@@ -0,0 +1,100 @@
+<testcase>
+# Derived from on https://github.com/curl/curl/issues/5120
+<info>
+<keywords>
+--next
+--config
+POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data1>
+<data2>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/2
+
+-foo-
+</data2>
+<data3>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/3
+
+-foo-
+</data3>
+</reply>
+
+#
+# Client-side
+<client>
+<file1 name="log/config432">
+--next
+url = %HOSTIP:%HTTPPORT/4320001
+header = "a: a"
+data = "a"
+--next
+url = %HOSTIP:%HTTPPORT/4320002
+header = "b: b"
+data = "b"
+config = "log/config432-c"
+</file1>
+<file2 name="log/config432-c">
+--next
+url = %HOSTIP:%HTTPPORT/4320003
+header = "c: c"
+data = "c"
+</file2>
+
+<server>
+http
+</server>
+ <name>
+Use -K with --next and --config from within
+ </name>
+ <command>
+-K log/config432
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+POST /4320001 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+a: a
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+aPOST /4320002 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+b: b
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+bPOST /4320003 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+c: c
+Content-Length: 1
+Content-Type: application/x-www-form-urlencoded
+
+c
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test433 b/tests/data/test433
new file mode 100644
index 000000000..e7cb4d225
--- /dev/null
+++ b/tests/data/test433
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+--config
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<file1 name="log/.curlrc">
+--next
+header = "a: a"
+data = "curlrc read"
+</file1>
+<server>
+http
+</server>
+<setenv>
+XDG_CONFIG_HOME=%PWD/log
+</setenv>
+<name>
+Verify XDG_CONFIG_HOME use to find .curlrc
+</name>
+<command>
+%HOSTIP:%HTTPPORT/433
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol nonewline="yes">
+POST /433 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+a: a
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+curlrc read
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test434 b/tests/data/test434
new file mode 100644
index 000000000..a2bcc0cbd
--- /dev/null
+++ b/tests/data/test434
@@ -0,0 +1,46 @@
+<testcase>
+
+<info>
+<keywords>
+--config
+</keywords>
+</info>
+
+#
+<reply>
+<data>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data>
+</reply>
+
+#
+<client>
+<file name="log/config434" nonewline="yes">
+url = %HOSTIP:%HTTPPORT/434
+</file>
+<server>
+http
+</server>
+<name>
+-K with a single line without newline
+</name>
+<command>
+-K log/config434
+</command>
+</client>
+
+#
+<verify>
+<protocol>
+GET /434 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test44 b/tests/data/test44
index 8220a1aa1..4b1fa450b 100644
--- a/tests/data/test44
+++ b/tests/data/test44
@@ -40,12 +40,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------).*
+^(Content-Type: multipart/form-data;|------).*
</strip>
<protocol>
POST /we/want/44 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 408
Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce
diff --git a/tests/data/test45 b/tests/data/test45
index 3eb9ba943..1381920d9 100644
--- a/tests/data/test45
+++ b/tests/data/test45
@@ -59,16 +59,15 @@ simple HTTP Location: without protocol in initial URL
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/45 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /want/data.cgi?moo=http://&/450002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test46 b/tests/data/test46
index 4ea259255..c54a7f1fa 100644
--- a/tests/data/test46
+++ b/tests/data/test46
@@ -59,12 +59,10 @@ domain..tld FALSE /want FALSE 0 empty
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/46 HTTP/1.1
Host: domain..tld:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: empty=; mooo2=indeed2; mooo=indeed
diff --git a/tests/data/test47 b/tests/data/test47
index bd779d346..2048f5229 100644
--- a/tests/data/test47
+++ b/tests/data/test47
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/47 -0
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /47 HTTP/1.0
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test48 b/tests/data/test48
index 7ee05ad37..36bf65668 100644
--- a/tests/data/test48
+++ b/tests/data/test48
@@ -36,16 +36,15 @@ HTTP with -d and -G and -I
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /48?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
HEAD /48?foo=moo&moo=poo HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
[DISCONNECT]
diff --git a/tests/data/test49 b/tests/data/test49
index 4a4175e32..9192f92a1 100644
--- a/tests/data/test49
+++ b/tests/data/test49
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/49 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/49 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/moo.html/490002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test490 b/tests/data/test490
new file mode 100644
index 000000000..6f77b7111
--- /dev/null
+++ b/tests/data/test490
@@ -0,0 +1,67 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Two globbed HTTP PUTs
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/490 -T '{log/in490,log/in490}'
+</command>
+<file name="log/in490">
+surprise!
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+PUT /490 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 10
+Expect: 100-continue
+
+surprise!
+PUT /490 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 10
+Expect: 100-continue
+
+surprise!
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test491 b/tests/data/test491
new file mode 100644
index 000000000..87cebf1ab
--- /dev/null
+++ b/tests/data/test491
@@ -0,0 +1,62 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Two globbed HTTP PUTs, the second upload file is missing
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/491 -T '{log/in491,log/bad491}'
+</command>
+<file name="log/in491">
+surprise!
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+PUT /491 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 10
+Expect: 100-continue
+
+surprise!
+</protocol>
+<errorcode>
+26
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test492 b/tests/data/test492
new file mode 100644
index 000000000..ab3c01fc2
--- /dev/null
+++ b/tests/data/test492
@@ -0,0 +1,90 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP PUT
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+Two globbed HTTP PUTs to two globbed URLs
+ </name>
+ <command>
+'http://%HOSTIP:%HTTPPORT/{one,two}/' -T '{log/first492,log/second492}' -H "Testno: 492"
+</command>
+<file name="log/first492">
+first 492 contents
+</file>
+<file1 name="log/second492">
+second 492 contents
+</file1>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+PUT /one/first492 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Testno: 492
+Content-Length: 19
+Expect: 100-continue
+
+first 492 contents
+PUT /two/first492 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Testno: 492
+Content-Length: 19
+Expect: 100-continue
+
+first 492 contents
+PUT /one/second492 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Testno: 492
+Content-Length: 20
+Expect: 100-continue
+
+second 492 contents
+PUT /two/second492 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Testno: 492
+Content-Length: 20
+Expect: 100-continue
+
+second 492 contents
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test5 b/tests/data/test5
index b98d27b3b..613882026 100644
--- a/tests/data/test5
+++ b/tests/data/test5
@@ -39,12 +39,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/5 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test50 b/tests/data/test50
index 84b05da7b..777caa259 100644
--- a/tests/data/test50
+++ b/tests/data/test50
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/50 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/50 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/moo.html/500002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test501 b/tests/data/test501
index 674bc43b4..8b3dac7ed 100644
--- a/tests/data/test501
+++ b/tests/data/test501
@@ -26,7 +26,7 @@ lib501
simple libcurl attempt operation without URL set
</name>
<command>
-http://%HOSTIP:%HTTPPORT/501
+http://%HOSTIP:%NOLISTENPORT/501
</command>
</client>
diff --git a/tests/data/test504 b/tests/data/test504
index 7c92209cd..351ae749f 100644
--- a/tests/data/test504
+++ b/tests/data/test504
@@ -32,7 +32,7 @@ lib504
simple multi through local proxy without listener
</name>
<command>
-http://%HOSTIP:%HTTPSPORT/504 %HOSTIP:55555
+http://%HOSTIP:%NOLISTENPORT/504 %HOSTIP:%NOLISTENPORT
</command>
</client>
diff --git a/tests/data/test509 b/tests/data/test509
index 5de1599e1..0e0dd212b 100644
--- a/tests/data/test509
+++ b/tests/data/test509
@@ -34,10 +34,7 @@ nothing
# Verify data after the test has been "shot"
<verify>
<stdout>
-seen custom_calloc()
-seen custom_malloc()
-seen custom_realloc()
-seen custom_free()
+Callbacks were invoked!
</stdout>
</verify>
diff --git a/tests/data/test51 b/tests/data/test51
index b58c3570e..7d9740ae9 100644
--- a/tests/data/test51
+++ b/tests/data/test51
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/51 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/51 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /510002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test511 b/tests/data/test511
index 72b79938c..1a251fd89 100644
--- a/tests/data/test511
+++ b/tests/data/test511
@@ -35,9 +35,9 @@ ftp://%HOSTIP:%FTPPORT/511
#
# Verify data after the test has been "shot"
<verify>
-# CURLE_FTP_COULDNT_RETR_FILE
+# CURLE_REMOTE_FILE_NOT_FOUND
<errorcode>
-19
+78
</errorcode>
<protocol>
USER anonymous
diff --git a/tests/data/test512 b/tests/data/test512
index d259f40df..dd5cc0a07 100644
--- a/tests/data/test512
+++ b/tests/data/test512
@@ -40,9 +40,6 @@ http://%HOSTIP:%HTTPPORT/512
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /512 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test514 b/tests/data/test514
index ca37a5d65..82f8041fd 100644
--- a/tests/data/test514
+++ b/tests/data/test514
@@ -44,9 +44,6 @@ http://%HOSTIP:%HTTPPORT/514
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
HEAD /514 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test515 b/tests/data/test515
index 526f1e136..bea2fe6f9 100644
--- a/tests/data/test515
+++ b/tests/data/test515
@@ -39,9 +39,6 @@ http://%HOSTIP:%HTTPPORT/515
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /515 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test516 b/tests/data/test516
index 9bc175bd4..c41d15e7e 100644
--- a/tests/data/test516
+++ b/tests/data/test516
@@ -40,9 +40,6 @@ http://%HOSTIP:%HTTPPORT/516
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /516 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test52 b/tests/data/test52
index 14fa42bfd..196ff041c 100644
--- a/tests/data/test52
+++ b/tests/data/test52
@@ -56,17 +56,15 @@ http://%HOSTIP:%HTTPPORT/we/are/all/twits/52 -L
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/are/all/twits/52 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /we/are/all/twits/520002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test522 b/tests/data/test522
index 89a0dbf51..8fc07c390 100644
--- a/tests/data/test522
+++ b/tests/data/test522
@@ -43,9 +43,6 @@ http://%HOSTIP/522 %HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /522 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test523 b/tests/data/test523
index c00a0969d..03d456b05 100644
--- a/tests/data/test523
+++ b/tests/data/test523
@@ -49,9 +49,6 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://www.example.com:19999/523 HTTP/1.1
Host: www.example.com:19999
diff --git a/tests/data/test53 b/tests/data/test53
index 679a4fa84..bffd063e5 100644
--- a/tests/data/test53
+++ b/tests/data/test53
@@ -40,12 +40,10 @@ HTTP, junk session cookies
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/53 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: mooo=indeed
diff --git a/tests/data/test530 b/tests/data/test530
deleted file mode 100644
index 40182e299..000000000
--- a/tests/data/test530
+++ /dev/null
@@ -1,83 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-</keywords>
-</info>
-
-# Server-side
-<reply>
-<data1>
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-</data1>
-<data2>
-HTTP/1.1 200 OK
-</data2>
-<data3>
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-</data3>
-<data4>
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-HTTP/1.1 200 OK
-Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test-server/fake
-Content-Length: 47
-
-file contents should appear once for each file
-</data4>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<tool>
-lib530
-</tool>
- <name>
-HTTP GET using pipelining
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/path/530
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-GET /path/5300001 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5300002 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5300003 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5300004 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-</verify>
-</testcase>
diff --git a/tests/data/test533 b/tests/data/test533
index f4446cbe0..a67c8c824 100644
--- a/tests/data/test533
+++ b/tests/data/test533
@@ -15,7 +15,7 @@ multi
<servercmd>
REPLY RETR 550 the file doesn't exist
-REPLY SIZE 550 Can't check for file existence
+REPLY SIZE 500 Can't check for file existence
</servercmd>
</reply>
diff --git a/tests/data/test534 b/tests/data/test534
index 6045dba61..ba3f721e7 100644
--- a/tests/data/test534
+++ b/tests/data/test534
@@ -16,7 +16,7 @@ non-existing host
<servercmd>
REPLY RETR 550 the file doesn't exist
-REPLY SIZE 550 Can't check for file existence
+REPLY SIZE 500 Can't check for file existence
</servercmd>
</reply>
diff --git a/tests/data/test54 b/tests/data/test54
index 66dbe9ddb..24f081954 100644
--- a/tests/data/test54
+++ b/tests/data/test54
@@ -32,12 +32,10 @@ http://%HOSTIP:%HTTPPORT/want/54 -L
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/54 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test540 b/tests/data/test540
index 871c558fb..8f53b072c 100644
--- a/tests/data/test540
+++ b/tests/data/test540
@@ -79,9 +79,6 @@ http://test.remote.example.com/path/540 http://%HOSTIP:%HTTPPORT silly:person cu
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
GET http://test.remote.example.com/path/540 HTTP/1.1
Host: custom.set.host.name
diff --git a/tests/data/test543 b/tests/data/test543
index 455633037..f7e687c46 100644
--- a/tests/data/test543
+++ b/tests/data/test543
@@ -30,6 +30,8 @@ curl_easy_escape
<verify>
<stdout>
%9C%26K%3DI%04%A1%01%E0%D8%7C%20%B7%EFS%29%FA%1DW%E1
+IN: '' OUT: ''
+IN: ' 12' OUT: '%2012'
</stdout>
</verify>
</testcase>
diff --git a/tests/data/test544 b/tests/data/test544
index 78cb5a45e..4bf9a6cbb 100644
--- a/tests/data/test544
+++ b/tests/data/test544
@@ -40,9 +40,6 @@ http://%HOSTIP:%HTTPPORT/544
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /544 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test546 b/tests/data/test546
index 12e604a0e..00dca99fa 100644
--- a/tests/data/test546
+++ b/tests/data/test546
@@ -21,7 +21,7 @@ works
<servercmd>
REPLY RETR 550 the file doesn't exist
COUNT RETR 1
-REPLY SIZE 550 Can't check for file existence
+REPLY SIZE 500 Can't check for file existence
COUNT SIZE 1
</servercmd>
</reply>
diff --git a/tests/data/test547 b/tests/data/test547
index 781799b11..5401e06c8 100644
--- a/tests/data/test547
+++ b/tests/data/test547
@@ -76,6 +76,7 @@ lib547
</tool>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -99,13 +100,9 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
@@ -115,7 +112,6 @@ this is the blurb we want to upload
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -124,7 +120,6 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/547 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
diff --git a/tests/data/test548 b/tests/data/test548
index fa98cd437..3ce5ae1ea 100644
--- a/tests/data/test548
+++ b/tests/data/test548
@@ -76,6 +76,7 @@ lib548
</tool>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -99,13 +100,9 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
@@ -115,7 +112,6 @@ this is the blurb we want to upload
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -124,7 +120,6 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/548 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
diff --git a/tests/data/test549 b/tests/data/test549
index a9f1ca21c..93c442aae 100644
--- a/tests/data/test549
+++ b/tests/data/test549
@@ -49,9 +49,6 @@ ftp://www.example.com/moo/549 http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://www.example.com/moo/549;type=i HTTP/1.1
Host: www.example.com:21
diff --git a/tests/data/test55 b/tests/data/test55
index 662385608..216f13cef 100644
--- a/tests/data/test55
+++ b/tests/data/test55
@@ -48,17 +48,15 @@ http://%HOSTIP:%HTTPPORT/55 -L
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /55 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /550002 HTTP/1.1
-User-Agent: curl/7.10 (i686-pc-linux-gnu) libcurl/7.10 OpenSSL/0.9.6c ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test550 b/tests/data/test550
index 1eff72a17..bd8f4223e 100644
--- a/tests/data/test550
+++ b/tests/data/test550
@@ -49,9 +49,6 @@ ftp://www.example.com/moo/550 http://%HOSTIP:%HTTPPORT ascii
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://www.example.com/moo/550;type=a HTTP/1.1
Host: www.example.com:21
diff --git a/tests/data/test551 b/tests/data/test551
index bb31a36f8..30c0ed940 100644
--- a/tests/data/test551
+++ b/tests/data/test551
@@ -75,9 +75,6 @@ http://test.remote.example.com/path/551 http://%HOSTIP:%HTTPPORT s1lly:pers0n
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/551 HTTP/1.1
Host: test.remote.example.com
diff --git a/tests/data/test552 b/tests/data/test552
index 5d1478bd5..9ad37bd7e 100644
--- a/tests/data/test552
+++ b/tests/data/test552
Binary files differ
diff --git a/tests/data/test553 b/tests/data/test553
index bd937f016..3ddb53295 100644
--- a/tests/data/test553
+++ b/tests/data/test553
@@ -41,25 +41,22 @@ http://%HOSTIP:%HTTPPORT/path/553
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol nonewline="yes">
POST /path/553 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Header0: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header1: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header2: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header3: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header4: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header5: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header6: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Header7: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Header0: %repeat[5000 x A]%
+Header1: %repeat[5000 x A]%
+Header2: %repeat[5000 x A]%
+Header3: %repeat[5000 x A]%
+Header4: %repeat[5000 x A]%
+Header5: %repeat[5000 x A]%
+Header6: %repeat[5000 x A]%
+Header7: %repeat[5000 x A]%
Content-Length: 40960
Content-Type: application/x-www-form-urlencoded
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+%repeat[40960 x A]%
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test555 b/tests/data/test555
index d4b946614..506cbb4a0 100644
--- a/tests/data/test555
+++ b/tests/data/test555
@@ -81,6 +81,7 @@ lib555
</tool>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -104,13 +105,9 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
<protocol>
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
@@ -120,7 +117,6 @@ this is the blurb we want to upload
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0
@@ -129,7 +125,6 @@ Content-Type: application/x-www-form-urlencoded
POST http://test.remote.example.com/path/555 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 36
diff --git a/tests/data/test556 b/tests/data/test556
index 549b9a4a2..72a8b9e47 100644
--- a/tests/data/test556
+++ b/tests/data/test556
@@ -38,9 +38,6 @@ http://%HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /556 HTTP/1.2
Host: ninja
diff --git a/tests/data/test558 b/tests/data/test558
index 44361862e..f313e813a 100644
--- a/tests/data/test558
+++ b/tests/data/test558
@@ -36,13 +36,10 @@ nothing
# Verify data after the test has been "shot"
<verify>
<file name="log/memdump">
-FD hostip6.c: socket()
-FD connect.c: sclose()
MEM lib558.c: malloc()
MEM lib558.c: free()
-MEM escape.c: malloc()
-MEM strdup.c: realloc()
-MEM strdup.c: realloc()
+MEM dynbuf.c: realloc()
+MEM dynbuf.c: realloc()
MEM escape.c: free()
</file>
<stripfile>
@@ -51,6 +48,9 @@ s/ =.*//
s/\(.*\)/()/
s/:\d+/:/
s:^(MEM |FD )(.*/)(.*):$1$3:
+s/\r\n/\n/
+s/^MEM getenv.c: realloc\(\)[\n]$//
+s/^MEM getenv.c: free\(\)[\n]$//
</stripfile>
</verify>
diff --git a/tests/data/test56 b/tests/data/test56
index f221981c4..394ac3574 100644
--- a/tests/data/test56
+++ b/tests/data/test56
@@ -34,7 +34,7 @@ data "we post this"
header "Transfer-Encoding: chunked"
#
# Set the user-agent using a short-option:
--A "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+-A "%repeat[99999 x a]%"
#
</stdin>
<command>
@@ -47,7 +47,7 @@ header "Transfer-Encoding: chunked"
<protocol>
POST /that.site.com/56 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+User-Agent: %repeat[99999 x a]%
Accept: */*
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test560 b/tests/data/test560
index 8d005541f..72a35e4b8 100644
--- a/tests/data/test560
+++ b/tests/data/test560
@@ -43,9 +43,6 @@ https://%HOSTIP:%HTTPSPORT/560
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /560 HTTP/1.1
Host: %HOSTIP:%HTTPSPORT
diff --git a/tests/data/test561 b/tests/data/test561
index 359e54cca..2f244617c 100644
--- a/tests/data/test561
+++ b/tests/data/test561
@@ -50,9 +50,6 @@ FTP RETR with CURLOPT_PROXY_TRANSFER_MODE, ASCII transfer and type=i
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://www.example.com/moo/561;type=i HTTP/1.1
Host: www.example.com:21
diff --git a/tests/data/test57 b/tests/data/test57
index 0724eac82..5011e6eb0 100644
--- a/tests/data/test57
+++ b/tests/data/test57
@@ -35,12 +35,10 @@ HTTP content-type with spaces in
<stdout mode="text">
text/html; charset=ISO-8859-4
</stdout>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /57 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test573 b/tests/data/test573
index e3299b820..b76f259c9 100644
--- a/tests/data/test573
+++ b/tests/data/test573
@@ -45,9 +45,6 @@ http://%HOSTIP:%HTTPPORT/573
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /573 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test58 b/tests/data/test58
index 1bd53fa27..f2eafe23a 100644
--- a/tests/data/test58
+++ b/tests/data/test58
@@ -35,12 +35,10 @@ a few bytes
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /we/want/58te%5B%5Dst.txt HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 12
Expect: 100-continue
diff --git a/tests/data/test580 b/tests/data/test580
index 13965598f..b448ee337 100644
--- a/tests/data/test580
+++ b/tests/data/test580
@@ -45,9 +45,6 @@ http://%HOSTIP:%HTTPPORT/580
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /580 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test581 b/tests/data/test581
index 83d7b604e..92871c3e6 100644
--- a/tests/data/test581
+++ b/tests/data/test581
@@ -45,9 +45,6 @@ http://%HOSTIP:%HTTPPORT/581
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /581 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test582 b/tests/data/test582
index 65d85b232..8ac6bc86a 100644
--- a/tests/data/test582
+++ b/tests/data/test582
@@ -24,7 +24,7 @@ lib582
SFTP upload using multi interface
</name>
<command>
-Sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/upload582.txt %PWD/log/file582.txt %USER:
+Sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/upload582.txt %PWD/log/file582.txt %USER:
</command>
<file name="log/file582.txt">
Moooooooooooo
diff --git a/tests/data/test583 b/tests/data/test583
index 2c41ca1d2..e7d95960b 100644
--- a/tests/data/test583
+++ b/tests/data/test583
@@ -29,7 +29,7 @@ SFTP with multi interface, remove handle early
# name resolve will cause it to return rather quickly and thus we could trigger
# the problem we're looking to verify.
<command>
-sftp://localhost:%SSHPORT%POSIX_PWD/log/upload583.txt %USER:
+sftp://localhost:%SSHPORT%SSH_PWD/log/upload583.txt %USER:
</command>
</client>
diff --git a/tests/data/test584 b/tests/data/test584
deleted file mode 100644
index 309c7b65b..000000000
--- a/tests/data/test584
+++ /dev/null
@@ -1,102 +0,0 @@
-<testcase>
-<info>
-<keywords>
-HTTP
-pipelining
-multi
-</keywords>
-</info>
-
-# Server-side
-# Silly division of the first request is solely to appease the server which expects n_data_items == n_requests
-<reply>
-<data1>
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-584
-</data1>
-<data2>
-HTTP/1.1 200 OK
-</data2>
-<data3>
-Server: test-server/fake
-</data3>
-<data4>
-Content-Length: 0
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 5
-
-585
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-586
-</data4>
-</reply>
-
-# Client-side
-<client>
-<server>
-http
-</server>
-<tool>
-lib530
-</tool>
- <name>
-HTTP GET using pipelining (nonzero length after zero length)
- </name>
- <command>
-http://%HOSTIP:%HTTPPORT/path/584
-</command>
-</client>
-
-# Verify data after the test has been "shot"
-<verify>
-<protocol>
-GET /path/5840001 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5840002 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5840003 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-GET /path/5840004 HTTP/1.1
-Host: %HOSTIP:%HTTPPORT
-Accept: */*
-
-</protocol>
-<stdout>
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-584
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 0
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 5
-
-585
-
-HTTP/1.1 200 OK
-Server: test-server/fake
-Content-Length: 4
-
-586
-</stdout>
-</verify>
-</testcase>
diff --git a/tests/data/test585 b/tests/data/test585
index 2096e81c3..ecde4beb0 100644
--- a/tests/data/test585
+++ b/tests/data/test585
@@ -56,9 +56,6 @@ http://%HOSTIP:%HTTPPORT/585
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /585 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test589 b/tests/data/test589
index 451bb15bd..81f788100 100644
--- a/tests/data/test589
+++ b/tests/data/test589
@@ -41,9 +41,6 @@ http://%HOSTIP:%HTTPPORT/589
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
POST /589 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test59 b/tests/data/test59
index 9c9601778..b93f99d6c 100644
--- a/tests/data/test59
+++ b/tests/data/test59
@@ -34,12 +34,10 @@ HTTP URL with slash but with "parameter"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /?mooo/59 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test590 b/tests/data/test590
index 6f6250763..cb24cbb56 100644
--- a/tests/data/test590
+++ b/tests/data/test590
@@ -74,6 +74,7 @@ lib590
</tool>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -97,27 +98,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent: curl/.*
-</strip>
+
<protocol>
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
GET http://test.remote.example.com/path/590 HTTP/1.1
Host: test.remote.example.com
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAAAgACAHAAAAAIAAgAcgAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAAIWYOdZV0iKA8ytf+dU+Bz9TpMJ4mBKu221lY3VybGhvc3Q=
-User-Agent: curl/7.13.2-CVS (i686-pc-linux-gnu) libcurl/7.13.2-CVS OpenSSL/0.9.7e zlib/1.2.2 libidn/0.5.13
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test6 b/tests/data/test6
index 0e7dc9b24..09664cdbb 100644
--- a/tests/data/test6
+++ b/tests/data/test6
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/we/want/that/page/6 -b "name=contents;name2=content2"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/that/page/6 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: name=contents;name2=content2
diff --git a/tests/data/test60 b/tests/data/test60
index 0dd717f8d..09cd54f83 100644
--- a/tests/data/test60
+++ b/tests/data/test60
@@ -37,12 +37,10 @@ more than one byte
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /bzz/60 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Transfer-Encoding: chunked
Content-Length: 1
diff --git a/tests/data/test600 b/tests/data/test600
index 2a139b817..f9415e0e0 100644
--- a/tests/data/test600
+++ b/tests/data/test600
@@ -24,7 +24,7 @@ sftp
SFTP retrieval
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file600.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file600.txt --insecure
</command>
<file name="log/file600.txt">
Test data
diff --git a/tests/data/test601 b/tests/data/test601
index 544a88068..c89b64535 100644
--- a/tests/data/test601
+++ b/tests/data/test601
@@ -24,7 +24,7 @@ scp
SCP retrieval
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file601.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file601.txt --insecure
</command>
<file name="log/file601.txt">
Test data
diff --git a/tests/data/test602 b/tests/data/test602
index 6bb0df3f4..dd300c74d 100644
--- a/tests/data/test602
+++ b/tests/data/test602
@@ -21,7 +21,7 @@ sftp
SFTP put
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file602.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/upload.602 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file602.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/upload.602 --insecure
</command>
<file name="log/file602.txt">
Test data
diff --git a/tests/data/test603 b/tests/data/test603
index 879e4c0f7..b96c4057f 100644
--- a/tests/data/test603
+++ b/tests/data/test603
@@ -21,7 +21,7 @@ scp
SCP upload
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file603.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/upload.603 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file603.txt scp://%HOSTIP:%SSHPORT%SSH_PWD/log/upload.603 --insecure
</command>
<file name="log/file603.txt">
Test data
diff --git a/tests/data/test604 b/tests/data/test604
index f76a7fb23..f503e669e 100644
--- a/tests/data/test604
+++ b/tests/data/test604
@@ -16,7 +16,7 @@ sftp
SFTP retrieval of nonexistent file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/not-a-valid-file-moooo --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/not-a-valid-file-moooo --insecure
</command>
</client>
diff --git a/tests/data/test605 b/tests/data/test605
index a18ab2997..29555fa82 100644
--- a/tests/data/test605
+++ b/tests/data/test605
@@ -16,7 +16,7 @@ scp
SCP retrieval of nonexistent file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/not-a-valid-file-moooo --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/not-a-valid-file-moooo --insecure
</command>
</client>
diff --git a/tests/data/test606 b/tests/data/test606
index 37e21086c..c790bd685 100644
--- a/tests/data/test606
+++ b/tests/data/test606
@@ -16,7 +16,7 @@ sftp
SFTP invalid user login
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u not-a-valid-user: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/not-a-valid-file-moooo --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u not-a-valid-user: sftp://%HOSTIP:%SSHPORT%SSH_PWD/not-a-valid-file-moooo --insecure
</command>
</client>
diff --git a/tests/data/test607 b/tests/data/test607
index e42245151..8c13e5844 100644
--- a/tests/data/test607
+++ b/tests/data/test607
@@ -16,7 +16,7 @@ scp
SCP invalid user login
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u not-a-valid-user: scp://%HOSTIP:%SSHPORT%POSIX_PWD/not-a-valid-file-moooo --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u not-a-valid-user: scp://%HOSTIP:%SSHPORT%SSH_PWD/not-a-valid-file-moooo --insecure
</command>
</client>
diff --git a/tests/data/test608 b/tests/data/test608
index 86391f085..b4d010556 100644
--- a/tests/data/test608
+++ b/tests/data/test608
@@ -24,7 +24,7 @@ sftp
SFTP post-quote rename
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-rename %PWD/log/file608.txt %PWD/log/file608-renamed.txt" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file608.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-rename %PWD/log/file608.txt %PWD/log/file608-renamed.txt" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file608.txt --insecure
</command>
# Verify that the file was renamed properly, then rename the file back to what
# it was so the verify section works and the file can be cleaned up.
diff --git a/tests/data/test609 b/tests/data/test609
index 4a9da1a94..5aa9eecfc 100644
--- a/tests/data/test609
+++ b/tests/data/test609
@@ -25,7 +25,7 @@ sftp
SFTP post-quote mkdir failure
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-mkdir %PWD/log/file609.txt" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file609.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-mkdir %PWD/log/file609.txt" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file609.txt --insecure
</command>
<file name="log/file609.txt">
Test file for mkdir test
diff --git a/tests/data/test61 b/tests/data/test61
index 2bf6490f7..67bee52e9 100644
--- a/tests/data/test61
+++ b/tests/data/test61
@@ -51,12 +51,10 @@ http://%HOSTIP:%HTTPPORT/we/want/61 -c log/jar61.txt -H "Host: www.host.foo.com"
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/61 HTTP/1.1
Host: www.host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test610 b/tests/data/test610
index 179146419..d09742151 100644
--- a/tests/data/test610
+++ b/tests/data/test610
@@ -27,7 +27,7 @@ perl %SRCDIR/libtest/test610.pl mkdir %PWD/log/test610.dir
SFTP post-quote rmdir
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-rmdir %PWD/log/test610.dir" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file610.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-rmdir %PWD/log/test610.dir" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file610.txt --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl gone %PWD/log/test610.dir
diff --git a/tests/data/test611 b/tests/data/test611
index f40a4bda3..6362002e3 100644
--- a/tests/data/test611
+++ b/tests/data/test611
@@ -27,7 +27,7 @@ perl %SRCDIR/libtest/test610.pl mkdir %PWD/log/test611.dir
SFTP post-quote rename
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-rename %PWD/log/test611.dir %PWD/log/test611.new" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file611.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-rename %PWD/log/test611.dir %PWD/log/test611.new" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file611.txt --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl rmdir %PWD/log/test611.new
diff --git a/tests/data/test612 b/tests/data/test612
index 4fed660d7..ae18afbc1 100644
--- a/tests/data/test612
+++ b/tests/data/test612
@@ -24,7 +24,7 @@ sftp
SFTP post-quote remove file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file612.txt -Q "-rm %PWD/log/file612.txt" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/upload.612 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file612.txt -Q "-rm %PWD/log/file612.txt" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/upload.612 --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl gone %PWD/log/test612.txt
diff --git a/tests/data/test613 b/tests/data/test613
index c4d82fbf0..0383987e5 100644
--- a/tests/data/test613
+++ b/tests/data/test613
@@ -10,8 +10,6 @@ directory
# Server-side
<reply>
<datacheck>
-d????????? N U U N ??? N NN:NN .
-d????????? N U U N ??? N NN:NN ..
d????????? N U U N ??? N NN:NN asubdir
-rw?rw?rw? 1 U U 37 Jan 1 2000 plainfile.txt
-r-?r-?r-? 1 U U 47 Dec 31 2000 rofile.txt
@@ -31,7 +29,7 @@ perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test613.dir
SFTP directory retrieval
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test613.dir/ --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test613.dir/ --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test613.dir %PWD/log/curl613.out
diff --git a/tests/data/test614 b/tests/data/test614
index bcc07275e..c6fe4919d 100644
--- a/tests/data/test614
+++ b/tests/data/test614
@@ -11,8 +11,6 @@ directory
# Server-side
<reply>
<datacheck>
-d????????? N U U N ??? N NN:NN .
-d????????? N U U N ??? N NN:NN ..
d????????? N U U N ??? N NN:NN asubdir
-r-?r-?r-? 1 U U 37 Jan 1 2000 plainfile.txt
-r-?r-?r-? 1 U U 47 Dec 31 2000 rofile.txt
@@ -32,7 +30,7 @@ perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test614.dir
SFTP pre-quote chmod
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "chmod 444 %PWD/log/test614.dir/plainfile.txt" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test614.dir/ --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "chmod 444 %PWD/log/test614.dir/plainfile.txt" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test614.dir/ --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test614.dir %PWD/log/curl614.out
diff --git a/tests/data/test615 b/tests/data/test615
index 7c50a28b1..5f4859c2f 100644
--- a/tests/data/test615
+++ b/tests/data/test615
@@ -20,7 +20,7 @@ perl %SRCDIR/libtest/test613.pl prepare %PWD/log/test615.dir
SFTP put remote failure
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file615.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test615.dir/rofile.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file615.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test615.dir/rofile.txt --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test613.pl postprocess %PWD/log/test615.dir
diff --git a/tests/data/test616 b/tests/data/test616
index 5b464b06d..14c3d3376 100644
--- a/tests/data/test616
+++ b/tests/data/test616
@@ -23,7 +23,7 @@ sftp
SFTP retrieval of empty file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file616.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file616.txt --insecure
</command>
<file name="log/file616.txt">
</file>
diff --git a/tests/data/test617 b/tests/data/test617
index 21c1e3b3e..67f0c9a16 100644
--- a/tests/data/test617
+++ b/tests/data/test617
@@ -23,7 +23,7 @@ scp
SCP retrieval of empty file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file617.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file617.txt --insecure
</command>
<file name="log/file617.txt">
</file>
diff --git a/tests/data/test618 b/tests/data/test618
index 23f03ac68..feb095ebe 100644
--- a/tests/data/test618
+++ b/tests/data/test618
@@ -15,7 +15,7 @@ sftp
SFTP retrieval of two files
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file618.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file618.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file618.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file618.txt --insecure
</command>
<file name="log/file618.txt">
Test data
diff --git a/tests/data/test619 b/tests/data/test619
index 3397c1f1a..6c1273c04 100644
--- a/tests/data/test619
+++ b/tests/data/test619
@@ -15,7 +15,7 @@ scp
SCP retrieval of two files
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file619.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file619.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file619.txt scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file619.txt --insecure
</command>
<file name="log/file619.txt">
Test data
diff --git a/tests/data/test62 b/tests/data/test62
index 82bc0d783..03afba6c0 100644
--- a/tests/data/test62
+++ b/tests/data/test62
@@ -46,17 +46,16 @@ http://%HOSTIP:%HTTPPORT/we/want/62 http://%HOSTIP:%HTTPPORT/we/want/62?hoge=fug
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/62 HTTP/1.1
Host: www.host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: test2=yes; test=yes
GET /we/want/62?hoge=fuga HTTP/1.1
Host: www.host.foo.com
+User-Agent: curl/%VERSION
Accept: */*
Cookie: test2=yes; test=yes
diff --git a/tests/data/test620 b/tests/data/test620
index 28019e792..463825513 100644
--- a/tests/data/test620
+++ b/tests/data/test620
@@ -16,7 +16,7 @@ sftp
SFTP retrieval of missing file followed by good file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/not-a-valid-file-moooo sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file620.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/not-a-valid-file-moooo sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file620.txt --insecure
</command>
<file name="log/file620.txt">
Test data
diff --git a/tests/data/test621 b/tests/data/test621
index 2b39e9f7d..f0ac9b728 100644
--- a/tests/data/test621
+++ b/tests/data/test621
@@ -16,7 +16,7 @@ scp
SCP retrieval of missing file followed by good file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/not-a-valid-file-moooo scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file621.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/not-a-valid-file-moooo scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file621.txt --insecure
</command>
<file name="log/file621.txt">
Test data
diff --git a/tests/data/test622 b/tests/data/test622
index 8f1a6e46c..7b5fd5b2e 100644
--- a/tests/data/test622
+++ b/tests/data/test622
@@ -22,7 +22,7 @@ sftp
SFTP put failure
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file622.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/nonexistent-directory/nonexistent-file --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file622.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/nonexistent-directory/nonexistent-file --insecure
</command>
<file name="log/file622.txt">
Test data
diff --git a/tests/data/test623 b/tests/data/test623
index 2c6a4381d..e2914c9d0 100644
--- a/tests/data/test623
+++ b/tests/data/test623
@@ -22,7 +22,7 @@ scp
SCP upload failure
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file623.txt scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/nonexistent-directory/nonexistent-file --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file623.txt scp://%HOSTIP:%SSHPORT%SSH_PWD/log/nonexistent-directory/nonexistent-file --insecure
</command>
<file name="log/file623.txt">
Test data
diff --git a/tests/data/test624 b/tests/data/test624
index 15b65a8da..8aaf527e5 100644
--- a/tests/data/test624
+++ b/tests/data/test624
@@ -22,7 +22,7 @@ sftp
SFTP put with --ftp-create-dirs
</name>
<command>
---ftp-create-dirs --key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file624.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test624.dir/upload.624 --insecure
+--ftp-create-dirs --key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file624.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test624.dir/upload.624 --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl move %PWD/log/test624.dir/upload.624 %PWD/log/upload.624 rmdir %PWD/log/test624.dir
diff --git a/tests/data/test625 b/tests/data/test625
index 8a5a2ae39..1fe9b55c0 100644
--- a/tests/data/test625
+++ b/tests/data/test625
@@ -22,7 +22,7 @@ sftp
SFTP put with --ftp-create-dirs twice
</name>
<command>
---ftp-create-dirs --key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file625.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test625.a/upload.625 -T log/file625.txt sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/test625.b/upload.625 --insecure
+--ftp-create-dirs --key curl_client_key --pubkey curl_client_key.pub -u %USER: -T log/file625.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test625.a/upload.625 -T log/file625.txt sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/test625.b/upload.625 --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl move %PWD/log/test625.a/upload.625 %PWD/log/upload.625 rmdir %PWD/log/test625.a rm %PWD/log/test625.b/upload.625 rmdir %PWD/log/test625.b
diff --git a/tests/data/test626 b/tests/data/test626
index fd955692b..edf2aa520 100644
--- a/tests/data/test626
+++ b/tests/data/test626
@@ -22,7 +22,7 @@ sftp
SFTP invalid quote command
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "invalid-command foo bar" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file626.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "invalid-command foo bar" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file626.txt --insecure
</command>
<file name="log/file626.txt">
Test file for rename test
diff --git a/tests/data/test628 b/tests/data/test628
index b5aaec6a8..86c00f16d 100644
--- a/tests/data/test628
+++ b/tests/data/test628
@@ -16,7 +16,7 @@ sftp
SFTP invalid user login (password authentication)
</name>
<command>
--u not-a-valid-user: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/irrelevant-file --insecure
+-u not-a-valid-user: sftp://%HOSTIP:%SSHPORT%SSH_PWD/irrelevant-file --insecure
</command>
</client>
diff --git a/tests/data/test629 b/tests/data/test629
index 7ce5e3005..07ac767ab 100644
--- a/tests/data/test629
+++ b/tests/data/test629
@@ -16,7 +16,7 @@ scp
SCP invalid user login (password authentication)
</name>
<command>
--u not-a-valid-user: scp://%HOSTIP:%SSHPORT%POSIX_PWD/irrelevant-file --insecure
+-u not-a-valid-user: scp://%HOSTIP:%SSHPORT%SSH_PWD/irrelevant-file --insecure
</command>
</client>
diff --git a/tests/data/test63 b/tests/data/test63
index e7d7a4615..b330c6afe 100644
--- a/tests/data/test63
+++ b/tests/data/test63
@@ -40,13 +40,11 @@ proxy
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://we.want.that.site.com/63 HTTP/1.1
Host: we.want.that.site.com
Proxy-Authorization: Basic ZmFrZTp1c2Vy
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test630 b/tests/data/test630
index ffde8ea54..f678528b0 100644
--- a/tests/data/test630
+++ b/tests/data/test630
@@ -17,7 +17,7 @@ sftp
SFTP incorrect host key
</name>
<command>
---hostpubmd5 00000000000000000000000000000000 --key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/irrelevant-file --insecure
+--hostpubmd5 00000000000000000000000000000000 --key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/irrelevant-file --insecure
</command>
</client>
diff --git a/tests/data/test631 b/tests/data/test631
index ddb7d280d..720f3716f 100644
--- a/tests/data/test631
+++ b/tests/data/test631
@@ -17,7 +17,7 @@ scp
SCP incorrect host key
</name>
<command>
---hostpubmd5 00000000000000000000000000000000 --key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/irrelevant-file --insecure
+--hostpubmd5 00000000000000000000000000000000 --key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/irrelevant-file --insecure
</command>
</client>
diff --git a/tests/data/test632 b/tests/data/test632
index 63f5630ad..70cfe515a 100644
--- a/tests/data/test632
+++ b/tests/data/test632
@@ -20,7 +20,7 @@ sftp
SFTP syntactically invalid host key
</name>
<command>
---hostpubmd5 00 --key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/irrelevant-file --insecure
+--hostpubmd5 00 --key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%NOLISTENPORT%SSH_PWD/log/irrelevant-file --insecure
</command>
</client>
diff --git a/tests/data/test633 b/tests/data/test633
index d87bfb991..913d981f5 100644
--- a/tests/data/test633
+++ b/tests/data/test633
@@ -24,7 +24,7 @@ sftp
SFTP retrieval with byte range
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file633.txt -r 5-9 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file633.txt -r 5-9 --insecure
</command>
<file name="log/file633.txt">
Test data
diff --git a/tests/data/test634 b/tests/data/test634
index c93e09e5c..fc250f9c9 100644
--- a/tests/data/test634
+++ b/tests/data/test634
@@ -25,7 +25,7 @@ sftp
SFTP retrieval with byte range past end of file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file634.txt -r 5-99 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file634.txt -r 5-99 --insecure
</command>
<file name="log/file634.txt">
Test data
diff --git a/tests/data/test635 b/tests/data/test635
index e572567f1..16ef66c0f 100644
--- a/tests/data/test635
+++ b/tests/data/test635
@@ -24,7 +24,7 @@ sftp
SFTP retrieval with byte range relative to end of file
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file635.txt -r -9 --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file635.txt -r -9 --insecure
</command>
<file name="log/file635.txt">
Test data
diff --git a/tests/data/test636 b/tests/data/test636
index 29f165710..0ea350904 100644
--- a/tests/data/test636
+++ b/tests/data/test636
@@ -25,7 +25,7 @@ sftp
SFTP retrieval with X- byte range
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file636.txt -r 5- --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file636.txt -r 5- --insecure
</command>
<file name="log/file636.txt">
Test data
diff --git a/tests/data/test637 b/tests/data/test637
index c0f760fec..71b81268b 100644
--- a/tests/data/test637
+++ b/tests/data/test637
@@ -23,7 +23,7 @@ sftp
SFTP retrieval with invalid X- range
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file637.txt -r 99- --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file637.txt -r 99- --insecure
</command>
<file name="log/file637.txt">
Test data
diff --git a/tests/data/test638 b/tests/data/test638
index 1e42596a5..fdc140c6f 100644
--- a/tests/data/test638
+++ b/tests/data/test638
@@ -29,7 +29,7 @@ perl %SRCDIR/libtest/test610.pl mkdir %PWD/log/test638.dir
SFTP post-quote rename * asterisk accept-fail
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-*rename %PWD/log/test638.dir %PWD/log/test638.new" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file638.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-*rename %PWD/log/test638.dir %PWD/log/test638.new" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file638.txt --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl rmdir %PWD/log/test638.new
diff --git a/tests/data/test639 b/tests/data/test639
index bb06be756..d80c8c14c 100644
--- a/tests/data/test639
+++ b/tests/data/test639
@@ -29,7 +29,7 @@ perl %SRCDIR/libtest/test610.pl mkdir %PWD/log/test639.dir
SFTP post-quote rename * asterisk accept-fail
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-*rename %PWD/log/test639-not-exists-dir %PWD/log/test639.new" sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file639.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: -Q "-*rename %PWD/log/test639-not-exists-dir %PWD/log/test639.new" sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file639.txt --insecure
</command>
<postcheck>
perl %SRCDIR/libtest/test610.pl rmdir %PWD/log/test639.dir
diff --git a/tests/data/test64 b/tests/data/test64
index 804a6fa80..1e7a96eed 100644
--- a/tests/data/test64
+++ b/tests/data/test64
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/64 -u testuser:testpass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /64 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /64 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/64", response="c55f7f30d83d774a3d2dcacf725abaca"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test640 b/tests/data/test640
index 979ac2ba7..9d1ade4c0 100644
--- a/tests/data/test640
+++ b/tests/data/test640
@@ -23,7 +23,7 @@ sftp
SFTP --head retrieval
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file640.txt --insecure --head
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file640.txt --insecure --head
</command>
<file name="log/file640.txt">
Test data
diff --git a/tests/data/test641 b/tests/data/test641
index cc1da944e..9f168aaef 100644
--- a/tests/data/test641
+++ b/tests/data/test641
@@ -23,7 +23,7 @@ scp
SCP --head retrieval
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file641.txt --insecure --head
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file641.txt --insecure --head
</command>
<file name="log/file641.txt">
Test data
diff --git a/tests/data/test642 b/tests/data/test642
index 084626f04..6ae52bb82 100644
--- a/tests/data/test642
+++ b/tests/data/test642
@@ -24,7 +24,7 @@ sftp
SFTP retrieval
</name>
<command>
---key curl_client_key --pubkey curl_client_key.pub -u %USER: --compressed-ssh sftp://%HOSTIP:%SSHPORT%POSIX_PWD/log/file642.txt --insecure
+--key curl_client_key --pubkey curl_client_key.pub -u %USER: --compressed-ssh sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file642.txt --insecure
</command>
<file name="log/file642.txt">
Test data
diff --git a/tests/data/test643 b/tests/data/test643
index 0eaf22c5f..e8da2b1c4 100644
--- a/tests/data/test643
+++ b/tests/data/test643
@@ -69,18 +69,18 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
POST /643 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 718
+Content-Length: 640
Content-Type: multipart/form-data; boundary=----------------------------
------------------------------
Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
-this is what we post to the silly web server
+dummy
------------------------------
Content-Disposition: form-data; name="callbackdata"
-this is what we post to the silly web server
+dummy
------------------------------
Content-Disposition: form-data; name="filename"
@@ -99,18 +99,18 @@ blah blah
POST /643 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 732
+Content-Length: 654
Content-Type: multipart/form-data; boundary=----------------------------
------------------------------
Content-Disposition: form-data; name="sendfile alternative"; filename="file name 2"
-this is what we post to the silly web server
+dummy
------------------------------
Content-Disposition: form-data; name="callbackdata"
-this is what we post to the silly web server
+dummy
------------------------------
Content-Disposition: form-data; name="filename"
diff --git a/tests/data/test644 b/tests/data/test644
index 4c9a501ed..99337ae0f 100644
--- a/tests/data/test644
+++ b/tests/data/test644
@@ -44,12 +44,13 @@ s/boundary=------------------------[a-z0-9]*/boundary=--------------------------
POST /644 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
-Content-Length: 718
+Content-Length: 640
Content-Type: multipart/form-data; boundary=----------------------------
------------------------------
Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
+
</protocol>
# CURLE_ABORTED_BY_CALLBACK (42)
<errorcode>
diff --git a/tests/data/test645 b/tests/data/test645
index 6533944b4..eeb15f994 100644
--- a/tests/data/test645
+++ b/tests/data/test645
@@ -73,16 +73,42 @@ Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------
Expect: 100-continue
-2ce
+76
------------------------------
Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
-this is what we post to the silly web server
+d
+1
+u
+1
+m
+1
+m
+1
+y
+1
+
+
+65
------------------------------
Content-Disposition: form-data; name="callbackdata"
-this is what we post to the silly web server
+
+1
+d
+1
+u
+1
+m
+1
+m
+1
+y
+1
+
+
+19a
------------------------------
Content-Disposition: form-data; name="filename"
@@ -108,16 +134,42 @@ Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------
Expect: 100-continue
-2dc
+84
------------------------------
Content-Disposition: form-data; name="sendfile alternative"; filename="file name 2"
-this is what we post to the silly web server
+d
+1
+u
+1
+m
+1
+m
+1
+y
+1
+
+
+65
------------------------------
Content-Disposition: form-data; name="callbackdata"
-this is what we post to the silly web server
+
+1
+d
+1
+u
+1
+m
+1
+m
+1
+y
+1
+
+
+19a
------------------------------
Content-Disposition: form-data; name="filename"
diff --git a/tests/data/test65 b/tests/data/test65
index f0b974213..606523183 100644
--- a/tests/data/test65
+++ b/tests/data/test65
@@ -65,18 +65,16 @@ http://%HOSTIP:%HTTPPORT/65 -u testuser:test2pass --digest
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /65 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /65 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/65", response="66d68d3251f1839576ba7c766cf9205b"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test650 b/tests/data/test650
index 1a06064c7..03fe43816 100644
--- a/tests/data/test650
+++ b/tests/data/test650
@@ -63,7 +63,7 @@ Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------
Expect: 100-continue
-60a
+361
------------------------------
Content-Disposition: form-data; name="fieldname"
Content-Type: text/plain
@@ -89,12 +89,16 @@ This is data from a file.
Content-Disposition: attachment; filename="test650.filedata"
Content-Type: text/whatever
+
+a5
This is data from a file.
------------------------------
Content-Disposition: attachment; filename="test650.filedata"
Content-Type: text/whatever
+
+af
This is data from a file.
--------------------------------
@@ -102,6 +106,8 @@ This is data from a file.
------------------------------
Content-Disposition: form-data; name="filecontents"
+
+10f
This is data from a file.
------------------------------
@@ -112,8 +118,12 @@ Content-Disposition: form-data; name="formlength"
Content-Disposition: form-data; name="standardinput"
Content-Type: application/octet-stream
+
+16
Some data from stdin
+30
+
--------------------------------
0
diff --git a/tests/data/test651 b/tests/data/test651
index ae6409479..dd5736a70 100644
--- a/tests/data/test651
+++ b/tests/data/test651
@@ -61,7 +61,6 @@ Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 17139
Content-Type: multipart/form-data; boundary=----------------------------
-Expect: 100-continue
------------------------------
Content-Disposition: form-data; name="hello"
diff --git a/tests/data/test654 b/tests/data/test654
index 21697e763..9d4bf45a1 100644
--- a/tests/data/test654
+++ b/tests/data/test654
@@ -81,7 +81,7 @@ Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------
Expect: 100-continue
-20c
+1af
------------------------------
Content-Disposition: form-data; name="greeting"
Content-Type: application/X-Greeting
@@ -98,7 +98,21 @@ This is data from a file
------------------------------
Content-Disposition: form-data
-this is what we post to the silly web server
+
+1
+d
+1
+u
+1
+m
+1
+m
+1
+y
+1
+
+
+30
--------------------------------
diff --git a/tests/data/test656 b/tests/data/test656
index 8591490ed..fb0f27fb9 100644
--- a/tests/data/test656
+++ b/tests/data/test656
@@ -16,7 +16,7 @@ sftp
SFTP retrieval with nonexistent private key file
</name>
<command>
---key DOES_NOT_EXIST --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%POSIX_PWD/not-a-valid-file-moooo --insecure --connect-timeout 8
+--key DOES_NOT_EXIST --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/not-a-valid-file-moooo --insecure --connect-timeout 8
</command>
</client>
diff --git a/tests/data/test658 b/tests/data/test658
index 2ed6d6429..acf1846a6 100644
--- a/tests/data/test658
+++ b/tests/data/test658
@@ -38,9 +38,6 @@ http://%HOSTIP:%HTTPPORT/658
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /658 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/data/test659 b/tests/data/test659
index 048c0d0f2..f191a8e89 100644
--- a/tests/data/test659
+++ b/tests/data/test659
@@ -42,9 +42,6 @@ proxy
</client>
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://www.example.com:80/ HTTP/1.1
Host: www.example.com
diff --git a/tests/data/test66 b/tests/data/test66
index 7b9af2953..23bb9e9c1 100644
--- a/tests/data/test66
+++ b/tests/data/test66
@@ -29,12 +29,10 @@ http://%HOSTIP:%HTTPPORT/66 --http0.9
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /66 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test662 b/tests/data/test662
index 53d97c39d..3140c61c1 100644
--- a/tests/data/test662
+++ b/tests/data/test662
@@ -59,17 +59,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.com/please/gimme/662 HTTP/1.1
Host: example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.net/tes%20t%20case=/6620002 HTTP/1.1
Host: example.net
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test663 b/tests/data/test663
index 6743b3258..487be2503 100644
--- a/tests/data/test663
+++ b/tests/data/test663
@@ -1,8 +1,8 @@
+<testcase>
#
# This test is crafted to reproduce oss-fuzz bug
# https://crbug.com/oss-fuzz/17954
#
-<testcase>
<info>
<keywords>
HTTP
@@ -63,17 +63,16 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://example.com/gimme/663?foobar HTTP/1.1
Host: example.com
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://example.net/there/tes%20t%20case=/6630002?+yes+no HTTP/1.1
Host: example.net
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test664 b/tests/data/test664
new file mode 100644
index 000000000..6bea4ed1a
--- /dev/null
+++ b/tests/data/test664
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+SFTP
+server key check
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+test
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+sftp
+</server>
+ <name>
+SFTP correct host key
+ </name>
+ <command>
+--hostpubmd5 %SSHSRVMD5 --key curl_client_key --pubkey curl_client_key.pub -u %USER: sftp://%HOSTIP:%SSHPORT%SSH_PWD/log/file664.txt
+</command>
+<file name="log/file664.txt">
+test
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<valgrind>
+disable
+</valgrind>
+</verify>
+</testcase>
diff --git a/tests/data/test665 b/tests/data/test665
new file mode 100644
index 000000000..689fa31b6
--- /dev/null
+++ b/tests/data/test665
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+SCP
+server key check
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+test
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+scp
+</server>
+ <name>
+SCP correct host key
+ </name>
+ <command>
+--hostpubmd5 %SSHSRVMD5 --key curl_client_key --pubkey curl_client_key.pub -u %USER: scp://%HOSTIP:%SSHPORT%SSH_PWD/log/file665.txt
+</command>
+<file name="log/file665.txt">
+test
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+0
+</errorcode>
+<valgrind>
+disable
+</valgrind>
+</verify>
+</testcase>
diff --git a/tests/data/test666 b/tests/data/test666
new file mode 100644
index 000000000..bb60caf6d
--- /dev/null
+++ b/tests/data/test666
@@ -0,0 +1,293 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+MIME
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 3
+
+OK
+</data>
+<datacheck>
+HTTP/1.1 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Length: 3
+
+OK
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib666
+</tool>
+
+ <name>
+HTTP mime post with binary-encoded huge data contents
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/666
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /666 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 17225
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="upfile"; filename="myfile.txt"
+Content-Type: text/plain
+Content-Transfer-Encoding: binary
+
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
+NOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
+MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
+LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
+KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
+JKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
+IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABC
+EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
+DEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
+CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY
+ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
+ZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
+YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU
+WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
+VWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
+UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
+TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ
+STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
+RSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
+QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
+PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
+OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test667 b/tests/data/test667
new file mode 100644
index 000000000..2a183753b
--- /dev/null
+++ b/tests/data/test667
@@ -0,0 +1,85 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib667
+</tool>
+
+ <name>
+HTTP chunked mimepost using single-byte read callback with encoder
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/667
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /667 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Transfer-Encoding: chunked
+Content-Type: multipart/form-data; boundary=----------------------------
+Expect: 100-continue
+
+7f
+------------------------------
+Content-Disposition: form-data; name="field"
+Content-Transfer-Encoding: base64
+
+
+4
+ZHVt
+34
+bXk=
+--------------------------------
+
+0
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test668 b/tests/data/test668
new file mode 100644
index 000000000..af0a72051
--- /dev/null
+++ b/tests/data/test668
@@ -0,0 +1,99 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib668
+</tool>
+
+ <name>
+HTTP mimepost early end of data detection
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/668
+</command>
+<file name="log/file668.txt">
+This is data from a file
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+# Note that the stripping above removes 12 bytes from every occurrence of the
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
+<protocol>
+POST /668 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Transfer-Encoding: chunked
+Content-Type: multipart/form-data; boundary=----------------------------
+Expect: 100-continue
+
+c1
+------------------------------
+Content-Disposition: form-data; name="field1"
+
+dummy
+------------------------------
+Content-Disposition: form-data; name="field2"
+
+
+5
+dummy
+91
+
+------------------------------
+Content-Disposition: form-data; name="field3"; filename="file668.txt"
+Content-Type: text/plain
+
+
+49
+This is data from a file
+
+--------------------------------
+
+0
+
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test669 b/tests/data/test669
new file mode 100644
index 000000000..47b974ca3
--- /dev/null
+++ b/tests/data/test669
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+HTTP MIME POST
+HTTP FORMPOST
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+HTTP/1.0 200 OK swsclose
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+
+blablabla
+
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+ <name>
+HTTP custom Content-Type with parameter
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/we/want/669 -H 'Content-type: multipart/form-data; charset=utf-8' -F name=daniel -F tool=curl
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /we/want/669 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+Content-Length: 242
+Content-Type: multipart/form-data; charset=utf-8; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="name"
+
+daniel
+------------------------------
+Content-Disposition: form-data; name="tool"
+
+curl
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test67 b/tests/data/test67
index 1c64a2f51..8138c7418 100644
--- a/tests/data/test67
+++ b/tests/data/test67
@@ -56,6 +56,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -81,20 +82,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /67 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /67 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test670 b/tests/data/test670
new file mode 100644
index 000000000..19a51a4e0
--- /dev/null
+++ b/tests/data/test670
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+MIME
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib670
+</tool>
+
+ <name>
+Request pause from mime read callback: multi
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/670
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /670 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 142
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="field"
+
+AB
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test671 b/tests/data/test671
new file mode 100644
index 000000000..eada50a6e
--- /dev/null
+++ b/tests/data/test671
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+MIME
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib671
+</tool>
+
+ <name>
+Request pause from mime read callback: easy
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/671
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /671 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 142
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="field"
+
+AB
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test672 b/tests/data/test672
new file mode 100644
index 000000000..9c5f24556
--- /dev/null
+++ b/tests/data/test672
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+FORM
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib672
+</tool>
+
+ <name>
+Request pause from form read callback: multi
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/672
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /672 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 142
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="field"
+
+AB
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test673 b/tests/data/test673
new file mode 100644
index 000000000..efed2727b
--- /dev/null
+++ b/tests/data/test673
@@ -0,0 +1,72 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP POST
+FORM
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</data>
+<datacheck>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake swsclose
+Connection: close
+Content-Type: text/html
+
+hello
+</datacheck>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+# tool is what to use instead of 'curl'
+<tool>
+lib673
+</tool>
+
+ <name>
+Request pause from form read callback: easy
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/673
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /673 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+Content-Length: 142
+Content-Type: multipart/form-data; boundary=----------------------------
+
+------------------------------
+Content-Disposition: form-data; name="field"
+
+AB
+--------------------------------
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test674 b/tests/data/test674
new file mode 100644
index 000000000..38ed39ef5
--- /dev/null
+++ b/tests/data/test674
@@ -0,0 +1,54 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+CURLOPT_CURLU
+curl_easy_duphandle
+</keywords>
+</info>
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 6
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+-foo-
+</data>
+</reply>
+<client>
+<server>
+http
+</server>
+<tool>
+lib674
+</tool>
+<name>
+Set CURLOPT_CURLU and dupe the handle
+ </name>
+ <command>
+http://%HOSTIP:%HTTPPORT/674
+</command>
+</client>
+
+<verify>
+<protocol>
+GET /674 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+GET /674 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol>
+</verify>
+
+</testcase>
diff --git a/tests/data/test68 b/tests/data/test68
index 91d16ade6..57ab2580c 100644
--- a/tests/data/test68
+++ b/tests/data/test68
@@ -55,6 +55,7 @@ Wrong password dude. Get it fixed and return.
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -80,20 +81,17 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /68 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /68 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test69 b/tests/data/test69
index 7af662f6e..cc3178a6c 100644
--- a/tests/data/test69
+++ b/tests/data/test69
@@ -72,6 +72,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -97,25 +98,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /69 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test7 b/tests/data/test7
index 62731de13..317b235b9 100644
--- a/tests/data/test7
+++ b/tests/data/test7
@@ -38,12 +38,10 @@ http://%HOSTIP:%HTTPPORT/we/want/7 -b none -D log/heads7.txt
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/7 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test70 b/tests/data/test70
index 9057d6a4b..7057153e9 100644
--- a/tests/data/test70
+++ b/tests/data/test70
@@ -68,19 +68,16 @@ http://%HOSTIP:%HTTPPORT/70 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /70 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /70 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604199", uri="/70", response="2c9a6f00af0d86497b177b90e90c688a"
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test700 b/tests/data/test700
index ac63fa59a..f43590db3 100644
--- a/tests/data/test700
+++ b/tests/data/test700
@@ -44,12 +44,10 @@ HTTP GET via SOCKS4 proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /700 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test701 b/tests/data/test701
index 799597f38..3b687ff01 100644
--- a/tests/data/test701
+++ b/tests/data/test701
@@ -44,12 +44,10 @@ HTTP GET via SOCKS5 proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /701 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test702 b/tests/data/test702
index c03723676..dd84ffe26 100644
--- a/tests/data/test702
+++ b/tests/data/test702
@@ -31,14 +31,14 @@ proxy
Attempt connect to non-listening HTTP server via SOCKS4 proxy
</name>
<command>
---socks4 %HOSTIP:%SOCKSPORT http://%HOSTIP:60000
+--socks4 %HOSTIP:%SOCKSPORT http://%HOSTIP:%NOLISTENPORT
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<errorcode>
-7
+97
</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test703 b/tests/data/test703
index 53d6a0222..3c3487aee 100644
--- a/tests/data/test703
+++ b/tests/data/test703
@@ -31,14 +31,14 @@ proxy
Attempt connect to non-listening HTTP server via SOCKS5 proxy
</name>
<command>
---socks5 %HOSTIP:%SOCKSPORT http://%HOSTIP:60000
+--socks5 %HOSTIP:%SOCKSPORT http://%HOSTIP:%NOLISTENPORT
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<errorcode>
-7
+97
</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test704 b/tests/data/test704
index 7f891fa95..9e821c608 100644
--- a/tests/data/test704
+++ b/tests/data/test704
@@ -23,7 +23,7 @@ http
Attempt connect to non-listening SOCKS4 proxy
</name>
<command>
---socks4 %HOSTIP:2 http://%HOSTIP:%HTTPPORT/704
+--socks4 %HOSTIP:%NOLISTENPORT http://%HOSTIP:%HTTPPORT/704
</command>
<features>
proxy
diff --git a/tests/data/test705 b/tests/data/test705
index cfbf3419f..e7ba01220 100644
--- a/tests/data/test705
+++ b/tests/data/test705
@@ -23,7 +23,7 @@ http
Attempt connect to non-listening SOCKS5 proxy
</name>
<command>
---socks5 %HOSTIP:2 http://%HOSTIP:%HTTPPORT/705
+--socks5 %HOSTIP:%NOLISTENPORT http://%HOSTIP:%HTTPPORT/705
</command>
<features>
proxy
diff --git a/tests/data/test708 b/tests/data/test708
index e8bffc365..85aa95ed4 100644
--- a/tests/data/test708
+++ b/tests/data/test708
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/708
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /708 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test709 b/tests/data/test709
index fa7fbc017..a2631521c 100644
--- a/tests/data/test709
+++ b/tests/data/test709
@@ -47,12 +47,10 @@ http://%HOSTIP:%HTTPPORT/709
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /709 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test710 b/tests/data/test710
index 884eb50a0..92df2f358 100644
--- a/tests/data/test710
+++ b/tests/data/test710
@@ -44,12 +44,10 @@ http://%HOSTIP:%HTTPPORT/710 --proxy socks5://%HOSTIP:%SOCKSPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /710 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test716 b/tests/data/test716
index 96167de5c..531e272fa 100644
--- a/tests/data/test716
+++ b/tests/data/test716
@@ -39,7 +39,7 @@ http://hohoho.example.com:99/716 -x socks5://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Verify data after the test has been "shot"
<verify>
<errorcode>
-43
+97
</errorcode>
</verify>
</testcase>
diff --git a/tests/data/test717 b/tests/data/test717
index dae50d9f2..5de8fcb69 100644
--- a/tests/data/test717
+++ b/tests/data/test717
@@ -55,12 +55,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /717 HTTP/1.1
Host: %HOSTIP:1
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test72 b/tests/data/test72
index 8e3adaa50..1160121b2 100644
--- a/tests/data/test72
+++ b/tests/data/test72
@@ -67,19 +67,16 @@ http://%HOSTIP:%HTTPPORT/72 -u testuser:testpass --anyauth
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /72 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /72 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604199", uri="/72", response="9fcd1330377365a09bbcb33b2cbb25bd"
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test73 b/tests/data/test73
index 70408a865..893377987 100644
--- a/tests/data/test73
+++ b/tests/data/test73
@@ -35,12 +35,10 @@ http://%HOSTIP:%HTTPPORT/we/want/73 -c log/jar73.txt -H "Host: host.NOT_DISCLOSE
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/73 HTTP/1.1
Host: host.NOT_DISCLOSED.se
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test74 b/tests/data/test74
index dbe0e9c13..1a7d73fc3 100644
--- a/tests/data/test74
+++ b/tests/data/test74
@@ -50,16 +50,15 @@ HTTP, urlglob {}-retrieval and -o #[num] usage
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /74 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /740001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test75 b/tests/data/test75
index 115963dfa..7bee04443 100644
--- a/tests/data/test75
+++ b/tests/data/test75
@@ -27,19 +27,11 @@ HTTP, urlglob retrieval with bad range
<command option="no-output">
"http://a-site-never-accessed.example.org/[2-1]" -o "log/weee#1.dump" --stderr -
</command>
-# The error message on stdout implicitly depends on the length of the
-# URL, so refuse to run if the length is unexpected.
-<precheck>
-perl %SRCDIR/libtest/test75.pl http://%HOSTIP:%HTTPPORT/ 22
-</precheck>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
3
</errorcode>
diff --git a/tests/data/test76 b/tests/data/test76
index ada3a3359..fc4a30d03 100644
--- a/tests/data/test76
+++ b/tests/data/test76
@@ -22,16 +22,13 @@ http
HTTP, -O with no file name part in the URL
</name>
<command option="no-output">
-http://%HOSTIP:%HTTPPORT/76/ -O
+http://%HOSTIP:%NOLISTENPORT/76/ -O
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<errorcode>
23
</errorcode>
diff --git a/tests/data/test77 b/tests/data/test77
index 6a92158c8..81ea63720 100644
--- a/tests/data/test77
+++ b/tests/data/test77
@@ -42,12 +42,10 @@ http://%HOSTIP:%HTTPPORT/77 -z "dec 12 12:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /77 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 12:00:00 GMT
diff --git a/tests/data/test78 b/tests/data/test78
index 6768000b4..d7f7d0fb0 100644
--- a/tests/data/test78
+++ b/tests/data/test78
@@ -54,12 +54,10 @@ http://%HOSTIP:%HTTPPORT/78 -z "dec 12 11:00:00 1999 GMT"
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /78 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
If-Modified-Since: Sun, 12 Dec 1999 11:00:00 GMT
diff --git a/tests/data/test79 b/tests/data/test79
index 9bc836681..e967bae0f 100644
--- a/tests/data/test79
+++ b/tests/data/test79
@@ -42,12 +42,10 @@ ftp://%HOSTIP:%HTTPPORT/we/want/that/page/79 -x %HOSTIP:%HTTPPORT
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET ftp://%HOSTIP:%HTTPPORT/we/want/that/page/79 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test8 b/tests/data/test8
index 2fc190060..02c6c0620 100644
--- a/tests/data/test8
+++ b/tests/data/test8
@@ -55,12 +55,10 @@ perl -e 'if ("%HOSTIP" !~ /\.0\.0\.1$/) {print "Test only works for HOSTIPs endi
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /we/want/8 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Cookie: name with space=is weird but; trailingspace=removed; cookie=perhaps; cookie=yes; foobar=name; blexp=yesyes
diff --git a/tests/data/test80 b/tests/data/test80
index 3e61eddde..26b74f78e 100644
--- a/tests/data/test80
+++ b/tests/data/test80
@@ -63,14 +63,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.80:%HTTPPORT HTTP/1.0
Host: test.80:%HTTPPORT
Proxy-Authorization: Basic eW91YXJlOnlvdXJzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
@@ -78,7 +75,7 @@ Proxy-Connection: Keep-Alive
GET /we/want/that/page/80 HTTP/1.1
Host: test.80:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test81 b/tests/data/test81
index 4cc03975e..6a4912557 100644
--- a/tests/data/test81
+++ b/tests/data/test81
@@ -55,6 +55,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
proxy
@@ -81,21 +82,18 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
GET http://%HOSTIP:%HTTPPORT/81 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test82 b/tests/data/test82
index 88d5da84d..138c8ee40 100644
--- a/tests/data/test82
+++ b/tests/data/test82
@@ -41,14 +41,11 @@ http://%HOSTIP:%HTTPPORT/82 --proxy-user testuser:testpass -x http://%HOSTIP:%HT
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/82 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test822 b/tests/data/test822
index 5fea05ba8..aa264edd6 100644
--- a/tests/data/test822
+++ b/tests/data/test822
@@ -35,6 +35,7 @@ imap
</server>
<features>
NTLM
+SSL
!SSPI
debug
</features>
diff --git a/tests/data/test827 b/tests/data/test827
index d27112112..9cefb5005 100644
--- a/tests/data/test827
+++ b/tests/data/test827
@@ -36,6 +36,7 @@ imap
</server>
<features>
NTLM
+SSL
!SSPI
debug
</features>
diff --git a/tests/data/test83 b/tests/data/test83
index 400e0a0f3..6d7446d18 100644
--- a/tests/data/test83
+++ b/tests/data/test83
@@ -60,13 +60,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.83:%HTTPPORT HTTP/1.1
Host: test.83:%HTTPPORT
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
@@ -74,7 +71,7 @@ Proxy-Connection: Keep-Alive
GET /we/want/that/page/83 HTTP/1.1
Host: test.83:%HTTPPORT
Authorization: Basic aWFtOm15OjtzZWxm
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test831 b/tests/data/test831
index fdcae29c1..eae10f048 100644
--- a/tests/data/test831
+++ b/tests/data/test831
@@ -28,6 +28,7 @@ imap
</server>
<features>
NTLM
+SSL
!SSPI
</features>
<name>
diff --git a/tests/data/test834 b/tests/data/test834
index 35ab06aff..8ecc22322 100644
--- a/tests/data/test834
+++ b/tests/data/test834
@@ -39,6 +39,7 @@ imap
</server>
<features>
NTLM
+SSL
!SSPI
</features>
<name>
diff --git a/tests/data/test84 b/tests/data/test84
index 4cfde6dbb..37533e00d 100644
--- a/tests/data/test84
+++ b/tests/data/test84
@@ -41,14 +41,11 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/84 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Basic aWFtOm15c2VsZg==
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test842 b/tests/data/test842
index 1d9181e17..2b5ae1c18 100644
--- a/tests/data/test842
+++ b/tests/data/test842
@@ -15,7 +15,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTHENTICATE +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== A002 OK AUTHENTICATE completed
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -42,9 +42,6 @@ IMAP OAuth 2.0 (OAUTHBEARER) authentication
</command>
# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
-</precheck>
</client>
#
@@ -53,7 +50,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
A003 SELECT 842
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test843 b/tests/data/test843
index bd39dd907..131188933 100644
--- a/tests/data/test843
+++ b/tests/data/test843
@@ -41,11 +41,6 @@ IMAP OAuth 2.0 (OAUTHBEARER) authentication with initial response
<command>
'imap://%HOSTIP:%IMAPPORT/843/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
-</precheck>
</client>
#
@@ -53,7 +48,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<verify>
<protocol>
A001 CAPABILITY
-A002 AUTHENTICATE OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+A002 AUTHENTICATE OAUTHBEARER %b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
A003 SELECT 843
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/data/test844 b/tests/data/test844
index c5093d2b8..8573bc2fd 100644
--- a/tests/data/test844
+++ b/tests/data/test844
@@ -15,9 +15,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTHENTICATE +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +
-eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0=
-REPLY AQ== A002 NO Authentication failed
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% A002 NO Authentication failed
</servercmd>
</reply>
@@ -33,11 +31,6 @@ IMAP OAuth 2.0 (OAUTHBEARER) failure as continuation
<command>
'imap://%HOSTIP:%IMAPPORT/844/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
-</precheck>
</client>
#
@@ -53,8 +46,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
-AQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test845 b/tests/data/test845
index 70562c7ab..449eef353 100644
--- a/tests/data/test845
+++ b/tests/data/test845
@@ -33,11 +33,6 @@ IMAP OAuth 2.0 (OAUTHBEARER) failure as continuation with initial response
<command>
'imap://%HOSTIP:%IMAPPORT/845/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
-</precheck>
</client>
#
@@ -52,8 +47,8 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
# transfer and such a connection will not get a "LOGOUT"
<protocol>
A001 CAPABILITY
-A002 AUTHENTICATE OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
-AQ==
+A002 AUTHENTICATE OAUTHBEARER %b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
+%b64[%01]b64%
</protocol>
</verify>
</testcase>
diff --git a/tests/data/test85 b/tests/data/test85
index 8b4cd6abc..ebdc37052 100644
--- a/tests/data/test85
+++ b/tests/data/test85
@@ -44,15 +44,12 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/we/want/that/page/85 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Proxy-Authorization: Basic dGVzdGluZzp0aGlz
Authorization: Basic aWFtOm15c2VsZg==
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test86 b/tests/data/test86
index a69509ae2..26b66c431 100644
--- a/tests/data/test86
+++ b/tests/data/test86
@@ -64,23 +64,20 @@ HTTP, urlglob []-retrieval and -o #[num] usage
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /860001 HTTP/1.1
-User-Agent: curl/7.10.7-pre4 (i686-pc-linux-gnu) libcurl/7.10.7-pre4 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /860002 HTTP/1.1
-User-Agent: curl/7.10.7-pre4 (i686-pc-linux-gnu) libcurl/7.10.7-pre4 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /860003 HTTP/1.1
-User-Agent: curl/7.10.7-pre4 (i686-pc-linux-gnu) libcurl/7.10.7-pre4 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test868 b/tests/data/test868
index fc0589251..2fa2405ad 100644
--- a/tests/data/test868
+++ b/tests/data/test868
@@ -37,6 +37,7 @@ pop3
</server>
<features>
NTLM
+SSL
!SSPI
debug
</features>
diff --git a/tests/data/test873 b/tests/data/test873
index 9c068dcb4..2cabf1f63 100644
--- a/tests/data/test873
+++ b/tests/data/test873
@@ -37,6 +37,7 @@ pop3
</server>
<features>
NTLM
+SSL
!SSPI
debug
</features>
diff --git a/tests/data/test877 b/tests/data/test877
index c4775942f..114707aad 100644
--- a/tests/data/test877
+++ b/tests/data/test877
@@ -29,6 +29,7 @@ pop3
</server>
<features>
NTLM
+SSL
!SSPI
</features>
<name>
diff --git a/tests/data/test88 b/tests/data/test88
index e2d019c06..40b0e8f4d 100644
--- a/tests/data/test88
+++ b/tests/data/test88
@@ -75,19 +75,17 @@ four is the number of lines
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /88 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 0
PUT /88 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/88", response="78a49fa53d0c228778297687d4168e71"
-User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 85
Expect: 100-continue
diff --git a/tests/data/test880 b/tests/data/test880
index 738817cd3..e0609bbdc 100644
--- a/tests/data/test880
+++ b/tests/data/test880
@@ -41,6 +41,7 @@ pop3
</server>
<features>
NTLM
+SSL
!SSPI
</features>
<name>
diff --git a/tests/data/test887 b/tests/data/test887
index 35419b502..ccf364955 100644
--- a/tests/data/test887
+++ b/tests/data/test887
@@ -17,7 +17,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== +OK Login successful
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%POP3PORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% +OK Login successful
</servercmd>
<data>
From: me@somewhere
@@ -42,11 +42,6 @@ POP3 OAuth 2.0 (OAUTHBEARER) authentication
<command>
pop3://%HOSTIP:%POP3PORT/887 -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
-</precheck>
</client>
#
@@ -55,7 +50,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
CAPA
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%POP3PORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
RETR 887
QUIT
</protocol>
diff --git a/tests/data/test888 b/tests/data/test888
index 78463feaa..465a2d0ce 100644
--- a/tests/data/test888
+++ b/tests/data/test888
@@ -42,11 +42,6 @@ POP3 OAuth 2.0 (OAUTHBEARER) authentication with initial response
<command>
pop3://%HOSTIP:%POP3PORT/888 -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
-</precheck>
</client>
#
@@ -54,7 +49,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<verify>
<protocol>
CAPA
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER %b64[n,a=user,%01host=127.0.0.1%01port=%POP3PORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
RETR 888
QUIT
</protocol>
diff --git a/tests/data/test889 b/tests/data/test889
index 2edb371e9..9658d386c 100644
--- a/tests/data/test889
+++ b/tests/data/test889
@@ -17,7 +17,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%POP3PORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
REPLY AQ== -ERR Authentication failed
</servercmd>
</reply>
@@ -34,11 +34,6 @@ POP3 OAuth 2.0 (OAUTHBEARER) failure as continuation
<command>
pop3://%HOSTIP:%POP3PORT/889 -u user --oauth2-bearer mF_9.B5f-4.1JqM
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
-</precheck>
</client>
#
@@ -54,7 +49,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
CAPA
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%POP3PORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
AQ==
</protocol>
</verify>
diff --git a/tests/data/test89 b/tests/data/test89
index 65b96dbca..0537fa5d4 100644
--- a/tests/data/test89
+++ b/tests/data/test89
@@ -89,6 +89,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -114,32 +115,29 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /89 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /89 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /you/890010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /you/890010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADYzMjE3MzIxAAAAAAAAAAAAAAAAAAAAAEcJ4YHOeb5ga2TCPwDhkyUIuHjBUHcLaHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test890 b/tests/data/test890
index ca0ccc7b5..4d6701ab0 100644
--- a/tests/data/test890
+++ b/tests/data/test890
@@ -34,11 +34,6 @@ POP3 OAuth 2.0 (OAUTHBEARER) failure as continuation with initial response
<command>
pop3://%HOSTIP:%POP3PORT/890 -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%POP3PORT' ne '9001' );"
-</precheck>
</client>
#
@@ -53,7 +48,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
# transfer and such a connection will not get a "QUIT"
<protocol>
CAPA
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER %b64[n,a=user,%01host=127.0.0.1%01port=%POP3PORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
AQ==
</protocol>
</verify>
diff --git a/tests/data/test894 b/tests/data/test894
new file mode 100644
index 000000000..db79830ca
--- /dev/null
+++ b/tests/data/test894
@@ -0,0 +1,37 @@
+<testcase>
+<info>
+<keywords>
+POP3
+Clear Text
+RETR
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 with CR in username
+ </name>
+ <command>
+pop3://user%0dFRIGGING_cmd:secret@%HOSTIP:%POP3PORT/894
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# malformed URL
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test895 b/tests/data/test895
new file mode 100644
index 000000000..78d48c475
--- /dev/null
+++ b/tests/data/test895
@@ -0,0 +1,50 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+Clear Text
+FETCH
+--login-options
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+From: me@somewhere
+To: fake@nowhere
+
+body
+
+--
+ yours sincerely
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP with --login-options 'AUTH=*'
+ </name>
+ <command>
+'imap://%HOSTIP:%IMAPPORT/895/;MAILINDEX=1' -u '"user:sec"ret{' --login-options 'AUTH=*'
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+A001 CAPABILITY
+A002 LOGIN "\"user" "sec\"ret{"
+A003 SELECT 895
+A004 FETCH 1 BODY[]
+A005 LOGOUT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test896 b/tests/data/test896
new file mode 100644
index 000000000..c972906a4
--- /dev/null
+++ b/tests/data/test896
@@ -0,0 +1,38 @@
+<testcase>
+<info>
+<keywords>
+IMAP
+Clear Text
+FETCH
+--login-options
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+imap
+</server>
+ <name>
+IMAP with --login-options 'AUTH=dummy' (failing)
+ </name>
+ <command>
+'imap://%HOSTIP:%IMAPPORT/895/;MAILINDEX=1' -u '"user:sec"ret{' --login-options 'AUTH=dummy'
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 3 == CURLE_URL_MALFORMAT
+<errorcode>
+3
+</errorcode>
+</verify>
+</testcase>
diff --git a/tests/data/test9 b/tests/data/test9
index 53fe25eda..adef69419 100644
--- a/tests/data/test9
+++ b/tests/data/test9
@@ -40,12 +40,12 @@ bar
# Verify data after the test has been "shot"
<verify>
<strip>
-^(User-Agent:|Content-Type: multipart/form-data;|------------).*
+^(Content-Type: multipart/form-data;|------------).*
</strip>
<protocol>
POST /we/want/9 HTTP/1.1
-User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 407
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
diff --git a/tests/data/test90 b/tests/data/test90
index 1c8f13944..91d569d08 100644
--- a/tests/data/test90
+++ b/tests/data/test90
@@ -127,6 +127,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -152,40 +153,39 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /90 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAADj3hs3u3j0kgJqCrLM+74BmaoNHDfIJjHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
GET /you/900010 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAAAAABwAAAACAAIAHAAAAAIAAgAeAAAAAAAAAAAAAAAhoIBADYzMjE3MzIxAAAAAAAAAAAAAAAAAAAAAEcJ4YHOeb5ga2TCPwDhkyUIuHjBUHcLaHRlc3R1c2VyY3VybGhvc3Q=
-User-Agent: curl/7.10.8-pre1 (i686-pc-linux-gnu) libcurl/7.10.8-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3 GSS
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test906 b/tests/data/test906
index c038f7fe1..6ec59c7b1 100644
--- a/tests/data/test906
+++ b/tests/data/test906
@@ -27,6 +27,7 @@ smtp
</server>
<features>
NTLM
+SSL
!SSPI
debug
</features>
diff --git a/tests/data/test91 b/tests/data/test91
index d54065593..314a65514 100644
--- a/tests/data/test91
+++ b/tests/data/test91
@@ -73,6 +73,7 @@ Finally, this is the real page!
<client>
<features>
NTLM
+SSL
!SSPI
debug
</features>
@@ -98,25 +99,22 @@ chkhostname curlhost
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAABAAAABoIIAAAAAAAAAAAAAAAAAAAAAAA=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
GET /91 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAEAAAAAYABgAWAAAAAgACABwAAAABgAGAHgAAAAIAAgAfgAAAAAAAAAAAAAAhoIBADQzMjE1MzIxAAAAAAAAAAAAAAAAAAAAAKBS3rdGYZEGsqW8otYHWXWBxC5mCuFmYm15ZG9tYWlubXlzZWxmY3VybGhvc3Q=
-User-Agent: curl/7.10.6-pre1 (i686-pc-linux-gnu) libcurl/7.10.6-pre1 OpenSSL/0.9.7a ipv6 zlib/1.1.3
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test914 b/tests/data/test914
index d1532c806..0124b7671 100644
--- a/tests/data/test914
+++ b/tests/data/test914
@@ -8,6 +8,9 @@ SMTP
#
# Server-side
<reply>
+<servercmd>
+REPLY MAIL 501 not fine enough
+</servercmd>
</reply>
#
diff --git a/tests/data/test92 b/tests/data/test92
index 728d271b0..7e03f0a12 100644
--- a/tests/data/test92
+++ b/tests/data/test92
@@ -54,13 +54,11 @@ http://%HOSTIP:%HTTPPORT/want/92 -C 87
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /want/92 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=87-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/data/test921 b/tests/data/test921
index 577102706..f9e56736d 100644
--- a/tests/data/test921
+++ b/tests/data/test921
@@ -27,6 +27,7 @@ smtp
</server>
<features>
NTLM
+SSL
!SSPI
debug
</features>
diff --git a/tests/data/test923 b/tests/data/test923
index cb811bb0e..9d9722f9a 100644
--- a/tests/data/test923
+++ b/tests/data/test923
@@ -9,9 +9,6 @@ VRFY
#
# Server-side
<reply>
-<data>
-250 <recipient@example.com>
-</data>
</reply>
#
diff --git a/tests/data/test93 b/tests/data/test93
index 58e47bc6b..684e56cd4 100644
--- a/tests/data/test93
+++ b/tests/data/test93
@@ -39,12 +39,10 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET http://%HOSTIP:%HTTPPORT/93 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Proxy-Connection: Keep-Alive
diff --git a/tests/data/test933 b/tests/data/test933
index 08b4e9dd0..e091de395 100644
--- a/tests/data/test933
+++ b/tests/data/test933
@@ -28,6 +28,7 @@ smtp
</server>
<features>
NTLM
+SSL
!SSPI
</features>
<name>
diff --git a/tests/data/test936 b/tests/data/test936
index 5fde3c967..b12349968 100644
--- a/tests/data/test936
+++ b/tests/data/test936
@@ -31,6 +31,7 @@ smtp
</server>
<features>
NTLM
+SSL
!SSPI
</features>
<name>
diff --git a/tests/data/test94 b/tests/data/test94
index 4ca53c63b..6d54e7870 100644
--- a/tests/data/test94
+++ b/tests/data/test94
@@ -45,13 +45,10 @@ https://test.anything.really.com:94 --proxy1.0 %HOSTIP:%HTTPPORT
<errorcode>
56
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
CONNECT test.anything.really.com:94 HTTP/1.0
-User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4
Host: test.anything.really.com:94
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</protocol>
diff --git a/tests/data/test946 b/tests/data/test946
index c6753dc1e..aa88364fa 100644
--- a/tests/data/test946
+++ b/tests/data/test946
@@ -16,7 +16,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH 334 OAUTHBEARER supported
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 235 Authenticated
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%SMTPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% 235 Authenticated
</servercmd>
</reply>
@@ -35,11 +35,6 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/946 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM -T -
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
-</precheck>
</client>
#
@@ -48,7 +43,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
EHLO 946
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%SMTPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test947 b/tests/data/test947
index 03c3fbe37..d2622be8d 100644
--- a/tests/data/test947
+++ b/tests/data/test947
@@ -35,11 +35,6 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/947 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir -T -
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
-</precheck>
</client>
#
@@ -47,7 +42,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<verify>
<protocol>
EHLO 947
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER %b64[n,a=user,%01host=127.0.0.1%01port=%SMTPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
diff --git a/tests/data/test948 b/tests/data/test948
index 8385f0cd2..a6eadf5fa 100644
--- a/tests/data/test948
+++ b/tests/data/test948
@@ -16,7 +16,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTH 334 OAUTHBEARER supported
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%SMTPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxlX3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0
REPLY AQ== 535 Username and Password not accepted. Learn more at\r\n535 http://support.example.com/mail/oauth
</servercmd>
</reply>
@@ -36,11 +36,6 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/948 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM -T -
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
-</precheck>
</client>
#
@@ -56,7 +51,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
EHLO 948
AUTH OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%SMTPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
AQ==
</protocol>
</verify>
diff --git a/tests/data/test949 b/tests/data/test949
index 345940077..82064f19a 100644
--- a/tests/data/test949
+++ b/tests/data/test949
@@ -36,11 +36,6 @@ mail body
<command>
smtp://%HOSTIP:%SMTPPORT/949 --mail-rcpt recipient@example.com --mail-from sender@example.com -u user --oauth2-bearer mF_9.B5f-4.1JqM --sasl-ir -T -
</command>
-# The protocol section doesn't support ways of specifying the raw data in the
-# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%SMTPPORT' ne '9005' );"
-</precheck>
</client>
#
@@ -55,7 +50,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
# transfer and such a connection will not get a "QUIT"
<protocol>
EHLO 949
-AUTH OAUTHBEARER bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwNQFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+AUTH OAUTHBEARER %b64[n,a=user,%01host=127.0.0.1%01port=%SMTPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
AQ==
</protocol>
</verify>
diff --git a/tests/data/test95 b/tests/data/test95
index afc00aede..0b16c3cd1 100644
--- a/tests/data/test95
+++ b/tests/data/test95
@@ -60,20 +60,17 @@ proxy
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<proxy>
CONNECT test.95:%HTTPPORT HTTP/1.1
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
Host: test.95:%HTTPPORT
+User-Agent: curl/%VERSION
Proxy-Connection: Keep-Alive
</proxy>
<protocol nonewline="yes">
POST /we/want/that/page/95 HTTP/1.1
-User-Agent: curl/7.10.7-pre2 (i686-pc-linux-gnu) libcurl/7.10.7-pre2 OpenSSL/0.9.7a zlib/1.1.3
Host: test.95:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 27
Content-Type: application/x-www-form-urlencoded
diff --git a/tests/data/test955 b/tests/data/test955
new file mode 100644
index 000000000..97ef29561
--- /dev/null
+++ b/tests/data/test955
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY MAIL 501 not fine enough
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP without SMTPUTF8 support - UTF-8 based sender (local part only)
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/955 --mail-rcpt recipient@example.com --mail-from Avsändaren@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 55 - CURLE_SEND_ERROR
+<errorcode>
+55
+</errorcode>
+<protocol>
+EHLO 955
+MAIL FROM:<Avsändaren@example.com>
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test956 b/tests/data/test956
new file mode 100644
index 000000000..7fc9bc9af
--- /dev/null
+++ b/tests/data/test956
@@ -0,0 +1,57 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP without SMTPUTF8 support - UTF-8 based recipient (local part only)
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/956 --mail-rcpt Stödmottagaren@example.com --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 55 - CURLE_SEND_ERROR
+<errorcode>
+55
+</errorcode>
+<protocol>
+EHLO 956
+MAIL FROM:<sender@example.com>
+RCPT TO:<Stödmottagaren@example.com>
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test957 b/tests/data/test957
new file mode 100644
index 000000000..28c9c478a
--- /dev/null
+++ b/tests/data/test957
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP VRFY without SMTPUTF8 support - UTF-8 based recipient (local part only)
+ </name>
+<command>
+smtp://%HOSTIP:%SMTPPORT/957 --mail-rcpt Användaren
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 56 - CURLE_RECV_ERROR
+<errorcode>
+56
+</errorcode>
+<protocol>
+EHLO 957
+VRFY Användaren
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test958 b/tests/data/test958
new file mode 100644
index 000000000..66ba414cb
--- /dev/null
+++ b/tests/data/test958
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP external VRFY without SMTPUTF8 support - UTF-8 based recipient (local part only)
+ </name>
+<command>
+smtp://%HOSTIP:%SMTPPORT/958 --mail-rcpt Användaren@example.com
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 56 - CURLE_RECV_ERROR
+<errorcode>
+56
+</errorcode>
+<protocol>
+EHLO 958
+VRFY Användaren@example.com
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test959 b/tests/data/test959
new file mode 100644
index 000000000..1b2d65842
--- /dev/null
+++ b/tests/data/test959
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY MAIL 501 not fine enough
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP without SMTPUTF8 support - UTF-8 based sender (host part only)
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/959 --mail-rcpt recipient@example.com --mail-from sender@åäö.se -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 55 - CURLE_SEND_ERROR
+<errorcode>
+55
+</errorcode>
+<protocol>
+EHLO 959
+MAIL FROM:<sender@åäö.se>
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test960 b/tests/data/test960
new file mode 100644
index 000000000..32834cda0
--- /dev/null
+++ b/tests/data/test960
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP without SMTPUTF8 support - UTF-8 based recipient (host part only)
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/960 --mail-rcpt recipient@åäö.se --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 55 - CURLE_SEND_ERROR
+<errorcode>
+55
+</errorcode>
+<protocol>
+EHLO 960
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@åäö.se>
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test961 b/tests/data/test961
new file mode 100644
index 000000000..2148a0ce5
--- /dev/null
+++ b/tests/data/test961
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+!idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP external VRFY without SMTPUTF8 support - UTF-8 based recipient (host part only)
+ </name>
+<command>
+smtp://%HOSTIP:%SMTPPORT/961 --mail-rcpt user@åäö.se
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+# 56 - CURLE_RECV_ERROR
+<errorcode>
+56
+</errorcode>
+<protocol>
+EHLO 961
+VRFY user@åäö.se
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test962 b/tests/data/test962
new file mode 100644
index 000000000..35b368cfd
--- /dev/null
+++ b/tests/data/test962
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP without SMTPUTF8 support - UTF-8 based sender (host part only)
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/962 --mail-rcpt recipient@example.com --mail-from sender@åäö.se -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 962
+MAIL FROM:<sender@xn--4cab6c.se>
+RCPT TO:<recipient@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test963 b/tests/data/test963
new file mode 100644
index 000000000..7ea121507
--- /dev/null
+++ b/tests/data/test963
@@ -0,0 +1,63 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP without SMTPUTF8 support (IDN Enabked) - UTF-8 based recipient (host part only)
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/963 --mail-rcpt recipient@åäö.se --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 963
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@xn--4cab6c.se>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test964 b/tests/data/test964
new file mode 100644
index 000000000..5448d0f21
--- /dev/null
+++ b/tests/data/test964
@@ -0,0 +1,49 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP external VRFY without SMTPUTF8 support (IDN Enabled) - UTF-8 based recipient (host part only)
+ </name>
+<command>
+smtp://%HOSTIP:%SMTPPORT/964 --mail-rcpt user@åäö.se
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 964
+VRFY user@xn--4cab6c.se
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test965 b/tests/data/test965
new file mode 100644
index 000000000..8c93bc0c8
--- /dev/null
+++ b/tests/data/test965
@@ -0,0 +1,66 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+CAPA SMTPUTF8
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP with SMTPUTF8 support - UTF-8 based sender
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/965 --mail-rcpt recipient@example.com --mail-from Avsändaren@åäö.se -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 965
+MAIL FROM:<Avsändaren@xn--4cab6c.se> SMTPUTF8
+RCPT TO:<recipient@example.com>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test966 b/tests/data/test966
new file mode 100644
index 000000000..499fdda61
--- /dev/null
+++ b/tests/data/test966
@@ -0,0 +1,66 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+CAPA SMTPUTF8
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP with SMTPUTF8 support - UTF-8 based recipient
+ </name>
+<stdin>
+From: different
+To: another
+
+body
+</stdin>
+<command>
+smtp://%HOSTIP:%SMTPPORT/966 --mail-rcpt Stödmottagaren@åäö.se --mail-from sender@example.com -T -
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 966
+MAIL FROM:<sender@example.com> SMTPUTF8
+RCPT TO:<Stödmottagaren@xn--4cab6c.se>
+DATA
+QUIT
+</protocol>
+<upload>
+From: different
+To: another
+
+body
+.
+</upload>
+</verify>
+</testcase>
diff --git a/tests/data/test967 b/tests/data/test967
new file mode 100644
index 000000000..2813f508b
--- /dev/null
+++ b/tests/data/test967
@@ -0,0 +1,55 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+CAPA SMTPUTF8
+</servercmd>
+<data>
+252 Send some mail and I'll try my best
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP external VRFY with SMTPUTF8 support
+ </name>
+<command>
+smtp://%HOSTIP:%SMTPPORT/967 --mail-rcpt Användaren@åäö.se
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 967
+VRFY Användaren@xn--4cab6c.se SMTPUTF8
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test968 b/tests/data/test968
new file mode 100644
index 000000000..ca58970c2
--- /dev/null
+++ b/tests/data/test968
@@ -0,0 +1,52 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+VRFY
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+CAPA SMTPUTF8
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+<setenv>
+LC_ALL=en_US.UTF-8
+LC_CTYPE=en_US.UTF-8
+</setenv>
+<precheck>
+perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
+</precheck>
+ <name>
+SMTP VRFY with SMTPUTF8 support
+ </name>
+<command>
+smtp://%HOSTIP:%SMTPPORT/968 --mail-rcpt Användaren
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 968
+VRFY Användaren SMTPUTF8
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test969 b/tests/data/test969
new file mode 100644
index 000000000..9d3fa93e8
--- /dev/null
+++ b/tests/data/test969
@@ -0,0 +1,51 @@
+<testcase>
+<info>
+<keywords>
+SMTP
+EXPN
+CUSTOMREQUEST
+IDN
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+CAPA SMTPUTF8
+</servercmd>
+<data>
+250-Joe Smith <joe.smith@example.com>
+250-Harry Smith <harry.smith@example.com>
+250 Melvin Smith <melvin.smith@example.com>
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+smtp
+</server>
+<features>
+idn
+!win32
+</features>
+ <name>
+SMTP mailing list EXPN (CUSTOMREQUEST) with SMTPUTF8 support
+ </name>
+ <command>
+smtp://%HOSTIP:%SMTPPORT/969 --mail-rcpt Friends -X EXPN
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+EHLO 969
+EXPN Friends SMTPUTF8
+QUIT
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test97 b/tests/data/test97
index c1065bb19..d76941196 100644
--- a/tests/data/test97
+++ b/tests/data/test97
@@ -36,12 +36,10 @@ HTTP POST with custom content-type
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol nonewline="yes">
POST /97 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Type: silly/type
Content-Length: 14
diff --git a/tests/data/test970 b/tests/data/test970
new file mode 100644
index 000000000..ab1fc53a6
--- /dev/null
+++ b/tests/data/test970
@@ -0,0 +1,65 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
+ETag: "21025-dc7-39462498"
+Accept-Ranges: bytes
+Content-Length: 445
+Connection: close
+Content-Type: text/html
+Funny-head: yesyes
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+debug
+proxy
+</features>
+<setenv>
+CURL_TIME=13
+CURL_DEBUG_SIZE=4019
+CURL_VERSION=curl-unit-test-fake-version
+</setenv>
+<name>
+HTTP GET with JSON output
+</name>
+<command option="no-include">
+http://%HOSTIP:%HTTPPORT/970 --write-out '%{json}' -o log/out970
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /970 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<stdout nonewline="yes">
+{"url_effective":"http://%HOSTIP:%HTTPPORT/970","method":"GET","http_code":200,"response_code":200,"num_headers":9,"http_connect":0,"time_total":0.000013,"time_namelookup":0.000013,"time_connect":0.000013,"time_appconnect":0.000013,"time_pretransfer":0.000013,"time_starttransfer":0.000013,"size_header":4019,"size_request":4019,"size_download":445,"size_upload":0,"speed_download":13,"speed_upload":13,"content_type":"text/html","num_connects":1,"time_redirect":0.000013,"num_redirects":0,"ssl_verify_result":0,"proxy_ssl_verify_result":0,"filename_effective":"log/out970","remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"local_ip":"127.0.0.1","local_port":13,"http_version":"1.1","scheme":"HTTP","curl_version":"curl-unit-test-fake-version"}
+</stdout>
+</verify>
+</testcase>
diff --git a/tests/data/test971 b/tests/data/test971
new file mode 100644
index 000000000..dada92001
--- /dev/null
+++ b/tests/data/test971
@@ -0,0 +1,30 @@
+<testcase>
+<info>
+<keywords>
+source analysis
+options-in-versions
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+none
+</server>
+
+ <name>
+Verify that options-in-versions and docs/cmdline-opts are in sync
+ </name>
+
+<command type="perl">
+%SRCDIR/options-scan.pl %SRCDIR/../docs/options-in-versions %SRCDIR/../docs/cmdline-opts
+</command>
+</client>
+
+<verify>
+<stderr>
+ok
+</stderr>
+</verify>
+</testcase>
diff --git a/tests/data/test98 b/tests/data/test98
index b6d1182c6..ef0cded2f 100644
--- a/tests/data/test98
+++ b/tests/data/test98
@@ -39,12 +39,10 @@ data on stdin
#
# Verify data after the test has been "shot"
<verify>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
PUT /98 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
Accept: */*
Content-Length: 14
Expect: 100-continue
diff --git a/tests/data/test99 b/tests/data/test99
index 9797600cf..2bbee7809 100644
--- a/tests/data/test99
+++ b/tests/data/test99
@@ -55,13 +55,11 @@ http://%HOSTIP:%HTTPPORT/99 -C 9999999999
<errorcode>
33
</errorcode>
-<strip>
-^User-Agent:.*
-</strip>
<protocol>
GET /99 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Range: bytes=9999999999-
+User-Agent: curl/%VERSION
Accept: */*
</protocol>
diff --git a/tests/dictserver.py b/tests/dictserver.py
index 2d1b5a3b6..5641692d9 100755
--- a/tests/dictserver.py
+++ b/tests/dictserver.py
@@ -1,5 +1,26 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2008 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
#
""" DICT server """
@@ -30,8 +51,11 @@ def dictserver(options):
"""
if options.pidfile:
pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
with open(options.pidfile, "w") as f:
- f.write("{0}".format(pid))
+ f.write(str(pid))
local_bind = (options.host, options.port)
log.info("[DICT] Listening on %s", local_bind)
@@ -64,7 +88,11 @@ class DictHandler(socketserver.BaseRequestHandler):
if VERIFIED_REQ in data:
log.debug("[DICT] Received verification request from test "
"framework")
- response_data = VERIFIED_RSP.format(pid=os.getpid())
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ response_data = VERIFIED_RSP.format(pid=pid)
else:
log.debug("[DICT] Received normal request")
response_data = "No matches"
diff --git a/tests/directories.pm b/tests/directories.pm
index e3327c128..da6c76746 100644
--- a/tests/directories.pm
+++ b/tests/directories.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/disable-scan.pl b/tests/disable-scan.pl
index e57fdc697..45373ca40 100755
--- a/tests/disable-scan.pl
+++ b/tests/disable-scan.pl
@@ -29,9 +29,12 @@ use warnings;
my %disable;
# the DISABLE options that are used in C files
my %file;
+# the DISABLE options that are documented
+my %docs;
# we may get the dir root pointed out
my $root=$ARGV[0] || ".";
+my $DOCS="CURL-DISABLE.md";
sub scan_configure {
open S, "<$root/configure.ac";
@@ -73,8 +76,22 @@ sub scan_sources {
scan_dir("$root/lib/vauth");
}
+sub scan_docs {
+ open F, "<$root/docs/$DOCS";
+ my $line = 0;
+ while(<F>) {
+ $line++;
+ if(/^## (CURL_DISABLE_[A-Z_]+)/g) {
+ my ($sym)=($1);
+ $docs{$sym} = $line;
+ }
+ }
+ close F;
+}
+
scan_configure();
scan_sources();
+scan_docs();
my $error = 0;
@@ -84,6 +101,10 @@ for my $s (sort keys %disable) {
printf "Present in configure.ac, not used by code: %s\n", $s;
$error++;
}
+ if(!$docs{$s}) {
+ printf "Present in configure.ac, not documented in $DOCS: %s\n", $s;
+ $error++;
+ }
}
# Check the code symbols for use in configure
@@ -92,6 +113,22 @@ for my $s (sort keys %file) {
printf "Not set by configure: %s (%s)\n", $s, $file{$s};
$error++;
}
+ if(!$docs{$s}) {
+ printf "Used in code, not documented in $DOCS: %s\n", $s;
+ $error++;
+ }
+}
+
+# Check the documented symbols
+for my $s (sort keys %docs) {
+ if(!$disable{$s}) {
+ printf "Documented but not in configure: %s\n", $s;
+ $error++;
+ }
+ if(!$file{$s}) {
+ printf "Documented, but not used by code: %s\n", $s;
+ $error++;
+ }
}
exit $error;
diff --git a/tests/error-codes.pl b/tests/error-codes.pl
new file mode 100644
index 000000000..0d555f667
--- /dev/null
+++ b/tests/error-codes.pl
@@ -0,0 +1,80 @@
+#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+#
+
+use strict;
+use warnings;
+
+# we may get the dir root pointed out
+my $root=$ARGV[0] || ".";
+
+my %error; # from the include file
+my %docs; # from libcurl-errors.3
+
+sub getdocserrors {
+ open(F, "<$root/docs/libcurl/libcurl-errors.3");
+ while(<F>) {
+ if($_ =~ /^.IP \"(CURL[EM]_[^ \t\"]*)/) {
+ my ($symbol) = ($1);
+ if($symbol =~ /OBSOLETE/) {
+ ;
+ }
+ else {
+ $docs{$symbol}=1;
+ }
+ }
+ }
+ close(F);
+}
+
+sub getincludeerrors {
+ open(F, "<$root/docs/libcurl/symbols-in-versions");
+ while(<F>) {
+ if($_ =~ /^(CURL[EM]_[^ \t]*)[ \t]*([0-9.]+)[ \t]*(.*)/) {
+ my ($symbol, $added, $rest) = ($1,$2,$3);
+ if($rest =~ /^([0-9.]+)/) {
+ # removed!
+ }
+ else {
+ $error{$symbol}=$added;
+ }
+ }
+ }
+ close(F);
+}
+
+getincludeerrors();
+getdocserrors();
+
+for(sort keys %error) {
+ if($error{$_} && !$docs{$_}) {
+ print "$_ is not in libcurl-errors.3\n";
+ }
+}
+
+for(sort keys %docs) {
+ if($docs{$_} && !$error{$_}) {
+ print "$_ is not in symbols-in-versions\n";
+ }
+}
diff --git a/tests/extern-scan.pl b/tests/extern-scan.pl
index 88594ed69..8956d4b8c 100755
--- a/tests/extern-scan.pl
+++ b/tests/extern-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2010-2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/ftp.pm b/tests/ftp.pm
index f4a4acedd..971be199f 100644
--- a/tests/ftp.pm
+++ b/tests/ftp.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -20,6 +20,19 @@
#
###########################################################################
+BEGIN {
+ # portable sleeping needs Time::HiRes
+ eval {
+ no warnings "all";
+ require Time::HiRes;
+ };
+ # portable sleeping falls back to native Sleep on Win32
+ eval {
+ no warnings "all";
+ require Win32;
+ }
+}
+
use strict;
use warnings;
@@ -29,6 +42,31 @@ use serverhelp qw(
datasockf_pidfilename
);
+use pathhelp qw(
+ os_is_win
+ );
+
+#######################################################################
+# portable_sleep uses Time::HiRes::sleep if available and falls back
+# to the classic approach of using select(undef, undef, undef, ...).
+# even though that one is not portable due to being implemented using
+# select on Windows: https://perldoc.perl.org/perlport.html#select
+# Therefore it uses Win32::Sleep on Windows systems instead.
+#
+sub portable_sleep {
+ my ($seconds) = @_;
+
+ if($Time::HiRes::VERSION) {
+ Time::HiRes::sleep($seconds);
+ }
+ elsif (os_is_win()) {
+ Win32::Sleep($seconds*1000);
+ }
+ else {
+ select(undef, undef, undef, $seconds);
+ }
+}
+
#######################################################################
# pidfromfile returns the pid stored in the given pidfile. The value
# of the returned pid will never be a negative value. It will be zero
@@ -57,19 +95,23 @@ sub pidexists {
my $pid = $_[0];
if($pid > 0) {
+ # verify if currently existing Windows process
+ if ($pid > 65536 && os_is_win()) {
+ $pid -= 65536;
+ if($^O ne 'MSWin32') {
+ my $filter = "PID eq $pid";
+ my $result = `tasklist -fi \"$filter\" 2>nul`;
+ if(index($result, "$pid") != -1) {
+ return -$pid;
+ }
+ return 0;
+ }
+ }
+
# verify if currently existing and alive
if(kill(0, $pid)) {
return $pid;
}
-
- # verify if currently existing Windows process
- if($^O eq "msys") {
- my $filter = "PID eq $pid";
- my $result = `tasklist -fi \"$filter\" 2>nul`;
- if(index($result, "$pid") != -1) {
- return -$pid;
- }
- }
}
return 0;
@@ -82,41 +124,71 @@ sub pidterm {
my $pid = $_[0];
if($pid > 0) {
- # signal the process to terminate
- kill("TERM", $pid);
-
# request the process to quit
- if($^O eq "msys") {
- my $filter = "PID eq $pid";
- my $result = `tasklist -fi \"$filter\" 2>nul`;
- if(index($result, "$pid") != -1) {
- system("taskkill -fi \"$filter\" >nul 2>&1");
+ if ($pid > 65536 && os_is_win()) {
+ $pid -= 65536;
+ if($^O ne 'MSWin32') {
+ my $filter = "PID eq $pid";
+ my $result = `tasklist -fi \"$filter\" 2>nul`;
+ if(index($result, "$pid") != -1) {
+ system("taskkill -fi \"$filter\" >nul 2>&1");
+ }
+ return;
}
}
+
+ # signal the process to terminate
+ kill("TERM", $pid);
}
}
#######################################################################
-# pidkill kills the process with a given pid mercilessly andforcefully.
+# pidkill kills the process with a given pid mercilessly and forcefully.
#
sub pidkill {
my $pid = $_[0];
if($pid > 0) {
+ # request the process to quit
+ if ($pid > 65536 && os_is_win()) {
+ $pid -= 65536;
+ if($^O ne 'MSWin32') {
+ my $filter = "PID eq $pid";
+ my $result = `tasklist -fi \"$filter\" 2>nul`;
+ if(index($result, "$pid") != -1) {
+ system("taskkill -f -fi \"$filter\" >nul 2>&1");
+ # Windows XP Home compatibility
+ system("tskill $pid >nul 2>&1");
+ }
+ return;
+ }
+ }
+
# signal the process to terminate
kill("KILL", $pid);
+ }
+}
- # request the process to quit
- if($^O eq "msys") {
- my $filter = "PID eq $pid";
- my $result = `tasklist -fi \"$filter\" 2>nul`;
- if(index($result, "$pid") != -1) {
- system("taskkill -f -fi \"$filter\" >nul 2>&1");
- # Windows XP Home compatibility
- system("tskill $pid >nul 2>&1");
- }
+#######################################################################
+# pidwait waits for the process with a given pid to be terminated.
+#
+sub pidwait {
+ my $pid = $_[0];
+ my $flags = $_[1];
+
+ # check if the process exists
+ if ($pid > 65536 && os_is_win()) {
+ if($flags == &WNOHANG) {
+ return pidexists($pid)?0:$pid;
}
+ while(pidexists($pid)) {
+ portable_sleep(0.01);
+ }
+ return $pid;
}
+
+ # wait on the process to terminate
+ return waitpid($pid, $flags);
}
#######################################################################
@@ -143,7 +215,7 @@ sub processexists {
# get rid of the certainly invalid pidfile
unlink($pidfile) if($pid == pidfromfile($pidfile));
# reap its dead children, if not done yet
- waitpid($pid, &WNOHANG);
+ pidwait($pid, &WNOHANG);
# negative return value means dead process
return -$pid;
}
@@ -193,7 +265,7 @@ sub killpid {
print("RUN: Process with pid $pid already dead\n")
if($verbose);
# if possible reap its dead children
- waitpid($pid, &WNOHANG);
+ pidwait($pid, &WNOHANG);
push @reapchild, $pid;
}
}
@@ -211,12 +283,12 @@ sub killpid {
if($verbose);
splice @signalled, $i, 1;
# if possible reap its dead children
- waitpid($pid, &WNOHANG);
+ pidwait($pid, &WNOHANG);
push @reapchild, $pid;
}
}
last if(not scalar(@signalled));
- select(undef, undef, undef, 0.05);
+ portable_sleep(0.05);
}
}
@@ -228,7 +300,7 @@ sub killpid {
if($verbose);
pidkill($pid);
# if possible reap its dead children
- waitpid($pid, &WNOHANG);
+ pidwait($pid, &WNOHANG);
push @reapchild, $pid;
}
}
@@ -238,7 +310,7 @@ sub killpid {
if(@reapchild) {
foreach my $pid (@reapchild) {
if($pid > 0) {
- waitpid($pid, 0);
+ pidwait($pid, 0);
}
}
}
@@ -267,7 +339,7 @@ sub killsockfilters {
printf("* kill pid for %s-%s => %d\n", $server,
($proto eq 'ftp')?'ctrl':'filt', $pid) if($verbose);
pidkill($pid);
- waitpid($pid, 0);
+ pidwait($pid, 0);
}
unlink($pidfile) if(-f $pidfile);
}
@@ -281,7 +353,7 @@ sub killsockfilters {
printf("* kill pid for %s-data => %d\n", $server,
$pid) if($verbose);
pidkill($pid);
- waitpid($pid, 0);
+ pidwait($pid, 0);
}
unlink($pidfile) if(-f $pidfile);
}
diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl
index d401be24c..198ccd794 100755
--- a/tests/ftpserver.pl
+++ b/tests/ftpserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -68,6 +68,10 @@ use serverhelp qw(
datasockf_logfilename
);
+use sshhelp qw(
+ exe_ext
+ );
+
#**********************************************************************
# global vars...
#
@@ -79,6 +83,7 @@ my $proto = 'ftp'; # default server protocol
my $srcdir; # directory where ftpserver.pl is located
my $srvrname; # server name for presentation purposes
my $cwd_testno; # test case numbers extracted from CWD command
+my $testno = 0; # test case number (read from ftpserver.cmd)
my $path = '.';
my $logdir = $path .'/log';
@@ -92,6 +97,7 @@ my $listenaddr = '127.0.0.1'; # default address for listener port
# global vars used for file names
#
my $pidfile; # server pid file name
+my $portfile=".ftpserver.port"; # server port file name
my $logfile; # server log file name
my $mainsockf_pidfile; # pid file for primary connection sockfilt process
my $mainsockf_logfile; # log file for primary connection sockfilt process
@@ -139,6 +145,7 @@ my $nodataconn; # set if ftp srvr doesn't establish or accepts data channel
my $nodataconn425; # set if ftp srvr doesn't establish data ch and replies 425
my $nodataconn421; # set if ftp srvr doesn't establish data ch and replies 421
my $nodataconn150; # set if ftp srvr doesn't establish data ch and replies 150
+my $storeresp;
my @capabilities; # set if server supports capability commands
my @auth_mechs; # set if server supports authentication commands
my %fulltextreply; #
@@ -187,6 +194,7 @@ sub exit_signal_handler {
# For now, simply mimic old behavior.
killsockfilters($proto, $ipvnum, $idnum, $verbose);
unlink($pidfile);
+ unlink($portfile);
if($serverlogslocked) {
$serverlogslocked = 0;
clear_advisor_read_lock($SERVERLOGS_LOCK);
@@ -329,7 +337,7 @@ sub eXsysread {
sub read_mainsockf {
my $scalar = shift;
my $nbytes = shift;
- my $timeout = shift; # Optional argument, if zero blocks indefinitively
+ my $timeout = shift; # Optional argument, if zero blocks indefinitely
my $FH = \*SFREAD;
if(not defined $timeout) {
@@ -353,7 +361,7 @@ sub read_mainsockf {
sub read_datasockf {
my $scalar = shift;
my $nbytes = shift;
- my $timeout = shift; # Optional argument, if zero blocks indefinitively
+ my $timeout = shift; # Optional argument, if zero blocks indefinitely
my $FH = \*DREAD;
if(not defined $timeout) {
@@ -386,6 +394,7 @@ sub sysread_or_die {
"line $lcaller. $srvrname server, sysread error: $!\n";
killsockfilters($proto, $ipvnum, $idnum, $verbose);
unlink($pidfile);
+ unlink($portfile);
if($serverlogslocked) {
$serverlogslocked = 0;
clear_advisor_read_lock($SERVERLOGS_LOCK);
@@ -400,6 +409,7 @@ sub sysread_or_die {
"line $lcaller. $srvrname server, read zero\n";
killsockfilters($proto, $ipvnum, $idnum, $verbose);
unlink($pidfile);
+ unlink($portfile);
if($serverlogslocked) {
$serverlogslocked = 0;
clear_advisor_read_lock($SERVERLOGS_LOCK);
@@ -411,9 +421,10 @@ sub sysread_or_die {
}
sub startsf {
- my $mainsockfcmd = "./server/sockfilt " .
+ my $mainsockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
"--ipv$ipvnum --port $port " .
"--pidfile \"$mainsockf_pidfile\" " .
+ "--portfile \"$portfile\" " .
"--logfile \"$mainsockf_logfile\"";
$sfpid = open2(*SFREAD, *SFWRITE, $mainsockfcmd);
@@ -427,6 +438,7 @@ sub startsf {
logmsg "Failed sockfilt command: $mainsockfcmd\n";
killsockfilters($proto, $ipvnum, $idnum, $verbose);
unlink($pidfile);
+ unlink($portfile);
if($serverlogslocked) {
$serverlogslocked = 0;
clear_advisor_read_lock($SERVERLOGS_LOCK);
@@ -439,17 +451,14 @@ sub startsf {
# Returns the given test's reply data
#
sub getreplydata {
- my ($testno) = @_;
+ my ($num) = @_;
my $testpart = "";
- $testno =~ s/^([^0-9]*)//;
- if($testno > 10000) {
- $testpart = $testno % 10000;
- $testno = int($testno / 10000);
+ $num =~ s/^([^0-9]*)//;
+ if($num > 10000) {
+ $testpart = $num % 10000;
}
- loadtest("$srcdir/data/test$testno");
-
my @data = getpart("reply", "data$testpart");
if((!@data) && ($testpart ne "")) {
@data = getpart("reply", "data");
@@ -489,7 +498,7 @@ sub sendcontrol {
for(@a) {
sockfilt $_;
- select(undef, undef, undef, 0.01);
+ portable_sleep(0.01);
}
}
my $log;
@@ -526,7 +535,7 @@ sub senddata {
# pause between each byte
for (split(//,$l)) {
sockfiltsecondary $_;
- select(undef, undef, undef, 0.01);
+ portable_sleep(0.01);
}
}
}
@@ -683,6 +692,7 @@ sub close_dataconn {
print DWRITE "DISC\n";
my $i;
sysread DREAD, $i, 5;
+ logmsg "Server disconnected $datasockf_mode DATA connection\n";
}
else {
logmsg "Server finds $datasockf_mode DATA connection already ".
@@ -695,10 +705,12 @@ sub close_dataconn {
}
if($datapid > 0) {
+ logmsg "DATA sockfilt for $datasockf_mode data channel quits ".
+ "(pid $datapid)\n";
print DWRITE "QUIT\n";
- waitpid($datapid, 0);
+ pidwait($datapid, 0);
unlink($datasockf_pidfile) if(-f $datasockf_pidfile);
- logmsg "DATA sockfilt for $datasockf_mode data channel quits ".
+ logmsg "DATA sockfilt for $datasockf_mode data channel quit ".
"(pid $datapid)\n";
}
else {
@@ -809,6 +821,7 @@ sub MAIL_smtp {
else {
my $from;
my $size;
+ my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
my @elements = split(/ /, $args);
# Get the FROM and SIZE parameters
@@ -821,13 +834,8 @@ sub MAIL_smtp {
}
}
- # Validate the from address (only <> and a valid email address inside
- # <> are allowed, such as <user@example.com>)
- if ((!$from) || (($from ne "<>") && ($from !~
- /^<([a-zA-Z0-9._%+-]+)\@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})>$/))) {
- sendcontrol "501 Invalid address\r\n";
- }
- else {
+ # this server doesn't "validate" MAIL FROM addresses
+ if (length($from)) {
my @found;
my $valid = 1;
@@ -848,6 +856,9 @@ sub MAIL_smtp {
sendcontrol "250 Sender OK\r\n";
}
}
+ else {
+ sendcontrol "501 Invalid address\r\n";
+ }
}
return 0;
@@ -863,16 +874,19 @@ sub RCPT_smtp {
sendcontrol "501 Unrecognized parameter\r\n";
}
else {
+ my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
my $to = $1;
# Validate the to address (only a valid email address inside <> is
# allowed, such as <user@example.com>)
- if ($to !~
- /^<([a-zA-Z0-9._%+-]+)\@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})>$/) {
- sendcontrol "501 Invalid address\r\n";
+ if ((!$smtputf8 && $to =~
+ /^<([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})>$/) ||
+ ($smtputf8 && $to =~
+ /^<([a-zA-Z0-9\x{80}-\x{ff}._%+-]+)\@(([a-zA-Z0-9\x{80}-\x{ff}-]+)\.)+([a-zA-Z]{2,4})>$/)) {
+ sendcontrol "250 Recipient OK\r\n";
}
else {
- sendcontrol "250 Recipient OK\r\n";
+ sendcontrol "501 Invalid address\r\n";
}
}
@@ -1026,10 +1040,33 @@ sub VRFY_smtp {
sendcontrol "501 Unrecognized parameter\r\n";
}
else {
- my @data = getreplydata($smtp_client);
+ my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
- for my $d (@data) {
- sendcontrol $d;
+ # Validate the username (only a valid local or external username is
+ # allowed, such as user or user@example.com)
+ if ((!$smtputf8 && $username =~
+ /^([a-zA-Z0-9._%+-]+)(\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4}))?$/) ||
+ ($smtputf8 && $username =~
+ /^([a-zA-Z0-9\x{80}-\x{ff}._%+-]+)(\@(([a-zA-Z0-9\x{80}-\x{ff}-]+)\.)+([a-zA-Z]{2,4}))?$/)) {
+
+ my @data = getreplydata($smtp_client);
+
+ if(!@data) {
+ if ($username !~
+ /^([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})$/) {
+ push @data, "250 <$username\@example.com>\r\n"
+ }
+ else {
+ push @data, "250 <$username>\r\n"
+ }
+ }
+
+ for my $d (@data) {
+ sendcontrol $d;
+ }
+ }
+ else {
+ sendcontrol "501 Invalid address\r\n";
}
}
@@ -2055,7 +2092,8 @@ my @ftpdir=("total 20\r\n",
logmsg "pass LIST data on data connection\n";
if($cwd_testno) {
- loadtest("$srcdir/data/test$cwd_testno");
+ loadtest("$logdir/test$cwd_testno") ||
+ loadtest("$srcdir/data/test$cwd_testno");
my @data = getpart("reply", "data");
for(@data) {
@@ -2118,7 +2156,8 @@ sub MDTM_ftp {
$testno = int($testno / 10000);
}
- loadtest("$srcdir/data/test$testno");
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my @data = getpart("reply", "mdtm");
@@ -2171,7 +2210,8 @@ sub SIZE_ftp {
$testno = int($testno / 10000);
}
- loadtest("$srcdir/data/test$testno");
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my @data = getpart("reply", "size");
@@ -2260,7 +2300,8 @@ sub RETR_ftp {
$testno = int($testno / 10000);
}
- loadtest("$srcdir/data/test$testno");
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my @data = getpart("reply", "data$testpart");
@@ -2373,6 +2414,10 @@ sub STOR_ftp {
logmsg "No support for: $line";
last;
}
+ if($storeresp) {
+ # abort early
+ last;
+ }
}
if($nosave) {
print FILE "$ulsize bytes would've been stored here\n";
@@ -2380,7 +2425,12 @@ sub STOR_ftp {
close(FILE);
close_dataconn($disc);
logmsg "received $ulsize bytes upload\n";
- sendcontrol "226 File transfer complete\r\n";
+ if($storeresp) {
+ sendcontrol "$storeresp\r\n";
+ }
+ else {
+ sendcontrol "226 File transfer complete\r\n";
+ }
return 0;
}
@@ -2401,7 +2451,7 @@ sub PASV_ftp {
logmsg "DATA sockfilt for passive data channel starting...\n";
# We fire up a new sockfilt to do the data transfer for us.
- my $datasockfcmd = "./server/sockfilt " .
+ my $datasockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
"--ipv$ipvnum $bindonly --port 0 " .
"--pidfile \"$datasockf_pidfile\" " .
"--logfile \"$datasockf_logfile\"";
@@ -2620,7 +2670,7 @@ sub PORT_ftp {
logmsg "DATA sockfilt for active data channel starting...\n";
# We fire up a new sockfilt to do the data transfer for us.
- my $datasockfcmd = "./server/sockfilt " .
+ my $datasockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
"--ipv$ipvnum --connect $port --addr \"$addr\" " .
"--pidfile \"$datasockf_pidfile\" " .
"--logfile \"$datasockf_logfile\"";
@@ -2744,6 +2794,7 @@ sub customize {
$nodataconn425 = 0; # default is to not send 425 without data channel
$nodataconn421 = 0; # default is to not send 421 without data channel
$nodataconn150 = 0; # default is to not send 150 without data channel
+ $storeresp = ""; # send as ultimate STOR response
@capabilities = (); # default is to not support capability commands
@auth_mechs = (); # default is to not support authentication commands
%fulltextreply = ();#
@@ -2826,6 +2877,10 @@ sub customize {
logmsg "FTPD: instructed to use NODATACONN\n";
$nodataconn=1;
}
+ elsif($_ =~ /^STOR (.*)/) {
+ $storeresp=$1;
+ logmsg "FTPD: instructed to use respond to STOR with '$storeresp'\n";
+ }
elsif($_ =~ /CAPA (.*)/) {
logmsg "FTPD: instructed to support CAPABILITY command\n";
@capabilities = split(/ (?!(?:[^" ]|[^"] [^"])+")/, $1);
@@ -2843,6 +2898,10 @@ sub customize {
$nosave = 1;
logmsg "FTPD: NOSAVE prevents saving of uploaded data\n";
}
+ elsif($_ =~ /^Testnum (\d+)/){
+ $testno = $1;
+ logmsg "FTPD: run test case number: $testno\n";
+ }
}
close(CUSTOM);
}
@@ -2863,6 +2922,7 @@ sub customize {
# --id # server instance number
# --proto # server protocol
# --pidfile # server pid file
+# --portfile # server port file
# --logfile # server log file
# --ipv4 # server IP version 4
# --ipv6 # server IP version 6
@@ -2900,6 +2960,12 @@ while(@ARGV) {
shift @ARGV;
}
}
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
elsif($ARGV[0] eq '--logfile') {
if($ARGV[1]) {
$logfile = $ARGV[1];
@@ -2915,8 +2981,8 @@ while(@ARGV) {
$listenaddr = '::1' if($listenaddr eq '127.0.0.1');
}
elsif($ARGV[0] eq '--port') {
- if($ARGV[1] && ($ARGV[1] =~ /^(\d+)$/)) {
- $port = $1 if($1 > 1024);
+ if($ARGV[1] =~ /^(\d+)$/) {
+ $port = $1;
shift @ARGV;
}
}
@@ -2976,6 +3042,15 @@ $SIG{TERM} = \&exit_signal_handler;
startsf();
+# actual port
+if($portfile && !$port) {
+ my $aport;
+ open(P, "<$portfile");
+ $aport = <P>;
+ close(P);
+ $port = 0 + $aport;
+}
+
logmsg sprintf("%s server listens on port IPv${ipvnum}/${port}\n", uc($proto));
open(PID, ">$pidfile");
@@ -2984,7 +3059,6 @@ close(PID);
logmsg("logged pid $$ in $pidfile\n");
-
while(1) {
# kill previous data connection sockfilt when alive
@@ -3016,6 +3090,8 @@ while(1) {
$| = 1;
&customize(); # read test control instructions
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my $welcome = $commandreply{"welcome"};
if(!$welcome) {
@@ -3165,7 +3241,7 @@ while(1) {
logmsg("Sleep for $delay seconds\n");
my $twentieths = $delay * 20;
while($twentieths--) {
- select(undef, undef, undef, 0.05) unless($got_exit_signal);
+ portable_sleep(0.05) unless($got_exit_signal);
}
}
diff --git a/tests/getpart.pm b/tests/getpart.pm
index 7080bf4b7..2162129dc 100644
--- a/tests/getpart.pm
+++ b/tests/getpart.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -23,15 +23,20 @@
#use strict;
my @xml;
+my $xmlfile;
my $warning=0;
my $trace=0;
-sub decode_base64 {
- tr:A-Za-z0-9+/::cd; # remove non-base64 chars
- tr:A-Za-z0-9+/: -_:; # convert to uuencoded format
- my $len = pack("c", 32 + 0.75*length); # compute length byte
- return unpack("u", $len . $_); # uudecode and print
+use MIME::Base64;
+
+sub decode_hex {
+ my $s = $_;
+ # remove everything not hex
+ $s =~ s/[^A-Fa-f0-9]//g;
+ # encode everything
+ $s =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
+ return $s;
}
sub getpartattr {
@@ -80,11 +85,11 @@ sub getpart {
my @this;
my $inside=0;
my $base64=0;
-
- # print "Section: $section, part: $part\n";
+ my $hex=0;
+ my $line;
for(@xml) {
- # print "$inside: $_";
+ $line++;
if(!$inside && ($_ =~ /^ *\<$section/)) {
$inside++;
}
@@ -96,6 +101,10 @@ sub getpart {
# attempt to detect our base64 encoded part
$base64=1;
}
+ elsif($_ =~ /$part [^>]*hex=/) {
+ # attempt to detect a hex-encoded part
+ $hex=1;
+ }
$inside++;
}
elsif(($inside >= 2) && ($_ =~ /^ *\<\/$part[ \>]/)) {
@@ -105,6 +114,10 @@ sub getpart {
$inside--;
}
elsif(($inside >= 1) && ($_ =~ /^ *\<\/$section/)) {
+ if($inside > 1) {
+ print STDERR "$xmlfile:$line:1: error: missing </$part> tag before </$section>\n";
+ @this = ("format error in $xmlfile");
+ }
if($trace && @this) {
print STDERR "*** getpart.pm: $section/$part returned data!\n";
}
@@ -118,6 +131,13 @@ sub getpart {
$_ = $decoded;
}
}
+ elsif($hex) {
+ # decode the whole array before returning it!
+ for(@this) {
+ my $decoded = decode_hex($_);
+ $_ = $decoded;
+ }
+ }
return @this;
}
elsif($inside >= 2) {
@@ -165,6 +185,7 @@ sub loadtest {
my ($file)=@_;
undef @xml;
+ $xmlfile = $file;
if(open(XML, "<$file")) {
binmode XML; # for crapage systems, use binary
@@ -183,6 +204,31 @@ sub loadtest {
return 0;
}
+sub fulltest {
+ return @xml;
+}
+
+# write the test to the given file
+sub savetest {
+ my ($file)=@_;
+
+ if(open(XML, ">$file")) {
+ binmode XML; # for crapage systems, use binary
+ for(@xml) {
+ print XML $_;
+ }
+ close(XML);
+ }
+ else {
+ # failure
+ if($warning) {
+ print STDERR "file $file wouldn't open!\n";
+ }
+ return 1;
+ }
+ return 0;
+}
+
#
# Strip off all lines that match the specified pattern and return
# the new array.
diff --git a/tests/http2-server.pl b/tests/http2-server.pl
index 086d5aa76..4dbb0d854 100755
--- a/tests/http2-server.pl
+++ b/tests/http2-server.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2016 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/httpserver.pl b/tests/httpserver.pl
index 7f6c86a8a..58ab5d460 100755
--- a/tests/httpserver.pl
+++ b/tests/httpserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -34,14 +34,19 @@ use serverhelp qw(
server_logfilename
);
+use sshhelp qw(
+ exe_ext
+ );
+
my $verbose = 0; # set to 1 for debugging
my $port = 8990; # just a default
my $unix_socket; # location to place a listening Unix socket
my $ipvnum = 4; # default IP version of http server
my $idnum = 1; # default http server instance number
my $proto = 'http'; # protocol the http server speaks
-my $pidfile; # http server pid file
-my $logfile; # http server log file
+my $pidfile; # pid file
+my $portfile; # port number file
+my $logfile; # log file
my $connect; # IP to connect to on CONNECT
my $srcdir;
my $gopher = 0;
@@ -57,6 +62,12 @@ while(@ARGV) {
shift @ARGV;
}
}
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
elsif($ARGV[0] eq '--logfile') {
if($ARGV[1]) {
$logfile = $ARGV[1];
@@ -118,11 +129,16 @@ if(!$srcdir) {
if(!$pidfile) {
$pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
}
+if(!$portfile) {
+ $portfile = "$path/". server_portfilename($proto, $ipvnum, $idnum);
+}
if(!$logfile) {
$logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
}
-$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+$flags .= "--pidfile \"$pidfile\" ".
+ "--logfile \"$logfile\" ".
+ "--portfile \"$portfile\" ";
$flags .= "--gopher " if($gopher);
$flags .= "--connect $connect " if($connect);
if($ipvnum eq 'unix') {
@@ -133,7 +149,7 @@ if($ipvnum eq 'unix') {
$flags .= "--srcdir \"$srcdir\"";
if($verbose) {
- print STDERR "RUN: server/sws $flags\n";
+ print STDERR "RUN: server/sws".exe_ext('SRV')." $flags\n";
}
-exec("server/sws $flags");
+exec("server/sws".exe_ext('SRV')." $flags");
diff --git a/tests/libtest/CMakeLists.txt b/tests/libtest/CMakeLists.txt
index aa70d053d..cc38a97c6 100644
--- a/tests/libtest/CMakeLists.txt
+++ b/tests/libtest/CMakeLists.txt
@@ -1,11 +1,29 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
set(TARGET_LABEL_PREFIX "Test ")
-if(MSVC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
-endif()
-
function(setup_test TEST_NAME) # ARGN are the files in the test
- add_executable( ${TEST_NAME} ${ARGN} )
+ add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${ARGN})
+ add_dependencies(testdeps ${TEST_NAME})
string(TOUPPER ${TEST_NAME} UPPER_TEST_NAME)
include_directories(
@@ -41,7 +59,8 @@ endforeach()
# Allows for hostname override to make tests machine independent.
# TODO this cmake build assumes a shared build, detect static linking here!
if(NOT WIN32)
- add_library(hostname MODULE sethostname.c sethostname.h)
+ add_library(hostname MODULE EXCLUDE_FROM_ALL sethostname.c sethostname.h)
+ add_dependencies(testdeps hostname)
# Output to .libs for compatibility with autotools, the test data expects a
# library at (tests)/libtest/.libs/libhostname.so
set_target_properties(hostname PROPERTIES
@@ -62,79 +81,3 @@ add_custom_command(
set_property(TARGET chkdecimalpoint
APPEND PROPERTY COMPILE_DEFINITIONS "CURLX_NO_MEMORY_CALLBACKS;CURL_STATICLIB")
-
- # # files used only in some libcurl test programs
-# SET(TESTUTIL testutil.c testutil.h)
-
-# # these files are used in every single test program below
-# SET(SUPPORTFILES first.c test.h)
-
-# # These are all libcurl test programs
-# SET(noinst_PROGRAMS
-# lib500 lib501 lib502 lib503 lib504 lib505 lib506
-# lib507 lib508 lib510 lib511 lib512 lib513 lib514 lib515 lib516
-# lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526
-# #lib527
-# #lib529
-# lib530
-# #lib532
-# lib533 lib536 lib537 lib540 lib541 lib542 lib543
-# lib544
-# #lib545
-# lib547
-# #lib548
-# lib549 lib552 lib553 lib554 lib555 lib556
-# lib539 lib557
-# lib560
-# )
-
-# SET(noinst_PROGRAMS_USE_TESTUTIL
-# lib502 lib503 lib504
-# lib507
-# lib525 lib526 lib527
-# lib529
-# lib530
-# lib532
-# lib533 lib536
-# lib555
-# )
-
-# MACRO(ADD_TESTUTIL_IF_NECESSARY TEST_NAME)
-# LIST(FIND noinst_PROGRAMS_USE_TESTUTIL ${TEST_NAME} USES_TESTUTIL)
-# IF(NOT ${USES_TESTUTIL} EQUAL -1)
-# LIST(APPEND SOURCE ${TESTUTIL}) # Need TestUtil
-# ENDIF()
-# ENDMACRO()
-
-# # General case
-# FOREACH(TEST_NAME ${noinst_PROGRAMS})
-# SET(SOURCE "${TEST_NAME}.c" ${SUPPORTFILES})
-# ADD_TESTUTIL_IF_NECESSARY(${TEST_NAME})
-# SETUP_TEST(${TEST_NAME} ${SOURCE})
-# ENDFOREACH()
-
-# # Special cases
-# SET(TEST_NAME lib527)
-# SET(SOURCE "lib526.c" ${SUPPORTFILES})
-# ADD_TESTUTIL_IF_NECESSARY(${TEST_NAME})
-# SETUP_TEST(${TEST_NAME} ${SOURCE})
-
-# SET(TEST_NAME lib529)
-# SET(SOURCE "lib525.c" ${SUPPORTFILES})
-# ADD_TESTUTIL_IF_NECESSARY(${TEST_NAME})
-# SETUP_TEST(${TEST_NAME} ${SOURCE})
-
-# SET(TEST_NAME lib532)
-# SET(SOURCE "lib526.c" ${SUPPORTFILES})
-# ADD_TESTUTIL_IF_NECESSARY(${TEST_NAME})
-# SETUP_TEST(${TEST_NAME} ${SOURCE})
-
-# SET(TEST_NAME lib545)
-# SET(SOURCE "lib544.c" ${SUPPORTFILES})
-# ADD_TESTUTIL_IF_NECESSARY(${TEST_NAME})
-# SETUP_TEST(${TEST_NAME} ${SOURCE})
-
-# SET(TEST_NAME lib548)
-# SET(SOURCE "lib547.c" ${SUPPORTFILES})
-# ADD_TESTUTIL_IF_NECESSARY(${TEST_NAME})
-# SETUP_TEST(${TEST_NAME} ${SOURCE})
diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am
index 29ab0a9c4..7f68abae9 100644
--- a/tests/libtest/Makefile.am
+++ b/tests/libtest/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -44,7 +44,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/lib
endif
-EXTRA_DIST = test75.pl test307.pl test610.pl test613.pl test1013.pl \
+EXTRA_DIST = test307.pl test610.pl test613.pl test1013.pl \
test1022.pl Makefile.inc notexists.pl CMakeLists.txt mk-lib1521.pl
CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@
@@ -91,8 +91,11 @@ libhostname_la_CPPFLAGS_EXTRA =
libhostname_la_LDFLAGS_EXTRA = -module -avoid-version -rpath /nowhere
libhostname_la_CFLAGS_EXTRA =
+libstubgss_la_LDFLAGS_EXTRA =
+
if CURL_LT_SHLIB_USE_NO_UNDEFINED
libhostname_la_LDFLAGS_EXTRA += -no-undefined
+libstubgss_la_LDFLAGS_EXTRA += -no-undefined
endif
if CURL_LT_SHLIB_USE_MIMPURE_TEXT
@@ -118,7 +121,7 @@ if BUILD_STUB_GSS
noinst_LTLIBRARIES += libstubgss.la
libstubgss_la_CPPFLAGS = $(AM_CPPFLAGS)
-libstubgss_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version -rpath /nowhere
+libstubgss_la_LDFLAGS = $(AM_LDFLAGS) $(libstubgss_la_LDFLAGS_EXTRA) -avoid-version -rpath /nowhere
libstubgss_la_CFLAGS = $(AM_CFLAGS) -g
libstubgss_la_SOURCES = stub_gssapi.c stub_gssapi.h
@@ -137,7 +140,7 @@ CS_1 =
CS_ = $(CS_0)
checksrc:
- $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+ $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(srcdir) $(srcdir)/*.[ch]
if CURLDEBUG
# for debug builds, we scan the sources on all regular make invokes
diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index 9ba72d7de..98fd2ee9f 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -1,3 +1,24 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# files used only in some libcurl test programs
TESTUTIL = testutil.c testutil.h
@@ -7,6 +28,9 @@ TSTTRACE = testtrace.c testtrace.h
# files used only in some libcurl test programs
WARNLESS = ../../lib/warnless.c ../../lib/warnless.h
+# files used only in some libcurl test programs
+MULTIBYTE = ../../lib/curl_multibyte.c ../../lib/curl_multibyte.h
+
# these files are used in every single test program below
SUPPORTFILES = first.c test.h
@@ -15,32 +39,33 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
chkdecimalpoint \
lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 lib508 lib509 \
lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 lib518 lib519 \
- lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib530 lib532 \
+ lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib532 \
lib533 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545 \
lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558 \
lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
lib571 lib572 lib573 lib574 lib575 lib576 lib578 lib579 lib582 \
lib583 lib585 lib586 lib587 lib589 lib590 lib591 lib597 lib598 lib599 \
lib643 lib644 lib645 lib650 lib651 lib652 lib653 lib654 lib655 lib658 \
- lib659 lib661 \
+ lib659 lib661 lib666 lib667 lib668 \
+ lib670 lib671 lib672 lib673 lib674 \
lib1156 \
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
lib1518 lib1520 lib1521 lib1522 lib1523 \
lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
- lib1534 lib1535 lib1536 lib1537 lib1538 \
- lib1540 lib1541 \
+ lib1534 lib1535 lib1536 lib1537 lib1538 lib1539 \
+ lib1540 \
lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
- lib1558 lib1559 lib1560 \
+ lib1558 lib1559 lib1560 lib1564 lib1565 lib1567 \
lib1591 lib1592 lib1593 lib1594 lib1596 \
- lib1900 lib1905 lib1906 lib1907 \
- lib2033
+ lib1905 lib1906 lib1907 lib1908 lib1910 lib1911 lib1912 lib1913 \
+ lib3010
chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
- ../../lib/curl_ctype.c
+ ../../lib/curl_ctype.c ../../lib/dynbuf.c ../../lib/strdup.c
chkdecimalpoint_LDADD =
chkdecimalpoint_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB \
- -DCURLX_NO_MEMORY_CALLBACKS
+ -DCURLX_NO_MEMORY_CALLBACKS -DBUILDING_LIBCURL
chkhostname_SOURCES = chkhostname.c ../../lib/curl_gethostname.c
chkhostname_LDADD = @CURL_NETWORK_LIBS@
@@ -54,7 +79,7 @@ libntlmconnect_CPPFLAGS = $(AM_CPPFLAGS)
libauthretry_SOURCES = libauthretry.c $(SUPPORTFILES)
libauthretry_CPPFLAGS = $(AM_CPPFLAGS)
-lib500_SOURCES = lib500.c $(SUPPORTFILES) $(TESTUTIL) $(TSTTRACE)
+lib500_SOURCES = lib500.c $(SUPPORTFILES) $(TESTUTIL) $(TSTTRACE) $(MULTIBYTE)
lib500_LDADD = $(TESTUTIL_LIBS)
lib500_CPPFLAGS = $(AM_CPPFLAGS)
@@ -73,7 +98,7 @@ lib504_SOURCES = lib504.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib504_LDADD = $(TESTUTIL_LIBS)
lib504_CPPFLAGS = $(AM_CPPFLAGS)
-lib505_SOURCES = lib505.c $(SUPPORTFILES)
+lib505_SOURCES = lib505.c $(SUPPORTFILES) $(MULTIBYTE)
lib505_CPPFLAGS = $(AM_CPPFLAGS)
lib506_SOURCES = lib506.c $(SUPPORTFILES)
@@ -113,7 +138,7 @@ lib516_CPPFLAGS = $(AM_CPPFLAGS)
lib517_SOURCES = lib517.c $(SUPPORTFILES)
lib517_CPPFLAGS = $(AM_CPPFLAGS)
-lib518_SOURCES = lib518.c $(SUPPORTFILES) $(WARNLESS)
+lib518_SOURCES = lib518.c $(SUPPORTFILES) $(WARNLESS) $(MULTIBYTE)
lib518_CPPFLAGS = $(AM_CPPFLAGS)
lib519_SOURCES = lib519.c $(SUPPORTFILES)
@@ -131,7 +156,7 @@ lib523_CPPFLAGS = $(AM_CPPFLAGS)
lib524_SOURCES = lib524.c $(SUPPORTFILES)
lib524_CPPFLAGS = $(AM_CPPFLAGS)
-lib525_SOURCES = lib525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib525_SOURCES = lib525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(MULTIBYTE)
lib525_LDADD = $(TESTUTIL_LIBS)
lib525_CPPFLAGS = $(AM_CPPFLAGS)
@@ -143,14 +168,10 @@ lib527_SOURCES = lib526.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib527_LDADD = $(TESTUTIL_LIBS)
lib527_CPPFLAGS = $(AM_CPPFLAGS) -DLIB527
-lib529_SOURCES = lib525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib529_SOURCES = lib525.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(MULTIBYTE)
lib529_LDADD = $(TESTUTIL_LIBS)
lib529_CPPFLAGS = $(AM_CPPFLAGS) -DLIB529
-lib530_SOURCES = lib530.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib530_LDADD = $(TESTUTIL_LIBS)
-lib530_CPPFLAGS = $(AM_CPPFLAGS) -DLIB530
-
lib532_SOURCES = lib526.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib532_LDADD = $(TESTUTIL_LIBS)
lib532_CPPFLAGS = $(AM_CPPFLAGS) -DLIB532
@@ -159,7 +180,7 @@ lib533_SOURCES = lib533.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib533_LDADD = $(TESTUTIL_LIBS)
lib533_CPPFLAGS = $(AM_CPPFLAGS)
-lib537_SOURCES = lib537.c $(SUPPORTFILES) $(WARNLESS)
+lib537_SOURCES = lib537.c $(SUPPORTFILES) $(WARNLESS) $(MULTIBYTE)
lib537_CPPFLAGS = $(AM_CPPFLAGS)
lib539_SOURCES = lib539.c $(SUPPORTFILES)
@@ -169,7 +190,7 @@ lib540_SOURCES = lib540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib540_LDADD = $(TESTUTIL_LIBS)
lib540_CPPFLAGS = $(AM_CPPFLAGS)
-lib541_SOURCES = lib541.c $(SUPPORTFILES)
+lib541_SOURCES = lib541.c $(SUPPORTFILES) $(MULTIBYTE)
lib541_CPPFLAGS = $(AM_CPPFLAGS)
lib542_SOURCES = lib542.c $(SUPPORTFILES)
@@ -232,25 +253,25 @@ lib564_CPPFLAGS = $(AM_CPPFLAGS)
lib565_SOURCES = lib510.c $(SUPPORTFILES)
lib565_CPPFLAGS = $(AM_CPPFLAGS) -DLIB565
-lib566_SOURCES = lib566.c $(SUPPORTFILES)
+lib566_SOURCES = lib566.c $(SUPPORTFILES) $(MULTIBYTE)
lib566_CPPFLAGS = $(AM_CPPFLAGS)
lib567_SOURCES = lib567.c $(SUPPORTFILES)
lib567_CPPFLAGS = $(AM_CPPFLAGS)
-lib568_SOURCES = lib568.c $(SUPPORTFILES)
+lib568_SOURCES = lib568.c $(SUPPORTFILES) $(MULTIBYTE)
lib568_CPPFLAGS = $(AM_CPPFLAGS)
-lib569_SOURCES = lib569.c $(SUPPORTFILES)
+lib569_SOURCES = lib569.c $(SUPPORTFILES) $(MULTIBYTE)
lib569_CPPFLAGS = $(AM_CPPFLAGS)
lib570_SOURCES = lib570.c $(SUPPORTFILES)
lib570_CPPFLAGS = $(AM_CPPFLAGS)
-lib571_SOURCES = lib571.c $(SUPPORTFILES) $(WARNLESS)
+lib571_SOURCES = lib571.c $(SUPPORTFILES) $(WARNLESS) $(MULTIBYTE)
lib571_CPPFLAGS = $(AM_CPPFLAGS)
-lib572_SOURCES = lib572.c $(SUPPORTFILES)
+lib572_SOURCES = lib572.c $(SUPPORTFILES) $(MULTIBYTE)
lib572_CPPFLAGS = $(AM_CPPFLAGS)
lib573_SOURCES = lib573.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(TSTTRACE)
@@ -267,20 +288,20 @@ lib575_CPPFLAGS = $(AM_CPPFLAGS)
lib576_SOURCES = lib576.c $(SUPPORTFILES)
lib576_CPPFLAGS = $(AM_CPPFLAGS)
-lib578_SOURCES = lib578.c $(SUPPORTFILES)
+lib578_SOURCES = lib578.c $(SUPPORTFILES) $(MULTIBYTE)
lib578_CPPFLAGS = $(AM_CPPFLAGS)
-lib579_SOURCES = lib579.c $(SUPPORTFILES)
+lib579_SOURCES = lib579.c $(SUPPORTFILES) $(MULTIBYTE)
lib579_CPPFLAGS = $(AM_CPPFLAGS)
-lib582_SOURCES = lib582.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib582_SOURCES = lib582.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(MULTIBYTE)
lib582_LDADD = $(TESTUTIL_LIBS)
lib582_CPPFLAGS = $(AM_CPPFLAGS)
lib583_SOURCES = lib583.c $(SUPPORTFILES)
lib583_CPPFLAGS = $(AM_CPPFLAGS)
-lib585_SOURCES = lib500.c $(SUPPORTFILES) $(TESTUTIL) $(TSTTRACE)
+lib585_SOURCES = lib500.c $(SUPPORTFILES) $(TESTUTIL) $(TSTTRACE) $(MULTIBYTE)
lib585_LDADD = $(TESTUTIL_LIBS)
lib585_CPPFLAGS = $(AM_CPPFLAGS) -DLIB585
@@ -296,7 +317,7 @@ lib589_CPPFLAGS = $(AM_CPPFLAGS)
lib590_SOURCES = lib590.c $(SUPPORTFILES)
lib590_CPPFLAGS = $(AM_CPPFLAGS)
-lib591_SOURCES = lib591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib591_SOURCES = lib591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) $(MULTIBYTE)
lib591_LDADD = $(TESTUTIL_LIBS)
lib591_CPPFLAGS = $(AM_CPPFLAGS)
@@ -307,7 +328,7 @@ lib597_CPPFLAGS = $(AM_CPPFLAGS)
lib598_SOURCES = lib598.c $(SUPPORTFILES)
lib598_CPPFLAGS = $(AM_CPPFLAGS)
-lib599_SOURCES = lib599.c $(SUPPORTFILES)
+lib599_SOURCES = lib599.c $(SUPPORTFILES) $(MULTIBYTE)
lib599_CPPFLAGS = $(AM_CPPFLAGS)
lib643_SOURCES = lib643.c $(SUPPORTFILES)
@@ -348,6 +369,37 @@ lib659_CPPFLAGS = $(AM_CPPFLAGS)
lib661_SOURCES = lib661.c $(SUPPORTFILES)
lib661_CPPFLAGS = $(AM_CPPFLAGS)
+lib666_SOURCES = lib666.c $(SUPPORTFILES)
+lib666_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib667_SOURCES = lib667.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib667_LDADD = $(TESTUTIL_LIBS)
+lib667_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib668_SOURCES = lib668.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib668_LDADD = $(TESTUTIL_LIBS)
+lib668_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib670_SOURCES = lib670.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib670_LDADD = $(TESTUTIL_LIBS)
+lib670_CPPFLAGS = $(AM_CPPFLAGS) -DLIB670
+
+lib671_SOURCES = lib670.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib671_LDADD = $(TESTUTIL_LIBS)
+lib671_CPPFLAGS = $(AM_CPPFLAGS) -DLIB671
+
+lib672_SOURCES = lib670.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib672_LDADD = $(TESTUTIL_LIBS)
+lib672_CPPFLAGS = $(AM_CPPFLAGS) -DLIB672
+
+lib673_SOURCES = lib670.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib673_LDADD = $(TESTUTIL_LIBS)
+lib673_CPPFLAGS = $(AM_CPPFLAGS) -DLIB673
+
+lib674_SOURCES = lib674.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib674_LDADD = $(TESTUTIL_LIBS)
+lib674_CPPFLAGS = $(AM_CPPFLAGS)
+
lib1500_SOURCES = lib1500.c $(SUPPORTFILES) $(TESTUTIL)
lib1500_LDADD = $(TESTUTIL_LIBS)
lib1500_CPPFLAGS = $(AM_CPPFLAGS)
@@ -490,14 +542,14 @@ lib1538_SOURCES = lib1538.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1538_LDADD = $(TESTUTIL_LIBS)
lib1538_CPPFLAGS = $(AM_CPPFLAGS)
+lib1539_SOURCES = lib1514.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1539_LDADD = $(TESTUTIL_LIBS)
+lib1539_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1539
+
lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1540_LDADD = $(TESTUTIL_LIBS)
lib1540_CPPFLAGS = $(AM_CPPFLAGS)
-lib1541_SOURCES = lib1541.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1541_LDADD = $(TESTUTIL_LIBS)
-lib1541_CPPFLAGS = $(AM_CPPFLAGS)
-
lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517
@@ -536,6 +588,17 @@ lib1559_LDADD = $(TESTUTIL_LIBS)
lib1560_SOURCES = lib1560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1560_LDADD = $(TESTUTIL_LIBS)
+lib1564_SOURCES = lib1564.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1564_LDADD = $(TESTUTIL_LIBS)
+lib1564_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1565_SOURCES = lib1565.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1565_LDADD = $(TESTUTIL_LIBS)
+lib1565_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1567_SOURCES = lib1567.c $(SUPPORTFILES)
+lib1567_CPPFLAGS = $(AM_CPPFLAGS)
+
lib1591_SOURCES = lib1591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1591_LDADD = $(TESTUTIL_LIBS)
lib1591_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1591
@@ -554,10 +617,6 @@ lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1596_LDADD = $(TESTUTIL_LIBS)
lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596
-lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib1900_LDADD = $(TESTUTIL_LIBS)
-lib1900_CPPFLAGS = $(AM_CPPFLAGS)
-
lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)
lib1905_CPPFLAGS = $(AM_CPPFLAGS)
@@ -570,6 +629,26 @@ lib1907_SOURCES = lib1907.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1907_LDADD = $(TESTUTIL_LIBS)
lib1907_CPPFLAGS = $(AM_CPPFLAGS)
-lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
-lib2033_LDADD = $(TESTUTIL_LIBS)
-lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
+lib1908_SOURCES = lib1908.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1908_LDADD = $(TESTUTIL_LIBS)
+lib1908_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1910_SOURCES = lib1910.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1910_LDADD = $(TESTUTIL_LIBS)
+lib1910_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1911_SOURCES = lib1911.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1911_LDADD = $(TESTUTIL_LIBS)
+lib1911_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1912_SOURCES = lib1912.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1912_LDADD = $(TESTUTIL_LIBS)
+lib1912_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib1913_SOURCES = lib1913.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1913_LDADD = $(TESTUTIL_LIBS)
+lib1913_CPPFLAGS = $(AM_CPPFLAGS)
+
+lib3010_SOURCES = lib3010.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib3010_LDADD = $(TESTUTIL_LIBS)
+lib3010_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/tests/libtest/lib1156.c b/tests/libtest/lib1156.c
index df6062c56..ff94d9cfd 100644
--- a/tests/libtest/lib1156.c
+++ b/tests/libtest/lib1156.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,12 +40,12 @@
#define F_CONTENTRANGE (1 << 3) /* Server sends content-range hdr. */
#define F_IGNOREBODY (1 << 4) /* Body should be ignored. */
-typedef struct {
+struct testparams {
unsigned int flags; /* ORed flags as above. */
CURLcode result; /* Code that should be returned by curl_easy_perform(). */
-} testparams;
+};
-static const testparams params[] = {
+static const struct testparams params[] = {
{ 0, CURLE_OK },
{ F_CONTENTRANGE, CURLE_OK },
{ F_FAIL, CURLE_OK },
@@ -82,7 +82,7 @@ static size_t writedata(char *data, size_t size, size_t nmemb, void *userdata)
return size * nmemb;
}
-static int onetest(CURL *curl, const char *url, const testparams *p)
+static int onetest(CURL *curl, const char *url, const struct testparams *p)
{
CURLcode res;
unsigned int replyselector;
diff --git a/tests/libtest/lib1507.c b/tests/libtest/lib1507.c
index dc023a079..20cc5f0a4 100644
--- a/tests/libtest/lib1507.c
+++ b/tests/libtest/lib1507.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1508.c b/tests/libtest/lib1508.c
index f536422cb..09d24d8dc 100644
--- a/tests/libtest/lib1508.c
+++ b/tests/libtest/lib1508.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2013, Linus Nielsen Feltzing <linus@haxx.se>
+ * Copyright (C) 2013 - 2020, Linus Nielsen Feltzing <linus@haxx.se>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1509.c b/tests/libtest/lib1509.c
index 63bc589b1..2bc8c9ffa 100644
--- a/tests/libtest/lib1509.c
+++ b/tests/libtest/lib1509.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1514.c b/tests/libtest/lib1514.c
index b4ab9dcc3..dd84d109f 100644
--- a/tests/libtest/lib1514.c
+++ b/tests/libtest/lib1514.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -68,6 +68,10 @@ int test(char *URL)
/* Purposely omit to set CURLOPT_POSTFIELDSIZE */
easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
easy_setopt(curl, CURLOPT_READDATA, &pooh);
+#ifdef LIB1539
+ /* speak HTTP 1.0 - no chunked! */
+ easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
+#endif
result = curl_easy_perform(curl);
diff --git a/tests/libtest/lib1515.c b/tests/libtest/lib1515.c
index c72554a3b..4e578a42e 100644
--- a/tests/libtest/lib1515.c
+++ b/tests/libtest/lib1515.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,7 +36,7 @@
#define DNS_TIMEOUT 1
#if defined(WIN32) || defined(_WIN32)
-#define sleep(s) Sleep(s * 1000)
+#define sleep(sec) Sleep ((sec)*1000)
#endif
static int debug_callback(CURL *curl, curl_infotype info, char *msg,
diff --git a/tests/libtest/lib1520.c b/tests/libtest/lib1520.c
index c6ac64bb4..779aeafcd 100644
--- a/tests/libtest/lib1520.c
+++ b/tests/libtest/lib1520.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2014, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2014 - 2020, Steve Holme, <steve_holme@hotmail.com>.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1525.c b/tests/libtest/lib1525.c
index a76494589..551d04e02 100644
--- a/tests/libtest/lib1525.c
+++ b/tests/libtest/lib1525.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2014, Vijay Panghal, <vpanghal@maginatics.com>, et al.
*
* This software is licensed as described in the file COPYING, which
diff --git a/tests/libtest/lib1526.c b/tests/libtest/lib1526.c
index 663465799..d94c03cf4 100644
--- a/tests/libtest/lib1526.c
+++ b/tests/libtest/lib1526.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Vijay Panghal, <vpanghal@maginatics.com>, et al.
+ * Copyright (C) 1998 - 2020, Vijay Panghal, <vpanghal@maginatics.com>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1527.c b/tests/libtest/lib1527.c
index 689839e3d..c50c2fa23 100644
--- a/tests/libtest/lib1527.c
+++ b/tests/libtest/lib1527.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Vijay Panghal, <vpanghal@maginatics.com>, et al.
+ * Copyright (C) 1998 - 2020, Vijay Panghal, <vpanghal@maginatics.com>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1531.c b/tests/libtest/lib1531.c
index 4a4dc133a..73b3f0a91 100644
--- a/tests/libtest/lib1531.c
+++ b/tests/libtest/lib1531.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -107,7 +107,7 @@ int test(char *URL)
curl_multi_fdset() doc. */
if(maxfd == -1) {
-#ifdef _WIN32
+#if defined(WIN32) || defined(_WIN32)
Sleep(100);
rc = 0;
#else
diff --git a/tests/libtest/lib1533.c b/tests/libtest/lib1533.c
index 962a222ec..7a4aafc64 100644
--- a/tests/libtest/lib1533.c
+++ b/tests/libtest/lib1533.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1535.c b/tests/libtest/lib1535.c
index 6ff03467d..b448466dd 100644
--- a/tests/libtest/lib1535.c
+++ b/tests/libtest/lib1535.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1536.c b/tests/libtest/lib1536.c
index 0c04bbf8e..5bee299cc 100644
--- a/tests/libtest/lib1536.c
+++ b/tests/libtest/lib1536.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1538.c b/tests/libtest/lib1538.c
index 91481e88d..0f91e2f0c 100644
--- a/tests/libtest/lib1538.c
+++ b/tests/libtest/lib1538.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -31,12 +31,12 @@ int test(char *URL)
CURLSHcode shareret;
(void)URL;
- curl_easy_strerror(INT_MAX);
- curl_multi_strerror(INT_MAX);
- curl_share_strerror(INT_MAX);
- curl_easy_strerror(-INT_MAX);
- curl_multi_strerror(-INT_MAX);
- curl_share_strerror(-INT_MAX);
+ curl_easy_strerror((CURLcode)INT_MAX);
+ curl_multi_strerror((CURLMcode)INT_MAX);
+ curl_share_strerror((CURLSHcode)INT_MAX);
+ curl_easy_strerror((CURLcode)-INT_MAX);
+ curl_multi_strerror((CURLMcode)-INT_MAX);
+ curl_share_strerror((CURLSHcode)-INT_MAX);
for(easyret = CURLE_OK; easyret <= CURL_LAST; easyret++) {
printf("e%d: %s\n", (int)easyret, curl_easy_strerror(easyret));
}
diff --git a/tests/libtest/lib1540.c b/tests/libtest/lib1540.c
index c3f855490..d0e4ca9b6 100644
--- a/tests/libtest/lib1540.c
+++ b/tests/libtest/lib1540.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1541.c b/tests/libtest/lib1541.c
deleted file mode 100644
index f3b41f5be..000000000
--- a/tests/libtest/lib1541.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#include <time.h>
-
-/* number of threads to fire up in parallel */
-#define NUM_THREADS 67
-
-/* for how many seconds each thread will loop */
-#define RUN_FOR_SECONDS 7
-
-static pthread_mutex_t connlock;
-
-static size_t write_db(void *ptr, size_t size, size_t nmemb, void *data)
-{
- /* not interested in the downloaded bytes, return the size */
- (void)ptr; /* unused */
- (void)data; /* unused */
- return (size_t)(size * nmemb);
-}
-
-static void lock_cb(CURL *handle, curl_lock_data data,
- curl_lock_access access, void *userptr)
-{
- (void)access; /* unused */
- (void)userptr; /* unused */
- (void)handle; /* unused */
- (void)data; /* unused */
- pthread_mutex_lock(&connlock);
-}
-
-static void unlock_cb(CURL *handle, curl_lock_data data,
- void *userptr)
-{
- (void)userptr; /* unused */
- (void)handle; /* unused */
- (void)data; /* unused */
- pthread_mutex_unlock(&connlock);
-}
-
-static void init_locks(void)
-{
- pthread_mutex_init(&connlock, NULL);
-}
-
-static void kill_locks(void)
-{
- pthread_mutex_destroy(&connlock);
-}
-
-struct initurl {
- const char *url;
- CURLSH *share;
- int threadno;
-};
-
-static void *run_thread(void *ptr)
-{
- struct initurl *u = (struct initurl *)ptr;
- int i;
- time_t end = time(NULL) + RUN_FOR_SECONDS;
-
- for(i = 0; time(NULL) < end; i++) {
- CURL *curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_URL, u->url);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
- curl_easy_setopt(curl, CURLOPT_SHARE, u->share);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_db);
- curl_easy_perform(curl); /* ignores error */
- curl_easy_cleanup(curl);
- fprintf(stderr, "Thread %d transfer %d\n", u->threadno, i);
- }
-
- return NULL;
-}
-
-int test(char *URL)
-{
- pthread_t tid[NUM_THREADS];
- int i;
- CURLSH *share;
- struct initurl url[NUM_THREADS];
-
- /* Must initialize libcurl before any threads are started */
- curl_global_init(CURL_GLOBAL_ALL);
-
- share = curl_share_init();
- curl_share_setopt(share, CURLSHOPT_LOCKFUNC, lock_cb);
- curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, unlock_cb);
- curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
-
- init_locks();
-
- for(i = 0; i< NUM_THREADS; i++) {
- int error;
- url[i].url = URL;
- url[i].share = share;
- url[i].threadno = i;
- error = pthread_create(&tid[i], NULL, run_thread, &url[i]);
- if(0 != error)
- fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
- else
- fprintf(stderr, "Thread %d, gets %s\n", i, URL);
- }
-
- /* now wait for all threads to terminate */
- for(i = 0; i< NUM_THREADS; i++) {
- pthread_join(tid[i], NULL);
- fprintf(stderr, "Thread %d terminated\n", i);
- }
-
- kill_locks();
-
- curl_share_cleanup(share);
- curl_global_cleanup();
- return 0;
-}
-
-#else /* without pthread, this test doesn't work */
-int test(char *URL)
-{
- (void)URL;
- return 0;
-}
-#endif
diff --git a/tests/libtest/lib1554.c b/tests/libtest/lib1554.c
index df12fe52e..a8198803b 100644
--- a/tests/libtest/lib1554.c
+++ b/tests/libtest/lib1554.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib1557.c b/tests/libtest/lib1557.c
index bd0f20a85..d7132ad04 100644
--- a/tests/libtest/lib1557.c
+++ b/tests/libtest/lib1557.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -49,13 +49,13 @@ int test(char *URL)
multi_perform(curlm, &running_handles);
multi_remove_handle(curlm, curl2);
- curl_easy_cleanup(curl2);
/* If curl2 is still in the connect-pending list, this will crash */
multi_remove_handle(curlm, curl1);
- curl_easy_cleanup(curl1);
test_cleanup:
+ curl_easy_cleanup(curl1);
+ curl_easy_cleanup(curl2);
curl_multi_cleanup(curlm);
curl_global_cleanup();
return res;
diff --git a/tests/libtest/lib1559.c b/tests/libtest/lib1559.c
index 2aa3615e0..e1b417548 100644
--- a/tests/libtest/lib1559.c
+++ b/tests/libtest/lib1559.c
@@ -34,6 +34,9 @@ int test(char *URL)
CURLU *u;
(void)URL;
+ if(!longurl)
+ return 1;
+
memset(longurl, 'a', EXCESSIVE);
longurl[EXCESSIVE-1] = 0;
@@ -62,15 +65,8 @@ int test(char *URL)
curl_url_cleanup(u);
}
- free(longurl);
-
- curl_easy_cleanup(curl);
- curl_global_cleanup();
-
- return 0;
-
test_cleanup:
-
+ free(longurl);
curl_easy_cleanup(curl);
curl_global_cleanup();
diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c
index 7f8accc7d..cc61199e9 100644
--- a/tests/libtest/lib1560.c
+++ b/tests/libtest/lib1560.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -60,7 +60,7 @@ static int checkparts(CURLU *u, const char *in, const char *wanted,
{CURLUPART_FRAGMENT, "fragment"},
{0, NULL}
};
- buf[0] = 0;
+ memset(buf, 0, sizeof(buf));
for(i = 0; parts[i].name; i++) {
char *p = NULL;
@@ -129,6 +129,23 @@ struct querycase {
};
static struct testcase get_parts_list[] ={
+ {"[::1]",
+ "http | [11] | [12] | [13] | [::1] | [15] | / | [16] | [17]",
+ CURLU_GUESS_SCHEME, 0, CURLUE_OK },
+ {"[::]",
+ "http | [11] | [12] | [13] | [::] | [15] | / | [16] | [17]",
+ CURLU_GUESS_SCHEME, 0, CURLUE_OK },
+ {"https://[::1]",
+ "https | [11] | [12] | [13] | [::1] | [15] | / | [16] | [17]",
+ 0, 0, CURLUE_OK },
+ {"user:moo@ftp.example.com/color/#green?no-red",
+ "ftp | user | moo | [13] | ftp.example.com | [15] | /color/ | [16] | "
+ "green?no-red",
+ CURLU_GUESS_SCHEME, 0, CURLUE_OK },
+ {"ftp.user:moo@example.com/color/#green?no-red",
+ "http | ftp.user | moo | [13] | example.com | [15] | /color/ | [16] | "
+ "green?no-red",
+ CURLU_GUESS_SCHEME, 0, CURLUE_OK },
#ifdef WIN32
{"file:/C:\\programs\\foo",
"file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
@@ -140,25 +157,25 @@ static struct testcase get_parts_list[] ={
"file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
#endif
- {"https://example.com/color/#green?no-black",
+ {"https://example.com/color/#green?no-red",
"https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
- "green?no-black",
+ "green?no-red",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.com/color/#green#no-black",
+ {"https://example.com/color/#green#no-red",
"https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
- "green#no-black",
+ "green#no-red",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.com/color/?green#no-black",
+ {"https://example.com/color/?green#no-red",
"https | [11] | [12] | [13] | example.com | [15] | /color/ | green | "
- "no-black",
+ "no-red",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.com/#color/?green#no-black",
+ {"https://example.com/#color/?green#no-red",
"https | [11] | [12] | [13] | example.com | [15] | / | [16] | "
- "color/?green#no-black",
+ "color/?green#no-red",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
- {"https://example.#com/color/?green#no-black",
+ {"https://example.#com/color/?green#no-red",
"https | [11] | [12] | [13] | example. | [15] | / | [16] | "
- "com/color/?green#no-black",
+ "com/color/?green#no-red",
CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
{"http://[ab.be:1]/x", "",
CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
@@ -621,7 +638,7 @@ static CURLUPart part2id(char *part)
return CURLUPART_FRAGMENT;
if(!strcmp("zoneid", part))
return CURLUPART_ZONEID;
- return 9999; /* bad input => bad output */
+ return (CURLUPart)9999; /* bad input => bad output */
}
static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
@@ -637,6 +654,9 @@ static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
char buf[80];
char part[80];
char value[80];
+
+ memset(part, 0, sizeof(part)); /* Avoid valgrind false positive. */
+ memset(value, 0, sizeof(value)); /* Avoid valgrind false positive. */
memcpy(buf, p, n);
buf[n] = 0;
if(2 == sscanf(buf, "%79[^=]=%79[^,]", part, value)) {
@@ -666,6 +686,14 @@ static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
}
static struct redircase set_url_list[] = {
+ {"http://example.org/static/favicon/wikipedia.ico",
+ "//fake.example.com/licenses/by-sa/3.0/",
+ "http://fake.example.com/licenses/by-sa/3.0/",
+ 0, 0, 0},
+ {"https://example.org/static/favicon/wikipedia.ico",
+ "//fake.example.com/licenses/by-sa/3.0/",
+ "https://fake.example.com/licenses/by-sa/3.0/",
+ 0, 0, 0},
{"file://localhost/path?query#frag",
"foo#another",
"file:///foo#another",
diff --git a/tests/libtest/lib1564.c b/tests/libtest/lib1564.c
new file mode 100644
index 000000000..13ac5b01e
--- /dev/null
+++ b/tests/libtest/lib1564.c
@@ -0,0 +1,142 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+#define WAKEUP_NUM 10
+
+int test(char *URL)
+{
+ CURLM *multi = NULL;
+ int numfds;
+ int i;
+ int res = 0;
+ struct timeval time_before_wait, time_after_wait;
+
+ (void)URL;
+
+ start_test_timing();
+
+ global_init(CURL_GLOBAL_ALL);
+
+ multi_init(multi);
+
+ /* no wakeup */
+
+ time_before_wait = tutil_tvnow();
+ multi_poll(multi, NULL, 0, 1000, &numfds);
+ time_after_wait = tutil_tvnow();
+
+ if(tutil_tvdiff(time_after_wait, time_before_wait) < 500) {
+ fprintf(stderr, "%s:%d curl_multi_poll returned too early\n",
+ __FILE__, __LINE__);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+
+ /* try a single wakeup */
+
+ multi_wakeup(multi);
+
+ time_before_wait = tutil_tvnow();
+ multi_poll(multi, NULL, 0, 1000, &numfds);
+ time_after_wait = tutil_tvnow();
+
+ if(tutil_tvdiff(time_after_wait, time_before_wait) > 500) {
+ fprintf(stderr, "%s:%d curl_multi_poll returned too late\n",
+ __FILE__, __LINE__);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+
+ /* previous wakeup should not wake up this */
+
+ time_before_wait = tutil_tvnow();
+ multi_poll(multi, NULL, 0, 1000, &numfds);
+ time_after_wait = tutil_tvnow();
+
+ if(tutil_tvdiff(time_after_wait, time_before_wait) < 500) {
+ fprintf(stderr, "%s:%d curl_multi_poll returned too early\n",
+ __FILE__, __LINE__);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+
+ /* try lots of wakeup */
+
+ for(i = 0; i < WAKEUP_NUM; ++i)
+ multi_wakeup(multi);
+
+ time_before_wait = tutil_tvnow();
+ multi_poll(multi, NULL, 0, 1000, &numfds);
+ time_after_wait = tutil_tvnow();
+
+ if(tutil_tvdiff(time_after_wait, time_before_wait) > 500) {
+ fprintf(stderr, "%s:%d curl_multi_poll returned too late\n",
+ __FILE__, __LINE__);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+
+#if !defined(WIN32) && !defined(_WIN32) && !defined(__WIN32__) \
+ && !defined(__CYGWIN__)
+ /* Even lots of previous wakeups should not wake up this.
+
+ On Windows (particularly when using MinGW), the socketpair
+ used for curl_multi_wakeup() is really asynchronous,
+ meaning when it's called a lot, it can take some time
+ before all of the data can be read. Sometimes it can wake
+ up more than one curl_multi_poll() call. */
+
+ time_before_wait = tutil_tvnow();
+ multi_poll(multi, NULL, 0, 1000, &numfds);
+ time_after_wait = tutil_tvnow();
+
+ if(tutil_tvdiff(time_after_wait, time_before_wait) < 500) {
+ fprintf(stderr, "%s:%d curl_multi_poll returned too early\n",
+ __FILE__, __LINE__);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+#endif
+
+test_cleanup:
+
+ curl_multi_cleanup(multi);
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/lib1565.c b/tests/libtest/lib1565.c
new file mode 100644
index 000000000..b2fa40aaa
--- /dev/null
+++ b/tests/libtest/lib1565.c
@@ -0,0 +1,204 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#include <unistd.h>
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+#define CONN_NUM 3
+#define TIME_BETWEEN_START_SECS 2
+
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+static CURL *pending_handles[CONN_NUM];
+static int pending_num = 0;
+static int test_failure = 0;
+
+static CURLM *multi = NULL;
+static const char *url;
+
+static void *run_thread(void *ptr)
+{
+ CURL *easy = NULL;
+ int res = 0;
+ int i;
+
+ (void)ptr;
+
+ for(i = 0; i < CONN_NUM; i++) {
+ sleep(TIME_BETWEEN_START_SECS);
+
+ easy_init(easy);
+
+ easy_setopt(easy, CURLOPT_URL, url);
+ easy_setopt(easy, CURLOPT_VERBOSE, 0L);
+
+ pthread_mutex_lock(&lock);
+
+ if(test_failure) {
+ pthread_mutex_unlock(&lock);
+ goto test_cleanup;
+ }
+
+ pending_handles[pending_num] = easy;
+ pending_num++;
+ easy = NULL;
+
+ pthread_mutex_unlock(&lock);
+
+ multi_wakeup(multi);
+ }
+
+test_cleanup:
+
+ curl_easy_cleanup(easy);
+
+ pthread_mutex_lock(&lock);
+
+ if(!test_failure)
+ test_failure = res;
+
+ pthread_mutex_unlock(&lock);
+
+ return NULL;
+}
+
+int test(char *URL)
+{
+ int still_running;
+ int num;
+ int i;
+ int res = 0;
+ CURL *started_handles[CONN_NUM];
+ int started_num = 0;
+ int finished_num = 0;
+ pthread_t tid = 0;
+ struct CURLMsg *message;
+
+ start_test_timing();
+
+ global_init(CURL_GLOBAL_ALL);
+
+ multi_init(multi);
+
+ url = URL;
+
+ res = pthread_create(&tid, NULL, run_thread, NULL);
+ if(0 != res) {
+ fprintf(stderr, "%s:%d Couldn't create thread, errno %d\n",
+ __FILE__, __LINE__, res);
+ goto test_cleanup;
+ }
+
+ while(1) {
+ multi_perform(multi, &still_running);
+
+ abort_on_test_timeout();
+
+ while((message = curl_multi_info_read(multi, &num)) != NULL) {
+ if(message->msg == CURLMSG_DONE) {
+ res = message->data.result;
+ if(res)
+ goto test_cleanup;
+ multi_remove_handle(multi, message->easy_handle);
+ finished_num++;
+ }
+ else {
+ fprintf(stderr, "%s:%d Got an unexpected message from curl: %i\n",
+ __FILE__, __LINE__, (int)message->msg);
+ res = TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ abort_on_test_timeout();
+ }
+
+ if(CONN_NUM == finished_num)
+ break;
+
+ multi_poll(multi, NULL, 0, TEST_HANG_TIMEOUT, &num);
+
+ abort_on_test_timeout();
+
+ pthread_mutex_lock(&lock);
+
+ while(pending_num > 0) {
+ res_multi_add_handle(multi, pending_handles[pending_num - 1]);
+ if(res) {
+ pthread_mutex_unlock(&lock);
+ goto test_cleanup;
+ }
+
+ started_handles[started_num] = pending_handles[pending_num - 1];
+ started_num++;
+ pending_num--;
+ }
+
+ pthread_mutex_unlock(&lock);
+
+ abort_on_test_timeout();
+ }
+
+ if(CONN_NUM != started_num) {
+ fprintf(stderr, "%s:%d Not all connections started: %d of %d\n",
+ __FILE__, __LINE__, started_num, CONN_NUM);
+ goto test_cleanup;
+ }
+
+ if(CONN_NUM != finished_num) {
+ fprintf(stderr, "%s:%d Not all connections finished: %d of %d\n",
+ __FILE__, __LINE__, started_num, CONN_NUM);
+ goto test_cleanup;
+ }
+
+test_cleanup:
+
+ pthread_mutex_lock(&lock);
+ if(!test_failure)
+ test_failure = res;
+ pthread_mutex_unlock(&lock);
+
+ if(0 != tid)
+ pthread_join(tid, NULL);
+
+ curl_multi_cleanup(multi);
+ for(i = 0; i < pending_num; i++)
+ curl_easy_cleanup(pending_handles[i]);
+ for(i = 0; i < started_num; i++)
+ curl_easy_cleanup(started_handles[i]);
+ curl_global_cleanup();
+
+ return test_failure;
+}
+
+#else /* without pthread, this test doesn't work */
+int test(char *URL)
+{
+ (void)URL;
+ return 0;
+}
+#endif
diff --git a/tests/libtest/lib1567.c b/tests/libtest/lib1567.c
new file mode 100644
index 000000000..48e6ea96c
--- /dev/null
+++ b/tests/libtest/lib1567.c
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+#include <curl/multi.h>
+
+int test(char *URL)
+{
+ CURL *curl;
+ CURLcode res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
+ curl = curl_easy_init();
+ if(curl) {
+ CURLU *u = curl_url();
+ if(u) {
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+ curl_url_set(u, CURLUPART_URL, URL, 0);
+ curl_easy_setopt(curl, CURLOPT_CURLU, u);
+ res = curl_easy_perform(curl);
+
+ fprintf(stderr, "****************************** Do it again\n");
+ res = curl_easy_perform(curl);
+ curl_url_cleanup(u);
+ }
+ curl_easy_cleanup(curl);
+ }
+ curl_global_cleanup();
+ return (int)res;
+}
diff --git a/tests/libtest/lib1591.c b/tests/libtest/lib1591.c
index f0c6b4cb7..cc1c5b228 100644
--- a/tests/libtest/lib1591.c
+++ b/tests/libtest/lib1591.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -50,12 +50,25 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
return amount;
}
+/*
+ * carefully not leak memory on OOM
+ */
static int trailers_callback(struct curl_slist **list, void *userdata)
{
+ struct curl_slist *nlist = NULL;
+ struct curl_slist *nlist2 = NULL;
(void)userdata;
- *list = curl_slist_append(*list, "my-super-awesome-trailer: trail1");
- *list = curl_slist_append(*list, "my-other-awesome-trailer: trail2");
- return CURL_TRAILERFUNC_OK;
+ nlist = curl_slist_append(*list, "my-super-awesome-trailer: trail1");
+ if(nlist)
+ nlist2 = curl_slist_append(nlist, "my-other-awesome-trailer: trail2");
+ if(nlist2) {
+ *list = nlist2;
+ return CURL_TRAILERFUNC_OK;
+ }
+ else {
+ curl_slist_free_all(nlist);
+ return CURL_TRAILERFUNC_ABORT;
+ }
}
int test(char *URL)
diff --git a/tests/libtest/lib1592.c b/tests/libtest/lib1592.c
index 5e6bf04eb..34901d20e 100644
--- a/tests/libtest/lib1592.c
+++ b/tests/libtest/lib1592.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -43,7 +43,8 @@ int test(char *URL)
int stillRunning;
CURLM *multiHandle = NULL;
CURL *curl = NULL;
- CURLMcode res = CURLM_OK;
+ CURLcode res = CURLE_OK;
+ CURLMcode mres;
int timeout;
global_init(CURL_GLOBAL_ALL);
@@ -97,10 +98,11 @@ int test(char *URL)
/* Start measuring how long it takes to remove the handle. */
fprintf(stderr, "curl_multi_remove_handle()...\n");
start_test_timing();
- res = curl_multi_remove_handle(multiHandle, curl);
- if(res) {
+ mres = curl_multi_remove_handle(multiHandle, curl);
+ if(mres) {
fprintf(stderr, "curl_multi_remove_handle() failed, "
"with code %d\n", (int)res);
+ res = TEST_ERR_MULTI;
goto test_cleanup;
}
fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
diff --git a/tests/libtest/lib1900.c b/tests/libtest/lib1900.c
deleted file mode 100644
index 2a70f8eba..000000000
--- a/tests/libtest/lib1900.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 2013 - 2019, Linus Nielsen Feltzing, <linus@haxx.se>
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#define TEST_HANG_TIMEOUT 60 * 1000
-#define MAX_URLS 200
-#define MAX_BLACKLIST 20
-
-static int urltime[MAX_URLS];
-static char *urlstring[MAX_URLS];
-static CURL *handles[MAX_URLS];
-static char *site_blacklist[MAX_BLACKLIST];
-static char *server_blacklist[MAX_BLACKLIST];
-static int num_handles;
-static int blacklist_num_servers;
-static int blacklist_num_sites;
-
-static size_t
-write_callback(void *contents, size_t size, size_t nmemb, void *userp)
-{
- size_t realsize = size * nmemb;
- (void)contents;
- (void)userp;
-
- return realsize;
-}
-
-static int parse_url_file(const char *filename)
-{
- FILE *f;
- int filetime;
- char buf[200];
-
- num_handles = 0;
- blacklist_num_sites = 0;
- blacklist_num_servers = 0;
-
- f = fopen(filename, "rb");
- if(!f)
- return 0;
-
- while(!feof(f)) {
- if(fscanf(f, "%d %199s\n", &filetime, buf)) {
- urltime[num_handles] = filetime;
- urlstring[num_handles] = strdup(buf);
- num_handles++;
- continue;
- }
-
- if(fscanf(f, "blacklist_site %199s\n", buf)) {
- site_blacklist[blacklist_num_sites] = strdup(buf);
- blacklist_num_sites++;
- continue;
- }
-
- break;
- }
- fclose(f);
-
- site_blacklist[blacklist_num_sites] = NULL;
- server_blacklist[blacklist_num_servers] = NULL;
- return num_handles;
-}
-
-static void free_urls(void)
-{
- int i;
- for(i = 0; i < num_handles; i++) {
- Curl_safefree(urlstring[i]);
- }
- for(i = 0; i < blacklist_num_servers; i++) {
- Curl_safefree(server_blacklist[i]);
- }
- for(i = 0; i < blacklist_num_sites; i++) {
- Curl_safefree(site_blacklist[i]);
- }
-}
-
-static int create_handles(void)
-{
- int i;
-
- for(i = 0; i < num_handles; i++) {
- handles[i] = curl_easy_init();
- }
- return 0;
-}
-
-static void setup_handle(char *base_url, CURLM *m, int handlenum)
-{
- char urlbuf[256];
-
- msnprintf(urlbuf, sizeof(urlbuf), "%s%s", base_url, urlstring[handlenum]);
- curl_easy_setopt(handles[handlenum], CURLOPT_URL, urlbuf);
- curl_easy_setopt(handles[handlenum], CURLOPT_VERBOSE, 1L);
- curl_easy_setopt(handles[handlenum], CURLOPT_FAILONERROR, 1L);
- curl_easy_setopt(handles[handlenum], CURLOPT_WRITEFUNCTION, write_callback);
- curl_easy_setopt(handles[handlenum], CURLOPT_WRITEDATA, NULL);
- curl_multi_add_handle(m, handles[handlenum]);
-}
-
-static void remove_handles(void)
-{
- int i;
-
- for(i = 0; i < num_handles; i++) {
- if(handles[i])
- curl_easy_cleanup(handles[i]);
- }
-}
-
-int test(char *URL)
-{
- int res = 0;
- CURLM *m = NULL;
- CURLMsg *msg; /* for picking up messages with the transfer status */
- int msgs_left; /* how many messages are left */
- int running = 0;
- int handlenum = 0;
- struct timeval last_handle_add;
-
- if(parse_url_file(libtest_arg2) <= 0)
- goto test_cleanup;
-
- start_test_timing();
-
- curl_global_init(CURL_GLOBAL_ALL);
-
- multi_init(m);
-
- create_handles();
-
- multi_setopt(m, CURLMOPT_PIPELINING, 1L);
- multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L);
- multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L);
- multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, 15000L);
- multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, 10000L);
-
- multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_blacklist);
- multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_blacklist);
-
- last_handle_add = tutil_tvnow();
-
- for(;;) {
- struct timeval interval;
- struct timeval now;
- fd_set rd, wr, exc;
- int maxfd = -99;
- long timeout;
-
- interval.tv_sec = 1;
- interval.tv_usec = 0;
-
- if(handlenum < num_handles) {
- now = tutil_tvnow();
- if(tutil_tvdiff(now, last_handle_add) >= urltime[handlenum]) {
- fprintf(stdout, "Adding handle %d\n", handlenum);
- setup_handle(URL, m, handlenum);
- last_handle_add = now;
- handlenum++;
- }
- }
-
- curl_multi_perform(m, &running);
-
- abort_on_test_timeout();
-
- /* See how the transfers went */
- do {
- msg = curl_multi_info_read(m, &msgs_left);
- if(msg && msg->msg == CURLMSG_DONE) {
- int i;
-
- /* Find out which handle this message is about */
- for(i = 0; i < num_handles; i++) {
- int found = (msg->easy_handle == handles[i]);
- if(found)
- break;
- }
-
- printf("Handle %d Completed with status %d\n", i, msg->data.result);
- curl_multi_remove_handle(m, handles[i]);
- }
- } while(msg);
-
- if(handlenum == num_handles && !running) {
- break; /* done */
- }
-
- FD_ZERO(&rd);
- FD_ZERO(&wr);
- FD_ZERO(&exc);
-
- curl_multi_fdset(m, &rd, &wr, &exc, &maxfd);
-
- /* At this point, maxfd is guaranteed to be greater or equal than -1. */
-
- curl_multi_timeout(m, &timeout);
-
- if(timeout < 0)
- timeout = 1;
-
- interval.tv_sec = timeout / 1000;
- interval.tv_usec = (timeout % 1000) * 1000;
-
- interval.tv_sec = 0;
- interval.tv_usec = 1000;
-
- select_test(maxfd + 1, &rd, &wr, &exc, &interval);
-
- abort_on_test_timeout();
- }
-
-test_cleanup:
-
- remove_handles();
-
- /* undocumented cleanup sequence - type UB */
-
- curl_multi_cleanup(m);
- curl_global_cleanup();
-
- free_urls();
- return res;
-}
diff --git a/tests/libtest/lib1908.c b/tests/libtest/lib1908.c
new file mode 100644
index 000000000..30e7d8019
--- /dev/null
+++ b/tests/libtest/lib1908.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2013 - 2020, Linus Nielsen Feltzing, <linus@haxx.se>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode ret = CURLE_OK;
+ CURL *hnd;
+ start_test_timing();
+
+ curl_global_init(CURL_GLOBAL_ALL);
+
+ hnd = curl_easy_init();
+ if(hnd) {
+ curl_easy_setopt(hnd, CURLOPT_URL, URL);
+ curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
+ curl_easy_setopt(hnd, CURLOPT_ALTSVC, "log/altsvc-1908");
+ ret = curl_easy_perform(hnd);
+
+ if(!ret) {
+ /* make a copy and check that this also has alt-svc activated */
+ CURL *also = curl_easy_duphandle(hnd);
+ if(also) {
+ ret = curl_easy_perform(also);
+ /* we close the second handle first, which makes it store the alt-svc
+ file only to get overwritten when the next handle is closed! */
+ curl_easy_cleanup(also);
+ }
+ }
+
+ curl_easy_reset(hnd);
+
+ /* using the same file name for the alt-svc cache, this clobbers the
+ content just written from the 'also' handle */
+ curl_easy_cleanup(hnd);
+ }
+ curl_global_cleanup();
+ return (int)ret;
+}
diff --git a/tests/libtest/lib1910.c b/tests/libtest/lib1910.c
new file mode 100644
index 000000000..1e25db5a4
--- /dev/null
+++ b/tests/libtest/lib1910.c
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2013 - 2020, Linus Nielsen Feltzing, <linus@haxx.se>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode ret = CURLE_OK;
+ CURL *hnd;
+ start_test_timing();
+
+ curl_global_init(CURL_GLOBAL_ALL);
+
+ hnd = curl_easy_init();
+ if(hnd) {
+ curl_easy_setopt(hnd, CURLOPT_URL, URL);
+ curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
+ curl_easy_setopt(hnd, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(hnd, CURLOPT_USERPWD, "user\nname:pass\nword");
+ ret = curl_easy_perform(hnd);
+ curl_easy_cleanup(hnd);
+ }
+ curl_global_cleanup();
+ return (int)ret;
+}
diff --git a/tests/libtest/lib1911.c b/tests/libtest/lib1911.c
new file mode 100644
index 000000000..3fafd286a
--- /dev/null
+++ b/tests/libtest/lib1911.c
@@ -0,0 +1,87 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+/* The maximum string length limit (CURL_MAX_INPUT_LENGTH) is an internal
+ define not publicly exposed so we set our own */
+#define MAX_INPUT_LENGTH 8000000
+
+static char buffer[MAX_INPUT_LENGTH + 2];
+
+int test(char *URL)
+{
+ const struct curl_easyoption *o;
+ CURL *easy;
+ int error = 0;
+ (void)URL;
+
+ easy = curl_easy_init();
+ if(!easy)
+ return 1;
+
+ /* make it a zero terminated C string with just As */
+ memset(buffer, 'A', MAX_INPUT_LENGTH + 1);
+ buffer[MAX_INPUT_LENGTH + 1] = 0;
+
+ printf("string length: %d\n", (int)strlen(buffer));
+
+ for(o = curl_easy_option_next(NULL);
+ o;
+ o = curl_easy_option_next(o)) {
+ if(o->type == CURLOT_STRING) {
+ CURLcode result;
+ /*
+ * Whitelist string options that are safe for abuse
+ */
+ switch(o->id) {
+ case CURLOPT_PROXY_TLSAUTH_TYPE:
+ case CURLOPT_TLSAUTH_TYPE:
+ continue;
+ default:
+ /* check this */
+ break;
+ }
+
+ /* This is a string. Make sure that passing in a string longer
+ CURL_MAX_INPUT_LENGTH returns an error */
+ result = curl_easy_setopt(easy, o->id, buffer);
+ switch(result) {
+ case CURLE_BAD_FUNCTION_ARGUMENT: /* the most normal */
+ case CURLE_UNKNOWN_OPTION: /* left out from the build */
+ case CURLE_NOT_BUILT_IN: /* not supported */
+ break;
+ default:
+ /* all other return codes are unexpected */
+ fprintf(stderr, "curl_easy_setopt(%s...) returned %d\n",
+ o->name, (int)result);
+ error++;
+ break;
+ }
+ }
+ }
+ curl_easy_cleanup(easy);
+ return error;
+}
diff --git a/tests/libtest/lib1912.c b/tests/libtest/lib1912.c
new file mode 100644
index 000000000..44d09baa3
--- /dev/null
+++ b/tests/libtest/lib1912.c
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+#define print_err(name, exp) \
+ fprintf(stderr, "Type mismatch for CURLOPT_%s (expected %s)\n", name, exp);
+
+int test(char *URL)
+{
+/* Only test if GCC typechecking is available */
+ int error = 0;
+#ifdef CURLINC_TYPECHECK_GCC_H
+ const struct curl_easyoption *o;
+ for(o = curl_easy_option_next(NULL);
+ o;
+ o = curl_easy_option_next(o)) {
+ /* Test for mismatch OR missing typecheck macros */
+ if(curlcheck_long_option(o->id) !=
+ (o->type == CURLOT_LONG || o->type == CURLOT_VALUES)) {
+ print_err(o->name, "CURLOT_LONG or CURLOT_VALUES");
+ error++;
+ }
+ if(curlcheck_off_t_option(o->id) != (o->type == CURLOT_OFF_T)) {
+ print_err(o->name, "CURLOT_OFF_T");
+ error++;
+ }
+ if(curlcheck_string_option(o->id) != (o->type == CURLOT_STRING)) {
+ print_err(o->name, "CURLOT_STRING");
+ error++;
+ }
+ if(curlcheck_slist_option(o->id) != (o->type == CURLOT_SLIST)) {
+ print_err(o->name, "CURLOT_SLIST");
+ error++;
+ }
+ if(curlcheck_cb_data_option(o->id) != (o->type == CURLOT_CBPTR)) {
+ print_err(o->name, "CURLOT_CBPTR");
+ error++;
+ }
+ /* From here: only test that the type matches if macro is known */
+ if(curlcheck_write_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
+ print_err(o->name, "CURLOT_FUNCTION");
+ error++;
+ }
+ if(curlcheck_conv_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
+ print_err(o->name, "CURLOT_FUNCTION");
+ error++;
+ }
+ if(curlcheck_postfields_option(o->id) && (o->type != CURLOT_OBJECT)) {
+ print_err(o->name, "CURLOT_OBJECT");
+ error++;
+ }
+ /* Todo: no gcc typecheck for CURLOPTTYPE_BLOB types? */
+ }
+#endif
+ (void)URL;
+ return error;
+}
diff --git a/tests/libtest/lib1913.c b/tests/libtest/lib1913.c
new file mode 100644
index 000000000..b8ef96e36
--- /dev/null
+++ b/tests/libtest/lib1913.c
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode ret = CURLE_OK;
+ CURL *hnd;
+ start_test_timing();
+
+ curl_global_init(CURL_GLOBAL_ALL);
+
+ hnd = curl_easy_init();
+ if(hnd) {
+ curl_easy_setopt(hnd, CURLOPT_URL, URL);
+ curl_easy_setopt(hnd, CURLOPT_NOBODY, 1L);
+ if(libtest_arg2)
+ /* test1914 sets this extra arg */
+ curl_easy_setopt(hnd, CURLOPT_FILETIME, 1L);
+ ret = curl_easy_perform(hnd);
+ curl_easy_cleanup(hnd);
+ }
+ curl_global_cleanup();
+ return (int)ret;
+}
diff --git a/tests/libtest/lib3010.c b/tests/libtest/lib3010.c
new file mode 100644
index 000000000..9c24b2f52
--- /dev/null
+++ b/tests/libtest/lib3010.c
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2020 - 2020, Nicolas Sterchele, <nicolas@sterchelen.net>
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+int test(char *URL)
+{
+ CURLcode ret = CURLE_OK;
+ CURL *curl = NULL;
+ curl_off_t retry_after;
+ char *follow_url = NULL;
+
+ curl_global_init(CURL_GLOBAL_ALL);
+ curl = curl_easy_init();
+
+ if(curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, URL);
+ ret = curl_easy_perform(curl);
+ if(ret) {
+ fprintf(stderr, "%s:%d curl_easy_perform() failed with code %d (%s)\n",
+ __FILE__, __LINE__, ret, curl_easy_strerror(ret));
+ goto test_cleanup;
+ }
+ curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &follow_url);
+ curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after);
+ printf("Retry-After: %" CURL_FORMAT_CURL_OFF_T "\n", retry_after);
+ curl_easy_setopt(curl, CURLOPT_URL, follow_url);
+ ret = curl_easy_perform(curl);
+ if(ret) {
+ fprintf(stderr, "%s:%d curl_easy_perform() failed with code %d (%s)\n",
+ __FILE__, __LINE__, ret, curl_easy_strerror(ret));
+ goto test_cleanup;
+ }
+
+ curl_easy_reset(curl);
+ curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after);
+ printf("Retry-After: %" CURL_FORMAT_CURL_OFF_T "\n", retry_after);
+ }
+
+test_cleanup:
+ curl_easy_cleanup(curl);
+ curl_global_cleanup();
+
+ return ret;
+}
+
diff --git a/tests/libtest/lib500.c b/tests/libtest/lib500.c
index 8d9b92129..96dde3279 100644
--- a/tests/libtest/lib500.c
+++ b/tests/libtest/lib500.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib501.c b/tests/libtest/lib501.c
index 4549cb648..95ffc0ae0 100644
--- a/tests/libtest/lib501.c
+++ b/tests/libtest/lib501.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib502.c b/tests/libtest/lib502.c
index df8905c84..bfd45919b 100644
--- a/tests/libtest/lib502.c
+++ b/tests/libtest/lib502.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib503.c b/tests/libtest/lib503.c
index 00791edf5..a1c851fb3 100644
--- a/tests/libtest/lib503.c
+++ b/tests/libtest/lib503.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib504.c b/tests/libtest/lib504.c
index 8d1fe506e..9843393d9 100644
--- a/tests/libtest/lib504.c
+++ b/tests/libtest/lib504.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib505.c b/tests/libtest/lib505.c
index cc7463bde..42e0eec41 100644
--- a/tests/libtest/lib505.c
+++ b/tests/libtest/lib505.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -71,7 +71,7 @@ int test(char *URL)
return TEST_ERR_MAJOR_BAD;
}
- if(! file_info.st_size) {
+ if(!file_info.st_size) {
fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib509.c b/tests/libtest/lib509.c
index e8e803ffc..1fb2d3445 100644
--- a/tests/libtest/lib509.c
+++ b/tests/libtest/lib509.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,70 +34,35 @@
* memory callbacks which should be calling 'the real thing'.
*/
-/*
-#include "memdebug.h"
-*/
-
-static int seen_malloc = 0;
-static int seen_free = 0;
-static int seen_realloc = 0;
-static int seen_strdup = 0;
-static int seen_calloc = 0;
-
-void *custom_malloc(size_t size);
-void custom_free(void *ptr);
-void *custom_realloc(void *ptr, size_t size);
-char *custom_strdup(const char *ptr);
-void *custom_calloc(size_t nmemb, size_t size);
+static int seen;
-
-void *custom_calloc(size_t nmemb, size_t size)
+static void *custom_calloc(size_t nmemb, size_t size)
{
- if(!seen_calloc) {
- printf("seen custom_calloc()\n");
- seen_calloc = 1;
- }
+ seen++;
return (calloc)(nmemb, size);
}
-void *custom_malloc(size_t size)
+static void *custom_malloc(size_t size)
{
- if(!seen_malloc && seen_calloc) {
- printf("seen custom_malloc()\n");
- seen_malloc = 1;
- }
+ seen++;
return (malloc)(size);
}
-char *custom_strdup(const char *ptr)
+static char *custom_strdup(const char *ptr)
{
- if(!seen_strdup && seen_malloc) {
- /* currently (2013.03.13), memory tracking enabled builds do not call
- the strdup callback, in this case malloc callback and memcpy are used
- instead. If some day this is changed the following printf() should be
- uncommented, and a line added to test definition.
- printf("seen custom_strdup()\n");
- */
- seen_strdup = 1;
- }
+ seen++;
return (strdup)(ptr);
}
-void *custom_realloc(void *ptr, size_t size)
+static void *custom_realloc(void *ptr, size_t size)
{
- if(!seen_realloc && seen_malloc) {
- printf("seen custom_realloc()\n");
- seen_realloc = 1;
- }
+ seen++;
return (realloc)(ptr, size);
}
-void custom_free(void *ptr)
+static void custom_free(void *ptr)
{
- if(!seen_free && seen_realloc) {
- printf("seen custom_free()\n");
- seen_free = 1;
- }
+ seen++;
(free)(ptr);
}
@@ -110,7 +75,6 @@ int test(char *URL)
CURL *curl;
int asize;
char *str = NULL;
-
(void)URL;
res = curl_global_init_mem(CURL_GLOBAL_ALL,
@@ -136,6 +100,9 @@ int test(char *URL)
asize = (int)sizeof(a);
str = curl_easy_escape(curl, (char *)a, asize); /* uses realloc() */
+ if(seen)
+ printf("Callbacks were invoked!\n");
+
test_cleanup:
if(str)
diff --git a/tests/libtest/lib512.c b/tests/libtest/lib512.c
index 8a6f0e149..84e2a9740 100644
--- a/tests/libtest/lib512.c
+++ b/tests/libtest/lib512.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib519.c b/tests/libtest/lib519.c
index 73da7d5ca..f6b367922 100644
--- a/tests/libtest/lib519.c
+++ b/tests/libtest/lib519.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib521.c b/tests/libtest/lib521.c
index 8d9aa2e2c..32819113e 100644
--- a/tests/libtest/lib521.c
+++ b/tests/libtest/lib521.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib523.c b/tests/libtest/lib523.c
index 450438939..1708e1419 100644
--- a/tests/libtest/lib523.c
+++ b/tests/libtest/lib523.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib524.c b/tests/libtest/lib524.c
index fe0a8ed21..fe195fd5e 100644
--- a/tests/libtest/lib524.c
+++ b/tests/libtest/lib524.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib530.c b/tests/libtest/lib530.c
deleted file mode 100644
index 8581303ae..000000000
--- a/tests/libtest/lib530.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ***************************************************************************/
-#include "test.h"
-
-#include "testutil.h"
-#include "warnless.h"
-#include "memdebug.h"
-
-#define TEST_HANG_TIMEOUT 60 * 1000
-
-#define NUM_HANDLES 4
-
-int test(char *URL)
-{
- int res = 0;
- CURL *curl[NUM_HANDLES];
- int running;
- CURLM *m = NULL;
- int i;
- char target_url[256];
- int handles_added = 0;
-
- for(i = 0; i < NUM_HANDLES; i++)
- curl[i] = NULL;
-
- start_test_timing();
-
- global_init(CURL_GLOBAL_ALL);
-
- multi_init(m);
-
- /* get NUM_HANDLES easy handles */
- for(i = 0; i < NUM_HANDLES; i++) {
- /* get an easy handle */
- easy_init(curl[i]);
- /* specify target */
- msnprintf(target_url, sizeof(target_url), "%s%04i", URL, i + 1);
- target_url[sizeof(target_url) - 1] = '\0';
- easy_setopt(curl[i], CURLOPT_URL, target_url);
- /* go verbose */
- easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
- /* include headers */
- easy_setopt(curl[i], CURLOPT_HEADER, 1L);
- }
-
- /* Add the first handle to multi. We do this to let libcurl detect
- that the server can do pipelining. The rest of the handles will be
- added later. */
- multi_add_handle(m, curl[handles_added++]);
-
- multi_setopt(m, CURLMOPT_PIPELINING, 1L);
-
- fprintf(stderr, "Start at URL 0\n");
-
- for(;;) {
- struct timeval interval;
- fd_set rd, wr, exc;
- int maxfd = -99;
-
- interval.tv_sec = 1;
- interval.tv_usec = 0;
-
- multi_perform(m, &running);
-
- abort_on_test_timeout();
-
- if(!running) {
- if(handles_added >= NUM_HANDLES)
- break; /* done */
-
- /* Add the rest of the handles now that the first handle has completed
- its request. */
- while(handles_added < NUM_HANDLES)
- multi_add_handle(m, curl[handles_added++]);
- }
-
- FD_ZERO(&rd);
- FD_ZERO(&wr);
- FD_ZERO(&exc);
-
- multi_fdset(m, &rd, &wr, &exc, &maxfd);
-
- /* At this point, maxfd is guaranteed to be greater or equal than -1. */
-
- select_test(maxfd + 1, &rd, &wr, &exc, &interval);
-
- abort_on_test_timeout();
- }
-
-test_cleanup:
-
- /* proper cleanup sequence - type PB */
-
- for(i = 0; i < NUM_HANDLES; i++) {
- curl_multi_remove_handle(m, curl[i]);
- curl_easy_cleanup(curl[i]);
- }
-
- curl_multi_cleanup(m);
- curl_global_cleanup();
-
- return res;
-}
diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c
index bcbaa481c..57d720412 100644
--- a/tests/libtest/lib541.c
+++ b/tests/libtest/lib541.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -63,7 +63,7 @@ int test(char *URL)
return TEST_ERR_MAJOR_BAD;
}
- if(! file_info.st_size) {
+ if(!file_info.st_size) {
fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2);
fclose(hd_src);
return TEST_ERR_MAJOR_BAD;
diff --git a/tests/libtest/lib543.c b/tests/libtest/lib543.c
index 957839f7a..c494d3d83 100644
--- a/tests/libtest/lib543.c
+++ b/tests/libtest/lib543.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -49,11 +49,21 @@ int test(char *URL)
s = curl_easy_escape(easy, (const char *)a, asize);
- if(s)
+ if(s) {
printf("%s\n", s);
+ curl_free(s);
+ }
- if(s)
+ s = curl_easy_escape(easy, "", 0);
+ if(s) {
+ printf("IN: '' OUT: '%s'\n", s);
curl_free(s);
+ }
+ s = curl_easy_escape(easy, " 123", 3);
+ if(s) {
+ printf("IN: ' 12' OUT: '%s'\n", s);
+ curl_free(s);
+ }
curl_easy_cleanup(easy);
curl_global_cleanup();
diff --git a/tests/libtest/lib547.c b/tests/libtest/lib547.c
index 3cfc81d29..1416f895c 100644
--- a/tests/libtest/lib547.c
+++ b/tests/libtest/lib547.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -101,7 +101,7 @@ int test(char *URL)
test_setopt(curl, CURLOPT_VERBOSE, 1L);
test_setopt(curl, CURLOPT_HEADER, 1L);
#ifdef LIB548
- /* set the data to POST with a mere pointer to a zero-terminated string */
+ /* set the data to POST with a mere pointer to a null-terminated string */
test_setopt(curl, CURLOPT_POSTFIELDS, UPLOADTHIS);
#else
/* 547 style, which means reading the POST data from a callback */
diff --git a/tests/libtest/lib549.c b/tests/libtest/lib549.c
index bb41cd619..886625427 100644
--- a/tests/libtest/lib549.c
+++ b/tests/libtest/lib549.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib553.c b/tests/libtest/lib553.c
index 95b5ac393..015bf29ac 100644
--- a/tests/libtest/lib553.c
+++ b/tests/libtest/lib553.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -77,7 +77,7 @@ int test(char *URL)
for(i = 0; i < NUM_HEADERS; i++) {
int len = msnprintf(buf, sizeof(buf), "Header%d: ", i);
memset(&buf[len], 'A', SIZE_HEADERS);
- buf[len + SIZE_HEADERS] = 0; /* zero terminate */
+ buf[len + SIZE_HEADERS] = 0; /* null-terminate */
hl = curl_slist_append(headerlist, buf);
if(!hl)
goto test_cleanup;
diff --git a/tests/libtest/lib556.c b/tests/libtest/lib556.c
index 0595000ce..82e8b71dc 100644
--- a/tests/libtest/lib556.c
+++ b/tests/libtest/lib556.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -96,7 +96,7 @@ int test(char *URL)
}
if(iolen != 0)
- res = TEST_ERR_FAILURE;
+ res = (CURLcode)TEST_ERR_FAILURE;
}
test_cleanup:
diff --git a/tests/libtest/lib557.c b/tests/libtest/lib557.c
index 2e51b99c1..b34a0c2f0 100644
--- a/tests/libtest/lib557.c
+++ b/tests/libtest/lib557.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -1537,6 +1537,17 @@ static int test_weird_arguments(void)
errors += string_check(buf, "");
+ /* Do not skip sanity checks with parameters! */
+ buf[0] = 0;
+ rc = curl_msnprintf(buf, sizeof(buf), "%d, %.*1$d", 500, 1);
+
+ if(rc != 256) {
+ printf("curl_mprintf() returned %d and not 256!\n", rc);
+ errors++;
+ }
+
+ errors += strlen_check(buf, 255);
+
if(errors)
printf("Some curl_mprintf() weird arguments tests failed!\n");
diff --git a/tests/libtest/lib558.c b/tests/libtest/lib558.c
index d9969738a..52340d720 100644
--- a/tests/libtest/lib558.c
+++ b/tests/libtest/lib558.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib559.c b/tests/libtest/lib559.c
index be112b8f3..2203cff3b 100644
--- a/tests/libtest/lib559.c
+++ b/tests/libtest/lib559.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib560.c b/tests/libtest/lib560.c
index 16045e6da..56ee2001e 100644
--- a/tests/libtest/lib560.c
+++ b/tests/libtest/lib560.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2011, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib566.c b/tests/libtest/lib566.c
index 257738a4f..04e3032ed 100644
--- a/tests/libtest/lib566.c
+++ b/tests/libtest/lib566.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib567.c b/tests/libtest/lib567.c
index 7a730d26a..f6af06191 100644
--- a/tests/libtest/lib567.c
+++ b/tests/libtest/lib567.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib568.c b/tests/libtest/lib568.c
index c1388f16f..128e6d2eb 100644
--- a/tests/libtest/lib568.c
+++ b/tests/libtest/lib568.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib570.c b/tests/libtest/lib570.c
index d88f100f3..016ed1098 100644
--- a/tests/libtest/lib570.c
+++ b/tests/libtest/lib570.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib572.c b/tests/libtest/lib572.c
index 82d5049d0..0352fdb7f 100644
--- a/tests/libtest/lib572.c
+++ b/tests/libtest/lib572.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib573.c b/tests/libtest/lib573.c
index e80824d16..f512e2d3c 100644
--- a/tests/libtest/lib573.c
+++ b/tests/libtest/lib573.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib576.c b/tests/libtest/lib576.c
index 3b9a9001d..f66825895 100644
--- a/tests/libtest/lib576.c
+++ b/tests/libtest/lib576.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,10 +24,10 @@
#include "testutil.h"
#include "memdebug.h"
-typedef struct {
+struct chunk_data {
int remains;
int print_content;
-} chunk_data_t;
+};
static
long chunk_bgn(const struct curl_fileinfo *finfo, void *ptr, int remains);
@@ -37,7 +37,7 @@ long chunk_end(void *ptr);
static
long chunk_bgn(const struct curl_fileinfo *finfo, void *ptr, int remains)
{
- chunk_data_t *ch_d = ptr;
+ struct chunk_data *ch_d = ptr;
ch_d->remains = remains;
printf("=============================================================\n");
@@ -87,7 +87,7 @@ long chunk_bgn(const struct curl_fileinfo *finfo, void *ptr, int remains)
static
long chunk_end(void *ptr)
{
- chunk_data_t *ch_d = ptr;
+ struct chunk_data *ch_d = ptr;
if(ch_d->print_content) {
ch_d->print_content = 0;
printf("-------------------------------------------------------------\n");
@@ -101,7 +101,7 @@ int test(char *URL)
{
CURL *handle = NULL;
CURLcode res = CURLE_OK;
- chunk_data_t chunk_data = {0, 0};
+ struct chunk_data chunk_data = {0, 0};
curl_global_init(CURL_GLOBAL_ALL);
handle = curl_easy_init();
if(!handle) {
diff --git a/tests/libtest/lib579.c b/tests/libtest/lib579.c
index 4977a03cb..64ef16021 100644
--- a/tests/libtest/lib579.c
+++ b/tests/libtest/lib579.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib582.c b/tests/libtest/lib582.c
index 2f9242a85..96841052b 100644
--- a/tests/libtest/lib582.c
+++ b/tests/libtest/lib582.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -44,7 +44,7 @@ struct ReadWriteSockets
/**
* Remove a file descriptor from a sockets array.
*/
-static void removeFd(struct Sockets* sockets, curl_socket_t fd, int mention)
+static void removeFd(struct Sockets *sockets, curl_socket_t fd, int mention)
{
int i;
@@ -64,7 +64,7 @@ static void removeFd(struct Sockets* sockets, curl_socket_t fd, int mention)
/**
* Add a file descriptor to a sockets array.
*/
-static void addFd(struct Sockets* sockets, curl_socket_t fd, const char *what)
+static void addFd(struct Sockets *sockets, curl_socket_t fd, const char *what)
{
/**
* To ensure we only have each file descriptor once, we remove it then add
@@ -105,7 +105,7 @@ static void addFd(struct Sockets* sockets, curl_socket_t fd, const char *what)
static int curlSocketCallback(CURL *easy, curl_socket_t s, int action,
void *userp, void *socketp)
{
- struct ReadWriteSockets* sockets = userp;
+ struct ReadWriteSockets *sockets = userp;
(void)easy; /* unused */
(void)socketp; /* unused */
@@ -129,7 +129,7 @@ static int curlSocketCallback(CURL *easy, curl_socket_t s, int action,
*/
static int curlTimerCallback(CURLM *multi, long timeout_ms, void *userp)
{
- struct timeval* timeout = userp;
+ struct timeval *timeout = userp;
(void)multi; /* unused */
if(timeout_ms != -1) {
@@ -169,7 +169,7 @@ static int checkForCompletion(CURLM *curl, int *success)
return result;
}
-static int getMicroSecondTimeout(struct timeval* timeout)
+static int getMicroSecondTimeout(struct timeval *timeout)
{
struct timeval now;
ssize_t result;
@@ -185,7 +185,7 @@ static int getMicroSecondTimeout(struct timeval* timeout)
/**
* Update a fd_set with all of the sockets in use.
*/
-static void updateFdSet(struct Sockets* sockets, fd_set* fdset,
+static void updateFdSet(struct Sockets *sockets, fd_set* fdset,
curl_socket_t *maxFd)
{
int i;
diff --git a/tests/libtest/lib583.c b/tests/libtest/lib583.c
index f0a088b70..9091533e8 100644
--- a/tests/libtest/lib583.c
+++ b/tests/libtest/lib583.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,7 +35,8 @@ int test(char *URL)
int stillRunning;
CURLM *multiHandle = NULL;
CURL *curl = NULL;
- CURLMcode res = CURLM_OK;
+ CURLcode res = CURLE_OK;
+ CURLMcode mres;
global_init(CURL_GLOBAL_ALL);
@@ -65,10 +66,12 @@ int test(char *URL)
fprintf(stderr, "curl_multi_perform() succeeded\n");
fprintf(stderr, "curl_multi_remove_handle()...\n");
- res = curl_multi_remove_handle(multiHandle, curl);
- if(res)
+ mres = curl_multi_remove_handle(multiHandle, curl);
+ if(mres) {
fprintf(stderr, "curl_multi_remove_handle() failed, "
- "with code %d\n", (int)res);
+ "with code %d\n", (int)mres);
+ res = TEST_ERR_MULTI;
+ }
else
fprintf(stderr, "curl_multi_remove_handle() succeeded\n");
diff --git a/tests/libtest/lib586.c b/tests/libtest/lib586.c
index 247422483..3b77ef7eb 100644
--- a/tests/libtest/lib586.c
+++ b/tests/libtest/lib586.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib590.c b/tests/libtest/lib590.c
index db433fb9e..ca54e3070 100644
--- a/tests/libtest/lib590.c
+++ b/tests/libtest/lib590.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib591.c b/tests/libtest/lib591.c
index 0a406cee0..9c5edd89c 100644
--- a/tests/libtest/lib591.c
+++ b/tests/libtest/lib591.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib598.c b/tests/libtest/lib598.c
index bd544701e..002f041ec 100644
--- a/tests/libtest/lib598.c
+++ b/tests/libtest/lib598.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib643.c b/tests/libtest/lib643.c
index 7432dfce8..5af0f4a14 100644
--- a/tests/libtest/lib643.c
+++ b/tests/libtest/lib643.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,11 +26,9 @@
static char data[]=
#ifdef CURL_DOES_CONVERSIONS
/* ASCII representation with escape sequences for non-ASCII platforms */
- "\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
- "\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
- "\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72\x0a";
+ "\x64\x75\x6d\x6d\x79\x0a";
#else
- "this is what we post to the silly web server\n";
+ "dummy\n";
#endif
struct WriteThis {
@@ -41,11 +39,20 @@ struct WriteThis {
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
{
#ifdef LIB644
+ static int count = 0;
(void)ptr;
(void)size;
(void)nmemb;
(void)userp;
- return CURL_READFUNC_ABORT;
+ switch(count++) {
+ case 0: /* Return a single byte. */
+ *ptr = '\n';
+ return 1;
+ case 1: /* Request abort. */
+ return CURL_READFUNC_ABORT;
+ }
+ printf("Wrongly called >2 times\n");
+ exit(1); /* trigger major failure */
#else
struct WriteThis *pooh = (struct WriteThis *)userp;
diff --git a/tests/libtest/lib651.c b/tests/libtest/lib651.c
index 18bcaae83..777f6f59b 100644
--- a/tests/libtest/lib651.c
+++ b/tests/libtest/lib651.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,7 +40,7 @@ int test(char *URL)
for(i = 0; i < size ; i++)
memset(&buffer[i * 1000], 65 + i, 1000);
- buffer[ sizeof(buffer)-1] = 0; /* zero terminate */
+ buffer[ sizeof(buffer)-1] = 0; /* null-terminate */
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
diff --git a/tests/libtest/lib652.c b/tests/libtest/lib652.c
index 5c9cba5fb..3d247d27b 100644
--- a/tests/libtest/lib652.c
+++ b/tests/libtest/lib652.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -105,6 +105,9 @@ int test(char *URL)
/* send a multi-part mail */
test_setopt(curl, CURLOPT_MIMEPOST, mime);
+ /* Shorten upload buffer. */
+ test_setopt(curl, CURLOPT_UPLOAD_BUFFERSIZE, 16411L);
+
/* get verbose debug output please */
test_setopt(curl, CURLOPT_VERBOSE, 1L);
diff --git a/tests/libtest/lib654.c b/tests/libtest/lib654.c
index 45051a9c7..f9c8b9118 100644
--- a/tests/libtest/lib654.c
+++ b/tests/libtest/lib654.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,11 +26,9 @@
static char data[]=
#ifdef CURL_DOES_CONVERSIONS
/* ASCII representation with escape sequences for non-ASCII platforms */
- "\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
- "\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
- "\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72\x0a";
+ "\x64\x75\x6d\x6d\x79\x0a";
#else
- "this is what we post to the silly web server\n";
+ "dummy\n";
#endif
struct WriteThis {
diff --git a/tests/libtest/lib661.c b/tests/libtest/lib661.c
index a4f2c8e5c..454d8f337 100644
--- a/tests/libtest/lib661.c
+++ b/tests/libtest/lib661.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/lib666.c b/tests/libtest/lib666.c
new file mode 100644
index 000000000..c75936eeb
--- /dev/null
+++ b/tests/libtest/lib666.c
@@ -0,0 +1,120 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char buffer[17000]; /* more than 16K */
+
+int test(char *URL)
+{
+ CURL *curl = NULL;
+ CURLcode res = CURLE_OK;
+ curl_mime *mime = NULL;
+ curl_mimepart *part;
+ size_t i;
+
+ /* Checks huge binary-encoded mime post. */
+
+ /* Create a buffer with pseudo-binary data. */
+ for(i = 0; i < sizeof(buffer); i++)
+ if(i % 77 == 76)
+ buffer[i] = '\n';
+ else
+ buffer[i] = (char) (0x41 + i % 26); /* A...Z */
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ res = (CURLcode) TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+
+ /* Build mime structure. */
+ mime = curl_mime_init(curl);
+ if(!mime) {
+ fprintf(stderr, "curl_mime_init() failed\n");
+ res = (CURLcode) TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+ part = curl_mime_addpart(mime);
+ if(!part) {
+ fprintf(stderr, "curl_mime_addpart() failed\n");
+ res = (CURLcode) TEST_ERR_MAJOR_BAD;
+ goto test_cleanup;
+ }
+ res = curl_mime_name(part, "upfile");
+ if(res) {
+ fprintf(stderr, "curl_mime_name() failed\n");
+ goto test_cleanup;
+ }
+ res = curl_mime_filename(part, "myfile.txt");
+ if(res) {
+ fprintf(stderr, "curl_mime_filename() failed\n");
+ goto test_cleanup;
+ }
+ res = curl_mime_data(part, buffer, sizeof(buffer));
+ if(res) {
+ fprintf(stderr, "curl_mime_data() failed\n");
+ goto test_cleanup;
+ }
+ res = curl_mime_encoder(part, "binary");
+ if(res) {
+ fprintf(stderr, "curl_mime_encoder() failed\n");
+ goto test_cleanup;
+ }
+
+ /* First set the URL that is about to receive our mime mail. */
+ test_setopt(curl, CURLOPT_URL, URL);
+
+ /* Post form */
+ test_setopt(curl, CURLOPT_MIMEPOST, mime);
+
+ /* Shorten upload buffer. */
+ test_setopt(curl, CURLOPT_UPLOAD_BUFFERSIZE, 16411L);
+
+ /* get verbose debug output please */
+ test_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(curl, CURLOPT_HEADER, 1L);
+
+ /* Perform the request, res will get the return code */
+ res = curl_easy_perform(curl);
+
+test_cleanup:
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ /* now cleanup the mime structure */
+ curl_mime_free(mime);
+
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/lib667.c b/tests/libtest/lib667.c
new file mode 100644
index 000000000..8bf7be43f
--- /dev/null
+++ b/tests/libtest/lib667.c
@@ -0,0 +1,117 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char data[]=
+#ifdef CURL_DOES_CONVERSIONS
+ /* ASCII representation with escape sequences for non-ASCII platforms */
+ "\x64\x75\x6d\x6d\x79";
+#else
+ "dummy";
+#endif
+
+struct WriteThis {
+ char *readptr;
+ curl_off_t sizeleft;
+};
+
+static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
+{
+ struct WriteThis *pooh = (struct WriteThis *)userp;
+ int eof = !*pooh->readptr;
+
+ if(size*nmemb < 1)
+ return 0;
+
+ eof = pooh->sizeleft <= 0;
+ if(!eof)
+ pooh->sizeleft--;
+
+ if(!eof) {
+ *ptr = *pooh->readptr; /* copy one single byte */
+ pooh->readptr++; /* advance pointer */
+ return 1; /* we return 1 byte at a time! */
+ }
+
+ return 0; /* no more data left to deliver */
+}
+
+int test(char *URL)
+{
+ CURL *easy = NULL;
+ curl_mime *mime = NULL;
+ curl_mimepart *part;
+ CURLcode result;
+ int res = TEST_ERR_FAILURE;
+ struct WriteThis pooh;
+
+ /*
+ * Check proper handling of mime encoder feature when the part read callback
+ * delivers data bytes one at a time. Use chunked encoding for accurate test.
+ */
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ easy = curl_easy_init();
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(easy, CURLOPT_URL, URL);
+
+ /* get verbose debug output please */
+ test_setopt(easy, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(easy, CURLOPT_HEADER, 1L);
+
+ /* Prepare the callback structure. */
+ pooh.readptr = data;
+ pooh.sizeleft = (curl_off_t) strlen(data);
+
+ /* Build the mime tree. */
+ mime = curl_mime_init(easy);
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "field");
+ curl_mime_encoder(part, "base64");
+ /* Using an undefined length forces chunked transfer. */
+ curl_mime_data_cb(part, (curl_off_t) -1, read_callback, NULL, NULL, &pooh);
+
+ /* Bind mime data to its easy handle. */
+ test_setopt(easy, CURLOPT_MIMEPOST, mime);
+
+ /* Send data. */
+ result = curl_easy_perform(easy);
+ if(result) {
+ fprintf(stderr, "curl_easy_perform() failed\n");
+ res = (int) result;
+ }
+
+test_cleanup:
+ curl_easy_cleanup(easy);
+ curl_mime_free(mime);
+ curl_global_cleanup();
+ return res;
+}
diff --git a/tests/libtest/lib668.c b/tests/libtest/lib668.c
new file mode 100644
index 000000000..c0b608a0a
--- /dev/null
+++ b/tests/libtest/lib668.c
@@ -0,0 +1,122 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+static char data[]=
+#ifdef CURL_DOES_CONVERSIONS
+ /* ASCII representation with escape sequences for non-ASCII platforms */
+ "\x64\x75\x6d\x6d\x79";
+#else
+ "dummy";
+#endif
+
+struct WriteThis {
+ char *readptr;
+ curl_off_t sizeleft;
+};
+
+static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
+{
+ struct WriteThis *pooh = (struct WriteThis *)userp;
+ size_t len = strlen(pooh->readptr);
+
+ (void) size; /* Always 1.*/
+
+ if(len > nmemb)
+ len = nmemb;
+ if(len) {
+ memcpy(ptr, pooh->readptr, len);
+ pooh->readptr += len;
+ }
+ return len;
+}
+
+int test(char *URL)
+{
+ CURL *easy = NULL;
+ curl_mime *mime = NULL;
+ curl_mimepart *part;
+ CURLcode result;
+ int res = TEST_ERR_FAILURE;
+ struct WriteThis pooh1, pooh2;
+
+ /*
+ * Check early end of part data detection.
+ */
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ easy = curl_easy_init();
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(easy, CURLOPT_URL, URL);
+
+ /* get verbose debug output please */
+ test_setopt(easy, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(easy, CURLOPT_HEADER, 1L);
+
+ /* Prepare the callback structures. */
+ pooh1.readptr = data;
+ pooh1.sizeleft = (curl_off_t) strlen(data);
+ pooh2 = pooh1;
+
+ /* Build the mime tree. */
+ mime = curl_mime_init(easy);
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "field1");
+ /* Early end of data detection can be done because the data size is known. */
+ curl_mime_data_cb(part, (curl_off_t) strlen(data),
+ read_callback, NULL, NULL, &pooh1);
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "field2");
+ /* Using an undefined length forces chunked transfer and disables early
+ end of data detection for this part. */
+ curl_mime_data_cb(part, (curl_off_t) -1, read_callback, NULL, NULL, &pooh2);
+ part = curl_mime_addpart(mime);
+ curl_mime_name(part, "field3");
+ /* Regular file part sources early end of data can be detected because
+ the file size is known. In addition, and EOF test is performed. */
+ curl_mime_filedata(part, "log/file668.txt");
+
+ /* Bind mime data to its easy handle. */
+ test_setopt(easy, CURLOPT_MIMEPOST, mime);
+
+ /* Send data. */
+ result = curl_easy_perform(easy);
+ if(result) {
+ fprintf(stderr, "curl_easy_perform() failed\n");
+ res = (int) result;
+ }
+
+test_cleanup:
+ curl_easy_cleanup(easy);
+ curl_mime_free(mime);
+ curl_global_cleanup();
+ return res;
+}
diff --git a/tests/libtest/lib670.c b/tests/libtest/lib670.c
new file mode 100644
index 000000000..aecb1c01f
--- /dev/null
+++ b/tests/libtest/lib670.c
@@ -0,0 +1,259 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include <time.h>
+
+#include "test.h"
+
+#include "memdebug.h"
+
+#define PAUSE_TIME 2
+
+
+static const char name[] = "field";
+
+struct ReadThis {
+ CURL *easy;
+ time_t origin;
+ int count;
+};
+
+
+static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
+{
+ struct ReadThis *pooh = (struct ReadThis *) userp;
+ time_t delta;
+
+ if(size * nmemb < 1)
+ return 0;
+
+ switch(pooh->count++) {
+ case 0:
+ *ptr = '\x41'; /* ASCII A. */
+ return 1;
+ case 1:
+ pooh->origin = time(NULL);
+ return CURL_READFUNC_PAUSE;
+ case 2:
+ delta = time(NULL) - pooh->origin;
+ *ptr = delta >= PAUSE_TIME? '\x42': '\x41'; /* ASCII A or B. */
+ return 1;
+ case 3:
+ return 0;
+ }
+ fprintf(stderr, "Read callback called after EOF\n");
+ exit(1);
+}
+
+#if !defined(LIB670) && !defined(LIB672)
+static int xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow)
+{
+ struct ReadThis *pooh = (struct ReadThis *) clientp;
+
+ (void) dltotal;
+ (void) dlnow;
+ (void) ultotal;
+ (void) ulnow;
+
+ if(pooh->origin) {
+ time_t delta = time(NULL) - pooh->origin;
+
+ if(delta >= 4 * PAUSE_TIME) {
+ fprintf(stderr, "unpausing failed: drain problem?\n");
+ return CURLE_ABORTED_BY_CALLBACK;
+ }
+
+ if(delta >= PAUSE_TIME)
+ curl_easy_pause(pooh->easy, CURLPAUSE_CONT);
+ }
+
+ return 0;
+}
+#endif
+
+int test(char *URL)
+{
+#if defined(LIB670) || defined(LIB671)
+ curl_mime *mime = NULL;
+ curl_mimepart *part;
+#else
+ CURLFORMcode formrc;
+ struct curl_httppost *formpost = NULL;
+ struct curl_httppost *lastptr = NULL;
+#endif
+#if defined(LIB670) || defined(LIB672)
+ CURLM *multi = NULL;
+ CURLMcode mres;
+ CURLMsg *msg;
+ int msgs_left;
+ int still_running = 0;
+#endif
+
+ struct ReadThis pooh;
+ CURLcode result;
+ int res = TEST_ERR_FAILURE;
+
+ /*
+ * Check proper pausing/unpausing from a mime or form read callback.
+ */
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ pooh.origin = (time_t) 0;
+ pooh.count = 0;
+ pooh.easy = curl_easy_init();
+
+ /* First set the URL that is about to receive our POST. */
+ test_setopt(pooh.easy, CURLOPT_URL, URL);
+
+ /* get verbose debug output please */
+ test_setopt(pooh.easy, CURLOPT_VERBOSE, 1L);
+
+ /* include headers in the output */
+ test_setopt(pooh.easy, CURLOPT_HEADER, 1L);
+
+#if defined(LIB670) || defined(LIB671)
+ /* Build the mime tree. */
+ mime = curl_mime_init(pooh.easy);
+ part = curl_mime_addpart(mime);
+ result = curl_mime_name(part, name);
+ if(!result)
+ res = curl_mime_data_cb(part, (curl_off_t) 2, read_callback,
+ NULL, NULL, &pooh);
+
+ if(result) {
+ fprintf(stderr,
+ "Something went wrong when building the mime structure: %d\n",
+ (int) result);
+ goto test_cleanup;
+ }
+
+ /* Bind mime data to its easy handle. */
+ if(!res)
+ test_setopt(pooh.easy, CURLOPT_MIMEPOST, mime);
+#else
+ /* Build the form. */
+ formrc = curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, name,
+ CURLFORM_STREAM, &pooh,
+ CURLFORM_CONTENTLEN, (curl_off_t) 2,
+ CURLFORM_END);
+ if(formrc) {
+ fprintf(stderr, "curl_formadd() = %d\n", (int) formrc);
+ goto test_cleanup;
+ }
+
+ /* We want to use our own read function. */
+ test_setopt(pooh.easy, CURLOPT_READFUNCTION, read_callback);
+
+ /* Send a multi-part formpost. */
+ test_setopt(pooh.easy, CURLOPT_HTTPPOST, formpost);
+#endif
+
+#if defined(LIB670) || defined(LIB672)
+ /* Use the multi interface. */
+ multi = curl_multi_init();
+ mres = curl_multi_add_handle(multi, pooh.easy);
+ while(!mres) {
+ struct timeval timeout;
+ int rc = 0;
+ fd_set fdread;
+ fd_set fdwrite;
+ fd_set fdexcept;
+ int maxfd = -1;
+
+ mres = curl_multi_perform(multi, &still_running);
+ if(!still_running || mres != CURLM_OK)
+ break;
+
+ if(pooh.origin) {
+ time_t delta = time(NULL) - pooh.origin;
+
+ if(delta >= 4 * PAUSE_TIME) {
+ fprintf(stderr, "unpausing failed: drain problem?\n");
+ res = CURLE_OPERATION_TIMEDOUT;
+ break;
+ }
+
+ if(delta >= PAUSE_TIME)
+ curl_easy_pause(pooh.easy, CURLPAUSE_CONT);
+ }
+
+ FD_ZERO(&fdread);
+ FD_ZERO(&fdwrite);
+ FD_ZERO(&fdexcept);
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 1000000 * PAUSE_TIME / 10;
+ mres = curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcept, &maxfd);
+ if(mres)
+ break;
+#if defined(WIN32) || defined(_WIN32)
+ if(maxfd == -1)
+ Sleep(100);
+ else
+#endif
+ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcept, &timeout);
+ if(rc == -1) {
+ fprintf(stderr, "Select error\n");
+ break;
+ }
+ }
+
+ if(mres != CURLM_OK)
+ for(;;) {
+ msg = curl_multi_info_read(multi, &msgs_left);
+ if(!msg)
+ break;
+ if(msg->msg == CURLMSG_DONE) {
+ result = msg->data.result;
+ res = (int) result;
+ }
+ }
+
+ curl_multi_remove_handle(multi, pooh.easy);
+ curl_multi_cleanup(multi);
+
+#else
+ /* Use the easy interface. */
+ test_setopt(pooh.easy, CURLOPT_XFERINFODATA, &pooh);
+ test_setopt(pooh.easy, CURLOPT_XFERINFOFUNCTION, xferinfo);
+ test_setopt(pooh.easy, CURLOPT_NOPROGRESS, 0L);
+ result = curl_easy_perform(pooh.easy);
+ res = (int) result;
+#endif
+
+
+test_cleanup:
+ curl_easy_cleanup(pooh.easy);
+#if defined(LIB670) || defined(LIB671)
+ curl_mime_free(mime);
+#else
+ curl_formfree(formpost);
+#endif
+
+ curl_global_cleanup();
+ return res;
+}
diff --git a/tests/libtest/lib674.c b/tests/libtest/lib674.c
new file mode 100644
index 000000000..828e52cd5
--- /dev/null
+++ b/tests/libtest/lib674.c
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
+
+/*
+ * Get a single URL without select().
+ */
+
+int test(char *URL)
+{
+ CURL *handle = NULL;
+ CURL *handle2;
+ CURLcode res = 0;
+ CURLU *urlp = NULL;
+ CURLUcode uc = 0;
+
+ global_init(CURL_GLOBAL_ALL);
+ easy_init(handle);
+
+ urlp = curl_url();
+
+ if(!urlp) {
+ fprintf(stderr, "problem init URL api.");
+ goto test_cleanup;
+ }
+
+ uc = curl_url_set(urlp, CURLUPART_URL, URL, 0);
+ if(uc) {
+ fprintf(stderr, "problem setting CURLUPART_URL.");
+ goto test_cleanup;
+ }
+
+ /* demonstrate override behavior */
+
+
+ easy_setopt(handle, CURLOPT_CURLU, urlp);
+ easy_setopt(handle, CURLOPT_VERBOSE, 1L);
+
+ res = curl_easy_perform(handle);
+
+ if(res) {
+ fprintf(stderr, "%s:%d curl_easy_perform() failed with code %d (%s)\n",
+ __FILE__, __LINE__, res, curl_easy_strerror(res));
+ goto test_cleanup;
+ }
+
+ handle2 = curl_easy_duphandle(handle);
+ res = curl_easy_perform(handle2);
+ curl_easy_cleanup(handle2);
+
+test_cleanup:
+
+ curl_url_cleanup(urlp);
+ curl_easy_cleanup(handle);
+ curl_global_cleanup();
+
+ return res;
+}
diff --git a/tests/libtest/mk-lib1521.pl b/tests/libtest/mk-lib1521.pl
index f4add1a02..9b57b64ee 100755
--- a/tests/libtest/mk-lib1521.pl
+++ b/tests/libtest/mk-lib1521.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2017 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -158,6 +158,7 @@ int test(char *URL)
curl_socket_t sockfd;
struct curl_certinfo *certinfo;
struct curl_tlssessioninfo *tlssession;
+ struct curl_blob blob = { (void *)"silly", 5, 0};
CURLcode res = CURLE_OK;
(void)URL; /* not used */
global_init(CURL_GLOBAL_ALL);
@@ -173,45 +174,47 @@ HEADER
;
while(<STDIN>) {
- if($_ =~ /^ CINIT\(([^ ]*), ([^ ]*), (\d*)\)/) {
+ if($_ =~ /^ CURLOPT\(([^ ]*), ([^ ]*), (\d*)\)/) {
my ($name, $type, $val)=($1, $2, $3);
my $w=" ";
- my $pref = "${w}res = curl_easy_setopt(curl, CURLOPT_$name,";
+ my $pref = "${w}res = curl_easy_setopt(curl, $name,";
my $i = ' ' x (length($w) + 23);
- my $check = " if(UNEX(res)) {\n err(\"$name\", res, __LINE__); goto test_cleanup; }\n";
- if($type eq "STRINGPOINT") {
+ my $check = " if(UNEX(res)) {\n err(\"$name\", res, __LINE__);\n goto test_cleanup;\n }\n";
+ if($type eq "CURLOPTTYPE_STRINGPOINT") {
print "${pref} \"string\");\n$check";
print "${pref} NULL);\n$check";
}
- elsif($type eq "LONG") {
+ elsif(($type eq "CURLOPTTYPE_LONG") ||
+ ($type eq "CURLOPTTYPE_VALUES")) {
print "${pref} 0L);\n$check";
print "${pref} 22L);\n$check";
print "${pref} LO);\n$check";
print "${pref} HI);\n$check";
}
- elsif($type eq "OBJECTPOINT") {
+ elsif(($type eq "CURLOPTTYPE_OBJECTPOINT") ||
+ ($type eq "CURLOPTTYPE_CBPOINT")) {
if($name =~ /DEPENDS/) {
print "${pref} dep);\n$check";
}
elsif($name =~ "SHARE") {
print "${pref} share);\n$check";
}
- elsif($name eq "ERRORBUFFER") {
+ elsif($name eq "CURLOPT_ERRORBUFFER") {
print "${pref} errorbuffer);\n$check";
}
- elsif(($name eq "POSTFIELDS") ||
- ($name eq "COPYPOSTFIELDS")) {
- # set size to zero to avoid it being "illegal"
- print " (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n";
- print "${pref} stringpointerextra);\n$check";
+ elsif(($name eq "CURLOPT_POSTFIELDS") ||
+ ($name eq "CURLOPT_COPYPOSTFIELDS")) {
+ # set size to zero to avoid it being "illegal"
+ print " (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n";
+ print "${pref} stringpointerextra);\n$check";
}
- elsif($name eq "HTTPPOST") {
+ elsif($name eq "CURLOPT_HTTPPOST") {
print "${pref} httppost);\n$check";
}
- elsif($name eq "MIMEPOST") {
+ elsif($name eq "CURLOPT_MIMEPOST") {
print "${pref} mimepost);\n$check";
}
- elsif($name eq "STDERR") {
+ elsif($name eq "CURLOPT_STDERR") {
print "${pref} stream);\n$check";
}
else {
@@ -219,27 +222,32 @@ while(<STDIN>) {
}
print "${pref} NULL);\n$check";
}
- elsif($type eq "SLISTPOINT") {
+ elsif($type eq "CURLOPTTYPE_SLISTPOINT") {
print "${pref} slist);\n$check";
}
- elsif($type eq "FUNCTIONPOINT") {
+ elsif($type eq "CURLOPTTYPE_FUNCTIONPOINT") {
if($name =~ /([^ ]*)FUNCTION/) {
- my $l=lc($1);
- print "${pref}\n$i${l}cb);\n$check";
+ my $l=lc($1);
+ $l =~ s/^curlopt_//;
+ print "${pref}\n$i${l}cb);\n$check";
}
else {
- print "${pref} &func);\n$check";
+ print "${pref} &func);\n$check";
}
print "${pref} NULL);\n$check";
}
- elsif($type eq "OFF_T") {
+ elsif($type eq "CURLOPTTYPE_OFF_T") {
# play conservative to work with 32bit curl_off_t
print "${pref} OFF_NO);\n$check";
print "${pref} OFF_HI);\n$check";
print "${pref} OFF_LO);\n$check";
}
+ elsif($type eq "CURLOPTTYPE_BLOB") {
+ print "${pref} &blob);\n$check";
+ }
else {
- print STDERR "\n---- $type\n";
+ print STDERR "\nUnknown type: $type\n";
+ exit 22; # exit to make this noticed!
}
}
elsif($_ =~ /^ CURLINFO_NONE/) {
@@ -249,7 +257,7 @@ while(<STDIN>) {
($_ =~ /^ CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) {
my ($info, $type)=($1, $2);
my $c = " res = curl_easy_getinfo(curl, CURLINFO_$info,";
- my $check = " if(UNEX(res)) {\n geterr(\"$info\", res, __LINE__); goto test_cleanup; }\n";
+ my $check = " if(UNEX(res)) {\n geterr(\"$info\", res, __LINE__);\n goto test_cleanup;\n }\n";
if($type eq "STRING") {
print "$c &charp);\n$check";
}
@@ -289,7 +297,7 @@ while(<STDIN>) {
print <<FOOTER
- curl_easy_setopt(curl, 1, 0);
+ curl_easy_setopt(curl, (CURLoption)1, 0);
res = CURLE_OK;
test_cleanup:
curl_easy_cleanup(curl);
diff --git a/tests/libtest/notexists.pl b/tests/libtest/notexists.pl
index 31b9851ec..ed081414c 100755
--- a/tests/libtest/notexists.pl
+++ b/tests/libtest/notexists.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Check that given arguments do not exist on filesystem.
my $code = 0;
if ($#ARGV < 0) {
diff --git a/tests/libtest/sethostname.c b/tests/libtest/sethostname.c
index 210a60018..6929793dc 100644
--- a/tests/libtest/sethostname.c
+++ b/tests/libtest/sethostname.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/sethostname.h b/tests/libtest/sethostname.h
index 7a590428b..c61e4100e 100644
--- a/tests/libtest/sethostname.h
+++ b/tests/libtest/sethostname.h
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,7 +22,7 @@
#ifdef CURL_STATICLIB
# define LIBHOSTNAME_EXTERN
-#elif defined(WIN32) || defined(__SYMBIAN32__)
+#elif defined(WIN32)
# define LIBHOSTNAME_EXTERN __declspec(dllexport)
#elif defined(CURL_HIDDEN_SYMBOLS)
# define LIBHOSTNAME_EXTERN CURL_EXTERN_SYMBOL
diff --git a/tests/libtest/stub_gssapi.h b/tests/libtest/stub_gssapi.h
index 95726d794..aab3449b1 100644
--- a/tests/libtest/stub_gssapi.h
+++ b/tests/libtest/stub_gssapi.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/test.h b/tests/libtest/test.h
index bb1acca0e..3e92598bc 100644
--- a/tests/libtest/test.h
+++ b/tests/libtest/test.h
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
*
***************************************************************************/
-/* !checksrc! disable ASSIGNWITHINCONDITION all */
+/* !checksrc! disable ASSIGNWITHINCONDITION 14 */
/* Now include the curl_setup.h file from libcurl's private libdir (the source
version, but that might include "curl_config.h" from the build dir so we
@@ -36,6 +36,8 @@
#ifdef HAVE_SYS_SELECT_H
/* since so many tests use select(), we can just as well include it here */
#include <sys/select.h>
+#elif defined(HAVE_UNISTD_H)
+#include <unistd.h>
#endif
#ifdef TPF
@@ -44,11 +46,13 @@
#include "curl_printf.h"
-#define test_setopt(A,B,C) \
- if((res = curl_easy_setopt((A), (B), (C))) != CURLE_OK) goto test_cleanup
+#define test_setopt(A,B,C) \
+ if((res = curl_easy_setopt((A), (B), (C))) != CURLE_OK) \
+ goto test_cleanup
-#define test_multi_setopt(A,B,C) \
- if((res = curl_multi_setopt((A), (B), (C))) != CURLE_OK) goto test_cleanup
+#define test_multi_setopt(A,B,C) \
+ if((res = curl_multi_setopt((A), (B), (C))) != CURLE_OK) \
+ goto test_cleanup
extern char *libtest_arg2; /* set by first.c to the argv[2] or NULL */
extern char *libtest_arg3; /* set by first.c to the argv[3] or NULL */
@@ -82,18 +86,18 @@ extern int unitfail;
** For portability reasons TEST_ERR_* values should be less than 127.
*/
-#define TEST_ERR_MAJOR_BAD 126
-#define TEST_ERR_RUNS_FOREVER 125
-#define TEST_ERR_EASY_INIT 124
-#define TEST_ERR_MULTI_INIT 123
-#define TEST_ERR_NUM_HANDLES 122
-#define TEST_ERR_SELECT 121
-#define TEST_ERR_SUCCESS 120
-#define TEST_ERR_FAILURE 119
-#define TEST_ERR_USAGE 118
-#define TEST_ERR_FOPEN 117
-#define TEST_ERR_FSTAT 116
-#define TEST_ERR_BAD_TIMEOUT 115
+#define TEST_ERR_MAJOR_BAD (CURLcode) 126
+#define TEST_ERR_RUNS_FOREVER (CURLcode) 125
+#define TEST_ERR_EASY_INIT (CURLcode) 124
+#define TEST_ERR_MULTI (CURLcode) 123
+#define TEST_ERR_NUM_HANDLES (CURLcode) 122
+#define TEST_ERR_SELECT (CURLcode) 121
+#define TEST_ERR_SUCCESS (CURLcode) 120
+#define TEST_ERR_FAILURE (CURLcode) 119
+#define TEST_ERR_USAGE (CURLcode) 118
+#define TEST_ERR_FOPEN (CURLcode) 117
+#define TEST_ERR_FSTAT (CURLcode) 116
+#define TEST_ERR_BAD_TIMEOUT (CURLcode) 115
/*
** Macros for test source code readability/maintainability.
@@ -131,7 +135,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_easy_init() failed\n", (Y), (Z)); \
res = TEST_ERR_EASY_INIT; \
} \
-} WHILE_FALSE
+} while(0)
#define res_easy_init(A) \
exe_easy_init((A), (__FILE__), (__LINE__))
@@ -140,7 +144,7 @@ extern int unitfail;
exe_easy_init((A), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define easy_init(A) \
chk_easy_init((A), (__FILE__), (__LINE__))
@@ -150,9 +154,9 @@ extern int unitfail;
#define exe_multi_init(A,Y,Z) do { \
if(((A) = curl_multi_init()) == NULL) { \
fprintf(stderr, "%s:%d curl_multi_init() failed\n", (Y), (Z)); \
- res = TEST_ERR_MULTI_INIT; \
+ res = TEST_ERR_MULTI; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_init(A) \
exe_multi_init((A), (__FILE__), (__LINE__))
@@ -161,7 +165,7 @@ extern int unitfail;
exe_multi_init((A), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define multi_init(A) \
chk_multi_init((A), (__FILE__), (__LINE__))
@@ -174,9 +178,9 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_easy_setopt() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_easy_strerror(ec)); \
- res = (int)ec; \
+ res = ec; \
} \
-} WHILE_FALSE
+} while(0)
#define res_easy_setopt(A, B, C) \
exe_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -185,7 +189,7 @@ extern int unitfail;
exe_easy_setopt((A), (B), (C), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define easy_setopt(A, B, C) \
chk_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -198,9 +202,9 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_setopt() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_setopt(A,B,C) \
exe_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -209,7 +213,7 @@ extern int unitfail;
exe_multi_setopt((A), (B), (C), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define multi_setopt(A,B,C) \
chk_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -222,9 +226,9 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_add_handle() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_add_handle(A, B) \
exe_multi_add_handle((A), (B), (__FILE__), (__LINE__))
@@ -233,7 +237,7 @@ extern int unitfail;
exe_multi_add_handle((A), (B), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define multi_add_handle(A, B) \
chk_multi_add_handle((A), (B), (__FILE__), (__LINE__))
@@ -246,9 +250,9 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_remove_handle() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_remove_handle(A, B) \
exe_multi_remove_handle((A), (B), (__FILE__), (__LINE__))
@@ -257,7 +261,7 @@ extern int unitfail;
exe_multi_remove_handle((A), (B), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define multi_remove_handle(A, B) \
@@ -271,7 +275,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_perform() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
else if(*((B)) < 0) { \
fprintf(stderr, "%s:%d curl_multi_perform() succeeded, " \
@@ -279,7 +283,7 @@ extern int unitfail;
(Y), (Z), (int)*((B))); \
res = TEST_ERR_NUM_HANDLES; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_perform(A, B) \
exe_multi_perform((A), (B), (__FILE__), (__LINE__))
@@ -288,7 +292,7 @@ extern int unitfail;
exe_multi_perform((A), (B), (Y), (Z)); \
if(res) \
goto test_cleanup; \
-} WHILE_FALSE
+} while(0)
#define multi_perform(A,B) \
chk_multi_perform((A), (B), (__FILE__), (__LINE__))
@@ -301,7 +305,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_fdset() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_MULTI; \
} \
else if(*((E)) < -1) { \
fprintf(stderr, "%s:%d curl_multi_fdset() succeeded, " \
@@ -309,7 +313,7 @@ extern int unitfail;
(Y), (Z), (int)*((E))); \
res = TEST_ERR_NUM_HANDLES; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_fdset(A, B, C, D, E) \
exe_multi_fdset((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -318,7 +322,7 @@ extern int unitfail;
exe_multi_fdset((A), (B), (C), (D), (E), (Y), (Z)); \
if(res) \
goto test_cleanup; \
- } WHILE_FALSE
+ } while(0)
#define multi_fdset(A, B, C, D, E) \
chk_multi_fdset((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -331,7 +335,7 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_multi_timeout() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_multi_strerror(ec)); \
- res = (int)ec; \
+ res = TEST_ERR_BAD_TIMEOUT; \
} \
else if(*((B)) < -1L) { \
fprintf(stderr, "%s:%d curl_multi_timeout() succeeded, " \
@@ -339,7 +343,7 @@ extern int unitfail;
(Y), (Z), (long)*((B))); \
res = TEST_ERR_BAD_TIMEOUT; \
} \
-} WHILE_FALSE
+} while(0)
#define res_multi_timeout(A, B) \
exe_multi_timeout((A), (B), (__FILE__), (__LINE__))
@@ -348,13 +352,67 @@ extern int unitfail;
exe_multi_timeout((A), (B), (Y), (Z)); \
if(res) \
goto test_cleanup; \
- } WHILE_FALSE
+ } while(0)
#define multi_timeout(A, B) \
chk_multi_timeout((A), (B), (__FILE__), (__LINE__))
/* ---------------------------------------------------------------- */
+#define exe_multi_poll(A,B,C,D,E,Y,Z) do { \
+ CURLMcode ec; \
+ if((ec = curl_multi_poll((A), (B), (C), (D), (E))) != CURLM_OK) { \
+ fprintf(stderr, "%s:%d curl_multi_poll() failed, " \
+ "with code %d (%s)\n", \
+ (Y), (Z), (int)ec, curl_multi_strerror(ec)); \
+ res = TEST_ERR_MULTI; \
+ } \
+ else if(*((E)) < 0) { \
+ fprintf(stderr, "%s:%d curl_multi_poll() succeeded, " \
+ "but returned invalid numfds value (%d)\n", \
+ (Y), (Z), (int)*((E))); \
+ res = TEST_ERR_NUM_HANDLES; \
+ } \
+} while(0)
+
+#define res_multi_poll(A, B, C, D, E) \
+ exe_multi_poll((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
+
+#define chk_multi_poll(A, B, C, D, E, Y, Z) do { \
+ exe_multi_poll((A), (B), (C), (D), (E), (Y), (Z)); \
+ if(res) \
+ goto test_cleanup; \
+} while(0)
+
+#define multi_poll(A, B, C, D, E) \
+ chk_multi_poll((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
+
+/* ---------------------------------------------------------------- */
+
+#define exe_multi_wakeup(A,Y,Z) do { \
+ CURLMcode ec; \
+ if((ec = curl_multi_wakeup((A))) != CURLM_OK) { \
+ fprintf(stderr, "%s:%d curl_multi_wakeup() failed, " \
+ "with code %d (%s)\n", \
+ (Y), (Z), (int)ec, curl_multi_strerror(ec)); \
+ res = TEST_ERR_MULTI; \
+ } \
+} while(0)
+
+#define res_multi_wakeup(A) \
+ exe_multi_wakeup((A), (__FILE__), (__LINE__))
+
+#define chk_multi_wakeup(A, Y, Z) do { \
+ exe_multi_wakeup((A), (Y), (Z)); \
+ if(res) \
+ goto test_cleanup; \
+} while(0)
+
+#define multi_wakeup(A) \
+ chk_multi_wakeup((A), (__FILE__), (__LINE__))
+
+/* ---------------------------------------------------------------- */
+
#define exe_select_test(A, B, C, D, E, Y, Z) do { \
int ec; \
if(select_wrapper((A), (B), (C), (D), (E)) == -1) { \
@@ -364,7 +422,7 @@ extern int unitfail;
(Y), (Z), ec, strerror(ec)); \
res = TEST_ERR_SELECT; \
} \
- } WHILE_FALSE
+ } while(0)
#define res_select_test(A, B, C, D, E) \
exe_select_test((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -373,7 +431,7 @@ extern int unitfail;
exe_select_test((A), (B), (C), (D), (E), (Y), (Z)); \
if(res) \
goto test_cleanup; \
- } WHILE_FALSE
+ } while(0)
#define select_test(A, B, C, D, E) \
chk_select_test((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
@@ -382,7 +440,7 @@ extern int unitfail;
#define start_test_timing() do { \
tv_test_start = tutil_tvnow(); \
-} WHILE_FALSE
+} while(0)
#define exe_test_timedout(Y,Z) do { \
if(tutil_tvdiff(tutil_tvnow(), tv_test_start) > TEST_HANG_TIMEOUT) { \
@@ -390,7 +448,7 @@ extern int unitfail;
"that it would have run forever.\n", (Y), (Z)); \
res = TEST_ERR_RUNS_FOREVER; \
} \
-} WHILE_FALSE
+} while(0)
#define res_test_timedout() \
exe_test_timedout((__FILE__), (__LINE__))
@@ -399,7 +457,7 @@ extern int unitfail;
exe_test_timedout(Y, Z); \
if(res) \
goto test_cleanup; \
- } WHILE_FALSE
+ } while(0)
#define abort_on_test_timeout() \
chk_test_timedout((__FILE__), (__LINE__))
@@ -412,9 +470,9 @@ extern int unitfail;
fprintf(stderr, "%s:%d curl_global_init() failed, " \
"with code %d (%s)\n", \
(Y), (Z), (int)ec, curl_easy_strerror(ec)); \
- res = (int)ec; \
+ res = ec; \
} \
-} WHILE_FALSE
+} while(0)
#define res_global_init(A) \
exe_global_init((A), (__FILE__), (__LINE__))
@@ -423,7 +481,7 @@ extern int unitfail;
exe_global_init((A), (Y), (Z)); \
if(res) \
return res; \
- } WHILE_FALSE
+ } while(0)
/* global_init() is different than other macros. In case of
failure it 'return's instead of going to 'test_cleanup'. */
diff --git a/tests/libtest/test1013.pl b/tests/libtest/test1013.pl
index b680273d5..70c74c04b 100755
--- a/tests/libtest/test1013.pl
+++ b/tests/libtest/test1013.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Determine if curl-config --protocols/--features matches the
# curl --version protocols/features
if ( $#ARGV != 2 )
diff --git a/tests/libtest/test1022.pl b/tests/libtest/test1022.pl
index 377808c73..20e875c0b 100755
--- a/tests/libtest/test1022.pl
+++ b/tests/libtest/test1022.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Determine if curl-config --version matches the curl --version
if ( $#ARGV != 2 )
{
diff --git a/tests/libtest/test307.pl b/tests/libtest/test307.pl
index 469af3c21..c7e989f0c 100755
--- a/tests/libtest/test307.pl
+++ b/tests/libtest/test307.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Determine if the given curl executable supports the 'openssl' SSL engine
if ( $#ARGV != 0 )
{
diff --git a/tests/libtest/test610.pl b/tests/libtest/test610.pl
index a900d94b4..c3df29bb7 100755
--- a/tests/libtest/test610.pl
+++ b/tests/libtest/test610.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Perform simple file and directory manipulation in a portable way
if ( $#ARGV <= 0 )
{
diff --git a/tests/libtest/test613.pl b/tests/libtest/test613.pl
index 03d09cb5b..8efc05ca0 100755
--- a/tests/libtest/test613.pl
+++ b/tests/libtest/test613.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
# Prepare a directory with known files and clean up afterwards
use Time::Local;
@@ -76,15 +97,29 @@ elsif ($ARGV[0] eq "postprocess")
my @canondir;
open(IN, "<$logfile") || die "$!";
while (<IN>) {
- /^(.)(..).(..).(..).\s*(\S+)\s+\S+\s+\S+\s+(\S+)\s+(\S+\s+\S+\s+\S+)(.*)$/;
+ /^(.)(..).(..).(..).\s*(\S+)\s+\S+\s+\S+\s+(\S+)\s+(\S+\s+\S+\s+\S+)\s+(.*)$/;
if ($1 eq "d") {
+ # Skip current and parent directory listing, because some SSH
+ # servers (eg. OpenSSH for Windows) are not listing those
+ if ($8 eq "." || $8 eq "..") {
+ next;
+ }
# Erase all directory metadata except for the name, as it is not
# consistent for across all test systems and filesystems
- push @canondir, "d????????? N U U N ??? N NN:NN$8\n";
+ push @canondir, "d????????? N U U N ??? N NN:NN $8\n";
} elsif ($1 eq "-") {
+ # Replace missing group and other permissions with user
+ # permissions (eg. on Windows) due to them being shown as *
+ my ($u, $g, $o) = ($2, $3, $4);
+ if($g eq "**") {
+ $g = $u;
+ }
+ if($o eq "**") {
+ $o = $u;
+ }
# Erase user and group names, as they are not consistent across
# all test systems
- my $line = sprintf("%s%s?%s?%s?%5d U U %15d %s%s\n", $1,$2,$3,$4,$5,$6,$7,$8);
+ my $line = sprintf("%s%s?%s?%s?%5d U U %15d %s %s\n", $1,$u,$g,$o,$5,$6,$7,$8);
push @canondir, $line;
} else {
# Unexpected format; just pass it through and let the test fail
diff --git a/tests/libtest/test75.pl b/tests/libtest/test75.pl
deleted file mode 100755
index 31cdfb8cc..000000000
--- a/tests/libtest/test75.pl
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env perl
-# Check that the length of a given URL is correct
-if ( $#ARGV != 1 )
-{
- print "Usage: $0 string length\n";
- exit 3;
-}
-if (length(@ARGV[0]) != @ARGV[1])
-{
- print "Given host IP and port not supported\n";
- exit 1;
-}
-exit 0;
diff --git a/tests/libtest/testtrace.h b/tests/libtest/testtrace.h
index a09ce348f..54df28b1c 100644
--- a/tests/libtest/testtrace.h
+++ b/tests/libtest/testtrace.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/libtest/testutil.c b/tests/libtest/testutil.c
index f3ad0ce58..d40603d91 100644
--- a/tests/libtest/testutil.c
+++ b/tests/libtest/testutil.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -55,7 +55,7 @@ struct timeval tutil_tvnow(void)
struct timespec tsnow;
if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
now.tv_sec = tsnow.tv_sec;
- now.tv_usec = tsnow.tv_nsec / 1000;
+ now.tv_usec = (int)(tsnow.tv_nsec / 1000);
}
/*
** Even when the configure process has truly detected monotonic clock
diff --git a/tests/libtest/testutil.h b/tests/libtest/testutil.h
index 6c063ea57..ccf84dff2 100644
--- a/tests/libtest/testutil.h
+++ b/tests/libtest/testutil.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/manpage-scan.pl b/tests/manpage-scan.pl
index ba6577c18..41dfdec9c 100755
--- a/tests/manpage-scan.pl
+++ b/tests/manpage-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2016 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2016 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -130,7 +130,7 @@ scanmanpage("$root/docs/libcurl/curl_easy_setopt.3", @curlopt);
scanmanpage("$root/docs/libcurl/curl_easy_getinfo.3", @curlinfo);
scanmanpage("$root/docs/libcurl/curl_multi_setopt.3", @curlmopt);
-# using this hash array, we can whitelist specific options
+# using this hash array, we can skip specific options
my %opts = (
# pretend these --no options exists in tool_getparam.c
'--no-alpn' => 1,
@@ -288,4 +288,4 @@ foreach my $o (keys %opts) {
}
}
-exit $errors;
+print STDERR "$errors\n";
diff --git a/tests/mem-include-scan.pl b/tests/mem-include-scan.pl
index 8922bd4a3..4667f0450 100755
--- a/tests/mem-include-scan.pl
+++ b/tests/mem-include-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2010-2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/negtelnetserver.py b/tests/negtelnetserver.py
index f2f2ab500..7171092af 100755
--- a/tests/negtelnetserver.py
+++ b/tests/negtelnetserver.py
@@ -1,6 +1,24 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
""" A telnet server which negotiates"""
from __future__ import (absolute_import, division, print_function,
@@ -9,11 +27,10 @@ import argparse
import os
import sys
import logging
-try: # Python 2
- import SocketServer as socketserver
-except ImportError: # Python 3
+if sys.version_info.major >= 3:
import socketserver
-
+else:
+ import SocketServer as socketserver
log = logging.getLogger(__name__)
HOST = "localhost"
@@ -32,6 +49,9 @@ def telnetserver(options):
"""
if options.pidfile:
pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
with open(options.pidfile, "w") as f:
f.write(str(pid))
@@ -67,13 +87,17 @@ class NegotiatingTelnetHandler(socketserver.BaseRequestHandler):
data = neg.recv(1024)
log.debug("Incoming data: %r", data)
- if VERIFIED_REQ.encode('ascii') in data:
+ if VERIFIED_REQ.encode('utf-8') in data:
log.debug("Received verification request from test framework")
- response = VERIFIED_RSP.format(pid=os.getpid())
- response_data = response.encode('ascii')
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ response = VERIFIED_RSP.format(pid=pid)
+ response_data = response.encode('utf-8')
else:
log.debug("Received normal request - echoing back")
- response_data = data.strip()
+ response_data = data.decode('utf-8').strip().encode('utf-8')
if response_data:
log.debug("Sending %r", response_data)
diff --git a/tests/nroff-scan.pl b/tests/nroff-scan.pl
index 6121d4c8e..15a59c9b0 100755
--- a/tests/nroff-scan.pl
+++ b/tests/nroff-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2016 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -63,23 +63,23 @@ sub file {
while($l =~ s/\\f(.)([^ ]*)\\f(.)//) {
my ($pre, $str, $post)=($1, $2, $3);
if($post ne "P") {
- print STDERR "error: $f:$line: missing \\fP after $str\n";
+ print "error: $f:$line: missing \\fP after $str\n";
$errors++;
}
if($str =~ /((libcurl|curl)([^ ]*))\(3\)/i) {
my $man = "$1.3";
if(!manpresent($man)) {
- print STDERR "error: $f:$line: referring to non-existing man page $man\n";
+ print "error: $f:$line: referring to non-existing man page $man\n";
$errors++;
}
if($pre ne "I") {
- print STDERR "error: $f:$line: use \\fI before $str\n";
+ print "error: $f:$line: use \\fI before $str\n";
$errors++;
}
}
}
if($l =~ /(curl([^ ]*)\(3\))/i) {
- print STDERR "error: $f:$line: non-referencing $1\n";
+ print "error: $f:$line: non-referencing $1\n";
$errors++;
}
if($l =~ /^\.BR (.*)/) {
@@ -87,7 +87,7 @@ sub file {
while($i =~ s/((lib|)curl([^ ]*)) *\"\(3\)(,|) *\" *//i ) {
my $man = "$1.3";
if(!manpresent($man)) {
- print STDERR "error: $f:$line: referring to non-existing man page $man\n";
+ print "error: $f:$line: referring to non-existing man page $man\n";
$errors++;
}
}
@@ -101,4 +101,6 @@ foreach my $f (@f) {
file($f);
}
+print "OK\n" if(!$errors);
+
exit $errors?1:0;
diff --git a/tests/objnames.inc b/tests/objnames.inc
index e362f6e8e..158f80150 100644
--- a/tests/objnames.inc
+++ b/tests/objnames.inc
@@ -5,7 +5,7 @@
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
-# * Copyright (C) 2012 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# * Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
diff --git a/tests/options-scan.pl b/tests/options-scan.pl
new file mode 100644
index 000000000..22cf454c6
--- /dev/null
+++ b/tests/options-scan.pl
@@ -0,0 +1,122 @@
+#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+#
+# - Get all options mentioned in the $cmddir.
+# - Make sure they're all mentioned in the $opts document
+# - Make usre that the version in $opts matches the version in the file in
+# $cmddir
+#
+
+my $opts = $ARGV[0];
+my $cmddir = $ARGV[1];
+
+sub cmdfiles {
+ my ($dir)=@_;
+
+ opendir(my $dh, $dir) || die "Can't opendir $dir: $!";
+ my @opts = grep { /\.d$/ && -f "$dir/$_" } readdir($dh);
+ closedir $dh;
+
+ for(@opts) {
+ $_ =~ s/\.d$//;
+ $file{$_}=1;
+ }
+ return @opts;
+}
+
+sub mentions {
+ my ($f) = @_;
+ my @options;
+ open(F, "<$f");
+ while(<F>) {
+ chomp;
+ if(/(.*) +([0-9.]+)/) {
+ my ($flag, $version)=($1, $2);
+
+ # store the name without the leading dashes
+ $flag =~ s/^--//;
+
+ # cut out short option (if present)
+ $flag =~ s/ \(-.\)//;
+
+ # store the name without trailing space
+ $flag =~ s/ +$//;
+
+ push @options, $flag;
+
+ # options-in-versions says...
+ $oiv{$flag} = $version;
+ }
+ }
+ return @options;
+}
+
+sub versioncheck {
+ my ($f, $v)=@_;
+ open(F, "<$cmddir/$f.d");
+ while(<F>) {
+ chomp;
+ if(/^Added: ([0-9.]+)/) {
+ if($1 ne $v) {
+ print STDERR "$f lists $v in doc but $1 in file\n";
+ $error++;
+ }
+ last;
+ }
+ }
+ close(F);
+}
+
+# get all the files
+my @cmdopts = cmdfiles($cmddir);
+
+# get all the options mentioned in $o
+my @veropts = mentions($opts);
+
+# check if all files are in the doc
+for my $c (sort @cmdopts) {
+ if($oiv{$c}) {
+ # present, but at same version?
+ versioncheck($c, $oiv{$c});
+ }
+ else {
+ print STDERR "--$c is in the option directory but not in $opts!\n";
+ $error++;
+ }
+}
+
+# check if the all options in the doc have files
+for my $v (sort @veropts) {
+ if($file{$v}) {
+ # present
+ }
+ else {
+ print STDERR "$v is in the doc but NOT as a file!\n";
+ $error++;
+ }
+}
+
+print STDERR "ok\n" if(!$error);
+
+exit $error;
diff --git a/tests/pathhelp.pm b/tests/pathhelp.pm
index 3a413b22e..f495306f6 100644
--- a/tests/pathhelp.pm
+++ b/tests/pathhelp.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2016, Evgeny Grin (Karlson2k), <k2k@narod.ru>.
+# Copyright (C) 2016 - 2020, Evgeny Grin (Karlson2k), <k2k@narod.ru>.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/python_dependencies/impacket/__init__.py b/tests/python_dependencies/impacket/__init__.py
deleted file mode 100644
index 92a5d6bb4..000000000
--- a/tests/python_dependencies/impacket/__init__.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Author: Alberto Solino (@agsolino)
-#
-
-# Set default logging handler to avoid "No handler found" warnings.
-import logging
-try: # Python 2.7+
- from logging import NullHandler
-except ImportError:
- class NullHandler(logging.Handler):
- def emit(self, record):
- pass
-
-# All modules inside this library MUST use this logger (impacket)
-# It is up to the library consumer to do whatever is wanted
-# with the logger output. By default it is forwarded to the
-# upstream logger
-
-LOG = logging.getLogger(__name__)
-LOG.addHandler(NullHandler())
diff --git a/tests/python_dependencies/impacket/nmb.py b/tests/python_dependencies/impacket/nmb.py
deleted file mode 100644
index 791377bc2..000000000
--- a/tests/python_dependencies/impacket/nmb.py
+++ /dev/null
@@ -1,982 +0,0 @@
-from __future__ import print_function
-from __future__ import absolute_import
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-
-
-# -*- mode: python; tab-width: 4 -*-
-#
-# Copyright (C) 2001 Michael Teo <michaelteo@bigfoot.com>
-# nmb.py - NetBIOS library
-#
-# This software is provided 'as-is', without any express or implied warranty.
-# In no event will the author be held liable for any damages arising from the
-# use of this software.
-#
-# Permission is granted to anyone to use this software for any purpose,
-# including commercial applications, and to alter it and redistribute it
-# freely, subject to the following restrictions:
-#
-# 1. The origin of this software must not be misrepresented; you must not
-# claim that you wrote the original software. If you use this software
-# in a product, an acknowledgment in the product documentation would be
-# appreciated but is not required.
-#
-# 2. Altered source versions must be plainly marked as such, and must not be
-# misrepresented as being the original software.
-#
-# 3. This notice cannot be removed or altered from any source distribution.
-#
-# Altered source done by Alberto Solino (@agsolino)
-
-import socket
-import string
-import re
-import select
-import errno
-from random import randint
-from struct import pack, unpack
-import time
-
-from .structure import Structure
-
-CVS_REVISION = '$Revision: 526 $'
-
-# Taken from socket module reference
-INADDR_ANY = '0.0.0.0'
-BROADCAST_ADDR = '<broadcast>'
-
-# Default port for NetBIOS name service
-NETBIOS_NS_PORT = 137
-# Default port for NetBIOS session service
-NETBIOS_SESSION_PORT = 139
-
-# Default port for SMB session service
-SMB_SESSION_PORT = 445
-
-# Owner Node Type Constants
-NODE_B = 0x0000
-NODE_P = 0x2000
-NODE_M = 0x4000
-NODE_RESERVED = 0x6000
-NODE_GROUP = 0x8000
-NODE_UNIQUE = 0x0
-
-# Name Type Constants
-TYPE_UNKNOWN = 0x01
-TYPE_WORKSTATION = 0x00
-TYPE_CLIENT = 0x03
-TYPE_SERVER = 0x20
-TYPE_DOMAIN_MASTER = 0x1B
-TYPE_DOMAIN_CONTROLLER = 0x1C
-TYPE_MASTER_BROWSER = 0x1D
-TYPE_BROWSER = 0x1E
-TYPE_NETDDE = 0x1F
-TYPE_STATUS = 0x21
-
-# Opcodes values
-OPCODE_QUERY = 0
-OPCODE_REGISTRATION = 0x5
-OPCODE_RELEASE = 0x6
-OPCODE_WACK = 0x7
-OPCODE_REFRESH = 0x8
-OPCODE_REQUEST = 0
-OPCODE_RESPONSE = 0x10
-
-# NM_FLAGS
-NM_FLAGS_BROADCAST = 0x1
-NM_FLAGS_UNICAST = 0
-NM_FLAGS_RA = 0x8
-NM_FLAGS_RD = 0x10
-NM_FLAGS_TC = 0x20
-NM_FLAGS_AA = 0x40
-
-# QUESTION_TYPE
-QUESTION_TYPE_NB = 0x20 # NetBIOS general Name Service Resource Record
-QUESTION_TYPE_NBSTAT = 0x21 # NetBIOS NODE STATUS Resource Record
-# QUESTION_CLASS
-QUESTION_CLASS_IN = 0x1 # Internet class
-
-# RR_TYPE Resource Record Type code
-RR_TYPE_A = 0x1 # IP address Resource Record
-RR_TYPE_NS = 0x2 # Name Server Resource Record
-RR_TYPE_NULL = 0xA # NULL Resource Record
-RR_TYPE_NB = 0x20 # NetBIOS general Name Service Resource Record
-RR_TYPE_NBSTAT = 0x21 # NetBIOS NODE STATUS Resource Record
-
-# Resource Record Class
-RR_CLASS_IN = 1 # Internet class
-
-# RCODE values
-RCODE_FMT_ERR = 0x1 # Format Error. Request was invalidly formatted.
-RCODE_SRV_ERR = 0x2 # Server failure. Problem with NBNS, cannot process name.
-RCODE_IMP_ERR = 0x4 # Unsupported request error. Allowable only for challenging NBNS when gets an Update type
- # registration request.
-RCODE_RFS_ERR = 0x5 # Refused error. For policy reasons server will not register this name from this host.
-RCODE_ACT_ERR = 0x6 # Active error. Name is owned by another node.
-RCODE_CFT_ERR = 0x7 # Name in conflict error. A UNIQUE name is owned by more than one node.
-
-# NAME_FLAGS
-NAME_FLAGS_PRM = 0x0200 # Permanent Name Flag. If one (1) then entry is for the permanent node name. Flag is zero
- # (0) for all other names.
-NAME_FLAGS_ACT = 0x0400 # Active Name Flag. All entries have this flag set to one (1).
-NAME_FLAG_CNF = 0x0800 # Conflict Flag. If one (1) then name on this node is in conflict.
-NAME_FLAG_DRG = 0x1000 # Deregister Flag. If one (1) then this name is in the process of being deleted.
-
-NAME_TYPES = { TYPE_UNKNOWN: 'Unknown', TYPE_WORKSTATION: 'Workstation', TYPE_CLIENT: 'Client',
- TYPE_SERVER: 'Server', TYPE_MASTER_BROWSER: 'Master Browser', TYPE_BROWSER: 'Browser Server',
- TYPE_DOMAIN_MASTER: 'Domain Master' , TYPE_NETDDE: 'NetDDE Server'}
-# NetBIOS Session Types
-NETBIOS_SESSION_MESSAGE = 0x0
-NETBIOS_SESSION_REQUEST = 0x81
-NETBIOS_SESSION_POSITIVE_RESPONSE = 0x82
-NETBIOS_SESSION_NEGATIVE_RESPONSE = 0x83
-NETBIOS_SESSION_RETARGET_RESPONSE = 0x84
-NETBIOS_SESSION_KEEP_ALIVE = 0x85
-
-
-def strerror(errclass, errcode):
- if errclass == ERRCLASS_OS:
- return 'OS Error', str(errcode)
- elif errclass == ERRCLASS_QUERY:
- return 'Query Error', QUERY_ERRORS.get(errcode, 'Unknown error')
- elif errclass == ERRCLASS_SESSION:
- return 'Session Error', SESSION_ERRORS.get(errcode, 'Unknown error')
- else:
- return 'Unknown Error Class', 'Unknown Error'
-
-
-
-class NetBIOSError(Exception): pass
-class NetBIOSTimeout(Exception):
- def __init__(self, message = 'The NETBIOS connection with the remote host timed out.'):
- Exception.__init__(self, message)
-
-class NBResourceRecord:
- def __init__(self, data = 0):
- self._data = data
- try:
- if self._data:
- self.rr_name = (re.split('\x00',data))[0]
- offset = len(self.rr_name)+1
- self.rr_type = unpack('>H', self._data[offset:offset+2])[0]
- self.rr_class = unpack('>H', self._data[offset+2: offset+4])[0]
- self.ttl = unpack('>L',self._data[offset+4:offset+8])[0]
- self.rdlength = unpack('>H', self._data[offset+8:offset+10])[0]
- self.rdata = self._data[offset+10:offset+10+self.rdlength]
- offset = self.rdlength - 2
- self.unit_id = data[offset:offset+6]
- else:
- self.rr_name = ''
- self.rr_type = 0
- self.rr_class = 0
- self.ttl = 0
- self.rdlength = 0
- self.rdata = ''
- self.unit_id = ''
- except Exception:
- raise NetBIOSError( 'Wrong packet format ' )
-
- def set_rr_name(self, name):
- self.rr_name = name
- def set_rr_type(self, name):
- self.rr_type = name
- def set_rr_class(self,cl):
- self.rr_class = cl
- def set_ttl(self,ttl):
- self.ttl = ttl
- def set_rdata(self,rdata):
- self.rdata = rdata
- self.rdlength = len(rdata)
- def get_unit_id(self):
- return self.unit_id
- def get_rr_name(self):
- return self.rr_name
- def get_rr_class(self):
- return self.rr_class
- def get_ttl(self):
- return self.ttl
- def get_rdlength(self):
- return self.rdlength
- def get_rdata(self):
- return self.rdata
- def rawData(self):
- return self.rr_name + pack('!HHLH',self.rr_type, self.rr_class, self.ttl, self.rdlength) + self.rdata
-
-class NBNodeStatusResponse(NBResourceRecord):
- def __init__(self, data = 0):
- NBResourceRecord.__init__(self,data)
- self.num_names = 0
- self.node_names = [ ]
- self.statstics = ''
- self.mac = '00-00-00-00-00-00'
- try:
- if data:
- self._data = self.get_rdata()
- self.num_names = unpack('>B',self._data[:1])[0]
- offset = 1
- for i in range(0, self.num_names):
- name = self._data[offset:offset + 15]
- type,flags = unpack('>BH', self._data[offset + 15: offset + 18])
- offset += 18
- self.node_names.append(NBNodeEntry(name, type ,flags))
- self.set_mac_in_hexa(self.get_unit_id())
- except Exception:
- raise NetBIOSError( 'Wrong packet format ' )
-
- def set_mac_in_hexa(self, data):
- data_aux = ''
- for d in data:
- if data_aux == '':
- data_aux = '%02x' % ord(d)
- else:
- data_aux += '-%02x' % ord(d)
- self.mac = string.upper(data_aux)
-
- def get_num_names(self):
- return self.num_names
- def get_mac(self):
- return self.mac
- def set_num_names(self, num):
- self.num_names = num
- def get_node_names(self):
- return self.node_names
- def add_node_name(self,node_names):
- self.node_names.append(node_names)
- self.num_names += 1
- def rawData(self):
- res = pack('!B', self.num_names )
- for i in range(0, self.num_names):
- res += self.node_names[i].rawData()
-
-class NBPositiveNameQueryResponse(NBResourceRecord):
- def __init__(self, data = 0):
- NBResourceRecord.__init__(self, data)
- self.addr_entries = [ ]
- if data:
- self._data = self.get_rdata()
- _qn_length, qn_name, qn_scope = decode_name(data)
- self._netbios_name = string.rstrip(qn_name[:-1]) + qn_scope
- self._name_type = ord(qn_name[-1])
- self._nb_flags = unpack('!H', self._data[:2])
- offset = 2
- while offset<len(self._data):
- self.addr_entries.append('%d.%d.%d.%d' % unpack('4B', (self._data[offset:offset+4])))
- offset += 4
-
- def get_netbios_name(self):
- return self._netbios_name
-
- def get_name_type(self):
- return self._name_type
-
- def get_addr_entries(self):
- return self.addr_entries
-
-class NetBIOSPacket:
- """ This is a packet as defined in RFC 1002 """
- def __init__(self, data = 0):
- self.name_trn_id = 0x0 # Transaction ID for Name Service Transaction.
- # Requestor places a unique value for each active
- # transaction. Responder puts NAME_TRN_ID value
- # from request packet in response packet.
- self.opcode = 0 # Packet type code
- self.nm_flags = 0 # Flags for operation
- self.rcode = 0 # Result codes of request.
- self.qdcount = 0 # Unsigned 16 bit integer specifying the number of entries in the question section of a Name
- self.ancount = 0 # Unsigned 16 bit integer specifying the number of
- # resource records in the answer section of a Name
- # Service packet.
- self.nscount = 0 # Unsigned 16 bit integer specifying the number of
- # resource records in the authority section of a
- # Name Service packet.
- self.arcount = 0 # Unsigned 16 bit integer specifying the number of
- # resource records in the additional records
- # section of a Name Service packeT.
- self.questions = ''
- self.answers = ''
- if data == 0:
- self._data = ''
- else:
- try:
- self._data = data
- self.opcode = ord(data[2]) >> 3
- self.nm_flags = ((ord(data[2]) & 0x3) << 4) | ((ord(data[3]) & 0xf0) >> 4)
- self.name_trn_id = unpack('>H', self._data[:2])[0]
- self.rcode = ord(data[3]) & 0x0f
- self.qdcount = unpack('>H', self._data[4:6])[0]
- self.ancount = unpack('>H', self._data[6:8])[0]
- self.nscount = unpack('>H', self._data[8:10])[0]
- self.arcount = unpack('>H', self._data[10:12])[0]
- self.answers = self._data[12:]
- except Exception:
- raise NetBIOSError( 'Wrong packet format ' )
-
- def set_opcode(self, opcode):
- self.opcode = opcode
- def set_trn_id(self, trn):
- self.name_trn_id = trn
- def set_nm_flags(self, nm_flags):
- self.nm_flags = nm_flags
- def set_rcode(self, rcode):
- self.rcode = rcode
- def addQuestion(self, question, qtype, qclass):
- self.qdcount += 1
- self.questions += question + pack('!HH',qtype,qclass)
- def get_trn_id(self):
- return self.name_trn_id
- def get_rcode(self):
- return self.rcode
- def get_nm_flags(self):
- return self.nm_flags
- def get_opcode(self):
- return self.opcode
- def get_qdcount(self):
- return self.qdcount
- def get_ancount(self):
- return self.ancount
- def get_nscount(self):
- return self.nscount
- def get_arcount(self):
- return self.arcount
- def rawData(self):
- secondWord = self.opcode << 11
- secondWord |= self.nm_flags << 4
- secondWord |= self.rcode
- data = pack('!HHHHHH', self.name_trn_id, secondWord , self.qdcount, self.ancount, self.nscount, self.arcount) + self.questions + self.answers
- return data
- def get_answers(self):
- return self.answers
-
-class NBHostEntry:
-
- def __init__(self, nbname, nametype, ip):
- self.__nbname = nbname
- self.__nametype = nametype
- self.__ip = ip
-
- def get_nbname(self):
- return self.__nbname
-
- def get_nametype(self):
- return self.__nametype
-
- def get_ip(self):
- return self.__ip
-
- def __repr__(self):
- return '<NBHostEntry instance: NBname="' + self.__nbname + '", IP="' + self.__ip + '">'
-
-class NBNodeEntry:
-
- def __init__(self, nbname, nametype, flags):
- self.__nbname = string.ljust(nbname,17)
- self.__nametype = nametype
- self.__flags = flags
- self.__isgroup = flags & 0x8000
- self.__nodetype = flags & 0x6000
- self.__deleting = flags & 0x1000
- self.__isconflict = flags & 0x0800
- self.__isactive = flags & 0x0400
- self.__ispermanent = flags & 0x0200
-
- def get_nbname(self):
- return self.__nbname
-
- def get_nametype(self):
- return self.__nametype
-
- def is_group(self):
- return self.__isgroup
-
- def get_nodetype(self):
- return self.__nodetype
-
- def is_deleting(self):
- return self.__deleting
-
- def is_conflict(self):
- return self.__isconflict
-
- def is_active(self):
- return self.__isactive
-
- def is_permanent(self):
- return self.__ispermanent
-
- def set_nbname(self, name):
- self.__nbname = string.ljust(name,17)
-
- def set_nametype(self, type):
- self.__nametype = type
-
- def set_flags(self,flags):
- self.__flags = flags
-
- def __repr__(self):
- s = '<NBNodeEntry instance: NBname="' + self.__nbname + '" NameType="' + NAME_TYPES[self.__nametype] + '"'
- if self.__isactive:
- s += ' ACTIVE'
- if self.__isgroup:
- s += ' GROUP'
- if self.__isconflict:
- s += ' CONFLICT'
- if self.__deleting:
- s += ' DELETING'
- return s
- def rawData(self):
- return self.__nbname + pack('!BH',self.__nametype, self.__flags)
-
-
-class NetBIOS:
-
- # Creates a NetBIOS instance without specifying any default NetBIOS domain nameserver.
- # All queries will be sent through the servport.
- def __init__(self, servport = NETBIOS_NS_PORT):
- self.__servport = NETBIOS_NS_PORT
- self.__nameserver = None
- self.__broadcastaddr = BROADCAST_ADDR
- self.mac = '00-00-00-00-00-00'
-
- def _setup_connection(self, dstaddr):
- port = randint(10000, 60000)
- af, socktype, proto, _canonname, _sa = socket.getaddrinfo(dstaddr, port, socket.AF_INET, socket.SOCK_DGRAM)[0]
- s = socket.socket(af, socktype, proto)
- has_bind = 1
- for _i in range(0, 10):
- # We try to bind to a port for 10 tries
- try:
- s.bind(( INADDR_ANY, randint(10000, 60000) ))
- s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
- has_bind = 1
- except socket.error:
- pass
- if not has_bind:
- raise NetBIOSError( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN)
- self.__sock = s
-
- # Set the default NetBIOS domain nameserver.
- def set_nameserver(self, nameserver):
- self.__nameserver = nameserver
-
- # Return the default NetBIOS domain nameserver, or None if none is specified.
- def get_nameserver(self):
- return self.__nameserver
-
- # Set the broadcast address to be used for query.
- def set_broadcastaddr(self, broadcastaddr):
- self.__broadcastaddr = broadcastaddr
-
- # Return the broadcast address to be used, or BROADCAST_ADDR if default broadcast address is used.
- def get_broadcastaddr(self):
- return self.__broadcastaddr
-
- # Returns a NBPositiveNameQueryResponse instance containing the host information for nbname.
- # If a NetBIOS domain nameserver has been specified, it will be used for the query.
- # Otherwise, the query is broadcasted on the broadcast address.
- def gethostbyname(self, nbname, qtype = TYPE_WORKSTATION, scope = None, timeout = 1):
- return self.__queryname(nbname, self.__nameserver, qtype, scope, timeout)
-
- # Returns a list of NBNodeEntry instances containing node status information for nbname.
- # If destaddr contains an IP address, then this will become an unicast query on the destaddr.
- # Raises NetBIOSTimeout if timeout (in secs) is reached.
- # Raises NetBIOSError for other errors
- def getnodestatus(self, nbname, destaddr = None, type = TYPE_WORKSTATION, scope = None, timeout = 1):
- if destaddr:
- return self.__querynodestatus(nbname, destaddr, type, scope, timeout)
- else:
- return self.__querynodestatus(nbname, self.__nameserver, type, scope, timeout)
-
- def getnetbiosname(self, ip):
- entries = self.getnodestatus('*',ip)
- entries = filter(lambda x:x.get_nametype() == TYPE_SERVER, entries)
- return entries[0].get_nbname().strip()
-
- def getmacaddress(self):
- return self.mac
-
- def __queryname(self, nbname, destaddr, qtype, scope, timeout, retries = 0):
- self._setup_connection(destaddr)
- trn_id = randint(1, 32000)
- p = NetBIOSPacket()
- p.set_trn_id(trn_id)
- netbios_name = nbname.upper()
- qn_label = encode_name(netbios_name, qtype, scope)
- p.addQuestion(qn_label, QUESTION_TYPE_NB, QUESTION_CLASS_IN)
- p.set_nm_flags(NM_FLAGS_RD)
- if not destaddr:
- p.set_nm_flags(p.get_nm_flags() | NM_FLAGS_BROADCAST)
- destaddr = self.__broadcastaddr
- req = p.rawData()
-
- tries = retries
- while 1:
- self.__sock.sendto(req, ( destaddr, self.__servport ))
- try:
- ready, _, _ = select.select([ self.__sock.fileno() ], [ ] , [ ], timeout)
- if not ready:
- if tries:
- # Retry again until tries == 0
- tries -= 1
- else:
- raise NetBIOSTimeout
- else:
- data, _ = self.__sock.recvfrom(65536, 0)
-
- res = NetBIOSPacket(data)
- if res.get_trn_id() == p.get_trn_id():
- if res.get_rcode():
- if res.get_rcode() == 0x03:
- return None
- else:
- raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
-
- if res.get_ancount() != 1:
- raise NetBIOSError( 'Malformed response')
-
- return NBPositiveNameQueryResponse(res.get_answers())
- except select.error as ex:
- if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
- raise
-
-
- def __querynodestatus(self, nbname, destaddr, type, scope, timeout):
- self._setup_connection(destaddr)
- trn_id = randint(1, 32000)
- p = NetBIOSPacket()
- p.set_trn_id(trn_id)
- netbios_name = string.upper(nbname)
- qn_label = encode_name(netbios_name, type, scope)
- p.addQuestion(qn_label, QUESTION_TYPE_NBSTAT, QUESTION_CLASS_IN)
-
- if not destaddr:
- p.set_nm_flags(NM_FLAGS_BROADCAST)
- destaddr = self.__broadcastaddr
- req = p.rawData()
- tries = 3
- while 1:
- try:
- self.__sock.sendto(req, 0, ( destaddr, self.__servport ))
- ready, _, _ = select.select([ self.__sock.fileno() ], [ ] , [ ], timeout)
- if not ready:
- if tries:
- # Retry again until tries == 0
- tries -= 1
- else:
- raise NetBIOSTimeout
- else:
- try:
- data, _ = self.__sock.recvfrom(65536, 0)
- except Exception as e:
- raise NetBIOSError("recvfrom error: %s" % str(e))
- self.__sock.close()
- res = NetBIOSPacket(data)
- if res.get_trn_id() == p.get_trn_id():
- if res.get_rcode():
- if res.get_rcode() == 0x03:
- # I'm just guessing here
- raise NetBIOSError("Cannot get data from server")
- else:
- raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
- answ = NBNodeStatusResponse(res.get_answers())
- self.mac = answ.get_mac()
- return answ.get_node_names()
- except select.error as ex:
- if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
- except socket.error as ex:
- raise NetBIOSError('Connection error: %s' % str(ex))
-
-# Perform first and second level encoding of name as specified in RFC 1001 (Section 4)
-def encode_name(name, type, scope):
- if name == '*':
- name += '\0' * 15
- elif len(name) > 15:
- name = name[:15] + chr(type)
- else:
- name = string.ljust(name, 15) + chr(type)
-
- encoded_name = chr(len(name) * 2) + re.sub('.', _do_first_level_encoding, name)
- if scope:
- encoded_scope = ''
- for s in string.split(scope, '.'):
- encoded_scope = encoded_scope + chr(len(s)) + s
- return encoded_name + encoded_scope + '\0'
- else:
- return encoded_name + '\0'
-
-# Internal method for use in encode_name()
-def _do_first_level_encoding(m):
- s = ord(m.group(0))
- return string.uppercase[s >> 4] + string.uppercase[s & 0x0f]
-
-def decode_name(name):
- name_length = ord(name[0])
- assert name_length == 32
-
- decoded_name = re.sub('..', _do_first_level_decoding, name[1:33])
- if name[33] == '\0':
- return 34, decoded_name, ''
- else:
- decoded_domain = ''
- offset = 34
- while 1:
- domain_length = ord(name[offset])
- if domain_length == 0:
- break
- decoded_domain = '.' + name[offset:offset + domain_length]
- offset += domain_length
- return offset + 1, decoded_name, decoded_domain
-
-def _do_first_level_decoding(m):
- s = m.group(0)
- return chr(((ord(s[0]) - ord('A')) << 4) | (ord(s[1]) - ord('A')))
-
-
-
-class NetBIOSSessionPacket:
- def __init__(self, data = 0):
- self.type = 0x0
- self.flags = 0x0
- self.length = 0x0
- if data == 0:
- self._trailer = ''
- else:
- try:
- self.type = ord(data[0])
- if self.type == NETBIOS_SESSION_MESSAGE:
- self.length = ord(data[1]) << 16 | (unpack('!H', data[2:4])[0])
- else:
- self.flags = ord(data[1])
- self.length = unpack('!H', data[2:4])[0]
-
- self._trailer = data[4:]
- except:
- raise NetBIOSError( 'Wrong packet format ' )
-
- def set_type(self, type):
- self.type = type
- def get_type(self):
- return self.type
- def rawData(self):
- if self.type == NETBIOS_SESSION_MESSAGE:
- data = pack('!BBH',self.type,self.length >> 16,self.length & 0xFFFF) + self._trailer
- else:
- data = pack('!BBH',self.type,self.flags,self.length) + self._trailer
- return data
- def set_trailer(self,data):
- self._trailer = data
- self.length = len(data)
- def get_length(self):
- return self.length
- def get_trailer(self):
- return self._trailer
-
-class NetBIOSSession:
- def __init__(self, myname, remote_name, remote_host, remote_type = TYPE_SERVER, sess_port = NETBIOS_SESSION_PORT, timeout = None, local_type = TYPE_WORKSTATION, sock = None):
- if len(myname) > 15:
- self.__myname = string.upper(myname[:15])
- else:
- self.__myname = string.upper(myname)
- self.__local_type = local_type
-
- assert remote_name
- # if destination port SMB_SESSION_PORT and remote name *SMBSERVER, we're changing it to its IP address
- # helping solving the client mistake ;)
- if remote_name == '*SMBSERVER' and sess_port == SMB_SESSION_PORT:
- remote_name = remote_host
- # If remote name is *SMBSERVER let's try to query its name.. if can't be guessed, continue and hope for the best
- if remote_name == '*SMBSERVER':
- nb = NetBIOS()
-
- try:
- res = nb.getnetbiosname(remote_host)
- except:
- res = None
- pass
-
- if res is not None:
- remote_name = res
-
- if len(remote_name) > 15:
- self.__remote_name = string.upper(remote_name[:15])
- else:
- self.__remote_name = string.upper(remote_name)
- self.__remote_type = remote_type
-
- self.__remote_host = remote_host
-
- if sock is not None:
- # We are acting as a server
- self._sock = sock
- else:
- self._sock = self._setup_connection((remote_host, sess_port))
-
- if sess_port == NETBIOS_SESSION_PORT:
- self._request_session(remote_type, local_type, timeout)
-
- def get_myname(self):
- return self.__myname
-
- def get_mytype(self):
- return self.__local_type
-
- def get_remote_host(self):
- return self.__remote_host
-
- def get_remote_name(self):
- return self.__remote_name
-
- def get_remote_type(self):
- return self.__remote_type
-
- def close(self):
- self._sock.close()
-
- def get_socket(self):
- return self._sock
-
-class NetBIOSUDPSessionPacket(Structure):
- TYPE_DIRECT_UNIQUE = 16
- TYPE_DIRECT_GROUP = 17
-
- FLAGS_MORE_FRAGMENTS = 1
- FLAGS_FIRST_FRAGMENT = 2
- FLAGS_B_NODE = 0
-
- structure = (
- ('Type','B=16'), # Direct Unique Datagram
- ('Flags','B=2'), # FLAGS_FIRST_FRAGMENT
- ('ID','<H'),
- ('_SourceIP','>L'),
- ('SourceIP','"'),
- ('SourcePort','>H=138'),
- ('DataLegth','>H-Data'),
- ('Offset','>H=0'),
- ('SourceName','z'),
- ('DestinationName','z'),
- ('Data',':'),
- )
-
- def getData(self):
- addr = self['SourceIP'].split('.')
- addr = [int(x) for x in addr]
- addr = (((addr[0] << 8) + addr[1] << 8) + addr[2] << 8) + addr[3]
- self['_SourceIP'] = addr
- return Structure.getData(self)
-
- def get_trailer(self):
- return self['Data']
-
-class NetBIOSUDPSession(NetBIOSSession):
- def _setup_connection(self, peer):
- af, socktype, proto, canonname, sa = socket.getaddrinfo(peer[0], peer[1], 0, socket.SOCK_DGRAM)[0]
- sock = socket.socket(af, socktype, proto)
- sock.connect(sa)
-
- sock = socket.socket(af, socktype, proto)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- sock.bind((INADDR_ANY, 138))
- self.peer = peer
- return sock
-
- def _request_session(self, remote_type, local_type, timeout = None):
- pass
-
- def next_id(self):
- if hasattr(self, '__dgram_id'):
- answer = self.__dgram_id
- else:
- self.__dgram_id = randint(1,65535)
- answer = self.__dgram_id
- self.__dgram_id += 1
- return answer
-
- def send_packet(self, data):
- # Yes... I know...
- self._sock.connect(self.peer)
-
- p = NetBIOSUDPSessionPacket()
- p['ID'] = self.next_id()
- p['SourceIP'] = self._sock.getsockname()[0]
- p['SourceName'] = encode_name(self.get_myname(), self.get_mytype(), '')[:-1]
- p['DestinationName'] = encode_name(self.get_remote_name(), self.get_remote_type(), '')[:-1]
- p['Data'] = data
-
- self._sock.sendto(str(p), self.peer)
- self._sock.close()
-
- self._sock = self._setup_connection(self.peer)
-
- def recv_packet(self, timeout = None):
- # The next loop is a workaround for a bigger problem:
- # When data reaches higher layers, the lower headers are lost,
- # and with them, for example, the source IP. Hence, SMB users
- # can't know where packets are comming from... we need a better
- # solution, right now, we will filter everything except packets
- # coming from the remote_host specified in __init__()
-
- while 1:
- data, peer = self._sock.recvfrom(8192)
-# print "peer: %r self.peer: %r" % (peer, self.peer)
- if peer == self.peer: break
-
- return NetBIOSUDPSessionPacket(data)
-
-class NetBIOSTCPSession(NetBIOSSession):
- def __init__(self, myname, remote_name, remote_host, remote_type = TYPE_SERVER, sess_port = NETBIOS_SESSION_PORT, timeout = None, local_type = TYPE_WORKSTATION, sock = None, select_poll = False):
- self.__select_poll = select_poll
- if self.__select_poll:
- self.read_function = self.polling_read
- else:
- self.read_function = self.non_polling_read
- NetBIOSSession.__init__(self, myname, remote_name, remote_host, remote_type = remote_type, sess_port = sess_port, timeout = timeout, local_type = local_type, sock=sock)
-
-
- def _setup_connection(self, peer):
- try:
- af, socktype, proto, canonname, sa = socket.getaddrinfo(peer[0], peer[1], 0, socket.SOCK_STREAM)[0]
- sock = socket.socket(af, socktype, proto)
- sock.connect(sa)
- except socket.error as e:
- raise socket.error("Connection error (%s:%s)" % (peer[0], peer[1]), e)
- return sock
-
- def send_packet(self, data):
- p = NetBIOSSessionPacket()
- p.set_type(NETBIOS_SESSION_MESSAGE)
- p.set_trailer(data)
- self._sock.send(p.rawData())
-
- def recv_packet(self, timeout = None):
- data = self.__read(timeout)
- return NetBIOSSessionPacket(data)
-
- def _request_session(self, remote_type, local_type, timeout = None):
- p = NetBIOSSessionPacket()
- remote_name = encode_name(self.get_remote_name(), remote_type, '')
- myname = encode_name(self.get_myname(), local_type, '')
- p.set_type(NETBIOS_SESSION_REQUEST)
- p.set_trailer(remote_name + myname)
-
- self._sock.send(p.rawData())
- while 1:
- p = self.recv_packet(timeout)
- if p.get_type() == NETBIOS_SESSION_NEGATIVE_RESPONSE:
- raise NetBIOSError( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]))
- elif p.get_type() == NETBIOS_SESSION_POSITIVE_RESPONSE:
- break
- else:
- # Ignore all other messages, most probably keepalive messages
- pass
-
- def polling_read(self, read_length, timeout):
- data = ''
- if timeout is None:
- timeout = 3600
-
- time_left = timeout
- CHUNK_TIME = 0.025
- bytes_left = read_length
-
- while bytes_left > 0:
- try:
- ready, _, _ = select.select([self._sock.fileno() ], [ ], [ ], 0)
-
- if not ready:
- if time_left <= 0:
- raise NetBIOSTimeout
- else:
- time.sleep(CHUNK_TIME)
- time_left -= CHUNK_TIME
- continue
-
- received = self._sock.recv(bytes_left)
- if len(received) == 0:
- raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
-
- data = data + received
- bytes_left = read_length - len(data)
- except select.error as ex:
- if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
-
- return data
-
- def non_polling_read(self, read_length, timeout):
- data = ''
- bytes_left = read_length
-
- while bytes_left > 0:
- try:
- ready, _, _ = select.select([self._sock.fileno() ], [ ], [ ], timeout)
-
- if not ready:
- raise NetBIOSTimeout
-
- received = self._sock.recv(bytes_left)
- if len(received) == 0:
- raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
-
- data = data + received
- bytes_left = read_length - len(data)
- except select.error as ex:
- if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
- raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
-
- return data
-
- def __read(self, timeout = None):
- data = self.read_function(4, timeout)
- type, flags, length = unpack('>ccH', data)
- if ord(type) == NETBIOS_SESSION_MESSAGE:
- length |= ord(flags) << 16
- else:
- if ord(flags) & 0x01:
- length |= 0x10000
- data2 = self.read_function(length, timeout)
-
- return data + data2
-
-ERRCLASS_QUERY = 0x00
-ERRCLASS_SESSION = 0xf0
-ERRCLASS_OS = 0xff
-
-QUERY_ERRORS = { 0x01: 'Request format error. Please file a bug report.',
- 0x02: 'Internal server error',
- 0x03: 'Name does not exist',
- 0x04: 'Unsupported request',
- 0x05: 'Request refused'
- }
-
-SESSION_ERRORS = { 0x80: 'Not listening on called name',
- 0x81: 'Not listening for calling name',
- 0x82: 'Called name not present',
- 0x83: 'Sufficient resources',
- 0x8f: 'Unspecified error'
- }
-
-def main():
- def get_netbios_host_by_name(name):
- n = NetBIOS()
- n.set_broadcastaddr('255.255.255.255') # To avoid use "<broadcast>" in socket
- for qtype in (TYPE_WORKSTATION, TYPE_CLIENT, TYPE_SERVER, TYPE_DOMAIN_MASTER, TYPE_DOMAIN_CONTROLLER):
- try:
- addrs = n.gethostbyname(name, qtype = qtype).get_addr_entries()
- except NetBIOSTimeout:
- continue
- else:
- return addrs
- raise Exception("Host not found")
-
-
- n = get_netbios_host_by_name("some-host")
- print(n)
-
-if __name__ == '__main__':
- main()
diff --git a/tests/python_dependencies/impacket/nt_errors.py b/tests/python_dependencies/impacket/nt_errors.py
deleted file mode 100644
index cd7ef80ae..000000000
--- a/tests/python_dependencies/impacket/nt_errors.py
+++ /dev/null
@@ -1,3586 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies)
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Author: Alberto Solino (@agsolino)
-#
-# Description:
-# NT STATUS Errors from [MS-ERREF]. Ideally all the files
-# should grab the error codes from here (big ToDo)
-#
-
-ERROR_MESSAGES = {
- 0x00000000: ("STATUS_SUCCESS","The operation completed successfully."),
- 0x00000001: ("STATUS_WAIT_1","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
- 0x00000002: ("STATUS_WAIT_2","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
- 0x00000003: ("STATUS_WAIT_3","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
- 0x0000003F: ("STATUS_WAIT_63","The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state."),
- 0x00000080: ("STATUS_ABANDONED","The caller attempted to wait for a mutex that has been abandoned."),
- 0x00000080: ("STATUS_ABANDONED_WAIT_0","The caller attempted to wait for a mutex that has been abandoned."),
- 0x000000BF: ("STATUS_ABANDONED_WAIT_63","The caller attempted to wait for a mutex that has been abandoned."),
- 0x000000C0: ("STATUS_USER_APC","A user-mode APC was delivered before the given Interval expired."),
- 0x00000101: ("STATUS_ALERTED","The delay completed because the thread was alerted."),
- 0x00000102: ("STATUS_TIMEOUT","The given Timeout interval expired."),
- 0x00000103: ("STATUS_PENDING","The operation that was requested is pending completion."),
- 0x00000104: ("STATUS_REPARSE","A reparse should be performed by the Object Manager because the name of the file resulted in a symbolic link."),
- 0x00000105: ("STATUS_MORE_ENTRIES","Returned by enumeration APIs to indicate more information is available to successive calls."),
- 0x00000106: ("STATUS_NOT_ALL_ASSIGNED","Indicates not all privileges or groups that are referenced are assigned to the caller. This allows, for example, all privileges to be disabled without having to know exactly which privileges are assigned."),
- 0x00000107: ("STATUS_SOME_NOT_MAPPED","Some of the information to be translated has not been translated."),
- 0x00000108: ("STATUS_OPLOCK_BREAK_IN_PROGRESS","An open/create operation completed while an opportunistic lock (oplock) break is underway."),
- 0x00000109: ("STATUS_VOLUME_MOUNTED","A new volume has been mounted by a file system."),
- 0x0000010A: ("STATUS_RXACT_COMMITTED","This success level status indicates that the transaction state already exists for the registry subtree but that a transaction commit was previously aborted. The commit has now been completed."),
- 0x0000010B: ("STATUS_NOTIFY_CLEANUP","Indicates that a notify change request has been completed due to closing the handle that made the notify change request."),
- 0x0000010C: ("STATUS_NOTIFY_ENUM_DIR","Indicates that a notify change request is being completed and that the information is not being returned in the caller's buffer. The caller now needs to enumerate the files to find the changes."),
- 0x0000010D: ("STATUS_NO_QUOTAS_FOR_ACCOUNT","{No Quotas} No system quota limits are specifically set for this account."),
- 0x0000010E: ("STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED","{Connect Failure on Primary Transport} An attempt was made to connect to the remote server %hs on the primary transport, but the connection failed. The computer WAS able to connect on a secondary transport."),
- 0x00000110: ("STATUS_PAGE_FAULT_TRANSITION","The page fault was a transition fault."),
- 0x00000111: ("STATUS_PAGE_FAULT_DEMAND_ZERO","The page fault was a demand zero fault."),
- 0x00000112: ("STATUS_PAGE_FAULT_COPY_ON_WRITE","The page fault was a demand zero fault."),
- 0x00000113: ("STATUS_PAGE_FAULT_GUARD_PAGE","The page fault was a demand zero fault."),
- 0x00000114: ("STATUS_PAGE_FAULT_PAGING_FILE","The page fault was satisfied by reading from a secondary storage device."),
- 0x00000115: ("STATUS_CACHE_PAGE_LOCKED","The cached page was locked during operation."),
- 0x00000116: ("STATUS_CRASH_DUMP","The crash dump exists in a paging file."),
- 0x00000117: ("STATUS_BUFFER_ALL_ZEROS","The specified buffer contains all zeros."),
- 0x00000118: ("STATUS_REPARSE_OBJECT","A reparse should be performed by the Object Manager because the name of the file resulted in a symbolic link."),
- 0x00000119: ("STATUS_RESOURCE_REQUIREMENTS_CHANGED","The device has succeeded a query-stop and its resource requirements have changed."),
- 0x00000120: ("STATUS_TRANSLATION_COMPLETE","The translator has translated these resources into the global space and no additional translations should be performed."),
- 0x00000121: ("STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY","The directory service evaluated group memberships locally, because it was unable to contact a global catalog server."),
- 0x00000122: ("STATUS_NOTHING_TO_TERMINATE","A process being terminated has no threads to terminate."),
- 0x00000123: ("STATUS_PROCESS_NOT_IN_JOB","The specified process is not part of a job."),
- 0x00000124: ("STATUS_PROCESS_IN_JOB","The specified process is part of a job."),
- 0x00000125: ("STATUS_VOLSNAP_HIBERNATE_READY","{Volume Shadow Copy Service} The system is now ready for hibernation."),
- 0x00000126: ("STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY","A file system or file system filter driver has successfully completed an FsFilter operation."),
- 0x00000127: ("STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED","The specified interrupt vector was already connected."),
- 0x00000128: ("STATUS_INTERRUPT_STILL_CONNECTED","The specified interrupt vector is still connected."),
- 0x00000129: ("STATUS_PROCESS_CLONED","The current process is a cloned process."),
- 0x0000012A: ("STATUS_FILE_LOCKED_WITH_ONLY_READERS","The file was locked and all users of the file can only read."),
- 0x0000012B: ("STATUS_FILE_LOCKED_WITH_WRITERS","The file was locked and at least one user of the file can write."),
- 0x00000202: ("STATUS_RESOURCEMANAGER_READ_ONLY","The specified ResourceManager made no changes or updates to the resource under this transaction."),
- 0x00000367: ("STATUS_WAIT_FOR_OPLOCK","An operation is blocked and waiting for an oplock."),
- 0x00010001: ("DBG_EXCEPTION_HANDLED","Debugger handled the exception."),
- 0x00010002: ("DBG_CONTINUE","The debugger continued."),
- 0x001C0001: ("STATUS_FLT_IO_COMPLETE","The IO was completed by a filter."),
- 0xC0000467: ("STATUS_FILE_NOT_AVAILABLE","The file is temporarily unavailable."),
- 0xC0000721: ("STATUS_CALLBACK_RETURNED_THREAD_AFFINITY","A threadpool worker thread entered a callback at thread affinity %p and exited at affinity %p. This is unexpected, indicating that the callback missed restoring the priority."),
- 0x40000000: ("STATUS_OBJECT_NAME_EXISTS","{Object Exists} An attempt was made to create an object but the object name already exists."),
- 0x40000001: ("STATUS_THREAD_WAS_SUSPENDED","{Thread Suspended} A thread termination occurred while the thread was suspended. The thread resumed, and termination proceeded."),
- 0x40000002: ("STATUS_WORKING_SET_LIMIT_RANGE","{Working Set Range Error} An attempt was made to set the working set minimum or maximum to values that are outside the allowable range."),
- 0x40000003: ("STATUS_IMAGE_NOT_AT_BASE","{Image Relocated} An image file could not be mapped at the address that is specified in the image file. Local fixes must be performed on this image."),
- 0x40000004: ("STATUS_RXACT_STATE_CREATED","This informational level status indicates that a specified registry subtree transaction state did not yet exist and had to be created."),
- 0x40000005: ("STATUS_SEGMENT_NOTIFICATION","{Segment Load} A virtual DOS machine (VDM) is loading, unloading, or moving an MS-DOS or Win16 program segment image. An exception is raised so that a debugger can load, unload, or track symbols and breakpoints within these 16-bit segments."),
- 0x40000006: ("STATUS_LOCAL_USER_SESSION_KEY","{Local Session Key} A user session key was requested for a local remote procedure call (RPC) connection. The session key that is returned is a constant value and not unique to this connection."),
- 0x40000007: ("STATUS_BAD_CURRENT_DIRECTORY","{Invalid Current Directory} The process cannot switch to the startup current directory %hs. Select OK to set the current directory to %hs, or select CANCEL to exit."),
- 0x40000008: ("STATUS_SERIAL_MORE_WRITES","{Serial IOCTL Complete} A serial I/O operation was completed by another write to a serial port. (The IOCTL_SERIAL_XOFF_COUNTER reached zero.)"),
- 0x40000009: ("STATUS_REGISTRY_RECOVERED","{Registry Recovery} One of the files that contains the system registry data had to be recovered by using a log or alternate copy. The recovery was successful."),
- 0x4000000A: ("STATUS_FT_READ_RECOVERY_FROM_BACKUP","{Redundant Read} To satisfy a read request, the Windows NT fault-tolerant file system successfully read the requested data from a redundant copy. This was done because the file system encountered a failure on a member of the fault-tolerant volume but was unable to reassign the failing area of the device."),
- 0x4000000B: ("STATUS_FT_WRITE_RECOVERY","{Redundant Write} To satisfy a write request, the Windows NT fault-tolerant file system successfully wrote a redundant copy of the information. This was done because the file system encountered a failure on a member of the fault-tolerant volume but was unable to reassign the failing area of the device."),
- 0x4000000C: ("STATUS_SERIAL_COUNTER_TIMEOUT","{Serial IOCTL Timeout} A serial I/O operation completed because the time-out period expired. (The IOCTL_SERIAL_XOFF_COUNTER had not reached zero.)"),
- 0x4000000D: ("STATUS_NULL_LM_PASSWORD","{Password Too Complex} The Windows password is too complex to be converted to a LAN Manager password. The LAN Manager password that returned is a NULL string."),
- 0x4000000E: ("STATUS_IMAGE_MACHINE_TYPE_MISMATCH","{Machine Type Mismatch} The image file %hs is valid but is for a machine type other than the current machine. Select OK to continue, or CANCEL to fail the DLL load."),
- 0x4000000F: ("STATUS_RECEIVE_PARTIAL","{Partial Data Received} The network transport returned partial data to its client. The remaining data will be sent later."),
- 0x40000010: ("STATUS_RECEIVE_EXPEDITED","{Expedited Data Received} The network transport returned data to its client that was marked as expedited by the remote system."),
- 0x40000011: ("STATUS_RECEIVE_PARTIAL_EXPEDITED","{Partial Expedited Data Received} The network transport returned partial data to its client and this data was marked as expedited by the remote system. The remaining data will be sent later."),
- 0x40000012: ("STATUS_EVENT_DONE","{TDI Event Done} The TDI indication has completed successfully."),
- 0x40000013: ("STATUS_EVENT_PENDING","{TDI Event Pending} The TDI indication has entered the pending state."),
- 0x40000014: ("STATUS_CHECKING_FILE_SYSTEM","Checking file system on %wZ."),
- 0x40000015: ("STATUS_FATAL_APP_EXIT","{Fatal Application Exit} %hs"),
- 0x40000016: ("STATUS_PREDEFINED_HANDLE","The specified registry key is referenced by a predefined handle."),
- 0x40000017: ("STATUS_WAS_UNLOCKED","{Page Unlocked} The page protection of a locked page was changed to 'No Access' and the page was unlocked from memory and from the process."),
- 0x40000018: ("STATUS_SERVICE_NOTIFICATION","%hs"),
- 0x40000019: ("STATUS_WAS_LOCKED","{Page Locked} One of the pages to lock was already locked."),
- 0x4000001A: ("STATUS_LOG_HARD_ERROR","Application popup: %1 : %2"),
- 0x4000001B: ("STATUS_ALREADY_WIN32","A Win32 process already exists."),
- 0x4000001C: ("STATUS_WX86_UNSIMULATE","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x4000001D: ("STATUS_WX86_CONTINUE","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x4000001E: ("STATUS_WX86_SINGLE_STEP","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x4000001F: ("STATUS_WX86_BREAKPOINT","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x40000020: ("STATUS_WX86_EXCEPTION_CONTINUE","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x40000021: ("STATUS_WX86_EXCEPTION_LASTCHANCE","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x40000022: ("STATUS_WX86_EXCEPTION_CHAIN","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x40000023: ("STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE","{Machine Type Mismatch} The image file %hs is valid but is for a machine type other than the current machine."),
- 0x40000024: ("STATUS_NO_YIELD_PERFORMED","A yield execution was performed and no thread was available to run."),
- 0x40000025: ("STATUS_TIMER_RESUME_IGNORED","The resume flag to a timer API was ignored."),
- 0x40000026: ("STATUS_ARBITRATION_UNHANDLED","The arbiter has deferred arbitration of these resources to its parent."),
- 0x40000027: ("STATUS_CARDBUS_NOT_SUPPORTED","The device has detected a CardBus card in its slot."),
- 0x40000028: ("STATUS_WX86_CREATEWX86TIB","An exception status code that is used by the Win32 x86 emulation subsystem."),
- 0x40000029: ("STATUS_MP_PROCESSOR_MISMATCH","The CPUs in this multiprocessor system are not all the same revision level. To use all processors, the operating system restricts itself to the features of the least capable processor in the system. If problems occur with this system, contact the CPU manufacturer to see if this mix of processors is supported."),
- 0x4000002A: ("STATUS_HIBERNATED","The system was put into hibernation."),
- 0x4000002B: ("STATUS_RESUME_HIBERNATION","The system was resumed from hibernation."),
- 0x4000002C: ("STATUS_FIRMWARE_UPDATED","Windows has detected that the system firmware (BIOS) was updated [previous firmware date = %2, current firmware date %3]."),
- 0x4000002D: ("STATUS_DRIVERS_LEAKING_LOCKED_PAGES","A device driver is leaking locked I/O pages and is causing system degradation. The system has automatically enabled the tracking code to try and catch the culprit."),
- 0x4000002E: ("STATUS_MESSAGE_RETRIEVED","The ALPC message being canceled has already been retrieved from the queue on the other side."),
- 0x4000002F: ("STATUS_SYSTEM_POWERSTATE_TRANSITION","The system power state is transitioning from %2 to %3."),
- 0x40000030: ("STATUS_ALPC_CHECK_COMPLETION_LIST","The receive operation was successful. Check the ALPC completion list for the received message."),
- 0x40000031: ("STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION","The system power state is transitioning from %2 to %3 but could enter %4."),
- 0x40000032: ("STATUS_ACCESS_AUDIT_BY_POLICY","Access to %1 is monitored by policy rule %2."),
- 0x40000033: ("STATUS_ABANDON_HIBERFILE","A valid hibernation file has been invalidated and should be abandoned."),
- 0x40000034: ("STATUS_BIZRULES_NOT_ENABLED","Business rule scripts are disabled for the calling application."),
- 0x40000294: ("STATUS_WAKE_SYSTEM","The system has awoken."),
- 0x40000370: ("STATUS_DS_SHUTTING_DOWN","The directory service is shutting down."),
- 0x40010001: ("DBG_REPLY_LATER","Debugger will reply later."),
- 0x40010002: ("DBG_UNABLE_TO_PROVIDE_HANDLE","Debugger cannot provide a handle."),
- 0x40010003: ("DBG_TERMINATE_THREAD","Debugger terminated the thread."),
- 0x40010004: ("DBG_TERMINATE_PROCESS","Debugger terminated the process."),
- 0x40010005: ("DBG_CONTROL_C","Debugger obtained control of C."),
- 0x40010006: ("DBG_PRINTEXCEPTION_C","Debugger printed an exception on control C."),
- 0x40010007: ("DBG_RIPEXCEPTION","Debugger received a RIP exception."),
- 0x40010008: ("DBG_CONTROL_BREAK","Debugger received a control break."),
- 0x40010009: ("DBG_COMMAND_EXCEPTION","Debugger command communication exception."),
- 0x40020056: ("RPC_NT_UUID_LOCAL_ONLY","A UUID that is valid only on this computer has been allocated."),
- 0x400200AF: ("RPC_NT_SEND_INCOMPLETE","Some data remains to be sent in the request buffer."),
- 0x400A0004: ("STATUS_CTX_CDM_CONNECT","The Client Drive Mapping Service has connected on Terminal Connection."),
- 0x400A0005: ("STATUS_CTX_CDM_DISCONNECT","The Client Drive Mapping Service has disconnected on Terminal Connection."),
- 0x4015000D: ("STATUS_SXS_RELEASE_ACTIVATION_CONTEXT","A kernel mode component is releasing a reference on an activation context."),
- 0x40190034: ("STATUS_RECOVERY_NOT_NEEDED","The transactional resource manager is already consistent. Recovery is not needed."),
- 0x40190035: ("STATUS_RM_ALREADY_STARTED","The transactional resource manager has already been started."),
- 0x401A000C: ("STATUS_LOG_NO_RESTART","The log service encountered a log stream with no restart area."),
- 0x401B00EC: ("STATUS_VIDEO_DRIVER_DEBUG_REPORT_REQUEST","{Display Driver Recovered From Failure} The %hs display driver has detected a failure and recovered from it. Some graphical operations may have failed. The next time you restart the machine, a dialog box appears, giving you an opportunity to upload data about this failure to Microsoft."),
- 0x401E000A: ("STATUS_GRAPHICS_PARTIAL_DATA_POPULATED","The specified buffer is not big enough to contain the entire requested dataset. Partial data is populated up to the size of the buffer. The caller needs to provide a buffer of the size as specified in the partially populated buffer's content (interface specific)."),
- 0x401E0117: ("STATUS_GRAPHICS_DRIVER_MISMATCH","The kernel driver detected a version mismatch between it and the user mode driver."),
- 0x401E0307: ("STATUS_GRAPHICS_MODE_NOT_PINNED","No mode is pinned on the specified VidPN source/target."),
- 0x401E031E: ("STATUS_GRAPHICS_NO_PREFERRED_MODE","The specified mode set does not specify a preference for one of its modes."),
- 0x401E034B: ("STATUS_GRAPHICS_DATASET_IS_EMPTY","The specified dataset (for example, mode set, frequency range set, descriptor set, or topology) is empty."),
- 0x401E034C: ("STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET","The specified dataset (for example, mode set, frequency range set, descriptor set, or topology) does not contain any more elements."),
- 0x401E0351: ("STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_PINNED","The specified content transformation is not pinned on the specified VidPN present path."),
- 0x401E042F: ("STATUS_GRAPHICS_UNKNOWN_CHILD_STATUS","The child device presence was not reliably detected."),
- 0x401E0437: ("STATUS_GRAPHICS_LEADLINK_START_DEFERRED","Starting the lead adapter in a linked configuration has been temporarily deferred."),
- 0x401E0439: ("STATUS_GRAPHICS_POLLING_TOO_FREQUENTLY","The display adapter is being polled for children too frequently at the same polling level."),
- 0x401E043A: ("STATUS_GRAPHICS_START_DEFERRED","Starting the adapter has been temporarily deferred."),
- 0x40230001: ("STATUS_NDIS_INDICATION_REQUIRED","The request will be completed later by an NDIS status indication."),
- 0x80000001: ("STATUS_GUARD_PAGE_VIOLATION","{EXCEPTION} Guard Page Exception A page of memory that marks the end of a data structure, such as a stack or an array, has been accessed."),
- 0x80000002: ("STATUS_DATATYPE_MISALIGNMENT","{EXCEPTION} Alignment Fault A data type misalignment was detected in a load or store instruction."),
- 0x80000003: ("STATUS_BREAKPOINT","{EXCEPTION} Breakpoint A breakpoint has been reached."),
- 0x80000004: ("STATUS_SINGLE_STEP","{EXCEPTION} Single Step A single step or trace operation has just been completed."),
- 0x80000005: ("STATUS_BUFFER_OVERFLOW","{Buffer Overflow} The data was too large to fit into the specified buffer."),
- 0x80000006: ("STATUS_NO_MORE_FILES","{No More Files} No more files were found which match the file specification."),
- 0x80000007: ("STATUS_WAKE_SYSTEM_DEBUGGER","{Kernel Debugger Awakened} The system debugger was awakened by an interrupt."),
- 0x8000000A: ("STATUS_HANDLES_CLOSED","{Handles Closed} Handles to objects have been automatically closed because of the requested operation."),
- 0x8000000B: ("STATUS_NO_INHERITANCE","{Non-Inheritable ACL} An access control list (ACL) contains no components that can be inherited."),
- 0x8000000C: ("STATUS_GUID_SUBSTITUTION_MADE","{GUID Substitution} During the translation of a globally unique identifier (GUID) to a Windows security ID (SID), no administratively defined GUID prefix was found. A substitute prefix was used, which will not compromise system security. However, this may provide a more restrictive access than intended."),
- 0x8000000D: ("STATUS_PARTIAL_COPY","Because of protection conflicts, not all the requested bytes could be copied."),
- 0x8000000E: ("STATUS_DEVICE_PAPER_EMPTY","{Out of Paper} The printer is out of paper."),
- 0x8000000F: ("STATUS_DEVICE_POWERED_OFF","{Device Power Is Off} The printer power has been turned off."),
- 0x80000010: ("STATUS_DEVICE_OFF_LINE","{Device Offline} The printer has been taken offline."),
- 0x80000011: ("STATUS_DEVICE_BUSY","{Device Busy} The device is currently busy."),
- 0x80000012: ("STATUS_NO_MORE_EAS","{No More EAs} No more extended attributes (EAs) were found for the file."),
- 0x80000013: ("STATUS_INVALID_EA_NAME","{Illegal EA} The specified extended attribute (EA) name contains at least one illegal character."),
- 0x80000014: ("STATUS_EA_LIST_INCONSISTENT","{Inconsistent EA List} The extended attribute (EA) list is inconsistent."),
- 0x80000015: ("STATUS_INVALID_EA_FLAG","{Invalid EA Flag} An invalid extended attribute (EA) flag was set."),
- 0x80000016: ("STATUS_VERIFY_REQUIRED","{Verifying Disk} The media has changed and a verify operation is in progress; therefore, no reads or writes may be performed to the device, except those that are used in the verify operation."),
- 0x80000017: ("STATUS_EXTRANEOUS_INFORMATION","{Too Much Information} The specified access control list (ACL) contained more information than was expected."),
- 0x80000018: ("STATUS_RXACT_COMMIT_NECESSARY","This warning level status indicates that the transaction state already exists for the registry subtree, but that a transaction commit was previously aborted. The commit has NOT been completed but has not been rolled back either; therefore, it may still be committed, if needed."),
- 0x8000001A: ("STATUS_NO_MORE_ENTRIES","{No More Entries} No more entries are available from an enumeration operation."),
- 0x8000001B: ("STATUS_FILEMARK_DETECTED","{Filemark Found} A filemark was detected."),
- 0x8000001C: ("STATUS_MEDIA_CHANGED","{Media Changed} The media may have changed."),
- 0x8000001D: ("STATUS_BUS_RESET","{I/O Bus Reset} An I/O bus reset was detected."),
- 0x8000001E: ("STATUS_END_OF_MEDIA","{End of Media} The end of the media was encountered."),
- 0x8000001F: ("STATUS_BEGINNING_OF_MEDIA","The beginning of a tape or partition has been detected."),
- 0x80000020: ("STATUS_MEDIA_CHECK","{Media Changed} The media may have changed."),
- 0x80000021: ("STATUS_SETMARK_DETECTED","A tape access reached a set mark."),
- 0x80000022: ("STATUS_NO_DATA_DETECTED","During a tape access, the end of the data written is reached."),
- 0x80000023: ("STATUS_REDIRECTOR_HAS_OPEN_HANDLES","The redirector is in use and cannot be unloaded."),
- 0x80000024: ("STATUS_SERVER_HAS_OPEN_HANDLES","The server is in use and cannot be unloaded."),
- 0x80000025: ("STATUS_ALREADY_DISCONNECTED","The specified connection has already been disconnected."),
- 0x80000026: ("STATUS_LONGJUMP","A long jump has been executed."),
- 0x80000027: ("STATUS_CLEANER_CARTRIDGE_INSTALLED","A cleaner cartridge is present in the tape library."),
- 0x80000028: ("STATUS_PLUGPLAY_QUERY_VETOED","The Plug and Play query operation was not successful."),
- 0x80000029: ("STATUS_UNWIND_CONSOLIDATE","A frame consolidation has been executed."),
- 0x8000002A: ("STATUS_REGISTRY_HIVE_RECOVERED","{Registry Hive Recovered} The registry hive (file): %hs was corrupted and it has been recovered. Some data might have been lost."),
- 0x8000002B: ("STATUS_DLL_MIGHT_BE_INSECURE","The application is attempting to run executable code from the module %hs. This may be insecure. An alternative, %hs, is available. Should the application use the secure module %hs?"),
- 0x8000002C: ("STATUS_DLL_MIGHT_BE_INCOMPATIBLE","The application is loading executable code from the module %hs. This is secure but may be incompatible with previous releases of the operating system. An alternative, %hs, is available. Should the application use the secure module %hs?"),
- 0x8000002D: ("STATUS_STOPPED_ON_SYMLINK","The create operation stopped after reaching a symbolic link."),
- 0x80000288: ("STATUS_DEVICE_REQUIRES_CLEANING","The device has indicated that cleaning is necessary."),
- 0x80000289: ("STATUS_DEVICE_DOOR_OPEN","The device has indicated that its door is open. Further operations require it closed and secured."),
- 0x80000803: ("STATUS_DATA_LOST_REPAIR","Windows discovered a corruption in the file %hs. This file has now been repaired. Check if any data in the file was lost because of the corruption."),
- 0x80010001: ("DBG_EXCEPTION_NOT_HANDLED","Debugger did not handle the exception."),
- 0x80130001: ("STATUS_CLUSTER_NODE_ALREADY_UP","The cluster node is already up."),
- 0x80130002: ("STATUS_CLUSTER_NODE_ALREADY_DOWN","The cluster node is already down."),
- 0x80130003: ("STATUS_CLUSTER_NETWORK_ALREADY_ONLINE","The cluster network is already online."),
- 0x80130004: ("STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE","The cluster network is already offline."),
- 0x80130005: ("STATUS_CLUSTER_NODE_ALREADY_MEMBER","The cluster node is already a member of the cluster."),
- 0x80190009: ("STATUS_COULD_NOT_RESIZE_LOG","The log could not be set to the requested size."),
- 0x80190029: ("STATUS_NO_TXF_METADATA","There is no transaction metadata on the file."),
- 0x80190031: ("STATUS_CANT_RECOVER_WITH_HANDLE_OPEN","The file cannot be recovered because there is a handle still open on it."),
- 0x80190041: ("STATUS_TXF_METADATA_ALREADY_PRESENT","Transaction metadata is already present on this file and cannot be superseded."),
- 0x80190042: ("STATUS_TRANSACTION_SCOPE_CALLBACKS_NOT_SET","A transaction scope could not be entered because the scope handler has not been initialized."),
- 0x801B00EB: ("STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD_RECOVERED","{Display Driver Stopped Responding and recovered} The %hs display driver has stopped working normally. The recovery had been performed."),
- 0x801C0001: ("STATUS_FLT_BUFFER_TOO_SMALL","{Buffer too small} The buffer is too small to contain the entry. No information has been written to the buffer."),
- 0x80210001: ("STATUS_FVE_PARTIAL_METADATA","Volume metadata read or write is incomplete."),
- 0x80210002: ("STATUS_FVE_TRANSIENT_STATE","BitLocker encryption keys were ignored because the volume was in a transient state."),
- 0xC0000001: ("STATUS_UNSUCCESSFUL","{Operation Failed} The requested operation was unsuccessful."),
- 0xC0000002: ("STATUS_NOT_IMPLEMENTED","{Not Implemented} The requested operation is not implemented."),
- 0xC0000003: ("STATUS_INVALID_INFO_CLASS","{Invalid Parameter} The specified information class is not a valid information class for the specified object."),
- 0xC0000004: ("STATUS_INFO_LENGTH_MISMATCH","The specified information record length does not match the length that is required for the specified information class."),
- 0xC0000005: ("STATUS_ACCESS_VIOLATION","The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s."),
- 0xC0000006: ("STATUS_IN_PAGE_ERROR","The instruction at 0x%08lx referenced memory at 0x%08lx. The required data was not placed into memory because of an I/O error status of 0x%08lx."),
- 0xC0000007: ("STATUS_PAGEFILE_QUOTA","The page file quota for the process has been exhausted."),
- 0xC0000008: ("STATUS_INVALID_HANDLE","An invalid HANDLE was specified."),
- 0xC0000009: ("STATUS_BAD_INITIAL_STACK","An invalid initial stack was specified in a call to NtCreateThread."),
- 0xC000000A: ("STATUS_BAD_INITIAL_PC","An invalid initial start address was specified in a call to NtCreateThread."),
- 0xC000000B: ("STATUS_INVALID_CID","An invalid client ID was specified."),
- 0xC000000C: ("STATUS_TIMER_NOT_CANCELED","An attempt was made to cancel or set a timer that has an associated APC and the specified thread is not the thread that originally set the timer with an associated APC routine."),
- 0xC000000D: ("STATUS_INVALID_PARAMETER","An invalid parameter was passed to a service or function."),
- 0xC000000E: ("STATUS_NO_SUCH_DEVICE","A device that does not exist was specified."),
- 0xC000000F: ("STATUS_NO_SUCH_FILE","{File Not Found} The file %hs does not exist."),
- 0xC0000010: ("STATUS_INVALID_DEVICE_REQUEST","The specified request is not a valid operation for the target device."),
- 0xC0000011: ("STATUS_END_OF_FILE","The end-of-file marker has been reached. There is no valid data in the file beyond this marker."),
- 0xC0000012: ("STATUS_WRONG_VOLUME","{Wrong Volume} The wrong volume is in the drive. Insert volume %hs into drive %hs."),
- 0xC0000013: ("STATUS_NO_MEDIA_IN_DEVICE","{No Disk} There is no disk in the drive. Insert a disk into drive %hs."),
- 0xC0000014: ("STATUS_UNRECOGNIZED_MEDIA","{Unknown Disk Format} The disk in drive %hs is not formatted properly. Check the disk, and reformat it, if needed."),
- 0xC0000015: ("STATUS_NONEXISTENT_SECTOR","{Sector Not Found} The specified sector does not exist."),
- 0xC0000016: ("STATUS_MORE_PROCESSING_REQUIRED","{Still Busy} The specified I/O request packet (IRP) cannot be disposed of because the I/O operation is not complete."),
- 0xC0000017: ("STATUS_NO_MEMORY","{Not Enough Quota} Not enough virtual memory or paging file quota is available to complete the specified operation."),
- 0xC0000018: ("STATUS_CONFLICTING_ADDRESSES","{Conflicting Address Range} The specified address range conflicts with the address space."),
- 0xC0000019: ("STATUS_NOT_MAPPED_VIEW","The address range to unmap is not a mapped view."),
- 0xC000001A: ("STATUS_UNABLE_TO_FREE_VM","The virtual memory cannot be freed."),
- 0xC000001B: ("STATUS_UNABLE_TO_DELETE_SECTION","The specified section cannot be deleted."),
- 0xC000001C: ("STATUS_INVALID_SYSTEM_SERVICE","An invalid system service was specified in a system service call."),
- 0xC000001D: ("STATUS_ILLEGAL_INSTRUCTION","{EXCEPTION} Illegal Instruction An attempt was made to execute an illegal instruction."),
- 0xC000001E: ("STATUS_INVALID_LOCK_SEQUENCE","{Invalid Lock Sequence} An attempt was made to execute an invalid lock sequence."),
- 0xC000001F: ("STATUS_INVALID_VIEW_SIZE","{Invalid Mapping} An attempt was made to create a view for a section that is bigger than the section."),
- 0xC0000020: ("STATUS_INVALID_FILE_FOR_SECTION","{Bad File} The attributes of the specified mapping file for a section of memory cannot be read."),
- 0xC0000021: ("STATUS_ALREADY_COMMITTED","{Already Committed} The specified address range is already committed."),
- 0xC0000022: ("STATUS_ACCESS_DENIED","{Access Denied} A process has requested access to an object but has not been granted those access rights."),
- 0xC0000023: ("STATUS_BUFFER_TOO_SMALL","{Buffer Too Small} The buffer is too small to contain the entry. No information has been written to the buffer."),
- 0xC0000024: ("STATUS_OBJECT_TYPE_MISMATCH","{Wrong Type} There is a mismatch between the type of object that is required by the requested operation and the type of object that is specified in the request."),
- 0xC0000025: ("STATUS_NONCONTINUABLE_EXCEPTION","{EXCEPTION} Cannot Continue Windows cannot continue from this exception."),
- 0xC0000026: ("STATUS_INVALID_DISPOSITION","An invalid exception disposition was returned by an exception handler."),
- 0xC0000027: ("STATUS_UNWIND","Unwind exception code."),
- 0xC0000028: ("STATUS_BAD_STACK","An invalid or unaligned stack was encountered during an unwind operation."),
- 0xC0000029: ("STATUS_INVALID_UNWIND_TARGET","An invalid unwind target was encountered during an unwind operation."),
- 0xC000002A: ("STATUS_NOT_LOCKED","An attempt was made to unlock a page of memory that was not locked."),
- 0xC000002B: ("STATUS_PARITY_ERROR","A device parity error on an I/O operation."),
- 0xC000002C: ("STATUS_UNABLE_TO_DECOMMIT_VM","An attempt was made to decommit uncommitted virtual memory."),
- 0xC000002D: ("STATUS_NOT_COMMITTED","An attempt was made to change the attributes on memory that has not been committed."),
- 0xC000002E: ("STATUS_INVALID_PORT_ATTRIBUTES","Invalid object attributes specified to NtCreatePort or invalid port attributes specified to NtConnectPort."),
- 0xC000002F: ("STATUS_PORT_MESSAGE_TOO_LONG","The length of the message that was passed to NtRequestPort or NtRequestWaitReplyPort is longer than the maximum message that is allowed by the port."),
- 0xC0000030: ("STATUS_INVALID_PARAMETER_MIX","An invalid combination of parameters was specified."),
- 0xC0000031: ("STATUS_INVALID_QUOTA_LOWER","An attempt was made to lower a quota limit below the current usage."),
- 0xC0000032: ("STATUS_DISK_CORRUPT_ERROR","{Corrupt Disk} The file system structure on the disk is corrupt and unusable. Run the Chkdsk utility on the volume %hs."),
- 0xC0000033: ("STATUS_OBJECT_NAME_INVALID","The object name is invalid."),
- 0xC0000034: ("STATUS_OBJECT_NAME_NOT_FOUND","The object name is not found."),
- 0xC0000035: ("STATUS_OBJECT_NAME_COLLISION","The object name already exists."),
- 0xC0000037: ("STATUS_PORT_DISCONNECTED","An attempt was made to send a message to a disconnected communication port."),
- 0xC0000038: ("STATUS_DEVICE_ALREADY_ATTACHED","An attempt was made to attach to a device that was already attached to another device."),
- 0xC0000039: ("STATUS_OBJECT_PATH_INVALID","The object path component was not a directory object."),
- 0xC000003A: ("STATUS_OBJECT_PATH_NOT_FOUND","{Path Not Found} The path %hs does not exist."),
- 0xC000003B: ("STATUS_OBJECT_PATH_SYNTAX_BAD","The object path component was not a directory object."),
- 0xC000003C: ("STATUS_DATA_OVERRUN","{Data Overrun} A data overrun error occurred."),
- 0xC000003D: ("STATUS_DATA_LATE_ERROR","{Data Late} A data late error occurred."),
- 0xC000003E: ("STATUS_DATA_ERROR","{Data Error} An error occurred in reading or writing data."),
- 0xC000003F: ("STATUS_CRC_ERROR","{Bad CRC} A cyclic redundancy check (CRC) checksum error occurred."),
- 0xC0000040: ("STATUS_SECTION_TOO_BIG","{Section Too Large} The specified section is too big to map the file."),
- 0xC0000041: ("STATUS_PORT_CONNECTION_REFUSED","The NtConnectPort request is refused."),
- 0xC0000042: ("STATUS_INVALID_PORT_HANDLE","The type of port handle is invalid for the operation that is requested."),
- 0xC0000043: ("STATUS_SHARING_VIOLATION","A file cannot be opened because the share access flags are incompatible."),
- 0xC0000044: ("STATUS_QUOTA_EXCEEDED","Insufficient quota exists to complete the operation."),
- 0xC0000045: ("STATUS_INVALID_PAGE_PROTECTION","The specified page protection was not valid."),
- 0xC0000046: ("STATUS_MUTANT_NOT_OWNED","An attempt to release a mutant object was made by a thread that was not the owner of the mutant object."),
- 0xC0000047: ("STATUS_SEMAPHORE_LIMIT_EXCEEDED","An attempt was made to release a semaphore such that its maximum count would have been exceeded."),
- 0xC0000048: ("STATUS_PORT_ALREADY_SET","An attempt was made to set the DebugPort or ExceptionPort of a process, but a port already exists in the process, or an attempt was made to set the CompletionPort of a file but a port was already set in the file, or an attempt was made to set the associated completion port of an ALPC port but it is already set."),
- 0xC0000049: ("STATUS_SECTION_NOT_IMAGE","An attempt was made to query image information on a section that does not map an image."),
- 0xC000004A: ("STATUS_SUSPEND_COUNT_EXCEEDED","An attempt was made to suspend a thread whose suspend count was at its maximum."),
- 0xC000004B: ("STATUS_THREAD_IS_TERMINATING","An attempt was made to suspend a thread that has begun termination."),
- 0xC000004C: ("STATUS_BAD_WORKING_SET_LIMIT","An attempt was made to set the working set limit to an invalid value (for example, the minimum greater than maximum)."),
- 0xC000004D: ("STATUS_INCOMPATIBLE_FILE_MAP","A section was created to map a file that is not compatible with an already existing section that maps the same file."),
- 0xC000004E: ("STATUS_SECTION_PROTECTION","A view to a section specifies a protection that is incompatible with the protection of the initial view."),
- 0xC000004F: ("STATUS_EAS_NOT_SUPPORTED","An operation involving EAs failed because the file system does not support EAs."),
- 0xC0000050: ("STATUS_EA_TOO_LARGE","An EA operation failed because the EA set is too large."),
- 0xC0000051: ("STATUS_NONEXISTENT_EA_ENTRY","An EA operation failed because the name or EA index is invalid."),
- 0xC0000052: ("STATUS_NO_EAS_ON_FILE","The file for which EAs were requested has no EAs."),
- 0xC0000053: ("STATUS_EA_CORRUPT_ERROR","The EA is corrupt and cannot be read."),
- 0xC0000054: ("STATUS_FILE_LOCK_CONFLICT","A requested read/write cannot be granted due to a conflicting file lock."),
- 0xC0000055: ("STATUS_LOCK_NOT_GRANTED","A requested file lock cannot be granted due to other existing locks."),
- 0xC0000056: ("STATUS_DELETE_PENDING","A non-close operation has been requested of a file object that has a delete pending."),
- 0xC0000057: ("STATUS_CTL_FILE_NOT_SUPPORTED","An attempt was made to set the control attribute on a file. This attribute is not supported in the destination file system."),
- 0xC0000058: ("STATUS_UNKNOWN_REVISION","Indicates a revision number that was encountered or specified is not one that is known by the service. It may be a more recent revision than the service is aware of."),
- 0xC0000059: ("STATUS_REVISION_MISMATCH","Indicates that two revision levels are incompatible."),
- 0xC000005A: ("STATUS_INVALID_OWNER","Indicates a particular security ID may not be assigned as the owner of an object."),
- 0xC000005B: ("STATUS_INVALID_PRIMARY_GROUP","Indicates a particular security ID may not be assigned as the primary group of an object."),
- 0xC000005C: ("STATUS_NO_IMPERSONATION_TOKEN","An attempt has been made to operate on an impersonation token by a thread that is not currently impersonating a client."),
- 0xC000005D: ("STATUS_CANT_DISABLE_MANDATORY","A mandatory group may not be disabled."),
- 0xC000005E: ("STATUS_NO_LOGON_SERVERS","No logon servers are currently available to service the logon request."),
- 0xC000005F: ("STATUS_NO_SUCH_LOGON_SESSION","A specified logon session does not exist. It may already have been terminated."),
- 0xC0000060: ("STATUS_NO_SUCH_PRIVILEGE","A specified privilege does not exist."),
- 0xC0000061: ("STATUS_PRIVILEGE_NOT_HELD","A required privilege is not held by the client."),
- 0xC0000062: ("STATUS_INVALID_ACCOUNT_NAME","The name provided is not a properly formed account name."),
- 0xC0000063: ("STATUS_USER_EXISTS","The specified account already exists."),
- 0xC0000064: ("STATUS_NO_SUCH_USER","The specified account does not exist."),
- 0xC0000065: ("STATUS_GROUP_EXISTS","The specified group already exists."),
- 0xC0000066: ("STATUS_NO_SUCH_GROUP","The specified group does not exist."),
- 0xC0000067: ("STATUS_MEMBER_IN_GROUP","The specified user account is already in the specified group account. Also used to indicate a group cannot be deleted because it contains a member."),
- 0xC0000068: ("STATUS_MEMBER_NOT_IN_GROUP","The specified user account is not a member of the specified group account."),
- 0xC0000069: ("STATUS_LAST_ADMIN","Indicates the requested operation would disable or delete the last remaining administration account. This is not allowed to prevent creating a situation in which the system cannot be administrated."),
- 0xC000006A: ("STATUS_WRONG_PASSWORD","When trying to update a password, this return status indicates that the value provided as the current password is not correct."),
- 0xC000006B: ("STATUS_ILL_FORMED_PASSWORD","When trying to update a password, this return status indicates that the value provided for the new password contains values that are not allowed in passwords."),
- 0xC000006C: ("STATUS_PASSWORD_RESTRICTION","When trying to update a password, this status indicates that some password update rule has been violated. For example, the password may not meet length criteria."),
- 0xC000006D: ("STATUS_LOGON_FAILURE","The attempted logon is invalid. This is either due to a bad username or authentication information."),
- 0xC000006E: ("STATUS_ACCOUNT_RESTRICTION","Indicates a referenced user name and authentication information are valid, but some user account restriction has prevented successful authentication (such as time-of-day restrictions)."),
- 0xC000006F: ("STATUS_INVALID_LOGON_HOURS","The user account has time restrictions and may not be logged onto at this time."),
- 0xC0000070: ("STATUS_INVALID_WORKSTATION","The user account is restricted so that it may not be used to log on from the source workstation."),
- 0xC0000071: ("STATUS_PASSWORD_EXPIRED","The user account password has expired."),
- 0xC0000072: ("STATUS_ACCOUNT_DISABLED","The referenced account is currently disabled and may not be logged on to."),
- 0xC0000073: ("STATUS_NONE_MAPPED","None of the information to be translated has been translated."),
- 0xC0000074: ("STATUS_TOO_MANY_LUIDS_REQUESTED","The number of LUIDs requested may not be allocated with a single allocation."),
- 0xC0000075: ("STATUS_LUIDS_EXHAUSTED","Indicates there are no more LUIDs to allocate."),
- 0xC0000076: ("STATUS_INVALID_SUB_AUTHORITY","Indicates the sub-authority value is invalid for the particular use."),
- 0xC0000077: ("STATUS_INVALID_ACL","Indicates the ACL structure is not valid."),
- 0xC0000078: ("STATUS_INVALID_SID","Indicates the SID structure is not valid."),
- 0xC0000079: ("STATUS_INVALID_SECURITY_DESCR","Indicates the SECURITY_DESCRIPTOR structure is not valid."),
- 0xC000007A: ("STATUS_PROCEDURE_NOT_FOUND","Indicates the specified procedure address cannot be found in the DLL."),
- 0xC000007B: ("STATUS_INVALID_IMAGE_FORMAT","{Bad Image} %hs is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support."),
- 0xC000007C: ("STATUS_NO_TOKEN","An attempt was made to reference a token that does not exist. This is typically done by referencing the token that is associated with a thread when the thread is not impersonating a client."),
- 0xC000007D: ("STATUS_BAD_INHERITANCE_ACL","Indicates that an attempt to build either an inherited ACL or ACE was not successful. This can be caused by a number of things. One of the more probable causes is the replacement of a CreatorId with a SID that did not fit into the ACE or ACL."),
- 0xC000007E: ("STATUS_RANGE_NOT_LOCKED","The range specified in NtUnlockFile was not locked."),
- 0xC000007F: ("STATUS_DISK_FULL","An operation failed because the disk was full."),
- 0xC0000080: ("STATUS_SERVER_DISABLED","The GUID allocation server is disabled at the moment."),
- 0xC0000081: ("STATUS_SERVER_NOT_DISABLED","The GUID allocation server is enabled at the moment."),
- 0xC0000082: ("STATUS_TOO_MANY_GUIDS_REQUESTED","Too many GUIDs were requested from the allocation server at once."),
- 0xC0000083: ("STATUS_GUIDS_EXHAUSTED","The GUIDs could not be allocated because the Authority Agent was exhausted."),
- 0xC0000084: ("STATUS_INVALID_ID_AUTHORITY","The value provided was an invalid value for an identifier authority."),
- 0xC0000085: ("STATUS_AGENTS_EXHAUSTED","No more authority agent values are available for the particular identifier authority value."),
- 0xC0000086: ("STATUS_INVALID_VOLUME_LABEL","An invalid volume label has been specified."),
- 0xC0000087: ("STATUS_SECTION_NOT_EXTENDED","A mapped section could not be extended."),
- 0xC0000088: ("STATUS_NOT_MAPPED_DATA","Specified section to flush does not map a data file."),
- 0xC0000089: ("STATUS_RESOURCE_DATA_NOT_FOUND","Indicates the specified image file did not contain a resource section."),
- 0xC000008A: ("STATUS_RESOURCE_TYPE_NOT_FOUND","Indicates the specified resource type cannot be found in the image file."),
- 0xC000008B: ("STATUS_RESOURCE_NAME_NOT_FOUND","Indicates the specified resource name cannot be found in the image file."),
- 0xC000008C: ("STATUS_ARRAY_BOUNDS_EXCEEDED","{EXCEPTION} Array bounds exceeded."),
- 0xC000008D: ("STATUS_FLOAT_DENORMAL_OPERAND","{EXCEPTION} Floating-point denormal operand."),
- 0xC000008E: ("STATUS_FLOAT_DIVIDE_BY_ZERO","{EXCEPTION} Floating-point division by zero."),
- 0xC000008F: ("STATUS_FLOAT_INEXACT_RESULT","{EXCEPTION} Floating-point inexact result."),
- 0xC0000090: ("STATUS_FLOAT_INVALID_OPERATION","{EXCEPTION} Floating-point invalid operation."),
- 0xC0000091: ("STATUS_FLOAT_OVERFLOW","{EXCEPTION} Floating-point overflow."),
- 0xC0000092: ("STATUS_FLOAT_STACK_CHECK","{EXCEPTION} Floating-point stack check."),
- 0xC0000093: ("STATUS_FLOAT_UNDERFLOW","{EXCEPTION} Floating-point underflow."),
- 0xC0000094: ("STATUS_INTEGER_DIVIDE_BY_ZERO","{EXCEPTION} Integer division by zero."),
- 0xC0000095: ("STATUS_INTEGER_OVERFLOW","{EXCEPTION} Integer overflow."),
- 0xC0000096: ("STATUS_PRIVILEGED_INSTRUCTION","{EXCEPTION} Privileged instruction."),
- 0xC0000097: ("STATUS_TOO_MANY_PAGING_FILES","An attempt was made to install more paging files than the system supports."),
- 0xC0000098: ("STATUS_FILE_INVALID","The volume for a file has been externally altered such that the opened file is no longer valid."),
- 0xC0000099: ("STATUS_ALLOTTED_SPACE_EXCEEDED","When a block of memory is allotted for future updates, such as the memory allocated to hold discretionary access control and primary group information, successive updates may exceed the amount of memory originally allotted. Because a quota may already have been charged to several processes that have handles to the object, it is not reasonable to alter the size of the allocated memory. Instead, a request that requires more memory than has been allotted must fail and the STATUS_ALLOTTED_SPACE_EXCEEDED error returned."),
- 0xC000009A: ("STATUS_INSUFFICIENT_RESOURCES","Insufficient system resources exist to complete the API."),
- 0xC000009B: ("STATUS_DFS_EXIT_PATH_FOUND","An attempt has been made to open a DFS exit path control file."),
- 0xC000009C: ("STATUS_DEVICE_DATA_ERROR","There are bad blocks (sectors) on the hard disk."),
- 0xC000009D: ("STATUS_DEVICE_NOT_CONNECTED","There is bad cabling, non-termination, or the controller is not able to obtain access to the hard disk."),
- 0xC000009F: ("STATUS_FREE_VM_NOT_AT_BASE","Virtual memory cannot be freed because the base address is not the base of the region and a region size of zero was specified."),
- 0xC00000A0: ("STATUS_MEMORY_NOT_ALLOCATED","An attempt was made to free virtual memory that is not allocated."),
- 0xC00000A1: ("STATUS_WORKING_SET_QUOTA","The working set is not big enough to allow the requested pages to be locked."),
- 0xC00000A2: ("STATUS_MEDIA_WRITE_PROTECTED","{Write Protect Error} The disk cannot be written to because it is write-protected. Remove the write protection from the volume %hs in drive %hs."),
- 0xC00000A3: ("STATUS_DEVICE_NOT_READY","{Drive Not Ready} The drive is not ready for use; its door may be open. Check drive %hs and make sure that a disk is inserted and that the drive door is closed."),
- 0xC00000A4: ("STATUS_INVALID_GROUP_ATTRIBUTES","The specified attributes are invalid or are incompatible with the attributes for the group as a whole."),
- 0xC00000A5: ("STATUS_BAD_IMPERSONATION_LEVEL","A specified impersonation level is invalid. Also used to indicate that a required impersonation level was not provided."),
- 0xC00000A6: ("STATUS_CANT_OPEN_ANONYMOUS","An attempt was made to open an anonymous-level token. Anonymous tokens may not be opened."),
- 0xC00000A7: ("STATUS_BAD_VALIDATION_CLASS","The validation information class requested was invalid."),
- 0xC00000A8: ("STATUS_BAD_TOKEN_TYPE","The type of a token object is inappropriate for its attempted use."),
- 0xC00000A9: ("STATUS_BAD_MASTER_BOOT_RECORD","The type of a token object is inappropriate for its attempted use."),
- 0xC00000AA: ("STATUS_INSTRUCTION_MISALIGNMENT","An attempt was made to execute an instruction at an unaligned address and the host system does not support unaligned instruction references."),
- 0xC00000AB: ("STATUS_INSTANCE_NOT_AVAILABLE","The maximum named pipe instance count has been reached."),
- 0xC00000AC: ("STATUS_PIPE_NOT_AVAILABLE","An instance of a named pipe cannot be found in the listening state."),
- 0xC00000AD: ("STATUS_INVALID_PIPE_STATE","The named pipe is not in the connected or closing state."),
- 0xC00000AE: ("STATUS_PIPE_BUSY","The specified pipe is set to complete operations and there are current I/O operations queued so that it cannot be changed to queue operations."),
- 0xC00000AF: ("STATUS_ILLEGAL_FUNCTION","The specified handle is not open to the server end of the named pipe."),
- 0xC00000B0: ("STATUS_PIPE_DISCONNECTED","The specified named pipe is in the disconnected state."),
- 0xC00000B1: ("STATUS_PIPE_CLOSING","The specified named pipe is in the closing state."),
- 0xC00000B2: ("STATUS_PIPE_CONNECTED","The specified named pipe is in the connected state."),
- 0xC00000B3: ("STATUS_PIPE_LISTENING","The specified named pipe is in the listening state."),
- 0xC00000B4: ("STATUS_INVALID_READ_MODE","The specified named pipe is not in message mode."),
- 0xC00000B5: ("STATUS_IO_TIMEOUT","{Device Timeout} The specified I/O operation on %hs was not completed before the time-out period expired."),
- 0xC00000B6: ("STATUS_FILE_FORCED_CLOSED","The specified file has been closed by another process."),
- 0xC00000B7: ("STATUS_PROFILING_NOT_STARTED","Profiling is not started."),
- 0xC00000B8: ("STATUS_PROFILING_NOT_STOPPED","Profiling is not stopped."),
- 0xC00000B9: ("STATUS_COULD_NOT_INTERPRET","The passed ACL did not contain the minimum required information."),
- 0xC00000BA: ("STATUS_FILE_IS_A_DIRECTORY","The file that was specified as a target is a directory, and the caller specified that it could be anything but a directory."),
- 0xC00000BB: ("STATUS_NOT_SUPPORTED","The request is not supported."),
- 0xC00000BC: ("STATUS_REMOTE_NOT_LISTENING","This remote computer is not listening."),
- 0xC00000BD: ("STATUS_DUPLICATE_NAME","A duplicate name exists on the network."),
- 0xC00000BE: ("STATUS_BAD_NETWORK_PATH","The network path cannot be located."),
- 0xC00000BF: ("STATUS_NETWORK_BUSY","The network is busy."),
- 0xC00000C0: ("STATUS_DEVICE_DOES_NOT_EXIST","This device does not exist."),
- 0xC00000C1: ("STATUS_TOO_MANY_COMMANDS","The network BIOS command limit has been reached."),
- 0xC00000C2: ("STATUS_ADAPTER_HARDWARE_ERROR","An I/O adapter hardware error has occurred."),
- 0xC00000C3: ("STATUS_INVALID_NETWORK_RESPONSE","The network responded incorrectly."),
- 0xC00000C4: ("STATUS_UNEXPECTED_NETWORK_ERROR","An unexpected network error occurred."),
- 0xC00000C5: ("STATUS_BAD_REMOTE_ADAPTER","The remote adapter is not compatible."),
- 0xC00000C6: ("STATUS_PRINT_QUEUE_FULL","The print queue is full."),
- 0xC00000C7: ("STATUS_NO_SPOOL_SPACE","Space to store the file that is waiting to be printed is not available on the server."),
- 0xC00000C8: ("STATUS_PRINT_CANCELLED","The requested print file has been canceled."),
- 0xC00000C9: ("STATUS_NETWORK_NAME_DELETED","The network name was deleted."),
- 0xC00000CA: ("STATUS_NETWORK_ACCESS_DENIED","Network access is denied."),
- 0xC00000CB: ("STATUS_BAD_DEVICE_TYPE","{Incorrect Network Resource Type} The specified device type (LPT, for example) conflicts with the actual device type on the remote resource."),
- 0xC00000CC: ("STATUS_BAD_NETWORK_NAME","{Network Name Not Found} The specified share name cannot be found on the remote server."),
- 0xC00000CD: ("STATUS_TOO_MANY_NAMES","The name limit for the network adapter card of the local computer was exceeded."),
- 0xC00000CE: ("STATUS_TOO_MANY_SESSIONS","The network BIOS session limit was exceeded."),
- 0xC00000CF: ("STATUS_SHARING_PAUSED","File sharing has been temporarily paused."),
- 0xC00000D0: ("STATUS_REQUEST_NOT_ACCEPTED","No more connections can be made to this remote computer at this time because the computer has already accepted the maximum number of connections."),
- 0xC00000D1: ("STATUS_REDIRECTOR_PAUSED","Print or disk redirection is temporarily paused."),
- 0xC00000D2: ("STATUS_NET_WRITE_FAULT","A network data fault occurred."),
- 0xC00000D3: ("STATUS_PROFILING_AT_LIMIT","The number of active profiling objects is at the maximum and no more may be started."),
- 0xC00000D4: ("STATUS_NOT_SAME_DEVICE","{Incorrect Volume} The destination file of a rename request is located on a different device than the source of the rename request."),
- 0xC00000D5: ("STATUS_FILE_RENAMED","The specified file has been renamed and thus cannot be modified."),
- 0xC00000D6: ("STATUS_VIRTUAL_CIRCUIT_CLOSED","{Network Request Timeout} The session with a remote server has been disconnected because the time-out interval for a request has expired."),
- 0xC00000D7: ("STATUS_NO_SECURITY_ON_OBJECT","Indicates an attempt was made to operate on the security of an object that does not have security associated with it."),
- 0xC00000D8: ("STATUS_CANT_WAIT","Used to indicate that an operation cannot continue without blocking for I/O."),
- 0xC00000D9: ("STATUS_PIPE_EMPTY","Used to indicate that a read operation was done on an empty pipe."),
- 0xC00000DA: ("STATUS_CANT_ACCESS_DOMAIN_INFO","Configuration information could not be read from the domain controller, either because the machine is unavailable or access has been denied."),
- 0xC00000DB: ("STATUS_CANT_TERMINATE_SELF","Indicates that a thread attempted to terminate itself by default (called NtTerminateThread with NULL) and it was the last thread in the current process."),
- 0xC00000DC: ("STATUS_INVALID_SERVER_STATE","Indicates the Sam Server was in the wrong state to perform the desired operation."),
- 0xC00000DD: ("STATUS_INVALID_DOMAIN_STATE","Indicates the domain was in the wrong state to perform the desired operation."),
- 0xC00000DE: ("STATUS_INVALID_DOMAIN_ROLE","This operation is only allowed for the primary domain controller of the domain."),
- 0xC00000DF: ("STATUS_NO_SUCH_DOMAIN","The specified domain did not exist."),
- 0xC00000E0: ("STATUS_DOMAIN_EXISTS","The specified domain already exists."),
- 0xC00000E1: ("STATUS_DOMAIN_LIMIT_EXCEEDED","An attempt was made to exceed the limit on the number of domains per server for this release."),
- 0xC00000E2: ("STATUS_OPLOCK_NOT_GRANTED","An error status returned when the opportunistic lock (oplock) request is denied."),
- 0xC00000E3: ("STATUS_INVALID_OPLOCK_PROTOCOL","An error status returned when an invalid opportunistic lock (oplock) acknowledgment is received by a file system."),
- 0xC00000E4: ("STATUS_INTERNAL_DB_CORRUPTION","This error indicates that the requested operation cannot be completed due to a catastrophic media failure or an on-disk data structure corruption."),
- 0xC00000E5: ("STATUS_INTERNAL_ERROR","An internal error occurred."),
- 0xC00000E6: ("STATUS_GENERIC_NOT_MAPPED","Indicates generic access types were contained in an access mask which should already be mapped to non-generic access types."),
- 0xC00000E7: ("STATUS_BAD_DESCRIPTOR_FORMAT","Indicates a security descriptor is not in the necessary format (absolute or self-relative)."),
- 0xC00000E8: ("STATUS_INVALID_USER_BUFFER","An access to a user buffer failed at an expected point in time. This code is defined because the caller does not want to accept STATUS_ACCESS_VIOLATION in its filter."),
- 0xC00000E9: ("STATUS_UNEXPECTED_IO_ERROR","If an I/O error that is not defined in the standard FsRtl filter is returned, it is converted to the following error, which is guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
- 0xC00000EA: ("STATUS_UNEXPECTED_MM_CREATE_ERR","If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
- 0xC00000EB: ("STATUS_UNEXPECTED_MM_MAP_ERROR","If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
- 0xC00000EC: ("STATUS_UNEXPECTED_MM_EXTEND_ERR","If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception."),
- 0xC00000ED: ("STATUS_NOT_LOGON_PROCESS","The requested action is restricted for use by logon processes only. The calling process has not registered as a logon process."),
- 0xC00000EE: ("STATUS_LOGON_SESSION_EXISTS","An attempt has been made to start a new session manager or LSA logon session by using an ID that is already in use."),
- 0xC00000EF: ("STATUS_INVALID_PARAMETER_1","An invalid parameter was passed to a service or function as the first argument."),
- 0xC00000F0: ("STATUS_INVALID_PARAMETER_2","An invalid parameter was passed to a service or function as the second argument."),
- 0xC00000F1: ("STATUS_INVALID_PARAMETER_3","An invalid parameter was passed to a service or function as the third argument."),
- 0xC00000F2: ("STATUS_INVALID_PARAMETER_4","An invalid parameter was passed to a service or function as the fourth argument."),
- 0xC00000F3: ("STATUS_INVALID_PARAMETER_5","An invalid parameter was passed to a service or function as the fifth argument."),
- 0xC00000F4: ("STATUS_INVALID_PARAMETER_6","An invalid parameter was passed to a service or function as the sixth argument."),
- 0xC00000F5: ("STATUS_INVALID_PARAMETER_7","An invalid parameter was passed to a service or function as the seventh argument."),
- 0xC00000F6: ("STATUS_INVALID_PARAMETER_8","An invalid parameter was passed to a service or function as the eighth argument."),
- 0xC00000F7: ("STATUS_INVALID_PARAMETER_9","An invalid parameter was passed to a service or function as the ninth argument."),
- 0xC00000F8: ("STATUS_INVALID_PARAMETER_10","An invalid parameter was passed to a service or function as the tenth argument."),
- 0xC00000F9: ("STATUS_INVALID_PARAMETER_11","An invalid parameter was passed to a service or function as the eleventh argument."),
- 0xC00000FA: ("STATUS_INVALID_PARAMETER_12","An invalid parameter was passed to a service or function as the twelfth argument."),
- 0xC00000FB: ("STATUS_REDIRECTOR_NOT_STARTED","An attempt was made to access a network file, but the network software was not yet started."),
- 0xC00000FC: ("STATUS_REDIRECTOR_STARTED","An attempt was made to start the redirector, but the redirector has already been started."),
- 0xC00000FD: ("STATUS_STACK_OVERFLOW","A new guard page for the stack cannot be created."),
- 0xC00000FE: ("STATUS_NO_SUCH_PACKAGE","A specified authentication package is unknown."),
- 0xC00000FF: ("STATUS_BAD_FUNCTION_TABLE","A malformed function table was encountered during an unwind operation."),
- 0xC0000100: ("STATUS_VARIABLE_NOT_FOUND","Indicates the specified environment variable name was not found in the specified environment block."),
- 0xC0000101: ("STATUS_DIRECTORY_NOT_EMPTY","Indicates that the directory trying to be deleted is not empty."),
- 0xC0000102: ("STATUS_FILE_CORRUPT_ERROR","{Corrupt File} The file or directory %hs is corrupt and unreadable. Run the Chkdsk utility."),
- 0xC0000103: ("STATUS_NOT_A_DIRECTORY","A requested opened file is not a directory."),
- 0xC0000104: ("STATUS_BAD_LOGON_SESSION_STATE","The logon session is not in a state that is consistent with the requested operation."),
- 0xC0000105: ("STATUS_LOGON_SESSION_COLLISION","An internal LSA error has occurred. An authentication package has requested the creation of a logon session but the ID of an already existing logon session has been specified."),
- 0xC0000106: ("STATUS_NAME_TOO_LONG","A specified name string is too long for its intended use."),
- 0xC0000107: ("STATUS_FILES_OPEN","The user attempted to force close the files on a redirected drive, but there were opened files on the drive, and the user did not specify a sufficient level of force."),
- 0xC0000108: ("STATUS_CONNECTION_IN_USE","The user attempted to force close the files on a redirected drive, but there were opened directories on the drive, and the user did not specify a sufficient level of force."),
- 0xC0000109: ("STATUS_MESSAGE_NOT_FOUND","RtlFindMessage could not locate the requested message ID in the message table resource."),
- 0xC000010A: ("STATUS_PROCESS_IS_TERMINATING","An attempt was made to duplicate an object handle into or out of an exiting process."),
- 0xC000010B: ("STATUS_INVALID_LOGON_TYPE","Indicates an invalid value has been provided for the LogonType requested."),
- 0xC000010C: ("STATUS_NO_GUID_TRANSLATION","Indicates that an attempt was made to assign protection to a file system file or directory and one of the SIDs in the security descriptor could not be translated into a GUID that could be stored by the file system. This causes the protection attempt to fail, which may cause a file creation attempt to fail."),
- 0xC000010D: ("STATUS_CANNOT_IMPERSONATE","Indicates that an attempt has been made to impersonate via a named pipe that has not yet been read from."),
- 0xC000010E: ("STATUS_IMAGE_ALREADY_LOADED","Indicates that the specified image is already loaded."),
- 0xC0000117: ("STATUS_NO_LDT","Indicates that an attempt was made to change the size of the LDT for a process that has no LDT."),
- 0xC0000118: ("STATUS_INVALID_LDT_SIZE","Indicates that an attempt was made to grow an LDT by setting its size, or that the size was not an even number of selectors."),
- 0xC0000119: ("STATUS_INVALID_LDT_OFFSET","Indicates that the starting value for the LDT information was not an integral multiple of the selector size."),
- 0xC000011A: ("STATUS_INVALID_LDT_DESCRIPTOR","Indicates that the user supplied an invalid descriptor when trying to set up LDT descriptors."),
- 0xC000011B: ("STATUS_INVALID_IMAGE_NE_FORMAT","The specified image file did not have the correct format. It appears to be NE format."),
- 0xC000011C: ("STATUS_RXACT_INVALID_STATE","Indicates that the transaction state of a registry subtree is incompatible with the requested operation. For example, a request has been made to start a new transaction with one already in progress, or a request has been made to apply a transaction when one is not currently in progress."),
- 0xC000011D: ("STATUS_RXACT_COMMIT_FAILURE","Indicates an error has occurred during a registry transaction commit. The database has been left in an unknown, but probably inconsistent, state. The state of the registry transaction is left as COMMITTING."),
- 0xC000011E: ("STATUS_MAPPED_FILE_SIZE_ZERO","An attempt was made to map a file of size zero with the maximum size specified as zero."),
- 0xC000011F: ("STATUS_TOO_MANY_OPENED_FILES","Too many files are opened on a remote server. This error should only be returned by the Windows redirector on a remote drive."),
- 0xC0000120: ("STATUS_CANCELLED","The I/O request was canceled."),
- 0xC0000121: ("STATUS_CANNOT_DELETE","An attempt has been made to remove a file or directory that cannot be deleted."),
- 0xC0000122: ("STATUS_INVALID_COMPUTER_NAME","Indicates a name that was specified as a remote computer name is syntactically invalid."),
- 0xC0000123: ("STATUS_FILE_DELETED","An I/O request other than close was performed on a file after it was deleted, which can only happen to a request that did not complete before the last handle was closed via NtClose."),
- 0xC0000124: ("STATUS_SPECIAL_ACCOUNT","Indicates an operation that is incompatible with built-in accounts has been attempted on a built-in (special) SAM account. For example, built-in accounts cannot be deleted."),
- 0xC0000125: ("STATUS_SPECIAL_GROUP","The operation requested may not be performed on the specified group because it is a built-in special group."),
- 0xC0000126: ("STATUS_SPECIAL_USER","The operation requested may not be performed on the specified user because it is a built-in special user."),
- 0xC0000127: ("STATUS_MEMBERS_PRIMARY_GROUP","Indicates a member cannot be removed from a group because the group is currently the member's primary group."),
- 0xC0000128: ("STATUS_FILE_CLOSED","An I/O request other than close and several other special case operations was attempted using a file object that had already been closed."),
- 0xC0000129: ("STATUS_TOO_MANY_THREADS","Indicates a process has too many threads to perform the requested action. For example, assignment of a primary token may only be performed when a process has zero or one threads."),
- 0xC000012A: ("STATUS_THREAD_NOT_IN_PROCESS","An attempt was made to operate on a thread within a specific process, but the specified thread is not in the specified process."),
- 0xC000012B: ("STATUS_TOKEN_ALREADY_IN_USE","An attempt was made to establish a token for use as a primary token but the token is already in use. A token can only be the primary token of one process at a time."),
- 0xC000012C: ("STATUS_PAGEFILE_QUOTA_EXCEEDED","The page file quota was exceeded."),
- 0xC000012D: ("STATUS_COMMITMENT_LIMIT","{Out of Virtual Memory} Your system is low on virtual memory. To ensure that Windows runs correctly, increase the size of your virtual memory paging file. For more information, see Help."),
- 0xC000012E: ("STATUS_INVALID_IMAGE_LE_FORMAT","The specified image file did not have the correct format: it appears to be LE format."),
- 0xC000012F: ("STATUS_INVALID_IMAGE_NOT_MZ","The specified image file did not have the correct format: it did not have an initial MZ."),
- 0xC0000130: ("STATUS_INVALID_IMAGE_PROTECT","The specified image file did not have the correct format: it did not have a proper e_lfarlc in the MZ header."),
- 0xC0000131: ("STATUS_INVALID_IMAGE_WIN_16","The specified image file did not have the correct format: it appears to be a 16-bit Windows image."),
- 0xC0000132: ("STATUS_LOGON_SERVER_CONFLICT","The Netlogon service cannot start because another Netlogon service running in the domain conflicts with the specified role."),
- 0xC0000133: ("STATUS_TIME_DIFFERENCE_AT_DC","The time at the primary domain controller is different from the time at the backup domain controller or member server by too large an amount."),
- 0xC0000134: ("STATUS_SYNCHRONIZATION_REQUIRED","The SAM database on a Windows Server is significantly out of synchronization with the copy on the domain controller. A complete synchronization is required."),
- 0xC0000135: ("STATUS_DLL_NOT_FOUND","{Unable To Locate Component} This application has failed to start because %hs was not found. Reinstalling the application may fix this problem."),
- 0xC0000136: ("STATUS_OPEN_FAILED","The NtCreateFile API failed. This error should never be returned to an application; it is a place holder for the Windows LAN Manager Redirector to use in its internal error-mapping routines."),
- 0xC0000137: ("STATUS_IO_PRIVILEGE_FAILED","{Privilege Failed} The I/O permissions for the process could not be changed."),
- 0xC0000138: ("STATUS_ORDINAL_NOT_FOUND","{Ordinal Not Found} The ordinal %ld could not be located in the dynamic link library %hs."),
- 0xC0000139: ("STATUS_ENTRYPOINT_NOT_FOUND","{Entry Point Not Found} The procedure entry point %hs could not be located in the dynamic link library %hs."),
- 0xC000013A: ("STATUS_CONTROL_C_EXIT","{Application Exit by CTRL+C} The application terminated as a result of a CTRL+C."),
- 0xC000013B: ("STATUS_LOCAL_DISCONNECT","{Virtual Circuit Closed} The network transport on your computer has closed a network connection. There may or may not be I/O requests outstanding."),
- 0xC000013C: ("STATUS_REMOTE_DISCONNECT","{Virtual Circuit Closed} The network transport on a remote computer has closed a network connection. There may or may not be I/O requests outstanding."),
- 0xC000013D: ("STATUS_REMOTE_RESOURCES","{Insufficient Resources on Remote Computer} The remote computer has insufficient resources to complete the network request. For example, the remote computer may not have enough available memory to carry out the request at this time."),
- 0xC000013E: ("STATUS_LINK_FAILED","{Virtual Circuit Closed} An existing connection (virtual circuit) has been broken at the remote computer. There is probably something wrong with the network software protocol or the network hardware on the remote computer."),
- 0xC000013F: ("STATUS_LINK_TIMEOUT","{Virtual Circuit Closed} The network transport on your computer has closed a network connection because it had to wait too long for a response from the remote computer."),
- 0xC0000140: ("STATUS_INVALID_CONNECTION","The connection handle that was given to the transport was invalid."),
- 0xC0000141: ("STATUS_INVALID_ADDRESS","The address handle that was given to the transport was invalid."),
- 0xC0000142: ("STATUS_DLL_INIT_FAILED","{DLL Initialization Failed} Initialization of the dynamic link library %hs failed. The process is terminating abnormally."),
- 0xC0000143: ("STATUS_MISSING_SYSTEMFILE","{Missing System File} The required system file %hs is bad or missing."),
- 0xC0000144: ("STATUS_UNHANDLED_EXCEPTION","{Application Error} The exception %s (0x%08lx) occurred in the application at location 0x%08lx."),
- 0xC0000145: ("STATUS_APP_INIT_FAILURE","{Application Error} The application failed to initialize properly (0x%lx). Click OK to terminate the application."),
- 0xC0000146: ("STATUS_PAGEFILE_CREATE_FAILED","{Unable to Create Paging File} The creation of the paging file %hs failed (%lx). The requested size was %ld."),
- 0xC0000147: ("STATUS_NO_PAGEFILE","{No Paging File Specified} No paging file was specified in the system configuration."),
- 0xC0000148: ("STATUS_INVALID_LEVEL","{Incorrect System Call Level} An invalid level was passed into the specified system call."),
- 0xC0000149: ("STATUS_WRONG_PASSWORD_CORE","{Incorrect Password to LAN Manager Server} You specified an incorrect password to a LAN Manager 2.x or MS-NET server."),
- 0xC000014A: ("STATUS_ILLEGAL_FLOAT_CONTEXT","{EXCEPTION} A real-mode application issued a floating-point instruction and floating-point hardware is not present."),
- 0xC000014B: ("STATUS_PIPE_BROKEN","The pipe operation has failed because the other end of the pipe has been closed."),
- 0xC000014C: ("STATUS_REGISTRY_CORRUPT","{The Registry Is Corrupt} The structure of one of the files that contains registry data is corrupt; the image of the file in memory is corrupt; or the file could not be recovered because the alternate copy or log was absent or corrupt."),
- 0xC000014D: ("STATUS_REGISTRY_IO_FAILED","An I/O operation initiated by the Registry failed and cannot be recovered. The registry could not read in, write out, or flush one of the files that contain the system's image of the registry."),
- 0xC000014E: ("STATUS_NO_EVENT_PAIR","An event pair synchronization operation was performed using the thread-specific client/server event pair object, but no event pair object was associated with the thread."),
- 0xC000014F: ("STATUS_UNRECOGNIZED_VOLUME","The volume does not contain a recognized file system. Be sure that all required file system drivers are loaded and that the volume is not corrupt."),
- 0xC0000150: ("STATUS_SERIAL_NO_DEVICE_INITED","No serial device was successfully initialized. The serial driver will unload."),
- 0xC0000151: ("STATUS_NO_SUCH_ALIAS","The specified local group does not exist."),
- 0xC0000152: ("STATUS_MEMBER_NOT_IN_ALIAS","The specified account name is not a member of the group."),
- 0xC0000153: ("STATUS_MEMBER_IN_ALIAS","The specified account name is already a member of the group."),
- 0xC0000154: ("STATUS_ALIAS_EXISTS","The specified local group already exists."),
- 0xC0000155: ("STATUS_LOGON_NOT_GRANTED","A requested type of logon (for example, interactive, network, and service) is not granted by the local security policy of the target system. Ask the system administrator to grant the necessary form of logon."),
- 0xC0000156: ("STATUS_TOO_MANY_SECRETS","The maximum number of secrets that may be stored in a single system was exceeded. The length and number of secrets is limited to satisfy U.S. State Department export restrictions."),
- 0xC0000157: ("STATUS_SECRET_TOO_LONG","The length of a secret exceeds the maximum allowable length. The length and number of secrets is limited to satisfy U.S. State Department export restrictions."),
- 0xC0000158: ("STATUS_INTERNAL_DB_ERROR","The local security authority (LSA) database contains an internal inconsistency."),
- 0xC0000159: ("STATUS_FULLSCREEN_MODE","The requested operation cannot be performed in full-screen mode."),
- 0xC000015A: ("STATUS_TOO_MANY_CONTEXT_IDS","During a logon attempt, the user's security context accumulated too many security IDs. This is a very unusual situation. Remove the user from some global or local groups to reduce the number of security IDs to incorporate into the security context."),
- 0xC000015B: ("STATUS_LOGON_TYPE_NOT_GRANTED","A user has requested a type of logon (for example, interactive or network) that has not been granted. An administrator has control over who may logon interactively and through the network."),
- 0xC000015C: ("STATUS_NOT_REGISTRY_FILE","The system has attempted to load or restore a file into the registry, and the specified file is not in the format of a registry file."),
- 0xC000015D: ("STATUS_NT_CROSS_ENCRYPTION_REQUIRED","An attempt was made to change a user password in the security account manager without providing the necessary Windows cross-encrypted password."),
- 0xC000015E: ("STATUS_DOMAIN_CTRLR_CONFIG_ERROR","A Windows Server has an incorrect configuration."),
- 0xC000015F: ("STATUS_FT_MISSING_MEMBER","An attempt was made to explicitly access the secondary copy of information via a device control to the fault tolerance driver and the secondary copy is not present in the system."),
- 0xC0000160: ("STATUS_ILL_FORMED_SERVICE_ENTRY","A configuration registry node that represents a driver service entry was ill-formed and did not contain the required value entries."),
- 0xC0000161: ("STATUS_ILLEGAL_CHARACTER","An illegal character was encountered. For a multibyte character set, this includes a lead byte without a succeeding trail byte. For the Unicode character set this includes the characters 0xFFFF and 0xFFFE."),
- 0xC0000162: ("STATUS_UNMAPPABLE_CHARACTER","No mapping for the Unicode character exists in the target multibyte code page."),
- 0xC0000163: ("STATUS_UNDEFINED_CHARACTER","The Unicode character is not defined in the Unicode character set that is installed on the system."),
- 0xC0000164: ("STATUS_FLOPPY_VOLUME","The paging file cannot be created on a floppy disk."),
- 0xC0000165: ("STATUS_FLOPPY_ID_MARK_NOT_FOUND","{Floppy Disk Error} While accessing a floppy disk, an ID address mark was not found."),
- 0xC0000166: ("STATUS_FLOPPY_WRONG_CYLINDER","{Floppy Disk Error} While accessing a floppy disk, the track address from the sector ID field was found to be different from the track address that is maintained by the controller."),
- 0xC0000167: ("STATUS_FLOPPY_UNKNOWN_ERROR","{Floppy Disk Error} The floppy disk controller reported an error that is not recognized by the floppy disk driver."),
- 0xC0000168: ("STATUS_FLOPPY_BAD_REGISTERS","{Floppy Disk Error} While accessing a floppy-disk, the controller returned inconsistent results via its registers."),
- 0xC0000169: ("STATUS_DISK_RECALIBRATE_FAILED","{Hard Disk Error} While accessing the hard disk, a recalibrate operation failed, even after retries."),
- 0xC000016A: ("STATUS_DISK_OPERATION_FAILED","{Hard Disk Error} While accessing the hard disk, a disk operation failed even after retries."),
- 0xC000016B: ("STATUS_DISK_RESET_FAILED","{Hard Disk Error} While accessing the hard disk, a disk controller reset was needed, but even that failed."),
- 0xC000016C: ("STATUS_SHARED_IRQ_BUSY","An attempt was made to open a device that was sharing an interrupt request (IRQ) with other devices. At least one other device that uses that IRQ was already opened. Two concurrent opens of devices that share an IRQ and only work via interrupts is not supported for the particular bus type that the devices use."),
- 0xC000016D: ("STATUS_FT_ORPHANING","{FT Orphaning} A disk that is part of a fault-tolerant volume can no longer be accessed."),
- 0xC000016E: ("STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT","The basic input/output system (BIOS) failed to connect a system interrupt to the device or bus for which the device is connected."),
- 0xC0000172: ("STATUS_PARTITION_FAILURE","The tape could not be partitioned."),
- 0xC0000173: ("STATUS_INVALID_BLOCK_LENGTH","When accessing a new tape of a multi-volume partition, the current blocksize is incorrect."),
- 0xC0000174: ("STATUS_DEVICE_NOT_PARTITIONED","The tape partition information could not be found when loading a tape."),
- 0xC0000175: ("STATUS_UNABLE_TO_LOCK_MEDIA","An attempt to lock the eject media mechanism failed."),
- 0xC0000176: ("STATUS_UNABLE_TO_UNLOAD_MEDIA","An attempt to unload media failed."),
- 0xC0000177: ("STATUS_EOM_OVERFLOW","The physical end of tape was detected."),
- 0xC0000178: ("STATUS_NO_MEDIA","{No Media} There is no media in the drive. Insert media into drive %hs."),
- 0xC000017A: ("STATUS_NO_SUCH_MEMBER","A member could not be added to or removed from the local group because the member does not exist."),
- 0xC000017B: ("STATUS_INVALID_MEMBER","A new member could not be added to a local group because the member has the wrong account type."),
- 0xC000017C: ("STATUS_KEY_DELETED","An illegal operation was attempted on a registry key that has been marked for deletion."),
- 0xC000017D: ("STATUS_NO_LOG_SPACE","The system could not allocate the required space in a registry log."),
- 0xC000017E: ("STATUS_TOO_MANY_SIDS","Too many SIDs have been specified."),
- 0xC000017F: ("STATUS_LM_CROSS_ENCRYPTION_REQUIRED","An attempt was made to change a user password in the security account manager without providing the necessary LM cross-encrypted password."),
- 0xC0000180: ("STATUS_KEY_HAS_CHILDREN","An attempt was made to create a symbolic link in a registry key that already has subkeys or values."),
- 0xC0000181: ("STATUS_CHILD_MUST_BE_VOLATILE","An attempt was made to create a stable subkey under a volatile parent key."),
- 0xC0000182: ("STATUS_DEVICE_CONFIGURATION_ERROR","The I/O device is configured incorrectly or the configuration parameters to the driver are incorrect."),
- 0xC0000183: ("STATUS_DRIVER_INTERNAL_ERROR","An error was detected between two drivers or within an I/O driver."),
- 0xC0000184: ("STATUS_INVALID_DEVICE_STATE","The device is not in a valid state to perform this request."),
- 0xC0000185: ("STATUS_IO_DEVICE_ERROR","The I/O device reported an I/O error."),
- 0xC0000186: ("STATUS_DEVICE_PROTOCOL_ERROR","A protocol error was detected between the driver and the device."),
- 0xC0000187: ("STATUS_BACKUP_CONTROLLER","This operation is only allowed for the primary domain controller of the domain."),
- 0xC0000188: ("STATUS_LOG_FILE_FULL","The log file space is insufficient to support this operation."),
- 0xC0000189: ("STATUS_TOO_LATE","A write operation was attempted to a volume after it was dismounted."),
- 0xC000018A: ("STATUS_NO_TRUST_LSA_SECRET","The workstation does not have a trust secret for the primary domain in the local LSA database."),
- 0xC000018B: ("STATUS_NO_TRUST_SAM_ACCOUNT","The SAM database on the Windows Server does not have a computer account for this workstation trust relationship."),
- 0xC000018C: ("STATUS_TRUSTED_DOMAIN_FAILURE","The logon request failed because the trust relationship between the primary domain and the trusted domain failed."),
- 0xC000018D: ("STATUS_TRUSTED_RELATIONSHIP_FAILURE","The logon request failed because the trust relationship between this workstation and the primary domain failed."),
- 0xC000018E: ("STATUS_EVENTLOG_FILE_CORRUPT","The Eventlog log file is corrupt."),
- 0xC000018F: ("STATUS_EVENTLOG_CANT_START","No Eventlog log file could be opened. The Eventlog service did not start."),
- 0xC0000190: ("STATUS_TRUST_FAILURE","The network logon failed. This may be because the validation authority cannot be reached."),
- 0xC0000191: ("STATUS_MUTANT_LIMIT_EXCEEDED","An attempt was made to acquire a mutant such that its maximum count would have been exceeded."),
- 0xC0000192: ("STATUS_NETLOGON_NOT_STARTED","An attempt was made to logon, but the NetLogon service was not started."),
- 0xC0000193: ("STATUS_ACCOUNT_EXPIRED","The user account has expired."),
- 0xC0000194: ("STATUS_POSSIBLE_DEADLOCK","{EXCEPTION} Possible deadlock condition."),
- 0xC0000195: ("STATUS_NETWORK_CREDENTIAL_CONFLICT","Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again."),
- 0xC0000196: ("STATUS_REMOTE_SESSION_LIMIT","An attempt was made to establish a session to a network server, but there are already too many sessions established to that server."),
- 0xC0000197: ("STATUS_EVENTLOG_FILE_CHANGED","The log file has changed between reads."),
- 0xC0000198: ("STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT","The account used is an interdomain trust account. Use your global user account or local user account to access this server."),
- 0xC0000199: ("STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT","The account used is a computer account. Use your global user account or local user account to access this server."),
- 0xC000019A: ("STATUS_NOLOGON_SERVER_TRUST_ACCOUNT","The account used is a server trust account. Use your global user account or local user account to access this server."),
- 0xC000019B: ("STATUS_DOMAIN_TRUST_INCONSISTENT","The name or SID of the specified domain is inconsistent with the trust information for that domain."),
- 0xC000019C: ("STATUS_FS_DRIVER_REQUIRED","A volume has been accessed for which a file system driver is required that has not yet been loaded."),
- 0xC000019D: ("STATUS_IMAGE_ALREADY_LOADED_AS_DLL","Indicates that the specified image is already loaded as a DLL."),
- 0xC000019E: ("STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING","Short name settings may not be changed on this volume due to the global registry setting."),
- 0xC000019F: ("STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME","Short names are not enabled on this volume."),
- 0xC00001A0: ("STATUS_SECURITY_STREAM_IS_INCONSISTENT","The security stream for the given volume is in an inconsistent state. Please run CHKDSK on the volume."),
- 0xC00001A1: ("STATUS_INVALID_LOCK_RANGE","A requested file lock operation cannot be processed due to an invalid byte range."),
- 0xC00001A2: ("STATUS_INVALID_ACE_CONDITION","The specified access control entry (ACE) contains an invalid condition."),
- 0xC00001A3: ("STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT","The subsystem needed to support the image type is not present."),
- 0xC00001A4: ("STATUS_NOTIFICATION_GUID_ALREADY_DEFINED","The specified file already has a notification GUID associated with it."),
- 0xC0000201: ("STATUS_NETWORK_OPEN_RESTRICTION","A remote open failed because the network open restrictions were not satisfied."),
- 0xC0000202: ("STATUS_NO_USER_SESSION_KEY","There is no user session key for the specified logon session."),
- 0xC0000203: ("STATUS_USER_SESSION_DELETED","The remote user session has been deleted."),
- 0xC0000204: ("STATUS_RESOURCE_LANG_NOT_FOUND","Indicates the specified resource language ID cannot be found in the image file."),
- 0xC0000205: ("STATUS_INSUFF_SERVER_RESOURCES","Insufficient server resources exist to complete the request."),
- 0xC0000206: ("STATUS_INVALID_BUFFER_SIZE","The size of the buffer is invalid for the specified operation."),
- 0xC0000207: ("STATUS_INVALID_ADDRESS_COMPONENT","The transport rejected the specified network address as invalid."),
- 0xC0000208: ("STATUS_INVALID_ADDRESS_WILDCARD","The transport rejected the specified network address due to invalid use of a wildcard."),
- 0xC0000209: ("STATUS_TOO_MANY_ADDRESSES","The transport address could not be opened because all the available addresses are in use."),
- 0xC000020A: ("STATUS_ADDRESS_ALREADY_EXISTS","The transport address could not be opened because it already exists."),
- 0xC000020B: ("STATUS_ADDRESS_CLOSED","The transport address is now closed."),
- 0xC000020C: ("STATUS_CONNECTION_DISCONNECTED","The transport connection is now disconnected."),
- 0xC000020D: ("STATUS_CONNECTION_RESET","The transport connection has been reset."),
- 0xC000020E: ("STATUS_TOO_MANY_NODES","The transport cannot dynamically acquire any more nodes."),
- 0xC000020F: ("STATUS_TRANSACTION_ABORTED","The transport aborted a pending transaction."),
- 0xC0000210: ("STATUS_TRANSACTION_TIMED_OUT","The transport timed out a request that is waiting for a response."),
- 0xC0000211: ("STATUS_TRANSACTION_NO_RELEASE","The transport did not receive a release for a pending response."),
- 0xC0000212: ("STATUS_TRANSACTION_NO_MATCH","The transport did not find a transaction that matches the specific token."),
- 0xC0000213: ("STATUS_TRANSACTION_RESPONDED","The transport had previously responded to a transaction request."),
- 0xC0000214: ("STATUS_TRANSACTION_INVALID_ID","The transport does not recognize the specified transaction request ID."),
- 0xC0000215: ("STATUS_TRANSACTION_INVALID_TYPE","The transport does not recognize the specified transaction request type."),
- 0xC0000216: ("STATUS_NOT_SERVER_SESSION","The transport can only process the specified request on the server side of a session."),
- 0xC0000217: ("STATUS_NOT_CLIENT_SESSION","The transport can only process the specified request on the client side of a session."),
- 0xC0000218: ("STATUS_CANNOT_LOAD_REGISTRY_FILE","{Registry File Failure} The registry cannot load the hive (file): %hs or its log or alternate. It is corrupt, absent, or not writable."),
- 0xC0000219: ("STATUS_DEBUG_ATTACH_FAILED","{Unexpected Failure in DebugActiveProcess} An unexpected failure occurred while processing a DebugActiveProcess API request. You may choose OK to terminate the process, or Cancel to ignore the error."),
- 0xC000021A: ("STATUS_SYSTEM_PROCESS_TERMINATED","{Fatal System Error} The %hs system process terminated unexpectedly with a status of 0x%08x (0x%08x 0x%08x). The system has been shut down."),
- 0xC000021B: ("STATUS_DATA_NOT_ACCEPTED","{Data Not Accepted} The TDI client could not handle the data received during an indication."),
- 0xC000021C: ("STATUS_NO_BROWSER_SERVERS_FOUND","{Unable to Retrieve Browser Server List} The list of servers for this workgroup is not currently available."),
- 0xC000021D: ("STATUS_VDM_HARD_ERROR","NTVDM encountered a hard error."),
- 0xC000021E: ("STATUS_DRIVER_CANCEL_TIMEOUT","{Cancel Timeout} The driver %hs failed to complete a canceled I/O request in the allotted time."),
- 0xC000021F: ("STATUS_REPLY_MESSAGE_MISMATCH","{Reply Message Mismatch} An attempt was made to reply to an LPC message, but the thread specified by the client ID in the message was not waiting on that message."),
- 0xC0000220: ("STATUS_MAPPED_ALIGNMENT","{Mapped View Alignment Incorrect} An attempt was made to map a view of a file, but either the specified base address or the offset into the file were not aligned on the proper allocation granularity."),
- 0xC0000221: ("STATUS_IMAGE_CHECKSUM_MISMATCH","{Bad Image Checksum} The image %hs is possibly corrupt. The header checksum does not match the computed checksum."),
- 0xC0000222: ("STATUS_LOST_WRITEBEHIND_DATA","{Delayed Write Failed} Windows was unable to save all the data for the file %hs. The data has been lost. This error may be caused by a failure of your computer hardware or network connection. Try to save this file elsewhere."),
- 0xC0000223: ("STATUS_CLIENT_SERVER_PARAMETERS_INVALID","The parameters passed to the server in the client/server shared memory window were invalid. Too much data may have been put in the shared memory window."),
- 0xC0000224: ("STATUS_PASSWORD_MUST_CHANGE","The user password must be changed before logging on the first time."),
- 0xC0000225: ("STATUS_NOT_FOUND","The object was not found."),
- 0xC0000226: ("STATUS_NOT_TINY_STREAM","The stream is not a tiny stream."),
- 0xC0000227: ("STATUS_RECOVERY_FAILURE","A transaction recovery failed."),
- 0xC0000228: ("STATUS_STACK_OVERFLOW_READ","The request must be handled by the stack overflow code."),
- 0xC0000229: ("STATUS_FAIL_CHECK","A consistency check failed."),
- 0xC000022A: ("STATUS_DUPLICATE_OBJECTID","The attempt to insert the ID in the index failed because the ID is already in the index."),
- 0xC000022B: ("STATUS_OBJECTID_EXISTS","The attempt to set the object ID failed because the object already has an ID."),
- 0xC000022C: ("STATUS_CONVERT_TO_LARGE","Internal OFS status codes indicating how an allocation operation is handled. Either it is retried after the containing oNode is moved or the extent stream is converted to a large stream."),
- 0xC000022D: ("STATUS_RETRY","The request needs to be retried."),
- 0xC000022E: ("STATUS_FOUND_OUT_OF_SCOPE","The attempt to find the object found an object on the volume that matches by ID; however, it is out of the scope of the handle that is used for the operation."),
- 0xC000022F: ("STATUS_ALLOCATE_BUCKET","The bucket array must be grown. Retry the transaction after doing so."),
- 0xC0000230: ("STATUS_PROPSET_NOT_FOUND","The specified property set does not exist on the object."),
- 0xC0000231: ("STATUS_MARSHALL_OVERFLOW","The user/kernel marshaling buffer has overflowed."),
- 0xC0000232: ("STATUS_INVALID_VARIANT","The supplied variant structure contains invalid data."),
- 0xC0000233: ("STATUS_DOMAIN_CONTROLLER_NOT_FOUND","A domain controller for this domain was not found."),
- 0xC0000234: ("STATUS_ACCOUNT_LOCKED_OUT","The user account has been automatically locked because too many invalid logon attempts or password change attempts have been requested."),
- 0xC0000235: ("STATUS_HANDLE_NOT_CLOSABLE","NtClose was called on a handle that was protected from close via NtSetInformationObject."),
- 0xC0000236: ("STATUS_CONNECTION_REFUSED","The transport-connection attempt was refused by the remote system."),
- 0xC0000237: ("STATUS_GRACEFUL_DISCONNECT","The transport connection was gracefully closed."),
- 0xC0000238: ("STATUS_ADDRESS_ALREADY_ASSOCIATED","The transport endpoint already has an address associated with it."),
- 0xC0000239: ("STATUS_ADDRESS_NOT_ASSOCIATED","An address has not yet been associated with the transport endpoint."),
- 0xC000023A: ("STATUS_CONNECTION_INVALID","An operation was attempted on a nonexistent transport connection."),
- 0xC000023B: ("STATUS_CONNECTION_ACTIVE","An invalid operation was attempted on an active transport connection."),
- 0xC000023C: ("STATUS_NETWORK_UNREACHABLE","The remote network is not reachable by the transport."),
- 0xC000023D: ("STATUS_HOST_UNREACHABLE","The remote system is not reachable by the transport."),
- 0xC000023E: ("STATUS_PROTOCOL_UNREACHABLE","The remote system does not support the transport protocol."),
- 0xC000023F: ("STATUS_PORT_UNREACHABLE","No service is operating at the destination port of the transport on the remote system."),
- 0xC0000240: ("STATUS_REQUEST_ABORTED","The request was aborted."),
- 0xC0000241: ("STATUS_CONNECTION_ABORTED","The transport connection was aborted by the local system."),
- 0xC0000242: ("STATUS_BAD_COMPRESSION_BUFFER","The specified buffer contains ill-formed data."),
- 0xC0000243: ("STATUS_USER_MAPPED_FILE","The requested operation cannot be performed on a file with a user mapped section open."),
- 0xC0000244: ("STATUS_AUDIT_FAILED","{Audit Failed} An attempt to generate a security audit failed."),
- 0xC0000245: ("STATUS_TIMER_RESOLUTION_NOT_SET","The timer resolution was not previously set by the current process."),
- 0xC0000246: ("STATUS_CONNECTION_COUNT_LIMIT","A connection to the server could not be made because the limit on the number of concurrent connections for this account has been reached."),
- 0xC0000247: ("STATUS_LOGIN_TIME_RESTRICTION","Attempting to log on during an unauthorized time of day for this account."),
- 0xC0000248: ("STATUS_LOGIN_WKSTA_RESTRICTION","The account is not authorized to log on from this station."),
- 0xC0000249: ("STATUS_IMAGE_MP_UP_MISMATCH","{UP/MP Image Mismatch} The image %hs has been modified for use on a uniprocessor system, but you are running it on a multiprocessor machine. Reinstall the image file."),
- 0xC0000250: ("STATUS_INSUFFICIENT_LOGON_INFO","There is insufficient account information to log you on."),
- 0xC0000251: ("STATUS_BAD_DLL_ENTRYPOINT","{Invalid DLL Entrypoint} The dynamic link library %hs is not written correctly. The stack pointer has been left in an inconsistent state. The entry point should be declared as WINAPI or STDCALL. Select YES to fail the DLL load. Select NO to continue execution. Selecting NO may cause the application to operate incorrectly."),
- 0xC0000252: ("STATUS_BAD_SERVICE_ENTRYPOINT","{Invalid Service Callback Entrypoint} The %hs service is not written correctly. The stack pointer has been left in an inconsistent state. The callback entry point should be declared as WINAPI or STDCALL. Selecting OK will cause the service to continue operation. However, the service process may operate incorrectly."),
- 0xC0000253: ("STATUS_LPC_REPLY_LOST","The server received the messages but did not send a reply."),
- 0xC0000254: ("STATUS_IP_ADDRESS_CONFLICT1","There is an IP address conflict with another system on the network."),
- 0xC0000255: ("STATUS_IP_ADDRESS_CONFLICT2","There is an IP address conflict with another system on the network."),
- 0xC0000256: ("STATUS_REGISTRY_QUOTA_LIMIT","{Low On Registry Space} The system has reached the maximum size that is allowed for the system part of the registry. Additional storage requests will be ignored."),
- 0xC0000257: ("STATUS_PATH_NOT_COVERED","The contacted server does not support the indicated part of the DFS namespace."),
- 0xC0000258: ("STATUS_NO_CALLBACK_ACTIVE","A callback return system service cannot be executed when no callback is active."),
- 0xC0000259: ("STATUS_LICENSE_QUOTA_EXCEEDED","The service being accessed is licensed for a particular number of connections. No more connections can be made to the service at this time because the service has already accepted the maximum number of connections."),
- 0xC000025A: ("STATUS_PWD_TOO_SHORT","The password provided is too short to meet the policy of your user account. Choose a longer password."),
- 0xC000025B: ("STATUS_PWD_TOO_RECENT","The policy of your user account does not allow you to change passwords too frequently. This is done to prevent users from changing back to a familiar, but potentially discovered, password. If you feel your password has been compromised, contact your administrator immediately to have a new one assigned."),
- 0xC000025C: ("STATUS_PWD_HISTORY_CONFLICT","You have attempted to change your password to one that you have used in the past. The policy of your user account does not allow this. Select a password that you have not previously used."),
- 0xC000025E: ("STATUS_PLUGPLAY_NO_DEVICE","You have attempted to load a legacy device driver while its device instance had been disabled."),
- 0xC000025F: ("STATUS_UNSUPPORTED_COMPRESSION","The specified compression format is unsupported."),
- 0xC0000260: ("STATUS_INVALID_HW_PROFILE","The specified hardware profile configuration is invalid."),
- 0xC0000261: ("STATUS_INVALID_PLUGPLAY_DEVICE_PATH","The specified Plug and Play registry device path is invalid."),
- 0xC0000262: ("STATUS_DRIVER_ORDINAL_NOT_FOUND","{Driver Entry Point Not Found} The %hs device driver could not locate the ordinal %ld in driver %hs."),
- 0xC0000263: ("STATUS_DRIVER_ENTRYPOINT_NOT_FOUND","{Driver Entry Point Not Found} The %hs device driver could not locate the entry point %hs in driver %hs."),
- 0xC0000264: ("STATUS_RESOURCE_NOT_OWNED","{Application Error} The application attempted to release a resource it did not own. Click OK to terminate the application."),
- 0xC0000265: ("STATUS_TOO_MANY_LINKS","An attempt was made to create more links on a file than the file system supports."),
- 0xC0000266: ("STATUS_QUOTA_LIST_INCONSISTENT","The specified quota list is internally inconsistent with its descriptor."),
- 0xC0000267: ("STATUS_FILE_IS_OFFLINE","The specified file has been relocated to offline storage."),
- 0xC0000268: ("STATUS_EVALUATION_EXPIRATION","{Windows Evaluation Notification} The evaluation period for this installation of Windows has expired. This system will shutdown in 1 hour. To restore access to this installation of Windows, upgrade this installation by using a licensed distribution of this product."),
- 0xC0000269: ("STATUS_ILLEGAL_DLL_RELOCATION","{Illegal System DLL Relocation} The system DLL %hs was relocated in memory. The application will not run properly. The relocation occurred because the DLL %hs occupied an address range that is reserved for Windows system DLLs. The vendor supplying the DLL should be contacted for a new DLL."),
- 0xC000026A: ("STATUS_LICENSE_VIOLATION","{License Violation} The system has detected tampering with your registered product type. This is a violation of your software license. Tampering with the product type is not permitted."),
- 0xC000026B: ("STATUS_DLL_INIT_FAILED_LOGOFF","{DLL Initialization Failed} The application failed to initialize because the window station is shutting down."),
- 0xC000026C: ("STATUS_DRIVER_UNABLE_TO_LOAD","{Unable to Load Device Driver} %hs device driver could not be loaded. Error Status was 0x%x."),
- 0xC000026D: ("STATUS_DFS_UNAVAILABLE","DFS is unavailable on the contacted server."),
- 0xC000026E: ("STATUS_VOLUME_DISMOUNTED","An operation was attempted to a volume after it was dismounted."),
- 0xC000026F: ("STATUS_WX86_INTERNAL_ERROR","An internal error occurred in the Win32 x86 emulation subsystem."),
- 0xC0000270: ("STATUS_WX86_FLOAT_STACK_CHECK","Win32 x86 emulation subsystem floating-point stack check."),
- 0xC0000271: ("STATUS_VALIDATE_CONTINUE","The validation process needs to continue on to the next step."),
- 0xC0000272: ("STATUS_NO_MATCH","There was no match for the specified key in the index."),
- 0xC0000273: ("STATUS_NO_MORE_MATCHES","There are no more matches for the current index enumeration."),
- 0xC0000275: ("STATUS_NOT_A_REPARSE_POINT","The NTFS file or directory is not a reparse point."),
- 0xC0000276: ("STATUS_IO_REPARSE_TAG_INVALID","The Windows I/O reparse tag passed for the NTFS reparse point is invalid."),
- 0xC0000277: ("STATUS_IO_REPARSE_TAG_MISMATCH","The Windows I/O reparse tag does not match the one that is in the NTFS reparse point."),
- 0xC0000278: ("STATUS_IO_REPARSE_DATA_INVALID","The user data passed for the NTFS reparse point is invalid."),
- 0xC0000279: ("STATUS_IO_REPARSE_TAG_NOT_HANDLED","The layered file system driver for this I/O tag did not handle it when needed."),
- 0xC0000280: ("STATUS_REPARSE_POINT_NOT_RESOLVED","The NTFS symbolic link could not be resolved even though the initial file name is valid."),
- 0xC0000281: ("STATUS_DIRECTORY_IS_A_REPARSE_POINT","The NTFS directory is a reparse point."),
- 0xC0000282: ("STATUS_RANGE_LIST_CONFLICT","The range could not be added to the range list because of a conflict."),
- 0xC0000283: ("STATUS_SOURCE_ELEMENT_EMPTY","The specified medium changer source element contains no media."),
- 0xC0000284: ("STATUS_DESTINATION_ELEMENT_FULL","The specified medium changer destination element already contains media."),
- 0xC0000285: ("STATUS_ILLEGAL_ELEMENT_ADDRESS","The specified medium changer element does not exist."),
- 0xC0000286: ("STATUS_MAGAZINE_NOT_PRESENT","The specified element is contained in a magazine that is no longer present."),
- 0xC0000287: ("STATUS_REINITIALIZATION_NEEDED","The device requires re-initialization due to hardware errors."),
- 0xC000028A: ("STATUS_ENCRYPTION_FAILED","The file encryption attempt failed."),
- 0xC000028B: ("STATUS_DECRYPTION_FAILED","The file decryption attempt failed."),
- 0xC000028C: ("STATUS_RANGE_NOT_FOUND","The specified range could not be found in the range list."),
- 0xC000028D: ("STATUS_NO_RECOVERY_POLICY","There is no encryption recovery policy configured for this system."),
- 0xC000028E: ("STATUS_NO_EFS","The required encryption driver is not loaded for this system."),
- 0xC000028F: ("STATUS_WRONG_EFS","The file was encrypted with a different encryption driver than is currently loaded."),
- 0xC0000290: ("STATUS_NO_USER_KEYS","There are no EFS keys defined for the user."),
- 0xC0000291: ("STATUS_FILE_NOT_ENCRYPTED","The specified file is not encrypted."),
- 0xC0000292: ("STATUS_NOT_EXPORT_FORMAT","The specified file is not in the defined EFS export format."),
- 0xC0000293: ("STATUS_FILE_ENCRYPTED","The specified file is encrypted and the user does not have the ability to decrypt it."),
- 0xC0000295: ("STATUS_WMI_GUID_NOT_FOUND","The GUID passed was not recognized as valid by a WMI data provider."),
- 0xC0000296: ("STATUS_WMI_INSTANCE_NOT_FOUND","The instance name passed was not recognized as valid by a WMI data provider."),
- 0xC0000297: ("STATUS_WMI_ITEMID_NOT_FOUND","The data item ID passed was not recognized as valid by a WMI data provider."),
- 0xC0000298: ("STATUS_WMI_TRY_AGAIN","The WMI request could not be completed and should be retried."),
- 0xC0000299: ("STATUS_SHARED_POLICY","The policy object is shared and can only be modified at the root."),
- 0xC000029A: ("STATUS_POLICY_OBJECT_NOT_FOUND","The policy object does not exist when it should."),
- 0xC000029B: ("STATUS_POLICY_ONLY_IN_DS","The requested policy information only lives in the Ds."),
- 0xC000029C: ("STATUS_VOLUME_NOT_UPGRADED","The volume must be upgraded to enable this feature."),
- 0xC000029D: ("STATUS_REMOTE_STORAGE_NOT_ACTIVE","The remote storage service is not operational at this time."),
- 0xC000029E: ("STATUS_REMOTE_STORAGE_MEDIA_ERROR","The remote storage service encountered a media error."),
- 0xC000029F: ("STATUS_NO_TRACKING_SERVICE","The tracking (workstation) service is not running."),
- 0xC00002A0: ("STATUS_SERVER_SID_MISMATCH","The server process is running under a SID that is different from the SID that is required by client."),
- 0xC00002A1: ("STATUS_DS_NO_ATTRIBUTE_OR_VALUE","The specified directory service attribute or value does not exist."),
- 0xC00002A2: ("STATUS_DS_INVALID_ATTRIBUTE_SYNTAX","The attribute syntax specified to the directory service is invalid."),
- 0xC00002A3: ("STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED","The attribute type specified to the directory service is not defined."),
- 0xC00002A4: ("STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS","The specified directory service attribute or value already exists."),
- 0xC00002A5: ("STATUS_DS_BUSY","The directory service is busy."),
- 0xC00002A6: ("STATUS_DS_UNAVAILABLE","The directory service is unavailable."),
- 0xC00002A7: ("STATUS_DS_NO_RIDS_ALLOCATED","The directory service was unable to allocate a relative identifier."),
- 0xC00002A8: ("STATUS_DS_NO_MORE_RIDS","The directory service has exhausted the pool of relative identifiers."),
- 0xC00002A9: ("STATUS_DS_INCORRECT_ROLE_OWNER","The requested operation could not be performed because the directory service is not the master for that type of operation."),
- 0xC00002AA: ("STATUS_DS_RIDMGR_INIT_ERROR","The directory service was unable to initialize the subsystem that allocates relative identifiers."),
- 0xC00002AB: ("STATUS_DS_OBJ_CLASS_VIOLATION","The requested operation did not satisfy one or more constraints that are associated with the class of the object."),
- 0xC00002AC: ("STATUS_DS_CANT_ON_NON_LEAF","The directory service can perform the requested operation only on a leaf object."),
- 0xC00002AD: ("STATUS_DS_CANT_ON_RDN","The directory service cannot perform the requested operation on the Relatively Defined Name (RDN) attribute of an object."),
- 0xC00002AE: ("STATUS_DS_CANT_MOD_OBJ_CLASS","The directory service detected an attempt to modify the object class of an object."),
- 0xC00002AF: ("STATUS_DS_CROSS_DOM_MOVE_FAILED","An error occurred while performing a cross domain move operation."),
- 0xC00002B0: ("STATUS_DS_GC_NOT_AVAILABLE","Unable to contact the global catalog server."),
- 0xC00002B1: ("STATUS_DIRECTORY_SERVICE_REQUIRED","The requested operation requires a directory service, and none was available."),
- 0xC00002B2: ("STATUS_REPARSE_ATTRIBUTE_CONFLICT","The reparse attribute cannot be set because it is incompatible with an existing attribute."),
- 0xC00002B3: ("STATUS_CANT_ENABLE_DENY_ONLY","A group marked \"use for deny only\" cannot be enabled."),
- 0xC00002B4: ("STATUS_FLOAT_MULTIPLE_FAULTS","{EXCEPTION} Multiple floating-point faults."),
- 0xC00002B5: ("STATUS_FLOAT_MULTIPLE_TRAPS","{EXCEPTION} Multiple floating-point traps."),
- 0xC00002B6: ("STATUS_DEVICE_REMOVED","The device has been removed."),
- 0xC00002B7: ("STATUS_JOURNAL_DELETE_IN_PROGRESS","The volume change journal is being deleted."),
- 0xC00002B8: ("STATUS_JOURNAL_NOT_ACTIVE","The volume change journal is not active."),
- 0xC00002B9: ("STATUS_NOINTERFACE","The requested interface is not supported."),
- 0xC00002C1: ("STATUS_DS_ADMIN_LIMIT_EXCEEDED","A directory service resource limit has been exceeded."),
- 0xC00002C2: ("STATUS_DRIVER_FAILED_SLEEP","{System Standby Failed} The driver %hs does not support standby mode. Updating this driver may allow the system to go to standby mode."),
- 0xC00002C3: ("STATUS_MUTUAL_AUTHENTICATION_FAILED","Mutual Authentication failed. The server password is out of date at the domain controller."),
- 0xC00002C4: ("STATUS_CORRUPT_SYSTEM_FILE","The system file %1 has become corrupt and has been replaced."),
- 0xC00002C5: ("STATUS_DATATYPE_MISALIGNMENT_ERROR","{EXCEPTION} Alignment Error A data type misalignment error was detected in a load or store instruction."),
- 0xC00002C6: ("STATUS_WMI_READ_ONLY","The WMI data item or data block is read-only."),
- 0xC00002C7: ("STATUS_WMI_SET_FAILURE","The WMI data item or data block could not be changed."),
- 0xC00002C8: ("STATUS_COMMITMENT_MINIMUM","{Virtual Memory Minimum Too Low} Your system is low on virtual memory. Windows is increasing the size of your virtual memory paging file. During this process, memory requests for some applications may be denied. For more information, see Help."),
- 0xC00002C9: ("STATUS_REG_NAT_CONSUMPTION","{EXCEPTION} Register NaT consumption faults. A NaT value is consumed on a non-speculative instruction."),
- 0xC00002CA: ("STATUS_TRANSPORT_FULL","The transport element of the medium changer contains media, which is causing the operation to fail."),
- 0xC00002CB: ("STATUS_DS_SAM_INIT_FAILURE","Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Directory Services Restore Mode. Check the event log for more detailed information."),
- 0xC00002CC: ("STATUS_ONLY_IF_CONNECTED","This operation is supported only when you are connected to the server."),
- 0xC00002CD: ("STATUS_DS_SENSITIVE_GROUP_VIOLATION","Only an administrator can modify the membership list of an administrative group."),
- 0xC00002CE: ("STATUS_PNP_RESTART_ENUMERATION","A device was removed so enumeration must be restarted."),
- 0xC00002CF: ("STATUS_JOURNAL_ENTRY_DELETED","The journal entry has been deleted from the journal."),
- 0xC00002D0: ("STATUS_DS_CANT_MOD_PRIMARYGROUPID","Cannot change the primary group ID of a domain controller account."),
- 0xC00002D1: ("STATUS_SYSTEM_IMAGE_BAD_SIGNATURE","{Fatal System Error} The system image %s is not properly signed. The file has been replaced with the signed file. The system has been shut down."),
- 0xC00002D2: ("STATUS_PNP_REBOOT_REQUIRED","The device will not start without a reboot."),
- 0xC00002D3: ("STATUS_POWER_STATE_INVALID","The power state of the current device cannot support this request."),
- 0xC00002D4: ("STATUS_DS_INVALID_GROUP_TYPE","The specified group type is invalid."),
- 0xC00002D5: ("STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN","In a mixed domain, no nesting of a global group if the group is security enabled."),
- 0xC00002D6: ("STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN","In a mixed domain, cannot nest local groups with other local groups, if the group is security enabled."),
- 0xC00002D7: ("STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER","A global group cannot have a local group as a member."),
- 0xC00002D8: ("STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER","A global group cannot have a universal group as a member."),
- 0xC00002D9: ("STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER","A universal group cannot have a local group as a member."),
- 0xC00002DA: ("STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER","A global group cannot have a cross-domain member."),
- 0xC00002DB: ("STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER","A local group cannot have another cross-domain local group as a member."),
- 0xC00002DC: ("STATUS_DS_HAVE_PRIMARY_MEMBERS","Cannot change to a security-disabled group because primary members are in this group."),
- 0xC00002DD: ("STATUS_WMI_NOT_SUPPORTED","The WMI operation is not supported by the data block or method."),
- 0xC00002DE: ("STATUS_INSUFFICIENT_POWER","There is not enough power to complete the requested operation."),
- 0xC00002DF: ("STATUS_SAM_NEED_BOOTKEY_PASSWORD","The Security Accounts Manager needs to get the boot password."),
- 0xC00002E0: ("STATUS_SAM_NEED_BOOTKEY_FLOPPY","The Security Accounts Manager needs to get the boot key from the floppy disk."),
- 0xC00002E1: ("STATUS_DS_CANT_START","The directory service cannot start."),
- 0xC00002E2: ("STATUS_DS_INIT_FAILURE","The directory service could not start because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Directory Services Restore Mode. Check the event log for more detailed information."),
- 0xC00002E3: ("STATUS_SAM_INIT_FAILURE","The Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Safe Mode. Check the event log for more detailed information."),
- 0xC00002E4: ("STATUS_DS_GC_REQUIRED","The requested operation can be performed only on a global catalog server."),
- 0xC00002E5: ("STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY","A local group can only be a member of other local groups in the same domain."),
- 0xC00002E6: ("STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS","Foreign security principals cannot be members of universal groups."),
- 0xC00002E7: ("STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED","Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased."),
- 0xC00002E9: ("STATUS_CURRENT_DOMAIN_NOT_ALLOWED","This operation cannot be performed on the current domain."),
- 0xC00002EA: ("STATUS_CANNOT_MAKE","The directory or file cannot be created."),
- 0xC00002EB: ("STATUS_SYSTEM_SHUTDOWN","The system is in the process of shutting down."),
- 0xC00002EC: ("STATUS_DS_INIT_FAILURE_CONSOLE","Directory Services could not start because of the following error: %hs Error Status: 0x%x. Click OK to shut down the system. You can use the recovery console to diagnose the system further."),
- 0xC00002ED: ("STATUS_DS_SAM_INIT_FAILURE_CONSOLE","Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down the system. You can use the recovery console to diagnose the system further."),
- 0xC00002EE: ("STATUS_UNFINISHED_CONTEXT_DELETED","A security context was deleted before the context was completed. This is considered a logon failure."),
- 0xC00002EF: ("STATUS_NO_TGT_REPLY","The client is trying to negotiate a context and the server requires user-to-user but did not send a TGT reply."),
- 0xC00002F0: ("STATUS_OBJECTID_NOT_FOUND","An object ID was not found in the file."),
- 0xC00002F1: ("STATUS_NO_IP_ADDRESSES","Unable to accomplish the requested task because the local machine does not have any IP addresses."),
- 0xC00002F2: ("STATUS_WRONG_CREDENTIAL_HANDLE","The supplied credential handle does not match the credential that is associated with the security context."),
- 0xC00002F3: ("STATUS_CRYPTO_SYSTEM_INVALID","The crypto system or checksum function is invalid because a required function is unavailable."),
- 0xC00002F4: ("STATUS_MAX_REFERRALS_EXCEEDED","The number of maximum ticket referrals has been exceeded."),
- 0xC00002F5: ("STATUS_MUST_BE_KDC","The local machine must be a Kerberos KDC (domain controller) and it is not."),
- 0xC00002F6: ("STATUS_STRONG_CRYPTO_NOT_SUPPORTED","The other end of the security negotiation requires strong crypto but it is not supported on the local machine."),
- 0xC00002F7: ("STATUS_TOO_MANY_PRINCIPALS","The KDC reply contained more than one principal name."),
- 0xC00002F8: ("STATUS_NO_PA_DATA","Expected to find PA data for a hint of what etype to use, but it was not found."),
- 0xC00002F9: ("STATUS_PKINIT_NAME_MISMATCH","The client certificate does not contain a valid UPN, or does not match the client name in the logon request. Contact your administrator."),
- 0xC00002FA: ("STATUS_SMARTCARD_LOGON_REQUIRED","Smart card logon is required and was not used."),
- 0xC00002FB: ("STATUS_KDC_INVALID_REQUEST","An invalid request was sent to the KDC."),
- 0xC00002FC: ("STATUS_KDC_UNABLE_TO_REFER","The KDC was unable to generate a referral for the service requested."),
- 0xC00002FD: ("STATUS_KDC_UNKNOWN_ETYPE","The encryption type requested is not supported by the KDC."),
- 0xC00002FE: ("STATUS_SHUTDOWN_IN_PROGRESS","A system shutdown is in progress."),
- 0xC00002FF: ("STATUS_SERVER_SHUTDOWN_IN_PROGRESS","The server machine is shutting down."),
- 0xC0000300: ("STATUS_NOT_SUPPORTED_ON_SBS","This operation is not supported on a computer running Windows Server 2003 for Small Business Server."),
- 0xC0000301: ("STATUS_WMI_GUID_DISCONNECTED","The WMI GUID is no longer available."),
- 0xC0000302: ("STATUS_WMI_ALREADY_DISABLED","Collection or events for the WMI GUID is already disabled."),
- 0xC0000303: ("STATUS_WMI_ALREADY_ENABLED","Collection or events for the WMI GUID is already enabled."),
- 0xC0000304: ("STATUS_MFT_TOO_FRAGMENTED","The master file table on the volume is too fragmented to complete this operation."),
- 0xC0000305: ("STATUS_COPY_PROTECTION_FAILURE","Copy protection failure."),
- 0xC0000306: ("STATUS_CSS_AUTHENTICATION_FAILURE","Copy protection error-DVD CSS Authentication failed."),
- 0xC0000307: ("STATUS_CSS_KEY_NOT_PRESENT","Copy protection error-The specified sector does not contain a valid key."),
- 0xC0000308: ("STATUS_CSS_KEY_NOT_ESTABLISHED","Copy protection error-DVD session key not established."),
- 0xC0000309: ("STATUS_CSS_SCRAMBLED_SECTOR","Copy protection error-The read failed because the sector is encrypted."),
- 0xC000030A: ("STATUS_CSS_REGION_MISMATCH","Copy protection error-The region of the specified DVD does not correspond to the region setting of the drive."),
- 0xC000030B: ("STATUS_CSS_RESETS_EXHAUSTED","Copy protection error-The region setting of the drive may be permanent."),
- 0xC0000320: ("STATUS_PKINIT_FAILURE","The Kerberos protocol encountered an error while validating the KDC certificate during smart card logon. There is more information in the system event log."),
- 0xC0000321: ("STATUS_SMARTCARD_SUBSYSTEM_FAILURE","The Kerberos protocol encountered an error while attempting to use the smart card subsystem."),
- 0xC0000322: ("STATUS_NO_KERB_KEY","The target server does not have acceptable Kerberos credentials."),
- 0xC0000350: ("STATUS_HOST_DOWN","The transport determined that the remote system is down."),
- 0xC0000351: ("STATUS_UNSUPPORTED_PREAUTH","An unsupported pre-authentication mechanism was presented to the Kerberos package."),
- 0xC0000352: ("STATUS_EFS_ALG_BLOB_TOO_BIG","The encryption algorithm that is used on the source file needs a bigger key buffer than the one that is used on the destination file."),
- 0xC0000353: ("STATUS_PORT_NOT_SET","An attempt to remove a processes DebugPort was made, but a port was not already associated with the process."),
- 0xC0000354: ("STATUS_DEBUGGER_INACTIVE","An attempt to do an operation on a debug port failed because the port is in the process of being deleted."),
- 0xC0000355: ("STATUS_DS_VERSION_CHECK_FAILURE","This version of Windows is not compatible with the behavior version of the directory forest, domain, or domain controller."),
- 0xC0000356: ("STATUS_AUDITING_DISABLED","The specified event is currently not being audited."),
- 0xC0000357: ("STATUS_PRENT4_MACHINE_ACCOUNT","The machine account was created prior to Windows NT 4.0. The account needs to be recreated."),
- 0xC0000358: ("STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER","An account group cannot have a universal group as a member."),
- 0xC0000359: ("STATUS_INVALID_IMAGE_WIN_32","The specified image file did not have the correct format; it appears to be a 32-bit Windows image."),
- 0xC000035A: ("STATUS_INVALID_IMAGE_WIN_64","The specified image file did not have the correct format; it appears to be a 64-bit Windows image."),
- 0xC000035B: ("STATUS_BAD_BINDINGS","The client's supplied SSPI channel bindings were incorrect."),
- 0xC000035C: ("STATUS_NETWORK_SESSION_EXPIRED","The client session has expired; so the client must re-authenticate to continue accessing the remote resources."),
- 0xC000035D: ("STATUS_APPHELP_BLOCK","The AppHelp dialog box canceled; thus preventing the application from starting."),
- 0xC000035E: ("STATUS_ALL_SIDS_FILTERED","The SID filtering operation removed all SIDs."),
- 0xC000035F: ("STATUS_NOT_SAFE_MODE_DRIVER","The driver was not loaded because the system is starting in safe mode."),
- 0xC0000361: ("STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT","Access to %1 has been restricted by your Administrator by the default software restriction policy level."),
- 0xC0000362: ("STATUS_ACCESS_DISABLED_BY_POLICY_PATH","Access to %1 has been restricted by your Administrator by location with policy rule %2 placed on path %3."),
- 0xC0000363: ("STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER","Access to %1 has been restricted by your Administrator by software publisher policy."),
- 0xC0000364: ("STATUS_ACCESS_DISABLED_BY_POLICY_OTHER","Access to %1 has been restricted by your Administrator by policy rule %2."),
- 0xC0000365: ("STATUS_FAILED_DRIVER_ENTRY","The driver was not loaded because it failed its initialization call."),
- 0xC0000366: ("STATUS_DEVICE_ENUMERATION_ERROR","The device encountered an error while applying power or reading the device configuration. This may be caused by a failure of your hardware or by a poor connection."),
- 0xC0000368: ("STATUS_MOUNT_POINT_NOT_RESOLVED","The create operation failed because the name contained at least one mount point that resolves to a volume to which the specified device object is not attached."),
- 0xC0000369: ("STATUS_INVALID_DEVICE_OBJECT_PARAMETER","The device object parameter is either not a valid device object or is not attached to the volume that is specified by the file name."),
- 0xC000036A: ("STATUS_MCA_OCCURED","A machine check error has occurred. Check the system event log for additional information."),
- 0xC000036B: ("STATUS_DRIVER_BLOCKED_CRITICAL","Driver %2 has been blocked from loading."),
- 0xC000036C: ("STATUS_DRIVER_BLOCKED","Driver %2 has been blocked from loading."),
- 0xC000036D: ("STATUS_DRIVER_DATABASE_ERROR","There was error [%2] processing the driver database."),
- 0xC000036E: ("STATUS_SYSTEM_HIVE_TOO_LARGE","System hive size has exceeded its limit."),
- 0xC000036F: ("STATUS_INVALID_IMPORT_OF_NON_DLL","A dynamic link library (DLL) referenced a module that was neither a DLL nor the process's executable image."),
- 0xC0000371: ("STATUS_NO_SECRETS","The local account store does not contain secret material for the specified account."),
- 0xC0000372: ("STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY","Access to %1 has been restricted by your Administrator by policy rule %2."),
- 0xC0000373: ("STATUS_FAILED_STACK_SWITCH","The system was not able to allocate enough memory to perform a stack switch."),
- 0xC0000374: ("STATUS_HEAP_CORRUPTION","A heap has been corrupted."),
- 0xC0000380: ("STATUS_SMARTCARD_WRONG_PIN","An incorrect PIN was presented to the smart card."),
- 0xC0000381: ("STATUS_SMARTCARD_CARD_BLOCKED","The smart card is blocked."),
- 0xC0000382: ("STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED","No PIN was presented to the smart card."),
- 0xC0000383: ("STATUS_SMARTCARD_NO_CARD","No smart card is available."),
- 0xC0000384: ("STATUS_SMARTCARD_NO_KEY_CONTAINER","The requested key container does not exist on the smart card."),
- 0xC0000385: ("STATUS_SMARTCARD_NO_CERTIFICATE","The requested certificate does not exist on the smart card."),
- 0xC0000386: ("STATUS_SMARTCARD_NO_KEYSET","The requested keyset does not exist."),
- 0xC0000387: ("STATUS_SMARTCARD_IO_ERROR","A communication error with the smart card has been detected."),
- 0xC0000388: ("STATUS_DOWNGRADE_DETECTED","The system detected a possible attempt to compromise security. Ensure that you can contact the server that authenticated you."),
- 0xC0000389: ("STATUS_SMARTCARD_CERT_REVOKED","The smart card certificate used for authentication has been revoked. Contact your system administrator. There may be additional information in the event log."),
- 0xC000038A: ("STATUS_ISSUING_CA_UNTRUSTED","An untrusted certificate authority was detected while processing the smart card certificate that is used for authentication. Contact your system administrator."),
- 0xC000038B: ("STATUS_REVOCATION_OFFLINE_C","The revocation status of the smart card certificate that is used for authentication could not be determined. Contact your system administrator."),
- 0xC000038C: ("STATUS_PKINIT_CLIENT_FAILURE","The smart card certificate used for authentication was not trusted. Contact your system administrator."),
- 0xC000038D: ("STATUS_SMARTCARD_CERT_EXPIRED","The smart card certificate used for authentication has expired. Contact your system administrator."),
- 0xC000038E: ("STATUS_DRIVER_FAILED_PRIOR_UNLOAD","The driver could not be loaded because a previous version of the driver is still in memory."),
- 0xC000038F: ("STATUS_SMARTCARD_SILENT_CONTEXT","The smart card provider could not perform the action because the context was acquired as silent."),
- 0xC0000401: ("STATUS_PER_USER_TRUST_QUOTA_EXCEEDED","The delegated trust creation quota of the current user has been exceeded."),
- 0xC0000402: ("STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED","The total delegated trust creation quota has been exceeded."),
- 0xC0000403: ("STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED","The delegated trust deletion quota of the current user has been exceeded."),
- 0xC0000404: ("STATUS_DS_NAME_NOT_UNIQUE","The requested name already exists as a unique identifier."),
- 0xC0000405: ("STATUS_DS_DUPLICATE_ID_FOUND","The requested object has a non-unique identifier and cannot be retrieved."),
- 0xC0000406: ("STATUS_DS_GROUP_CONVERSION_ERROR","The group cannot be converted due to attribute restrictions on the requested group type."),
- 0xC0000407: ("STATUS_VOLSNAP_PREPARE_HIBERNATE","{Volume Shadow Copy Service} Wait while the Volume Shadow Copy Service prepares volume %hs for hibernation."),
- 0xC0000408: ("STATUS_USER2USER_REQUIRED","Kerberos sub-protocol User2User is required."),
- 0xC0000409: ("STATUS_STACK_BUFFER_OVERRUN","The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application."),
- 0xC000040A: ("STATUS_NO_S4U_PROT_SUPPORT","The Kerberos subsystem encountered an error. A service for user protocol request was made against a domain controller which does not support service for user."),
- 0xC000040B: ("STATUS_CROSSREALM_DELEGATION_FAILURE","An attempt was made by this server to make a Kerberos constrained delegation request for a target that is outside the server realm. This action is not supported and the resulting error indicates a misconfiguration on the allowed-to-delegate-to list for this server. Contact your administrator."),
- 0xC000040C: ("STATUS_REVOCATION_OFFLINE_KDC","The revocation status of the domain controller certificate used for smart card authentication could not be determined. There is additional information in the system event log. Contact your system administrator."),
- 0xC000040D: ("STATUS_ISSUING_CA_UNTRUSTED_KDC","An untrusted certificate authority was detected while processing the domain controller certificate used for authentication. There is additional information in the system event log. Contact your system administrator."),
- 0xC000040E: ("STATUS_KDC_CERT_EXPIRED","The domain controller certificate used for smart card logon has expired. Contact your system administrator with the contents of your system event log."),
- 0xC000040F: ("STATUS_KDC_CERT_REVOKED","The domain controller certificate used for smart card logon has been revoked. Contact your system administrator with the contents of your system event log."),
- 0xC0000410: ("STATUS_PARAMETER_QUOTA_EXCEEDED","Data present in one of the parameters is more than the function can operate on."),
- 0xC0000411: ("STATUS_HIBERNATION_FAILURE","The system has failed to hibernate (The error code is %hs). Hibernation will be disabled until the system is restarted."),
- 0xC0000412: ("STATUS_DELAY_LOAD_FAILED","An attempt to delay-load a .dll or get a function address in a delay-loaded .dll failed."),
- 0xC0000413: ("STATUS_AUTHENTICATION_FIREWALL_FAILED","Logon Failure: The machine you are logging onto is protected by an authentication firewall. The specified account is not allowed to authenticate to the machine."),
- 0xC0000414: ("STATUS_VDM_DISALLOWED","%hs is a 16-bit application. You do not have permissions to execute 16-bit applications. Check your permissions with your system administrator."),
- 0xC0000415: ("STATUS_HUNG_DISPLAY_DRIVER_THREAD","{Display Driver Stopped Responding} The %hs display driver has stopped working normally. Save your work and reboot the system to restore full display functionality. The next time you reboot the machine a dialog will be displayed giving you a chance to report this failure to Microsoft."),
- 0xC0000416: ("STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE","The Desktop heap encountered an error while allocating session memory. There is more information in the system event log."),
- 0xC0000417: ("STATUS_INVALID_CRUNTIME_PARAMETER","An invalid parameter was passed to a C runtime function."),
- 0xC0000418: ("STATUS_NTLM_BLOCKED","The authentication failed because NTLM was blocked."),
- 0xC0000419: ("STATUS_DS_SRC_SID_EXISTS_IN_FOREST","The source object's SID already exists in destination forest."),
- 0xC000041A: ("STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST","The domain name of the trusted domain already exists in the forest."),
- 0xC000041B: ("STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST","The flat name of the trusted domain already exists in the forest."),
- 0xC000041C: ("STATUS_INVALID_USER_PRINCIPAL_NAME","The User Principal Name (UPN) is invalid."),
- 0xC0000420: ("STATUS_ASSERTION_FAILURE","There has been an assertion failure."),
- 0xC0000421: ("STATUS_VERIFIER_STOP","Application verifier has found an error in the current process."),
- 0xC0000423: ("STATUS_CALLBACK_POP_STACK","A user mode unwind is in progress."),
- 0xC0000424: ("STATUS_INCOMPATIBLE_DRIVER_BLOCKED","%2 has been blocked from loading due to incompatibility with this system. Contact your software vendor for a compatible version of the driver."),
- 0xC0000425: ("STATUS_HIVE_UNLOADED","Illegal operation attempted on a registry key which has already been unloaded."),
- 0xC0000426: ("STATUS_COMPRESSION_DISABLED","Compression is disabled for this volume."),
- 0xC0000427: ("STATUS_FILE_SYSTEM_LIMITATION","The requested operation could not be completed due to a file system limitation."),
- 0xC0000428: ("STATUS_INVALID_IMAGE_HASH","The hash for image %hs cannot be found in the system catalogs. The image is likely corrupt or the victim of tampering."),
- 0xC0000429: ("STATUS_NOT_CAPABLE","The implementation is not capable of performing the request."),
- 0xC000042A: ("STATUS_REQUEST_OUT_OF_SEQUENCE","The requested operation is out of order with respect to other operations."),
- 0xC000042B: ("STATUS_IMPLEMENTATION_LIMIT","An operation attempted to exceed an implementation-defined limit."),
- 0xC000042C: ("STATUS_ELEVATION_REQUIRED","The requested operation requires elevation."),
- 0xC000042D: ("STATUS_NO_SECURITY_CONTEXT","The required security context does not exist."),
- 0xC000042E: ("STATUS_PKU2U_CERT_FAILURE","The PKU2U protocol encountered an error while attempting to utilize the associated certificates."),
- 0xC0000432: ("STATUS_BEYOND_VDL","The operation was attempted beyond the valid data length of the file."),
- 0xC0000433: ("STATUS_ENCOUNTERED_WRITE_IN_PROGRESS","The attempted write operation encountered a write already in progress for some portion of the range."),
- 0xC0000434: ("STATUS_PTE_CHANGED","The page fault mappings changed in the middle of processing a fault so the operation must be retried."),
- 0xC0000435: ("STATUS_PURGE_FAILED","The attempt to purge this file from memory failed to purge some or all the data from memory."),
- 0xC0000440: ("STATUS_CRED_REQUIRES_CONFIRMATION","The requested credential requires confirmation."),
- 0xC0000441: ("STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE","The remote server sent an invalid response for a file being opened with Client Side Encryption."),
- 0xC0000442: ("STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER","Client Side Encryption is not supported by the remote server even though it claims to support it."),
- 0xC0000443: ("STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE","File is encrypted and should be opened in Client Side Encryption mode."),
- 0xC0000444: ("STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE","A new encrypted file is being created and a $EFS needs to be provided."),
- 0xC0000445: ("STATUS_CS_ENCRYPTION_FILE_NOT_CSE","The SMB client requested a CSE FSCTL on a non-CSE file."),
- 0xC0000446: ("STATUS_INVALID_LABEL","Indicates a particular Security ID may not be assigned as the label of an object."),
- 0xC0000450: ("STATUS_DRIVER_PROCESS_TERMINATED","The process hosting the driver for this device has terminated."),
- 0xC0000451: ("STATUS_AMBIGUOUS_SYSTEM_DEVICE","The requested system device cannot be identified due to multiple indistinguishable devices potentially matching the identification criteria."),
- 0xC0000452: ("STATUS_SYSTEM_DEVICE_NOT_FOUND","The requested system device cannot be found."),
- 0xC0000453: ("STATUS_RESTART_BOOT_APPLICATION","This boot application must be restarted."),
- 0xC0000454: ("STATUS_INSUFFICIENT_NVRAM_RESOURCES","Insufficient NVRAM resources exist to complete the API. A reboot might be required."),
- 0xC0000500: ("STATUS_INVALID_TASK_NAME","The specified task name is invalid."),
- 0xC0000501: ("STATUS_INVALID_TASK_INDEX","The specified task index is invalid."),
- 0xC0000502: ("STATUS_THREAD_ALREADY_IN_TASK","The specified thread is already joining a task."),
- 0xC0000503: ("STATUS_CALLBACK_BYPASS","A callback has requested to bypass native code."),
- 0xC0000602: ("STATUS_FAIL_FAST_EXCEPTION","A fail fast exception occurred. Exception handlers will not be invoked and the process will be terminated immediately."),
- 0xC0000603: ("STATUS_IMAGE_CERT_REVOKED","Windows cannot verify the digital signature for this file. The signing certificate for this file has been revoked."),
- 0xC0000700: ("STATUS_PORT_CLOSED","The ALPC port is closed."),
- 0xC0000701: ("STATUS_MESSAGE_LOST","The ALPC message requested is no longer available."),
- 0xC0000702: ("STATUS_INVALID_MESSAGE","The ALPC message supplied is invalid."),
- 0xC0000703: ("STATUS_REQUEST_CANCELED","The ALPC message has been canceled."),
- 0xC0000704: ("STATUS_RECURSIVE_DISPATCH","Invalid recursive dispatch attempt."),
- 0xC0000705: ("STATUS_LPC_RECEIVE_BUFFER_EXPECTED","No receive buffer has been supplied in a synchronous request."),
- 0xC0000706: ("STATUS_LPC_INVALID_CONNECTION_USAGE","The connection port is used in an invalid context."),
- 0xC0000707: ("STATUS_LPC_REQUESTS_NOT_ALLOWED","The ALPC port does not accept new request messages."),
- 0xC0000708: ("STATUS_RESOURCE_IN_USE","The resource requested is already in use."),
- 0xC0000709: ("STATUS_HARDWARE_MEMORY_ERROR","The hardware has reported an uncorrectable memory error."),
- 0xC000070A: ("STATUS_THREADPOOL_HANDLE_EXCEPTION","Status 0x%08x was returned, waiting on handle 0x%x for wait 0x%p, in waiter 0x%p."),
- 0xC000070B: ("STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to Set event(0x%p) failed with status 0x%08x."),
- 0xC000070C: ("STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to ReleaseSemaphore(0x%p, %d) failed with status 0x%08x."),
- 0xC000070D: ("STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to ReleaseMutex(%p) failed with status 0x%08x."),
- 0xC000070E: ("STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED","After a callback to 0x%p(0x%p), a completion call to FreeLibrary(%p) failed with status 0x%08x."),
- 0xC000070F: ("STATUS_THREADPOOL_RELEASED_DURING_OPERATION","The thread pool 0x%p was released while a thread was posting a callback to 0x%p(0x%p) to it."),
- 0xC0000710: ("STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING","A thread pool worker thread is impersonating a client, after a callback to 0x%p(0x%p). This is unexpected, indicating that the callback is missing a call to revert the impersonation."),
- 0xC0000711: ("STATUS_APC_RETURNED_WHILE_IMPERSONATING","A thread pool worker thread is impersonating a client, after executing an APC. This is unexpected, indicating that the APC is missing a call to revert the impersonation."),
- 0xC0000712: ("STATUS_PROCESS_IS_PROTECTED","Either the target process, or the target thread's containing process, is a protected process."),
- 0xC0000713: ("STATUS_MCA_EXCEPTION","A thread is getting dispatched with MCA EXCEPTION because of MCA."),
- 0xC0000714: ("STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE","The client certificate account mapping is not unique."),
- 0xC0000715: ("STATUS_SYMLINK_CLASS_DISABLED","The symbolic link cannot be followed because its type is disabled."),
- 0xC0000716: ("STATUS_INVALID_IDN_NORMALIZATION","Indicates that the specified string is not valid for IDN normalization."),
- 0xC0000717: ("STATUS_NO_UNICODE_TRANSLATION","No mapping for the Unicode character exists in the target multi-byte code page."),
- 0xC0000718: ("STATUS_ALREADY_REGISTERED","The provided callback is already registered."),
- 0xC0000719: ("STATUS_CONTEXT_MISMATCH","The provided context did not match the target."),
- 0xC000071A: ("STATUS_PORT_ALREADY_HAS_COMPLETION_LIST","The specified port already has a completion list."),
- 0xC000071B: ("STATUS_CALLBACK_RETURNED_THREAD_PRIORITY","A threadpool worker thread entered a callback at thread base priority 0x%x and exited at priority 0x%x. This is unexpected, indicating that the callback missed restoring the priority."),
- 0xC000071C: ("STATUS_INVALID_THREAD","An invalid thread, handle %p, is specified for this operation. Possibly, a threadpool worker thread was specified."),
- 0xC000071D: ("STATUS_CALLBACK_RETURNED_TRANSACTION","A threadpool worker thread entered a callback, which left transaction state. This is unexpected, indicating that the callback missed clearing the transaction."),
- 0xC000071E: ("STATUS_CALLBACK_RETURNED_LDR_LOCK","A threadpool worker thread entered a callback, which left the loader lock held. This is unexpected, indicating that the callback missed releasing the lock."),
- 0xC000071F: ("STATUS_CALLBACK_RETURNED_LANG","A threadpool worker thread entered a callback, which left with preferred languages set. This is unexpected, indicating that the callback missed clearing them."),
- 0xC0000720: ("STATUS_CALLBACK_RETURNED_PRI_BACK","A threadpool worker thread entered a callback, which left with background priorities set. This is unexpected, indicating that the callback missed restoring the original priorities."),
- 0xC0000800: ("STATUS_DISK_REPAIR_DISABLED","The attempted operation required self healing to be enabled."),
- 0xC0000801: ("STATUS_DS_DOMAIN_RENAME_IN_PROGRESS","The directory service cannot perform the requested operation because a domain rename operation is in progress."),
- 0xC0000802: ("STATUS_DISK_QUOTA_EXCEEDED","An operation failed because the storage quota was exceeded."),
- 0xC0000804: ("STATUS_CONTENT_BLOCKED","An operation failed because the content was blocked."),
- 0xC0000805: ("STATUS_BAD_CLUSTERS","The operation could not be completed due to bad clusters on disk."),
- 0xC0000806: ("STATUS_VOLUME_DIRTY","The operation could not be completed because the volume is dirty. Please run the Chkdsk utility and try again."),
- 0xC0000901: ("STATUS_FILE_CHECKED_OUT","This file is checked out or locked for editing by another user."),
- 0xC0000902: ("STATUS_CHECKOUT_REQUIRED","The file must be checked out before saving changes."),
- 0xC0000903: ("STATUS_BAD_FILE_TYPE","The file type being saved or retrieved has been blocked."),
- 0xC0000904: ("STATUS_FILE_TOO_LARGE","The file size exceeds the limit allowed and cannot be saved."),
- 0xC0000905: ("STATUS_FORMS_AUTH_REQUIRED","Access Denied. Before opening files in this location, you must first browse to the e.g. site and select the option to log on automatically."),
- 0xC0000906: ("STATUS_VIRUS_INFECTED","The operation did not complete successfully because the file contains a virus."),
- 0xC0000907: ("STATUS_VIRUS_DELETED","This file contains a virus and cannot be opened. Due to the nature of this virus, the file has been removed from this location."),
- 0xC0000908: ("STATUS_BAD_MCFG_TABLE","The resources required for this device conflict with the MCFG table."),
- 0xC0000909: ("STATUS_CANNOT_BREAK_OPLOCK","The operation did not complete successfully because it would cause an oplock to be broken. The caller has requested that existing oplocks not be broken."),
- 0xC0009898: ("STATUS_WOW_ASSERTION","WOW Assertion Error."),
- 0xC000A000: ("STATUS_INVALID_SIGNATURE","The cryptographic signature is invalid."),
- 0xC000A001: ("STATUS_HMAC_NOT_SUPPORTED","The cryptographic provider does not support HMAC."),
- 0xC000A010: ("STATUS_IPSEC_QUEUE_OVERFLOW","The IPsec queue overflowed."),
- 0xC000A011: ("STATUS_ND_QUEUE_OVERFLOW","The neighbor discovery queue overflowed."),
- 0xC000A012: ("STATUS_HOPLIMIT_EXCEEDED","An Internet Control Message Protocol (ICMP) hop limit exceeded error was received."),
- 0xC000A013: ("STATUS_PROTOCOL_NOT_SUPPORTED","The protocol is not installed on the local machine."),
- 0xC000A080: ("STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED","{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused by network connectivity issues. Try to save this file elsewhere."),
- 0xC000A081: ("STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR","{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error was returned by the server on which the file exists. Try to save this file elsewhere."),
- 0xC000A082: ("STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR","{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused if the device has been removed or the media is write-protected."),
- 0xC000A083: ("STATUS_XML_PARSE_ERROR","Windows was unable to parse the requested XML data."),
- 0xC000A084: ("STATUS_XMLDSIG_ERROR","An error was encountered while processing an XML digital signature."),
- 0xC000A085: ("STATUS_WRONG_COMPARTMENT","This indicates that the caller made the connection request in the wrong routing compartment."),
- 0xC000A086: ("STATUS_AUTHIP_FAILURE","This indicates that there was an AuthIP failure when attempting to connect to the remote host."),
- 0xC000A087: ("STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS","OID mapped groups cannot have members."),
- 0xC000A088: ("STATUS_DS_OID_NOT_FOUND","The specified OID cannot be found."),
- 0xC000A100: ("STATUS_HASH_NOT_SUPPORTED","Hash generation for the specified version and hash type is not enabled on server."),
- 0xC000A101: ("STATUS_HASH_NOT_PRESENT","The hash requests is not present or not up to date with the current file contents."),
- 0xC0010001: ("DBG_NO_STATE_CHANGE","The debugger did not perform a state change."),
- 0xC0010002: ("DBG_APP_NOT_IDLE","The debugger found that the application is not idle."),
- 0xC0020001: ("RPC_NT_INVALID_STRING_BINDING","The string binding is invalid."),
- 0xC0020002: ("RPC_NT_WRONG_KIND_OF_BINDING","The binding handle is not the correct type."),
- 0xC0020003: ("RPC_NT_INVALID_BINDING","The binding handle is invalid."),
- 0xC0020004: ("RPC_NT_PROTSEQ_NOT_SUPPORTED","The RPC protocol sequence is not supported."),
- 0xC0020005: ("RPC_NT_INVALID_RPC_PROTSEQ","The RPC protocol sequence is invalid."),
- 0xC0020006: ("RPC_NT_INVALID_STRING_UUID","The string UUID is invalid."),
- 0xC0020007: ("RPC_NT_INVALID_ENDPOINT_FORMAT","The endpoint format is invalid."),
- 0xC0020008: ("RPC_NT_INVALID_NET_ADDR","The network address is invalid."),
- 0xC0020009: ("RPC_NT_NO_ENDPOINT_FOUND","No endpoint was found."),
- 0xC002000A: ("RPC_NT_INVALID_TIMEOUT","The time-out value is invalid."),
- 0xC002000B: ("RPC_NT_OBJECT_NOT_FOUND","The object UUID was not found."),
- 0xC002000C: ("RPC_NT_ALREADY_REGISTERED","The object UUID has already been registered."),
- 0xC002000D: ("RPC_NT_TYPE_ALREADY_REGISTERED","The type UUID has already been registered."),
- 0xC002000E: ("RPC_NT_ALREADY_LISTENING","The RPC server is already listening."),
- 0xC002000F: ("RPC_NT_NO_PROTSEQS_REGISTERED","No protocol sequences have been registered."),
- 0xC0020010: ("RPC_NT_NOT_LISTENING","The RPC server is not listening."),
- 0xC0020011: ("RPC_NT_UNKNOWN_MGR_TYPE","The manager type is unknown."),
- 0xC0020012: ("RPC_NT_UNKNOWN_IF","The interface is unknown."),
- 0xC0020013: ("RPC_NT_NO_BINDINGS","There are no bindings."),
- 0xC0020014: ("RPC_NT_NO_PROTSEQS","There are no protocol sequences."),
- 0xC0020015: ("RPC_NT_CANT_CREATE_ENDPOINT","The endpoint cannot be created."),
- 0xC0020016: ("RPC_NT_OUT_OF_RESOURCES","Insufficient resources are available to complete this operation."),
- 0xC0020017: ("RPC_NT_SERVER_UNAVAILABLE","The RPC server is unavailable."),
- 0xC0020018: ("RPC_NT_SERVER_TOO_BUSY","The RPC server is too busy to complete this operation."),
- 0xC0020019: ("RPC_NT_INVALID_NETWORK_OPTIONS","The network options are invalid."),
- 0xC002001A: ("RPC_NT_NO_CALL_ACTIVE","No RPCs are active on this thread."),
- 0xC002001B: ("RPC_NT_CALL_FAILED","The RPC failed."),
- 0xC002001C: ("RPC_NT_CALL_FAILED_DNE","The RPC failed and did not execute."),
- 0xC002001D: ("RPC_NT_PROTOCOL_ERROR","An RPC protocol error occurred."),
- 0xC002001F: ("RPC_NT_UNSUPPORTED_TRANS_SYN","The RPC server does not support the transfer syntax."),
- 0xC0020021: ("RPC_NT_UNSUPPORTED_TYPE","The type UUID is not supported."),
- 0xC0020022: ("RPC_NT_INVALID_TAG","The tag is invalid."),
- 0xC0020023: ("RPC_NT_INVALID_BOUND","The array bounds are invalid."),
- 0xC0020024: ("RPC_NT_NO_ENTRY_NAME","The binding does not contain an entry name."),
- 0xC0020025: ("RPC_NT_INVALID_NAME_SYNTAX","The name syntax is invalid."),
- 0xC0020026: ("RPC_NT_UNSUPPORTED_NAME_SYNTAX","The name syntax is not supported."),
- 0xC0020028: ("RPC_NT_UUID_NO_ADDRESS","No network address is available to construct a UUID."),
- 0xC0020029: ("RPC_NT_DUPLICATE_ENDPOINT","The endpoint is a duplicate."),
- 0xC002002A: ("RPC_NT_UNKNOWN_AUTHN_TYPE","The authentication type is unknown."),
- 0xC002002B: ("RPC_NT_MAX_CALLS_TOO_SMALL","The maximum number of calls is too small."),
- 0xC002002C: ("RPC_NT_STRING_TOO_LONG","The string is too long."),
- 0xC002002D: ("RPC_NT_PROTSEQ_NOT_FOUND","The RPC protocol sequence was not found."),
- 0xC002002E: ("RPC_NT_PROCNUM_OUT_OF_RANGE","The procedure number is out of range."),
- 0xC002002F: ("RPC_NT_BINDING_HAS_NO_AUTH","The binding does not contain any authentication information."),
- 0xC0020030: ("RPC_NT_UNKNOWN_AUTHN_SERVICE","The authentication service is unknown."),
- 0xC0020031: ("RPC_NT_UNKNOWN_AUTHN_LEVEL","The authentication level is unknown."),
- 0xC0020032: ("RPC_NT_INVALID_AUTH_IDENTITY","The security context is invalid."),
- 0xC0020033: ("RPC_NT_UNKNOWN_AUTHZ_SERVICE","The authorization service is unknown."),
- 0xC0020034: ("EPT_NT_INVALID_ENTRY","The entry is invalid."),
- 0xC0020035: ("EPT_NT_CANT_PERFORM_OP","The operation cannot be performed."),
- 0xC0020036: ("EPT_NT_NOT_REGISTERED","No more endpoints are available from the endpoint mapper."),
- 0xC0020037: ("RPC_NT_NOTHING_TO_EXPORT","No interfaces have been exported."),
- 0xC0020038: ("RPC_NT_INCOMPLETE_NAME","The entry name is incomplete."),
- 0xC0020039: ("RPC_NT_INVALID_VERS_OPTION","The version option is invalid."),
- 0xC002003A: ("RPC_NT_NO_MORE_MEMBERS","There are no more members."),
- 0xC002003B: ("RPC_NT_NOT_ALL_OBJS_UNEXPORTED","There is nothing to unexport."),
- 0xC002003C: ("RPC_NT_INTERFACE_NOT_FOUND","The interface was not found."),
- 0xC002003D: ("RPC_NT_ENTRY_ALREADY_EXISTS","The entry already exists."),
- 0xC002003E: ("RPC_NT_ENTRY_NOT_FOUND","The entry was not found."),
- 0xC002003F: ("RPC_NT_NAME_SERVICE_UNAVAILABLE","The name service is unavailable."),
- 0xC0020040: ("RPC_NT_INVALID_NAF_ID","The network address family is invalid."),
- 0xC0020041: ("RPC_NT_CANNOT_SUPPORT","The requested operation is not supported."),
- 0xC0020042: ("RPC_NT_NO_CONTEXT_AVAILABLE","No security context is available to allow impersonation."),
- 0xC0020043: ("RPC_NT_INTERNAL_ERROR","An internal error occurred in the RPC."),
- 0xC0020044: ("RPC_NT_ZERO_DIVIDE","The RPC server attempted to divide an integer by zero."),
- 0xC0020045: ("RPC_NT_ADDRESS_ERROR","An addressing error occurred in the RPC server."),
- 0xC0020046: ("RPC_NT_FP_DIV_ZERO","A floating point operation at the RPC server caused a divide by zero."),
- 0xC0020047: ("RPC_NT_FP_UNDERFLOW","A floating point underflow occurred at the RPC server."),
- 0xC0020048: ("RPC_NT_FP_OVERFLOW","A floating point overflow occurred at the RPC server."),
- 0xC0020049: ("RPC_NT_CALL_IN_PROGRESS","An RPC is already in progress for this thread."),
- 0xC002004A: ("RPC_NT_NO_MORE_BINDINGS","There are no more bindings."),
- 0xC002004B: ("RPC_NT_GROUP_MEMBER_NOT_FOUND","The group member was not found."),
- 0xC002004C: ("EPT_NT_CANT_CREATE","The endpoint mapper database entry could not be created."),
- 0xC002004D: ("RPC_NT_INVALID_OBJECT","The object UUID is the nil UUID."),
- 0xC002004F: ("RPC_NT_NO_INTERFACES","No interfaces have been registered."),
- 0xC0020050: ("RPC_NT_CALL_CANCELLED","The RPC was canceled."),
- 0xC0020051: ("RPC_NT_BINDING_INCOMPLETE","The binding handle does not contain all the required information."),
- 0xC0020052: ("RPC_NT_COMM_FAILURE","A communications failure occurred during an RPC."),
- 0xC0020053: ("RPC_NT_UNSUPPORTED_AUTHN_LEVEL","The requested authentication level is not supported."),
- 0xC0020054: ("RPC_NT_NO_PRINC_NAME","No principal name was registered."),
- 0xC0020055: ("RPC_NT_NOT_RPC_ERROR","The error specified is not a valid Windows RPC error code."),
- 0xC0020057: ("RPC_NT_SEC_PKG_ERROR","A security package-specific error occurred."),
- 0xC0020058: ("RPC_NT_NOT_CANCELLED","The thread was not canceled."),
- 0xC0020062: ("RPC_NT_INVALID_ASYNC_HANDLE","Invalid asynchronous RPC handle."),
- 0xC0020063: ("RPC_NT_INVALID_ASYNC_CALL","Invalid asynchronous RPC call handle for this operation."),
- 0xC0020064: ("RPC_NT_PROXY_ACCESS_DENIED","Access to the HTTP proxy is denied."),
- 0xC0030001: ("RPC_NT_NO_MORE_ENTRIES","The list of RPC servers available for auto-handle binding has been exhausted."),
- 0xC0030002: ("RPC_NT_SS_CHAR_TRANS_OPEN_FAIL","The file designated by DCERPCCHARTRANS cannot be opened."),
- 0xC0030003: ("RPC_NT_SS_CHAR_TRANS_SHORT_FILE","The file containing the character translation table has fewer than 512 bytes."),
- 0xC0030004: ("RPC_NT_SS_IN_NULL_CONTEXT","A null context handle is passed as an [in] parameter."),
- 0xC0030005: ("RPC_NT_SS_CONTEXT_MISMATCH","The context handle does not match any known context handles."),
- 0xC0030006: ("RPC_NT_SS_CONTEXT_DAMAGED","The context handle changed during a call."),
- 0xC0030007: ("RPC_NT_SS_HANDLES_MISMATCH","The binding handles passed to an RPC do not match."),
- 0xC0030008: ("RPC_NT_SS_CANNOT_GET_CALL_HANDLE","The stub is unable to get the call handle."),
- 0xC0030009: ("RPC_NT_NULL_REF_POINTER","A null reference pointer was passed to the stub."),
- 0xC003000A: ("RPC_NT_ENUM_VALUE_OUT_OF_RANGE","The enumeration value is out of range."),
- 0xC003000B: ("RPC_NT_BYTE_COUNT_TOO_SMALL","The byte count is too small."),
- 0xC003000C: ("RPC_NT_BAD_STUB_DATA","The stub received bad data."),
- 0xC0030059: ("RPC_NT_INVALID_ES_ACTION","Invalid operation on the encoding/decoding handle."),
- 0xC003005A: ("RPC_NT_WRONG_ES_VERSION","Incompatible version of the serializing package."),
- 0xC003005B: ("RPC_NT_WRONG_STUB_VERSION","Incompatible version of the RPC stub."),
- 0xC003005C: ("RPC_NT_INVALID_PIPE_OBJECT","The RPC pipe object is invalid or corrupt."),
- 0xC003005D: ("RPC_NT_INVALID_PIPE_OPERATION","An invalid operation was attempted on an RPC pipe object."),
- 0xC003005E: ("RPC_NT_WRONG_PIPE_VERSION","Unsupported RPC pipe version."),
- 0xC003005F: ("RPC_NT_PIPE_CLOSED","The RPC pipe object has already been closed."),
- 0xC0030060: ("RPC_NT_PIPE_DISCIPLINE_ERROR","The RPC call completed before all pipes were processed."),
- 0xC0030061: ("RPC_NT_PIPE_EMPTY","No more data is available from the RPC pipe."),
- 0xC0040035: ("STATUS_PNP_BAD_MPS_TABLE","A device is missing in the system BIOS MPS table. This device will not be used. Contact your system vendor for a system BIOS update."),
- 0xC0040036: ("STATUS_PNP_TRANSLATION_FAILED","A translator failed to translate resources."),
- 0xC0040037: ("STATUS_PNP_IRQ_TRANSLATION_FAILED","An IRQ translator failed to translate resources."),
- 0xC0040038: ("STATUS_PNP_INVALID_ID","Driver %2 returned an invalid ID for a child device (%3)."),
- 0xC0040039: ("STATUS_IO_REISSUE_AS_CACHED","Reissue the given operation as a cached I/O operation"),
- 0xC00A0001: ("STATUS_CTX_WINSTATION_NAME_INVALID","Session name %1 is invalid."),
- 0xC00A0002: ("STATUS_CTX_INVALID_PD","The protocol driver %1 is invalid."),
- 0xC00A0003: ("STATUS_CTX_PD_NOT_FOUND","The protocol driver %1 was not found in the system path."),
- 0xC00A0006: ("STATUS_CTX_CLOSE_PENDING","A close operation is pending on the terminal connection."),
- 0xC00A0007: ("STATUS_CTX_NO_OUTBUF","No free output buffers are available."),
- 0xC00A0008: ("STATUS_CTX_MODEM_INF_NOT_FOUND","The MODEM.INF file was not found."),
- 0xC00A0009: ("STATUS_CTX_INVALID_MODEMNAME","The modem (%1) was not found in the MODEM.INF file."),
- 0xC00A000A: ("STATUS_CTX_RESPONSE_ERROR","The modem did not accept the command sent to it. Verify that the configured modem name matches the attached modem."),
- 0xC00A000B: ("STATUS_CTX_MODEM_RESPONSE_TIMEOUT","The modem did not respond to the command sent to it. Verify that the modem cable is properly attached and the modem is turned on."),
- 0xC00A000C: ("STATUS_CTX_MODEM_RESPONSE_NO_CARRIER","Carrier detection has failed or the carrier has been dropped due to disconnection."),
- 0xC00A000D: ("STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE","A dial tone was not detected within the required time. Verify that the phone cable is properly attached and functional."),
- 0xC00A000E: ("STATUS_CTX_MODEM_RESPONSE_BUSY","A busy signal was detected at a remote site on callback."),
- 0xC00A000F: ("STATUS_CTX_MODEM_RESPONSE_VOICE","A voice was detected at a remote site on callback."),
- 0xC00A0010: ("STATUS_CTX_TD_ERROR","Transport driver error."),
- 0xC00A0012: ("STATUS_CTX_LICENSE_CLIENT_INVALID","The client you are using is not licensed to use this system. Your logon request is denied."),
- 0xC00A0013: ("STATUS_CTX_LICENSE_NOT_AVAILABLE","The system has reached its licensed logon limit. Try again later."),
- 0xC00A0014: ("STATUS_CTX_LICENSE_EXPIRED","The system license has expired. Your logon request is denied."),
- 0xC00A0015: ("STATUS_CTX_WINSTATION_NOT_FOUND","The specified session cannot be found."),
- 0xC00A0016: ("STATUS_CTX_WINSTATION_NAME_COLLISION","The specified session name is already in use."),
- 0xC00A0017: ("STATUS_CTX_WINSTATION_BUSY","The requested operation cannot be completed because the terminal connection is currently processing a connect, disconnect, reset, or delete operation."),
- 0xC00A0018: ("STATUS_CTX_BAD_VIDEO_MODE","An attempt has been made to connect to a session whose video mode is not supported by the current client."),
- 0xC00A0022: ("STATUS_CTX_GRAPHICS_INVALID","The application attempted to enable DOS graphics mode. DOS graphics mode is not supported."),
- 0xC00A0024: ("STATUS_CTX_NOT_CONSOLE","The requested operation can be performed only on the system console. This is most often the result of a driver or system DLL requiring direct console access."),
- 0xC00A0026: ("STATUS_CTX_CLIENT_QUERY_TIMEOUT","The client failed to respond to the server connect message."),
- 0xC00A0027: ("STATUS_CTX_CONSOLE_DISCONNECT","Disconnecting the console session is not supported."),
- 0xC00A0028: ("STATUS_CTX_CONSOLE_CONNECT","Reconnecting a disconnected session to the console is not supported."),
- 0xC00A002A: ("STATUS_CTX_SHADOW_DENIED","The request to control another session remotely was denied."),
- 0xC00A002B: ("STATUS_CTX_WINSTATION_ACCESS_DENIED","A process has requested access to a session, but has not been granted those access rights."),
- 0xC00A002E: ("STATUS_CTX_INVALID_WD","The terminal connection driver %1 is invalid."),
- 0xC00A002F: ("STATUS_CTX_WD_NOT_FOUND","The terminal connection driver %1 was not found in the system path."),
- 0xC00A0030: ("STATUS_CTX_SHADOW_INVALID","The requested session cannot be controlled remotely. You cannot control your own session, a session that is trying to control your session, a session that has no user logged on, or other sessions from the console."),
- 0xC00A0031: ("STATUS_CTX_SHADOW_DISABLED","The requested session is not configured to allow remote control."),
- 0xC00A0032: ("STATUS_RDP_PROTOCOL_ERROR","The RDP protocol component %2 detected an error in the protocol stream and has disconnected the client."),
- 0xC00A0033: ("STATUS_CTX_CLIENT_LICENSE_NOT_SET","Your request to connect to this terminal server has been rejected. Your terminal server client license number has not been entered for this copy of the terminal client. Contact your system administrator for help in entering a valid, unique license number for this terminal server client. Click OK to continue."),
- 0xC00A0034: ("STATUS_CTX_CLIENT_LICENSE_IN_USE","Your request to connect to this terminal server has been rejected. Your terminal server client license number is currently being used by another user. Contact your system administrator to obtain a new copy of the terminal server client with a valid, unique license number. Click OK to continue."),
- 0xC00A0035: ("STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE","The remote control of the console was terminated because the display mode was changed. Changing the display mode in a remote control session is not supported."),
- 0xC00A0036: ("STATUS_CTX_SHADOW_NOT_RUNNING","Remote control could not be terminated because the specified session is not currently being remotely controlled."),
- 0xC00A0037: ("STATUS_CTX_LOGON_DISABLED","Your interactive logon privilege has been disabled. Contact your system administrator."),
- 0xC00A0038: ("STATUS_CTX_SECURITY_LAYER_ERROR","The terminal server security layer detected an error in the protocol stream and has disconnected the client."),
- 0xC00A0039: ("STATUS_TS_INCOMPATIBLE_SESSIONS","The target session is incompatible with the current session."),
- 0xC00B0001: ("STATUS_MUI_FILE_NOT_FOUND","The resource loader failed to find an MUI file."),
- 0xC00B0002: ("STATUS_MUI_INVALID_FILE","The resource loader failed to load an MUI file because the file failed to pass validation."),
- 0xC00B0003: ("STATUS_MUI_INVALID_RC_CONFIG","The RC manifest is corrupted with garbage data, is an unsupported version, or is missing a required item."),
- 0xC00B0004: ("STATUS_MUI_INVALID_LOCALE_NAME","The RC manifest has an invalid culture name."),
- 0xC00B0005: ("STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME","The RC manifest has and invalid ultimate fallback name."),
- 0xC00B0006: ("STATUS_MUI_FILE_NOT_LOADED","The resource loader cache does not have a loaded MUI entry."),
- 0xC00B0007: ("STATUS_RESOURCE_ENUM_USER_STOP","The user stopped resource enumeration."),
- 0xC0130001: ("STATUS_CLUSTER_INVALID_NODE","The cluster node is not valid."),
- 0xC0130002: ("STATUS_CLUSTER_NODE_EXISTS","The cluster node already exists."),
- 0xC0130003: ("STATUS_CLUSTER_JOIN_IN_PROGRESS","A node is in the process of joining the cluster."),
- 0xC0130004: ("STATUS_CLUSTER_NODE_NOT_FOUND","The cluster node was not found."),
- 0xC0130005: ("STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND","The cluster local node information was not found."),
- 0xC0130006: ("STATUS_CLUSTER_NETWORK_EXISTS","The cluster network already exists."),
- 0xC0130007: ("STATUS_CLUSTER_NETWORK_NOT_FOUND","The cluster network was not found."),
- 0xC0130008: ("STATUS_CLUSTER_NETINTERFACE_EXISTS","The cluster network interface already exists."),
- 0xC0130009: ("STATUS_CLUSTER_NETINTERFACE_NOT_FOUND","The cluster network interface was not found."),
- 0xC013000A: ("STATUS_CLUSTER_INVALID_REQUEST","The cluster request is not valid for this object."),
- 0xC013000B: ("STATUS_CLUSTER_INVALID_NETWORK_PROVIDER","The cluster network provider is not valid."),
- 0xC013000C: ("STATUS_CLUSTER_NODE_DOWN","The cluster node is down."),
- 0xC013000D: ("STATUS_CLUSTER_NODE_UNREACHABLE","The cluster node is not reachable."),
- 0xC013000E: ("STATUS_CLUSTER_NODE_NOT_MEMBER","The cluster node is not a member of the cluster."),
- 0xC013000F: ("STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS","A cluster join operation is not in progress."),
- 0xC0130010: ("STATUS_CLUSTER_INVALID_NETWORK","The cluster network is not valid."),
- 0xC0130011: ("STATUS_CLUSTER_NO_NET_ADAPTERS","No network adapters are available."),
- 0xC0130012: ("STATUS_CLUSTER_NODE_UP","The cluster node is up."),
- 0xC0130013: ("STATUS_CLUSTER_NODE_PAUSED","The cluster node is paused."),
- 0xC0130014: ("STATUS_CLUSTER_NODE_NOT_PAUSED","The cluster node is not paused."),
- 0xC0130015: ("STATUS_CLUSTER_NO_SECURITY_CONTEXT","No cluster security context is available."),
- 0xC0130016: ("STATUS_CLUSTER_NETWORK_NOT_INTERNAL","The cluster network is not configured for internal cluster communication."),
- 0xC0130017: ("STATUS_CLUSTER_POISONED","The cluster node has been poisoned."),
- 0xC0140001: ("STATUS_ACPI_INVALID_OPCODE","An attempt was made to run an invalid AML opcode."),
- 0xC0140002: ("STATUS_ACPI_STACK_OVERFLOW","The AML interpreter stack has overflowed."),
- 0xC0140003: ("STATUS_ACPI_ASSERT_FAILED","An inconsistent state has occurred."),
- 0xC0140004: ("STATUS_ACPI_INVALID_INDEX","An attempt was made to access an array outside its bounds."),
- 0xC0140005: ("STATUS_ACPI_INVALID_ARGUMENT","A required argument was not specified."),
- 0xC0140006: ("STATUS_ACPI_FATAL","A fatal error has occurred."),
- 0xC0140007: ("STATUS_ACPI_INVALID_SUPERNAME","An invalid SuperName was specified."),
- 0xC0140008: ("STATUS_ACPI_INVALID_ARGTYPE","An argument with an incorrect type was specified."),
- 0xC0140009: ("STATUS_ACPI_INVALID_OBJTYPE","An object with an incorrect type was specified."),
- 0xC014000A: ("STATUS_ACPI_INVALID_TARGETTYPE","A target with an incorrect type was specified."),
- 0xC014000B: ("STATUS_ACPI_INCORRECT_ARGUMENT_COUNT","An incorrect number of arguments was specified."),
- 0xC014000C: ("STATUS_ACPI_ADDRESS_NOT_MAPPED","An address failed to translate."),
- 0xC014000D: ("STATUS_ACPI_INVALID_EVENTTYPE","An incorrect event type was specified."),
- 0xC014000E: ("STATUS_ACPI_HANDLER_COLLISION","A handler for the target already exists."),
- 0xC014000F: ("STATUS_ACPI_INVALID_DATA","Invalid data for the target was specified."),
- 0xC0140010: ("STATUS_ACPI_INVALID_REGION","An invalid region for the target was specified."),
- 0xC0140011: ("STATUS_ACPI_INVALID_ACCESS_SIZE","An attempt was made to access a field outside the defined range."),
- 0xC0140012: ("STATUS_ACPI_ACQUIRE_GLOBAL_LOCK","The global system lock could not be acquired."),
- 0xC0140013: ("STATUS_ACPI_ALREADY_INITIALIZED","An attempt was made to reinitialize the ACPI subsystem."),
- 0xC0140014: ("STATUS_ACPI_NOT_INITIALIZED","The ACPI subsystem has not been initialized."),
- 0xC0140015: ("STATUS_ACPI_INVALID_MUTEX_LEVEL","An incorrect mutex was specified."),
- 0xC0140016: ("STATUS_ACPI_MUTEX_NOT_OWNED","The mutex is not currently owned."),
- 0xC0140017: ("STATUS_ACPI_MUTEX_NOT_OWNER","An attempt was made to access the mutex by a process that was not the owner."),
- 0xC0140018: ("STATUS_ACPI_RS_ACCESS","An error occurred during an access to region space."),
- 0xC0140019: ("STATUS_ACPI_INVALID_TABLE","An attempt was made to use an incorrect table."),
- 0xC0140020: ("STATUS_ACPI_REG_HANDLER_FAILED","The registration of an ACPI event failed."),
- 0xC0140021: ("STATUS_ACPI_POWER_REQUEST_FAILED","An ACPI power object failed to transition state."),
- 0xC0150001: ("STATUS_SXS_SECTION_NOT_FOUND","The requested section is not present in the activation context."),
- 0xC0150002: ("STATUS_SXS_CANT_GEN_ACTCTX","Windows was unble to process the application binding information. Refer to the system event log for further information."),
- 0xC0150003: ("STATUS_SXS_INVALID_ACTCTXDATA_FORMAT","The application binding data format is invalid."),
- 0xC0150004: ("STATUS_SXS_ASSEMBLY_NOT_FOUND","The referenced assembly is not installed on the system."),
- 0xC0150005: ("STATUS_SXS_MANIFEST_FORMAT_ERROR","The manifest file does not begin with the required tag and format information."),
- 0xC0150006: ("STATUS_SXS_MANIFEST_PARSE_ERROR","The manifest file contains one or more syntax errors."),
- 0xC0150007: ("STATUS_SXS_ACTIVATION_CONTEXT_DISABLED","The application attempted to activate a disabled activation context."),
- 0xC0150008: ("STATUS_SXS_KEY_NOT_FOUND","The requested lookup key was not found in any active activation context."),
- 0xC0150009: ("STATUS_SXS_VERSION_CONFLICT","A component version required by the application conflicts with another component version that is already active."),
- 0xC015000A: ("STATUS_SXS_WRONG_SECTION_TYPE","The type requested activation context section does not match the query API used."),
- 0xC015000B: ("STATUS_SXS_THREAD_QUERIES_DISABLED","Lack of system resources has required isolated activation to be disabled for the current thread of execution."),
- 0xC015000C: ("STATUS_SXS_ASSEMBLY_MISSING","The referenced assembly could not be found."),
- 0xC015000E: ("STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET","An attempt to set the process default activation context failed because the process default activation context was already set."),
- 0xC015000F: ("STATUS_SXS_EARLY_DEACTIVATION","The activation context being deactivated is not the most recently activated one."),
- 0xC0150010: ("STATUS_SXS_INVALID_DEACTIVATION","The activation context being deactivated is not active for the current thread of execution."),
- 0xC0150011: ("STATUS_SXS_MULTIPLE_DEACTIVATION","The activation context being deactivated has already been deactivated."),
- 0xC0150012: ("STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY","The activation context of the system default assembly could not be generated."),
- 0xC0150013: ("STATUS_SXS_PROCESS_TERMINATION_REQUESTED","A component used by the isolation facility has requested that the process be terminated."),
- 0xC0150014: ("STATUS_SXS_CORRUPT_ACTIVATION_STACK","The activation context activation stack for the running thread of execution is corrupt."),
- 0xC0150015: ("STATUS_SXS_CORRUPTION","The application isolation metadata for this process or thread has become corrupt."),
- 0xC0150016: ("STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE","The value of an attribute in an identity is not within the legal range."),
- 0xC0150017: ("STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME","The name of an attribute in an identity is not within the legal range."),
- 0xC0150018: ("STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE","An identity contains two definitions for the same attribute."),
- 0xC0150019: ("STATUS_SXS_IDENTITY_PARSE_ERROR","The identity string is malformed. This may be due to a trailing comma, more than two unnamed attributes, a missing attribute name, or a missing attribute value."),
- 0xC015001A: ("STATUS_SXS_COMPONENT_STORE_CORRUPT","The component store has become corrupted."),
- 0xC015001B: ("STATUS_SXS_FILE_HASH_MISMATCH","A component's file does not match the verification information present in the component manifest."),
- 0xC015001C: ("STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT","The identities of the manifests are identical, but their contents are different."),
- 0xC015001D: ("STATUS_SXS_IDENTITIES_DIFFERENT","The component identities are different."),
- 0xC015001E: ("STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT","The assembly is not a deployment."),
- 0xC015001F: ("STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY","The file is not a part of the assembly."),
- 0xC0150020: ("STATUS_ADVANCED_INSTALLER_FAILED","An advanced installer failed during setup or servicing."),
- 0xC0150021: ("STATUS_XML_ENCODING_MISMATCH","The character encoding in the XML declaration did not match the encoding used in the document."),
- 0xC0150022: ("STATUS_SXS_MANIFEST_TOO_BIG","The size of the manifest exceeds the maximum allowed."),
- 0xC0150023: ("STATUS_SXS_SETTING_NOT_REGISTERED","The setting is not registered."),
- 0xC0150024: ("STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE","One or more required transaction members are not present."),
- 0xC0150025: ("STATUS_SMI_PRIMITIVE_INSTALLER_FAILED","The SMI primitive installer failed during setup or servicing."),
- 0xC0150026: ("STATUS_GENERIC_COMMAND_FAILED","A generic command executable returned a result that indicates failure."),
- 0xC0150027: ("STATUS_SXS_FILE_HASH_MISSING","A component is missing file verification information in its manifest."),
- 0xC0190001: ("STATUS_TRANSACTIONAL_CONFLICT","The function attempted to use a name that is reserved for use by another transaction."),
- 0xC0190002: ("STATUS_INVALID_TRANSACTION","The transaction handle associated with this operation is invalid."),
- 0xC0190003: ("STATUS_TRANSACTION_NOT_ACTIVE","The requested operation was made in the context of a transaction that is no longer active."),
- 0xC0190004: ("STATUS_TM_INITIALIZATION_FAILED","The transaction manager was unable to be successfully initialized. Transacted operations are not supported."),
- 0xC0190005: ("STATUS_RM_NOT_ACTIVE","Transaction support within the specified file system resource manager was not started or was shut down due to an error."),
- 0xC0190006: ("STATUS_RM_METADATA_CORRUPT","The metadata of the resource manager has been corrupted. The resource manager will not function."),
- 0xC0190007: ("STATUS_TRANSACTION_NOT_JOINED","The resource manager attempted to prepare a transaction that it has not successfully joined."),
- 0xC0190008: ("STATUS_DIRECTORY_NOT_RM","The specified directory does not contain a file system resource manager."),
- 0xC019000A: ("STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE","The remote server or share does not support transacted file operations."),
- 0xC019000B: ("STATUS_LOG_RESIZE_INVALID_SIZE","The requested log size for the file system resource manager is invalid."),
- 0xC019000C: ("STATUS_REMOTE_FILE_VERSION_MISMATCH","The remote server sent mismatching version number or Fid for a file opened with transactions."),
- 0xC019000F: ("STATUS_CRM_PROTOCOL_ALREADY_EXISTS","The resource manager tried to register a protocol that already exists."),
- 0xC0190010: ("STATUS_TRANSACTION_PROPAGATION_FAILED","The attempt to propagate the transaction failed."),
- 0xC0190011: ("STATUS_CRM_PROTOCOL_NOT_FOUND","The requested propagation protocol was not registered as a CRM."),
- 0xC0190012: ("STATUS_TRANSACTION_SUPERIOR_EXISTS","The transaction object already has a superior enlistment, and the caller attempted an operation that would have created a new superior. Only a single superior enlistment is allowed."),
- 0xC0190013: ("STATUS_TRANSACTION_REQUEST_NOT_VALID","The requested operation is not valid on the transaction object in its current state."),
- 0xC0190014: ("STATUS_TRANSACTION_NOT_REQUESTED","The caller has called a response API, but the response is not expected because the transaction manager did not issue the corresponding request to the caller."),
- 0xC0190015: ("STATUS_TRANSACTION_ALREADY_ABORTED","It is too late to perform the requested operation, because the transaction has already been aborted."),
- 0xC0190016: ("STATUS_TRANSACTION_ALREADY_COMMITTED","It is too late to perform the requested operation, because the transaction has already been committed."),
- 0xC0190017: ("STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER","The buffer passed in to NtPushTransaction or NtPullTransaction is not in a valid format."),
- 0xC0190018: ("STATUS_CURRENT_TRANSACTION_NOT_VALID","The current transaction context associated with the thread is not a valid handle to a transaction object."),
- 0xC0190019: ("STATUS_LOG_GROWTH_FAILED","An attempt to create space in the transactional resource manager's log failed. The failure status has been recorded in the event log."),
- 0xC0190021: ("STATUS_OBJECT_NO_LONGER_EXISTS","The object (file, stream, or link) that corresponds to the handle has been deleted by a transaction savepoint rollback."),
- 0xC0190022: ("STATUS_STREAM_MINIVERSION_NOT_FOUND","The specified file miniversion was not found for this transacted file open."),
- 0xC0190023: ("STATUS_STREAM_MINIVERSION_NOT_VALID","The specified file miniversion was found but has been invalidated. The most likely cause is a transaction savepoint rollback."),
- 0xC0190024: ("STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION","A miniversion may be opened only in the context of the transaction that created it."),
- 0xC0190025: ("STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT","It is not possible to open a miniversion with modify access."),
- 0xC0190026: ("STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS","It is not possible to create any more miniversions for this stream."),
- 0xC0190028: ("STATUS_HANDLE_NO_LONGER_VALID","The handle has been invalidated by a transaction. The most likely cause is the presence of memory mapping on a file or an open handle when the transaction ended or rolled back to savepoint."),
- 0xC0190030: ("STATUS_LOG_CORRUPTION_DETECTED","The log data is corrupt."),
- 0xC0190032: ("STATUS_RM_DISCONNECTED","The transaction outcome is unavailable because the resource manager responsible for it is disconnected."),
- 0xC0190033: ("STATUS_ENLISTMENT_NOT_SUPERIOR","The request was rejected because the enlistment in question is not a superior enlistment."),
- 0xC0190036: ("STATUS_FILE_IDENTITY_NOT_PERSISTENT","The file cannot be opened in a transaction because its identity depends on the outcome of an unresolved transaction."),
- 0xC0190037: ("STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY","The operation cannot be performed because another transaction is depending on this property not changing."),
- 0xC0190038: ("STATUS_CANT_CROSS_RM_BOUNDARY","The operation would involve a single file with two transactional resource managers and is, therefore, not allowed."),
- 0xC0190039: ("STATUS_TXF_DIR_NOT_EMPTY","The $Txf directory must be empty for this operation to succeed."),
- 0xC019003A: ("STATUS_INDOUBT_TRANSACTIONS_EXIST","The operation would leave a transactional resource manager in an inconsistent state and is therefore not allowed."),
- 0xC019003B: ("STATUS_TM_VOLATILE","The operation could not be completed because the transaction manager does not have a log."),
- 0xC019003C: ("STATUS_ROLLBACK_TIMER_EXPIRED","A rollback could not be scheduled because a previously scheduled rollback has already executed or been queued for execution."),
- 0xC019003D: ("STATUS_TXF_ATTRIBUTE_CORRUPT","The transactional metadata attribute on the file or directory %hs is corrupt and unreadable."),
- 0xC019003E: ("STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION","The encryption operation could not be completed because a transaction is active."),
- 0xC019003F: ("STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED","This object is not allowed to be opened in a transaction."),
- 0xC0190040: ("STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE","Memory mapping (creating a mapped section) a remote file under a transaction is not supported."),
- 0xC0190043: ("STATUS_TRANSACTION_REQUIRED_PROMOTION","Promotion was required to allow the resource manager to enlist, but the transaction was set to disallow it."),
- 0xC0190044: ("STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION","This file is open for modification in an unresolved transaction and may be opened for execute only by a transacted reader."),
- 0xC0190045: ("STATUS_TRANSACTIONS_NOT_FROZEN","The request to thaw frozen transactions was ignored because transactions were not previously frozen."),
- 0xC0190046: ("STATUS_TRANSACTION_FREEZE_IN_PROGRESS","Transactions cannot be frozen because a freeze is already in progress."),
- 0xC0190047: ("STATUS_NOT_SNAPSHOT_VOLUME","The target volume is not a snapshot volume. This operation is valid only on a volume mounted as a snapshot."),
- 0xC0190048: ("STATUS_NO_SAVEPOINT_WITH_OPEN_FILES","The savepoint operation failed because files are open on the transaction, which is not permitted."),
- 0xC0190049: ("STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION","The sparse operation could not be completed because a transaction is active on the file."),
- 0xC019004A: ("STATUS_TM_IDENTITY_MISMATCH","The call to create a transaction manager object failed because the Tm Identity that is stored in the log file does not match the Tm Identity that was passed in as an argument."),
- 0xC019004B: ("STATUS_FLOATED_SECTION","I/O was attempted on a section object that has been floated as a result of a transaction ending. There is no valid data."),
- 0xC019004C: ("STATUS_CANNOT_ACCEPT_TRANSACTED_WORK","The transactional resource manager cannot currently accept transacted work due to a transient condition, such as low resources."),
- 0xC019004D: ("STATUS_CANNOT_ABORT_TRANSACTIONS","The transactional resource manager had too many transactions outstanding that could not be aborted. The transactional resource manager has been shut down."),
- 0xC019004E: ("STATUS_TRANSACTION_NOT_FOUND","The specified transaction was unable to be opened because it was not found."),
- 0xC019004F: ("STATUS_RESOURCEMANAGER_NOT_FOUND","The specified resource manager was unable to be opened because it was not found."),
- 0xC0190050: ("STATUS_ENLISTMENT_NOT_FOUND","The specified enlistment was unable to be opened because it was not found."),
- 0xC0190051: ("STATUS_TRANSACTIONMANAGER_NOT_FOUND","The specified transaction manager was unable to be opened because it was not found."),
- 0xC0190052: ("STATUS_TRANSACTIONMANAGER_NOT_ONLINE","The specified resource manager was unable to create an enlistment because its associated transaction manager is not online."),
- 0xC0190053: ("STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION","The specified transaction manager was unable to create the objects contained in its log file in the Ob namespace. Therefore, the transaction manager was unable to recover."),
- 0xC0190054: ("STATUS_TRANSACTION_NOT_ROOT","The call to create a superior enlistment on this transaction object could not be completed because the transaction object specified for the enlistment is a subordinate branch of the transaction. Only the root of the transaction can be enlisted as a superior."),
- 0xC0190055: ("STATUS_TRANSACTION_OBJECT_EXPIRED","Because the associated transaction manager or resource manager has been closed, the handle is no longer valid."),
- 0xC0190056: ("STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION","The compression operation could not be completed because a transaction is active on the file."),
- 0xC0190057: ("STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED","The specified operation could not be performed on this superior enlistment because the enlistment was not created with the corresponding completion response in the NotificationMask."),
- 0xC0190058: ("STATUS_TRANSACTION_RECORD_TOO_LONG","The specified operation could not be performed because the record to be logged was too long. This can occur because either there are too many enlistments on this transaction or the combined RecoveryInformation being logged on behalf of those enlistments is too long."),
- 0xC0190059: ("STATUS_NO_LINK_TRACKING_IN_TRANSACTION","The link-tracking operation could not be completed because a transaction is active."),
- 0xC019005A: ("STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION","This operation cannot be performed in a transaction."),
- 0xC019005B: ("STATUS_TRANSACTION_INTEGRITY_VIOLATED","The kernel transaction manager had to abort or forget the transaction because it blocked forward progress."),
- 0xC0190060: ("STATUS_EXPIRED_HANDLE","The handle is no longer properly associated with its transaction. It may have been opened in a transactional resource manager that was subsequently forced to restart. Please close the handle and open a new one."),
- 0xC0190061: ("STATUS_TRANSACTION_NOT_ENLISTED","The specified operation could not be performed because the resource manager is not enlisted in the transaction."),
- 0xC01A0001: ("STATUS_LOG_SECTOR_INVALID","The log service found an invalid log sector."),
- 0xC01A0002: ("STATUS_LOG_SECTOR_PARITY_INVALID","The log service encountered a log sector with invalid block parity."),
- 0xC01A0003: ("STATUS_LOG_SECTOR_REMAPPED","The log service encountered a remapped log sector."),
- 0xC01A0004: ("STATUS_LOG_BLOCK_INCOMPLETE","The log service encountered a partial or incomplete log block."),
- 0xC01A0005: ("STATUS_LOG_INVALID_RANGE","The log service encountered an attempt to access data outside the active log range."),
- 0xC01A0006: ("STATUS_LOG_BLOCKS_EXHAUSTED","The log service user-log marshaling buffers are exhausted."),
- 0xC01A0007: ("STATUS_LOG_READ_CONTEXT_INVALID","The log service encountered an attempt to read from a marshaling area with an invalid read context."),
- 0xC01A0008: ("STATUS_LOG_RESTART_INVALID","The log service encountered an invalid log restart area."),
- 0xC01A0009: ("STATUS_LOG_BLOCK_VERSION","The log service encountered an invalid log block version."),
- 0xC01A000A: ("STATUS_LOG_BLOCK_INVALID","The log service encountered an invalid log block."),
- 0xC01A000B: ("STATUS_LOG_READ_MODE_INVALID","The log service encountered an attempt to read the log with an invalid read mode."),
- 0xC01A000D: ("STATUS_LOG_METADATA_CORRUPT","The log service encountered a corrupted metadata file."),
- 0xC01A000E: ("STATUS_LOG_METADATA_INVALID","The log service encountered a metadata file that could not be created by the log file system."),
- 0xC01A000F: ("STATUS_LOG_METADATA_INCONSISTENT","The log service encountered a metadata file with inconsistent data."),
- 0xC01A0010: ("STATUS_LOG_RESERVATION_INVALID","The log service encountered an attempt to erroneously allocate or dispose reservation space."),
- 0xC01A0011: ("STATUS_LOG_CANT_DELETE","The log service cannot delete the log file or the file system container."),
- 0xC01A0012: ("STATUS_LOG_CONTAINER_LIMIT_EXCEEDED","The log service has reached the maximum allowable containers allocated to a log file."),
- 0xC01A0013: ("STATUS_LOG_START_OF_LOG","The log service has attempted to read or write backward past the start of the log."),
- 0xC01A0014: ("STATUS_LOG_POLICY_ALREADY_INSTALLED","The log policy could not be installed because a policy of the same type is already present."),
- 0xC01A0015: ("STATUS_LOG_POLICY_NOT_INSTALLED","The log policy in question was not installed at the time of the request."),
- 0xC01A0016: ("STATUS_LOG_POLICY_INVALID","The installed set of policies on the log is invalid."),
- 0xC01A0017: ("STATUS_LOG_POLICY_CONFLICT","A policy on the log in question prevented the operation from completing."),
- 0xC01A0018: ("STATUS_LOG_PINNED_ARCHIVE_TAIL","The log space cannot be reclaimed because the log is pinned by the archive tail."),
- 0xC01A0019: ("STATUS_LOG_RECORD_NONEXISTENT","The log record is not a record in the log file."),
- 0xC01A001A: ("STATUS_LOG_RECORDS_RESERVED_INVALID","The number of reserved log records or the adjustment of the number of reserved log records is invalid."),
- 0xC01A001B: ("STATUS_LOG_SPACE_RESERVED_INVALID","The reserved log space or the adjustment of the log space is invalid."),
- 0xC01A001C: ("STATUS_LOG_TAIL_INVALID","A new or existing archive tail or the base of the active log is invalid."),
- 0xC01A001D: ("STATUS_LOG_FULL","The log space is exhausted."),
- 0xC01A001E: ("STATUS_LOG_MULTIPLEXED","The log is multiplexed; no direct writes to the physical log are allowed."),
- 0xC01A001F: ("STATUS_LOG_DEDICATED","The operation failed because the log is dedicated."),
- 0xC01A0020: ("STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS","The operation requires an archive context."),
- 0xC01A0021: ("STATUS_LOG_ARCHIVE_IN_PROGRESS","Log archival is in progress."),
- 0xC01A0022: ("STATUS_LOG_EPHEMERAL","The operation requires a nonephemeral log, but the log is ephemeral."),
- 0xC01A0023: ("STATUS_LOG_NOT_ENOUGH_CONTAINERS","The log must have at least two containers before it can be read from or written to."),
- 0xC01A0024: ("STATUS_LOG_CLIENT_ALREADY_REGISTERED","A log client has already registered on the stream."),
- 0xC01A0025: ("STATUS_LOG_CLIENT_NOT_REGISTERED","A log client has not been registered on the stream."),
- 0xC01A0026: ("STATUS_LOG_FULL_HANDLER_IN_PROGRESS","A request has already been made to handle the log full condition."),
- 0xC01A0027: ("STATUS_LOG_CONTAINER_READ_FAILED","The log service encountered an error when attempting to read from a log container."),
- 0xC01A0028: ("STATUS_LOG_CONTAINER_WRITE_FAILED","The log service encountered an error when attempting to write to a log container."),
- 0xC01A0029: ("STATUS_LOG_CONTAINER_OPEN_FAILED","The log service encountered an error when attempting to open a log container."),
- 0xC01A002A: ("STATUS_LOG_CONTAINER_STATE_INVALID","The log service encountered an invalid container state when attempting a requested action."),
- 0xC01A002B: ("STATUS_LOG_STATE_INVALID","The log service is not in the correct state to perform a requested action."),
- 0xC01A002C: ("STATUS_LOG_PINNED","The log space cannot be reclaimed because the log is pinned."),
- 0xC01A002D: ("STATUS_LOG_METADATA_FLUSH_FAILED","The log metadata flush failed."),
- 0xC01A002E: ("STATUS_LOG_INCONSISTENT_SECURITY","Security on the log and its containers is inconsistent."),
- 0xC01A002F: ("STATUS_LOG_APPENDED_FLUSH_FAILED","Records were appended to the log or reservation changes were made, but the log could not be flushed."),
- 0xC01A0030: ("STATUS_LOG_PINNED_RESERVATION","The log is pinned due to reservation consuming most of the log space. Free some reserved records to make space available."),
- 0xC01B00EA: ("STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD","{Display Driver Stopped Responding} The %hs display driver has stopped working normally. Save your work and reboot the system to restore full display functionality. The next time you reboot the computer, a dialog box will allow you to upload data about this failure to Microsoft."),
- 0xC01C0001: ("STATUS_FLT_NO_HANDLER_DEFINED","A handler was not defined by the filter for this operation."),
- 0xC01C0002: ("STATUS_FLT_CONTEXT_ALREADY_DEFINED","A context is already defined for this object."),
- 0xC01C0003: ("STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST","Asynchronous requests are not valid for this operation."),
- 0xC01C0004: ("STATUS_FLT_DISALLOW_FAST_IO","This is an internal error code used by the filter manager to determine if a fast I/O operation should be forced down the input/output request packet (IRP) path. Minifilters should never return this value."),
- 0xC01C0005: ("STATUS_FLT_INVALID_NAME_REQUEST","An invalid name request was made. The name requested cannot be retrieved at this time."),
- 0xC01C0006: ("STATUS_FLT_NOT_SAFE_TO_POST_OPERATION","Posting this operation to a worker thread for further processing is not safe at this time because it could lead to a system deadlock."),
- 0xC01C0007: ("STATUS_FLT_NOT_INITIALIZED","The Filter Manager was not initialized when a filter tried to register. Make sure that the Filter Manager is loaded as a driver."),
- 0xC01C0008: ("STATUS_FLT_FILTER_NOT_READY","The filter is not ready for attachment to volumes because it has not finished initializing (FltStartFiltering has not been called)."),
- 0xC01C0009: ("STATUS_FLT_POST_OPERATION_CLEANUP","The filter must clean up any operation-specific context at this time because it is being removed from the system before the operation is completed by the lower drivers."),
- 0xC01C000A: ("STATUS_FLT_INTERNAL_ERROR","The Filter Manager had an internal error from which it cannot recover; therefore, the operation has failed. This is usually the result of a filter returning an invalid value from a pre-operation callback."),
- 0xC01C000B: ("STATUS_FLT_DELETING_OBJECT","The object specified for this action is in the process of being deleted; therefore, the action requested cannot be completed at this time."),
- 0xC01C000C: ("STATUS_FLT_MUST_BE_NONPAGED_POOL","A nonpaged pool must be used for this type of context."),
- 0xC01C000D: ("STATUS_FLT_DUPLICATE_ENTRY","A duplicate handler definition has been provided for an operation."),
- 0xC01C000E: ("STATUS_FLT_CBDQ_DISABLED","The callback data queue has been disabled."),
- 0xC01C000F: ("STATUS_FLT_DO_NOT_ATTACH","Do not attach the filter to the volume at this time."),
- 0xC01C0010: ("STATUS_FLT_DO_NOT_DETACH","Do not detach the filter from the volume at this time."),
- 0xC01C0011: ("STATUS_FLT_INSTANCE_ALTITUDE_COLLISION","An instance already exists at this altitude on the volume specified."),
- 0xC01C0012: ("STATUS_FLT_INSTANCE_NAME_COLLISION","An instance already exists with this name on the volume specified."),
- 0xC01C0013: ("STATUS_FLT_FILTER_NOT_FOUND","The system could not find the filter specified."),
- 0xC01C0014: ("STATUS_FLT_VOLUME_NOT_FOUND","The system could not find the volume specified."),
- 0xC01C0015: ("STATUS_FLT_INSTANCE_NOT_FOUND","The system could not find the instance specified."),
- 0xC01C0016: ("STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND","No registered context allocation definition was found for the given request."),
- 0xC01C0017: ("STATUS_FLT_INVALID_CONTEXT_REGISTRATION","An invalid parameter was specified during context registration."),
- 0xC01C0018: ("STATUS_FLT_NAME_CACHE_MISS","The name requested was not found in the Filter Manager name cache and could not be retrieved from the file system."),
- 0xC01C0019: ("STATUS_FLT_NO_DEVICE_OBJECT","The requested device object does not exist for the given volume."),
- 0xC01C001A: ("STATUS_FLT_VOLUME_ALREADY_MOUNTED","The specified volume is already mounted."),
- 0xC01C001B: ("STATUS_FLT_ALREADY_ENLISTED","The specified transaction context is already enlisted in a transaction."),
- 0xC01C001C: ("STATUS_FLT_CONTEXT_ALREADY_LINKED","The specified context is already attached to another object."),
- 0xC01C0020: ("STATUS_FLT_NO_WAITER_FOR_REPLY","No waiter is present for the filter's reply to this message."),
- 0xC01D0001: ("STATUS_MONITOR_NO_DESCRIPTOR","A monitor descriptor could not be obtained."),
- 0xC01D0002: ("STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT","This release does not support the format of the obtained monitor descriptor."),
- 0xC01D0003: ("STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM","The checksum of the obtained monitor descriptor is invalid."),
- 0xC01D0004: ("STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK","The monitor descriptor contains an invalid standard timing block."),
- 0xC01D0005: ("STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED","WMI data-block registration failed for one of the MSMonitorClass WMI subclasses."),
- 0xC01D0006: ("STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK","The provided monitor descriptor block is either corrupted or does not contain the monitor's detailed serial number."),
- 0xC01D0007: ("STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK","The provided monitor descriptor block is either corrupted or does not contain the monitor's user-friendly name."),
- 0xC01D0008: ("STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA","There is no monitor descriptor data at the specified (offset or size) region."),
- 0xC01D0009: ("STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK","The monitor descriptor contains an invalid detailed timing block."),
- 0xC01D000A: ("STATUS_MONITOR_INVALID_MANUFACTURE_DATE","Monitor descriptor contains invalid manufacture date."),
- 0xC01E0000: ("STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER","Exclusive mode ownership is needed to create an unmanaged primary allocation."),
- 0xC01E0001: ("STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER","The driver needs more DMA buffer space to complete the requested operation."),
- 0xC01E0002: ("STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER","The specified display adapter handle is invalid."),
- 0xC01E0003: ("STATUS_GRAPHICS_ADAPTER_WAS_RESET","The specified display adapter and all of its state have been reset."),
- 0xC01E0004: ("STATUS_GRAPHICS_INVALID_DRIVER_MODEL","The driver stack does not match the expected driver model."),
- 0xC01E0005: ("STATUS_GRAPHICS_PRESENT_MODE_CHANGED","Present happened but ended up into the changed desktop mode."),
- 0xC01E0006: ("STATUS_GRAPHICS_PRESENT_OCCLUDED","Nothing to present due to desktop occlusion."),
- 0xC01E0007: ("STATUS_GRAPHICS_PRESENT_DENIED","Not able to present due to denial of desktop access."),
- 0xC01E0008: ("STATUS_GRAPHICS_CANNOTCOLORCONVERT","Not able to present with color conversion."),
- 0xC01E000B: ("STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED","Present redirection is disabled (desktop windowing management subsystem is off)."),
- 0xC01E000C: ("STATUS_GRAPHICS_PRESENT_UNOCCLUDED","Previous exclusive VidPn source owner has released its ownership"),
- 0xC01E0100: ("STATUS_GRAPHICS_NO_VIDEO_MEMORY","Not enough video memory is available to complete the operation."),
- 0xC01E0101: ("STATUS_GRAPHICS_CANT_LOCK_MEMORY","Could not probe and lock the underlying memory of an allocation."),
- 0xC01E0102: ("STATUS_GRAPHICS_ALLOCATION_BUSY","The allocation is currently busy."),
- 0xC01E0103: ("STATUS_GRAPHICS_TOO_MANY_REFERENCES","An object being referenced has already reached the maximum reference count and cannot be referenced further."),
- 0xC01E0104: ("STATUS_GRAPHICS_TRY_AGAIN_LATER","A problem could not be solved due to an existing condition. Try again later."),
- 0xC01E0105: ("STATUS_GRAPHICS_TRY_AGAIN_NOW","A problem could not be solved due to an existing condition. Try again now."),
- 0xC01E0106: ("STATUS_GRAPHICS_ALLOCATION_INVALID","The allocation is invalid."),
- 0xC01E0107: ("STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE","No more unswizzling apertures are currently available."),
- 0xC01E0108: ("STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED","The current allocation cannot be unswizzled by an aperture."),
- 0xC01E0109: ("STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION","The request failed because a pinned allocation cannot be evicted."),
- 0xC01E0110: ("STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE","The allocation cannot be used from its current segment location for the specified operation."),
- 0xC01E0111: ("STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION","A locked allocation cannot be used in the current command buffer."),
- 0xC01E0112: ("STATUS_GRAPHICS_ALLOCATION_CLOSED","The allocation being referenced has been closed permanently."),
- 0xC01E0113: ("STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE","An invalid allocation instance is being referenced."),
- 0xC01E0114: ("STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE","An invalid allocation handle is being referenced."),
- 0xC01E0115: ("STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE","The allocation being referenced does not belong to the current device."),
- 0xC01E0116: ("STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST","The specified allocation lost its content."),
- 0xC01E0200: ("STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE","A GPU exception was detected on the given device. The device cannot be scheduled."),
- 0xC01E0300: ("STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY","The specified VidPN topology is invalid."),
- 0xC01E0301: ("STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED","The specified VidPN topology is valid but is not supported by this model of the display adapter."),
- 0xC01E0302: ("STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED","The specified VidPN topology is valid but is not currently supported by the display adapter due to allocation of its resources."),
- 0xC01E0303: ("STATUS_GRAPHICS_INVALID_VIDPN","The specified VidPN handle is invalid."),
- 0xC01E0304: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE","The specified video present source is invalid."),
- 0xC01E0305: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET","The specified video present target is invalid."),
- 0xC01E0306: ("STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED","The specified VidPN modality is not supported (for example, at least two of the pinned modes are not co-functional)."),
- 0xC01E0308: ("STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET","The specified VidPN source mode set is invalid."),
- 0xC01E0309: ("STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET","The specified VidPN target mode set is invalid."),
- 0xC01E030A: ("STATUS_GRAPHICS_INVALID_FREQUENCY","The specified video signal frequency is invalid."),
- 0xC01E030B: ("STATUS_GRAPHICS_INVALID_ACTIVE_REGION","The specified video signal active region is invalid."),
- 0xC01E030C: ("STATUS_GRAPHICS_INVALID_TOTAL_REGION","The specified video signal total region is invalid."),
- 0xC01E0310: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE","The specified video present source mode is invalid."),
- 0xC01E0311: ("STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE","The specified video present target mode is invalid."),
- 0xC01E0312: ("STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET","The pinned mode must remain in the set on the VidPN's co-functional modality enumeration."),
- 0xC01E0313: ("STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY","The specified video present path is already in the VidPN's topology."),
- 0xC01E0314: ("STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET","The specified mode is already in the mode set."),
- 0xC01E0315: ("STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET","The specified video present source set is invalid."),
- 0xC01E0316: ("STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET","The specified video present target set is invalid."),
- 0xC01E0317: ("STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET","The specified video present source is already in the video present source set."),
- 0xC01E0318: ("STATUS_GRAPHICS_TARGET_ALREADY_IN_SET","The specified video present target is already in the video present target set."),
- 0xC01E0319: ("STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH","The specified VidPN present path is invalid."),
- 0xC01E031A: ("STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY","The miniport has no recommendation for augmenting the specified VidPN's topology."),
- 0xC01E031B: ("STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET","The specified monitor frequency range set is invalid."),
- 0xC01E031C: ("STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE","The specified monitor frequency range is invalid."),
- 0xC01E031D: ("STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET","The specified frequency range is not in the specified monitor frequency range set."),
- 0xC01E031F: ("STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET","The specified frequency range is already in the specified monitor frequency range set."),
- 0xC01E0320: ("STATUS_GRAPHICS_STALE_MODESET","The specified mode set is stale. Reacquire the new mode set."),
- 0xC01E0321: ("STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET","The specified monitor source mode set is invalid."),
- 0xC01E0322: ("STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE","The specified monitor source mode is invalid."),
- 0xC01E0323: ("STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN","The miniport does not have a recommendation regarding the request to provide a functional VidPN given the current display adapter configuration."),
- 0xC01E0324: ("STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE","The ID of the specified mode is being used by another mode in the set."),
- 0xC01E0325: ("STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION","The system failed to determine a mode that is supported by both the display adapter and the monitor connected to it."),
- 0xC01E0326: ("STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES","The number of video present targets must be greater than or equal to the number of video present sources."),
- 0xC01E0327: ("STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY","The specified present path is not in the VidPN's topology."),
- 0xC01E0328: ("STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE","The display adapter must have at least one video present source."),
- 0xC01E0329: ("STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET","The display adapter must have at least one video present target."),
- 0xC01E032A: ("STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET","The specified monitor descriptor set is invalid."),
- 0xC01E032B: ("STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR","The specified monitor descriptor is invalid."),
- 0xC01E032C: ("STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET","The specified descriptor is not in the specified monitor descriptor set."),
- 0xC01E032D: ("STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET","The specified descriptor is already in the specified monitor descriptor set."),
- 0xC01E032E: ("STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE","The ID of the specified monitor descriptor is being used by another descriptor in the set."),
- 0xC01E032F: ("STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE","The specified video present target subset type is invalid."),
- 0xC01E0330: ("STATUS_GRAPHICS_RESOURCES_NOT_RELATED","Two or more of the specified resources are not related to each other, as defined by the interface semantics."),
- 0xC01E0331: ("STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE","The ID of the specified video present source is being used by another source in the set."),
- 0xC01E0332: ("STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE","The ID of the specified video present target is being used by another target in the set."),
- 0xC01E0333: ("STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET","The specified VidPN source cannot be used because there is no available VidPN target to connect it to."),
- 0xC01E0334: ("STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER","The newly arrived monitor could not be associated with a display adapter."),
- 0xC01E0335: ("STATUS_GRAPHICS_NO_VIDPNMGR","The particular display adapter does not have an associated VidPN manager."),
- 0xC01E0336: ("STATUS_GRAPHICS_NO_ACTIVE_VIDPN","The VidPN manager of the particular display adapter does not have an active VidPN."),
- 0xC01E0337: ("STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY","The specified VidPN topology is stale; obtain the new topology."),
- 0xC01E0338: ("STATUS_GRAPHICS_MONITOR_NOT_CONNECTED","No monitor is connected on the specified video present target."),
- 0xC01E0339: ("STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY","The specified source is not part of the specified VidPN's topology."),
- 0xC01E033A: ("STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE","The specified primary surface size is invalid."),
- 0xC01E033B: ("STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE","The specified visible region size is invalid."),
- 0xC01E033C: ("STATUS_GRAPHICS_INVALID_STRIDE","The specified stride is invalid."),
- 0xC01E033D: ("STATUS_GRAPHICS_INVALID_PIXELFORMAT","The specified pixel format is invalid."),
- 0xC01E033E: ("STATUS_GRAPHICS_INVALID_COLORBASIS","The specified color basis is invalid."),
- 0xC01E033F: ("STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE","The specified pixel value access mode is invalid."),
- 0xC01E0340: ("STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY","The specified target is not part of the specified VidPN's topology."),
- 0xC01E0341: ("STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT","Failed to acquire the display mode management interface."),
- 0xC01E0342: ("STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE","The specified VidPN source is already owned by a DMM client and cannot be used until that client releases it."),
- 0xC01E0343: ("STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN","The specified VidPN is active and cannot be accessed."),
- 0xC01E0344: ("STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL","The specified VidPN's present path importance ordinal is invalid."),
- 0xC01E0345: ("STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION","The specified VidPN's present path content geometry transformation is invalid."),
- 0xC01E0346: ("STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED","The specified content geometry transformation is not supported on the respective VidPN present path."),
- 0xC01E0347: ("STATUS_GRAPHICS_INVALID_GAMMA_RAMP","The specified gamma ramp is invalid."),
- 0xC01E0348: ("STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED","The specified gamma ramp is not supported on the respective VidPN present path."),
- 0xC01E0349: ("STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED","Multisampling is not supported on the respective VidPN present path."),
- 0xC01E034A: ("STATUS_GRAPHICS_MODE_NOT_IN_MODESET","The specified mode is not in the specified mode set."),
- 0xC01E034D: ("STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON","The specified VidPN topology recommendation reason is invalid."),
- 0xC01E034E: ("STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE","The specified VidPN present path content type is invalid."),
- 0xC01E034F: ("STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE","The specified VidPN present path copy protection type is invalid."),
- 0xC01E0350: ("STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS","Only one unassigned mode set can exist at any one time for a particular VidPN source or target."),
- 0xC01E0352: ("STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING","The specified scan line ordering type is invalid."),
- 0xC01E0353: ("STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED","The topology changes are not allowed for the specified VidPN."),
- 0xC01E0354: ("STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS","All available importance ordinals are being used in the specified topology."),
- 0xC01E0355: ("STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT","The specified primary surface has a different private-format attribute than the current primary surface."),
- 0xC01E0356: ("STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM","The specified mode-pruning algorithm is invalid."),
- 0xC01E0357: ("STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN","The specified monitor-capability origin is invalid."),
- 0xC01E0358: ("STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT","The specified monitor-frequency range constraint is invalid."),
- 0xC01E0359: ("STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED","The maximum supported number of present paths has been reached."),
- 0xC01E035A: ("STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION","The miniport requested that augmentation be canceled for the specified source of the specified VidPN's topology."),
- 0xC01E035B: ("STATUS_GRAPHICS_INVALID_CLIENT_TYPE","The specified client type was not recognized."),
- 0xC01E035C: ("STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET","The client VidPN is not set on this adapter (for example, no user mode-initiated mode changes have taken place on this adapter)."),
- 0xC01E0400: ("STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED","The specified display adapter child device already has an external device connected to it."),
- 0xC01E0401: ("STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED","The display adapter child device does not support reporting a descriptor."),
- 0xC01E0430: ("STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER","The display adapter is not linked to any other adapters."),
- 0xC01E0431: ("STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED","The lead adapter in a linked configuration was not enumerated yet."),
- 0xC01E0432: ("STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED","Some chain adapters in a linked configuration have not yet been enumerated."),
- 0xC01E0433: ("STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY","The chain of linked adapters is not ready to start because of an unknown failure."),
- 0xC01E0434: ("STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED","An attempt was made to start a lead link display adapter when the chain links had not yet started."),
- 0xC01E0435: ("STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON","An attempt was made to turn on a lead link display adapter when the chain links were turned off."),
- 0xC01E0436: ("STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE","The adapter link was found in an inconsistent state. Not all adapters are in an expected PNP/power state."),
- 0xC01E0438: ("STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER","The driver trying to start is not the same as the driver for the posted display adapter."),
- 0xC01E043B: ("STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED","An operation is being attempted that requires the display adapter to be in a quiescent state."),
- 0xC01E0500: ("STATUS_GRAPHICS_OPM_NOT_SUPPORTED","The driver does not support OPM."),
- 0xC01E0501: ("STATUS_GRAPHICS_COPP_NOT_SUPPORTED","The driver does not support COPP."),
- 0xC01E0502: ("STATUS_GRAPHICS_UAB_NOT_SUPPORTED","The driver does not support UAB."),
- 0xC01E0503: ("STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS","The specified encrypted parameters are invalid."),
- 0xC01E0504: ("STATUS_GRAPHICS_OPM_PARAMETER_ARRAY_TOO_SMALL","An array passed to a function cannot hold all of the data that the function wants to put in it."),
- 0xC01E0505: ("STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST","The GDI display device passed to this function does not have any active protected outputs."),
- 0xC01E0506: ("STATUS_GRAPHICS_PVP_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME","The PVP cannot find an actual GDI display device that corresponds to the passed-in GDI display device name."),
- 0xC01E0507: ("STATUS_GRAPHICS_PVP_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP","This function failed because the GDI display device passed to it was not attached to the Windows desktop."),
- 0xC01E0508: ("STATUS_GRAPHICS_PVP_MIRRORING_DEVICES_NOT_SUPPORTED","The PVP does not support mirroring display devices because they do not have any protected outputs."),
- 0xC01E050A: ("STATUS_GRAPHICS_OPM_INVALID_POINTER","The function failed because an invalid pointer parameter was passed to it. A pointer parameter is invalid if it is null, is not correctly aligned, or it points to an invalid address or a kernel mode address."),
- 0xC01E050B: ("STATUS_GRAPHICS_OPM_INTERNAL_ERROR","An internal error caused an operation to fail."),
- 0xC01E050C: ("STATUS_GRAPHICS_OPM_INVALID_HANDLE","The function failed because the caller passed in an invalid OPM user-mode handle."),
- 0xC01E050D: ("STATUS_GRAPHICS_PVP_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE","This function failed because the GDI device passed to it did not have any monitors associated with it."),
- 0xC01E050E: ("STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH","A certificate could not be returned because the certificate buffer passed to the function was too small."),
- 0xC01E050F: ("STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED","DxgkDdiOpmCreateProtectedOutput() could not create a protected output because the video present yarget is in spanning mode."),
- 0xC01E0510: ("STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED","DxgkDdiOpmCreateProtectedOutput() could not create a protected output because the video present target is in theater mode."),
- 0xC01E0511: ("STATUS_GRAPHICS_PVP_HFS_FAILED","The function call failed because the display adapter's hardware functionality scan (HFS) failed to validate the graphics hardware."),
- 0xC01E0512: ("STATUS_GRAPHICS_OPM_INVALID_SRM","The HDCP SRM passed to this function did not comply with section 5 of the HDCP 1.1 specification."),
- 0xC01E0513: ("STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP","The protected output cannot enable the HDCP system because it does not support it."),
- 0xC01E0514: ("STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP","The protected output cannot enable analog copy protection because it does not support it."),
- 0xC01E0515: ("STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA","The protected output cannot enable the CGMS-A protection technology because it does not support it."),
- 0xC01E0516: ("STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET","DxgkDdiOPMGetInformation() cannot return the version of the SRM being used because the application never successfully passed an SRM to the protected output."),
- 0xC01E0517: ("STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH","DxgkDdiOPMConfigureProtectedOutput() cannot enable the specified output protection technology because the output's screen resolution is too high."),
- 0xC01E0518: ("STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE","DxgkDdiOPMConfigureProtectedOutput() cannot enable HDCP because other physical outputs are using the display adapter's HDCP hardware."),
- 0xC01E051A: ("STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS","The operating system asynchronously destroyed this OPM-protected output because the operating system state changed. This error typically occurs because the monitor PDO associated with this protected output was removed or stopped, the protected output's session became a nonconsole session, or the protected output's desktop became inactive."),
- 0xC01E051B: ("STATUS_GRAPHICS_OPM_SESSION_TYPE_CHANGE_IN_PROGRESS","OPM functions cannot be called when a session is changing its type. Three types of sessions currently exist: console, disconnected, and remote (RDP or ICA)."),
- 0xC01E051C: ("STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS","The DxgkDdiOPMGetCOPPCompatibleInformation, DxgkDdiOPMGetInformation, or DxgkDdiOPMConfigureProtectedOutput function failed. This error is returned only if a protected output has OPM semantics. DxgkDdiOPMGetCOPPCompatibleInformation always returns this error if a protected output has OPM semantics. DxgkDdiOPMGetInformation returns this error code if the caller requested COPP-specific information. DxgkDdiOPMConfigureProtectedOutput returns this error when the caller tries to use a COPP-specific command."),
- 0xC01E051D: ("STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST","The DxgkDdiOPMGetInformation and DxgkDdiOPMGetCOPPCompatibleInformation functions return this error code if the passed-in sequence number is not the expected sequence number or the passed-in OMAC value is invalid."),
- 0xC01E051E: ("STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR","The function failed because an unexpected error occurred inside a display driver."),
- 0xC01E051F: ("STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS","The DxgkDdiOPMGetCOPPCompatibleInformation, DxgkDdiOPMGetInformation, or DxgkDdiOPMConfigureProtectedOutput function failed. This error is returned only if a protected output has COPP semantics. DxgkDdiOPMGetCOPPCompatibleInformation returns this error code if the caller requested OPM-specific information. DxgkDdiOPMGetInformation always returns this error if a protected output has COPP semantics. DxgkDdiOPMConfigureProtectedOutput returns this error when the caller tries to use an OPM-specific command."),
- 0xC01E0520: ("STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED","The DxgkDdiOPMGetCOPPCompatibleInformation and DxgkDdiOPMConfigureProtectedOutput functions return this error if the display driver does not support the DXGKMDT_OPM_GET_ACP_AND_CGMSA_SIGNALING and DXGKMDT_OPM_SET_ACP_AND_CGMSA_SIGNALING GUIDs."),
- 0xC01E0521: ("STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST","The DxgkDdiOPMConfigureProtectedOutput function returns this error code if the passed-in sequence number is not the expected sequence number or the passed-in OMAC value is invalid."),
- 0xC01E0580: ("STATUS_GRAPHICS_I2C_NOT_SUPPORTED","The monitor connected to the specified video output does not have an I2C bus."),
- 0xC01E0581: ("STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST","No device on the I2C bus has the specified address."),
- 0xC01E0582: ("STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA","An error occurred while transmitting data to the device on the I2C bus."),
- 0xC01E0583: ("STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA","An error occurred while receiving data from the device on the I2C bus."),
- 0xC01E0584: ("STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED","The monitor does not support the specified VCP code."),
- 0xC01E0585: ("STATUS_GRAPHICS_DDCCI_INVALID_DATA","The data received from the monitor is invalid."),
- 0xC01E0586: ("STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE","A function call failed because a monitor returned an invalid timing status byte when the operating system used the DDC/CI get timing report and timing message command to get a timing report from a monitor."),
- 0xC01E0587: ("STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING","A monitor returned a DDC/CI capabilities string that did not comply with the ACCESS.bus 3.0, DDC/CI 1.1, or MCCS 2 Revision 1 specification."),
- 0xC01E0588: ("STATUS_GRAPHICS_MCA_INTERNAL_ERROR","An internal error caused an operation to fail."),
- 0xC01E0589: ("STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND","An operation failed because a DDC/CI message had an invalid value in its command field."),
- 0xC01E058A: ("STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH","This error occurred because a DDC/CI message had an invalid value in its length field."),
- 0xC01E058B: ("STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM","This error occurred because the value in a DDC/CI message's checksum field did not match the message's computed checksum value. This error implies that the data was corrupted while it was being transmitted from a monitor to a computer."),
- 0xC01E058C: ("STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE","This function failed because an invalid monitor handle was passed to it."),
- 0xC01E058D: ("STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS","The operating system asynchronously destroyed the monitor that corresponds to this handle because the operating system's state changed. This error typically occurs because the monitor PDO associated with this handle was removed or stopped, or a display mode change occurred. A display mode change occurs when Windows sends a WM_DISPLAYCHANGE message to applications."),
- 0xC01E05E0: ("STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED","This function can be used only if a program is running in the local console session. It cannot be used if a program is running on a remote desktop session or on a terminal server session."),
- 0xC01E05E1: ("STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME","This function cannot find an actual GDI display device that corresponds to the specified GDI display device name."),
- 0xC01E05E2: ("STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP","The function failed because the specified GDI display device was not attached to the Windows desktop."),
- 0xC01E05E3: ("STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED","This function does not support GDI mirroring display devices because GDI mirroring display devices do not have any physical monitors associated with them."),
- 0xC01E05E4: ("STATUS_GRAPHICS_INVALID_POINTER","The function failed because an invalid pointer parameter was passed to it. A pointer parameter is invalid if it is null, is not correctly aligned, or points to an invalid address or to a kernel mode address."),
- 0xC01E05E5: ("STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE","This function failed because the GDI device passed to it did not have a monitor associated with it."),
- 0xC01E05E6: ("STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL","An array passed to the function cannot hold all of the data that the function must copy into the array."),
- 0xC01E05E7: ("STATUS_GRAPHICS_INTERNAL_ERROR","An internal error caused an operation to fail."),
- 0xC01E05E8: ("STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS","The function failed because the current session is changing its type. This function cannot be called when the current session is changing its type. Three types of sessions currently exist: console, disconnected, and remote (RDP or ICA)."),
- 0xC0210000: ("STATUS_FVE_LOCKED_VOLUME","The volume must be unlocked before it can be used."),
- 0xC0210001: ("STATUS_FVE_NOT_ENCRYPTED","The volume is fully decrypted and no key is available."),
- 0xC0210002: ("STATUS_FVE_BAD_INFORMATION","The control block for the encrypted volume is not valid."),
- 0xC0210003: ("STATUS_FVE_TOO_SMALL","Not enough free space remains on the volume to allow encryption."),
- 0xC0210004: ("STATUS_FVE_FAILED_WRONG_FS","The partition cannot be encrypted because the file system is not supported."),
- 0xC0210005: ("STATUS_FVE_FAILED_BAD_FS","The file system is inconsistent. Run the Check Disk utility."),
- 0xC0210006: ("STATUS_FVE_FS_NOT_EXTENDED","The file system does not extend to the end of the volume."),
- 0xC0210007: ("STATUS_FVE_FS_MOUNTED","This operation cannot be performed while a file system is mounted on the volume."),
- 0xC0210008: ("STATUS_FVE_NO_LICENSE","BitLocker Drive Encryption is not included with this version of Windows."),
- 0xC0210009: ("STATUS_FVE_ACTION_NOT_ALLOWED","The requested action was denied by the FVE control engine."),
- 0xC021000A: ("STATUS_FVE_BAD_DATA","The data supplied is malformed."),
- 0xC021000B: ("STATUS_FVE_VOLUME_NOT_BOUND","The volume is not bound to the system."),
- 0xC021000C: ("STATUS_FVE_NOT_DATA_VOLUME","The volume specified is not a data volume."),
- 0xC021000D: ("STATUS_FVE_CONV_READ_ERROR","A read operation failed while converting the volume."),
- 0xC021000E: ("STATUS_FVE_CONV_WRITE_ERROR","A write operation failed while converting the volume."),
- 0xC021000F: ("STATUS_FVE_OVERLAPPED_UPDATE","The control block for the encrypted volume was updated by another thread. Try again."),
- 0xC0210010: ("STATUS_FVE_FAILED_SECTOR_SIZE","The volume encryption algorithm cannot be used on this sector size."),
- 0xC0210011: ("STATUS_FVE_FAILED_AUTHENTICATION","BitLocker recovery authentication failed."),
- 0xC0210012: ("STATUS_FVE_NOT_OS_VOLUME","The volume specified is not the boot operating system volume."),
- 0xC0210013: ("STATUS_FVE_KEYFILE_NOT_FOUND","The BitLocker startup key or recovery password could not be read from external media."),
- 0xC0210014: ("STATUS_FVE_KEYFILE_INVALID","The BitLocker startup key or recovery password file is corrupt or invalid."),
- 0xC0210015: ("STATUS_FVE_KEYFILE_NO_VMK","The BitLocker encryption key could not be obtained from the startup key or the recovery password."),
- 0xC0210016: ("STATUS_FVE_TPM_DISABLED","The TPM is disabled."),
- 0xC0210017: ("STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO","The authorization data for the SRK of the TPM is not zero."),
- 0xC0210018: ("STATUS_FVE_TPM_INVALID_PCR","The system boot information changed or the TPM locked out access to BitLocker encryption keys until the computer is restarted."),
- 0xC0210019: ("STATUS_FVE_TPM_NO_VMK","The BitLocker encryption key could not be obtained from the TPM."),
- 0xC021001A: ("STATUS_FVE_PIN_INVALID","The BitLocker encryption key could not be obtained from the TPM and PIN."),
- 0xC021001B: ("STATUS_FVE_AUTH_INVALID_APPLICATION","A boot application hash does not match the hash computed when BitLocker was turned on."),
- 0xC021001C: ("STATUS_FVE_AUTH_INVALID_CONFIG","The Boot Configuration Data (BCD) settings are not supported or have changed because BitLocker was enabled."),
- 0xC021001D: ("STATUS_FVE_DEBUGGER_ENABLED","Boot debugging is enabled. Run Windows Boot Configuration Data Store Editor (bcdedit.exe) to turn it off."),
- 0xC021001E: ("STATUS_FVE_DRY_RUN_FAILED","The BitLocker encryption key could not be obtained."),
- 0xC021001F: ("STATUS_FVE_BAD_METADATA_POINTER","The metadata disk region pointer is incorrect."),
- 0xC0210020: ("STATUS_FVE_OLD_METADATA_COPY","The backup copy of the metadata is out of date."),
- 0xC0210021: ("STATUS_FVE_REBOOT_REQUIRED","No action was taken because a system restart is required."),
- 0xC0210022: ("STATUS_FVE_RAW_ACCESS","No action was taken because BitLocker Drive Encryption is in RAW access mode."),
- 0xC0210023: ("STATUS_FVE_RAW_BLOCKED","BitLocker Drive Encryption cannot enter RAW access mode for this volume."),
- 0xC0210026: ("STATUS_FVE_NO_FEATURE_LICENSE","This feature of BitLocker Drive Encryption is not included with this version of Windows."),
- 0xC0210027: ("STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED","Group policy does not permit turning off BitLocker Drive Encryption on roaming data volumes."),
- 0xC0210028: ("STATUS_FVE_CONV_RECOVERY_FAILED","Bitlocker Drive Encryption failed to recover from aborted conversion. This could be due to either all conversion logs being corrupted or the media being write-protected."),
- 0xC0210029: ("STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG","The requested virtualization size is too big."),
- 0xC0210030: ("STATUS_FVE_VOLUME_TOO_SMALL","The drive is too small to be protected using BitLocker Drive Encryption."),
- 0xC0220001: ("STATUS_FWP_CALLOUT_NOT_FOUND","The callout does not exist."),
- 0xC0220002: ("STATUS_FWP_CONDITION_NOT_FOUND","The filter condition does not exist."),
- 0xC0220003: ("STATUS_FWP_FILTER_NOT_FOUND","The filter does not exist."),
- 0xC0220004: ("STATUS_FWP_LAYER_NOT_FOUND","The layer does not exist."),
- 0xC0220005: ("STATUS_FWP_PROVIDER_NOT_FOUND","The provider does not exist."),
- 0xC0220006: ("STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND","The provider context does not exist."),
- 0xC0220007: ("STATUS_FWP_SUBLAYER_NOT_FOUND","The sublayer does not exist."),
- 0xC0220008: ("STATUS_FWP_NOT_FOUND","The object does not exist."),
- 0xC0220009: ("STATUS_FWP_ALREADY_EXISTS","An object with that GUID or LUID already exists."),
- 0xC022000A: ("STATUS_FWP_IN_USE","The object is referenced by other objects and cannot be deleted."),
- 0xC022000B: ("STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS","The call is not allowed from within a dynamic session."),
- 0xC022000C: ("STATUS_FWP_WRONG_SESSION","The call was made from the wrong session and cannot be completed."),
- 0xC022000D: ("STATUS_FWP_NO_TXN_IN_PROGRESS","The call must be made from within an explicit transaction."),
- 0xC022000E: ("STATUS_FWP_TXN_IN_PROGRESS","The call is not allowed from within an explicit transaction."),
- 0xC022000F: ("STATUS_FWP_TXN_ABORTED","The explicit transaction has been forcibly canceled."),
- 0xC0220010: ("STATUS_FWP_SESSION_ABORTED","The session has been canceled."),
- 0xC0220011: ("STATUS_FWP_INCOMPATIBLE_TXN","The call is not allowed from within a read-only transaction."),
- 0xC0220012: ("STATUS_FWP_TIMEOUT","The call timed out while waiting to acquire the transaction lock."),
- 0xC0220013: ("STATUS_FWP_NET_EVENTS_DISABLED","The collection of network diagnostic events is disabled."),
- 0xC0220014: ("STATUS_FWP_INCOMPATIBLE_LAYER","The operation is not supported by the specified layer."),
- 0xC0220015: ("STATUS_FWP_KM_CLIENTS_ONLY","The call is allowed for kernel-mode callers only."),
- 0xC0220016: ("STATUS_FWP_LIFETIME_MISMATCH","The call tried to associate two objects with incompatible lifetimes."),
- 0xC0220017: ("STATUS_FWP_BUILTIN_OBJECT","The object is built-in and cannot be deleted."),
- 0xC0220018: ("STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS","The maximum number of boot-time filters has been reached."),
- 0xC0220018: ("STATUS_FWP_TOO_MANY_CALLOUTS","The maximum number of callouts has been reached."),
- 0xC0220019: ("STATUS_FWP_NOTIFICATION_DROPPED","A notification could not be delivered because a message queue has reached maximum capacity."),
- 0xC022001A: ("STATUS_FWP_TRAFFIC_MISMATCH","The traffic parameters do not match those for the security association context."),
- 0xC022001B: ("STATUS_FWP_INCOMPATIBLE_SA_STATE","The call is not allowed for the current security association state."),
- 0xC022001C: ("STATUS_FWP_NULL_POINTER","A required pointer is null."),
- 0xC022001D: ("STATUS_FWP_INVALID_ENUMERATOR","An enumerator is not valid."),
- 0xC022001E: ("STATUS_FWP_INVALID_FLAGS","The flags field contains an invalid value."),
- 0xC022001F: ("STATUS_FWP_INVALID_NET_MASK","A network mask is not valid."),
- 0xC0220020: ("STATUS_FWP_INVALID_RANGE","An FWP_RANGE is not valid."),
- 0xC0220021: ("STATUS_FWP_INVALID_INTERVAL","The time interval is not valid."),
- 0xC0220022: ("STATUS_FWP_ZERO_LENGTH_ARRAY","An array that must contain at least one element has a zero length."),
- 0xC0220023: ("STATUS_FWP_NULL_DISPLAY_NAME","The displayData.name field cannot be null."),
- 0xC0220024: ("STATUS_FWP_INVALID_ACTION_TYPE","The action type is not one of the allowed action types for a filter."),
- 0xC0220025: ("STATUS_FWP_INVALID_WEIGHT","The filter weight is not valid."),
- 0xC0220026: ("STATUS_FWP_MATCH_TYPE_MISMATCH","A filter condition contains a match type that is not compatible with the operands."),
- 0xC0220027: ("STATUS_FWP_TYPE_MISMATCH","An FWP_VALUE or FWPM_CONDITION_VALUE is of the wrong type."),
- 0xC0220028: ("STATUS_FWP_OUT_OF_BOUNDS","An integer value is outside the allowed range."),
- 0xC0220029: ("STATUS_FWP_RESERVED","A reserved field is nonzero."),
- 0xC022002A: ("STATUS_FWP_DUPLICATE_CONDITION","A filter cannot contain multiple conditions operating on a single field."),
- 0xC022002B: ("STATUS_FWP_DUPLICATE_KEYMOD","A policy cannot contain the same keying module more than once."),
- 0xC022002C: ("STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER","The action type is not compatible with the layer."),
- 0xC022002D: ("STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER","The action type is not compatible with the sublayer."),
- 0xC022002E: ("STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER","The raw context or the provider context is not compatible with the layer."),
- 0xC022002F: ("STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT","The raw context or the provider context is not compatible with the callout."),
- 0xC0220030: ("STATUS_FWP_INCOMPATIBLE_AUTH_METHOD","The authentication method is not compatible with the policy type."),
- 0xC0220031: ("STATUS_FWP_INCOMPATIBLE_DH_GROUP","The Diffie-Hellman group is not compatible with the policy type."),
- 0xC0220032: ("STATUS_FWP_EM_NOT_SUPPORTED","An IKE policy cannot contain an Extended Mode policy."),
- 0xC0220033: ("STATUS_FWP_NEVER_MATCH","The enumeration template or subscription will never match any objects."),
- 0xC0220034: ("STATUS_FWP_PROVIDER_CONTEXT_MISMATCH","The provider context is of the wrong type."),
- 0xC0220035: ("STATUS_FWP_INVALID_PARAMETER","The parameter is incorrect."),
- 0xC0220036: ("STATUS_FWP_TOO_MANY_SUBLAYERS","The maximum number of sublayers has been reached."),
- 0xC0220037: ("STATUS_FWP_CALLOUT_NOTIFICATION_FAILED","The notification function for a callout returned an error."),
- 0xC0220038: ("STATUS_FWP_INCOMPATIBLE_AUTH_CONFIG","The IPsec authentication configuration is not compatible with the authentication type."),
- 0xC0220039: ("STATUS_FWP_INCOMPATIBLE_CIPHER_CONFIG","The IPsec cipher configuration is not compatible with the cipher type."),
- 0xC022003C: ("STATUS_FWP_DUPLICATE_AUTH_METHOD","A policy cannot contain the same auth method more than once."),
- 0xC0220100: ("STATUS_FWP_TCPIP_NOT_READY","The TCP/IP stack is not ready."),
- 0xC0220101: ("STATUS_FWP_INJECT_HANDLE_CLOSING","The injection handle is being closed by another thread."),
- 0xC0220102: ("STATUS_FWP_INJECT_HANDLE_STALE","The injection handle is stale."),
- 0xC0220103: ("STATUS_FWP_CANNOT_PEND","The classify cannot be pended."),
- 0xC0230002: ("STATUS_NDIS_CLOSING","The binding to the network interface is being closed."),
- 0xC0230004: ("STATUS_NDIS_BAD_VERSION","An invalid version was specified."),
- 0xC0230005: ("STATUS_NDIS_BAD_CHARACTERISTICS","An invalid characteristics table was used."),
- 0xC0230006: ("STATUS_NDIS_ADAPTER_NOT_FOUND","Failed to find the network interface or the network interface is not ready."),
- 0xC0230007: ("STATUS_NDIS_OPEN_FAILED","Failed to open the network interface."),
- 0xC0230008: ("STATUS_NDIS_DEVICE_FAILED","The network interface has encountered an internal unrecoverable failure."),
- 0xC0230009: ("STATUS_NDIS_MULTICAST_FULL","The multicast list on the network interface is full."),
- 0xC023000A: ("STATUS_NDIS_MULTICAST_EXISTS","An attempt was made to add a duplicate multicast address to the list."),
- 0xC023000B: ("STATUS_NDIS_MULTICAST_NOT_FOUND","At attempt was made to remove a multicast address that was never added."),
- 0xC023000C: ("STATUS_NDIS_REQUEST_ABORTED","The network interface aborted the request."),
- 0xC023000D: ("STATUS_NDIS_RESET_IN_PROGRESS","The network interface cannot process the request because it is being reset."),
- 0xC023000F: ("STATUS_NDIS_INVALID_PACKET","An attempt was made to send an invalid packet on a network interface."),
- 0xC0230010: ("STATUS_NDIS_INVALID_DEVICE_REQUEST","The specified request is not a valid operation for the target device."),
- 0xC0230011: ("STATUS_NDIS_ADAPTER_NOT_READY","The network interface is not ready to complete this operation."),
- 0xC0230014: ("STATUS_NDIS_INVALID_LENGTH","The length of the buffer submitted for this operation is not valid."),
- 0xC0230015: ("STATUS_NDIS_INVALID_DATA","The data used for this operation is not valid."),
- 0xC0230016: ("STATUS_NDIS_BUFFER_TOO_SHORT","The length of the submitted buffer for this operation is too small."),
- 0xC0230017: ("STATUS_NDIS_INVALID_OID","The network interface does not support this object identifier."),
- 0xC0230018: ("STATUS_NDIS_ADAPTER_REMOVED","The network interface has been removed."),
- 0xC0230019: ("STATUS_NDIS_UNSUPPORTED_MEDIA","The network interface does not support this media type."),
- 0xC023001A: ("STATUS_NDIS_GROUP_ADDRESS_IN_USE","An attempt was made to remove a token ring group address that is in use by other components."),
- 0xC023001B: ("STATUS_NDIS_FILE_NOT_FOUND","An attempt was made to map a file that cannot be found."),
- 0xC023001C: ("STATUS_NDIS_ERROR_READING_FILE","An error occurred while NDIS tried to map the file."),
- 0xC023001D: ("STATUS_NDIS_ALREADY_MAPPED","An attempt was made to map a file that is already mapped."),
- 0xC023001E: ("STATUS_NDIS_RESOURCE_CONFLICT","An attempt to allocate a hardware resource failed because the resource is used by another component."),
- 0xC023001F: ("STATUS_NDIS_MEDIA_DISCONNECTED","The I/O operation failed because the network media is disconnected or the wireless access point is out of range."),
- 0xC0230022: ("STATUS_NDIS_INVALID_ADDRESS","The network address used in the request is invalid."),
- 0xC023002A: ("STATUS_NDIS_PAUSED","The offload operation on the network interface has been paused."),
- 0xC023002B: ("STATUS_NDIS_INTERFACE_NOT_FOUND","The network interface was not found."),
- 0xC023002C: ("STATUS_NDIS_UNSUPPORTED_REVISION","The revision number specified in the structure is not supported."),
- 0xC023002D: ("STATUS_NDIS_INVALID_PORT","The specified port does not exist on this network interface."),
- 0xC023002E: ("STATUS_NDIS_INVALID_PORT_STATE","The current state of the specified port on this network interface does not support the requested operation."),
- 0xC023002F: ("STATUS_NDIS_LOW_POWER_STATE","The miniport adapter is in a lower power state."),
- 0xC02300BB: ("STATUS_NDIS_NOT_SUPPORTED","The network interface does not support this request."),
- 0xC023100F: ("STATUS_NDIS_OFFLOAD_POLICY","The TCP connection is not offloadable because of a local policy setting."),
- 0xC0231012: ("STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED","The TCP connection is not offloadable by the Chimney offload target."),
- 0xC0231013: ("STATUS_NDIS_OFFLOAD_PATH_REJECTED","The IP Path object is not in an offloadable state."),
- 0xC0232000: ("STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED","The wireless LAN interface is in auto-configuration mode and does not support the requested parameter change operation."),
- 0xC0232001: ("STATUS_NDIS_DOT11_MEDIA_IN_USE","The wireless LAN interface is busy and cannot perform the requested operation."),
- 0xC0232002: ("STATUS_NDIS_DOT11_POWER_STATE_INVALID","The wireless LAN interface is power down and does not support the requested operation."),
- 0xC0232003: ("STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL","The list of wake on LAN patterns is full."),
- 0xC0232004: ("STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL","The list of low power protocol offloads is full."),
- 0xC0360001: ("STATUS_IPSEC_BAD_SPI","The SPI in the packet does not match a valid IPsec SA."),
- 0xC0360002: ("STATUS_IPSEC_SA_LIFETIME_EXPIRED","The packet was received on an IPsec SA whose lifetime has expired."),
- 0xC0360003: ("STATUS_IPSEC_WRONG_SA","The packet was received on an IPsec SA that does not match the packet characteristics."),
- 0xC0360004: ("STATUS_IPSEC_REPLAY_CHECK_FAILED","The packet sequence number replay check failed."),
- 0xC0360005: ("STATUS_IPSEC_INVALID_PACKET","The IPsec header and/or trailer in the packet is invalid."),
- 0xC0360006: ("STATUS_IPSEC_INTEGRITY_CHECK_FAILED","The IPsec integrity check failed."),
- 0xC0360007: ("STATUS_IPSEC_CLEAR_TEXT_DROP","IPsec dropped a clear text packet."),
- 0xC0360008: ("STATUS_IPSEC_AUTH_FIREWALL_DROP","IPsec dropped an incoming ESP packet in authenticated firewall mode. This drop is benign."),
- 0xC0360009: ("STATUS_IPSEC_THROTTLE_DROP","IPsec dropped a packet due to DOS throttle."),
- 0xC0368000: ("STATUS_IPSEC_DOSP_BLOCK","IPsec Dos Protection matched an explicit block rule."),
- 0xC0368001: ("STATUS_IPSEC_DOSP_RECEIVED_MULTICAST","IPsec Dos Protection received an IPsec specific multicast packet which is not allowed."),
- 0xC0368002: ("STATUS_IPSEC_DOSP_INVALID_PACKET","IPsec Dos Protection received an incorrectly formatted packet."),
- 0xC0368003: ("STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED","IPsec Dos Protection failed to lookup state."),
- 0xC0368004: ("STATUS_IPSEC_DOSP_MAX_ENTRIES","IPsec Dos Protection failed to create state because there are already maximum number of entries allowed by policy."),
- 0xC0368005: ("STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED","IPsec Dos Protection received an IPsec negotiation packet for a keying module which is not allowed by policy."),
- 0xC0368006: ("STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES","IPsec Dos Protection failed to create per internal IP ratelimit queue because there is already maximum number of queues allowed by policy."),
- 0xC038005B: ("STATUS_VOLMGR_MIRROR_NOT_SUPPORTED","The system does not support mirrored volumes."),
- 0xC038005C: ("STATUS_VOLMGR_RAID5_NOT_SUPPORTED","The system does not support RAID-5 volumes."),
- 0xC03A0014: ("STATUS_VIRTDISK_PROVIDER_NOT_FOUND","A virtual disk support provider for the specified file was not found."),
- 0xC03A0015: ("STATUS_VIRTDISK_NOT_VIRTUAL_DISK","The specified disk is not a virtual disk."),
- 0xC03A0016: ("STATUS_VHD_PARENT_VHD_ACCESS_DENIED","The chain of virtual hard disks is inaccessible. The process has not been granted access rights to the parent virtual hard disk for the differencing disk."),
- 0xC03A0017: ("STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH","The chain of virtual hard disks is corrupted. There is a mismatch in the virtual sizes of the parent virtual hard disk and differencing disk."),
- 0xC03A0018: ("STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED","The chain of virtual hard disks is corrupted. A differencing disk is indicated in its own parent chain."),
- 0xC03A0019: ("STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT","The chain of virtual hard disks is inaccessible. There was an error opening a virtual hard disk further up the chain."),
-}
-
-# Error Codes
-
-STATUS_SUCCESS = 0x00000000
-STATUS_WAIT_1 = 0x00000001
-STATUS_WAIT_2 = 0x00000002
-STATUS_WAIT_3 = 0x00000003
-STATUS_WAIT_63 = 0x0000003F
-STATUS_ABANDONED = 0x00000080
-STATUS_ABANDONED_WAIT_0 = 0x00000080
-STATUS_ABANDONED_WAIT_63 = 0x000000BF
-STATUS_USER_APC = 0x000000C0
-STATUS_ALERTED = 0x00000101
-STATUS_TIMEOUT = 0x00000102
-STATUS_PENDING = 0x00000103
-STATUS_REPARSE = 0x00000104
-STATUS_MORE_ENTRIES = 0x00000105
-STATUS_NOT_ALL_ASSIGNED = 0x00000106
-STATUS_SOME_NOT_MAPPED = 0x00000107
-STATUS_OPLOCK_BREAK_IN_PROGRESS = 0x00000108
-STATUS_VOLUME_MOUNTED = 0x00000109
-STATUS_RXACT_COMMITTED = 0x0000010A
-STATUS_NOTIFY_CLEANUP = 0x0000010B
-STATUS_NOTIFY_ENUM_DIR = 0x0000010C
-STATUS_NO_QUOTAS_FOR_ACCOUNT = 0x0000010D
-STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED = 0x0000010E
-STATUS_PAGE_FAULT_TRANSITION = 0x00000110
-STATUS_PAGE_FAULT_DEMAND_ZERO = 0x00000111
-STATUS_PAGE_FAULT_COPY_ON_WRITE = 0x00000112
-STATUS_PAGE_FAULT_GUARD_PAGE = 0x00000113
-STATUS_PAGE_FAULT_PAGING_FILE = 0x00000114
-STATUS_CACHE_PAGE_LOCKED = 0x00000115
-STATUS_CRASH_DUMP = 0x00000116
-STATUS_BUFFER_ALL_ZEROS = 0x00000117
-STATUS_REPARSE_OBJECT = 0x00000118
-STATUS_RESOURCE_REQUIREMENTS_CHANGED = 0x00000119
-STATUS_TRANSLATION_COMPLETE = 0x00000120
-STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY = 0x00000121
-STATUS_NOTHING_TO_TERMINATE = 0x00000122
-STATUS_PROCESS_NOT_IN_JOB = 0x00000123
-STATUS_PROCESS_IN_JOB = 0x00000124
-STATUS_VOLSNAP_HIBERNATE_READY = 0x00000125
-STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY = 0x00000126
-STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED = 0x00000127
-STATUS_INTERRUPT_STILL_CONNECTED = 0x00000128
-STATUS_PROCESS_CLONED = 0x00000129
-STATUS_FILE_LOCKED_WITH_ONLY_READERS = 0x0000012A
-STATUS_FILE_LOCKED_WITH_WRITERS = 0x0000012B
-STATUS_RESOURCEMANAGER_READ_ONLY = 0x00000202
-STATUS_WAIT_FOR_OPLOCK = 0x00000367
-DBG_EXCEPTION_HANDLED = 0x00010001
-DBG_CONTINUE = 0x00010002
-STATUS_FLT_IO_COMPLETE = 0x001C0001
-STATUS_FILE_NOT_AVAILABLE = 0xC0000467
-STATUS_CALLBACK_RETURNED_THREAD_AFFINITY = 0xC0000721
-STATUS_OBJECT_NAME_EXISTS = 0x40000000
-STATUS_THREAD_WAS_SUSPENDED = 0x40000001
-STATUS_WORKING_SET_LIMIT_RANGE = 0x40000002
-STATUS_IMAGE_NOT_AT_BASE = 0x40000003
-STATUS_RXACT_STATE_CREATED = 0x40000004
-STATUS_SEGMENT_NOTIFICATION = 0x40000005
-STATUS_LOCAL_USER_SESSION_KEY = 0x40000006
-STATUS_BAD_CURRENT_DIRECTORY = 0x40000007
-STATUS_SERIAL_MORE_WRITES = 0x40000008
-STATUS_REGISTRY_RECOVERED = 0x40000009
-STATUS_FT_READ_RECOVERY_FROM_BACKUP = 0x4000000A
-STATUS_FT_WRITE_RECOVERY = 0x4000000B
-STATUS_SERIAL_COUNTER_TIMEOUT = 0x4000000C
-STATUS_NULL_LM_PASSWORD = 0x4000000D
-STATUS_IMAGE_MACHINE_TYPE_MISMATCH = 0x4000000E
-STATUS_RECEIVE_PARTIAL = 0x4000000F
-STATUS_RECEIVE_EXPEDITED = 0x40000010
-STATUS_RECEIVE_PARTIAL_EXPEDITED = 0x40000011
-STATUS_EVENT_DONE = 0x40000012
-STATUS_EVENT_PENDING = 0x40000013
-STATUS_CHECKING_FILE_SYSTEM = 0x40000014
-STATUS_FATAL_APP_EXIT = 0x40000015
-STATUS_PREDEFINED_HANDLE = 0x40000016
-STATUS_WAS_UNLOCKED = 0x40000017
-STATUS_SERVICE_NOTIFICATION = 0x40000018
-STATUS_WAS_LOCKED = 0x40000019
-STATUS_LOG_HARD_ERROR = 0x4000001A
-STATUS_ALREADY_WIN32 = 0x4000001B
-STATUS_WX86_UNSIMULATE = 0x4000001C
-STATUS_WX86_CONTINUE = 0x4000001D
-STATUS_WX86_SINGLE_STEP = 0x4000001E
-STATUS_WX86_BREAKPOINT = 0x4000001F
-STATUS_WX86_EXCEPTION_CONTINUE = 0x40000020
-STATUS_WX86_EXCEPTION_LASTCHANCE = 0x40000021
-STATUS_WX86_EXCEPTION_CHAIN = 0x40000022
-STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE = 0x40000023
-STATUS_NO_YIELD_PERFORMED = 0x40000024
-STATUS_TIMER_RESUME_IGNORED = 0x40000025
-STATUS_ARBITRATION_UNHANDLED = 0x40000026
-STATUS_CARDBUS_NOT_SUPPORTED = 0x40000027
-STATUS_WX86_CREATEWX86TIB = 0x40000028
-STATUS_MP_PROCESSOR_MISMATCH = 0x40000029
-STATUS_HIBERNATED = 0x4000002A
-STATUS_RESUME_HIBERNATION = 0x4000002B
-STATUS_FIRMWARE_UPDATED = 0x4000002C
-STATUS_DRIVERS_LEAKING_LOCKED_PAGES = 0x4000002D
-STATUS_MESSAGE_RETRIEVED = 0x4000002E
-STATUS_SYSTEM_POWERSTATE_TRANSITION = 0x4000002F
-STATUS_ALPC_CHECK_COMPLETION_LIST = 0x40000030
-STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION = 0x40000031
-STATUS_ACCESS_AUDIT_BY_POLICY = 0x40000032
-STATUS_ABANDON_HIBERFILE = 0x40000033
-STATUS_BIZRULES_NOT_ENABLED = 0x40000034
-STATUS_WAKE_SYSTEM = 0x40000294
-STATUS_DS_SHUTTING_DOWN = 0x40000370
-DBG_REPLY_LATER = 0x40010001
-DBG_UNABLE_TO_PROVIDE_HANDLE = 0x40010002
-DBG_TERMINATE_THREAD = 0x40010003
-DBG_TERMINATE_PROCESS = 0x40010004
-DBG_CONTROL_C = 0x40010005
-DBG_PRINTEXCEPTION_C = 0x40010006
-DBG_RIPEXCEPTION = 0x40010007
-DBG_CONTROL_BREAK = 0x40010008
-DBG_COMMAND_EXCEPTION = 0x40010009
-RPC_NT_UUID_LOCAL_ONLY = 0x40020056
-RPC_NT_SEND_INCOMPLETE = 0x400200AF
-STATUS_CTX_CDM_CONNECT = 0x400A0004
-STATUS_CTX_CDM_DISCONNECT = 0x400A0005
-STATUS_SXS_RELEASE_ACTIVATION_CONTEXT = 0x4015000D
-STATUS_RECOVERY_NOT_NEEDED = 0x40190034
-STATUS_RM_ALREADY_STARTED = 0x40190035
-STATUS_LOG_NO_RESTART = 0x401A000C
-STATUS_VIDEO_DRIVER_DEBUG_REPORT_REQUEST = 0x401B00EC
-STATUS_GRAPHICS_PARTIAL_DATA_POPULATED = 0x401E000A
-STATUS_GRAPHICS_DRIVER_MISMATCH = 0x401E0117
-STATUS_GRAPHICS_MODE_NOT_PINNED = 0x401E0307
-STATUS_GRAPHICS_NO_PREFERRED_MODE = 0x401E031E
-STATUS_GRAPHICS_DATASET_IS_EMPTY = 0x401E034B
-STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET = 0x401E034C
-STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_PINNED = 0x401E0351
-STATUS_GRAPHICS_UNKNOWN_CHILD_STATUS = 0x401E042F
-STATUS_GRAPHICS_LEADLINK_START_DEFERRED = 0x401E0437
-STATUS_GRAPHICS_POLLING_TOO_FREQUENTLY = 0x401E0439
-STATUS_GRAPHICS_START_DEFERRED = 0x401E043A
-STATUS_NDIS_INDICATION_REQUIRED = 0x40230001
-STATUS_GUARD_PAGE_VIOLATION = 0x80000001
-STATUS_DATATYPE_MISALIGNMENT = 0x80000002
-STATUS_BREAKPOINT = 0x80000003
-STATUS_SINGLE_STEP = 0x80000004
-STATUS_BUFFER_OVERFLOW = 0x80000005
-STATUS_NO_MORE_FILES = 0x80000006
-STATUS_WAKE_SYSTEM_DEBUGGER = 0x80000007
-STATUS_HANDLES_CLOSED = 0x8000000A
-STATUS_NO_INHERITANCE = 0x8000000B
-STATUS_GUID_SUBSTITUTION_MADE = 0x8000000C
-STATUS_PARTIAL_COPY = 0x8000000D
-STATUS_DEVICE_PAPER_EMPTY = 0x8000000E
-STATUS_DEVICE_POWERED_OFF = 0x8000000F
-STATUS_DEVICE_OFF_LINE = 0x80000010
-STATUS_DEVICE_BUSY = 0x80000011
-STATUS_NO_MORE_EAS = 0x80000012
-STATUS_INVALID_EA_NAME = 0x80000013
-STATUS_EA_LIST_INCONSISTENT = 0x80000014
-STATUS_INVALID_EA_FLAG = 0x80000015
-STATUS_VERIFY_REQUIRED = 0x80000016
-STATUS_EXTRANEOUS_INFORMATION = 0x80000017
-STATUS_RXACT_COMMIT_NECESSARY = 0x80000018
-STATUS_NO_MORE_ENTRIES = 0x8000001A
-STATUS_FILEMARK_DETECTED = 0x8000001B
-STATUS_MEDIA_CHANGED = 0x8000001C
-STATUS_BUS_RESET = 0x8000001D
-STATUS_END_OF_MEDIA = 0x8000001E
-STATUS_BEGINNING_OF_MEDIA = 0x8000001F
-STATUS_MEDIA_CHECK = 0x80000020
-STATUS_SETMARK_DETECTED = 0x80000021
-STATUS_NO_DATA_DETECTED = 0x80000022
-STATUS_REDIRECTOR_HAS_OPEN_HANDLES = 0x80000023
-STATUS_SERVER_HAS_OPEN_HANDLES = 0x80000024
-STATUS_ALREADY_DISCONNECTED = 0x80000025
-STATUS_LONGJUMP = 0x80000026
-STATUS_CLEANER_CARTRIDGE_INSTALLED = 0x80000027
-STATUS_PLUGPLAY_QUERY_VETOED = 0x80000028
-STATUS_UNWIND_CONSOLIDATE = 0x80000029
-STATUS_REGISTRY_HIVE_RECOVERED = 0x8000002A
-STATUS_DLL_MIGHT_BE_INSECURE = 0x8000002B
-STATUS_DLL_MIGHT_BE_INCOMPATIBLE = 0x8000002C
-STATUS_STOPPED_ON_SYMLINK = 0x8000002D
-STATUS_DEVICE_REQUIRES_CLEANING = 0x80000288
-STATUS_DEVICE_DOOR_OPEN = 0x80000289
-STATUS_DATA_LOST_REPAIR = 0x80000803
-DBG_EXCEPTION_NOT_HANDLED = 0x80010001
-STATUS_CLUSTER_NODE_ALREADY_UP = 0x80130001
-STATUS_CLUSTER_NODE_ALREADY_DOWN = 0x80130002
-STATUS_CLUSTER_NETWORK_ALREADY_ONLINE = 0x80130003
-STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE = 0x80130004
-STATUS_CLUSTER_NODE_ALREADY_MEMBER = 0x80130005
-STATUS_COULD_NOT_RESIZE_LOG = 0x80190009
-STATUS_NO_TXF_METADATA = 0x80190029
-STATUS_CANT_RECOVER_WITH_HANDLE_OPEN = 0x80190031
-STATUS_TXF_METADATA_ALREADY_PRESENT = 0x80190041
-STATUS_TRANSACTION_SCOPE_CALLBACKS_NOT_SET = 0x80190042
-STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD_RECOVERED = 0x801B00EB
-STATUS_FLT_BUFFER_TOO_SMALL = 0x801C0001
-STATUS_FVE_PARTIAL_METADATA = 0x80210001
-STATUS_FVE_TRANSIENT_STATE = 0x80210002
-STATUS_UNSUCCESSFUL = 0xC0000001
-STATUS_NOT_IMPLEMENTED = 0xC0000002
-STATUS_INVALID_INFO_CLASS = 0xC0000003
-STATUS_INFO_LENGTH_MISMATCH = 0xC0000004
-STATUS_ACCESS_VIOLATION = 0xC0000005
-STATUS_IN_PAGE_ERROR = 0xC0000006
-STATUS_PAGEFILE_QUOTA = 0xC0000007
-STATUS_INVALID_HANDLE = 0xC0000008
-STATUS_BAD_INITIAL_STACK = 0xC0000009
-STATUS_BAD_INITIAL_PC = 0xC000000A
-STATUS_INVALID_CID = 0xC000000B
-STATUS_TIMER_NOT_CANCELED = 0xC000000C
-STATUS_INVALID_PARAMETER = 0xC000000D
-STATUS_NO_SUCH_DEVICE = 0xC000000E
-STATUS_NO_SUCH_FILE = 0xC000000F
-STATUS_INVALID_DEVICE_REQUEST = 0xC0000010
-STATUS_END_OF_FILE = 0xC0000011
-STATUS_WRONG_VOLUME = 0xC0000012
-STATUS_NO_MEDIA_IN_DEVICE = 0xC0000013
-STATUS_UNRECOGNIZED_MEDIA = 0xC0000014
-STATUS_NONEXISTENT_SECTOR = 0xC0000015
-STATUS_MORE_PROCESSING_REQUIRED = 0xC0000016
-STATUS_NO_MEMORY = 0xC0000017
-STATUS_CONFLICTING_ADDRESSES = 0xC0000018
-STATUS_NOT_MAPPED_VIEW = 0xC0000019
-STATUS_UNABLE_TO_FREE_VM = 0xC000001A
-STATUS_UNABLE_TO_DELETE_SECTION = 0xC000001B
-STATUS_INVALID_SYSTEM_SERVICE = 0xC000001C
-STATUS_ILLEGAL_INSTRUCTION = 0xC000001D
-STATUS_INVALID_LOCK_SEQUENCE = 0xC000001E
-STATUS_INVALID_VIEW_SIZE = 0xC000001F
-STATUS_INVALID_FILE_FOR_SECTION = 0xC0000020
-STATUS_ALREADY_COMMITTED = 0xC0000021
-STATUS_ACCESS_DENIED = 0xC0000022
-STATUS_BUFFER_TOO_SMALL = 0xC0000023
-STATUS_OBJECT_TYPE_MISMATCH = 0xC0000024
-STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025
-STATUS_INVALID_DISPOSITION = 0xC0000026
-STATUS_UNWIND = 0xC0000027
-STATUS_BAD_STACK = 0xC0000028
-STATUS_INVALID_UNWIND_TARGET = 0xC0000029
-STATUS_NOT_LOCKED = 0xC000002A
-STATUS_PARITY_ERROR = 0xC000002B
-STATUS_UNABLE_TO_DECOMMIT_VM = 0xC000002C
-STATUS_NOT_COMMITTED = 0xC000002D
-STATUS_INVALID_PORT_ATTRIBUTES = 0xC000002E
-STATUS_PORT_MESSAGE_TOO_LONG = 0xC000002F
-STATUS_INVALID_PARAMETER_MIX = 0xC0000030
-STATUS_INVALID_QUOTA_LOWER = 0xC0000031
-STATUS_DISK_CORRUPT_ERROR = 0xC0000032
-STATUS_OBJECT_NAME_INVALID = 0xC0000033
-STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034
-STATUS_OBJECT_NAME_COLLISION = 0xC0000035
-STATUS_PORT_DISCONNECTED = 0xC0000037
-STATUS_DEVICE_ALREADY_ATTACHED = 0xC0000038
-STATUS_OBJECT_PATH_INVALID = 0xC0000039
-STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A
-STATUS_OBJECT_PATH_SYNTAX_BAD = 0xC000003B
-STATUS_DATA_OVERRUN = 0xC000003C
-STATUS_DATA_LATE_ERROR = 0xC000003D
-STATUS_DATA_ERROR = 0xC000003E
-STATUS_CRC_ERROR = 0xC000003F
-STATUS_SECTION_TOO_BIG = 0xC0000040
-STATUS_PORT_CONNECTION_REFUSED = 0xC0000041
-STATUS_INVALID_PORT_HANDLE = 0xC0000042
-STATUS_SHARING_VIOLATION = 0xC0000043
-STATUS_QUOTA_EXCEEDED = 0xC0000044
-STATUS_INVALID_PAGE_PROTECTION = 0xC0000045
-STATUS_MUTANT_NOT_OWNED = 0xC0000046
-STATUS_SEMAPHORE_LIMIT_EXCEEDED = 0xC0000047
-STATUS_PORT_ALREADY_SET = 0xC0000048
-STATUS_SECTION_NOT_IMAGE = 0xC0000049
-STATUS_SUSPEND_COUNT_EXCEEDED = 0xC000004A
-STATUS_THREAD_IS_TERMINATING = 0xC000004B
-STATUS_BAD_WORKING_SET_LIMIT = 0xC000004C
-STATUS_INCOMPATIBLE_FILE_MAP = 0xC000004D
-STATUS_SECTION_PROTECTION = 0xC000004E
-STATUS_EAS_NOT_SUPPORTED = 0xC000004F
-STATUS_EA_TOO_LARGE = 0xC0000050
-STATUS_NONEXISTENT_EA_ENTRY = 0xC0000051
-STATUS_NO_EAS_ON_FILE = 0xC0000052
-STATUS_EA_CORRUPT_ERROR = 0xC0000053
-STATUS_FILE_LOCK_CONFLICT = 0xC0000054
-STATUS_LOCK_NOT_GRANTED = 0xC0000055
-STATUS_DELETE_PENDING = 0xC0000056
-STATUS_CTL_FILE_NOT_SUPPORTED = 0xC0000057
-STATUS_UNKNOWN_REVISION = 0xC0000058
-STATUS_REVISION_MISMATCH = 0xC0000059
-STATUS_INVALID_OWNER = 0xC000005A
-STATUS_INVALID_PRIMARY_GROUP = 0xC000005B
-STATUS_NO_IMPERSONATION_TOKEN = 0xC000005C
-STATUS_CANT_DISABLE_MANDATORY = 0xC000005D
-STATUS_NO_LOGON_SERVERS = 0xC000005E
-STATUS_NO_SUCH_LOGON_SESSION = 0xC000005F
-STATUS_NO_SUCH_PRIVILEGE = 0xC0000060
-STATUS_PRIVILEGE_NOT_HELD = 0xC0000061
-STATUS_INVALID_ACCOUNT_NAME = 0xC0000062
-STATUS_USER_EXISTS = 0xC0000063
-STATUS_NO_SUCH_USER = 0xC0000064
-STATUS_GROUP_EXISTS = 0xC0000065
-STATUS_NO_SUCH_GROUP = 0xC0000066
-STATUS_MEMBER_IN_GROUP = 0xC0000067
-STATUS_MEMBER_NOT_IN_GROUP = 0xC0000068
-STATUS_LAST_ADMIN = 0xC0000069
-STATUS_WRONG_PASSWORD = 0xC000006A
-STATUS_ILL_FORMED_PASSWORD = 0xC000006B
-STATUS_PASSWORD_RESTRICTION = 0xC000006C
-STATUS_LOGON_FAILURE = 0xC000006D
-STATUS_ACCOUNT_RESTRICTION = 0xC000006E
-STATUS_INVALID_LOGON_HOURS = 0xC000006F
-STATUS_INVALID_WORKSTATION = 0xC0000070
-STATUS_PASSWORD_EXPIRED = 0xC0000071
-STATUS_ACCOUNT_DISABLED = 0xC0000072
-STATUS_NONE_MAPPED = 0xC0000073
-STATUS_TOO_MANY_LUIDS_REQUESTED = 0xC0000074
-STATUS_LUIDS_EXHAUSTED = 0xC0000075
-STATUS_INVALID_SUB_AUTHORITY = 0xC0000076
-STATUS_INVALID_ACL = 0xC0000077
-STATUS_INVALID_SID = 0xC0000078
-STATUS_INVALID_SECURITY_DESCR = 0xC0000079
-STATUS_PROCEDURE_NOT_FOUND = 0xC000007A
-STATUS_INVALID_IMAGE_FORMAT = 0xC000007B
-STATUS_NO_TOKEN = 0xC000007C
-STATUS_BAD_INHERITANCE_ACL = 0xC000007D
-STATUS_RANGE_NOT_LOCKED = 0xC000007E
-STATUS_DISK_FULL = 0xC000007F
-STATUS_SERVER_DISABLED = 0xC0000080
-STATUS_SERVER_NOT_DISABLED = 0xC0000081
-STATUS_TOO_MANY_GUIDS_REQUESTED = 0xC0000082
-STATUS_GUIDS_EXHAUSTED = 0xC0000083
-STATUS_INVALID_ID_AUTHORITY = 0xC0000084
-STATUS_AGENTS_EXHAUSTED = 0xC0000085
-STATUS_INVALID_VOLUME_LABEL = 0xC0000086
-STATUS_SECTION_NOT_EXTENDED = 0xC0000087
-STATUS_NOT_MAPPED_DATA = 0xC0000088
-STATUS_RESOURCE_DATA_NOT_FOUND = 0xC0000089
-STATUS_RESOURCE_TYPE_NOT_FOUND = 0xC000008A
-STATUS_RESOURCE_NAME_NOT_FOUND = 0xC000008B
-STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C
-STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D
-STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E
-STATUS_FLOAT_INEXACT_RESULT = 0xC000008F
-STATUS_FLOAT_INVALID_OPERATION = 0xC0000090
-STATUS_FLOAT_OVERFLOW = 0xC0000091
-STATUS_FLOAT_STACK_CHECK = 0xC0000092
-STATUS_FLOAT_UNDERFLOW = 0xC0000093
-STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094
-STATUS_INTEGER_OVERFLOW = 0xC0000095
-STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096
-STATUS_TOO_MANY_PAGING_FILES = 0xC0000097
-STATUS_FILE_INVALID = 0xC0000098
-STATUS_ALLOTTED_SPACE_EXCEEDED = 0xC0000099
-STATUS_INSUFFICIENT_RESOURCES = 0xC000009A
-STATUS_DFS_EXIT_PATH_FOUND = 0xC000009B
-STATUS_DEVICE_DATA_ERROR = 0xC000009C
-STATUS_DEVICE_NOT_CONNECTED = 0xC000009D
-STATUS_FREE_VM_NOT_AT_BASE = 0xC000009F
-STATUS_MEMORY_NOT_ALLOCATED = 0xC00000A0
-STATUS_WORKING_SET_QUOTA = 0xC00000A1
-STATUS_MEDIA_WRITE_PROTECTED = 0xC00000A2
-STATUS_DEVICE_NOT_READY = 0xC00000A3
-STATUS_INVALID_GROUP_ATTRIBUTES = 0xC00000A4
-STATUS_BAD_IMPERSONATION_LEVEL = 0xC00000A5
-STATUS_CANT_OPEN_ANONYMOUS = 0xC00000A6
-STATUS_BAD_VALIDATION_CLASS = 0xC00000A7
-STATUS_BAD_TOKEN_TYPE = 0xC00000A8
-STATUS_BAD_MASTER_BOOT_RECORD = 0xC00000A9
-STATUS_INSTRUCTION_MISALIGNMENT = 0xC00000AA
-STATUS_INSTANCE_NOT_AVAILABLE = 0xC00000AB
-STATUS_PIPE_NOT_AVAILABLE = 0xC00000AC
-STATUS_INVALID_PIPE_STATE = 0xC00000AD
-STATUS_PIPE_BUSY = 0xC00000AE
-STATUS_ILLEGAL_FUNCTION = 0xC00000AF
-STATUS_PIPE_DISCONNECTED = 0xC00000B0
-STATUS_PIPE_CLOSING = 0xC00000B1
-STATUS_PIPE_CONNECTED = 0xC00000B2
-STATUS_PIPE_LISTENING = 0xC00000B3
-STATUS_INVALID_READ_MODE = 0xC00000B4
-STATUS_IO_TIMEOUT = 0xC00000B5
-STATUS_FILE_FORCED_CLOSED = 0xC00000B6
-STATUS_PROFILING_NOT_STARTED = 0xC00000B7
-STATUS_PROFILING_NOT_STOPPED = 0xC00000B8
-STATUS_COULD_NOT_INTERPRET = 0xC00000B9
-STATUS_FILE_IS_A_DIRECTORY = 0xC00000BA
-STATUS_NOT_SUPPORTED = 0xC00000BB
-STATUS_REMOTE_NOT_LISTENING = 0xC00000BC
-STATUS_DUPLICATE_NAME = 0xC00000BD
-STATUS_BAD_NETWORK_PATH = 0xC00000BE
-STATUS_NETWORK_BUSY = 0xC00000BF
-STATUS_DEVICE_DOES_NOT_EXIST = 0xC00000C0
-STATUS_TOO_MANY_COMMANDS = 0xC00000C1
-STATUS_ADAPTER_HARDWARE_ERROR = 0xC00000C2
-STATUS_INVALID_NETWORK_RESPONSE = 0xC00000C3
-STATUS_UNEXPECTED_NETWORK_ERROR = 0xC00000C4
-STATUS_BAD_REMOTE_ADAPTER = 0xC00000C5
-STATUS_PRINT_QUEUE_FULL = 0xC00000C6
-STATUS_NO_SPOOL_SPACE = 0xC00000C7
-STATUS_PRINT_CANCELLED = 0xC00000C8
-STATUS_NETWORK_NAME_DELETED = 0xC00000C9
-STATUS_NETWORK_ACCESS_DENIED = 0xC00000CA
-STATUS_BAD_DEVICE_TYPE = 0xC00000CB
-STATUS_BAD_NETWORK_NAME = 0xC00000CC
-STATUS_TOO_MANY_NAMES = 0xC00000CD
-STATUS_TOO_MANY_SESSIONS = 0xC00000CE
-STATUS_SHARING_PAUSED = 0xC00000CF
-STATUS_REQUEST_NOT_ACCEPTED = 0xC00000D0
-STATUS_REDIRECTOR_PAUSED = 0xC00000D1
-STATUS_NET_WRITE_FAULT = 0xC00000D2
-STATUS_PROFILING_AT_LIMIT = 0xC00000D3
-STATUS_NOT_SAME_DEVICE = 0xC00000D4
-STATUS_FILE_RENAMED = 0xC00000D5
-STATUS_VIRTUAL_CIRCUIT_CLOSED = 0xC00000D6
-STATUS_NO_SECURITY_ON_OBJECT = 0xC00000D7
-STATUS_CANT_WAIT = 0xC00000D8
-STATUS_PIPE_EMPTY = 0xC00000D9
-STATUS_CANT_ACCESS_DOMAIN_INFO = 0xC00000DA
-STATUS_CANT_TERMINATE_SELF = 0xC00000DB
-STATUS_INVALID_SERVER_STATE = 0xC00000DC
-STATUS_INVALID_DOMAIN_STATE = 0xC00000DD
-STATUS_INVALID_DOMAIN_ROLE = 0xC00000DE
-STATUS_NO_SUCH_DOMAIN = 0xC00000DF
-STATUS_DOMAIN_EXISTS = 0xC00000E0
-STATUS_DOMAIN_LIMIT_EXCEEDED = 0xC00000E1
-STATUS_OPLOCK_NOT_GRANTED = 0xC00000E2
-STATUS_INVALID_OPLOCK_PROTOCOL = 0xC00000E3
-STATUS_INTERNAL_DB_CORRUPTION = 0xC00000E4
-STATUS_INTERNAL_ERROR = 0xC00000E5
-STATUS_GENERIC_NOT_MAPPED = 0xC00000E6
-STATUS_BAD_DESCRIPTOR_FORMAT = 0xC00000E7
-STATUS_INVALID_USER_BUFFER = 0xC00000E8
-STATUS_UNEXPECTED_IO_ERROR = 0xC00000E9
-STATUS_UNEXPECTED_MM_CREATE_ERR = 0xC00000EA
-STATUS_UNEXPECTED_MM_MAP_ERROR = 0xC00000EB
-STATUS_UNEXPECTED_MM_EXTEND_ERR = 0xC00000EC
-STATUS_NOT_LOGON_PROCESS = 0xC00000ED
-STATUS_LOGON_SESSION_EXISTS = 0xC00000EE
-STATUS_INVALID_PARAMETER_1 = 0xC00000EF
-STATUS_INVALID_PARAMETER_2 = 0xC00000F0
-STATUS_INVALID_PARAMETER_3 = 0xC00000F1
-STATUS_INVALID_PARAMETER_4 = 0xC00000F2
-STATUS_INVALID_PARAMETER_5 = 0xC00000F3
-STATUS_INVALID_PARAMETER_6 = 0xC00000F4
-STATUS_INVALID_PARAMETER_7 = 0xC00000F5
-STATUS_INVALID_PARAMETER_8 = 0xC00000F6
-STATUS_INVALID_PARAMETER_9 = 0xC00000F7
-STATUS_INVALID_PARAMETER_10 = 0xC00000F8
-STATUS_INVALID_PARAMETER_11 = 0xC00000F9
-STATUS_INVALID_PARAMETER_12 = 0xC00000FA
-STATUS_REDIRECTOR_NOT_STARTED = 0xC00000FB
-STATUS_REDIRECTOR_STARTED = 0xC00000FC
-STATUS_STACK_OVERFLOW = 0xC00000FD
-STATUS_NO_SUCH_PACKAGE = 0xC00000FE
-STATUS_BAD_FUNCTION_TABLE = 0xC00000FF
-STATUS_VARIABLE_NOT_FOUND = 0xC0000100
-STATUS_DIRECTORY_NOT_EMPTY = 0xC0000101
-STATUS_FILE_CORRUPT_ERROR = 0xC0000102
-STATUS_NOT_A_DIRECTORY = 0xC0000103
-STATUS_BAD_LOGON_SESSION_STATE = 0xC0000104
-STATUS_LOGON_SESSION_COLLISION = 0xC0000105
-STATUS_NAME_TOO_LONG = 0xC0000106
-STATUS_FILES_OPEN = 0xC0000107
-STATUS_CONNECTION_IN_USE = 0xC0000108
-STATUS_MESSAGE_NOT_FOUND = 0xC0000109
-STATUS_PROCESS_IS_TERMINATING = 0xC000010A
-STATUS_INVALID_LOGON_TYPE = 0xC000010B
-STATUS_NO_GUID_TRANSLATION = 0xC000010C
-STATUS_CANNOT_IMPERSONATE = 0xC000010D
-STATUS_IMAGE_ALREADY_LOADED = 0xC000010E
-STATUS_NO_LDT = 0xC0000117
-STATUS_INVALID_LDT_SIZE = 0xC0000118
-STATUS_INVALID_LDT_OFFSET = 0xC0000119
-STATUS_INVALID_LDT_DESCRIPTOR = 0xC000011A
-STATUS_INVALID_IMAGE_NE_FORMAT = 0xC000011B
-STATUS_RXACT_INVALID_STATE = 0xC000011C
-STATUS_RXACT_COMMIT_FAILURE = 0xC000011D
-STATUS_MAPPED_FILE_SIZE_ZERO = 0xC000011E
-STATUS_TOO_MANY_OPENED_FILES = 0xC000011F
-STATUS_CANCELLED = 0xC0000120
-STATUS_CANNOT_DELETE = 0xC0000121
-STATUS_INVALID_COMPUTER_NAME = 0xC0000122
-STATUS_FILE_DELETED = 0xC0000123
-STATUS_SPECIAL_ACCOUNT = 0xC0000124
-STATUS_SPECIAL_GROUP = 0xC0000125
-STATUS_SPECIAL_USER = 0xC0000126
-STATUS_MEMBERS_PRIMARY_GROUP = 0xC0000127
-STATUS_FILE_CLOSED = 0xC0000128
-STATUS_TOO_MANY_THREADS = 0xC0000129
-STATUS_THREAD_NOT_IN_PROCESS = 0xC000012A
-STATUS_TOKEN_ALREADY_IN_USE = 0xC000012B
-STATUS_PAGEFILE_QUOTA_EXCEEDED = 0xC000012C
-STATUS_COMMITMENT_LIMIT = 0xC000012D
-STATUS_INVALID_IMAGE_LE_FORMAT = 0xC000012E
-STATUS_INVALID_IMAGE_NOT_MZ = 0xC000012F
-STATUS_INVALID_IMAGE_PROTECT = 0xC0000130
-STATUS_INVALID_IMAGE_WIN_16 = 0xC0000131
-STATUS_LOGON_SERVER_CONFLICT = 0xC0000132
-STATUS_TIME_DIFFERENCE_AT_DC = 0xC0000133
-STATUS_SYNCHRONIZATION_REQUIRED = 0xC0000134
-STATUS_DLL_NOT_FOUND = 0xC0000135
-STATUS_OPEN_FAILED = 0xC0000136
-STATUS_IO_PRIVILEGE_FAILED = 0xC0000137
-STATUS_ORDINAL_NOT_FOUND = 0xC0000138
-STATUS_ENTRYPOINT_NOT_FOUND = 0xC0000139
-STATUS_CONTROL_C_EXIT = 0xC000013A
-STATUS_LOCAL_DISCONNECT = 0xC000013B
-STATUS_REMOTE_DISCONNECT = 0xC000013C
-STATUS_REMOTE_RESOURCES = 0xC000013D
-STATUS_LINK_FAILED = 0xC000013E
-STATUS_LINK_TIMEOUT = 0xC000013F
-STATUS_INVALID_CONNECTION = 0xC0000140
-STATUS_INVALID_ADDRESS = 0xC0000141
-STATUS_DLL_INIT_FAILED = 0xC0000142
-STATUS_MISSING_SYSTEMFILE = 0xC0000143
-STATUS_UNHANDLED_EXCEPTION = 0xC0000144
-STATUS_APP_INIT_FAILURE = 0xC0000145
-STATUS_PAGEFILE_CREATE_FAILED = 0xC0000146
-STATUS_NO_PAGEFILE = 0xC0000147
-STATUS_INVALID_LEVEL = 0xC0000148
-STATUS_WRONG_PASSWORD_CORE = 0xC0000149
-STATUS_ILLEGAL_FLOAT_CONTEXT = 0xC000014A
-STATUS_PIPE_BROKEN = 0xC000014B
-STATUS_REGISTRY_CORRUPT = 0xC000014C
-STATUS_REGISTRY_IO_FAILED = 0xC000014D
-STATUS_NO_EVENT_PAIR = 0xC000014E
-STATUS_UNRECOGNIZED_VOLUME = 0xC000014F
-STATUS_SERIAL_NO_DEVICE_INITED = 0xC0000150
-STATUS_NO_SUCH_ALIAS = 0xC0000151
-STATUS_MEMBER_NOT_IN_ALIAS = 0xC0000152
-STATUS_MEMBER_IN_ALIAS = 0xC0000153
-STATUS_ALIAS_EXISTS = 0xC0000154
-STATUS_LOGON_NOT_GRANTED = 0xC0000155
-STATUS_TOO_MANY_SECRETS = 0xC0000156
-STATUS_SECRET_TOO_LONG = 0xC0000157
-STATUS_INTERNAL_DB_ERROR = 0xC0000158
-STATUS_FULLSCREEN_MODE = 0xC0000159
-STATUS_TOO_MANY_CONTEXT_IDS = 0xC000015A
-STATUS_LOGON_TYPE_NOT_GRANTED = 0xC000015B
-STATUS_NOT_REGISTRY_FILE = 0xC000015C
-STATUS_NT_CROSS_ENCRYPTION_REQUIRED = 0xC000015D
-STATUS_DOMAIN_CTRLR_CONFIG_ERROR = 0xC000015E
-STATUS_FT_MISSING_MEMBER = 0xC000015F
-STATUS_ILL_FORMED_SERVICE_ENTRY = 0xC0000160
-STATUS_ILLEGAL_CHARACTER = 0xC0000161
-STATUS_UNMAPPABLE_CHARACTER = 0xC0000162
-STATUS_UNDEFINED_CHARACTER = 0xC0000163
-STATUS_FLOPPY_VOLUME = 0xC0000164
-STATUS_FLOPPY_ID_MARK_NOT_FOUND = 0xC0000165
-STATUS_FLOPPY_WRONG_CYLINDER = 0xC0000166
-STATUS_FLOPPY_UNKNOWN_ERROR = 0xC0000167
-STATUS_FLOPPY_BAD_REGISTERS = 0xC0000168
-STATUS_DISK_RECALIBRATE_FAILED = 0xC0000169
-STATUS_DISK_OPERATION_FAILED = 0xC000016A
-STATUS_DISK_RESET_FAILED = 0xC000016B
-STATUS_SHARED_IRQ_BUSY = 0xC000016C
-STATUS_FT_ORPHANING = 0xC000016D
-STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT = 0xC000016E
-STATUS_PARTITION_FAILURE = 0xC0000172
-STATUS_INVALID_BLOCK_LENGTH = 0xC0000173
-STATUS_DEVICE_NOT_PARTITIONED = 0xC0000174
-STATUS_UNABLE_TO_LOCK_MEDIA = 0xC0000175
-STATUS_UNABLE_TO_UNLOAD_MEDIA = 0xC0000176
-STATUS_EOM_OVERFLOW = 0xC0000177
-STATUS_NO_MEDIA = 0xC0000178
-STATUS_NO_SUCH_MEMBER = 0xC000017A
-STATUS_INVALID_MEMBER = 0xC000017B
-STATUS_KEY_DELETED = 0xC000017C
-STATUS_NO_LOG_SPACE = 0xC000017D
-STATUS_TOO_MANY_SIDS = 0xC000017E
-STATUS_LM_CROSS_ENCRYPTION_REQUIRED = 0xC000017F
-STATUS_KEY_HAS_CHILDREN = 0xC0000180
-STATUS_CHILD_MUST_BE_VOLATILE = 0xC0000181
-STATUS_DEVICE_CONFIGURATION_ERROR = 0xC0000182
-STATUS_DRIVER_INTERNAL_ERROR = 0xC0000183
-STATUS_INVALID_DEVICE_STATE = 0xC0000184
-STATUS_IO_DEVICE_ERROR = 0xC0000185
-STATUS_DEVICE_PROTOCOL_ERROR = 0xC0000186
-STATUS_BACKUP_CONTROLLER = 0xC0000187
-STATUS_LOG_FILE_FULL = 0xC0000188
-STATUS_TOO_LATE = 0xC0000189
-STATUS_NO_TRUST_LSA_SECRET = 0xC000018A
-STATUS_NO_TRUST_SAM_ACCOUNT = 0xC000018B
-STATUS_TRUSTED_DOMAIN_FAILURE = 0xC000018C
-STATUS_TRUSTED_RELATIONSHIP_FAILURE = 0xC000018D
-STATUS_EVENTLOG_FILE_CORRUPT = 0xC000018E
-STATUS_EVENTLOG_CANT_START = 0xC000018F
-STATUS_TRUST_FAILURE = 0xC0000190
-STATUS_MUTANT_LIMIT_EXCEEDED = 0xC0000191
-STATUS_NETLOGON_NOT_STARTED = 0xC0000192
-STATUS_ACCOUNT_EXPIRED = 0xC0000193
-STATUS_POSSIBLE_DEADLOCK = 0xC0000194
-STATUS_NETWORK_CREDENTIAL_CONFLICT = 0xC0000195
-STATUS_REMOTE_SESSION_LIMIT = 0xC0000196
-STATUS_EVENTLOG_FILE_CHANGED = 0xC0000197
-STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 0xC0000198
-STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 0xC0000199
-STATUS_NOLOGON_SERVER_TRUST_ACCOUNT = 0xC000019A
-STATUS_DOMAIN_TRUST_INCONSISTENT = 0xC000019B
-STATUS_FS_DRIVER_REQUIRED = 0xC000019C
-STATUS_IMAGE_ALREADY_LOADED_AS_DLL = 0xC000019D
-STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING = 0xC000019E
-STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME = 0xC000019F
-STATUS_SECURITY_STREAM_IS_INCONSISTENT = 0xC00001A0
-STATUS_INVALID_LOCK_RANGE = 0xC00001A1
-STATUS_INVALID_ACE_CONDITION = 0xC00001A2
-STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT = 0xC00001A3
-STATUS_NOTIFICATION_GUID_ALREADY_DEFINED = 0xC00001A4
-STATUS_NETWORK_OPEN_RESTRICTION = 0xC0000201
-STATUS_NO_USER_SESSION_KEY = 0xC0000202
-STATUS_USER_SESSION_DELETED = 0xC0000203
-STATUS_RESOURCE_LANG_NOT_FOUND = 0xC0000204
-STATUS_INSUFF_SERVER_RESOURCES = 0xC0000205
-STATUS_INVALID_BUFFER_SIZE = 0xC0000206
-STATUS_INVALID_ADDRESS_COMPONENT = 0xC0000207
-STATUS_INVALID_ADDRESS_WILDCARD = 0xC0000208
-STATUS_TOO_MANY_ADDRESSES = 0xC0000209
-STATUS_ADDRESS_ALREADY_EXISTS = 0xC000020A
-STATUS_ADDRESS_CLOSED = 0xC000020B
-STATUS_CONNECTION_DISCONNECTED = 0xC000020C
-STATUS_CONNECTION_RESET = 0xC000020D
-STATUS_TOO_MANY_NODES = 0xC000020E
-STATUS_TRANSACTION_ABORTED = 0xC000020F
-STATUS_TRANSACTION_TIMED_OUT = 0xC0000210
-STATUS_TRANSACTION_NO_RELEASE = 0xC0000211
-STATUS_TRANSACTION_NO_MATCH = 0xC0000212
-STATUS_TRANSACTION_RESPONDED = 0xC0000213
-STATUS_TRANSACTION_INVALID_ID = 0xC0000214
-STATUS_TRANSACTION_INVALID_TYPE = 0xC0000215
-STATUS_NOT_SERVER_SESSION = 0xC0000216
-STATUS_NOT_CLIENT_SESSION = 0xC0000217
-STATUS_CANNOT_LOAD_REGISTRY_FILE = 0xC0000218
-STATUS_DEBUG_ATTACH_FAILED = 0xC0000219
-STATUS_SYSTEM_PROCESS_TERMINATED = 0xC000021A
-STATUS_DATA_NOT_ACCEPTED = 0xC000021B
-STATUS_NO_BROWSER_SERVERS_FOUND = 0xC000021C
-STATUS_VDM_HARD_ERROR = 0xC000021D
-STATUS_DRIVER_CANCEL_TIMEOUT = 0xC000021E
-STATUS_REPLY_MESSAGE_MISMATCH = 0xC000021F
-STATUS_MAPPED_ALIGNMENT = 0xC0000220
-STATUS_IMAGE_CHECKSUM_MISMATCH = 0xC0000221
-STATUS_LOST_WRITEBEHIND_DATA = 0xC0000222
-STATUS_CLIENT_SERVER_PARAMETERS_INVALID = 0xC0000223
-STATUS_PASSWORD_MUST_CHANGE = 0xC0000224
-STATUS_NOT_FOUND = 0xC0000225
-STATUS_NOT_TINY_STREAM = 0xC0000226
-STATUS_RECOVERY_FAILURE = 0xC0000227
-STATUS_STACK_OVERFLOW_READ = 0xC0000228
-STATUS_FAIL_CHECK = 0xC0000229
-STATUS_DUPLICATE_OBJECTID = 0xC000022A
-STATUS_OBJECTID_EXISTS = 0xC000022B
-STATUS_CONVERT_TO_LARGE = 0xC000022C
-STATUS_RETRY = 0xC000022D
-STATUS_FOUND_OUT_OF_SCOPE = 0xC000022E
-STATUS_ALLOCATE_BUCKET = 0xC000022F
-STATUS_PROPSET_NOT_FOUND = 0xC0000230
-STATUS_MARSHALL_OVERFLOW = 0xC0000231
-STATUS_INVALID_VARIANT = 0xC0000232
-STATUS_DOMAIN_CONTROLLER_NOT_FOUND = 0xC0000233
-STATUS_ACCOUNT_LOCKED_OUT = 0xC0000234
-STATUS_HANDLE_NOT_CLOSABLE = 0xC0000235
-STATUS_CONNECTION_REFUSED = 0xC0000236
-STATUS_GRACEFUL_DISCONNECT = 0xC0000237
-STATUS_ADDRESS_ALREADY_ASSOCIATED = 0xC0000238
-STATUS_ADDRESS_NOT_ASSOCIATED = 0xC0000239
-STATUS_CONNECTION_INVALID = 0xC000023A
-STATUS_CONNECTION_ACTIVE = 0xC000023B
-STATUS_NETWORK_UNREACHABLE = 0xC000023C
-STATUS_HOST_UNREACHABLE = 0xC000023D
-STATUS_PROTOCOL_UNREACHABLE = 0xC000023E
-STATUS_PORT_UNREACHABLE = 0xC000023F
-STATUS_REQUEST_ABORTED = 0xC0000240
-STATUS_CONNECTION_ABORTED = 0xC0000241
-STATUS_BAD_COMPRESSION_BUFFER = 0xC0000242
-STATUS_USER_MAPPED_FILE = 0xC0000243
-STATUS_AUDIT_FAILED = 0xC0000244
-STATUS_TIMER_RESOLUTION_NOT_SET = 0xC0000245
-STATUS_CONNECTION_COUNT_LIMIT = 0xC0000246
-STATUS_LOGIN_TIME_RESTRICTION = 0xC0000247
-STATUS_LOGIN_WKSTA_RESTRICTION = 0xC0000248
-STATUS_IMAGE_MP_UP_MISMATCH = 0xC0000249
-STATUS_INSUFFICIENT_LOGON_INFO = 0xC0000250
-STATUS_BAD_DLL_ENTRYPOINT = 0xC0000251
-STATUS_BAD_SERVICE_ENTRYPOINT = 0xC0000252
-STATUS_LPC_REPLY_LOST = 0xC0000253
-STATUS_IP_ADDRESS_CONFLICT1 = 0xC0000254
-STATUS_IP_ADDRESS_CONFLICT2 = 0xC0000255
-STATUS_REGISTRY_QUOTA_LIMIT = 0xC0000256
-STATUS_PATH_NOT_COVERED = 0xC0000257
-STATUS_NO_CALLBACK_ACTIVE = 0xC0000258
-STATUS_LICENSE_QUOTA_EXCEEDED = 0xC0000259
-STATUS_PWD_TOO_SHORT = 0xC000025A
-STATUS_PWD_TOO_RECENT = 0xC000025B
-STATUS_PWD_HISTORY_CONFLICT = 0xC000025C
-STATUS_PLUGPLAY_NO_DEVICE = 0xC000025E
-STATUS_UNSUPPORTED_COMPRESSION = 0xC000025F
-STATUS_INVALID_HW_PROFILE = 0xC0000260
-STATUS_INVALID_PLUGPLAY_DEVICE_PATH = 0xC0000261
-STATUS_DRIVER_ORDINAL_NOT_FOUND = 0xC0000262
-STATUS_DRIVER_ENTRYPOINT_NOT_FOUND = 0xC0000263
-STATUS_RESOURCE_NOT_OWNED = 0xC0000264
-STATUS_TOO_MANY_LINKS = 0xC0000265
-STATUS_QUOTA_LIST_INCONSISTENT = 0xC0000266
-STATUS_FILE_IS_OFFLINE = 0xC0000267
-STATUS_EVALUATION_EXPIRATION = 0xC0000268
-STATUS_ILLEGAL_DLL_RELOCATION = 0xC0000269
-STATUS_LICENSE_VIOLATION = 0xC000026A
-STATUS_DLL_INIT_FAILED_LOGOFF = 0xC000026B
-STATUS_DRIVER_UNABLE_TO_LOAD = 0xC000026C
-STATUS_DFS_UNAVAILABLE = 0xC000026D
-STATUS_VOLUME_DISMOUNTED = 0xC000026E
-STATUS_WX86_INTERNAL_ERROR = 0xC000026F
-STATUS_WX86_FLOAT_STACK_CHECK = 0xC0000270
-STATUS_VALIDATE_CONTINUE = 0xC0000271
-STATUS_NO_MATCH = 0xC0000272
-STATUS_NO_MORE_MATCHES = 0xC0000273
-STATUS_NOT_A_REPARSE_POINT = 0xC0000275
-STATUS_IO_REPARSE_TAG_INVALID = 0xC0000276
-STATUS_IO_REPARSE_TAG_MISMATCH = 0xC0000277
-STATUS_IO_REPARSE_DATA_INVALID = 0xC0000278
-STATUS_IO_REPARSE_TAG_NOT_HANDLED = 0xC0000279
-STATUS_REPARSE_POINT_NOT_RESOLVED = 0xC0000280
-STATUS_DIRECTORY_IS_A_REPARSE_POINT = 0xC0000281
-STATUS_RANGE_LIST_CONFLICT = 0xC0000282
-STATUS_SOURCE_ELEMENT_EMPTY = 0xC0000283
-STATUS_DESTINATION_ELEMENT_FULL = 0xC0000284
-STATUS_ILLEGAL_ELEMENT_ADDRESS = 0xC0000285
-STATUS_MAGAZINE_NOT_PRESENT = 0xC0000286
-STATUS_REINITIALIZATION_NEEDED = 0xC0000287
-STATUS_ENCRYPTION_FAILED = 0xC000028A
-STATUS_DECRYPTION_FAILED = 0xC000028B
-STATUS_RANGE_NOT_FOUND = 0xC000028C
-STATUS_NO_RECOVERY_POLICY = 0xC000028D
-STATUS_NO_EFS = 0xC000028E
-STATUS_WRONG_EFS = 0xC000028F
-STATUS_NO_USER_KEYS = 0xC0000290
-STATUS_FILE_NOT_ENCRYPTED = 0xC0000291
-STATUS_NOT_EXPORT_FORMAT = 0xC0000292
-STATUS_FILE_ENCRYPTED = 0xC0000293
-STATUS_WMI_GUID_NOT_FOUND = 0xC0000295
-STATUS_WMI_INSTANCE_NOT_FOUND = 0xC0000296
-STATUS_WMI_ITEMID_NOT_FOUND = 0xC0000297
-STATUS_WMI_TRY_AGAIN = 0xC0000298
-STATUS_SHARED_POLICY = 0xC0000299
-STATUS_POLICY_OBJECT_NOT_FOUND = 0xC000029A
-STATUS_POLICY_ONLY_IN_DS = 0xC000029B
-STATUS_VOLUME_NOT_UPGRADED = 0xC000029C
-STATUS_REMOTE_STORAGE_NOT_ACTIVE = 0xC000029D
-STATUS_REMOTE_STORAGE_MEDIA_ERROR = 0xC000029E
-STATUS_NO_TRACKING_SERVICE = 0xC000029F
-STATUS_SERVER_SID_MISMATCH = 0xC00002A0
-STATUS_DS_NO_ATTRIBUTE_OR_VALUE = 0xC00002A1
-STATUS_DS_INVALID_ATTRIBUTE_SYNTAX = 0xC00002A2
-STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED = 0xC00002A3
-STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS = 0xC00002A4
-STATUS_DS_BUSY = 0xC00002A5
-STATUS_DS_UNAVAILABLE = 0xC00002A6
-STATUS_DS_NO_RIDS_ALLOCATED = 0xC00002A7
-STATUS_DS_NO_MORE_RIDS = 0xC00002A8
-STATUS_DS_INCORRECT_ROLE_OWNER = 0xC00002A9
-STATUS_DS_RIDMGR_INIT_ERROR = 0xC00002AA
-STATUS_DS_OBJ_CLASS_VIOLATION = 0xC00002AB
-STATUS_DS_CANT_ON_NON_LEAF = 0xC00002AC
-STATUS_DS_CANT_ON_RDN = 0xC00002AD
-STATUS_DS_CANT_MOD_OBJ_CLASS = 0xC00002AE
-STATUS_DS_CROSS_DOM_MOVE_FAILED = 0xC00002AF
-STATUS_DS_GC_NOT_AVAILABLE = 0xC00002B0
-STATUS_DIRECTORY_SERVICE_REQUIRED = 0xC00002B1
-STATUS_REPARSE_ATTRIBUTE_CONFLICT = 0xC00002B2
-STATUS_CANT_ENABLE_DENY_ONLY = 0xC00002B3
-STATUS_FLOAT_MULTIPLE_FAULTS = 0xC00002B4
-STATUS_FLOAT_MULTIPLE_TRAPS = 0xC00002B5
-STATUS_DEVICE_REMOVED = 0xC00002B6
-STATUS_JOURNAL_DELETE_IN_PROGRESS = 0xC00002B7
-STATUS_JOURNAL_NOT_ACTIVE = 0xC00002B8
-STATUS_NOINTERFACE = 0xC00002B9
-STATUS_DS_ADMIN_LIMIT_EXCEEDED = 0xC00002C1
-STATUS_DRIVER_FAILED_SLEEP = 0xC00002C2
-STATUS_MUTUAL_AUTHENTICATION_FAILED = 0xC00002C3
-STATUS_CORRUPT_SYSTEM_FILE = 0xC00002C4
-STATUS_DATATYPE_MISALIGNMENT_ERROR = 0xC00002C5
-STATUS_WMI_READ_ONLY = 0xC00002C6
-STATUS_WMI_SET_FAILURE = 0xC00002C7
-STATUS_COMMITMENT_MINIMUM = 0xC00002C8
-STATUS_REG_NAT_CONSUMPTION = 0xC00002C9
-STATUS_TRANSPORT_FULL = 0xC00002CA
-STATUS_DS_SAM_INIT_FAILURE = 0xC00002CB
-STATUS_ONLY_IF_CONNECTED = 0xC00002CC
-STATUS_DS_SENSITIVE_GROUP_VIOLATION = 0xC00002CD
-STATUS_PNP_RESTART_ENUMERATION = 0xC00002CE
-STATUS_JOURNAL_ENTRY_DELETED = 0xC00002CF
-STATUS_DS_CANT_MOD_PRIMARYGROUPID = 0xC00002D0
-STATUS_SYSTEM_IMAGE_BAD_SIGNATURE = 0xC00002D1
-STATUS_PNP_REBOOT_REQUIRED = 0xC00002D2
-STATUS_POWER_STATE_INVALID = 0xC00002D3
-STATUS_DS_INVALID_GROUP_TYPE = 0xC00002D4
-STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 0xC00002D5
-STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 0xC00002D6
-STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D7
-STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 0xC00002D8
-STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D9
-STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 0xC00002DA
-STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 0xC00002DB
-STATUS_DS_HAVE_PRIMARY_MEMBERS = 0xC00002DC
-STATUS_WMI_NOT_SUPPORTED = 0xC00002DD
-STATUS_INSUFFICIENT_POWER = 0xC00002DE
-STATUS_SAM_NEED_BOOTKEY_PASSWORD = 0xC00002DF
-STATUS_SAM_NEED_BOOTKEY_FLOPPY = 0xC00002E0
-STATUS_DS_CANT_START = 0xC00002E1
-STATUS_DS_INIT_FAILURE = 0xC00002E2
-STATUS_SAM_INIT_FAILURE = 0xC00002E3
-STATUS_DS_GC_REQUIRED = 0xC00002E4
-STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 0xC00002E5
-STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 0xC00002E6
-STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 0xC00002E7
-STATUS_CURRENT_DOMAIN_NOT_ALLOWED = 0xC00002E9
-STATUS_CANNOT_MAKE = 0xC00002EA
-STATUS_SYSTEM_SHUTDOWN = 0xC00002EB
-STATUS_DS_INIT_FAILURE_CONSOLE = 0xC00002EC
-STATUS_DS_SAM_INIT_FAILURE_CONSOLE = 0xC00002ED
-STATUS_UNFINISHED_CONTEXT_DELETED = 0xC00002EE
-STATUS_NO_TGT_REPLY = 0xC00002EF
-STATUS_OBJECTID_NOT_FOUND = 0xC00002F0
-STATUS_NO_IP_ADDRESSES = 0xC00002F1
-STATUS_WRONG_CREDENTIAL_HANDLE = 0xC00002F2
-STATUS_CRYPTO_SYSTEM_INVALID = 0xC00002F3
-STATUS_MAX_REFERRALS_EXCEEDED = 0xC00002F4
-STATUS_MUST_BE_KDC = 0xC00002F5
-STATUS_STRONG_CRYPTO_NOT_SUPPORTED = 0xC00002F6
-STATUS_TOO_MANY_PRINCIPALS = 0xC00002F7
-STATUS_NO_PA_DATA = 0xC00002F8
-STATUS_PKINIT_NAME_MISMATCH = 0xC00002F9
-STATUS_SMARTCARD_LOGON_REQUIRED = 0xC00002FA
-STATUS_KDC_INVALID_REQUEST = 0xC00002FB
-STATUS_KDC_UNABLE_TO_REFER = 0xC00002FC
-STATUS_KDC_UNKNOWN_ETYPE = 0xC00002FD
-STATUS_SHUTDOWN_IN_PROGRESS = 0xC00002FE
-STATUS_SERVER_SHUTDOWN_IN_PROGRESS = 0xC00002FF
-STATUS_NOT_SUPPORTED_ON_SBS = 0xC0000300
-STATUS_WMI_GUID_DISCONNECTED = 0xC0000301
-STATUS_WMI_ALREADY_DISABLED = 0xC0000302
-STATUS_WMI_ALREADY_ENABLED = 0xC0000303
-STATUS_MFT_TOO_FRAGMENTED = 0xC0000304
-STATUS_COPY_PROTECTION_FAILURE = 0xC0000305
-STATUS_CSS_AUTHENTICATION_FAILURE = 0xC0000306
-STATUS_CSS_KEY_NOT_PRESENT = 0xC0000307
-STATUS_CSS_KEY_NOT_ESTABLISHED = 0xC0000308
-STATUS_CSS_SCRAMBLED_SECTOR = 0xC0000309
-STATUS_CSS_REGION_MISMATCH = 0xC000030A
-STATUS_CSS_RESETS_EXHAUSTED = 0xC000030B
-STATUS_PKINIT_FAILURE = 0xC0000320
-STATUS_SMARTCARD_SUBSYSTEM_FAILURE = 0xC0000321
-STATUS_NO_KERB_KEY = 0xC0000322
-STATUS_HOST_DOWN = 0xC0000350
-STATUS_UNSUPPORTED_PREAUTH = 0xC0000351
-STATUS_EFS_ALG_BLOB_TOO_BIG = 0xC0000352
-STATUS_PORT_NOT_SET = 0xC0000353
-STATUS_DEBUGGER_INACTIVE = 0xC0000354
-STATUS_DS_VERSION_CHECK_FAILURE = 0xC0000355
-STATUS_AUDITING_DISABLED = 0xC0000356
-STATUS_PRENT4_MACHINE_ACCOUNT = 0xC0000357
-STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 0xC0000358
-STATUS_INVALID_IMAGE_WIN_32 = 0xC0000359
-STATUS_INVALID_IMAGE_WIN_64 = 0xC000035A
-STATUS_BAD_BINDINGS = 0xC000035B
-STATUS_NETWORK_SESSION_EXPIRED = 0xC000035C
-STATUS_APPHELP_BLOCK = 0xC000035D
-STATUS_ALL_SIDS_FILTERED = 0xC000035E
-STATUS_NOT_SAFE_MODE_DRIVER = 0xC000035F
-STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT = 0xC0000361
-STATUS_ACCESS_DISABLED_BY_POLICY_PATH = 0xC0000362
-STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER = 0xC0000363
-STATUS_ACCESS_DISABLED_BY_POLICY_OTHER = 0xC0000364
-STATUS_FAILED_DRIVER_ENTRY = 0xC0000365
-STATUS_DEVICE_ENUMERATION_ERROR = 0xC0000366
-STATUS_MOUNT_POINT_NOT_RESOLVED = 0xC0000368
-STATUS_INVALID_DEVICE_OBJECT_PARAMETER = 0xC0000369
-STATUS_MCA_OCCURED = 0xC000036A
-STATUS_DRIVER_BLOCKED_CRITICAL = 0xC000036B
-STATUS_DRIVER_BLOCKED = 0xC000036C
-STATUS_DRIVER_DATABASE_ERROR = 0xC000036D
-STATUS_SYSTEM_HIVE_TOO_LARGE = 0xC000036E
-STATUS_INVALID_IMPORT_OF_NON_DLL = 0xC000036F
-STATUS_NO_SECRETS = 0xC0000371
-STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY = 0xC0000372
-STATUS_FAILED_STACK_SWITCH = 0xC0000373
-STATUS_HEAP_CORRUPTION = 0xC0000374
-STATUS_SMARTCARD_WRONG_PIN = 0xC0000380
-STATUS_SMARTCARD_CARD_BLOCKED = 0xC0000381
-STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED = 0xC0000382
-STATUS_SMARTCARD_NO_CARD = 0xC0000383
-STATUS_SMARTCARD_NO_KEY_CONTAINER = 0xC0000384
-STATUS_SMARTCARD_NO_CERTIFICATE = 0xC0000385
-STATUS_SMARTCARD_NO_KEYSET = 0xC0000386
-STATUS_SMARTCARD_IO_ERROR = 0xC0000387
-STATUS_DOWNGRADE_DETECTED = 0xC0000388
-STATUS_SMARTCARD_CERT_REVOKED = 0xC0000389
-STATUS_ISSUING_CA_UNTRUSTED = 0xC000038A
-STATUS_REVOCATION_OFFLINE_C = 0xC000038B
-STATUS_PKINIT_CLIENT_FAILURE = 0xC000038C
-STATUS_SMARTCARD_CERT_EXPIRED = 0xC000038D
-STATUS_DRIVER_FAILED_PRIOR_UNLOAD = 0xC000038E
-STATUS_SMARTCARD_SILENT_CONTEXT = 0xC000038F
-STATUS_PER_USER_TRUST_QUOTA_EXCEEDED = 0xC0000401
-STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED = 0xC0000402
-STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED = 0xC0000403
-STATUS_DS_NAME_NOT_UNIQUE = 0xC0000404
-STATUS_DS_DUPLICATE_ID_FOUND = 0xC0000405
-STATUS_DS_GROUP_CONVERSION_ERROR = 0xC0000406
-STATUS_VOLSNAP_PREPARE_HIBERNATE = 0xC0000407
-STATUS_USER2USER_REQUIRED = 0xC0000408
-STATUS_STACK_BUFFER_OVERRUN = 0xC0000409
-STATUS_NO_S4U_PROT_SUPPORT = 0xC000040A
-STATUS_CROSSREALM_DELEGATION_FAILURE = 0xC000040B
-STATUS_REVOCATION_OFFLINE_KDC = 0xC000040C
-STATUS_ISSUING_CA_UNTRUSTED_KDC = 0xC000040D
-STATUS_KDC_CERT_EXPIRED = 0xC000040E
-STATUS_KDC_CERT_REVOKED = 0xC000040F
-STATUS_PARAMETER_QUOTA_EXCEEDED = 0xC0000410
-STATUS_HIBERNATION_FAILURE = 0xC0000411
-STATUS_DELAY_LOAD_FAILED = 0xC0000412
-STATUS_AUTHENTICATION_FIREWALL_FAILED = 0xC0000413
-STATUS_VDM_DISALLOWED = 0xC0000414
-STATUS_HUNG_DISPLAY_DRIVER_THREAD = 0xC0000415
-STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE = 0xC0000416
-STATUS_INVALID_CRUNTIME_PARAMETER = 0xC0000417
-STATUS_NTLM_BLOCKED = 0xC0000418
-STATUS_DS_SRC_SID_EXISTS_IN_FOREST = 0xC0000419
-STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST = 0xC000041A
-STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST = 0xC000041B
-STATUS_INVALID_USER_PRINCIPAL_NAME = 0xC000041C
-STATUS_ASSERTION_FAILURE = 0xC0000420
-STATUS_VERIFIER_STOP = 0xC0000421
-STATUS_CALLBACK_POP_STACK = 0xC0000423
-STATUS_INCOMPATIBLE_DRIVER_BLOCKED = 0xC0000424
-STATUS_HIVE_UNLOADED = 0xC0000425
-STATUS_COMPRESSION_DISABLED = 0xC0000426
-STATUS_FILE_SYSTEM_LIMITATION = 0xC0000427
-STATUS_INVALID_IMAGE_HASH = 0xC0000428
-STATUS_NOT_CAPABLE = 0xC0000429
-STATUS_REQUEST_OUT_OF_SEQUENCE = 0xC000042A
-STATUS_IMPLEMENTATION_LIMIT = 0xC000042B
-STATUS_ELEVATION_REQUIRED = 0xC000042C
-STATUS_NO_SECURITY_CONTEXT = 0xC000042D
-STATUS_PKU2U_CERT_FAILURE = 0xC000042E
-STATUS_BEYOND_VDL = 0xC0000432
-STATUS_ENCOUNTERED_WRITE_IN_PROGRESS = 0xC0000433
-STATUS_PTE_CHANGED = 0xC0000434
-STATUS_PURGE_FAILED = 0xC0000435
-STATUS_CRED_REQUIRES_CONFIRMATION = 0xC0000440
-STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE = 0xC0000441
-STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER = 0xC0000442
-STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE = 0xC0000443
-STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE = 0xC0000444
-STATUS_CS_ENCRYPTION_FILE_NOT_CSE = 0xC0000445
-STATUS_INVALID_LABEL = 0xC0000446
-STATUS_DRIVER_PROCESS_TERMINATED = 0xC0000450
-STATUS_AMBIGUOUS_SYSTEM_DEVICE = 0xC0000451
-STATUS_SYSTEM_DEVICE_NOT_FOUND = 0xC0000452
-STATUS_RESTART_BOOT_APPLICATION = 0xC0000453
-STATUS_INSUFFICIENT_NVRAM_RESOURCES = 0xC0000454
-STATUS_INVALID_TASK_NAME = 0xC0000500
-STATUS_INVALID_TASK_INDEX = 0xC0000501
-STATUS_THREAD_ALREADY_IN_TASK = 0xC0000502
-STATUS_CALLBACK_BYPASS = 0xC0000503
-STATUS_FAIL_FAST_EXCEPTION = 0xC0000602
-STATUS_IMAGE_CERT_REVOKED = 0xC0000603
-STATUS_PORT_CLOSED = 0xC0000700
-STATUS_MESSAGE_LOST = 0xC0000701
-STATUS_INVALID_MESSAGE = 0xC0000702
-STATUS_REQUEST_CANCELED = 0xC0000703
-STATUS_RECURSIVE_DISPATCH = 0xC0000704
-STATUS_LPC_RECEIVE_BUFFER_EXPECTED = 0xC0000705
-STATUS_LPC_INVALID_CONNECTION_USAGE = 0xC0000706
-STATUS_LPC_REQUESTS_NOT_ALLOWED = 0xC0000707
-STATUS_RESOURCE_IN_USE = 0xC0000708
-STATUS_HARDWARE_MEMORY_ERROR = 0xC0000709
-STATUS_THREADPOOL_HANDLE_EXCEPTION = 0xC000070A
-STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED = 0xC000070B
-STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED = 0xC000070C
-STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED = 0xC000070D
-STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED = 0xC000070E
-STATUS_THREADPOOL_RELEASED_DURING_OPERATION = 0xC000070F
-STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING = 0xC0000710
-STATUS_APC_RETURNED_WHILE_IMPERSONATING = 0xC0000711
-STATUS_PROCESS_IS_PROTECTED = 0xC0000712
-STATUS_MCA_EXCEPTION = 0xC0000713
-STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE = 0xC0000714
-STATUS_SYMLINK_CLASS_DISABLED = 0xC0000715
-STATUS_INVALID_IDN_NORMALIZATION = 0xC0000716
-STATUS_NO_UNICODE_TRANSLATION = 0xC0000717
-STATUS_ALREADY_REGISTERED = 0xC0000718
-STATUS_CONTEXT_MISMATCH = 0xC0000719
-STATUS_PORT_ALREADY_HAS_COMPLETION_LIST = 0xC000071A
-STATUS_CALLBACK_RETURNED_THREAD_PRIORITY = 0xC000071B
-STATUS_INVALID_THREAD = 0xC000071C
-STATUS_CALLBACK_RETURNED_TRANSACTION = 0xC000071D
-STATUS_CALLBACK_RETURNED_LDR_LOCK = 0xC000071E
-STATUS_CALLBACK_RETURNED_LANG = 0xC000071F
-STATUS_CALLBACK_RETURNED_PRI_BACK = 0xC0000720
-STATUS_DISK_REPAIR_DISABLED = 0xC0000800
-STATUS_DS_DOMAIN_RENAME_IN_PROGRESS = 0xC0000801
-STATUS_DISK_QUOTA_EXCEEDED = 0xC0000802
-STATUS_CONTENT_BLOCKED = 0xC0000804
-STATUS_BAD_CLUSTERS = 0xC0000805
-STATUS_VOLUME_DIRTY = 0xC0000806
-STATUS_FILE_CHECKED_OUT = 0xC0000901
-STATUS_CHECKOUT_REQUIRED = 0xC0000902
-STATUS_BAD_FILE_TYPE = 0xC0000903
-STATUS_FILE_TOO_LARGE = 0xC0000904
-STATUS_FORMS_AUTH_REQUIRED = 0xC0000905
-STATUS_VIRUS_INFECTED = 0xC0000906
-STATUS_VIRUS_DELETED = 0xC0000907
-STATUS_BAD_MCFG_TABLE = 0xC0000908
-STATUS_CANNOT_BREAK_OPLOCK = 0xC0000909
-STATUS_WOW_ASSERTION = 0xC0009898
-STATUS_INVALID_SIGNATURE = 0xC000A000
-STATUS_HMAC_NOT_SUPPORTED = 0xC000A001
-STATUS_IPSEC_QUEUE_OVERFLOW = 0xC000A010
-STATUS_ND_QUEUE_OVERFLOW = 0xC000A011
-STATUS_HOPLIMIT_EXCEEDED = 0xC000A012
-STATUS_PROTOCOL_NOT_SUPPORTED = 0xC000A013
-STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED = 0xC000A080
-STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR = 0xC000A081
-STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR = 0xC000A082
-STATUS_XML_PARSE_ERROR = 0xC000A083
-STATUS_XMLDSIG_ERROR = 0xC000A084
-STATUS_WRONG_COMPARTMENT = 0xC000A085
-STATUS_AUTHIP_FAILURE = 0xC000A086
-STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS = 0xC000A087
-STATUS_DS_OID_NOT_FOUND = 0xC000A088
-STATUS_HASH_NOT_SUPPORTED = 0xC000A100
-STATUS_HASH_NOT_PRESENT = 0xC000A101
-DBG_NO_STATE_CHANGE = 0xC0010001
-DBG_APP_NOT_IDLE = 0xC0010002
-RPC_NT_INVALID_STRING_BINDING = 0xC0020001
-RPC_NT_WRONG_KIND_OF_BINDING = 0xC0020002
-RPC_NT_INVALID_BINDING = 0xC0020003
-RPC_NT_PROTSEQ_NOT_SUPPORTED = 0xC0020004
-RPC_NT_INVALID_RPC_PROTSEQ = 0xC0020005
-RPC_NT_INVALID_STRING_UUID = 0xC0020006
-RPC_NT_INVALID_ENDPOINT_FORMAT = 0xC0020007
-RPC_NT_INVALID_NET_ADDR = 0xC0020008
-RPC_NT_NO_ENDPOINT_FOUND = 0xC0020009
-RPC_NT_INVALID_TIMEOUT = 0xC002000A
-RPC_NT_OBJECT_NOT_FOUND = 0xC002000B
-RPC_NT_ALREADY_REGISTERED = 0xC002000C
-RPC_NT_TYPE_ALREADY_REGISTERED = 0xC002000D
-RPC_NT_ALREADY_LISTENING = 0xC002000E
-RPC_NT_NO_PROTSEQS_REGISTERED = 0xC002000F
-RPC_NT_NOT_LISTENING = 0xC0020010
-RPC_NT_UNKNOWN_MGR_TYPE = 0xC0020011
-RPC_NT_UNKNOWN_IF = 0xC0020012
-RPC_NT_NO_BINDINGS = 0xC0020013
-RPC_NT_NO_PROTSEQS = 0xC0020014
-RPC_NT_CANT_CREATE_ENDPOINT = 0xC0020015
-RPC_NT_OUT_OF_RESOURCES = 0xC0020016
-RPC_NT_SERVER_UNAVAILABLE = 0xC0020017
-RPC_NT_SERVER_TOO_BUSY = 0xC0020018
-RPC_NT_INVALID_NETWORK_OPTIONS = 0xC0020019
-RPC_NT_NO_CALL_ACTIVE = 0xC002001A
-RPC_NT_CALL_FAILED = 0xC002001B
-RPC_NT_CALL_FAILED_DNE = 0xC002001C
-RPC_NT_PROTOCOL_ERROR = 0xC002001D
-RPC_NT_UNSUPPORTED_TRANS_SYN = 0xC002001F
-RPC_NT_UNSUPPORTED_TYPE = 0xC0020021
-RPC_NT_INVALID_TAG = 0xC0020022
-RPC_NT_INVALID_BOUND = 0xC0020023
-RPC_NT_NO_ENTRY_NAME = 0xC0020024
-RPC_NT_INVALID_NAME_SYNTAX = 0xC0020025
-RPC_NT_UNSUPPORTED_NAME_SYNTAX = 0xC0020026
-RPC_NT_UUID_NO_ADDRESS = 0xC0020028
-RPC_NT_DUPLICATE_ENDPOINT = 0xC0020029
-RPC_NT_UNKNOWN_AUTHN_TYPE = 0xC002002A
-RPC_NT_MAX_CALLS_TOO_SMALL = 0xC002002B
-RPC_NT_STRING_TOO_LONG = 0xC002002C
-RPC_NT_PROTSEQ_NOT_FOUND = 0xC002002D
-RPC_NT_PROCNUM_OUT_OF_RANGE = 0xC002002E
-RPC_NT_BINDING_HAS_NO_AUTH = 0xC002002F
-RPC_NT_UNKNOWN_AUTHN_SERVICE = 0xC0020030
-RPC_NT_UNKNOWN_AUTHN_LEVEL = 0xC0020031
-RPC_NT_INVALID_AUTH_IDENTITY = 0xC0020032
-RPC_NT_UNKNOWN_AUTHZ_SERVICE = 0xC0020033
-EPT_NT_INVALID_ENTRY = 0xC0020034
-EPT_NT_CANT_PERFORM_OP = 0xC0020035
-EPT_NT_NOT_REGISTERED = 0xC0020036
-RPC_NT_NOTHING_TO_EXPORT = 0xC0020037
-RPC_NT_INCOMPLETE_NAME = 0xC0020038
-RPC_NT_INVALID_VERS_OPTION = 0xC0020039
-RPC_NT_NO_MORE_MEMBERS = 0xC002003A
-RPC_NT_NOT_ALL_OBJS_UNEXPORTED = 0xC002003B
-RPC_NT_INTERFACE_NOT_FOUND = 0xC002003C
-RPC_NT_ENTRY_ALREADY_EXISTS = 0xC002003D
-RPC_NT_ENTRY_NOT_FOUND = 0xC002003E
-RPC_NT_NAME_SERVICE_UNAVAILABLE = 0xC002003F
-RPC_NT_INVALID_NAF_ID = 0xC0020040
-RPC_NT_CANNOT_SUPPORT = 0xC0020041
-RPC_NT_NO_CONTEXT_AVAILABLE = 0xC0020042
-RPC_NT_INTERNAL_ERROR = 0xC0020043
-RPC_NT_ZERO_DIVIDE = 0xC0020044
-RPC_NT_ADDRESS_ERROR = 0xC0020045
-RPC_NT_FP_DIV_ZERO = 0xC0020046
-RPC_NT_FP_UNDERFLOW = 0xC0020047
-RPC_NT_FP_OVERFLOW = 0xC0020048
-RPC_NT_CALL_IN_PROGRESS = 0xC0020049
-RPC_NT_NO_MORE_BINDINGS = 0xC002004A
-RPC_NT_GROUP_MEMBER_NOT_FOUND = 0xC002004B
-EPT_NT_CANT_CREATE = 0xC002004C
-RPC_NT_INVALID_OBJECT = 0xC002004D
-RPC_NT_NO_INTERFACES = 0xC002004F
-RPC_NT_CALL_CANCELLED = 0xC0020050
-RPC_NT_BINDING_INCOMPLETE = 0xC0020051
-RPC_NT_COMM_FAILURE = 0xC0020052
-RPC_NT_UNSUPPORTED_AUTHN_LEVEL = 0xC0020053
-RPC_NT_NO_PRINC_NAME = 0xC0020054
-RPC_NT_NOT_RPC_ERROR = 0xC0020055
-RPC_NT_SEC_PKG_ERROR = 0xC0020057
-RPC_NT_NOT_CANCELLED = 0xC0020058
-RPC_NT_INVALID_ASYNC_HANDLE = 0xC0020062
-RPC_NT_INVALID_ASYNC_CALL = 0xC0020063
-RPC_NT_PROXY_ACCESS_DENIED = 0xC0020064
-RPC_NT_NO_MORE_ENTRIES = 0xC0030001
-RPC_NT_SS_CHAR_TRANS_OPEN_FAIL = 0xC0030002
-RPC_NT_SS_CHAR_TRANS_SHORT_FILE = 0xC0030003
-RPC_NT_SS_IN_NULL_CONTEXT = 0xC0030004
-RPC_NT_SS_CONTEXT_MISMATCH = 0xC0030005
-RPC_NT_SS_CONTEXT_DAMAGED = 0xC0030006
-RPC_NT_SS_HANDLES_MISMATCH = 0xC0030007
-RPC_NT_SS_CANNOT_GET_CALL_HANDLE = 0xC0030008
-RPC_NT_NULL_REF_POINTER = 0xC0030009
-RPC_NT_ENUM_VALUE_OUT_OF_RANGE = 0xC003000A
-RPC_NT_BYTE_COUNT_TOO_SMALL = 0xC003000B
-RPC_NT_BAD_STUB_DATA = 0xC003000C
-RPC_NT_INVALID_ES_ACTION = 0xC0030059
-RPC_NT_WRONG_ES_VERSION = 0xC003005A
-RPC_NT_WRONG_STUB_VERSION = 0xC003005B
-RPC_NT_INVALID_PIPE_OBJECT = 0xC003005C
-RPC_NT_INVALID_PIPE_OPERATION = 0xC003005D
-RPC_NT_WRONG_PIPE_VERSION = 0xC003005E
-RPC_NT_PIPE_CLOSED = 0xC003005F
-RPC_NT_PIPE_DISCIPLINE_ERROR = 0xC0030060
-RPC_NT_PIPE_EMPTY = 0xC0030061
-STATUS_PNP_BAD_MPS_TABLE = 0xC0040035
-STATUS_PNP_TRANSLATION_FAILED = 0xC0040036
-STATUS_PNP_IRQ_TRANSLATION_FAILED = 0xC0040037
-STATUS_PNP_INVALID_ID = 0xC0040038
-STATUS_IO_REISSUE_AS_CACHED = 0xC0040039
-STATUS_CTX_WINSTATION_NAME_INVALID = 0xC00A0001
-STATUS_CTX_INVALID_PD = 0xC00A0002
-STATUS_CTX_PD_NOT_FOUND = 0xC00A0003
-STATUS_CTX_CLOSE_PENDING = 0xC00A0006
-STATUS_CTX_NO_OUTBUF = 0xC00A0007
-STATUS_CTX_MODEM_INF_NOT_FOUND = 0xC00A0008
-STATUS_CTX_INVALID_MODEMNAME = 0xC00A0009
-STATUS_CTX_RESPONSE_ERROR = 0xC00A000A
-STATUS_CTX_MODEM_RESPONSE_TIMEOUT = 0xC00A000B
-STATUS_CTX_MODEM_RESPONSE_NO_CARRIER = 0xC00A000C
-STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE = 0xC00A000D
-STATUS_CTX_MODEM_RESPONSE_BUSY = 0xC00A000E
-STATUS_CTX_MODEM_RESPONSE_VOICE = 0xC00A000F
-STATUS_CTX_TD_ERROR = 0xC00A0010
-STATUS_CTX_LICENSE_CLIENT_INVALID = 0xC00A0012
-STATUS_CTX_LICENSE_NOT_AVAILABLE = 0xC00A0013
-STATUS_CTX_LICENSE_EXPIRED = 0xC00A0014
-STATUS_CTX_WINSTATION_NOT_FOUND = 0xC00A0015
-STATUS_CTX_WINSTATION_NAME_COLLISION = 0xC00A0016
-STATUS_CTX_WINSTATION_BUSY = 0xC00A0017
-STATUS_CTX_BAD_VIDEO_MODE = 0xC00A0018
-STATUS_CTX_GRAPHICS_INVALID = 0xC00A0022
-STATUS_CTX_NOT_CONSOLE = 0xC00A0024
-STATUS_CTX_CLIENT_QUERY_TIMEOUT = 0xC00A0026
-STATUS_CTX_CONSOLE_DISCONNECT = 0xC00A0027
-STATUS_CTX_CONSOLE_CONNECT = 0xC00A0028
-STATUS_CTX_SHADOW_DENIED = 0xC00A002A
-STATUS_CTX_WINSTATION_ACCESS_DENIED = 0xC00A002B
-STATUS_CTX_INVALID_WD = 0xC00A002E
-STATUS_CTX_WD_NOT_FOUND = 0xC00A002F
-STATUS_CTX_SHADOW_INVALID = 0xC00A0030
-STATUS_CTX_SHADOW_DISABLED = 0xC00A0031
-STATUS_RDP_PROTOCOL_ERROR = 0xC00A0032
-STATUS_CTX_CLIENT_LICENSE_NOT_SET = 0xC00A0033
-STATUS_CTX_CLIENT_LICENSE_IN_USE = 0xC00A0034
-STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 0xC00A0035
-STATUS_CTX_SHADOW_NOT_RUNNING = 0xC00A0036
-STATUS_CTX_LOGON_DISABLED = 0xC00A0037
-STATUS_CTX_SECURITY_LAYER_ERROR = 0xC00A0038
-STATUS_TS_INCOMPATIBLE_SESSIONS = 0xC00A0039
-STATUS_MUI_FILE_NOT_FOUND = 0xC00B0001
-STATUS_MUI_INVALID_FILE = 0xC00B0002
-STATUS_MUI_INVALID_RC_CONFIG = 0xC00B0003
-STATUS_MUI_INVALID_LOCALE_NAME = 0xC00B0004
-STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME = 0xC00B0005
-STATUS_MUI_FILE_NOT_LOADED = 0xC00B0006
-STATUS_RESOURCE_ENUM_USER_STOP = 0xC00B0007
-STATUS_CLUSTER_INVALID_NODE = 0xC0130001
-STATUS_CLUSTER_NODE_EXISTS = 0xC0130002
-STATUS_CLUSTER_JOIN_IN_PROGRESS = 0xC0130003
-STATUS_CLUSTER_NODE_NOT_FOUND = 0xC0130004
-STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND = 0xC0130005
-STATUS_CLUSTER_NETWORK_EXISTS = 0xC0130006
-STATUS_CLUSTER_NETWORK_NOT_FOUND = 0xC0130007
-STATUS_CLUSTER_NETINTERFACE_EXISTS = 0xC0130008
-STATUS_CLUSTER_NETINTERFACE_NOT_FOUND = 0xC0130009
-STATUS_CLUSTER_INVALID_REQUEST = 0xC013000A
-STATUS_CLUSTER_INVALID_NETWORK_PROVIDER = 0xC013000B
-STATUS_CLUSTER_NODE_DOWN = 0xC013000C
-STATUS_CLUSTER_NODE_UNREACHABLE = 0xC013000D
-STATUS_CLUSTER_NODE_NOT_MEMBER = 0xC013000E
-STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS = 0xC013000F
-STATUS_CLUSTER_INVALID_NETWORK = 0xC0130010
-STATUS_CLUSTER_NO_NET_ADAPTERS = 0xC0130011
-STATUS_CLUSTER_NODE_UP = 0xC0130012
-STATUS_CLUSTER_NODE_PAUSED = 0xC0130013
-STATUS_CLUSTER_NODE_NOT_PAUSED = 0xC0130014
-STATUS_CLUSTER_NO_SECURITY_CONTEXT = 0xC0130015
-STATUS_CLUSTER_NETWORK_NOT_INTERNAL = 0xC0130016
-STATUS_CLUSTER_POISONED = 0xC0130017
-STATUS_ACPI_INVALID_OPCODE = 0xC0140001
-STATUS_ACPI_STACK_OVERFLOW = 0xC0140002
-STATUS_ACPI_ASSERT_FAILED = 0xC0140003
-STATUS_ACPI_INVALID_INDEX = 0xC0140004
-STATUS_ACPI_INVALID_ARGUMENT = 0xC0140005
-STATUS_ACPI_FATAL = 0xC0140006
-STATUS_ACPI_INVALID_SUPERNAME = 0xC0140007
-STATUS_ACPI_INVALID_ARGTYPE = 0xC0140008
-STATUS_ACPI_INVALID_OBJTYPE = 0xC0140009
-STATUS_ACPI_INVALID_TARGETTYPE = 0xC014000A
-STATUS_ACPI_INCORRECT_ARGUMENT_COUNT = 0xC014000B
-STATUS_ACPI_ADDRESS_NOT_MAPPED = 0xC014000C
-STATUS_ACPI_INVALID_EVENTTYPE = 0xC014000D
-STATUS_ACPI_HANDLER_COLLISION = 0xC014000E
-STATUS_ACPI_INVALID_DATA = 0xC014000F
-STATUS_ACPI_INVALID_REGION = 0xC0140010
-STATUS_ACPI_INVALID_ACCESS_SIZE = 0xC0140011
-STATUS_ACPI_ACQUIRE_GLOBAL_LOCK = 0xC0140012
-STATUS_ACPI_ALREADY_INITIALIZED = 0xC0140013
-STATUS_ACPI_NOT_INITIALIZED = 0xC0140014
-STATUS_ACPI_INVALID_MUTEX_LEVEL = 0xC0140015
-STATUS_ACPI_MUTEX_NOT_OWNED = 0xC0140016
-STATUS_ACPI_MUTEX_NOT_OWNER = 0xC0140017
-STATUS_ACPI_RS_ACCESS = 0xC0140018
-STATUS_ACPI_INVALID_TABLE = 0xC0140019
-STATUS_ACPI_REG_HANDLER_FAILED = 0xC0140020
-STATUS_ACPI_POWER_REQUEST_FAILED = 0xC0140021
-STATUS_SXS_SECTION_NOT_FOUND = 0xC0150001
-STATUS_SXS_CANT_GEN_ACTCTX = 0xC0150002
-STATUS_SXS_INVALID_ACTCTXDATA_FORMAT = 0xC0150003
-STATUS_SXS_ASSEMBLY_NOT_FOUND = 0xC0150004
-STATUS_SXS_MANIFEST_FORMAT_ERROR = 0xC0150005
-STATUS_SXS_MANIFEST_PARSE_ERROR = 0xC0150006
-STATUS_SXS_ACTIVATION_CONTEXT_DISABLED = 0xC0150007
-STATUS_SXS_KEY_NOT_FOUND = 0xC0150008
-STATUS_SXS_VERSION_CONFLICT = 0xC0150009
-STATUS_SXS_WRONG_SECTION_TYPE = 0xC015000A
-STATUS_SXS_THREAD_QUERIES_DISABLED = 0xC015000B
-STATUS_SXS_ASSEMBLY_MISSING = 0xC015000C
-STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET = 0xC015000E
-STATUS_SXS_EARLY_DEACTIVATION = 0xC015000F
-STATUS_SXS_INVALID_DEACTIVATION = 0xC0150010
-STATUS_SXS_MULTIPLE_DEACTIVATION = 0xC0150011
-STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY = 0xC0150012
-STATUS_SXS_PROCESS_TERMINATION_REQUESTED = 0xC0150013
-STATUS_SXS_CORRUPT_ACTIVATION_STACK = 0xC0150014
-STATUS_SXS_CORRUPTION = 0xC0150015
-STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE = 0xC0150016
-STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME = 0xC0150017
-STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE = 0xC0150018
-STATUS_SXS_IDENTITY_PARSE_ERROR = 0xC0150019
-STATUS_SXS_COMPONENT_STORE_CORRUPT = 0xC015001A
-STATUS_SXS_FILE_HASH_MISMATCH = 0xC015001B
-STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT = 0xC015001C
-STATUS_SXS_IDENTITIES_DIFFERENT = 0xC015001D
-STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT = 0xC015001E
-STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY = 0xC015001F
-STATUS_ADVANCED_INSTALLER_FAILED = 0xC0150020
-STATUS_XML_ENCODING_MISMATCH = 0xC0150021
-STATUS_SXS_MANIFEST_TOO_BIG = 0xC0150022
-STATUS_SXS_SETTING_NOT_REGISTERED = 0xC0150023
-STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE = 0xC0150024
-STATUS_SMI_PRIMITIVE_INSTALLER_FAILED = 0xC0150025
-STATUS_GENERIC_COMMAND_FAILED = 0xC0150026
-STATUS_SXS_FILE_HASH_MISSING = 0xC0150027
-STATUS_TRANSACTIONAL_CONFLICT = 0xC0190001
-STATUS_INVALID_TRANSACTION = 0xC0190002
-STATUS_TRANSACTION_NOT_ACTIVE = 0xC0190003
-STATUS_TM_INITIALIZATION_FAILED = 0xC0190004
-STATUS_RM_NOT_ACTIVE = 0xC0190005
-STATUS_RM_METADATA_CORRUPT = 0xC0190006
-STATUS_TRANSACTION_NOT_JOINED = 0xC0190007
-STATUS_DIRECTORY_NOT_RM = 0xC0190008
-STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE = 0xC019000A
-STATUS_LOG_RESIZE_INVALID_SIZE = 0xC019000B
-STATUS_REMOTE_FILE_VERSION_MISMATCH = 0xC019000C
-STATUS_CRM_PROTOCOL_ALREADY_EXISTS = 0xC019000F
-STATUS_TRANSACTION_PROPAGATION_FAILED = 0xC0190010
-STATUS_CRM_PROTOCOL_NOT_FOUND = 0xC0190011
-STATUS_TRANSACTION_SUPERIOR_EXISTS = 0xC0190012
-STATUS_TRANSACTION_REQUEST_NOT_VALID = 0xC0190013
-STATUS_TRANSACTION_NOT_REQUESTED = 0xC0190014
-STATUS_TRANSACTION_ALREADY_ABORTED = 0xC0190015
-STATUS_TRANSACTION_ALREADY_COMMITTED = 0xC0190016
-STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER = 0xC0190017
-STATUS_CURRENT_TRANSACTION_NOT_VALID = 0xC0190018
-STATUS_LOG_GROWTH_FAILED = 0xC0190019
-STATUS_OBJECT_NO_LONGER_EXISTS = 0xC0190021
-STATUS_STREAM_MINIVERSION_NOT_FOUND = 0xC0190022
-STATUS_STREAM_MINIVERSION_NOT_VALID = 0xC0190023
-STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION = 0xC0190024
-STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT = 0xC0190025
-STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS = 0xC0190026
-STATUS_HANDLE_NO_LONGER_VALID = 0xC0190028
-STATUS_LOG_CORRUPTION_DETECTED = 0xC0190030
-STATUS_RM_DISCONNECTED = 0xC0190032
-STATUS_ENLISTMENT_NOT_SUPERIOR = 0xC0190033
-STATUS_FILE_IDENTITY_NOT_PERSISTENT = 0xC0190036
-STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY = 0xC0190037
-STATUS_CANT_CROSS_RM_BOUNDARY = 0xC0190038
-STATUS_TXF_DIR_NOT_EMPTY = 0xC0190039
-STATUS_INDOUBT_TRANSACTIONS_EXIST = 0xC019003A
-STATUS_TM_VOLATILE = 0xC019003B
-STATUS_ROLLBACK_TIMER_EXPIRED = 0xC019003C
-STATUS_TXF_ATTRIBUTE_CORRUPT = 0xC019003D
-STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION = 0xC019003E
-STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED = 0xC019003F
-STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE = 0xC0190040
-STATUS_TRANSACTION_REQUIRED_PROMOTION = 0xC0190043
-STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION = 0xC0190044
-STATUS_TRANSACTIONS_NOT_FROZEN = 0xC0190045
-STATUS_TRANSACTION_FREEZE_IN_PROGRESS = 0xC0190046
-STATUS_NOT_SNAPSHOT_VOLUME = 0xC0190047
-STATUS_NO_SAVEPOINT_WITH_OPEN_FILES = 0xC0190048
-STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION = 0xC0190049
-STATUS_TM_IDENTITY_MISMATCH = 0xC019004A
-STATUS_FLOATED_SECTION = 0xC019004B
-STATUS_CANNOT_ACCEPT_TRANSACTED_WORK = 0xC019004C
-STATUS_CANNOT_ABORT_TRANSACTIONS = 0xC019004D
-STATUS_TRANSACTION_NOT_FOUND = 0xC019004E
-STATUS_RESOURCEMANAGER_NOT_FOUND = 0xC019004F
-STATUS_ENLISTMENT_NOT_FOUND = 0xC0190050
-STATUS_TRANSACTIONMANAGER_NOT_FOUND = 0xC0190051
-STATUS_TRANSACTIONMANAGER_NOT_ONLINE = 0xC0190052
-STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION = 0xC0190053
-STATUS_TRANSACTION_NOT_ROOT = 0xC0190054
-STATUS_TRANSACTION_OBJECT_EXPIRED = 0xC0190055
-STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION = 0xC0190056
-STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED = 0xC0190057
-STATUS_TRANSACTION_RECORD_TOO_LONG = 0xC0190058
-STATUS_NO_LINK_TRACKING_IN_TRANSACTION = 0xC0190059
-STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION = 0xC019005A
-STATUS_TRANSACTION_INTEGRITY_VIOLATED = 0xC019005B
-STATUS_EXPIRED_HANDLE = 0xC0190060
-STATUS_TRANSACTION_NOT_ENLISTED = 0xC0190061
-STATUS_LOG_SECTOR_INVALID = 0xC01A0001
-STATUS_LOG_SECTOR_PARITY_INVALID = 0xC01A0002
-STATUS_LOG_SECTOR_REMAPPED = 0xC01A0003
-STATUS_LOG_BLOCK_INCOMPLETE = 0xC01A0004
-STATUS_LOG_INVALID_RANGE = 0xC01A0005
-STATUS_LOG_BLOCKS_EXHAUSTED = 0xC01A0006
-STATUS_LOG_READ_CONTEXT_INVALID = 0xC01A0007
-STATUS_LOG_RESTART_INVALID = 0xC01A0008
-STATUS_LOG_BLOCK_VERSION = 0xC01A0009
-STATUS_LOG_BLOCK_INVALID = 0xC01A000A
-STATUS_LOG_READ_MODE_INVALID = 0xC01A000B
-STATUS_LOG_METADATA_CORRUPT = 0xC01A000D
-STATUS_LOG_METADATA_INVALID = 0xC01A000E
-STATUS_LOG_METADATA_INCONSISTENT = 0xC01A000F
-STATUS_LOG_RESERVATION_INVALID = 0xC01A0010
-STATUS_LOG_CANT_DELETE = 0xC01A0011
-STATUS_LOG_CONTAINER_LIMIT_EXCEEDED = 0xC01A0012
-STATUS_LOG_START_OF_LOG = 0xC01A0013
-STATUS_LOG_POLICY_ALREADY_INSTALLED = 0xC01A0014
-STATUS_LOG_POLICY_NOT_INSTALLED = 0xC01A0015
-STATUS_LOG_POLICY_INVALID = 0xC01A0016
-STATUS_LOG_POLICY_CONFLICT = 0xC01A0017
-STATUS_LOG_PINNED_ARCHIVE_TAIL = 0xC01A0018
-STATUS_LOG_RECORD_NONEXISTENT = 0xC01A0019
-STATUS_LOG_RECORDS_RESERVED_INVALID = 0xC01A001A
-STATUS_LOG_SPACE_RESERVED_INVALID = 0xC01A001B
-STATUS_LOG_TAIL_INVALID = 0xC01A001C
-STATUS_LOG_FULL = 0xC01A001D
-STATUS_LOG_MULTIPLEXED = 0xC01A001E
-STATUS_LOG_DEDICATED = 0xC01A001F
-STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS = 0xC01A0020
-STATUS_LOG_ARCHIVE_IN_PROGRESS = 0xC01A0021
-STATUS_LOG_EPHEMERAL = 0xC01A0022
-STATUS_LOG_NOT_ENOUGH_CONTAINERS = 0xC01A0023
-STATUS_LOG_CLIENT_ALREADY_REGISTERED = 0xC01A0024
-STATUS_LOG_CLIENT_NOT_REGISTERED = 0xC01A0025
-STATUS_LOG_FULL_HANDLER_IN_PROGRESS = 0xC01A0026
-STATUS_LOG_CONTAINER_READ_FAILED = 0xC01A0027
-STATUS_LOG_CONTAINER_WRITE_FAILED = 0xC01A0028
-STATUS_LOG_CONTAINER_OPEN_FAILED = 0xC01A0029
-STATUS_LOG_CONTAINER_STATE_INVALID = 0xC01A002A
-STATUS_LOG_STATE_INVALID = 0xC01A002B
-STATUS_LOG_PINNED = 0xC01A002C
-STATUS_LOG_METADATA_FLUSH_FAILED = 0xC01A002D
-STATUS_LOG_INCONSISTENT_SECURITY = 0xC01A002E
-STATUS_LOG_APPENDED_FLUSH_FAILED = 0xC01A002F
-STATUS_LOG_PINNED_RESERVATION = 0xC01A0030
-STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD = 0xC01B00EA
-STATUS_FLT_NO_HANDLER_DEFINED = 0xC01C0001
-STATUS_FLT_CONTEXT_ALREADY_DEFINED = 0xC01C0002
-STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST = 0xC01C0003
-STATUS_FLT_DISALLOW_FAST_IO = 0xC01C0004
-STATUS_FLT_INVALID_NAME_REQUEST = 0xC01C0005
-STATUS_FLT_NOT_SAFE_TO_POST_OPERATION = 0xC01C0006
-STATUS_FLT_NOT_INITIALIZED = 0xC01C0007
-STATUS_FLT_FILTER_NOT_READY = 0xC01C0008
-STATUS_FLT_POST_OPERATION_CLEANUP = 0xC01C0009
-STATUS_FLT_INTERNAL_ERROR = 0xC01C000A
-STATUS_FLT_DELETING_OBJECT = 0xC01C000B
-STATUS_FLT_MUST_BE_NONPAGED_POOL = 0xC01C000C
-STATUS_FLT_DUPLICATE_ENTRY = 0xC01C000D
-STATUS_FLT_CBDQ_DISABLED = 0xC01C000E
-STATUS_FLT_DO_NOT_ATTACH = 0xC01C000F
-STATUS_FLT_DO_NOT_DETACH = 0xC01C0010
-STATUS_FLT_INSTANCE_ALTITUDE_COLLISION = 0xC01C0011
-STATUS_FLT_INSTANCE_NAME_COLLISION = 0xC01C0012
-STATUS_FLT_FILTER_NOT_FOUND = 0xC01C0013
-STATUS_FLT_VOLUME_NOT_FOUND = 0xC01C0014
-STATUS_FLT_INSTANCE_NOT_FOUND = 0xC01C0015
-STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND = 0xC01C0016
-STATUS_FLT_INVALID_CONTEXT_REGISTRATION = 0xC01C0017
-STATUS_FLT_NAME_CACHE_MISS = 0xC01C0018
-STATUS_FLT_NO_DEVICE_OBJECT = 0xC01C0019
-STATUS_FLT_VOLUME_ALREADY_MOUNTED = 0xC01C001A
-STATUS_FLT_ALREADY_ENLISTED = 0xC01C001B
-STATUS_FLT_CONTEXT_ALREADY_LINKED = 0xC01C001C
-STATUS_FLT_NO_WAITER_FOR_REPLY = 0xC01C0020
-STATUS_MONITOR_NO_DESCRIPTOR = 0xC01D0001
-STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT = 0xC01D0002
-STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM = 0xC01D0003
-STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK = 0xC01D0004
-STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED = 0xC01D0005
-STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK = 0xC01D0006
-STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK = 0xC01D0007
-STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA = 0xC01D0008
-STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK = 0xC01D0009
-STATUS_MONITOR_INVALID_MANUFACTURE_DATE = 0xC01D000A
-STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER = 0xC01E0000
-STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER = 0xC01E0001
-STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER = 0xC01E0002
-STATUS_GRAPHICS_ADAPTER_WAS_RESET = 0xC01E0003
-STATUS_GRAPHICS_INVALID_DRIVER_MODEL = 0xC01E0004
-STATUS_GRAPHICS_PRESENT_MODE_CHANGED = 0xC01E0005
-STATUS_GRAPHICS_PRESENT_OCCLUDED = 0xC01E0006
-STATUS_GRAPHICS_PRESENT_DENIED = 0xC01E0007
-STATUS_GRAPHICS_CANNOTCOLORCONVERT = 0xC01E0008
-STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED = 0xC01E000B
-STATUS_GRAPHICS_PRESENT_UNOCCLUDED = 0xC01E000C
-STATUS_GRAPHICS_NO_VIDEO_MEMORY = 0xC01E0100
-STATUS_GRAPHICS_CANT_LOCK_MEMORY = 0xC01E0101
-STATUS_GRAPHICS_ALLOCATION_BUSY = 0xC01E0102
-STATUS_GRAPHICS_TOO_MANY_REFERENCES = 0xC01E0103
-STATUS_GRAPHICS_TRY_AGAIN_LATER = 0xC01E0104
-STATUS_GRAPHICS_TRY_AGAIN_NOW = 0xC01E0105
-STATUS_GRAPHICS_ALLOCATION_INVALID = 0xC01E0106
-STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE = 0xC01E0107
-STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED = 0xC01E0108
-STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION = 0xC01E0109
-STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE = 0xC01E0110
-STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION = 0xC01E0111
-STATUS_GRAPHICS_ALLOCATION_CLOSED = 0xC01E0112
-STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE = 0xC01E0113
-STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE = 0xC01E0114
-STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE = 0xC01E0115
-STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST = 0xC01E0116
-STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE = 0xC01E0200
-STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY = 0xC01E0300
-STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED = 0xC01E0301
-STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED = 0xC01E0302
-STATUS_GRAPHICS_INVALID_VIDPN = 0xC01E0303
-STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE = 0xC01E0304
-STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET = 0xC01E0305
-STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED = 0xC01E0306
-STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET = 0xC01E0308
-STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET = 0xC01E0309
-STATUS_GRAPHICS_INVALID_FREQUENCY = 0xC01E030A
-STATUS_GRAPHICS_INVALID_ACTIVE_REGION = 0xC01E030B
-STATUS_GRAPHICS_INVALID_TOTAL_REGION = 0xC01E030C
-STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE = 0xC01E0310
-STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE = 0xC01E0311
-STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET = 0xC01E0312
-STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY = 0xC01E0313
-STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET = 0xC01E0314
-STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET = 0xC01E0315
-STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET = 0xC01E0316
-STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET = 0xC01E0317
-STATUS_GRAPHICS_TARGET_ALREADY_IN_SET = 0xC01E0318
-STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH = 0xC01E0319
-STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY = 0xC01E031A
-STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET = 0xC01E031B
-STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE = 0xC01E031C
-STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET = 0xC01E031D
-STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET = 0xC01E031F
-STATUS_GRAPHICS_STALE_MODESET = 0xC01E0320
-STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET = 0xC01E0321
-STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE = 0xC01E0322
-STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN = 0xC01E0323
-STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE = 0xC01E0324
-STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION = 0xC01E0325
-STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES = 0xC01E0326
-STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY = 0xC01E0327
-STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE = 0xC01E0328
-STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET = 0xC01E0329
-STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET = 0xC01E032A
-STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR = 0xC01E032B
-STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET = 0xC01E032C
-STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET = 0xC01E032D
-STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE = 0xC01E032E
-STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE = 0xC01E032F
-STATUS_GRAPHICS_RESOURCES_NOT_RELATED = 0xC01E0330
-STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE = 0xC01E0331
-STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE = 0xC01E0332
-STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET = 0xC01E0333
-STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER = 0xC01E0334
-STATUS_GRAPHICS_NO_VIDPNMGR = 0xC01E0335
-STATUS_GRAPHICS_NO_ACTIVE_VIDPN = 0xC01E0336
-STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY = 0xC01E0337
-STATUS_GRAPHICS_MONITOR_NOT_CONNECTED = 0xC01E0338
-STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY = 0xC01E0339
-STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE = 0xC01E033A
-STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE = 0xC01E033B
-STATUS_GRAPHICS_INVALID_STRIDE = 0xC01E033C
-STATUS_GRAPHICS_INVALID_PIXELFORMAT = 0xC01E033D
-STATUS_GRAPHICS_INVALID_COLORBASIS = 0xC01E033E
-STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE = 0xC01E033F
-STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY = 0xC01E0340
-STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT = 0xC01E0341
-STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE = 0xC01E0342
-STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN = 0xC01E0343
-STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL = 0xC01E0344
-STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION = 0xC01E0345
-STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED = 0xC01E0346
-STATUS_GRAPHICS_INVALID_GAMMA_RAMP = 0xC01E0347
-STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED = 0xC01E0348
-STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED = 0xC01E0349
-STATUS_GRAPHICS_MODE_NOT_IN_MODESET = 0xC01E034A
-STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON = 0xC01E034D
-STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE = 0xC01E034E
-STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE = 0xC01E034F
-STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS = 0xC01E0350
-STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING = 0xC01E0352
-STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED = 0xC01E0353
-STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS = 0xC01E0354
-STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT = 0xC01E0355
-STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM = 0xC01E0356
-STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN = 0xC01E0357
-STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT = 0xC01E0358
-STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED = 0xC01E0359
-STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION = 0xC01E035A
-STATUS_GRAPHICS_INVALID_CLIENT_TYPE = 0xC01E035B
-STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET = 0xC01E035C
-STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED = 0xC01E0400
-STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED = 0xC01E0401
-STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER = 0xC01E0430
-STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED = 0xC01E0431
-STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED = 0xC01E0432
-STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY = 0xC01E0433
-STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED = 0xC01E0434
-STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON = 0xC01E0435
-STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE = 0xC01E0436
-STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER = 0xC01E0438
-STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED = 0xC01E043B
-STATUS_GRAPHICS_OPM_NOT_SUPPORTED = 0xC01E0500
-STATUS_GRAPHICS_COPP_NOT_SUPPORTED = 0xC01E0501
-STATUS_GRAPHICS_UAB_NOT_SUPPORTED = 0xC01E0502
-STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS = 0xC01E0503
-STATUS_GRAPHICS_OPM_PARAMETER_ARRAY_TOO_SMALL = 0xC01E0504
-STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST = 0xC01E0505
-STATUS_GRAPHICS_PVP_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME = 0xC01E0506
-STATUS_GRAPHICS_PVP_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP = 0xC01E0507
-STATUS_GRAPHICS_PVP_MIRRORING_DEVICES_NOT_SUPPORTED = 0xC01E0508
-STATUS_GRAPHICS_OPM_INVALID_POINTER = 0xC01E050A
-STATUS_GRAPHICS_OPM_INTERNAL_ERROR = 0xC01E050B
-STATUS_GRAPHICS_OPM_INVALID_HANDLE = 0xC01E050C
-STATUS_GRAPHICS_PVP_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE = 0xC01E050D
-STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH = 0xC01E050E
-STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED = 0xC01E050F
-STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED = 0xC01E0510
-STATUS_GRAPHICS_PVP_HFS_FAILED = 0xC01E0511
-STATUS_GRAPHICS_OPM_INVALID_SRM = 0xC01E0512
-STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP = 0xC01E0513
-STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP = 0xC01E0514
-STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA = 0xC01E0515
-STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET = 0xC01E0516
-STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH = 0xC01E0517
-STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE = 0xC01E0518
-STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS = 0xC01E051A
-STATUS_GRAPHICS_OPM_SESSION_TYPE_CHANGE_IN_PROGRESS = 0xC01E051B
-STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS = 0xC01E051C
-STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST = 0xC01E051D
-STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR = 0xC01E051E
-STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS = 0xC01E051F
-STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED = 0xC01E0520
-STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST = 0xC01E0521
-STATUS_GRAPHICS_I2C_NOT_SUPPORTED = 0xC01E0580
-STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST = 0xC01E0581
-STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA = 0xC01E0582
-STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA = 0xC01E0583
-STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED = 0xC01E0584
-STATUS_GRAPHICS_DDCCI_INVALID_DATA = 0xC01E0585
-STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE = 0xC01E0586
-STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING = 0xC01E0587
-STATUS_GRAPHICS_MCA_INTERNAL_ERROR = 0xC01E0588
-STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND = 0xC01E0589
-STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH = 0xC01E058A
-STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM = 0xC01E058B
-STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE = 0xC01E058C
-STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS = 0xC01E058D
-STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED = 0xC01E05E0
-STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME = 0xC01E05E1
-STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP = 0xC01E05E2
-STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED = 0xC01E05E3
-STATUS_GRAPHICS_INVALID_POINTER = 0xC01E05E4
-STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE = 0xC01E05E5
-STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL = 0xC01E05E6
-STATUS_GRAPHICS_INTERNAL_ERROR = 0xC01E05E7
-STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS = 0xC01E05E8
-STATUS_FVE_LOCKED_VOLUME = 0xC0210000
-STATUS_FVE_NOT_ENCRYPTED = 0xC0210001
-STATUS_FVE_BAD_INFORMATION = 0xC0210002
-STATUS_FVE_TOO_SMALL = 0xC0210003
-STATUS_FVE_FAILED_WRONG_FS = 0xC0210004
-STATUS_FVE_FAILED_BAD_FS = 0xC0210005
-STATUS_FVE_FS_NOT_EXTENDED = 0xC0210006
-STATUS_FVE_FS_MOUNTED = 0xC0210007
-STATUS_FVE_NO_LICENSE = 0xC0210008
-STATUS_FVE_ACTION_NOT_ALLOWED = 0xC0210009
-STATUS_FVE_BAD_DATA = 0xC021000A
-STATUS_FVE_VOLUME_NOT_BOUND = 0xC021000B
-STATUS_FVE_NOT_DATA_VOLUME = 0xC021000C
-STATUS_FVE_CONV_READ_ERROR = 0xC021000D
-STATUS_FVE_CONV_WRITE_ERROR = 0xC021000E
-STATUS_FVE_OVERLAPPED_UPDATE = 0xC021000F
-STATUS_FVE_FAILED_SECTOR_SIZE = 0xC0210010
-STATUS_FVE_FAILED_AUTHENTICATION = 0xC0210011
-STATUS_FVE_NOT_OS_VOLUME = 0xC0210012
-STATUS_FVE_KEYFILE_NOT_FOUND = 0xC0210013
-STATUS_FVE_KEYFILE_INVALID = 0xC0210014
-STATUS_FVE_KEYFILE_NO_VMK = 0xC0210015
-STATUS_FVE_TPM_DISABLED = 0xC0210016
-STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO = 0xC0210017
-STATUS_FVE_TPM_INVALID_PCR = 0xC0210018
-STATUS_FVE_TPM_NO_VMK = 0xC0210019
-STATUS_FVE_PIN_INVALID = 0xC021001A
-STATUS_FVE_AUTH_INVALID_APPLICATION = 0xC021001B
-STATUS_FVE_AUTH_INVALID_CONFIG = 0xC021001C
-STATUS_FVE_DEBUGGER_ENABLED = 0xC021001D
-STATUS_FVE_DRY_RUN_FAILED = 0xC021001E
-STATUS_FVE_BAD_METADATA_POINTER = 0xC021001F
-STATUS_FVE_OLD_METADATA_COPY = 0xC0210020
-STATUS_FVE_REBOOT_REQUIRED = 0xC0210021
-STATUS_FVE_RAW_ACCESS = 0xC0210022
-STATUS_FVE_RAW_BLOCKED = 0xC0210023
-STATUS_FVE_NO_FEATURE_LICENSE = 0xC0210026
-STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED = 0xC0210027
-STATUS_FVE_CONV_RECOVERY_FAILED = 0xC0210028
-STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG = 0xC0210029
-STATUS_FVE_VOLUME_TOO_SMALL = 0xC0210030
-STATUS_FWP_CALLOUT_NOT_FOUND = 0xC0220001
-STATUS_FWP_CONDITION_NOT_FOUND = 0xC0220002
-STATUS_FWP_FILTER_NOT_FOUND = 0xC0220003
-STATUS_FWP_LAYER_NOT_FOUND = 0xC0220004
-STATUS_FWP_PROVIDER_NOT_FOUND = 0xC0220005
-STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND = 0xC0220006
-STATUS_FWP_SUBLAYER_NOT_FOUND = 0xC0220007
-STATUS_FWP_NOT_FOUND = 0xC0220008
-STATUS_FWP_ALREADY_EXISTS = 0xC0220009
-STATUS_FWP_IN_USE = 0xC022000A
-STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS = 0xC022000B
-STATUS_FWP_WRONG_SESSION = 0xC022000C
-STATUS_FWP_NO_TXN_IN_PROGRESS = 0xC022000D
-STATUS_FWP_TXN_IN_PROGRESS = 0xC022000E
-STATUS_FWP_TXN_ABORTED = 0xC022000F
-STATUS_FWP_SESSION_ABORTED = 0xC0220010
-STATUS_FWP_INCOMPATIBLE_TXN = 0xC0220011
-STATUS_FWP_TIMEOUT = 0xC0220012
-STATUS_FWP_NET_EVENTS_DISABLED = 0xC0220013
-STATUS_FWP_INCOMPATIBLE_LAYER = 0xC0220014
-STATUS_FWP_KM_CLIENTS_ONLY = 0xC0220015
-STATUS_FWP_LIFETIME_MISMATCH = 0xC0220016
-STATUS_FWP_BUILTIN_OBJECT = 0xC0220017
-STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS = 0xC0220018
-STATUS_FWP_TOO_MANY_CALLOUTS = 0xC0220018
-STATUS_FWP_NOTIFICATION_DROPPED = 0xC0220019
-STATUS_FWP_TRAFFIC_MISMATCH = 0xC022001A
-STATUS_FWP_INCOMPATIBLE_SA_STATE = 0xC022001B
-STATUS_FWP_NULL_POINTER = 0xC022001C
-STATUS_FWP_INVALID_ENUMERATOR = 0xC022001D
-STATUS_FWP_INVALID_FLAGS = 0xC022001E
-STATUS_FWP_INVALID_NET_MASK = 0xC022001F
-STATUS_FWP_INVALID_RANGE = 0xC0220020
-STATUS_FWP_INVALID_INTERVAL = 0xC0220021
-STATUS_FWP_ZERO_LENGTH_ARRAY = 0xC0220022
-STATUS_FWP_NULL_DISPLAY_NAME = 0xC0220023
-STATUS_FWP_INVALID_ACTION_TYPE = 0xC0220024
-STATUS_FWP_INVALID_WEIGHT = 0xC0220025
-STATUS_FWP_MATCH_TYPE_MISMATCH = 0xC0220026
-STATUS_FWP_TYPE_MISMATCH = 0xC0220027
-STATUS_FWP_OUT_OF_BOUNDS = 0xC0220028
-STATUS_FWP_RESERVED = 0xC0220029
-STATUS_FWP_DUPLICATE_CONDITION = 0xC022002A
-STATUS_FWP_DUPLICATE_KEYMOD = 0xC022002B
-STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER = 0xC022002C
-STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER = 0xC022002D
-STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER = 0xC022002E
-STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT = 0xC022002F
-STATUS_FWP_INCOMPATIBLE_AUTH_METHOD = 0xC0220030
-STATUS_FWP_INCOMPATIBLE_DH_GROUP = 0xC0220031
-STATUS_FWP_EM_NOT_SUPPORTED = 0xC0220032
-STATUS_FWP_NEVER_MATCH = 0xC0220033
-STATUS_FWP_PROVIDER_CONTEXT_MISMATCH = 0xC0220034
-STATUS_FWP_INVALID_PARAMETER = 0xC0220035
-STATUS_FWP_TOO_MANY_SUBLAYERS = 0xC0220036
-STATUS_FWP_CALLOUT_NOTIFICATION_FAILED = 0xC0220037
-STATUS_FWP_INCOMPATIBLE_AUTH_CONFIG = 0xC0220038
-STATUS_FWP_INCOMPATIBLE_CIPHER_CONFIG = 0xC0220039
-STATUS_FWP_DUPLICATE_AUTH_METHOD = 0xC022003C
-STATUS_FWP_TCPIP_NOT_READY = 0xC0220100
-STATUS_FWP_INJECT_HANDLE_CLOSING = 0xC0220101
-STATUS_FWP_INJECT_HANDLE_STALE = 0xC0220102
-STATUS_FWP_CANNOT_PEND = 0xC0220103
-STATUS_NDIS_CLOSING = 0xC0230002
-STATUS_NDIS_BAD_VERSION = 0xC0230004
-STATUS_NDIS_BAD_CHARACTERISTICS = 0xC0230005
-STATUS_NDIS_ADAPTER_NOT_FOUND = 0xC0230006
-STATUS_NDIS_OPEN_FAILED = 0xC0230007
-STATUS_NDIS_DEVICE_FAILED = 0xC0230008
-STATUS_NDIS_MULTICAST_FULL = 0xC0230009
-STATUS_NDIS_MULTICAST_EXISTS = 0xC023000A
-STATUS_NDIS_MULTICAST_NOT_FOUND = 0xC023000B
-STATUS_NDIS_REQUEST_ABORTED = 0xC023000C
-STATUS_NDIS_RESET_IN_PROGRESS = 0xC023000D
-STATUS_NDIS_INVALID_PACKET = 0xC023000F
-STATUS_NDIS_INVALID_DEVICE_REQUEST = 0xC0230010
-STATUS_NDIS_ADAPTER_NOT_READY = 0xC0230011
-STATUS_NDIS_INVALID_LENGTH = 0xC0230014
-STATUS_NDIS_INVALID_DATA = 0xC0230015
-STATUS_NDIS_BUFFER_TOO_SHORT = 0xC0230016
-STATUS_NDIS_INVALID_OID = 0xC0230017
-STATUS_NDIS_ADAPTER_REMOVED = 0xC0230018
-STATUS_NDIS_UNSUPPORTED_MEDIA = 0xC0230019
-STATUS_NDIS_GROUP_ADDRESS_IN_USE = 0xC023001A
-STATUS_NDIS_FILE_NOT_FOUND = 0xC023001B
-STATUS_NDIS_ERROR_READING_FILE = 0xC023001C
-STATUS_NDIS_ALREADY_MAPPED = 0xC023001D
-STATUS_NDIS_RESOURCE_CONFLICT = 0xC023001E
-STATUS_NDIS_MEDIA_DISCONNECTED = 0xC023001F
-STATUS_NDIS_INVALID_ADDRESS = 0xC0230022
-STATUS_NDIS_PAUSED = 0xC023002A
-STATUS_NDIS_INTERFACE_NOT_FOUND = 0xC023002B
-STATUS_NDIS_UNSUPPORTED_REVISION = 0xC023002C
-STATUS_NDIS_INVALID_PORT = 0xC023002D
-STATUS_NDIS_INVALID_PORT_STATE = 0xC023002E
-STATUS_NDIS_LOW_POWER_STATE = 0xC023002F
-STATUS_NDIS_NOT_SUPPORTED = 0xC02300BB
-STATUS_NDIS_OFFLOAD_POLICY = 0xC023100F
-STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED = 0xC0231012
-STATUS_NDIS_OFFLOAD_PATH_REJECTED = 0xC0231013
-STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED = 0xC0232000
-STATUS_NDIS_DOT11_MEDIA_IN_USE = 0xC0232001
-STATUS_NDIS_DOT11_POWER_STATE_INVALID = 0xC0232002
-STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL = 0xC0232003
-STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL = 0xC0232004
-STATUS_IPSEC_BAD_SPI = 0xC0360001
-STATUS_IPSEC_SA_LIFETIME_EXPIRED = 0xC0360002
-STATUS_IPSEC_WRONG_SA = 0xC0360003
-STATUS_IPSEC_REPLAY_CHECK_FAILED = 0xC0360004
-STATUS_IPSEC_INVALID_PACKET = 0xC0360005
-STATUS_IPSEC_INTEGRITY_CHECK_FAILED = 0xC0360006
-STATUS_IPSEC_CLEAR_TEXT_DROP = 0xC0360007
-STATUS_IPSEC_AUTH_FIREWALL_DROP = 0xC0360008
-STATUS_IPSEC_THROTTLE_DROP = 0xC0360009
-STATUS_IPSEC_DOSP_BLOCK = 0xC0368000
-STATUS_IPSEC_DOSP_RECEIVED_MULTICAST = 0xC0368001
-STATUS_IPSEC_DOSP_INVALID_PACKET = 0xC0368002
-STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED = 0xC0368003
-STATUS_IPSEC_DOSP_MAX_ENTRIES = 0xC0368004
-STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED = 0xC0368005
-STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES = 0xC0368006
-STATUS_VOLMGR_MIRROR_NOT_SUPPORTED = 0xC038005B
-STATUS_VOLMGR_RAID5_NOT_SUPPORTED = 0xC038005C
-STATUS_VIRTDISK_PROVIDER_NOT_FOUND = 0xC03A0014
-STATUS_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015
-STATUS_VHD_PARENT_VHD_ACCESS_DENIED = 0xC03A0016
-STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH = 0xC03A0017
-STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED = 0xC03A0018
-STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT = 0xC03A0019
diff --git a/tests/python_dependencies/impacket/ntlm.py b/tests/python_dependencies/impacket/ntlm.py
deleted file mode 100644
index 8845e9d50..000000000
--- a/tests/python_dependencies/impacket/ntlm.py
+++ /dev/null
@@ -1,973 +0,0 @@
-from __future__ import print_function
-# Copyright (c) 2003-2016 CORE Security Technologies:
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-import base64
-import struct
-import calendar
-import time
-import hashlib
-import random
-import string
-import binascii
-
-from impacket.structure import Structure
-from impacket import LOG
-
-
-# This is important. NTLMv2 is not negotiated by the client or server.
-# It is used if set locally on both sides. Change this item if you don't want to use
-# NTLMv2 by default and fall back to NTLMv1 (with EXTENDED_SESSION_SECURITY or not)
-# Check the following links:
-# http://davenport.sourceforge.net/ntlm.html
-# http://blogs.msdn.com/b/openspecification/archive/2010/04/20/ntlm-keys-and-sundry-stuff.aspx
-# http://social.msdn.microsoft.com/Forums/en-US/os_interopscenarios/thread/c8f488ed-1b96-4e06-bd65-390aa41138d1/
-# So I'm setting a global variable to control this, this can also be set programmatically
-
-USE_NTLMv2 = True # if false will fall back to NTLMv1 (or NTLMv1 with ESS a.k.a NTLM2)
-
-
-def computeResponse(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash='', nthash='',
- use_ntlmv2=USE_NTLMv2):
- if use_ntlmv2:
- return computeResponseNTLMv2(flags, serverChallenge, clientChallenge, serverName, domain, user, password,
- lmhash, nthash, use_ntlmv2=use_ntlmv2)
- else:
- return computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, domain, user, password,
- lmhash, nthash, use_ntlmv2=use_ntlmv2)
-try:
- POW = None
- from Crypto.Cipher import ARC4
- from Crypto.Cipher import DES
- from Crypto.Hash import MD4
-except Exception:
- try:
- import POW
- except Exception:
- LOG.critical("Warning: You don't have any crypto installed. You need PyCrypto")
- LOG.critical("See http://www.pycrypto.org/")
-
-NTLM_AUTH_NONE = 1
-NTLM_AUTH_CONNECT = 2
-NTLM_AUTH_CALL = 3
-NTLM_AUTH_PKT = 4
-NTLM_AUTH_PKT_INTEGRITY = 5
-NTLM_AUTH_PKT_PRIVACY = 6
-
-# If set, requests 56-bit encryption. If the client sends NTLMSSP_NEGOTIATE_SEAL or NTLMSSP_NEGOTIATE_SIGN
-# with NTLMSSP_NEGOTIATE_56 to the server in the NEGOTIATE_MESSAGE, the server MUST return NTLMSSP_NEGOTIATE_56 to
-# the client in the CHALLENGE_MESSAGE. Otherwise it is ignored. If both NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128
-# are requested and supported by the client and server, NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128 will both be
-# returned to the client. Clients and servers that set NTLMSSP_NEGOTIATE_SEAL SHOULD set NTLMSSP_NEGOTIATE_56 if it is
-# supported. An alternate name for this field is NTLMSSP_NEGOTIATE_56.
-NTLMSSP_NEGOTIATE_56 = 0x80000000
-
-# If set, requests an explicit key exchange. This capability SHOULD be used because it improves security for message
-# integrity or confidentiality. See sections 3.2.5.1.2, 3.2.5.2.1, and 3.2.5.2.2 for details. An alternate name for
-# this field is NTLMSSP_NEGOTIATE_KEY_EXCH.
-NTLMSSP_NEGOTIATE_KEY_EXCH = 0x40000000
-
-# If set, requests 128-bit session key negotiation. An alternate name for this field is NTLMSSP_NEGOTIATE_128.
-# If the client sends NTLMSSP_NEGOTIATE_128 to the server in the NEGOTIATE_MESSAGE, the server MUST return
-# NTLMSSP_NEGOTIATE_128 to the client in the CHALLENGE_MESSAGE only if the client sets NTLMSSP_NEGOTIATE_SEAL or
-# NTLMSSP_NEGOTIATE_SIGN. Otherwise it is ignored. If both NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128 are
-# requested and supported by the client and server, NTLMSSP_NEGOTIATE_56 and NTLMSSP_NEGOTIATE_128 will both be
-# returned to the client. Clients and servers that set NTLMSSP_NEGOTIATE_SEAL SHOULD set NTLMSSP_NEGOTIATE_128 if it
-# is supported. An alternate name for this field is NTLMSSP_NEGOTIATE_128
-NTLMSSP_NEGOTIATE_128 = 0x20000000
-
-NTLMSSP_RESERVED_1 = 0x10000000
-NTLMSSP_RESERVED_2 = 0x08000000
-NTLMSSP_RESERVED_3 = 0x04000000
-
-# If set, requests the protocol version number. The data corresponding to this flag is provided in the Version field
-# of the NEGOTIATE_MESSAGE, the CHALLENGE_MESSAGE, and the AUTHENTICATE_MESSAGE.<22> An alternate name for this field
-# is NTLMSSP_NEGOTIATE_VERSION
-NTLMSSP_NEGOTIATE_VERSION = 0x02000000
-NTLMSSP_RESERVED_4 = 0x01000000
-
-# If set, indicates that the TargetInfo fields in the CHALLENGE_MESSAGE (section 2.2.1.2) are populated.
-# An alternate name for this field is NTLMSSP_NEGOTIATE_TARGET_INFO.
-NTLMSSP_NEGOTIATE_TARGET_INFO = 0x00800000
-
-# If set, requests the usage of the LMOWF (section 3.3). An alternate name for this field is
-# NTLMSSP_REQUEST_NON_NT_SESSION_KEY.
-NTLMSSP_REQUEST_NON_NT_SESSION_KEY = 0x00400000
-NTLMSSP_RESERVED_5 = 0x00200000
-
-# If set, requests an identify level token. An alternate name for this field is NTLMSSP_NEGOTIATE_IDENTIFY
-NTLMSSP_NEGOTIATE_IDENTIFY = 0x00100000
-
-# If set, requests usage of the NTLM v2 session security. NTLM v2 session security is a misnomer because it is not
-# NTLM v2. It is NTLM v1 using the extended session security that is also in NTLM v2. NTLMSSP_NEGOTIATE_LM_KEY and
-# NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are mutually exclusive. If both NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
-# and NTLMSSP_NEGOTIATE_LM_KEY are requested, NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY alone MUST be returned to the
-# client. NTLM v2 authentication session key generation MUST be supported by both the client and the DC in order to be
-# used, and extended session security signing and sealing requires support from the client and the server in order to
-# be used.<23> An alternate name for this field is NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
-NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY = 0x00080000
-NTLMSSP_NEGOTIATE_NTLM2 = 0x00080000
-NTLMSSP_TARGET_TYPE_SHARE = 0x00040000
-
-# If set, TargetName MUST be a server name. The data corresponding to this flag is provided by the server in the
-# TargetName field of the CHALLENGE_MESSAGE. If this bit is set, then NTLMSSP_TARGET_TYPE_DOMAIN MUST NOT be set.
-# This flag MUST be ignored in the NEGOTIATE_MESSAGE and the AUTHENTICATE_MESSAGE. An alternate name for this field
-# is NTLMSSP_TARGET_TYPE_SERVER
-NTLMSSP_TARGET_TYPE_SERVER = 0x00020000
-
-# If set, TargetName MUST be a domain name. The data corresponding to this flag is provided by the server in the
-# TargetName field of the CHALLENGE_MESSAGE. If set, then NTLMSSP_TARGET_TYPE_SERVER MUST NOT be set. This flag MUST
-# be ignored in the NEGOTIATE_MESSAGE and the AUTHENTICATE_MESSAGE. An alternate name for this field is
-# NTLMSSP_TARGET_TYPE_DOMAIN.
-NTLMSSP_TARGET_TYPE_DOMAIN = 0x00010000
-
-# If set, requests the presence of a signature block on all messages. NTLMSSP_NEGOTIATE_ALWAYS_SIGN MUST be set in the
-# NEGOTIATE_MESSAGE to the server and the CHALLENGE_MESSAGE to the client. NTLMSSP_NEGOTIATE_ALWAYS_SIGN is overridden
-# by NTLMSSP_NEGOTIATE_SIGN and NTLMSSP_NEGOTIATE_SEAL, if they are supported. An alternate name for this field is
-# NTLMSSP_NEGOTIATE_ALWAYS_SIGN.
-NTLMSSP_NEGOTIATE_ALWAYS_SIGN = 0x00008000 # forces the other end to sign packets
-NTLMSSP_RESERVED_6 = 0x00004000
-
-# This flag indicates whether the Workstation field is present. If this flag is not set, the Workstation field MUST be
-# ignored. If this flag is set, the length field of the Workstation field specifies whether the workstation name is
-# nonempty or not.<24> An alternate name for this field is NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED.
-NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED = 0x00002000
-
-# If set, the domain name is provided (section 2.2.1.1).<25> An alternate name for this field is
-# NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
-NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED = 0x00001000
-NTLMSSP_RESERVED_7 = 0x00000800
-
-
-# If set, LM authentication is not allowed and only NT authentication is used.
-NTLMSSP_NEGOTIATE_NT_ONLY = 0x00000400
-
-# If set, requests usage of the NTLM v1 session security protocol. NTLMSSP_NEGOTIATE_NTLM MUST be set in the
-# NEGOTIATE_MESSAGE to the server and the CHALLENGE_MESSAGE to the client. An alternate name for this field is
-# NTLMSSP_NEGOTIATE_NTLM
-NTLMSSP_NEGOTIATE_NTLM = 0x00000200
-NTLMSSP_RESERVED_8 = 0x00000100
-
-# If set, requests LAN Manager (LM) session key computation. NTLMSSP_NEGOTIATE_LM_KEY and
-# NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are mutually exclusive. If both NTLMSSP_NEGOTIATE_LM_KEY and
-# NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY are requested, NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY alone MUST be
-# returned to the client. NTLM v2 authentication session key generation MUST be supported by both the client and the
-# DC in order to be used, and extended session security signing and sealing requires support from the client and the
-# server to be used. An alternate name for this field is NTLMSSP_NEGOTIATE_LM_KEY.
-NTLMSSP_NEGOTIATE_LM_KEY = 0x00000080
-
-# If set, requests connectionless authentication. If NTLMSSP_NEGOTIATE_DATAGRAM is set, then NTLMSSP_NEGOTIATE_KEY_EXCH
-# MUST always be set in the AUTHENTICATE_MESSAGE to the server and the CHALLENGE_MESSAGE to the client. An alternate
-# name for this field is NTLMSSP_NEGOTIATE_DATAGRAM.
-NTLMSSP_NEGOTIATE_DATAGRAM = 0x00000040
-
-# If set, requests session key negotiation for message confidentiality. If the client sends NTLMSSP_NEGOTIATE_SEAL to
-# the server in the NEGOTIATE_MESSAGE, the server MUST return NTLMSSP_NEGOTIATE_SEAL to the client in the
-# CHALLENGE_MESSAGE. Clients and servers that set NTLMSSP_NEGOTIATE_SEAL SHOULD always set NTLMSSP_NEGOTIATE_56 and
-# NTLMSSP_NEGOTIATE_128, if they are supported. An alternate name for this field is NTLMSSP_NEGOTIATE_SEAL.
-NTLMSSP_NEGOTIATE_SEAL = 0x00000020
-
-# If set, requests session key negotiation for message signatures. If the client sends NTLMSSP_NEGOTIATE_SIGN to the
-# server in the NEGOTIATE_MESSAGE, the server MUST return NTLMSSP_NEGOTIATE_SIGN to the client in the CHALLENGE_MESSAGE.
-# An alternate name for this field is NTLMSSP_NEGOTIATE_SIGN.
-NTLMSSP_NEGOTIATE_SIGN = 0x00000010 # means packet is signed, if verifier is wrong it fails
-NTLMSSP_RESERVED_9 = 0x00000008
-
-# If set, a TargetName field of the CHALLENGE_MESSAGE (section 2.2.1.2) MUST be supplied. An alternate name for this
-# field is NTLMSSP_REQUEST_TARGET.
-NTLMSSP_REQUEST_TARGET = 0x00000004
-
-# If set, requests OEM character set encoding. An alternate name for this field is NTLM_NEGOTIATE_OEM. See bit A for
-# details.
-NTLM_NEGOTIATE_OEM = 0x00000002
-
-# If set, requests Unicode character set encoding. An alternate name for this field is NTLMSSP_NEGOTIATE_UNICODE.
-NTLMSSP_NEGOTIATE_UNICODE = 0x00000001
-
-# AV_PAIR constants
-NTLMSSP_AV_EOL = 0x00
-NTLMSSP_AV_HOSTNAME = 0x01
-NTLMSSP_AV_DOMAINNAME = 0x02
-NTLMSSP_AV_DNS_HOSTNAME = 0x03
-NTLMSSP_AV_DNS_DOMAINNAME = 0x04
-NTLMSSP_AV_DNS_TREENAME = 0x05
-NTLMSSP_AV_FLAGS = 0x06
-NTLMSSP_AV_TIME = 0x07
-NTLMSSP_AV_RESTRICTIONS = 0x08
-NTLMSSP_AV_TARGET_NAME = 0x09
-NTLMSSP_AV_CHANNEL_BINDINGS = 0x0a
-
-class AV_PAIRS():
- def __init__(self, data = None):
- self.fields = {}
- if data is not None:
- self.fromString(data)
-
- def __setitem__(self,key,value):
- self.fields[key] = (len(value),value)
-
- def __getitem__(self, key):
- if key in self.fields:
- return self.fields[key]
- return None
-
- def __delitem__(self, key):
- del self.fields[key]
-
- def __len__(self):
- return len(self.getData())
-
- def __str__(self):
- return len(self.getData())
-
- def fromString(self, data):
- tInfo = data
- fType = 0xff
- while fType is not NTLMSSP_AV_EOL:
- fType = struct.unpack('<H',tInfo[:struct.calcsize('<H')])[0]
- tInfo = tInfo[struct.calcsize('<H'):]
- length = struct.unpack('<H',tInfo[:struct.calcsize('<H')])[0]
- tInfo = tInfo[struct.calcsize('<H'):]
- content = tInfo[:length]
- self.fields[fType]=(length,content)
- tInfo = tInfo[length:]
-
- def dump(self):
- for i in self.fields.keys():
- print("%s: {%r}" % (i,self[i]))
-
- def getData(self):
- if NTLMSSP_AV_EOL in self.fields:
- del self.fields[NTLMSSP_AV_EOL]
- ans = ''
- for i in self.fields.keys():
- ans+= struct.pack('<HH', i, self[i][0])
- ans+= self[i][1]
-
- # end with a NTLMSSP_AV_EOL
- ans += struct.pack('<HH', NTLMSSP_AV_EOL, 0)
-
- return ans
-
-class NTLMAuthMixin:
- def get_os_version(self):
- if self['os_version'] == '':
- return None
- else:
- mayor_v = struct.unpack('B',self['os_version'][0])[0]
- minor_v = struct.unpack('B',self['os_version'][1])[0]
- build_v = struct.unpack('H',self['os_version'][2:4])
- return (mayor_v,minor_v,build_v)
-
-class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
-
- structure = (
- ('','"NTLMSSP\x00'),
- ('message_type','<L=1'),
- ('flags','<L'),
- ('domain_len','<H-domain_name'),
- ('domain_max_len','<H-domain_name'),
- ('domain_offset','<L=0'),
- ('host_len','<H-host_name'),
- ('host_maxlen','<H-host_name'),
- ('host_offset','<L=0'),
- ('os_version',':'),
- ('host_name',':'),
- ('domain_name',':'))
-
- def __init__(self):
- Structure.__init__(self)
- self['flags']= (
- NTLMSSP_NEGOTIATE_128 |
- NTLMSSP_NEGOTIATE_KEY_EXCH|
- # NTLMSSP_LM_KEY |
- NTLMSSP_NEGOTIATE_NTLM |
- NTLMSSP_NEGOTIATE_UNICODE |
- # NTLMSSP_ALWAYS_SIGN |
- NTLMSSP_NEGOTIATE_SIGN |
- NTLMSSP_NEGOTIATE_SEAL |
- # NTLMSSP_TARGET |
- 0)
- self['host_name']=''
- self['domain_name']=''
- self['os_version']=''
-
- def getData(self):
- if len(self.fields['host_name']) > 0:
- self['flags'] |= NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
- if len(self.fields['domain_name']) > 0:
- self['flags'] |= NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
- if len(self.fields['os_version']) > 0:
- self['flags'] |= NTLMSSP_NEGOTIATE_VERSION
- if (self['flags'] & NTLMSSP_NEGOTIATE_VERSION) == NTLMSSP_NEGOTIATE_VERSION:
- version_len = 8
- else:
- version_len = 0
- if (self['flags'] & NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED) == NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED:
- self['host_offset']=32 + version_len
- if (self['flags'] & NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED) == NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED:
- self['domain_offset']=32+len(self['host_name']) + version_len
- return Structure.getData(self)
-
- def fromString(self,data):
- Structure.fromString(self,data)
-
- domain_offset = self['domain_offset']
- domain_end = self['domain_len'] + domain_offset
- self['domain_name'] = data[ domain_offset : domain_end ]
-
- host_offset = self['host_offset']
- host_end = self['host_len'] + host_offset
- self['host_name'] = data[ host_offset : host_end ]
-
- hasOsInfo = self['flags'] & NTLMSSP_NEGOTIATE_VERSION
- if len(data) >= 36 and hasOsInfo:
- self['os_version'] = data[32:40]
- else:
- self['os_version'] = ''
-
-class NTLMAuthChallenge(Structure):
-
- structure = (
- ('','"NTLMSSP\x00'),
- ('message_type','<L=2'),
- ('domain_len','<H-domain_name'),
- ('domain_max_len','<H-domain_name'),
- ('domain_offset','<L=40'),
- ('flags','<L=0'),
- ('challenge','8s'),
- ('reserved','8s=""'),
- ('TargetInfoFields_len','<H-TargetInfoFields'),
- ('TargetInfoFields_max_len','<H-TargetInfoFields'),
- ('TargetInfoFields_offset','<L'),
- ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
- ('Version',':'),
- ('domain_name',':'),
- ('TargetInfoFields',':'))
-
- def checkVersion(self, flags):
- if flags is not None:
- if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
- return 0
- return 8
-
- def getData(self):
- if self['TargetInfoFields'] is not None and type(self['TargetInfoFields']) is not str:
- raw_av_fields = self['TargetInfoFields'].getData()
- self['TargetInfoFields'] = raw_av_fields
- return Structure.getData(self)
-
- def fromString(self,data):
- Structure.fromString(self,data)
- # Just in case there's more data after the TargetInfoFields
- self['TargetInfoFields'] = self['TargetInfoFields'][:self['TargetInfoFields_len']]
- # We gotta process the TargetInfoFields
- #if self['TargetInfoFields_len'] > 0:
- # av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']])
- # self['TargetInfoFields'] = av_pairs
-
- return self
-
-class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
-
- structure = (
- ('','"NTLMSSP\x00'),
- ('message_type','<L=3'),
- ('lanman_len','<H-lanman'),
- ('lanman_max_len','<H-lanman'),
- ('lanman_offset','<L'),
- ('ntlm_len','<H-ntlm'),
- ('ntlm_max_len','<H-ntlm'),
- ('ntlm_offset','<L'),
- ('domain_len','<H-domain_name'),
- ('domain_max_len','<H-domain_name'),
- ('domain_offset','<L'),
- ('user_len','<H-user_name'),
- ('user_max_len','<H-user_name'),
- ('user_offset','<L'),
- ('host_len','<H-host_name'),
- ('host_max_len','<H-host_name'),
- ('host_offset','<L'),
- ('session_key_len','<H-session_key'),
- ('session_key_max_len','<H-session_key'),
- ('session_key_offset','<L'),
- ('flags','<L'),
- ('VersionLen','_-Version','self.checkVersion(self["flags"])'),
- ('Version',':=""'),
- ('MICLen','_-MIC','self.checkMIC(self["flags"])'),
- ('MIC',':=""'),
- ('domain_name',':'),
- ('user_name',':'),
- ('host_name',':'),
- ('lanman',':'),
- ('ntlm',':'),
- ('session_key',':'))
-
- def __init__(self, username = '', password = '', challenge = '', lmhash = '', nthash = '', flags = 0):
- Structure.__init__(self)
- self['session_key']=''
- self['user_name']=username.encode('utf-16le')
- self['domain_name']='' #"CLON".encode('utf-16le')
- self['host_name']='' #"BETS".encode('utf-16le')
- self['flags'] = ( #authResp['flags']
- # we think (beto & gera) that his flags force a memory conten leakage when a windows 2000 answers using uninitializaed verifiers
- NTLMSSP_NEGOTIATE_128 |
- NTLMSSP_NEGOTIATE_KEY_EXCH|
- # NTLMSSP_LM_KEY |
- NTLMSSP_NEGOTIATE_NTLM |
- NTLMSSP_NEGOTIATE_UNICODE |
- # NTLMSSP_ALWAYS_SIGN |
- NTLMSSP_NEGOTIATE_SIGN |
- NTLMSSP_NEGOTIATE_SEAL |
- # NTLMSSP_TARGET |
- 0)
- # Here we do the stuff
- if username and ( lmhash != '' or nthash != ''):
- self['lanman'] = get_ntlmv1_response(lmhash, challenge)
- self['ntlm'] = get_ntlmv1_response(nthash, challenge)
- elif (username and password):
- lmhash = compute_lmhash(password)
- nthash = compute_nthash(password)
- self['lanman']=get_ntlmv1_response(lmhash, challenge)
- self['ntlm']=get_ntlmv1_response(nthash, challenge) # This is not used for LM_KEY nor NTLM_KEY
- else:
- self['lanman'] = ''
- self['ntlm'] = ''
- if not self['host_name']:
- self['host_name'] = 'NULL'.encode('utf-16le') # for NULL session there must be a hostname
-
- def checkVersion(self, flags):
- if flags is not None:
- if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
- return 0
- return 8
-
- def checkMIC(self, flags):
- # TODO: Find a proper way to check the MIC is in there
- if flags is not None:
- if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
- return 0
- return 16
-
- def getData(self):
- self['domain_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])
- self['user_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])+len(self['domain_name'])
- self['host_offset']=self['user_offset']+len(self['user_name'])
- self['lanman_offset']=self['host_offset']+len(self['host_name'])
- self['ntlm_offset']=self['lanman_offset']+len(self['lanman'])
- self['session_key_offset']=self['ntlm_offset']+len(self['ntlm'])
- return Structure.getData(self)
-
- def fromString(self,data):
- Structure.fromString(self,data)
- # [MS-NLMP] page 27
- # Payload data can be present in any order within the Payload field,
- # with variable-length padding before or after the data
-
- domain_offset = self['domain_offset']
- domain_end = self['domain_len'] + domain_offset
- self['domain_name'] = data[ domain_offset : domain_end ]
-
- host_offset = self['host_offset']
- host_end = self['host_len'] + host_offset
- self['host_name'] = data[ host_offset: host_end ]
-
- user_offset = self['user_offset']
- user_end = self['user_len'] + user_offset
- self['user_name'] = data[ user_offset: user_end ]
-
- ntlm_offset = self['ntlm_offset']
- ntlm_end = self['ntlm_len'] + ntlm_offset
- self['ntlm'] = data[ ntlm_offset : ntlm_end ]
-
- lanman_offset = self['lanman_offset']
- lanman_end = self['lanman_len'] + lanman_offset
- self['lanman'] = data[ lanman_offset : lanman_end]
-
- #if len(data) >= 36:
- # self['os_version'] = data[32:36]
- #else:
- # self['os_version'] = ''
-
-class ImpacketStructure(Structure):
- def set_parent(self, other):
- self.parent = other
-
- def get_packet(self):
- return str(self)
-
- def get_size(self):
- return len(self)
-
-class ExtendedOrNotMessageSignature(Structure):
- def __init__(self, flags = 0, **kargs):
- if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- self.structure = self.extendedMessageSignature
- else:
- self.structure = self.MessageSignature
- return Structure.__init__(self, **kargs)
-
-class NTLMMessageSignature(ExtendedOrNotMessageSignature):
- extendedMessageSignature = (
- ('Version','<L=1'),
- ('Checksum','<q'),
- ('SeqNum','<i'),
- )
-
- MessageSignature = (
- ('Version','<L=1'),
- ('RandomPad','<i=0'),
- ('Checksum','<i'),
- ('SeqNum','<i'),
- )
-
-KNOWN_DES_INPUT = "KGS!@#$%"
-
-def __expand_DES_key( key):
- # Expand the key from a 7-byte password key into a 8-byte DES key
- key = key[:7]
- key += '\x00'*(7-len(key))
- s = chr(((ord(key[0]) >> 1) & 0x7f) << 1)
- s = s + chr(((ord(key[0]) & 0x01) << 6 | ((ord(key[1]) >> 2) & 0x3f)) << 1)
- s = s + chr(((ord(key[1]) & 0x03) << 5 | ((ord(key[2]) >> 3) & 0x1f)) << 1)
- s = s + chr(((ord(key[2]) & 0x07) << 4 | ((ord(key[3]) >> 4) & 0x0f)) << 1)
- s = s + chr(((ord(key[3]) & 0x0f) << 3 | ((ord(key[4]) >> 5) & 0x07)) << 1)
- s = s + chr(((ord(key[4]) & 0x1f) << 2 | ((ord(key[5]) >> 6) & 0x03)) << 1)
- s = s + chr(((ord(key[5]) & 0x3f) << 1 | ((ord(key[6]) >> 7) & 0x01)) << 1)
- s = s + chr((ord(key[6]) & 0x7f) << 1)
- return s
-
-def __DES_block(key, msg):
- if POW:
- cipher = POW.Symmetric(POW.DES_ECB)
- cipher.encryptInit(__expand_DES_key(key))
- return cipher.update(msg)
- else:
- cipher = DES.new(__expand_DES_key(key),DES.MODE_ECB)
- return cipher.encrypt(msg)
-
-def ntlmssp_DES_encrypt(key, challenge):
- answer = __DES_block(key[:7], challenge)
- answer += __DES_block(key[7:14], challenge)
- answer += __DES_block(key[14:], challenge)
- return answer
-
-# High level functions to use NTLMSSP
-
-def getNTLMSSPType1(workstation='', domain='', signingRequired = False, use_ntlmv2 = USE_NTLMv2):
- # Let's do some encoding checks before moving on. Kind of dirty, but found effective when dealing with
- # international characters.
- import sys
- encoding = sys.getfilesystemencoding()
- if encoding is not None:
- try:
- workstation.encode('utf-16le')
- except:
- workstation = workstation.decode(encoding)
- try:
- domain.encode('utf-16le')
- except:
- domain = domain.decode(encoding)
-
- # Let's prepare a Type 1 NTLMSSP Message
- auth = NTLMAuthNegotiate()
- auth['flags']=0
- if signingRequired:
- auth['flags'] = NTLMSSP_NEGOTIATE_KEY_EXCH | NTLMSSP_NEGOTIATE_SIGN | NTLMSSP_NEGOTIATE_ALWAYS_SIGN | NTLMSSP_NEGOTIATE_SEAL
- if use_ntlmv2:
- auth['flags'] |= NTLMSSP_NEGOTIATE_TARGET_INFO
- auth['flags'] |= NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY | NTLMSSP_NEGOTIATE_UNICODE | NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_56
- auth['domain_name'] = domain.encode('utf-16le')
- return auth
-
-def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash = '', use_ntlmv2 = USE_NTLMv2):
-
- # Let's do some encoding checks before moving on. Kind of dirty, but found effective when dealing with
- # international characters.
- import sys
- encoding = sys.getfilesystemencoding()
- if encoding is not None:
- try:
- user.encode('utf-16le')
- except:
- user = user.decode(encoding)
- try:
- password.encode('utf-16le')
- except:
- password = password.decode(encoding)
- try:
- domain.encode('utf-16le')
- except:
- domain = user.decode(encoding)
-
- ntlmChallenge = NTLMAuthChallenge(type2)
-
- # Let's start with the original flags sent in the type1 message
- responseFlags = type1['flags']
-
- # Token received and parsed. Depending on the authentication
- # method we will create a valid ChallengeResponse
- ntlmChallengeResponse = NTLMAuthChallengeResponse(user, password, ntlmChallenge['challenge'])
-
- clientChallenge = "".join([random.choice(string.digits+string.letters) for i in range(8)])
-
- serverName = ntlmChallenge['TargetInfoFields']
-
- ntResponse, lmResponse, sessionBaseKey = computeResponse(ntlmChallenge['flags'], ntlmChallenge['challenge'], clientChallenge, serverName, domain, user, password, lmhash, nthash, use_ntlmv2 )
-
- # Let's check the return flags
- if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY) == 0:
- # No extended session security, taking it out
- responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
- if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_128 ) == 0:
- # No support for 128 key len, taking it out
- responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_128
- if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_KEY_EXCH) == 0:
- # No key exchange supported, taking it out
- responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_KEY_EXCH
- if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_SEAL) == 0:
- # No sign available, taking it out
- responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_SEAL
- if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_SIGN) == 0:
- # No sign available, taking it out
- responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_SIGN
- if (ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_ALWAYS_SIGN) == 0:
- # No sign available, taking it out
- responseFlags &= 0xffffffff ^ NTLMSSP_NEGOTIATE_ALWAYS_SIGN
-
- keyExchangeKey = KXKEY(ntlmChallenge['flags'],sessionBaseKey, lmResponse, ntlmChallenge['challenge'], password, lmhash, nthash,use_ntlmv2)
-
- # Special case for anonymous login
- if user == '' and password == '' and lmhash == '' and nthash == '':
- keyExchangeKey = '\x00'*16
-
- # If we set up key exchange, let's fill the right variables
- if ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_KEY_EXCH:
- # not exactly what I call random tho :\
- # exportedSessionKey = this is the key we should use to sign
- exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in range(16)])
- #exportedSessionKey = "A"*16
- #print "keyExchangeKey %r" % keyExchangeKey
- # Let's generate the right session key based on the challenge flags
- #if responseFlags & NTLMSSP_NTLM2_KEY:
- # Extended session security enabled
- # if responseFlags & NTLMSSP_KEY_128:
- # Full key
- # exportedSessionKey = exportedSessionKey
- # elif responseFlags & NTLMSSP_KEY_56:
- # Only 56-bit key
- # exportedSessionKey = exportedSessionKey[:7]
- # else:
- # exportedSessionKey = exportedSessionKey[:5]
- #elif responseFlags & NTLMSSP_KEY_56:
- # No extended session security, just 56 bits key
- # exportedSessionKey = exportedSessionKey[:7] + '\xa0'
- #else:
- # exportedSessionKey = exportedSessionKey[:5] + '\xe5\x38\xb0'
-
- encryptedRandomSessionKey = generateEncryptedSessionKey(keyExchangeKey, exportedSessionKey)
- else:
- encryptedRandomSessionKey = None
- # [MS-NLMP] page 46
- exportedSessionKey = keyExchangeKey
-
- ntlmChallengeResponse['flags'] = responseFlags
- ntlmChallengeResponse['domain_name'] = domain.encode('utf-16le')
- ntlmChallengeResponse['lanman'] = lmResponse
- ntlmChallengeResponse['ntlm'] = ntResponse
- if encryptedRandomSessionKey is not None:
- ntlmChallengeResponse['session_key'] = encryptedRandomSessionKey
-
- return ntlmChallengeResponse, exportedSessionKey
-
-
-# NTLMv1 Algorithm
-
-def generateSessionKeyV1(password, lmhash, nthash):
- if POW:
- hash = POW.Digest(POW.MD4_DIGEST)
- else:
- hash = MD4.new()
- hash.update(NTOWFv1(password, lmhash, nthash))
- return hash.digest()
-
-def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash='', nthash='', use_ntlmv2 = USE_NTLMv2):
- if (user == '' and password == ''):
- # Special case for anonymous authentication
- lmResponse = ''
- ntResponse = ''
- else:
- lmhash = LMOWFv1(password, lmhash, nthash)
- nthash = NTOWFv1(password, lmhash, nthash)
- if flags & NTLMSSP_NEGOTIATE_LM_KEY:
- ntResponse = ''
- lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
- elif flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- md5 = hashlib.new('md5')
- chall = (serverChallenge + clientChallenge)
- md5.update(chall)
- ntResponse = ntlmssp_DES_encrypt(nthash, md5.digest()[:8])
- lmResponse = clientChallenge + '\x00'*16
- else:
- ntResponse = get_ntlmv1_response(nthash,serverChallenge)
- lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
-
- sessionBaseKey = generateSessionKeyV1(password, lmhash, nthash)
- return ntResponse, lmResponse, sessionBaseKey
-
-def compute_lmhash(password):
- # This is done according to Samba's encryption specification (docs/html/ENCRYPTION.html)
- password = password.upper()
- lmhash = __DES_block(password[:7], KNOWN_DES_INPUT)
- lmhash += __DES_block(password[7:14], KNOWN_DES_INPUT)
- return lmhash
-
-def NTOWFv1(password, lmhash = '', nthash=''):
- if nthash != '':
- return nthash
- return compute_nthash(password)
-
-def LMOWFv1(password, lmhash = '', nthash=''):
- if lmhash != '':
- return lmhash
- return compute_lmhash(password)
-
-def compute_nthash(password):
- # This is done according to Samba's encryption specification (docs/html/ENCRYPTION.html)
- try:
- password = unicode(password).encode('utf_16le')
- except NameError: # unicode() was removed in Python 3
- password = str(password).encode('utf_16le')
- except UnicodeDecodeError:
- import sys
- password = password.decode(sys.getfilesystemencoding()).encode('utf_16le')
-
- if POW:
- hash = POW.Digest(POW.MD4_DIGEST)
- else:
- hash = MD4.new()
- hash.update(password)
- return hash.digest()
-
-def get_ntlmv1_response(key, challenge):
- return ntlmssp_DES_encrypt(key, challenge)
-
-# NTLMv2 Algorithm - as described in MS-NLMP Section 3.3.2
-
-# Crypto Stuff
-
-def MAC(flags, handle, signingKey, seqNum, message):
- # [MS-NLMP] Section 3.4.4
- # Returns the right messageSignature depending on the flags
- messageSignature = NTLMMessageSignature(flags)
- if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- if flags & NTLMSSP_NEGOTIATE_KEY_EXCH:
- messageSignature['Version'] = 1
- messageSignature['Checksum'] = struct.unpack('<q',handle(hmac_md5(signingKey, struct.pack('<i',seqNum)+message)[:8]))[0]
- messageSignature['SeqNum'] = seqNum
- seqNum += 1
- else:
- messageSignature['Version'] = 1
- messageSignature['Checksum'] = struct.unpack('<q',hmac_md5(signingKey, struct.pack('<i',seqNum)+message)[:8])[0]
- messageSignature['SeqNum'] = seqNum
- seqNum += 1
- else:
- messageSignature['Version'] = 1
- messageSignature['Checksum'] = struct.pack('<i',binascii.crc32(message))
- messageSignature['RandomPad'] = 0
- messageSignature['RandomPad'] = handle(struct.pack('<i',messageSignature['RandomPad']))
- messageSignature['Checksum'] = struct.unpack('<i',handle(messageSignature['Checksum']))[0]
- messageSignature['SeqNum'] = handle('\x00\x00\x00\x00')
- messageSignature['SeqNum'] = struct.unpack('<i',messageSignature['SeqNum'])[0] ^ seqNum
- messageSignature['RandomPad'] = 0
-
- return messageSignature
-
-def SEAL(flags, signingKey, sealingKey, messageToSign, messageToEncrypt, seqNum, handle):
- sealedMessage = handle(messageToEncrypt)
- signature = MAC(flags, handle, signingKey, seqNum, messageToSign)
- return sealedMessage, signature
-
-def SIGN(flags, signingKey, message, seqNum, handle):
- return MAC(flags, handle, signingKey, seqNum, message)
-
-def SIGNKEY(flags, randomSessionKey, mode = 'Client'):
- if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- if mode == 'Client':
- md5 = hashlib.new('md5')
- md5.update(randomSessionKey + "session key to client-to-server signing key magic constant\x00")
- signKey = md5.digest()
- else:
- md5 = hashlib.new('md5')
- md5.update(randomSessionKey + "session key to server-to-client signing key magic constant\x00")
- signKey = md5.digest()
- else:
- signKey = None
- return signKey
-
-def SEALKEY(flags, randomSessionKey, mode = 'Client'):
- if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- if flags & NTLMSSP_NEGOTIATE_128:
- sealKey = randomSessionKey
- elif flags & NTLMSSP_NEGOTIATE_56:
- sealKey = randomSessionKey[:7]
- else:
- sealKey = randomSessionKey[:5]
-
- if mode == 'Client':
- md5 = hashlib.new('md5')
- md5.update(sealKey + 'session key to client-to-server sealing key magic constant\x00')
- sealKey = md5.digest()
- else:
- md5 = hashlib.new('md5')
- md5.update(sealKey + 'session key to server-to-client sealing key magic constant\x00')
- sealKey = md5.digest()
-
- elif flags & NTLMSSP_NEGOTIATE_56:
- sealKey = randomSessionKey[:7] + '\xa0'
- else:
- sealKey = randomSessionKey[:5] + '\xe5\x38\xb0'
-
- return sealKey
-
-
-def generateEncryptedSessionKey(keyExchangeKey, exportedSessionKey):
- if POW:
- cipher = POW.Symmetric(POW.RC4)
- cipher.encryptInit(keyExchangeKey)
- cipher_encrypt = cipher.update
- else:
- cipher = ARC4.new(keyExchangeKey)
- cipher_encrypt = cipher.encrypt
-
- sessionKey = cipher_encrypt(exportedSessionKey)
- return sessionKey
-
-def KXKEY(flags, sessionBaseKey, lmChallengeResponse, serverChallenge, password, lmhash, nthash, use_ntlmv2 = USE_NTLMv2):
- if use_ntlmv2:
- return sessionBaseKey
-
- if flags & NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- if flags & NTLMSSP_NEGOTIATE_NTLM:
- keyExchangeKey = hmac_md5(sessionBaseKey, serverChallenge + lmChallengeResponse[:8])
- else:
- keyExchangeKey = sessionBaseKey
- elif flags & NTLMSSP_NEGOTIATE_NTLM:
- if flags & NTLMSSP_NEGOTIATE_LM_KEY:
- keyExchangeKey = __DES_block(LMOWFv1(password,lmhash)[:7], lmChallengeResponse[:8]) + __DES_block(LMOWFv1(password,lmhash)[7] + '\xBD\xBD\xBD\xBD\xBD\xBD', lmChallengeResponse[:8])
- elif flags & NTLMSSP_REQUEST_NON_NT_SESSION_KEY:
- keyExchangeKey = LMOWFv1(password,lmhash)[:8] + '\x00'*8
- else:
- keyExchangeKey = sessionBaseKey
- else:
- raise "Can't create a valid KXKEY!"
-
- return keyExchangeKey
-
-def hmac_md5(key, data):
- if POW:
- h = POW.Hmac(POW.MD5_DIGEST, key)
- h.update(data)
- result = h.mac()
- else:
- import hmac
- h = hmac.new(key)
- h.update(data)
- result = h.digest()
- return result
-
-def NTOWFv2( user, password, domain, hash = ''):
- if hash != '':
- theHash = hash
- else:
- theHash = compute_nthash(password)
- return hmac_md5(theHash, user.upper().encode('utf-16le') + domain.encode('utf-16le'))
-
-def LMOWFv2( user, password, domain, lmhash = ''):
- return NTOWFv2( user, password, domain, lmhash)
-
-
-def computeResponseNTLMv2(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash = '', nthash = '', use_ntlmv2 = USE_NTLMv2):
-
- responseServerVersion = '\x01'
- hiResponseServerVersion = '\x01'
- responseKeyNT = NTOWFv2(user, password, domain, nthash)
- responseKeyLM = LMOWFv2(user, password, domain, lmhash)
-
- # If you're running test-ntlm, comment the following lines and uncoment the ones that are commented. Don't forget to turn it back after the tests!
- ######################
- av_pairs = AV_PAIRS(serverName)
- # In order to support SPN target name validation, we have to add this to the serverName av_pairs. Otherwise we will get access denied
- # This is set at Local Security Policy -> Local Policies -> Security Options -> Server SPN target name validation level
- av_pairs[NTLMSSP_AV_TARGET_NAME] = 'cifs/'.encode('utf-16le') + av_pairs[NTLMSSP_AV_HOSTNAME][1]
- if av_pairs[NTLMSSP_AV_TIME] is not None:
- aTime = av_pairs[NTLMSSP_AV_TIME][1]
- else:
- aTime = struct.pack('<q', (116444736000000000 + calendar.timegm(time.gmtime()) * 10000000) )
- #aTime = '\x00'*8
- av_pairs[NTLMSSP_AV_TIME] = aTime
- serverName = av_pairs.getData()
-
- ######################
- #aTime = '\x00'*8
- ######################
- temp = responseServerVersion + hiResponseServerVersion + '\x00' * 6 + aTime + clientChallenge + '\x00' * 4 + serverName + '\x00' * 4
-
- ntProofStr = hmac_md5(responseKeyNT, serverChallenge + temp)
-
- ntChallengeResponse = ntProofStr + temp
- lmChallengeResponse = hmac_md5(responseKeyNT, serverChallenge + clientChallenge) + clientChallenge
- sessionBaseKey = hmac_md5(responseKeyNT, ntProofStr)
-
- if (user == '' and password == ''):
- # Special case for anonymous authentication
- ntChallengeResponse = ''
- lmChallengeResponse = ''
-
- return ntChallengeResponse, lmChallengeResponse, sessionBaseKey
-
-class NTLM_HTTP(object):
- '''Parent class for NTLM HTTP classes.'''
- MSG_TYPE = None
-
- @classmethod
- def get_instace(cls,msg_64):
- msg = None
- msg_type = 0
- if msg_64 != '':
- msg = base64.b64decode(msg_64[5:]) # Remove the 'NTLM '
- msg_type = ord(msg[8])
-
- for _cls in NTLM_HTTP.__subclasses__():
- if msg_type == _cls.MSG_TYPE:
- instance = _cls()
- instance.fromString(msg)
- return instance
-
-
-class NTLM_HTTP_AuthRequired(NTLM_HTTP):
- commonHdr = ()
- # Message 0 means the first HTTP request e.g. 'GET /bla.png'
- MSG_TYPE = 0
-
- def fromString(self,data):
- pass
-
-
-class NTLM_HTTP_AuthNegotiate(NTLM_HTTP, NTLMAuthNegotiate):
- commonHdr = ()
- MSG_TYPE = 1
-
- def __init__(self):
- NTLMAuthNegotiate.__init__(self)
-
-
-class NTLM_HTTP_AuthChallengeResponse(NTLM_HTTP, NTLMAuthChallengeResponse):
- commonHdr = ()
- MSG_TYPE = 3
-
- def __init__(self):
- NTLMAuthChallengeResponse.__init__(self)
diff --git a/tests/python_dependencies/impacket/smb.py b/tests/python_dependencies/impacket/smb.py
deleted file mode 100644
index c4ea6fc68..000000000
--- a/tests/python_dependencies/impacket/smb.py
+++ /dev/null
@@ -1,4099 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Copyright (C) 2001 Michael Teo <michaelteo@bigfoot.com>
-# smb.py - SMB/CIFS library
-#
-# This software is provided 'as-is', without any express or implied warranty.
-# In no event will the author be held liable for any damages arising from the
-# use of this software.
-#
-# Permission is granted to anyone to use this software for any purpose,
-# including commercial applications, and to alter it and redistribute it
-# freely, subject to the following restrictions:
-#
-# 1. The origin of this software must not be misrepresented; you must not
-# claim that you wrote the original software. If you use this software
-# in a product, an acknowledgment in the product documentation would be
-# appreciated but is not required.
-#
-# 2. Altered source versions must be plainly marked as such, and must not be
-# misrepresented as being the original software.
-#
-# 3. This notice cannot be removed or altered from any source distribution.
-#
-# Altered source done by Alberto Solino (@agsolino)
-
-# Todo:
-# [ ] Try [SMB]transport fragmentation using Transact requests
-# [ ] Try other methods of doing write (write_raw, transact2, write, write_and_unlock, write_and_close, write_mpx)
-# [-] Try replacements for SMB_COM_NT_CREATE_ANDX (CREATE, T_TRANSACT_CREATE, OPEN_ANDX works
-# [x] Fix forceWriteAndx, which needs to send a RecvRequest, because recv() will not send it
-# [x] Fix Recv() when using RecvAndx and the answer comes splet in several packets
-# [ ] Try [SMB]transport fragmentation with overlaping segments
-# [ ] Try [SMB]transport fragmentation with out of order segments
-# [x] Do chained AndX requests
-# [ ] Transform the rest of the calls to structure
-# [X] Implement TRANS/TRANS2 reassembly for list_path
-
-import os
-import socket
-import string
-from binascii import a2b_hex
-import datetime
-from struct import pack, unpack
-from contextlib import contextmanager
-
-from impacket import nmb, ntlm, nt_errors, LOG
-from impacket.structure import Structure
-from impacket.spnego import SPNEGO_NegTokenInit, TypesMech, SPNEGO_NegTokenResp
-
-# For signing
-import hashlib
-
-unicode_support = 0
-unicode_convert = 1
-
-try:
- from cStringIO import StringIO
-except ImportError:
- from StringIO import StringIO
-
-# Dialect for SMB1
-SMB_DIALECT = 'NT LM 0.12'
-
-# Shared Device Type
-SHARED_DISK = 0x00
-SHARED_DISK_HIDDEN = 0x80000000
-SHARED_PRINT_QUEUE = 0x01
-SHARED_DEVICE = 0x02
-SHARED_IPC = 0x03
-
-# Extended attributes mask
-ATTR_ARCHIVE = 0x020
-ATTR_COMPRESSED = 0x800
-ATTR_NORMAL = 0x080
-ATTR_HIDDEN = 0x002
-ATTR_READONLY = 0x001
-ATTR_TEMPORARY = 0x100
-ATTR_DIRECTORY = 0x010
-ATTR_SYSTEM = 0x004
-
-# Service Type
-SERVICE_DISK = 'A:'
-SERVICE_PRINTER = 'LPT1:'
-SERVICE_IPC = 'IPC'
-SERVICE_COMM = 'COMM'
-SERVICE_ANY = '?????'
-
-# Server Type (Can be used to mask with SMBMachine.get_type() or SMBDomain.get_type())
-SV_TYPE_WORKSTATION = 0x00000001
-SV_TYPE_SERVER = 0x00000002
-SV_TYPE_SQLSERVER = 0x00000004
-SV_TYPE_DOMAIN_CTRL = 0x00000008
-SV_TYPE_DOMAIN_BAKCTRL = 0x00000010
-SV_TYPE_TIME_SOURCE = 0x00000020
-SV_TYPE_AFP = 0x00000040
-SV_TYPE_NOVELL = 0x00000080
-SV_TYPE_DOMAIN_MEMBER = 0x00000100
-SV_TYPE_PRINTQ_SERVER = 0x00000200
-SV_TYPE_DIALIN_SERVER = 0x00000400
-SV_TYPE_XENIX_SERVER = 0x00000800
-SV_TYPE_NT = 0x00001000
-SV_TYPE_WFW = 0x00002000
-SV_TYPE_SERVER_NT = 0x00004000
-SV_TYPE_POTENTIAL_BROWSER = 0x00010000
-SV_TYPE_BACKUP_BROWSER = 0x00020000
-SV_TYPE_MASTER_BROWSER = 0x00040000
-SV_TYPE_DOMAIN_MASTER = 0x00080000
-SV_TYPE_LOCAL_LIST_ONLY = 0x40000000
-SV_TYPE_DOMAIN_ENUM = 0x80000000
-
-# Options values for SMB.stor_file and SMB.retr_file
-SMB_O_CREAT = 0x10 # Create the file if file does not exists. Otherwise, operation fails.
-SMB_O_EXCL = 0x00 # When used with SMB_O_CREAT, operation fails if file exists. Cannot be used with SMB_O_OPEN.
-SMB_O_OPEN = 0x01 # Open the file if the file exists
-SMB_O_TRUNC = 0x02 # Truncate the file if the file exists
-
-# Share Access Mode
-SMB_SHARE_COMPAT = 0x00
-SMB_SHARE_DENY_EXCL = 0x10
-SMB_SHARE_DENY_WRITE = 0x20
-SMB_SHARE_DENY_READEXEC = 0x30
-SMB_SHARE_DENY_NONE = 0x40
-SMB_ACCESS_READ = 0x00
-SMB_ACCESS_WRITE = 0x01
-SMB_ACCESS_READWRITE = 0x02
-SMB_ACCESS_EXEC = 0x03
-
-TRANS_DISCONNECT_TID = 1
-TRANS_NO_RESPONSE = 2
-
-STATUS_SUCCESS = 0x00000000
-STATUS_LOGON_FAILURE = 0xC000006D
-STATUS_LOGON_TYPE_NOT_GRANTED = 0xC000015B
-MAX_TFRAG_SIZE = 5840
-EVASION_NONE = 0
-EVASION_LOW = 1
-EVASION_HIGH = 2
-EVASION_MAX = 3
-RPC_X_BAD_STUB_DATA = 0x6F7
-
-# SMB_FILE_ATTRIBUTES
-
-SMB_FILE_ATTRIBUTE_NORMAL = 0x0000
-SMB_FILE_ATTRIBUTE_READONLY = 0x0001
-SMB_FILE_ATTRIBUTE_HIDDEN = 0x0002
-SMB_FILE_ATTRIBUTE_SYSTEM = 0x0004
-SMB_FILE_ATTRIBUTE_VOLUME = 0x0008
-SMB_FILE_ATTRIBUTE_DIRECTORY = 0x0010
-SMB_FILE_ATTRIBUTE_ARCHIVE = 0x0020
-SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100
-SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200
-SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400
-SMB_SEARCH_ATTRIBUTE_DIRECTORY = 0x1000
-SMB_SEARCH_ATTRIBUTE_ARCHIVE = 0x2000
-
-# Session SetupAndX Action flags
-SMB_SETUP_GUEST = 0x01
-SMB_SETUP_USE_LANMAN_KEY = 0x02
-
-# QUERY_INFORMATION levels
-SMB_INFO_ALLOCATION = 0x0001
-SMB_INFO_VOLUME = 0x0002
-FILE_FS_SIZE_INFORMATION = 0x0003
-SMB_QUERY_FS_VOLUME_INFO = 0x0102
-SMB_QUERY_FS_SIZE_INFO = 0x0103
-SMB_QUERY_FILE_EA_INFO = 0x0103
-SMB_QUERY_FS_DEVICE_INFO = 0x0104
-SMB_QUERY_FS_ATTRIBUTE_INFO = 0x0105
-SMB_QUERY_FILE_BASIC_INFO = 0x0101
-SMB_QUERY_FILE_STANDARD_INFO = 0x0102
-SMB_QUERY_FILE_ALL_INFO = 0x0107
-FILE_FS_FULL_SIZE_INFORMATION = 0x03EF
-
-# SET_INFORMATION levels
-SMB_SET_FILE_DISPOSITION_INFO = 0x0102
-SMB_SET_FILE_BASIC_INFO = 0x0101
-SMB_SET_FILE_END_OF_FILE_INFO = 0x0104
-
-
-# File System Attributes
-FILE_CASE_SENSITIVE_SEARCH = 0x00000001
-FILE_CASE_PRESERVED_NAMES = 0x00000002
-FILE_UNICODE_ON_DISK = 0x00000004
-FILE_PERSISTENT_ACLS = 0x00000008
-FILE_FILE_COMPRESSION = 0x00000010
-FILE_VOLUME_IS_COMPRESSED = 0x00008000
-
-# FIND_FIRST2 flags and levels
-SMB_FIND_CLOSE_AFTER_REQUEST = 0x0001
-SMB_FIND_CLOSE_AT_EOS = 0x0002
-SMB_FIND_RETURN_RESUME_KEYS = 0x0004
-SMB_FIND_CONTINUE_FROM_LAST = 0x0008
-SMB_FIND_WITH_BACKUP_INTENT = 0x0010
-
-FILE_DIRECTORY_FILE = 0x00000001
-FILE_DELETE_ON_CLOSE = 0x00001000
-FILE_NON_DIRECTORY_FILE = 0x00000040
-
-SMB_FIND_INFO_STANDARD = 0x0001
-SMB_FIND_FILE_DIRECTORY_INFO = 0x0101
-SMB_FIND_FILE_FULL_DIRECTORY_INFO= 0x0102
-SMB_FIND_FILE_NAMES_INFO = 0x0103
-SMB_FIND_FILE_BOTH_DIRECTORY_INFO= 0x0104
-SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO = 0x105
-SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO = 0x106
-
-
-# DesiredAccess flags
-FILE_READ_DATA = 0x00000001
-FILE_WRITE_DATA = 0x00000002
-FILE_APPEND_DATA = 0x00000004
-FILE_EXECUTE = 0x00000020
-MAXIMUM_ALLOWED = 0x02000000
-GENERIC_ALL = 0x10000000
-GENERIC_EXECUTE = 0x20000000
-GENERIC_WRITE = 0x40000000
-GENERIC_READ = 0x80000000
-
-# ShareAccess flags
-FILE_SHARE_NONE = 0x00000000
-FILE_SHARE_READ = 0x00000001
-FILE_SHARE_WRITE = 0x00000002
-FILE_SHARE_DELETE = 0x00000004
-
-# CreateDisposition flags
-FILE_SUPERSEDE = 0x00000000
-FILE_OPEN = 0x00000001
-FILE_CREATE = 0x00000002
-FILE_OPEN_IF = 0x00000003
-FILE_OVERWRITE = 0x00000004
-FILE_OVERWRITE_IF = 0x00000005
-
-def strerror(errclass, errcode):
- if errclass == 0x01:
- return 'OS error', ERRDOS.get(errcode, 'Unknown error')
- elif errclass == 0x02:
- return 'Server error', ERRSRV.get(errcode, 'Unknown error')
- elif errclass == 0x03:
- return 'Hardware error', ERRHRD.get(errcode, 'Unknown error')
- # This is not a standard error class for SMB
- #elif errclass == 0x80:
- # return 'Browse error', ERRBROWSE.get(errcode, 'Unknown error')
- elif errclass == 0xff:
- return 'Bad command', 'Bad command. Please file bug report'
- else:
- return 'Unknown error', 'Unknown error'
-
-# Raised when an error has occured during a session
-class SessionError(Exception):
- # SMB X/Open error codes for the ERRDOS error class
- ERRsuccess = 0
- ERRbadfunc = 1
- ERRbadfile = 2
- ERRbadpath = 3
- ERRnofids = 4
- ERRnoaccess = 5
- ERRbadfid = 6
- ERRbadmcb = 7
- ERRnomem = 8
- ERRbadmem = 9
- ERRbadenv = 10
- ERRbadaccess = 12
- ERRbaddata = 13
- ERRres = 14
- ERRbaddrive = 15
- ERRremcd = 16
- ERRdiffdevice = 17
- ERRnofiles = 18
- ERRgeneral = 31
- ERRbadshare = 32
- ERRlock = 33
- ERRunsup = 50
- ERRnetnamedel = 64
- ERRnosuchshare = 67
- ERRfilexists = 80
- ERRinvalidparam = 87
- ERRcannotopen = 110
- ERRinsufficientbuffer = 122
- ERRinvalidname = 123
- ERRunknownlevel = 124
- ERRnotlocked = 158
- ERRrename = 183
- ERRbadpipe = 230
- ERRpipebusy = 231
- ERRpipeclosing = 232
- ERRnotconnected = 233
- ERRmoredata = 234
- ERRnomoreitems = 259
- ERRbaddirectory = 267
- ERReasnotsupported = 282
- ERRlogonfailure = 1326
- ERRbuftoosmall = 2123
- ERRunknownipc = 2142
- ERRnosuchprintjob = 2151
- ERRinvgroup = 2455
-
- # here's a special one from observing NT
- ERRnoipc = 66
-
- # These errors seem to be only returned by the NT printer driver system
- ERRdriveralreadyinstalled = 1795
- ERRunknownprinterport = 1796
- ERRunknownprinterdriver = 1797
- ERRunknownprintprocessor = 1798
- ERRinvalidseparatorfile = 1799
- ERRinvalidjobpriority = 1800
- ERRinvalidprintername = 1801
- ERRprinteralreadyexists = 1802
- ERRinvalidprintercommand = 1803
- ERRinvaliddatatype = 1804
- ERRinvalidenvironment = 1805
-
- ERRunknownprintmonitor = 3000
- ERRprinterdriverinuse = 3001
- ERRspoolfilenotfound = 3002
- ERRnostartdoc = 3003
- ERRnoaddjob = 3004
- ERRprintprocessoralreadyinstalled = 3005
- ERRprintmonitoralreadyinstalled = 3006
- ERRinvalidprintmonitor = 3007
- ERRprintmonitorinuse = 3008
- ERRprinterhasjobsqueued = 3009
-
- # Error codes for the ERRSRV class
-
- ERRerror = 1
- ERRbadpw = 2
- ERRbadtype = 3
- ERRaccess = 4
- ERRinvnid = 5
- ERRinvnetname = 6
- ERRinvdevice = 7
- ERRqfull = 49
- ERRqtoobig = 50
- ERRinvpfid = 52
- ERRsmbcmd = 64
- ERRsrverror = 65
- ERRfilespecs = 67
- ERRbadlink = 68
- ERRbadpermits = 69
- ERRbadpid = 70
- ERRsetattrmode = 71
- ERRpaused = 81
- ERRmsgoff = 82
- ERRnoroom = 83
- ERRrmuns = 87
- ERRtimeout = 88
- ERRnoresource = 89
- ERRtoomanyuids = 90
- ERRbaduid = 91
- ERRuseMPX = 250
- ERRuseSTD = 251
- ERRcontMPX = 252
- ERRbadPW = None
- ERRnosupport = 0
- ERRunknownsmb = 22
-
- # Error codes for the ERRHRD class
-
- ERRnowrite = 19
- ERRbadunit = 20
- ERRnotready = 21
- ERRbadcmd = 22
- ERRdata = 23
- ERRbadreq = 24
- ERRseek = 25
- ERRbadmedia = 26
- ERRbadsector = 27
- ERRnopaper = 28
- ERRwrite = 29
- ERRread = 30
- ERRwrongdisk = 34
- ERRFCBunavail = 35
- ERRsharebufexc = 36
- ERRdiskfull = 39
-
-
- hard_msgs = {
- 19: ("ERRnowrite", "Attempt to write on write-protected diskette."),
- 20: ("ERRbadunit", "Unknown unit."),
- 21: ("ERRnotready", "Drive not ready."),
- 22: ("ERRbadcmd", "Unknown command."),
- 23: ("ERRdata", "Data error (CRC)."),
- 24: ("ERRbadreq", "Bad request structure length."),
- 25: ("ERRseek", "Seek error."),
- 26: ("ERRbadmedia", "Unknown media type."),
- 27: ("ERRbadsector", "Sector not found."),
- 28: ("ERRnopaper", "Printer out of paper."),
- 29: ("ERRwrite", "Write fault."),
- 30: ("ERRread", "Read fault."),
- 31: ("ERRgeneral", "General failure."),
- 32: ("ERRbadshare", "An open conflicts with an existing open."),
- 33: ("ERRlock", "A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."),
- 34: ("ERRwrongdisk", "The wrong disk was found in a drive."),
- 35: ("ERRFCBUnavail", "No FCBs are available to process request."),
- 36: ("ERRsharebufexc", "A sharing buffer has been exceeded.")
- }
-
- dos_msgs = {
- ERRbadfunc: ("ERRbadfunc", "Invalid function."),
- ERRbadfile: ("ERRbadfile", "File not found."),
- ERRbadpath: ("ERRbadpath", "Directory invalid."),
- ERRnofids: ("ERRnofids", "No file descriptors available"),
- ERRnoaccess: ("ERRnoaccess", "Access denied."),
- ERRbadfid: ("ERRbadfid", "Invalid file handle."),
- ERRbadmcb: ("ERRbadmcb", "Memory control blocks destroyed."),
- ERRnomem: ("ERRnomem", "Insufficient server memory to perform the requested function."),
- ERRbadmem: ("ERRbadmem", "Invalid memory block address."),
- ERRbadenv: ("ERRbadenv", "Invalid environment."),
- 11: ("ERRbadformat", "Invalid format."),
- ERRbadaccess: ("ERRbadaccess", "Invalid open mode."),
- ERRbaddata: ("ERRbaddata", "Invalid data."),
- ERRres: ("ERRres", "reserved."),
- ERRbaddrive: ("ERRbaddrive", "Invalid drive specified."),
- ERRremcd: ("ERRremcd", "A Delete Directory request attempted to remove the server's current directory."),
- ERRdiffdevice: ("ERRdiffdevice", "Not same device."),
- ERRnofiles: ("ERRnofiles", "A File Search command can find no more files matching the specified criteria."),
- ERRbadshare: ("ERRbadshare", "The sharing mode specified for an Open conflicts with existing FIDs on the file."),
- ERRlock: ("ERRlock", "A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."),
- ERRunsup: ("ERRunsup", "The operation is unsupported"),
- ERRnosuchshare: ("ERRnosuchshare", "You specified an invalid share name"),
- ERRfilexists: ("ERRfilexists", "The file named in a Create Directory, Make New File or Link request already exists."),
- ERRinvalidname: ("ERRinvalidname", "Invalid name"),
- ERRbadpipe: ("ERRbadpipe", "Pipe invalid."),
- ERRpipebusy: ("ERRpipebusy", "All instances of the requested pipe are busy."),
- ERRpipeclosing: ("ERRpipeclosing", "Pipe close in progress."),
- ERRnotconnected: ("ERRnotconnected", "No process on other end of pipe."),
- ERRmoredata: ("ERRmoredata", "There is more data to be returned."),
- ERRinvgroup: ("ERRinvgroup", "Invalid workgroup (try the -W option)"),
- ERRlogonfailure: ("ERRlogonfailure", "Logon failure"),
- ERRdiskfull: ("ERRdiskfull", "Disk full"),
- ERRgeneral: ("ERRgeneral", "General failure"),
- ERRunknownlevel: ("ERRunknownlevel", "Unknown info level")
- }
-
- server_msgs = {
- 1: ("ERRerror", "Non-specific error code."),
- 2: ("ERRbadpw", "Bad password - name/password pair in a Tree Connect or Session Setup are invalid."),
- 3: ("ERRbadtype", "reserved."),
- 4: ("ERRaccess", "The requester does not have the necessary access rights within the specified context for the requested function. The context is defined by the TID or the UID."),
- 5: ("ERRinvnid", "The tree ID (TID) specified in a command was invalid."),
- 6: ("ERRinvnetname", "Invalid network name in tree connect."),
- 7: ("ERRinvdevice", "Invalid device - printer request made to non-printer connection or non-printer request made to printer connection."),
- 49: ("ERRqfull", "Print queue full (files) -- returned by open print file."),
- 50: ("ERRqtoobig", "Print queue full -- no space."),
- 51: ("ERRqeof", "EOF on print queue dump."),
- 52: ("ERRinvpfid", "Invalid print file FID."),
- 64: ("ERRsmbcmd", "The server did not recognize the command received."),
- 65: ("ERRsrverror","The server encountered an internal error, e.g., system file unavailable."),
- 67: ("ERRfilespecs", "The file handle (FID) and pathname parameters contained an invalid combination of values."),
- 68: ("ERRreserved", "reserved."),
- 69: ("ERRbadpermits", "The access permissions specified for a file or directory are not a valid combination. The server cannot set the requested attribute."),
- 70: ("ERRreserved", "reserved."),
- 71: ("ERRsetattrmode", "The attribute mode in the Set File Attribute request is invalid."),
- 81: ("ERRpaused", "Server is paused."),
- 82: ("ERRmsgoff", "Not receiving messages."),
- 83: ("ERRnoroom", "No room to buffer message."),
- 87: ("ERRrmuns", "Too many remote user names."),
- 88: ("ERRtimeout", "Operation timed out."),
- 89: ("ERRnoresource", "No resources currently available for request."),
- 90: ("ERRtoomanyuids", "Too many UIDs active on this session."),
- 91: ("ERRbaduid", "The UID is not known as a valid ID on this session."),
- 250: ("ERRusempx","Temp unable to support Raw, use MPX mode."),
- 251: ("ERRusestd","Temp unable to support Raw, use standard read/write."),
- 252: ("ERRcontmpx", "Continue in MPX mode."),
- 253: ("ERRreserved", "reserved."),
- 254: ("ERRreserved", "reserved."),
- 0xFFFF: ("ERRnosupport", "Function not supported.")
- }
- # Error clases
-
- ERRDOS = 0x1
- error_classes = { 0: ("SUCCESS", {}),
- ERRDOS: ("ERRDOS", dos_msgs),
- 0x02: ("ERRSRV",server_msgs),
- 0x03: ("ERRHRD",hard_msgs),
- 0x04: ("ERRXOS", {} ),
- 0xE1: ("ERRRMX1", {} ),
- 0xE2: ("ERRRMX2", {} ),
- 0xE3: ("ERRRMX3", {} ),
- 0xFF: ("ERRCMD", {} ) }
-
-
-
- def __init__( self, error_string, error_class, error_code, nt_status = 0):
- Exception.__init__(self, error_string)
- self.nt_status = nt_status
- self._args = error_string
- if nt_status:
- self.error_class = 0
- self.error_code = (error_code << 16) + error_class
- else:
- self.error_class = error_class
- self.error_code = error_code
-
-
- def get_error_class( self ):
- return self.error_class
-
- def get_error_code( self ):
- return self.error_code
-
- def __str__( self ):
- error_class = SessionError.error_classes.get( self.error_class, None )
- if not error_class:
- error_code_str = self.error_code
- error_class_str = self.error_class
- else:
- error_class_str = error_class[0]
- error_code = error_class[1].get( self.error_code, None )
- if not error_code:
- error_code_str = self.error_code
- else:
- error_code_str = '%s(%s)' % error_code
-
- if self.nt_status:
- return 'SMB SessionError: %s(%s)' % nt_errors.ERROR_MESSAGES[self.error_code]
- else:
- # Fall back to the old format
- return 'SMB SessionError: class: %s, code: %s' % (error_class_str, error_code_str)
-
-
-# Raised when an supported feature is present/required in the protocol but is not
-# currently supported by pysmb
-class UnsupportedFeature(Exception): pass
-
-# Contains information about a SMB shared device/service
-class SharedDevice:
- def __init__(self, name, share_type, comment):
- self.__name = name
- self.__type = share_type
- self.__comment = comment
-
- def get_name(self):
- return self.__name
-
- def get_type(self):
- return self.__type
-
- def get_comment(self):
- return self.__comment
-
- def __repr__(self):
- return '<SharedDevice instance: name=' + self.__name + ', type=' + str(self.__type) + ', comment="' + self.__comment + '">'
-
-
-# Contains information about the shared file/directory
-class SharedFile:
- def __init__(self, ctime, atime, mtime, filesize, allocsize, attribs, shortname, longname):
- self.__ctime = ctime
- self.__atime = atime
- self.__mtime = mtime
- self.__filesize = filesize
- self.__allocsize = allocsize
- self.__attribs = attribs
- try:
- self.__shortname = shortname[:string.index(shortname, '\0')]
- except ValueError:
- self.__shortname = shortname
- try:
- self.__longname = longname[:string.index(longname, '\0')]
- except ValueError:
- self.__longname = longname
-
- def get_ctime(self):
- return self.__ctime
-
- def get_ctime_epoch(self):
- return self.__convert_smbtime(self.__ctime)
-
- def get_mtime(self):
- return self.__mtime
-
- def get_mtime_epoch(self):
- return self.__convert_smbtime(self.__mtime)
-
- def get_atime(self):
- return self.__atime
-
- def get_atime_epoch(self):
- return self.__convert_smbtime(self.__atime)
-
- def get_filesize(self):
- return self.__filesize
-
- def get_allocsize(self):
- return self.__allocsize
-
- def get_attributes(self):
- return self.__attribs
-
- def is_archive(self):
- return self.__attribs & ATTR_ARCHIVE
-
- def is_compressed(self):
- return self.__attribs & ATTR_COMPRESSED
-
- def is_normal(self):
- return self.__attribs & ATTR_NORMAL
-
- def is_hidden(self):
- return self.__attribs & ATTR_HIDDEN
-
- def is_readonly(self):
- return self.__attribs & ATTR_READONLY
-
- def is_temporary(self):
- return self.__attribs & ATTR_TEMPORARY
-
- def is_directory(self):
- return self.__attribs & ATTR_DIRECTORY
-
- def is_system(self):
- return self.__attribs & ATTR_SYSTEM
-
- def get_shortname(self):
- return self.__shortname
-
- def get_longname(self):
- return self.__longname
-
- def __repr__(self):
- return '<SharedFile instance: shortname="' + self.__shortname + '", longname="' + self.__longname + '", filesize=' + str(self.__filesize) + '>'
-
- @staticmethod
- def __convert_smbtime(t):
- x = t >> 32
- y = t & 0xffffffff
- geo_cal_offset = 11644473600.0 # = 369.0 * 365.25 * 24 * 60 * 60 - (3.0 * 24 * 60 * 60 + 6.0 * 60 * 60)
- return (x * 4.0 * (1 << 30) + (y & 0xfff00000)) * 1.0e-7 - geo_cal_offset
-
-
-# Contain information about a SMB machine
-class SMBMachine:
- def __init__(self, nbname, nbt_type, comment):
- self.__nbname = nbname
- self.__type = nbt_type
- self.__comment = comment
-
- def __repr__(self):
- return '<SMBMachine instance: nbname="' + self.__nbname + '", type=' + hex(self.__type) + ', comment="' + self.__comment + '">'
-
-class SMBDomain:
- def __init__(self, nbgroup, domain_type, master_browser):
- self.__nbgroup = nbgroup
- self.__type = domain_type
- self.__master_browser = master_browser
-
- def __repr__(self):
- return '<SMBDomain instance: nbgroup="' + self.__nbgroup + '", type=' + hex(self.__type) + ', master browser="' + self.__master_browser + '">'
-
-# Represents a SMB Packet
-class NewSMBPacket(Structure):
- structure = (
- ('Signature', '"\xffSMB'),
- ('Command','B=0'),
- ('ErrorClass','B=0'),
- ('_reserved','B=0'),
- ('ErrorCode','<H=0'),
- ('Flags1','B=0'),
- ('Flags2','<H=0'),
- ('PIDHigh','<H=0'),
- ('SecurityFeatures','8s=""'),
- ('Reserved','<H=0'),
- ('Tid','<H=0xffff'),
- ('Pid','<H=0'),
- ('Uid','<H=0'),
- ('Mid','<H=0'),
- ('Data','*:'),
- )
-
- def __init__(self, **kargs):
- Structure.__init__(self, **kargs)
-
- if ('Flags2' in self.fields) is False:
- self['Flags2'] = 0
- if ('Flags1' in self.fields) is False:
- self['Flags1'] = 0
-
- if 'data' not in kargs:
- self['Data'] = []
-
- def addCommand(self, command):
- if len(self['Data']) == 0:
- self['Command'] = command.command
- else:
- self['Data'][-1]['Parameters']['AndXCommand'] = command.command
- self['Data'][-1]['Parameters']['AndXOffset'] = len(self)
- self['Data'].append(command)
-
- def isMoreData(self):
- return (self['Command'] in [SMB.SMB_COM_TRANSACTION, SMB.SMB_COM_READ_ANDX, SMB.SMB_COM_READ_RAW] and
- self['ErrorClass'] == 1 and self['ErrorCode'] == SessionError.ERRmoredata)
-
- def isMoreProcessingRequired(self):
- return self['ErrorClass'] == 0x16 and self['ErrorCode'] == 0xc000
-
- def isValidAnswer(self, cmd):
- # this was inside a loop reading more from the net (with recv_packet(None))
- if self['Command'] == cmd:
- if (self['ErrorClass'] == 0x00 and
- self['ErrorCode'] == 0x00):
- return 1
- elif self.isMoreData():
- return 1
- elif self.isMoreProcessingRequired():
- return 1
- raise SessionError("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
- else:
- raise UnsupportedFeature("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
-
-
-class SMBCommand(Structure):
- structure = (
- ('WordCount', 'B=len(Parameters)/2'),
- ('_ParametersLength','_-Parameters','WordCount*2'),
- ('Parameters',':'), # default set by constructor
- ('ByteCount','<H-Data'),
- ('Data',':'), # default set by constructor
- )
-
- def __init__(self, commandOrData = None, data = None, **kargs):
- if type(commandOrData) == type(0):
- self.command = commandOrData
- else:
- data = data or commandOrData
-
- Structure.__init__(self, data = data, **kargs)
-
- if data is None:
- self['Parameters'] = ''
- self['Data'] = ''
-
-class AsciiOrUnicodeStructure(Structure):
- UnicodeStructure = ()
- AsciiStructure = ()
- def __init__(self, flags = 0, **kargs):
- if flags & SMB.FLAGS2_UNICODE:
- self.structure = self.UnicodeStructure
- else:
- self.structure = self.AsciiStructure
- Structure.__init__(self, **kargs)
-
-class SMBCommand_Parameters(Structure):
- pass
-
-class SMBAndXCommand_Parameters(Structure):
- commonHdr = (
- ('AndXCommand','B=0xff'),
- ('_reserved','B=0'),
- ('AndXOffset','<H=0'),
- )
- structure = ( # default structure, overriden by subclasses
- ('Data',':=""'),
- )
-
-############# TRANSACTIONS RELATED
-# TRANS2_QUERY_FS_INFORMATION
-# QUERY_FS Information Levels
-# SMB_QUERY_FS_ATTRIBUTE_INFO
-class SMBQueryFsAttributeInfo(Structure):
- structure = (
- ('FileSystemAttributes','<L'),
- ('MaxFilenNameLengthInBytes','<L'),
- ('LengthOfFileSystemName','<L-FileSystemName'),
- ('FileSystemName',':'),
- )
-
-class SMBQueryFsInfoVolume(AsciiOrUnicodeStructure):
- commonHdr = (
- ('ulVolSerialNbr','<L=0xABCDEFAA'),
- ('cCharCount','<B-VolumeLabel'),
- )
- AsciiStructure = (
- ('VolumeLabel','z'),
- )
- UnicodeStructure = (
- ('VolumeLabel','u'),
- )
-
-# FILE_FS_SIZE_INFORMATION
-class FileFsSizeInformation(Structure):
- structure = (
- ('TotalAllocationUnits','<q=148529400'),
- ('AvailableAllocationUnits','<q=14851044'),
- ('SectorsPerAllocationUnit','<L=2'),
- ('BytesPerSector','<L=512'),
- )
-
-# SMB_QUERY_FS_SIZE_INFO
-class SMBQueryFsSizeInfo(Structure):
- structure = (
- ('TotalAllocationUnits','<q=148529400'),
- ('TotalFreeAllocationUnits','<q=14851044'),
- ('SectorsPerAllocationUnit','<L=2'),
- ('BytesPerSector','<L=512'),
- )
-# FILE_FS_FULL_SIZE_INFORMATION
-class SMBFileFsFullSizeInformation(Structure):
- structure = (
- ('TotalAllocationUnits','<q=148529400'),
- ('CallerAvailableAllocationUnits','<q=148529400'),
- ('ActualAvailableAllocationUnits','<q=148529400'),
- ('SectorsPerAllocationUnit','<L=15'),
- ('BytesPerSector','<L=512')
- )
-# SMB_QUERY_FS_VOLUME_INFO
-class SMBQueryFsVolumeInfo(Structure):
- structure = (
- ('VolumeCreationTime','<q'),
- ('SerialNumber','<L=0xABCDEFAA'),
- ('VolumeLabelSize','<L=len(VolumeLabel)'),
- ('Reserved','<H=0x10'),
- ('VolumeLabel',':')
- )
-# SMB_FIND_FILE_BOTH_DIRECTORY_INFO level
-class SMBFindFileBothDirectoryInfo(AsciiOrUnicodeStructure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('FileIndex','<L=0'),
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('EndOfFile','<q=0'),
- ('AllocationSize','<q=0'),
- ('ExtFileAttributes','<L=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('EaSize','<L=0'),
- ('ShortNameLength','<B=0'),
- ('Reserved','<B=0'),
- ('ShortName','24s'),
- ('FileName',':'),
- )
- UnicodeStructure = (
- ('FileNameLength','<L-FileName','len(FileName)*2'),
- ('EaSize','<L=0'),
- ('ShortNameLength','<B=0'),
- ('Reserved','<B=0'),
- ('ShortName','24s'),
- ('FileName',':'),
- )
-
-# SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO level
-class SMBFindFileIdFullDirectoryInfo(AsciiOrUnicodeStructure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('FileIndex','<L=0'),
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('EndOfFile','<q=0'),
- ('AllocationSize','<q=0'),
- ('ExtFileAttributes','<L=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('EaSize','<L=0'),
- ('FileID','<q=0'),
- ('FileName',':'),
- )
- UnicodeStructure = (
- ('FileNameLength','<L-FileName','len(FileName)*2'),
- ('EaSize','<L=0'),
- ('FileID','<q=0'),
- ('FileName',':'),
- )
-
-# SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO level
-class SMBFindFileIdBothDirectoryInfo(AsciiOrUnicodeStructure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('FileIndex','<L=0'),
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('EndOfFile','<q=0'),
- ('AllocationSize','<q=0'),
- ('ExtFileAttributes','<L=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('EaSize','<L=0'),
- ('ShortNameLength','<B=0'),
- ('Reserved','<B=0'),
- ('ShortName','24s'),
- ('Reserved','<H=0'),
- ('FileID','<q=0'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileNameLength','<L-FileName','len(FileName)*2'),
- ('EaSize','<L=0'),
- ('ShortNameLength','<B=0'),
- ('Reserved','<B=0'),
- ('ShortName','24s'),
- ('Reserved','<H=0'),
- ('FileID','<q=0'),
- ('FileName',':'),
- )
-
-# SMB_FIND_FILE_DIRECTORY_INFO level
-class SMBFindFileDirectoryInfo(AsciiOrUnicodeStructure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('FileIndex','<L=0'),
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('EndOfFile','<q=0'),
- ('AllocationSize','<q=1'),
- ('ExtFileAttributes','<L=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileNameLength','<L-FileName','len(FileName)*2'),
- ('FileName',':'),
- )
-
-# SMB_FIND_FILE_NAMES_INFO level
-class SMBFindFileNamesInfo(AsciiOrUnicodeStructure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('FileIndex','<L=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileNameLength','<L-FileName','len(FileName)*2'),
- ('FileName',':'),
- )
-
-# SMB_FIND_FILE_FULL_DIRECTORY_INFO level
-class SMBFindFileFullDirectoryInfo(AsciiOrUnicodeStructure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('FileIndex','<L=0'),
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('EndOfFile','<q=0'),
- ('AllocationSize','<q=1'),
- ('ExtFileAttributes','<L=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('EaSize','<L'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileNameLength','<L-FileName','len(FileName)*2'),
- ('EaSize','<L'),
- ('FileName',':'),
- )
-
-# SMB_FIND_INFO_STANDARD level
-class SMBFindInfoStandard(AsciiOrUnicodeStructure):
- commonHdr = (
- ('ResumeKey','<L=0xff'),
- ('CreationDate','<H=0'),
- ('CreationTime','<H=0'),
- ('LastAccessDate','<H=0'),
- ('LastAccessTime','<H=0'),
- ('LastWriteDate','<H=0'),
- ('LastWriteTime','<H=0'),
- ('EaSize','<L'),
- ('AllocationSize','<L=1'),
- ('ExtFileAttributes','<H=0'),
- )
- AsciiStructure = (
- ('FileNameLength','<B-FileName','len(FileName)'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileNameLength','<B-FileName','len(FileName)*2'),
- ('FileName',':'),
- )
-
-# SET_FILE_INFORMATION structures
-# SMB_SET_FILE_DISPOSITION_INFO
-class SMBSetFileDispositionInfo(Structure):
- structure = (
- ('DeletePending','<B'),
- )
-
-# SMB_SET_FILE_BASIC_INFO
-class SMBSetFileBasicInfo(Structure):
- structure = (
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('ChangeTime','<q'),
- ('ExtFileAttributes','<H'),
- ('Reserved','<L'),
- )
-
-# FILE_STREAM_INFORMATION
-class SMBFileStreamInformation(Structure):
- commonHdr = (
- ('NextEntryOffset','<L=0'),
- ('StreamNameLength','<L=0'),
- ('StreamSize','<q=0'),
- ('StreamAllocationSize','<q=0'),
- ('StreamName',':=""'),
- )
-
-# FILE_NETWORK_OPEN_INFORMATION
-class SMBFileNetworkOpenInfo(Structure):
- structure = (
- ('CreationTime','<q=0'),
- ('LastAccessTime','<q=0'),
- ('LastWriteTime','<q=0'),
- ('ChangeTime','<q=0'),
- ('AllocationSize','<q=0'),
- ('EndOfFile','<q=0'),
- ('FileAttributes','<L=0'),
- ('Reserved','<L=0'),
- )
-
-# SMB_SET_FILE_END_OF_FILE_INFO
-class SMBSetFileEndOfFileInfo(Structure):
- structure = (
- ('EndOfFile','<q'),
- )
-
-# TRANS2_FIND_NEXT2
-class SMBFindNext2_Parameters(AsciiOrUnicodeStructure):
- commonHdr = (
- ('SID','<H'),
- ('SearchCount','<H'),
- ('InformationLevel','<H'),
- ('ResumeKey','<L'),
- ('Flags','<H'),
- )
- AsciiStructure = (
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileName','u'),
- )
-
-class SMBFindNext2Response_Parameters(Structure):
- structure = (
- ('SearchCount','<H'),
- ('EndOfSearch','<H=1'),
- ('EaErrorOffset','<H=0'),
- ('LastNameOffset','<H=0'),
- )
-
-class SMBFindNext2_Data(Structure):
- structure = (
- ('GetExtendedAttributesListLength','_-GetExtendedAttributesList', 'self["GetExtendedAttributesListLength"]'),
- ('GetExtendedAttributesList',':'),
- )
-
-
-# TRANS2_FIND_FIRST2
-class SMBFindFirst2Response_Parameters(Structure):
- structure = (
- ('SID','<H'),
- ('SearchCount','<H'),
- ('EndOfSearch','<H=1'),
- ('EaErrorOffset','<H=0'),
- ('LastNameOffset','<H=0'),
- )
-
-class SMBFindFirst2_Parameters(AsciiOrUnicodeStructure):
- commonHdr = (
- ('SearchAttributes','<H'),
- ('SearchCount','<H'),
- ('Flags','<H'),
- ('InformationLevel','<H'),
- ('SearchStorageType','<L'),
- )
- AsciiStructure = (
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileName','u'),
- )
-
-class SMBFindFirst2_Data(Structure):
- structure = (
- ('GetExtendedAttributesListLength','_-GetExtendedAttributesList', 'self["GetExtendedAttributesListLength"]'),
- ('GetExtendedAttributesList',':'),
- )
-
-# TRANS2_SET_PATH_INFORMATION
-class SMBSetPathInformation_Parameters(AsciiOrUnicodeStructure):
- commonHdr = (
- ('InformationLevel','<H'),
- ('Reserved','<L'),
- )
- AsciiStructure = (
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileName','u'),
- )
-
-class SMBSetPathInformationResponse_Parameters(Structure):
- structure = (
- ('EaErrorOffset','<H=0'),
- )
-
-# TRANS2_SET_FILE_INFORMATION
-class SMBSetFileInformation_Parameters(Structure):
- structure = (
- ('FID','<H'),
- ('InformationLevel','<H'),
- ('Reserved','<H'),
- )
-
-class SMBSetFileInformationResponse_Parameters(Structure):
- structure = (
- ('EaErrorOffset','<H=0'),
- )
-
-# TRANS2_QUERY_FILE_INFORMATION
-class SMBQueryFileInformation_Parameters(Structure):
- structure = (
- ('FID','<H'),
- ('InformationLevel','<H'),
- )
-
-class SMBQueryFileInformationResponse_Parameters(Structure):
- structure = (
- ('EaErrorOffset','<H=0'),
- )
-
-class SMBQueryFileInformation_Data(Structure):
- structure = (
- ('GetExtendedAttributeList',':'),
- )
-
-# TRANS2_QUERY_PATH_INFORMATION
-class SMBQueryPathInformationResponse_Parameters(Structure):
- structure = (
- ('EaErrorOffset','<H=0'),
- )
-
-class SMBQueryPathInformation_Parameters(AsciiOrUnicodeStructure):
- commonHdr = (
- ('InformationLevel','<H'),
- ('Reserved','<L=0'),
- )
- AsciiStructure = (
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileName','u'),
- )
-
-class SMBQueryPathInformation_Data(Structure):
- structure = (
- ('GetExtendedAttributeList',':'),
- )
-
-
-# SMB_QUERY_FILE_EA_INFO
-class SMBQueryFileEaInfo(Structure):
- structure = (
- ('EaSize','<L=0'),
- )
-
-# SMB_QUERY_FILE_BASIC_INFO
-class SMBQueryFileBasicInfo(Structure):
- structure = (
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('ExtFileAttributes','<L'),
- #('Reserved','<L=0'),
- )
-
-# SMB_QUERY_FILE_STANDARD_INFO
-class SMBQueryFileStandardInfo(Structure):
- structure = (
- ('AllocationSize','<q'),
- ('EndOfFile','<q'),
- ('NumberOfLinks','<L=0'),
- ('DeletePending','<B=0'),
- ('Directory','<B'),
- )
-
-# SMB_QUERY_FILE_ALL_INFO
-class SMBQueryFileAllInfo(Structure):
- structure = (
- ('CreationTime','<q'),
- ('LastAccessTime','<q'),
- ('LastWriteTime','<q'),
- ('LastChangeTime','<q'),
- ('ExtFileAttributes','<L'),
- ('Reserved','<L=0'),
- ('AllocationSize','<q'),
- ('EndOfFile','<q'),
- ('NumberOfLinks','<L=0'),
- ('DeletePending','<B=0'),
- ('Directory','<B'),
- ('Reserved','<H=0'),
- ('EaSize','<L=0'),
- ('FileNameLength','<L-FileName','len(FileName)'),
- ('FileName',':'),
- )
-
-# \PIPE\LANMAN NetShareEnum
-class SMBNetShareEnum(Structure):
- structure = (
- ('RAPOpcode','<H=0'),
- ('ParamDesc','z'),
- ('DataDesc','z'),
- ('InfoLevel','<H'),
- ('ReceiveBufferSize','<H'),
- )
-
-class SMBNetShareEnumResponse(Structure):
- structure = (
- ('Status','<H=0'),
- ('Convert','<H=0'),
- ('EntriesReturned','<H'),
- ('EntriesAvailable','<H'),
- )
-
-class NetShareInfo1(Structure):
- structure = (
- ('NetworkName','13s'),
- ('Pad','<B=0'),
- ('Type','<H=0'),
- ('RemarkOffsetLow','<H=0'),
- ('RemarkOffsetHigh','<H=0'),
- )
-
-# \PIPE\LANMAN NetServerGetInfo
-class SMBNetServerGetInfoResponse(Structure):
- structure = (
- ('Status','<H=0'),
- ('Convert','<H=0'),
- ('TotalBytesAvailable','<H'),
- )
-
-class SMBNetServerInfo1(Structure):
- # Level 1 Response
- structure = (
- ('ServerName','16s'),
- ('MajorVersion','B=5'),
- ('MinorVersion','B=0'),
- ('ServerType','<L=3'),
- ('ServerCommentLow','<H=0'),
- ('ServerCommentHigh','<H=0'),
- )
-
-# \PIPE\LANMAN NetShareGetInfo
-class SMBNetShareGetInfo(Structure):
- structure = (
- ('RAPOpcode','<H=0'),
- ('ParamDesc','z'),
- ('DataDesc','z'),
- ('ShareName','z'),
- ('InfoLevel','<H'),
- ('ReceiveBufferSize','<H'),
- )
-
-class SMBNetShareGetInfoResponse(Structure):
- structure = (
- ('Status','<H=0'),
- ('Convert','<H=0'),
- ('TotalBytesAvailable','<H'),
- )
-
-############# Security Features
-class SecurityFeatures(Structure):
- structure = (
- ('Key','<L=0'),
- ('CID','<H=0'),
- ('SequenceNumber','<H=0'),
- )
-
-############# SMB_COM_QUERY_INFORMATION2 (0x23)
-class SMBQueryInformation2_Parameters(Structure):
- structure = (
- ('Fid','<H'),
- )
-
-class SMBQueryInformation2Response_Parameters(Structure):
- structure = (
- ('CreateDate','<H'),
- ('CreationTime','<H'),
- ('LastAccessDate','<H'),
- ('LastAccessTime','<H'),
- ('LastWriteDate','<H'),
- ('LastWriteTime','<H'),
- ('FileDataSize','<L'),
- ('FileAllocationSize','<L'),
- ('FileAttributes','<L'),
- )
-
-
-
-############# SMB_COM_SESSION_SETUP_ANDX (0x73)
-class SMBSessionSetupAndX_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('MaxBuffer','<H'),
- ('MaxMpxCount','<H'),
- ('VCNumber','<H'),
- ('SessionKey','<L'),
- ('AnsiPwdLength','<H'),
- ('UnicodePwdLength','<H'),
- ('_reserved','<L=0'),
- ('Capabilities','<L'),
- )
-
-class SMBSessionSetupAndX_Extended_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('MaxBufferSize','<H'),
- ('MaxMpxCount','<H'),
- ('VcNumber','<H'),
- ('SessionKey','<L'),
- ('SecurityBlobLength','<H'),
- ('Reserved','<L=0'),
- ('Capabilities','<L'),
- )
-
-class SMBSessionSetupAndX_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('AnsiPwdLength','_-AnsiPwd','self["AnsiPwdLength"]'),
- ('UnicodePwdLength','_-UnicodePwd','self["UnicodePwdLength"]'),
- ('AnsiPwd',':=""'),
- ('UnicodePwd',':=""'),
- ('Account','z=""'),
- ('PrimaryDomain','z=""'),
- ('NativeOS','z=""'),
- ('NativeLanMan','z=""'),
- )
-
- UnicodeStructure = (
- ('AnsiPwdLength','_-AnsiPwd','self["AnsiPwdLength"]'),
- ('UnicodePwdLength','_-UnicodePwd','self["UnicodePwdLength"]'),
- ('AnsiPwd',':=""'),
- ('UnicodePwd',':=""'),
- ('Account','u=""'),
- ('PrimaryDomain','u=""'),
- ('NativeOS','u=""'),
- ('NativeLanMan','u=""'),
- )
-
-class SMBSessionSetupAndX_Extended_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
- ('SecurityBlob',':'),
- ('NativeOS','z=""'),
- ('NativeLanMan','z=""'),
- )
-
- UnicodeStructure = (
- ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
- ('SecurityBlob',':'),
- ('NativeOS','u=""'),
- ('NativeLanMan','u=""'),
- )
-
-class SMBSessionSetupAndXResponse_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Action','<H'),
- )
-
-class SMBSessionSetupAndX_Extended_Response_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Action','<H=0'),
- ('SecurityBlobLength','<H'),
- )
-
-class SMBSessionSetupAndXResponse_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('NativeOS','z=""'),
- ('NativeLanMan','z=""'),
- ('PrimaryDomain','z=""'),
- )
-
- UnicodeStructure = (
- ('NativeOS','u=""'),
- ('NativeLanMan','u=""'),
- ('PrimaryDomain','u=""'),
- )
-
-class SMBSessionSetupAndX_Extended_Response_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
- ('SecurityBlob',':'),
- ('NativeOS','z=""'),
- ('NativeLanMan','z=""'),
- )
-
- UnicodeStructure = (
- ('SecurityBlobLength','_-SecurityBlob','self["SecurityBlobLength"]'),
- ('SecurityBlob',':'),
- ('NativeOS','u=""'),
- ('NativeLanMan','u=""'),
- )
-
-############# SMB_COM_TREE_CONNECT (0x70)
-class SMBTreeConnect_Parameters(SMBCommand_Parameters):
- structure = (
- )
-
-class SMBTreeConnect_Data(SMBCommand_Parameters):
- structure = (
- ('PathFormat','"\x04'),
- ('Path','z'),
- ('PasswordFormat','"\x04'),
- ('Password','z'),
- ('ServiceFormat','"\x04'),
- ('Service','z'),
- )
-
-############# SMB_COM_TREE_CONNECT_ANDX (0x75)
-class SMBTreeConnectAndX_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Flags','<H=0'),
- ('PasswordLength','<H'),
- )
-
-class SMBTreeConnectAndXResponse_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('OptionalSupport','<H=0'),
- )
-
-class SMBTreeConnectAndXExtendedResponse_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('OptionalSupport','<H=1'),
- ('MaximalShareAccessRights','<L=0x1fffff'),
- ('GuestMaximalShareAccessRights','<L=0x1fffff'),
- )
-
-class SMBTreeConnectAndX_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('_PasswordLength','_-Password','self["_PasswordLength"]'),
- ('Password',':'),
- ('Path','z'),
- ('Service','z'),
- )
-
- UnicodeStructure = (
- ('_PasswordLength','_-Password','self["_PasswordLength"] if self["_PasswordLength"] > 0 else 1'),
- ('Password',':'),
- ('Path','u'),
- ('Service','z'),
- )
-
-class SMBTreeConnectAndXResponse_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('Service','z'),
- ('PadLen','_-Pad','self["PadLen"]'),
- ('Pad',':=""'),
- ('NativeFileSystem','z'),
- )
- UnicodeStructure = (
- ('Service','z'),
- ('PadLen','_-Pad','self["PadLen"]'),
- ('Pad',':=""'),
- ('NativeFileSystem','u'),
- )
-
-############# SMB_COM_NT_CREATE_ANDX (0xA2)
-class SMBNtCreateAndX_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('_reserved', 'B=0'),
- ('FileNameLength','<H'), # NameLength
- ('CreateFlags','<L'), # Flags
- ('RootFid','<L=0'), # RootDirectoryFID
- ('AccessMask','<L'), # DesiredAccess
- ('AllocationSizeLo','<L=0'), # AllocationSize
- ('AllocationSizeHi','<L=0'),
- ('FileAttributes','<L=0'), # ExtFileAttributes
- ('ShareAccess','<L=3'), #
- ('Disposition','<L=1'), # CreateDisposition
- ('CreateOptions','<L'), # CreateOptions
- ('Impersonation','<L=2'),
- ('SecurityFlags','B=3'),
- )
-
-class SMBNtCreateAndXResponse_Parameters(SMBAndXCommand_Parameters):
- # XXX Is there a memory leak in the response for NTCreate (where the Data section would be) in Win 2000, Win XP, and Win 2003?
- structure = (
- ('OplockLevel', 'B=0'),
- ('Fid','<H'),
- ('CreateAction','<L'),
- ('CreateTime','<q=0'),
- ('LastAccessTime','<q=0'),
- ('LastWriteTime','<q=0'),
- ('LastChangeTime','<q=0'),
- ('FileAttributes','<L=0x80'),
- ('AllocationSize','<q=0'),
- ('EndOfFile','<q=0'),
- ('FileType','<H=0'),
- ('IPCState','<H=0'),
- ('IsDirectory','B'),
- )
-
-class SMBNtCreateAndXExtendedResponse_Parameters(SMBAndXCommand_Parameters):
- # [MS-SMB] Extended response description
- structure = (
- ('OplockLevel', 'B=0'),
- ('Fid','<H'),
- ('CreateAction','<L'),
- ('CreateTime','<q=0'),
- ('LastAccessTime','<q=0'),
- ('LastWriteTime','<q=0'),
- ('LastChangeTime','<q=0'),
- ('FileAttributes','<L=0x80'),
- ('AllocationSize','<q=0'),
- ('EndOfFile','<q=0'),
- ('FileType','<H=0'),
- ('IPCState','<H=0'),
- ('IsDirectory','B'),
- ('VolumeGUID','16s'),
- ('FileIdLow','<L=0'),
- ('FileIdHigh','<L=0'),
- ('MaximalAccessRights','<L=0x12019b'),
- ('GuestMaximalAccessRights','<L=0x120089'),
- )
-
-class SMBNtCreateAndX_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('Pad','B'),
- ('FileName','u'),
- )
-
-############# SMB_COM_OPEN_ANDX (0xD2)
-class SMBOpenAndX_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Flags','<H=0'),
- ('DesiredAccess','<H=0'),
- ('SearchAttributes','<H=0'),
- ('FileAttributes','<H=0'),
- ('CreationTime','<L=0'),
- ('OpenMode','<H=1'), # SMB_O_OPEN = 1
- ('AllocationSize','<L=0'),
- ('Reserved','8s=""'),
- )
-
-class SMBOpenAndX_Data(SMBNtCreateAndX_Data):
- pass
-
-class SMBOpenAndXResponse_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Fid','<H=0'),
- ('FileAttributes','<H=0'),
- ('LastWriten','<L=0'),
- ('FileSize','<L=0'),
- ('GrantedAccess','<H=0'),
- ('FileType','<H=0'),
- ('IPCState','<H=0'),
- ('Action','<H=0'),
- ('ServerFid','<L=0'),
- ('_reserved','<H=0'),
- )
-
-############# SMB_COM_WRITE (0x0B)
-class SMBWrite_Parameters(SMBCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Count','<H'),
- ('Offset','<L'),
- ('Remaining','<H'),
- )
-
-class SMBWriteResponse_Parameters(SMBCommand_Parameters):
- structure = (
- ('Count','<H'),
- )
-
-class SMBWrite_Data(Structure):
- structure = (
- ('BufferFormat','<B=1'),
- ('DataLength','<H-Data'),
- ('Data',':'),
- )
-
-
-############# SMB_COM_WRITE_ANDX (0x2F)
-class SMBWriteAndX_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Fid','<H=0'),
- ('Offset','<L=0'),
- ('_reserved','<L=0xff'),
- ('WriteMode','<H=8'),
- ('Remaining','<H=0'),
- ('DataLength_Hi','<H=0'),
- ('DataLength','<H=0'),
- ('DataOffset','<H=0'),
- ('HighOffset','<L=0'),
- )
-
-class SMBWriteAndX_Data_Short(Structure):
- structure = (
- ('_PadLen','_-Pad','self["DataOffset"] - 59'),
- ('Pad',':'),
- #('Pad','<B=0'),
- ('DataLength','_-Data','self["DataLength"]'),
- ('Data',':'),
- )
-
-class SMBWriteAndX_Data(Structure):
- structure = (
- ('_PadLen','_-Pad','self["DataOffset"] - 63'),
- ('Pad',':'),
- #('Pad','<B=0'),
- ('DataLength','_-Data','self["DataLength"]'),
- ('Data',':'),
- )
-
-
-class SMBWriteAndX_Parameters_Short(SMBAndXCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Offset','<L'),
- ('_reserved','<L=0xff'),
- ('WriteMode','<H=8'),
- ('Remaining','<H'),
- ('DataLength_Hi','<H=0'),
- ('DataLength','<H'),
- ('DataOffset','<H=0'),
- )
-
-class SMBWriteAndXResponse_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Count','<H'),
- ('Available','<H'),
- ('Reserved','<L=0'),
- )
-
-############# SMB_COM_WRITE_RAW (0x1D)
-class SMBWriteRaw_Parameters(SMBCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Count','<H'),
- ('_reserved','<H=0'),
- ('Offset','<L'),
- ('Timeout','<L=0'),
- ('WriteMode','<H=0'),
- ('_reserved2','<L=0'),
- ('DataLength','<H'),
- ('DataOffset','<H=0'),
- )
-
-############# SMB_COM_READ (0x0A)
-class SMBRead_Parameters(SMBCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Count','<H'),
- ('Offset','<L'),
- ('Remaining','<H=Count'),
- )
-
-class SMBReadResponse_Parameters(Structure):
- structure = (
- ('Count','<H=0'),
- ('_reserved','8s=""'),
- )
-
-class SMBReadResponse_Data(Structure):
- structure = (
- ('BufferFormat','<B=0x1'),
- ('DataLength','<H-Data'),
- ('Data',':'),
- )
-
-############# SMB_COM_READ_RAW (0x1A)
-class SMBReadRaw_Parameters(SMBCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Offset','<L'),
- ('MaxCount','<H'),
- ('MinCount','<H=MaxCount'),
- ('Timeout','<L=0'),
- ('_reserved','<H=0'),
- )
-
-############# SMB_COM_NT_TRANSACT (0xA0)
-class SMBNTTransaction_Parameters(SMBCommand_Parameters):
- structure = (
- ('MaxSetupCount','<B=0'),
- ('Reserved1','<H=0'),
- ('TotalParameterCount','<L'),
- ('TotalDataCount','<L'),
- ('MaxParameterCount','<L=1024'),
- ('MaxDataCount','<L=65504'),
- ('ParameterCount','<L'),
- ('ParameterOffset','<L'),
- ('DataCount','<L'),
- ('DataOffset','<L'),
- ('SetupCount','<B=len(Setup)/2'),
- ('Function','<H=0'),
- ('SetupLength','_-Setup','SetupCount*2'),
- ('Setup',':'),
- )
-
-class SMBNTTransactionResponse_Parameters(SMBCommand_Parameters):
- structure = (
- ('Reserved1','3s=""'),
- ('TotalParameterCount','<L'),
- ('TotalDataCount','<L'),
- ('ParameterCount','<L'),
- ('ParameterOffset','<L'),
- ('ParameterDisplacement','<L=0'),
- ('DataCount','<L'),
- ('DataOffset','<L'),
- ('DataDisplacement','<L=0'),
- ('SetupCount','<B=0'),
- ('SetupLength','_-Setup','SetupCount*2'),
- ('Setup',':'),
- )
-
-class SMBNTTransaction_Data(Structure):
- structure = (
- ('Pad1Length','_-Pad1','self["Pad1Length"]'),
- ('Pad1',':'),
- ('NT_Trans_ParametersLength','_-NT_Trans_Parameters','self["NT_Trans_ParametersLength"]'),
- ('NT_Trans_Parameters',':'),
- ('Pad2Length','_-Pad2','self["Pad2Length"]'),
- ('Pad2',':'),
- ('NT_Trans_DataLength','_-NT_Trans_Data','self["NT_Trans_DataLength"]'),
- ('NT_Trans_Data',':'),
- )
-
-class SMBNTTransactionResponse_Data(Structure):
- structure = (
- ('Pad1Length','_-Pad1','self["Pad1Length"]'),
- ('Pad1',':'),
- ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
- ('Trans_Parameters',':'),
- ('Pad2Length','_-Pad2','self["Pad2Length"]'),
- ('Pad2',':'),
- ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
- ('Trans_Data',':'),
- )
-
-
-############# SMB_COM_TRANSACTION2_SECONDARY (0x33)
-class SMBTransaction2Secondary_Parameters(SMBCommand_Parameters):
- structure = (
- ('TotalParameterCount','<H'),
- ('TotalDataCount','<H'),
- ('ParameterCount','<H'),
- ('ParameterOffset','<H'),
- ('DataCount','<H'),
- ('DataOffset','<H'),
- ('DataDisplacement','<H=0'),
- ('FID','<H'),
- )
-
-class SMBTransaction2Secondary_Data(Structure):
- structure = (
- ('Pad1Length','_-Pad1','self["Pad1Length"]'),
- ('Pad1',':'),
- ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
- ('Trans_Parameters',':'),
- ('Pad2Length','_-Pad2','self["Pad2Length"]'),
- ('Pad2',':'),
- ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
- ('Trans_Data',':'),
- )
-
-
-############# SMB_COM_TRANSACTION2 (0x32)
-
-class SMBTransaction2_Parameters(SMBCommand_Parameters):
- structure = (
- ('TotalParameterCount','<H'),
- ('TotalDataCount','<H'),
- ('MaxParameterCount','<H=1024'),
- ('MaxDataCount','<H=65504'),
- ('MaxSetupCount','<B=0'),
- ('Reserved1','<B=0'),
- ('Flags','<H=0'),
- ('Timeout','<L=0'),
- ('Reserved2','<H=0'),
- ('ParameterCount','<H'),
- ('ParameterOffset','<H'),
- ('DataCount','<H'),
- ('DataOffset','<H'),
- ('SetupCount','<B=len(Setup)/2'),
- ('Reserved3','<B=0'),
- ('SetupLength','_-Setup','SetupCount*2'),
- ('Setup',':'),
- )
-
-class SMBTransaction2Response_Parameters(SMBCommand_Parameters):
- structure = (
- ('TotalParameterCount','<H'),
- ('TotalDataCount','<H'),
- ('Reserved1','<H=0'),
- ('ParameterCount','<H'),
- ('ParameterOffset','<H'),
- ('ParameterDisplacement','<H=0'),
- ('DataCount','<H'),
- ('DataOffset','<H'),
- ('DataDisplacement','<H=0'),
- ('SetupCount','<B=0'),
- ('Reserved2','<B=0'),
- ('SetupLength','_-Setup','SetupCount*2'),
- ('Setup',':'),
- )
-
-class SMBTransaction2_Data(Structure):
- structure = (
-# ('NameLength','_-Name','1'),
-# ('Name',':'),
- ('Pad1Length','_-Pad1','self["Pad1Length"]'),
- ('Pad1',':'),
- ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
- ('Trans_Parameters',':'),
- ('Pad2Length','_-Pad2','self["Pad2Length"]'),
- ('Pad2',':'),
- ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
- ('Trans_Data',':'),
- )
-
-class SMBTransaction2Response_Data(Structure):
- structure = (
- ('Pad1Length','_-Pad1','self["Pad1Length"]'),
- ('Pad1',':'),
- ('Trans_ParametersLength','_-Trans_Parameters','self["Trans_ParametersLength"]'),
- ('Trans_Parameters',':'),
- ('Pad2Length','_-Pad2','self["Pad2Length"]'),
- ('Pad2',':'),
- ('Trans_DataLength','_-Trans_Data','self["Trans_DataLength"]'),
- ('Trans_Data',':'),
- )
-
-############# SMB_COM_QUERY_INFORMATION (0x08)
-
-class SMBQueryInformation_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('BufferFormat','B=4'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('BufferFormat','B=4'),
- ('FileName','u'),
- )
-
-
-class SMBQueryInformationResponse_Parameters(Structure):
- structure = (
- ('FileAttributes','<H'),
- ('LastWriteTime','<L'),
- ('FileSize','<L'),
- ('Reserved','"0123456789'),
- )
-
-############# SMB_COM_TRANSACTION (0x25)
-class SMBTransaction_Parameters(SMBCommand_Parameters):
- structure = (
- ('TotalParameterCount','<H'),
- ('TotalDataCount','<H'),
- ('MaxParameterCount','<H=1024'),
- ('MaxDataCount','<H=65504'),
- ('MaxSetupCount','<B=0'),
- ('Reserved1','<B=0'),
- ('Flags','<H=0'),
- ('Timeout','<L=0'),
- ('Reserved2','<H=0'),
- ('ParameterCount','<H'),
- ('ParameterOffset','<H'),
- ('DataCount','<H'),
- ('DataOffset','<H'),
- ('SetupCount','<B=len(Setup)/2'),
- ('Reserved3','<B=0'),
- ('SetupLength','_-Setup','SetupCount*2'),
- ('Setup',':'),
- )
-
-class SMBTransactionResponse_Parameters(SMBCommand_Parameters):
- structure = (
- ('TotalParameterCount','<H'),
- ('TotalDataCount','<H'),
- ('Reserved1','<H=0'),
- ('ParameterCount','<H'),
- ('ParameterOffset','<H'),
- ('ParameterDisplacement','<H=0'),
- ('DataCount','<H'),
- ('DataOffset','<H'),
- ('DataDisplacement','<H=0'),
- ('SetupCount','<B'),
- ('Reserved2','<B=0'),
- ('SetupLength','_-Setup','SetupCount*2'),
- ('Setup',':'),
- )
-
-# TODO: We should merge these both. But this will require fixing
-# the instances where this structure is used on the client side
-class SMBTransaction_SData(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('Name','z'),
- ('Trans_ParametersLength','_-Trans_Parameters'),
- ('Trans_Parameters',':'),
- ('Trans_DataLength','_-Trans_Data'),
- ('Trans_Data',':'),
- )
- UnicodeStructure = (
- ('Pad','B'),
- ('Name','u'),
- ('Trans_ParametersLength','_-Trans_Parameters'),
- ('Trans_Parameters',':'),
- ('Trans_DataLength','_-Trans_Data'),
- ('Trans_Data',':'),
- )
-
-class SMBTransaction_Data(Structure):
- structure = (
- ('NameLength','_-Name'),
- ('Name',':'),
- ('Trans_ParametersLength','_-Trans_Parameters'),
- ('Trans_Parameters',':'),
- ('Trans_DataLength','_-Trans_Data'),
- ('Trans_Data',':'),
- )
-
-class SMBTransactionResponse_Data(Structure):
- structure = (
- ('Trans_ParametersLength','_-Trans_Parameters'),
- ('Trans_Parameters',':'),
- ('Trans_DataLength','_-Trans_Data'),
- ('Trans_Data',':'),
- )
-
-############# SMB_COM_READ_ANDX (0x2E)
-class SMBReadAndX_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Offset','<L'),
- ('MaxCount','<H'),
- ('MinCount','<H=MaxCount'),
- ('_reserved','<L=0x0'),
- ('Remaining','<H=MaxCount'),
- ('HighOffset','<L=0'),
- )
-
-class SMBReadAndX_Parameters2(SMBAndXCommand_Parameters):
- structure = (
- ('Fid','<H'),
- ('Offset','<L'),
- ('MaxCount','<H'),
- ('MinCount','<H=MaxCount'),
- ('_reserved','<L=0xffffffff'),
- ('Remaining','<H=MaxCount'),
- )
-
-class SMBReadAndXResponse_Parameters(SMBAndXCommand_Parameters):
- structure = (
- ('Remaining','<H=0'),
- ('DataMode','<H=0'),
- ('_reserved','<H=0'),
- ('DataCount','<H'),
- ('DataOffset','<H'),
- ('DataCount_Hi','<L'),
- ('_reserved2','6s=""'),
- )
-
-############# SMB_COM_ECHO (0x2B)
-class SMBEcho_Data(Structure):
- structure = (
- ('Data',':'),
- )
-
-class SMBEcho_Parameters(Structure):
- structure = (
- ('EchoCount','<H'),
- )
-
-class SMBEchoResponse_Data(Structure):
- structure = (
- ('Data',':'),
- )
-
-class SMBEchoResponse_Parameters(Structure):
- structure = (
- ('SequenceNumber','<H=1'),
- )
-
-############# SMB_COM_QUERY_INFORMATION_DISK (0x80)
-class SMBQueryInformationDiskResponse_Parameters(Structure):
- structure = (
- ('TotalUnits','<H'),
- ('BlocksPerUnit','<H'),
- ('BlockSize','<H'),
- ('FreeUnits','<H'),
- ('Reserved','<H=0'),
- )
-
-
-############# SMB_COM_LOGOFF_ANDX (0x74)
-class SMBLogOffAndX(SMBAndXCommand_Parameters):
- strucure = ()
-
-############# SMB_COM_CLOSE (0x04)
-class SMBClose_Parameters(SMBCommand_Parameters):
- structure = (
- ('FID','<H'),
- ('Time','<L=0'),
- )
-
-############# SMB_COM_FLUSH (0x05)
-class SMBFlush_Parameters(SMBCommand_Parameters):
- structure = (
- ('FID','<H'),
- )
-
-############# SMB_COM_CREATE_DIRECTORY (0x00)
-class SMBCreateDirectory_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('BufferFormat','<B=4'),
- ('DirectoryName','z'),
- )
- UnicodeStructure = (
- ('BufferFormat','<B=4'),
- ('DirectoryName','u'),
- )
-
-############# SMB_COM_DELETE (0x06)
-class SMBDelete_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('BufferFormat','<B=4'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('BufferFormat','<B=4'),
- ('FileName','u'),
- )
-
-class SMBDelete_Parameters(Structure):
- structure = (
- ('SearchAttributes','<H'),
- )
-
-############# SMB_COM_DELETE_DIRECTORY (0x01)
-class SMBDeleteDirectory_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('BufferFormat','<B=4'),
- ('DirectoryName','z'),
- )
- UnicodeStructure = (
- ('BufferFormat','<B=4'),
- ('DirectoryName','u'),
- )
-
-############# SMB_COM_CHECK_DIRECTORY (0x10)
-class SMBCheckDirectory_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('BufferFormat','<B=4'),
- ('DirectoryName','z'),
- )
- UnicodeStructure = (
- ('BufferFormat','<B=4'),
- ('DirectoryName','u'),
- )
-
-############# SMB_COM_RENAME (0x07)
-class SMBRename_Parameters(SMBCommand_Parameters):
- structure = (
- ('SearchAttributes','<H'),
- )
-
-class SMBRename_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('BufferFormat1','<B=4'),
- ('OldFileName','z'),
- ('BufferFormat2','<B=4'),
- ('NewFileName','z'),
- )
- UnicodeStructure = (
- ('BufferFormat1','<B=4'),
- ('OldFileName','u'),
- ('BufferFormat2','<B=4'),
- ('Pad','B=0'),
- ('NewFileName','u'),
- )
-
-
-############# SMB_COM_OPEN (0x02)
-class SMBOpen_Parameters(SMBCommand_Parameters):
- structure = (
- ('DesiredAccess','<H=0'),
- ('SearchAttributes','<H=0'),
- )
-
-class SMBOpen_Data(AsciiOrUnicodeStructure):
- AsciiStructure = (
- ('FileNameFormat','"\x04'),
- ('FileName','z'),
- )
- UnicodeStructure = (
- ('FileNameFormat','"\x04'),
- ('FileName','z'),
- )
-
-class SMBOpenResponse_Parameters(SMBCommand_Parameters):
- structure = (
- ('Fid','<H=0'),
- ('FileAttributes','<H=0'),
- ('LastWriten','<L=0'),
- ('FileSize','<L=0'),
- ('GrantedAccess','<H=0'),
- )
-
-############# EXTENDED SECURITY CLASSES
-class SMBExtended_Security_Parameters(Structure):
- structure = (
- ('DialectIndex','<H'),
- ('SecurityMode','<B'),
- ('MaxMpxCount','<H'),
- ('MaxNumberVcs','<H'),
- ('MaxBufferSize','<L'),
- ('MaxRawSize','<L'),
- ('SessionKey','<L'),
- ('Capabilities','<L'),
- ('LowDateTime','<L'),
- ('HighDateTime','<L'),
- ('ServerTimeZone','<H'),
- ('ChallengeLength','<B'),
- )
-
-class SMBExtended_Security_Data(Structure):
- structure = (
- ('ServerGUID','16s'),
- ('SecurityBlob',':'),
- )
-
-class SMBNTLMDialect_Parameters(Structure):
- structure = (
- ('DialectIndex','<H'),
- ('SecurityMode','<B'),
- ('MaxMpxCount','<H'),
- ('MaxNumberVcs','<H'),
- ('MaxBufferSize','<L'),
- ('MaxRawSize','<L'),
- ('SessionKey','<L'),
- ('Capabilities','<L'),
- ('LowDateTime','<L'),
- ('HighDateTime','<L'),
- ('ServerTimeZone','<H'),
- ('ChallengeLength','<B'),
- )
-
-class SMBNTLMDialect_Data(Structure):
- structure = (
- ('ChallengeLength','_-Challenge','self["ChallengeLength"]'),
- ('Challenge',':'),
- ('Payload',':'),
-# For some reason on an old Linux this field is not present, we have to check this out. There must be a flag stating this.
- ('DomainName','_'),
- ('ServerName','_'),
- )
- def __init__(self,data = None, alignment = 0):
- Structure.__init__(self,data,alignment)
- #self['ChallengeLength']=8
-
- def fromString(self,data):
- Structure.fromString(self,data)
- self['DomainName'] = ''
- self['ServerName'] = ''
-
-class SMB:
- # SMB Command Codes
- SMB_COM_CREATE_DIRECTORY = 0x00
- SMB_COM_DELETE_DIRECTORY = 0x01
- SMB_COM_OPEN = 0x02
- SMB_COM_CREATE = 0x03
- SMB_COM_CLOSE = 0x04
- SMB_COM_FLUSH = 0x05
- SMB_COM_DELETE = 0x06
- SMB_COM_RENAME = 0x07
- SMB_COM_QUERY_INFORMATION = 0x08
- SMB_COM_SET_INFORMATION = 0x09
- SMB_COM_READ = 0x0A
- SMB_COM_WRITE = 0x0B
- SMB_COM_LOCK_BYTE_RANGE = 0x0C
- SMB_COM_UNLOCK_BYTE_RANGE = 0x0D
- SMB_COM_CREATE_TEMPORARY = 0x0E
- SMB_COM_CREATE_NEW = 0x0F
- SMB_COM_CHECK_DIRECTORY = 0x10
- SMB_COM_PROCESS_EXIT = 0x11
- SMB_COM_SEEK = 0x12
- SMB_COM_LOCK_AND_READ = 0x13
- SMB_COM_WRITE_AND_UNLOCK = 0x14
- SMB_COM_READ_RAW = 0x1A
- SMB_COM_READ_MPX = 0x1B
- SMB_COM_READ_MPX_SECONDARY = 0x1C
- SMB_COM_WRITE_RAW = 0x1D
- SMB_COM_WRITE_MPX = 0x1E
- SMB_COM_WRITE_MPX_SECONDARY = 0x1F
- SMB_COM_WRITE_COMPLETE = 0x20
- SMB_COM_QUERY_SERVER = 0x21
- SMB_COM_SET_INFORMATION2 = 0x22
- SMB_COM_QUERY_INFORMATION2 = 0x23
- SMB_COM_LOCKING_ANDX = 0x24
- SMB_COM_TRANSACTION = 0x25
- SMB_COM_TRANSACTION_SECONDARY = 0x26
- SMB_COM_IOCTL = 0x27
- SMB_COM_IOCTL_SECONDARY = 0x28
- SMB_COM_COPY = 0x29
- SMB_COM_MOVE = 0x2A
- SMB_COM_ECHO = 0x2B
- SMB_COM_WRITE_AND_CLOSE = 0x2C
- SMB_COM_OPEN_ANDX = 0x2D
- SMB_COM_READ_ANDX = 0x2E
- SMB_COM_WRITE_ANDX = 0x2F
- SMB_COM_NEW_FILE_SIZE = 0x30
- SMB_COM_CLOSE_AND_TREE_DISC = 0x31
- SMB_COM_TRANSACTION2 = 0x32
- SMB_COM_TRANSACTION2_SECONDARY = 0x33
- SMB_COM_FIND_CLOSE2 = 0x34
- SMB_COM_FIND_NOTIFY_CLOSE = 0x35
- # Used by Xenix/Unix 0x60 - 0x6E
- SMB_COM_TREE_CONNECT = 0x70
- SMB_COM_TREE_DISCONNECT = 0x71
- SMB_COM_NEGOTIATE = 0x72
- SMB_COM_SESSION_SETUP_ANDX = 0x73
- SMB_COM_LOGOFF_ANDX = 0x74
- SMB_COM_TREE_CONNECT_ANDX = 0x75
- SMB_COM_QUERY_INFORMATION_DISK = 0x80
- SMB_COM_SEARCH = 0x81
- SMB_COM_FIND = 0x82
- SMB_COM_FIND_UNIQUE = 0x83
- SMB_COM_FIND_CLOSE = 0x84
- SMB_COM_NT_TRANSACT = 0xA0
- SMB_COM_NT_TRANSACT_SECONDARY = 0xA1
- SMB_COM_NT_CREATE_ANDX = 0xA2
- SMB_COM_NT_CANCEL = 0xA4
- SMB_COM_NT_RENAME = 0xA5
- SMB_COM_OPEN_PRINT_FILE = 0xC0
- SMB_COM_WRITE_PRINT_FILE = 0xC1
- SMB_COM_CLOSE_PRINT_FILE = 0xC2
- SMB_COM_GET_PRINT_QUEUE = 0xC3
- SMB_COM_READ_BULK = 0xD8
- SMB_COM_WRITE_BULK = 0xD9
- SMB_COM_WRITE_BULK_DATA = 0xDA
-
- # TRANSACT codes
- TRANS_TRANSACT_NMPIPE = 0x26
-
- # TRANSACT2 codes
- TRANS2_FIND_FIRST2 = 0x0001
- TRANS2_FIND_NEXT2 = 0x0002
- TRANS2_QUERY_FS_INFORMATION = 0x0003
- TRANS2_QUERY_PATH_INFORMATION = 0x0005
- TRANS2_QUERY_FILE_INFORMATION = 0x0007
- TRANS2_SET_FILE_INFORMATION = 0x0008
- TRANS2_SET_PATH_INFORMATION = 0x0006
-
- # Security Share Mode (Used internally by SMB class)
- SECURITY_SHARE_MASK = 0x01
- SECURITY_SHARE_SHARE = 0x00
- SECURITY_SHARE_USER = 0x01
- SECURITY_SIGNATURES_ENABLED = 0X04
- SECURITY_SIGNATURES_REQUIRED = 0X08
-
- # Security Auth Mode (Used internally by SMB class)
- SECURITY_AUTH_MASK = 0x02
- SECURITY_AUTH_ENCRYPTED = 0x02
- SECURITY_AUTH_PLAINTEXT = 0x00
-
- # Raw Mode Mask (Used internally by SMB class. Good for dialect up to and including LANMAN2.1)
- RAW_READ_MASK = 0x01
- RAW_WRITE_MASK = 0x02
-
- # Capabilities Mask (Used internally by SMB class. Good for dialect NT LM 0.12)
- CAP_RAW_MODE = 0x00000001
- CAP_MPX_MODE = 0x0002
- CAP_UNICODE = 0x0004
- CAP_LARGE_FILES = 0x0008
- CAP_EXTENDED_SECURITY = 0x80000000
- CAP_USE_NT_ERRORS = 0x40
- CAP_NT_SMBS = 0x10
- CAP_LARGE_READX = 0x00004000
- CAP_LARGE_WRITEX = 0x00008000
- CAP_RPC_REMOTE_APIS = 0x20
-
- # Flags1 Mask
- FLAGS1_LOCK_AND_READ_OK = 0x01
- FLAGS1_PATHCASELESS = 0x08
- FLAGS1_CANONICALIZED_PATHS = 0x10
- FLAGS1_REPLY = 0x80
-
- # Flags2 Mask
- FLAGS2_LONG_NAMES = 0x0001
- FLAGS2_EAS = 0x0002
- FLAGS2_SMB_SECURITY_SIGNATURE = 0x0004
- FLAGS2_IS_LONG_NAME = 0x0040
- FLAGS2_DFS = 0x1000
- FLAGS2_PAGING_IO = 0x2000
- FLAGS2_NT_STATUS = 0x4000
- FLAGS2_UNICODE = 0x8000
- FLAGS2_COMPRESSED = 0x0008
- FLAGS2_SMB_SECURITY_SIGNATURE_REQUIRED = 0x0010
- FLAGS2_EXTENDED_SECURITY = 0x0800
-
- # Dialect's Security Mode flags
- NEGOTIATE_USER_SECURITY = 0x01
- NEGOTIATE_ENCRYPT_PASSWORDS = 0x02
- NEGOTIATE_SECURITY_SIGNATURE_ENABLE = 0x04
- NEGOTIATE_SECURITY_SIGNATURE_REQUIRED = 0x08
-
- # Tree Connect AndX Response optionalSuppor flags
- SMB_SUPPORT_SEARCH_BITS = 0x01
- SMB_SHARE_IS_IN_DFS = 0x02
-
- def __init__(self, remote_name, remote_host, my_name = None, host_type = nmb.TYPE_SERVER, sess_port = 445, timeout=None, UDP = 0, session = None, negPacket = None):
- # The uid attribute will be set when the client calls the login() method
- self._uid = 0
- self.__server_name = ''
- self.__server_os = ''
- self.__server_os_major = None
- self.__server_os_minor = None
- self.__server_os_build = None
- self.__server_lanman = ''
- self.__server_domain = ''
- self.__server_dns_domain_name = ''
- self.__remote_name = string.upper(remote_name)
- self.__remote_host = remote_host
- self.__isNTLMv2 = True
- self._dialects_parameters = None
- self._dialects_data = None
- # Credentials
- self.__userName = ''
- self.__password = ''
- self.__domain = ''
- self.__lmhash = ''
- self.__nthash = ''
- self.__aesKey = ''
- self.__kdc = ''
- self.__TGT = None
- self.__TGS = None
-
- # Negotiate Protocol Result, used everywhere
- # Could be extended or not, flags should be checked before
- self._dialect_data = 0
- self._dialect_parameters = 0
- self._action = 0
- self._sess = None
- self.encrypt_passwords = True
- self.tid = 0
- self.fid = 0
-
- # Signing stuff
- self._SignSequenceNumber = 0
- self._SigningSessionKey = ''
- self._SigningChallengeResponse = ''
- self._SignatureEnabled = False
- self._SignatureVerificationEnabled = False
- self._SignatureRequired = False
-
- # Base flags (default flags, can be overriden using set_flags())
- self.__flags1 = SMB.FLAGS1_PATHCASELESS | SMB.FLAGS1_CANONICALIZED_PATHS
- self.__flags2 = SMB.FLAGS2_EXTENDED_SECURITY | SMB.FLAGS2_NT_STATUS | SMB.FLAGS2_LONG_NAMES
-
- if timeout is None:
- self.__timeout = 60
- else:
- self.__timeout = timeout
-
- # If port 445 and the name sent is *SMBSERVER we're setting the name to the IP.
- # This is to help some old applications still believing
- # *SMSBSERVER will work against modern OSes. If port is NETBIOS_SESSION_PORT the user better
- # know about *SMBSERVER's limitations
- if sess_port == 445 and remote_name == '*SMBSERVER':
- self.__remote_name = remote_host
-
- if session is None:
- if not my_name:
- my_name = socket.gethostname()
- i = string.find(my_name, '.')
- if i > -1:
- my_name = my_name[:i]
-
- if UDP:
- self._sess = nmb.NetBIOSUDPSession(my_name, remote_name, remote_host, host_type, sess_port, self.__timeout)
- else:
- self._sess = nmb.NetBIOSTCPSession(my_name, remote_name, remote_host, host_type, sess_port, self.__timeout)
-
- # Initialize session values (_dialect_data and _dialect_parameters)
- self.neg_session()
-
- # Call login() without any authentication information to
- # setup a session if the remote server
- # is in share mode.
- if (self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SHARE_MASK) == SMB.SECURITY_SHARE_SHARE:
- self.login('', '')
- else:
- self._sess = session
- self.neg_session(negPacket = negPacket)
- # Call login() without any authentication information to
- # setup a session if the remote server
- # is in share mode.
- if (self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SHARE_MASK) == SMB.SECURITY_SHARE_SHARE:
- self.login('', '')
-
- @staticmethod
- def ntlm_supported():
- return False
-
- def get_remote_name(self):
- return self.__remote_name
-
- def get_remote_host(self):
- return self.__remote_host
-
- def get_flags(self):
- return self.__flags1, self.__flags2
-
- def set_flags(self, flags1=None, flags2=None):
- if flags1 is not None:
- self.__flags1 = flags1
- if flags2 is not None:
- self.__flags2 = flags2
-
- def set_timeout(self, timeout):
- prev_timeout = self.__timeout
- self.__timeout = timeout
- return prev_timeout
-
- def get_timeout(self):
- return self.__timeout
-
- @contextmanager
- def use_timeout(self, timeout):
- prev_timeout = self.set_timeout(timeout)
- try:
- yield
- finally:
- self.set_timeout(prev_timeout)
-
- def get_session(self):
- return self._sess
-
- def get_tid(self):
- return self.tid
-
- def get_fid(self):
- return self.fid
-
- def isGuestSession(self):
- return self._action & SMB_SETUP_GUEST
-
- def doesSupportNTLMv2(self):
- return self.__isNTLMv2
-
- def __del__(self):
- if self._sess:
- self._sess.close()
-
- def recvSMB(self):
- r = self._sess.recv_packet(self.__timeout)
- return NewSMBPacket(data = r.get_trailer())
-
- @staticmethod
- def __decode_trans(params, data):
- totparamcnt, totdatacnt, _, paramcnt, paramoffset, paramds, datacnt, dataoffset, datads, setupcnt = unpack('<HHHHHHHHHB', params[:19])
- if paramcnt + paramds < totparamcnt or datacnt + datads < totdatacnt:
- has_more = 1
- else:
- has_more = 0
- paramoffset = paramoffset - 55 - setupcnt * 2
- dataoffset = dataoffset - 55 - setupcnt * 2
- return has_more, params[20:20 + setupcnt * 2], data[paramoffset:paramoffset + paramcnt], data[dataoffset:dataoffset + datacnt]
-
- # TODO: Move this to NewSMBPacket, it belongs there
- def signSMB(self, packet, signingSessionKey, signingChallengeResponse):
- # This logic MUST be applied for messages sent in response to any of the higher-layer actions and in
- # compliance with the message sequencing rules.
- # * The client or server that sends the message MUST provide the 32-bit sequence number for this
- # message, as specified in sections 3.2.4.1 and 3.3.4.1.
- # * The SMB_FLAGS2_SMB_SECURITY_SIGNATURE flag in the header MUST be set.
- # * To generate the signature, a 32-bit sequence number is copied into the
- # least significant 32 bits of the SecuritySignature field and the remaining
- # 4 bytes are set to 0x00.
- # * The MD5 algorithm, as specified in [RFC1321], MUST be used to generate a hash of the SMB
- # message from the start of the SMB Header, which is defined as follows.
- # CALL MD5Init( md5context )
- # CALL MD5Update( md5context, Connection.SigningSessionKey )
- # CALL MD5Update( md5context, Connection.SigningChallengeResponse )
- # CALL MD5Update( md5context, SMB message )
- # CALL MD5Final( digest, md5context )
- # SET signature TO the first 8 bytes of the digest
- # The resulting 8-byte signature MUST be copied into the SecuritySignature field of the SMB Header,
- # after which the message can be transmitted.
-
- #print "seq(%d) signingSessionKey %r, signingChallengeResponse %r" % (self._SignSequenceNumber, signingSessionKey, signingChallengeResponse)
- packet['SecurityFeatures'] = pack('<q',self._SignSequenceNumber)
- # Sign with the sequence
- m = hashlib.md5()
- m.update( signingSessionKey )
- m.update( signingChallengeResponse )
- m.update( str(packet) )
- # Replace sequence with acual hash
- packet['SecurityFeatures'] = m.digest()[:8]
- if self._SignatureVerificationEnabled:
- self._SignSequenceNumber +=1
- else:
- self._SignSequenceNumber +=2
-
- def checkSignSMB(self, packet, signingSessionKey, signingChallengeResponse):
- # Let's check
- signature = packet['SecurityFeatures']
- #print "Signature received: %r " % signature
- self.signSMB(packet, signingSessionKey, signingChallengeResponse)
- #print "Signature calculated: %r" % packet['SecurityFeatures']
- if self._SignatureVerificationEnabled is not True:
- self._SignSequenceNumber -= 1
- return packet['SecurityFeatures'] == signature
-
- def sendSMB(self,smb):
- smb['Uid'] = self._uid
- #At least on AIX, PIDs can exceed 16 bits, so we mask them out
- smb['Pid'] = (os.getpid() & 0xFFFF)
- # set flags
- smb['Flags1'] |= self.__flags1
- smb['Flags2'] |= self.__flags2
- if self._SignatureEnabled:
- smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
- self.signSMB(smb, self._SigningSessionKey, self._SigningChallengeResponse)
-
- self._sess.send_packet(str(smb))
-
- @staticmethod
- def isValidAnswer(s, cmd):
- while 1:
- if s.rawData():
- if s.get_command() == cmd:
- if s.get_error_class() == 0x00 and s.get_error_code() == 0x00:
- return 1
- else:
- raise SessionError( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS)
- else:
- break
- return 0
-
- def neg_session(self, extended_security = True, negPacket = None):
- def parsePacket(smb):
- if smb.isValidAnswer(SMB.SMB_COM_NEGOTIATE):
- sessionResponse = SMBCommand(smb['Data'][0])
- self._dialects_parameters = SMBNTLMDialect_Parameters(sessionResponse['Parameters'])
- self._dialects_data = SMBNTLMDialect_Data()
- self._dialects_data['ChallengeLength'] = self._dialects_parameters['ChallengeLength']
- self._dialects_data.fromString(sessionResponse['Data'])
- if self._dialects_parameters['Capabilities'] & SMB.CAP_EXTENDED_SECURITY:
- # Whether we choose it or it is enforced by the server, we go for extended security
- self._dialects_parameters = SMBExtended_Security_Parameters(sessionResponse['Parameters'])
- self._dialects_data = SMBExtended_Security_Data(sessionResponse['Data'])
- # Let's setup some variable for later use
- if self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SIGNATURES_REQUIRED:
- self._SignatureRequired = True
-
- # Interestingly, the security Blob might be missing sometimes.
- #spnego = SPNEGO_NegTokenInit(self._dialects_data['SecurityBlob'])
- #for i in spnego['MechTypes']:
- # print "Mech Found: %s" % MechTypes[i]
- return 1
-
- # If not, let's try the old way
- else:
- if self._dialects_data['ServerName'] is not None:
- self.__server_name = self._dialects_data['ServerName']
-
- if self._dialects_parameters['DialectIndex'] == 0xffff:
- raise UnsupportedFeature("Remote server does not know NT LM 0.12")
- return 1
- else:
- return 0
-
- if negPacket is None:
- smb = NewSMBPacket()
- negSession = SMBCommand(SMB.SMB_COM_NEGOTIATE)
- flags2 = self.get_flags()[1]
- if extended_security is True:
- self.set_flags(flags2=flags2|SMB.FLAGS2_EXTENDED_SECURITY)
- else:
- self.set_flags(flags2=flags2 & (~SMB.FLAGS2_EXTENDED_SECURITY))
-
- negSession['Data'] = '\x02NT LM 0.12\x00'
- smb.addCommand(negSession)
- self.sendSMB(smb)
-
- while 1:
- smb = self.recvSMB()
- return parsePacket(smb)
- else:
-
- return parsePacket( NewSMBPacket( data = negPacket))
-
- def tree_connect(self, path, password = '', service = SERVICE_ANY):
- LOG.warning("[MS-CIFS] This is an original Core Protocol command.This command has been deprecated.Client Implementations SHOULD use SMB_COM_TREE_CONNECT_ANDX")
-
- # return 0x800
- if password:
- # Password is only encrypted if the server passed us an "encryption" during protocol dialect
- if self._dialects_parameters['ChallengeLength'] > 0:
- # this code is untested
- password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
-
- if not unicode_support:
- if unicode_convert:
- path = str(path)
- else:
- raise Exception('SMB: Can\t conver path from unicode!')
-
- smb = NewSMBPacket()
- treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT)
- treeConnect['Parameters'] = SMBTreeConnect_Parameters()
- treeConnect['Data'] = SMBTreeConnect_Data()
- treeConnect['Data']['Path'] = path.upper()
- treeConnect['Data']['Password'] = password
- treeConnect['Data']['Service'] = service
- smb.addCommand(treeConnect)
- self.sendSMB(smb)
-
- while 1:
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT):
- # XXX Here we are ignoring the rest of the response
- return smb['Tid']
- return smb['Tid']
-
- def get_uid(self):
- return self._uid
-
- def set_uid(self, uid):
- self._uid = uid
-
- def tree_connect_andx(self, path, password = None, service = SERVICE_ANY, smb_packet=None):
- if password:
- # Password is only encrypted if the server passed us an "encryption" during protocol dialect
- if self._dialects_parameters['ChallengeLength'] > 0:
- # this code is untested
- password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
- else:
- password = '\x00'
-
- if not unicode_support:
- if unicode_convert:
- path = str(path)
- else:
- raise Exception('SMB: Can\t convert path from unicode!')
-
- if smb_packet is None:
- smb = NewSMBPacket()
- else:
- smb = smb_packet
-
- # Just in case this came with the full path ,let's just leave
- # the sharename, we'll take care of the rest
-
- share = path.split('\\')[-1]
- try:
- _, _, _, _, sockaddr = socket.getaddrinfo(self.get_remote_host(), 80, 0, 0, socket.IPPROTO_TCP)[0]
- remote_host = sockaddr[0]
- except Exception:
- remote_host = self.get_remote_host()
-
- path = '\\\\' + remote_host + '\\' +share
- path = path.upper().encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
-
- treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT_ANDX)
- treeConnect['Parameters'] = SMBTreeConnectAndX_Parameters()
- treeConnect['Data'] = SMBTreeConnectAndX_Data(flags=self.__flags2)
- treeConnect['Parameters']['PasswordLength'] = len(password)
- treeConnect['Data']['Password'] = password
- treeConnect['Data']['Path'] = path
- treeConnect['Data']['Service'] = service
-
- if self.__flags2 & SMB.FLAGS2_UNICODE:
- treeConnect['Data']['Pad'] = 0x0
-
- smb.addCommand(treeConnect)
-
- # filename = "\PIPE\epmapper"
-
- # ntCreate = SMBCommand(SMB.SMB_COM_NT_CREATE_ANDX)
- # ntCreate['Parameters'] = SMBNtCreateAndX_Parameters()
- # ntCreate['Data'] = SMBNtCreateAndX_Data()
- # ntCreate['Parameters']['FileNameLength'] = len(filename)
- # ntCreate['Parameters']['CreateFlags'] = 0
- # ntCreate['Parameters']['AccessMask'] = 0x3
- # ntCreate['Parameters']['CreateOptions'] = 0x0
- # ntCreate['Data']['FileName'] = filename
-
- # smb.addCommand(ntCreate)
- self.sendSMB(smb)
-
- while 1:
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT_ANDX):
- # XXX Here we are ignoring the rest of the response
- self.tid = smb['Tid']
- return self.tid
- self.tid = smb['Tid']
- return self.tid
-
- # backwars compatibility
- connect_tree = tree_connect_andx
-
- @staticmethod
- def getDialect():
- return SMB_DIALECT
-
- def get_server_name(self):
- #return self._dialects_data['ServerName']
- return self.__server_name
-
- def get_session_key(self):
- return self._SigningSessionKey
-
- def set_session_key(self, key):
- self._SigningSessionKey = key
-
- def get_encryption_key(self):
- if 'Challenge' in self._dialects_data.fields:
- return self._dialects_data['Challenge']
- else:
- return None
-
- def get_server_time(self):
- timestamp = self._dialects_parameters['HighDateTime']
- timestamp <<= 32
- timestamp |= self._dialects_parameters['LowDateTime']
- timestamp -= 116444736000000000
- timestamp /= 10000000
- d = datetime.datetime.utcfromtimestamp(timestamp)
- return d.strftime("%a, %d %b %Y %H:%M:%S GMT")
-
- def disconnect_tree(self, tid):
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- smb.addCommand(SMBCommand(SMB.SMB_COM_TREE_DISCONNECT))
-
- self.sendSMB(smb)
- self.recvSMB()
-
- def open(self, tid, filename, open_mode, desired_access):
- filename = string.replace(filename,'/', '\\')
- filename = filename.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else filename
-
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- openFile = SMBCommand(SMB.SMB_COM_OPEN)
- openFile['Parameters'] = SMBOpen_Parameters()
- openFile['Parameters']['DesiredAccess'] = desired_access
- openFile['Parameters']['OpenMode'] = open_mode
- openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
- openFile['Data'] = SMBOpen_Data(flags=self.__flags2)
- openFile['Data']['FileName'] = filename
-
- if self.__flags2 & SMB.FLAGS2_UNICODE:
- openFile['Data']['Pad'] = 0x0
-
- smb.addCommand(openFile)
-
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_OPEN):
- # XXX Here we are ignoring the rest of the response
- openFileResponse = SMBCommand(smb['Data'][0])
- openFileParameters = SMBOpenResponse_Parameters(openFileResponse['Parameters'])
-
- return (
- openFileParameters['Fid'],
- openFileParameters['FileAttributes'],
- openFileParameters['LastWriten'],
- openFileParameters['FileSize'],
- openFileParameters['GrantedAccess'],
- )
-
- def open_andx(self, tid, filename, open_mode, desired_access):
- filename = string.replace(filename,'/', '\\')
- filename = filename.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else filename
-
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- openFile = SMBCommand(SMB.SMB_COM_OPEN_ANDX)
- openFile['Parameters'] = SMBOpenAndX_Parameters()
- openFile['Parameters']['DesiredAccess'] = desired_access
- openFile['Parameters']['OpenMode'] = open_mode
- openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
- openFile['Data'] = SMBOpenAndX_Data(flags=self.__flags2)
- openFile['Data']['FileName'] = filename
-
- if self.__flags2 & SMB.FLAGS2_UNICODE:
- openFile['Data']['Pad'] = 0x0
-
- smb.addCommand(openFile)
-
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_OPEN_ANDX):
- # XXX Here we are ignoring the rest of the response
- openFileResponse = SMBCommand(smb['Data'][0])
- openFileParameters = SMBOpenAndXResponse_Parameters(openFileResponse['Parameters'])
-
- return (
- openFileParameters['Fid'],
- openFileParameters['FileAttributes'],
- openFileParameters['LastWriten'],
- openFileParameters['FileSize'],
- openFileParameters['GrantedAccess'],
- openFileParameters['FileType'],
- openFileParameters['IPCState'],
- openFileParameters['Action'],
- openFileParameters['ServerFid'],
- )
-
- def close(self, tid, fid):
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- closeFile = SMBCommand(SMB.SMB_COM_CLOSE)
- closeFile['Parameters'] = SMBClose_Parameters()
- closeFile['Parameters']['FID'] = fid
- smb.addCommand(closeFile)
-
- self.sendSMB(smb)
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_CLOSE):
- return 1
- return 0
-
- def send_trans(self, tid, setup, name, param, data, noAnswer = 0):
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- transCommand = SMBCommand(SMB.SMB_COM_TRANSACTION)
- transCommand['Parameters'] = SMBTransaction_Parameters()
- transCommand['Data'] = SMBTransaction_Data()
-
- transCommand['Parameters']['Setup'] = setup
- transCommand['Parameters']['TotalParameterCount'] = len(param)
- transCommand['Parameters']['TotalDataCount'] = len(data)
-
- transCommand['Parameters']['ParameterCount'] = len(param)
- transCommand['Parameters']['ParameterOffset'] = 32+3+28+len(setup)+len(name)
-
- transCommand['Parameters']['DataCount'] = len(data)
- transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param)
-
- transCommand['Data']['Name'] = name
- transCommand['Data']['Trans_Parameters'] = param
- transCommand['Data']['Trans_Data'] = data
-
- if noAnswer:
- transCommand['Parameters']['Flags'] = TRANS_NO_RESPONSE
-
- smb.addCommand(transCommand)
-
- self.sendSMB(smb)
-
- def send_trans2(self, tid, setup, name, param, data):
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- command = pack('<H', setup)
-
- transCommand = SMBCommand(SMB.SMB_COM_TRANSACTION2)
- transCommand['Parameters'] = SMBTransaction2_Parameters()
- transCommand['Parameters']['MaxDataCount'] = self._dialects_parameters['MaxBufferSize']
- transCommand['Data'] = SMBTransaction2_Data()
-
- transCommand['Parameters']['Setup'] = command
- transCommand['Parameters']['TotalParameterCount'] = len(param)
- transCommand['Parameters']['TotalDataCount'] = len(data)
-
- if len(param) > 0:
- padLen = (4 - (32+2+28 + len(command)) % 4 ) % 4
- padBytes = '\xFF' * padLen
- transCommand['Data']['Pad1'] = padBytes
- else:
- transCommand['Data']['Pad1'] = ''
- padLen = 0
-
- transCommand['Parameters']['ParameterCount'] = len(param)
- transCommand['Parameters']['ParameterOffset'] = 32+2+28+len(command)+len(name) + padLen
-
- if len(data) > 0:
- pad2Len = (4 - (32+2+28 + len(command) + padLen + len(param)) % 4) % 4
- transCommand['Data']['Pad2'] = '\xFF' * pad2Len
- else:
- transCommand['Data']['Pad2'] = ''
- pad2Len = 0
-
- transCommand['Parameters']['DataCount'] = len(data)
- transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param) + pad2Len
-
- transCommand['Data']['Name'] = name
- transCommand['Data']['Trans_Parameters'] = param
- transCommand['Data']['Trans_Data'] = data
- smb.addCommand(transCommand)
-
- self.sendSMB(smb)
-
- def query_file_info(self, tid, fid, fileInfoClass = SMB_QUERY_FILE_STANDARD_INFO):
- self.send_trans2(tid, SMB.TRANS2_QUERY_FILE_INFORMATION, '\x00', pack('<HH', fid, fileInfoClass), '')
-
- resp = self.recvSMB()
- if resp.isValidAnswer(SMB.SMB_COM_TRANSACTION2):
- trans2Response = SMBCommand(resp['Data'][0])
- trans2Parameters = SMBTransaction2Response_Parameters(trans2Response['Parameters'])
- # Remove Potential Prefix Padding
- return trans2Response['Data'][-trans2Parameters['TotalDataCount']:]
-
- def __nonraw_retr_file(self, tid, fid, offset, datasize, callback):
- if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_READX) and self._SignatureEnabled is False:
- max_buf_size = 65000
- else:
- max_buf_size = self._dialects_parameters['MaxBufferSize'] & ~0x3ff # Read in multiple KB blocks
-
- read_offset = offset
- while read_offset < datasize:
- data = self.read_andx(tid, fid, read_offset, max_buf_size)
-
- callback(data)
- read_offset += len(data)
-
- def __nonraw_stor_file(self, tid, fid, offset, datasize, callback):
- if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_WRITEX) and self._SignatureEnabled is False:
- max_buf_size = 65000
- else:
- max_buf_size = self._dialects_parameters['MaxBufferSize'] & ~0x3ff # Write in multiple KB blocks
-
- write_offset = offset
- while 1:
- data = callback(max_buf_size)
- if not data:
- break
-
- smb = self.write_andx(tid,fid,data, write_offset)
- writeResponse = SMBCommand(smb['Data'][0])
- writeResponseParameters = SMBWriteAndXResponse_Parameters(writeResponse['Parameters'])
- write_offset += writeResponseParameters['Count']
-
- def get_server_domain(self):
- return self.__server_domain
-
- def get_server_dns_domain_name(self):
- return self.__server_dns_domain_name
-
- def get_server_os(self):
- return self.__server_os
-
- def get_server_os_major(self):
- return self.__server_os_major
-
- def get_server_os_minor(self):
- return self.__server_os_minor
-
- def get_server_os_build(self):
- return self.__server_os_build
-
- def set_server_os(self, os):
- self.__server_os = os
-
- def get_server_lanman(self):
- return self.__server_lanman
-
- def is_login_required(self):
- # Login is required if share mode is user.
- # Otherwise only public services or services in share mode
- # are allowed.
- return (self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SHARE_MASK) == SMB.SECURITY_SHARE_USER
-
- def is_signing_required(self):
- return self._SignatureRequired
-
- def get_ntlmv1_response(self, key):
- challenge = self._dialects_data['Challenge']
- return ntlm.get_ntlmv1_response(key, challenge)
-
- def kerberos_login(self, user, password, domain = '', lmhash = '', nthash = '', aesKey = '', kdcHost = '', TGT=None, TGS=None):
- # Importing down here so pyasn1 is not required if kerberos is not used.
- from impacket.krb5.asn1 import AP_REQ, Authenticator, TGS_REP, seq_set
- from impacket.krb5.kerberosv5 import getKerberosTGT, getKerberosTGS
- from impacket.krb5 import constants
- from impacket.krb5.types import Principal, KerberosTime, Ticket
- from pyasn1.codec.der import decoder, encoder
- import datetime
-
- # login feature does not support unicode
- # disable it if enabled
- flags2 = self.__flags2
- if flags2 & SMB.FLAGS2_UNICODE:
- self.__flags2 = flags2 & (flags2 ^ SMB.FLAGS2_UNICODE)
-
- # If TGT or TGS are specified, they are in the form of:
- # TGS['KDC_REP'] = the response from the server
- # TGS['cipher'] = the cipher used
- # TGS['sessionKey'] = the sessionKey
- # If we have hashes, normalize them
- if lmhash != '' or nthash != '':
- if len(lmhash) % 2: lmhash = '0%s' % lmhash
- if len(nthash) % 2: nthash = '0%s' % nthash
- try: # just in case they were converted already
- lmhash = a2b_hex(lmhash)
- nthash = a2b_hex(nthash)
- except:
- pass
-
- self.__userName = user
- self.__password = password
- self.__domain = domain
- self.__lmhash = lmhash
- self.__nthash = nthash
- self.__aesKey = aesKey
- self.__kdc = kdcHost
- self.__TGT = TGT
- self.__TGS = TGS
-
- # First of all, we need to get a TGT for the user
- userName = Principal(user, type=constants.PrincipalNameType.NT_PRINCIPAL.value)
- if TGT is None:
- if TGS is None:
- tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(userName, password, domain, lmhash, nthash, aesKey, kdcHost)
- else:
- tgt = TGT['KDC_REP']
- cipher = TGT['cipher']
- sessionKey = TGT['sessionKey']
-
- # Now that we have the TGT, we should ask for a TGS for cifs
-
- if TGS is None:
- serverName = Principal('cifs/%s' % self.__remote_name, type=constants.PrincipalNameType.NT_SRV_INST.value)
- tgs, cipher, oldSessionKey, sessionKey = getKerberosTGS(serverName, domain, kdcHost, tgt, cipher, sessionKey)
- else:
- tgs = TGS['KDC_REP']
- cipher = TGS['cipher']
- sessionKey = TGS['sessionKey']
-
- smb = NewSMBPacket()
-
- # Are we required to sign SMB? If so we do it, if not we skip it
- if self._SignatureRequired:
- smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
-
-
- sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
- sessionSetup['Parameters'] = SMBSessionSetupAndX_Extended_Parameters()
- sessionSetup['Data'] = SMBSessionSetupAndX_Extended_Data()
-
- sessionSetup['Parameters']['MaxBufferSize'] = 61440
- sessionSetup['Parameters']['MaxMpxCount'] = 2
- sessionSetup['Parameters']['VcNumber'] = 1
- sessionSetup['Parameters']['SessionKey'] = 0
- sessionSetup['Parameters']['Capabilities'] = SMB.CAP_EXTENDED_SECURITY | SMB.CAP_USE_NT_ERRORS | SMB.CAP_UNICODE | SMB.CAP_LARGE_READX | SMB.CAP_LARGE_WRITEX
-
-
- # Let's build a NegTokenInit with the NTLMSSP
- # TODO: In the future we should be able to choose different providers
-
- blob = SPNEGO_NegTokenInit()
-
- # Kerberos v5 mech
- blob['MechTypes'] = [TypesMech['MS KRB5 - Microsoft Kerberos 5']]
-
- # Let's extract the ticket from the TGS
- tgs = decoder.decode(tgs, asn1Spec = TGS_REP())[0]
- ticket = Ticket()
- ticket.from_asn1(tgs['ticket'])
-
- # Now let's build the AP_REQ
- apReq = AP_REQ()
- apReq['pvno'] = 5
- apReq['msg-type'] = int(constants.ApplicationTagNumbers.AP_REQ.value)
-
- opts = list()
- apReq['ap-options'] = constants.encodeFlags(opts)
- seq_set(apReq,'ticket', ticket.to_asn1)
-
- authenticator = Authenticator()
- authenticator['authenticator-vno'] = 5
- authenticator['crealm'] = domain
- seq_set(authenticator, 'cname', userName.components_to_asn1)
- now = datetime.datetime.utcnow()
-
- authenticator['cusec'] = now.microsecond
- authenticator['ctime'] = KerberosTime.to_asn1(now)
-
- encodedAuthenticator = encoder.encode(authenticator)
-
- # Key Usage 11
- # AP-REQ Authenticator (includes application authenticator
- # subkey), encrypted with the application session key
- # (Section 5.5.1)
- encryptedEncodedAuthenticator = cipher.encrypt(sessionKey, 11, encodedAuthenticator, None)
-
- apReq['authenticator'] = None
- apReq['authenticator']['etype'] = cipher.enctype
- apReq['authenticator']['cipher'] = encryptedEncodedAuthenticator
-
- blob['MechToken'] = encoder.encode(apReq)
-
- sessionSetup['Parameters']['SecurityBlobLength'] = len(blob)
- sessionSetup['Parameters'].getData()
- sessionSetup['Data']['SecurityBlob'] = blob.getData()
-
- # Fake Data here, don't want to get us fingerprinted
- sessionSetup['Data']['NativeOS'] = 'Unix'
- sessionSetup['Data']['NativeLanMan'] = 'Samba'
-
- smb.addCommand(sessionSetup)
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
- # We will need to use this uid field for all future requests/responses
- self._uid = smb['Uid']
-
- # Now we have to extract the blob to continue the auth process
- sessionResponse = SMBCommand(smb['Data'][0])
- sessionParameters = SMBSessionSetupAndX_Extended_Response_Parameters(sessionResponse['Parameters'])
- sessionData = SMBSessionSetupAndX_Extended_Response_Data(flags = smb['Flags2'])
- sessionData['SecurityBlobLength'] = sessionParameters['SecurityBlobLength']
- sessionData.fromString(sessionResponse['Data'])
-
- self._action = sessionParameters['Action']
- # If smb sign required, let's enable it for the rest of the connection
- if self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SIGNATURES_REQUIRED:
- self._SigningSessionKey = sessionKey.contents
- self._SignSequenceNumber = 2
- self._SignatureEnabled = True
-
- # restore unicode flag if needed
- if flags2 & SMB.FLAGS2_UNICODE:
- self.__flags2 |= SMB.FLAGS2_UNICODE
-
- return 1
- else:
- raise Exception('Error: Could not login successfully')
-
- def login_extended(self, user, password, domain = '', lmhash = '', nthash = '', use_ntlmv2 = True ):
-
- # login feature does not support unicode
- # disable it if enabled
- flags2 = self.__flags2
- if flags2 & SMB.FLAGS2_UNICODE:
- self.__flags2 = flags2 & (flags2 ^ SMB.FLAGS2_UNICODE)
-
- # Once everything's working we should join login methods into a single one
- smb = NewSMBPacket()
- # Are we required to sign SMB? If so we do it, if not we skip it
- if self._SignatureRequired:
- smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
-
- sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
- sessionSetup['Parameters'] = SMBSessionSetupAndX_Extended_Parameters()
- sessionSetup['Data'] = SMBSessionSetupAndX_Extended_Data()
-
- sessionSetup['Parameters']['MaxBufferSize'] = 61440
- sessionSetup['Parameters']['MaxMpxCount'] = 2
- sessionSetup['Parameters']['VcNumber'] = 1
- sessionSetup['Parameters']['SessionKey'] = 0
- sessionSetup['Parameters']['Capabilities'] = SMB.CAP_EXTENDED_SECURITY | SMB.CAP_USE_NT_ERRORS | SMB.CAP_UNICODE | SMB.CAP_LARGE_READX | SMB.CAP_LARGE_WRITEX
-
-
- # Let's build a NegTokenInit with the NTLMSSP
- # TODO: In the future we should be able to choose different providers
-
- blob = SPNEGO_NegTokenInit()
-
- # NTLMSSP
- blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
- auth = ntlm.getNTLMSSPType1('','',self._SignatureRequired, use_ntlmv2 = use_ntlmv2)
- blob['MechToken'] = str(auth)
-
- sessionSetup['Parameters']['SecurityBlobLength'] = len(blob)
- sessionSetup['Parameters'].getData()
- sessionSetup['Data']['SecurityBlob'] = blob.getData()
-
- # Fake Data here, don't want to get us fingerprinted
- sessionSetup['Data']['NativeOS'] = 'Unix'
- sessionSetup['Data']['NativeLanMan'] = 'Samba'
-
- smb.addCommand(sessionSetup)
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
- # We will need to use this uid field for all future requests/responses
- self._uid = smb['Uid']
-
- # Now we have to extract the blob to continue the auth process
- sessionResponse = SMBCommand(smb['Data'][0])
- sessionParameters = SMBSessionSetupAndX_Extended_Response_Parameters(sessionResponse['Parameters'])
- sessionData = SMBSessionSetupAndX_Extended_Response_Data(flags = smb['Flags2'])
- sessionData['SecurityBlobLength'] = sessionParameters['SecurityBlobLength']
- sessionData.fromString(sessionResponse['Data'])
- respToken = SPNEGO_NegTokenResp(sessionData['SecurityBlob'])
-
- # Let's parse some data and keep it to ourselves in case it is asked
- ntlmChallenge = ntlm.NTLMAuthChallenge(respToken['ResponseToken'])
- if ntlmChallenge['TargetInfoFields_len'] > 0:
- av_pairs = ntlm.AV_PAIRS(ntlmChallenge['TargetInfoFields'][:ntlmChallenge['TargetInfoFields_len']])
- if av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] is not None:
- try:
- self.__server_name = av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1].decode('utf-16le')
- except:
- # For some reason, we couldn't decode Unicode here.. silently discard the operation
- pass
- if av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] is not None:
- try:
- if self.__server_name != av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le'):
- self.__server_domain = av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le')
- except:
- # For some reason, we couldn't decode Unicode here.. silently discard the operation
- pass
- if av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] is not None:
- try:
- self.__server_dns_domain_name = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1].decode('utf-16le')
- except:
- # For some reason, we couldn't decode Unicode here.. silently discard the operation
- pass
-
- # Parse Version to know the target Operating system name. Not provided elsewhere anymore
- if 'Version' in ntlmChallenge.fields:
- version = ntlmChallenge['Version']
-
- if len(version) >= 4:
- self.__server_os_major, self.__server_os_minor, self.__server_os_build = unpack('<BBH',version[:4])
-
- type3, exportedSessionKey = ntlm.getNTLMSSPType3(auth, respToken['ResponseToken'], user, password, domain, lmhash, nthash, use_ntlmv2 = use_ntlmv2)
-
- if exportedSessionKey is not None:
- self._SigningSessionKey = exportedSessionKey
-
- smb = NewSMBPacket()
-
- # Are we required to sign SMB? If so we do it, if not we skip it
- if self._SignatureRequired:
- smb['Flags2'] |= SMB.FLAGS2_SMB_SECURITY_SIGNATURE
-
- respToken2 = SPNEGO_NegTokenResp()
- respToken2['ResponseToken'] = str(type3)
-
- # Reusing the previous structure
- sessionSetup['Parameters']['SecurityBlobLength'] = len(respToken2)
- sessionSetup['Data']['SecurityBlob'] = respToken2.getData()
-
- # Storing some info for later use
- self.__server_os = sessionData['NativeOS']
- self.__server_lanman = sessionData['NativeLanMan']
-
- smb.addCommand(sessionSetup)
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- self._uid = 0
- if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
- self._uid = smb['Uid']
- sessionResponse = SMBCommand(smb['Data'][0])
- sessionParameters = SMBSessionSetupAndXResponse_Parameters(sessionResponse['Parameters'])
-
- self._action = sessionParameters['Action']
- # If smb sign required, let's enable it for the rest of the connection
- if self._dialects_parameters['SecurityMode'] & SMB.SECURITY_SIGNATURES_REQUIRED:
- self._SignSequenceNumber = 2
- self._SignatureEnabled = True
-
- # restore unicode flag if needed
- if flags2 & SMB.FLAGS2_UNICODE:
- self.__flags2 |= SMB.FLAGS2_UNICODE
-
- return 1
- else:
- raise Exception('Error: Could not login successfully')
-
- def getCredentials(self):
- return (
- self.__userName,
- self.__password,
- self.__domain,
- self.__lmhash,
- self.__nthash,
- self.__aesKey,
- self.__TGT,
- self.__TGS)
-
- def getIOCapabilities(self):
- res = dict()
- if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_READX) and self._SignatureEnabled is False:
- max_size = 65000
- else:
- max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
- res['MaxReadSize'] = max_size
- res['MaxWriteSize'] = max_size
- return res
-
- def login(self, user, password, domain = '', lmhash = '', nthash = '', ntlm_fallback = True):
-
- # If we have hashes, normalize them
- if lmhash != '' or nthash != '':
- if len(lmhash) % 2: lmhash = '0%s' % lmhash
- if len(nthash) % 2: nthash = '0%s' % nthash
- try: # just in case they were converted already
- lmhash = a2b_hex(lmhash)
- nthash = a2b_hex(nthash)
- except:
- pass
-
- self.__userName = user
- self.__password = password
- self.__domain = domain
- self.__lmhash = lmhash
- self.__nthash = nthash
- self.__aesKey = ''
- self.__TGT = None
- self.__TGS = None
-
- if self._dialects_parameters['Capabilities'] & SMB.CAP_EXTENDED_SECURITY:
- try:
- self.login_extended(user, password, domain, lmhash, nthash, use_ntlmv2 = True)
- except:
- # If the target OS is Windows 5.0 or Samba, let's try using NTLMv1
- if ntlm_fallback and ((self.get_server_lanman().find('Windows 2000') != -1) or (self.get_server_lanman().find('Samba') != -1)):
- self.login_extended(user, password, domain, lmhash, nthash, use_ntlmv2 = False)
- self.__isNTLMv2 = False
- else:
- raise
- elif ntlm_fallback:
- self.login_standard(user, password, domain, lmhash, nthash)
- self.__isNTLMv2 = False
- else:
- raise SessionError('Cannot authenticate against target, enable ntlm_fallback')
-
- def login_standard(self, user, password, domain = '', lmhash = '', nthash = ''):
-
- # login feature does not support unicode
- # disable it if enabled
- flags2 = self.__flags2
- if flags2 & SMB.FLAGS2_UNICODE:
- self.__flags2 = flags2 & (flags2 ^ SMB.FLAGS2_UNICODE)
-
- # Only supports NTLMv1
- # Password is only encrypted if the server passed us an "encryption key" during protocol dialect negotiation
- if self._dialects_parameters['ChallengeLength'] > 0:
- if lmhash != '' or nthash != '':
- pwd_ansi = self.get_ntlmv1_response(lmhash)
- pwd_unicode = self.get_ntlmv1_response(nthash)
- elif password:
- lmhash = ntlm.compute_lmhash(password)
- nthash = ntlm.compute_nthash(password)
- pwd_ansi = self.get_ntlmv1_response(lmhash)
- pwd_unicode = self.get_ntlmv1_response(nthash)
- else: # NULL SESSION
- pwd_ansi = ''
- pwd_unicode = ''
- else:
- pwd_ansi = password
- pwd_unicode = ''
-
- smb = NewSMBPacket()
-
- sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
- sessionSetup['Parameters'] = SMBSessionSetupAndX_Parameters()
- sessionSetup['Data'] = SMBSessionSetupAndX_Data()
-
- sessionSetup['Parameters']['MaxBuffer'] = 61440
- sessionSetup['Parameters']['MaxMpxCount'] = 2
- sessionSetup['Parameters']['VCNumber'] = os.getpid()
- sessionSetup['Parameters']['SessionKey'] = self._dialects_parameters['SessionKey']
- sessionSetup['Parameters']['AnsiPwdLength'] = len(pwd_ansi)
- sessionSetup['Parameters']['UnicodePwdLength'] = len(pwd_unicode)
- sessionSetup['Parameters']['Capabilities'] = SMB.CAP_RAW_MODE | SMB.CAP_USE_NT_ERRORS | SMB.CAP_LARGE_READX | SMB.CAP_LARGE_WRITEX
-
- sessionSetup['Data']['AnsiPwd'] = pwd_ansi
- sessionSetup['Data']['UnicodePwd'] = pwd_unicode
- sessionSetup['Data']['Account'] = str(user)
- sessionSetup['Data']['PrimaryDomain'] = str(domain)
- sessionSetup['Data']['NativeOS'] = str(os.name)
- sessionSetup['Data']['NativeLanMan'] = 'pysmb'
- smb.addCommand(sessionSetup)
-
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
- # We will need to use this uid field for all future requests/responses
- self._uid = smb['Uid']
- sessionResponse = SMBCommand(smb['Data'][0])
- sessionParameters = SMBSessionSetupAndXResponse_Parameters(sessionResponse['Parameters'])
- sessionData = SMBSessionSetupAndXResponse_Data(flags = smb['Flags2'], data = sessionResponse['Data'])
-
- self._action = sessionParameters['Action']
-
- # Still gotta figure out how to do this with no EXTENDED_SECURITY
- if sessionParameters['Action'] & SMB_SETUP_USE_LANMAN_KEY == 0:
- self._SigningChallengeResponse = sessionSetup['Data']['UnicodePwd']
- self._SigningSessionKey = nthash
- else:
- self._SigningChallengeResponse = sessionSetup['Data']['AnsiPwd']
- self._SigningSessionKey = lmhash
-
- #self._SignSequenceNumber = 1
- #self.checkSignSMB(smb, self._SigningSessionKey ,self._SigningChallengeResponse)
- #self._SignatureEnabled = True
- self.__server_os = sessionData['NativeOS']
- self.__server_lanman = sessionData['NativeLanMan']
- self.__server_domain = sessionData['PrimaryDomain']
-
- # restore unicode flag if needed
- if flags2 & SMB.FLAGS2_UNICODE:
- self.__flags2 |= SMB.FLAGS2_UNICODE
-
- return 1
- else: raise Exception('Error: Could not login successfully')
-
- def waitNamedPipe(self, tid, pipe, timeout = 5, noAnswer = 0):
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- transCommand = SMBCommand(SMB.SMB_COM_TRANSACTION)
- transCommand['Parameters'] = SMBTransaction_Parameters()
- transCommand['Data'] = SMBTransaction_Data()
-
- setup = '\x53\x00\x00\x00'
- name = '\\PIPE%s\x00' % pipe
- transCommand['Parameters']['Setup'] = setup
- transCommand['Parameters']['TotalParameterCount'] = 0
- transCommand['Parameters']['TotalDataCount'] = 0
- transCommand['Parameters']['MaxParameterCount'] = 0
- transCommand['Parameters']['MaxDataCount'] = 0
- transCommand['Parameters']['Timeout'] = timeout * 1000
-
- transCommand['Parameters']['ParameterCount'] = 0
- transCommand['Parameters']['ParameterOffset'] = 32+3+28+len(setup)+len(name)
-
- transCommand['Parameters']['DataCount'] = 0
- transCommand['Parameters']['DataOffset'] = 0
-
- transCommand['Data']['Name'] = name
- transCommand['Data']['Trans_Parameters'] = ''
- transCommand['Data']['Trans_Data'] = ''
-
- if noAnswer:
- transCommand['Parameters']['Flags'] = TRANS_NO_RESPONSE
-
- smb.addCommand(transCommand)
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_TRANSACTION):
- return 1
- return 0
-
- def read(self, tid, fid, offset=0, max_size = None, wait_answer=1):
- if not max_size:
- max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
-
- # max_size is not working, because although it would, the server returns an error (More data avail)
-
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- read = SMBCommand(SMB.SMB_COM_READ)
- read['Parameters'] = SMBRead_Parameters()
- read['Parameters']['Fid'] = fid
- read['Parameters']['Offset'] = offset
- read['Parameters']['Count'] = max_size
- smb.addCommand(read)
-
- if wait_answer:
- while 1:
- self.sendSMB(smb)
- ans = self.recvSMB()
-
- if ans.isValidAnswer(SMB.SMB_COM_READ):
- readResponse = SMBCommand(ans['Data'][0])
- readData = SMBReadResponse_Data(readResponse['Data'])
-
- return readData['Data']
-
- return None
-
- def read_andx(self, tid, fid, offset=0, max_size = None, wait_answer=1, smb_packet=None):
- if not max_size:
- if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_READX) and self._SignatureEnabled is False:
- max_size = 65000
- else:
- max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
-
- # max_size is not working, because although it would, the server returns an error (More data avail)
-
- if smb_packet is None:
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- readAndX = SMBCommand(SMB.SMB_COM_READ_ANDX)
- readAndX['Parameters'] = SMBReadAndX_Parameters()
- readAndX['Parameters']['Fid'] = fid
- readAndX['Parameters']['Offset'] = offset
- readAndX['Parameters']['MaxCount'] = max_size
- smb.addCommand(readAndX)
- else:
- smb = smb_packet
-
- if wait_answer:
- answer = ''
- while 1:
- self.sendSMB(smb)
- ans = self.recvSMB()
-
- if ans.isValidAnswer(SMB.SMB_COM_READ_ANDX):
- # XXX Here we are only using a few fields from the response
- readAndXResponse = SMBCommand(ans['Data'][0])
- readAndXParameters = SMBReadAndXResponse_Parameters(readAndXResponse['Parameters'])
-
- offset = readAndXParameters['DataOffset']
- count = readAndXParameters['DataCount']+0x10000*readAndXParameters['DataCount_Hi']
- answer += str(ans)[offset:offset+count]
- if not ans.isMoreData():
- return answer
- max_size = min(max_size, readAndXParameters['Remaining'])
- readAndX['Parameters']['Offset'] += count # XXX Offset is not important (apparently)
- else:
- self.sendSMB(smb)
- ans = self.recvSMB()
-
- try:
- if ans.isValidAnswer(SMB.SMB_COM_READ_ANDX):
- return ans
- else:
- return None
- except:
- return ans
-
- return None
-
- def read_raw(self, tid, fid, offset=0, max_size = None, wait_answer=1):
- if not max_size:
- max_size = self._dialects_parameters['MaxBufferSize'] # Read in multiple KB blocks
-
- # max_size is not working, because although it would, the server returns an error (More data avail)
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- readRaw = SMBCommand(SMB.SMB_COM_READ_RAW)
- readRaw['Parameters'] = SMBReadRaw_Parameters()
- readRaw['Parameters']['Fid'] = fid
- readRaw['Parameters']['Offset'] = offset
- readRaw['Parameters']['MaxCount'] = max_size
- smb.addCommand(readRaw)
-
- self.sendSMB(smb)
- if wait_answer:
- data = self._sess.recv_packet(self.__timeout).get_trailer()
- if not data:
- # If there is no data it means there was an error
- data = self.read_andx(tid, fid, offset, max_size)
- return data
-
- return None
-
- def write(self,tid,fid,data, offset = 0, wait_answer=1):
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- write = SMBCommand(SMB.SMB_COM_WRITE)
- write['Parameters'] = SMBWrite_Parameters()
- write['Data'] = SMBWrite_Data()
- write['Parameters']['Fid'] = fid
- write['Parameters']['Count'] = len(data)
- write['Parameters']['Offset'] = offset
- write['Parameters']['Remaining'] = len(data)
- write['Data']['Data'] = data
- smb.addCommand(write)
-
- self.sendSMB(smb)
-
- if wait_answer:
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_WRITE):
- return smb
- return None
-
- def write_andx(self,tid,fid,data, offset = 0, wait_answer=1, write_pipe_mode = False, smb_packet=None):
- if smb_packet is None:
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- writeAndX = SMBCommand(SMB.SMB_COM_WRITE_ANDX)
- smb.addCommand(writeAndX)
-
- writeAndX['Parameters'] = SMBWriteAndX_Parameters()
- writeAndX['Parameters']['Fid'] = fid
- writeAndX['Parameters']['Offset'] = offset
- writeAndX['Parameters']['WriteMode'] = 8
- writeAndX['Parameters']['Remaining'] = len(data)
- writeAndX['Parameters']['DataLength'] = len(data)
- writeAndX['Parameters']['DataOffset'] = len(smb) # this length already includes the parameter
- writeAndX['Data'] = data
-
- if write_pipe_mode is True:
- # First of all we gotta know what the MaxBuffSize is
- maxBuffSize = self._dialects_parameters['MaxBufferSize']
- if len(data) > maxBuffSize:
- chunks_size = maxBuffSize - 60
- writeAndX['Parameters']['WriteMode'] = 0x0c
- sendData = '\xff\xff' + data
- totalLen = len(sendData)
- writeAndX['Parameters']['DataLength'] = chunks_size
- writeAndX['Parameters']['Remaining'] = totalLen-2
- writeAndX['Data'] = sendData[:chunks_size]
-
- self.sendSMB(smb)
- if wait_answer:
- smbResp = self.recvSMB()
- smbResp.isValidAnswer(SMB.SMB_COM_WRITE_ANDX)
-
- alreadySent = chunks_size
- sendData = sendData[chunks_size:]
-
- while alreadySent < totalLen:
- writeAndX['Parameters']['WriteMode'] = 0x04
- writeAndX['Parameters']['DataLength'] = len(sendData[:chunks_size])
- writeAndX['Data'] = sendData[:chunks_size]
- self.sendSMB(smb)
- if wait_answer:
- smbResp = self.recvSMB()
- smbResp.isValidAnswer(SMB.SMB_COM_WRITE_ANDX)
- alreadySent += writeAndX['Parameters']['DataLength']
- sendData = sendData[chunks_size:]
-
- return smbResp
-
- else:
- smb = smb_packet
-
- self.sendSMB(smb)
-
- if wait_answer:
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_WRITE_ANDX):
- return smb
- return None
-
- def write_raw(self,tid,fid,data, offset = 0, wait_answer=1):
- LOG.warning("[MS-CIFS] This command was introduced in the CorePlus dialect, but is often listed as part of the LAN Manager 1.0 dialect.This command has been deprecated.Clients SHOULD use SMB_COM_WRITE_ANDX")
- smb = NewSMBPacket()
- smb['Tid'] = tid
-
- writeRaw = SMBCommand(SMB.SMB_COM_WRITE_RAW)
- writeRaw['Parameters'] = SMBWriteRaw_Parameters()
- writeRaw['Parameters']['Fid'] = fid
- writeRaw['Parameters']['Offset'] = offset
- writeRaw['Parameters']['Count'] = len(data)
- writeRaw['Parameters']['DataLength'] = 0
- writeRaw['Parameters']['DataOffset'] = 0
- smb.addCommand(writeRaw)
-
- self.sendSMB(smb)
- self._sess.send_packet(data)
-
- if wait_answer:
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_WRITE_RAW):
- return smb
- return None
-
- def TransactNamedPipe(self, tid, fid, data = '', noAnswer = 0, waitAnswer = 1, offset = 0):
- self.send_trans(tid,pack('<HH', 0x26, fid),'\\PIPE\\\x00','',data, noAnswer = noAnswer)
-
- if noAnswer or not waitAnswer:
- return
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_TRANSACTION):
- transResponse = SMBCommand(smb['Data'][0])
- transParameters = SMBTransactionResponse_Parameters(transResponse['Parameters'])
- return transResponse['Data'][-transParameters['TotalDataCount']:] # Remove Potential Prefix Padding
- return None
-
- def TransactNamedPipeRecv(self):
- s = self.recvSMB()
- if s.isValidAnswer(SMB.SMB_COM_TRANSACTION):
- transResponse = SMBCommand(s['Data'][0])
- transParameters = SMBTransactionResponse_Parameters(transResponse['Parameters'])
- return transResponse['Data'][-transParameters['TotalDataCount']:] # Remove Potential Prefix Padding
- return None
-
- def nt_create_andx(self,tid,filename, smb_packet=None, cmd = None, shareAccessMode = FILE_SHARE_READ | FILE_SHARE_WRITE, disposition = FILE_OPEN, accessMask = 0x2019f):
- filename = filename.replace('/', '\\')
- filename = filename.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else filename
-
- if smb_packet is None:
- smb = NewSMBPacket()
- smb['Tid'] = tid
- else:
- smb = smb_packet
-
- if cmd is None:
- ntCreate = SMBCommand(SMB.SMB_COM_NT_CREATE_ANDX)
- ntCreate['Parameters'] = SMBNtCreateAndX_Parameters()
- ntCreate['Data'] = SMBNtCreateAndX_Data(flags=self.__flags2)
- ntCreate['Parameters']['FileNameLength'] = len(filename)
- ntCreate['Parameters']['CreateFlags'] = 0x16
- ntCreate['Parameters']['AccessMask'] = accessMask
- ntCreate['Parameters']['CreateOptions'] = 0x40
- ntCreate['Parameters']['ShareAccess'] = shareAccessMode
- ntCreate['Parameters']['Disposition'] = disposition
- ntCreate['Data']['FileName'] = filename
-
- if self.__flags2 & SMB.FLAGS2_UNICODE:
- ntCreate['Data']['Pad'] = 0x0
- else:
- ntCreate = cmd
-
- smb.addCommand(ntCreate)
-
- self.sendSMB(smb)
-
- while 1:
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_NT_CREATE_ANDX):
- # XXX Here we are ignoring the rest of the response
- ntCreateResponse = SMBCommand(smb['Data'][0])
- ntCreateParameters = SMBNtCreateAndXResponse_Parameters(ntCreateResponse['Parameters'])
-
- self.fid = ntCreateParameters['Fid']
- return ntCreateParameters['Fid']
-
- def logoff(self):
- smb = NewSMBPacket()
-
- logOff = SMBCommand(SMB.SMB_COM_LOGOFF_ANDX)
- logOff['Parameters'] = SMBLogOffAndX()
- smb.addCommand(logOff)
-
- self.sendSMB(smb)
- self.recvSMB()
- # Let's clear some fields so you can login again under the same session
- self._uid = 0
-
- def list_path(self, service, path = '*', password = None):
- path = path.replace('/', '\\')
- path = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
-
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- findFirstParameter = SMBFindFirst2_Parameters()
- findFirstParameter['SearchAttributes'] = SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_HIDDEN | \
- SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_READONLY | \
- SMB_FILE_ATTRIBUTE_ARCHIVE
- findFirstParameter['SearchCount'] = 512
- findFirstParameter['Flags'] = SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
- findFirstParameter['InformationLevel'] = SMB_FIND_FILE_BOTH_DIRECTORY_INFO
- findFirstParameter['SearchStorageType'] = 0
- findFirstParameter['FileName'] = path + ('\x00\x00' if self.__flags2 & SMB.FLAGS2_UNICODE else '\x00')
- self.send_trans2(tid, SMB.TRANS2_FIND_FIRST2, '\x00', findFirstParameter, '')
- files = [ ]
-
- totalDataCount = 1
- findData = ''
- findFirst2ParameterBlock = ''
- while len(findData) < totalDataCount:
- resp = self.recvSMB()
-
- if resp.isValidAnswer(SMB.SMB_COM_TRANSACTION2):
- trans2Response = SMBCommand(resp['Data'][0])
- trans2Parameters = SMBTransaction2Response_Parameters(trans2Response['Parameters'])
- totalDataCount = trans2Parameters['TotalDataCount']
- findFirst2ParameterBlock += trans2Response['Data'][trans2Parameters['ParameterOffset']-55:][:trans2Parameters['ParameterCount']]
- findData += trans2Response['Data'][trans2Parameters['DataOffset']-55:]
-
- findParameterBlock = SMBFindFirst2Response_Parameters(findFirst2ParameterBlock)
- # Save the SID for resume operations
- sid = findParameterBlock['SID']
-
- while True:
- record = SMBFindFileBothDirectoryInfo(data = findData)
-
- shortname = record['ShortName'].decode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else record['ShortName']
- filename = record['FileName'].decode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else record['FileName']
-
- fileRecord = SharedFile(record['CreationTime'], record['LastAccessTime'], record['LastChangeTime'],
- record['EndOfFile'], record['AllocationSize'], record['ExtFileAttributes'],
- shortname, filename)
- files.append(fileRecord)
- if record['NextEntryOffset'] > 0 and len(findData[record['NextEntryOffset']:]) > 0:
- findData = findData[record['NextEntryOffset']:]
- else:
- # More data to search?
- if findParameterBlock['EndOfSearch'] == 0:
- resume_filename = record['FileName']
- findNextParameter = SMBFindNext2_Parameters()
- findNextParameter['SID'] = sid
- findNextParameter['SearchCount'] = 1024
- findNextParameter['InformationLevel'] = SMB_FIND_FILE_BOTH_DIRECTORY_INFO
- findNextParameter['ResumeKey'] = 0
- findNextParameter['Flags'] = SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
- findNextParameter['FileName'] = resume_filename + ('\x00\x00' if self.__flags2 & SMB.FLAGS2_UNICODE else '\x00')
- self.send_trans2(tid, SMB.TRANS2_FIND_NEXT2, '\x00', findNextParameter, '')
- findData = ''
- findNext2ParameterBlock = ''
- totalDataCount = 1
- while len(findData) < totalDataCount:
- resp = self.recvSMB()
-
- if resp.isValidAnswer(SMB.SMB_COM_TRANSACTION2):
- trans2Response = SMBCommand(resp['Data'][0])
- trans2Parameters = SMBTransaction2Response_Parameters(trans2Response['Parameters'])
- totalDataCount = trans2Parameters['TotalDataCount']
- findNext2ParameterBlock += trans2Response['Data'][trans2Parameters['ParameterOffset']-55:][:trans2Parameters['ParameterCount']]
- findData += trans2Response['Data'][trans2Parameters['DataOffset']-55:]
- findParameterBlock = SMBFindNext2Response_Parameters(findNext2ParameterBlock)
- else:
- break
- finally:
- self.disconnect_tree(tid)
-
- return files
-
- def retr_file(self, service, filename, callback, mode = FILE_OPEN, offset = 0, password = None, shareAccessMode = SMB_ACCESS_READ):
- filename = string.replace(filename, '/', '\\')
-
- fid = -1
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- fid = self.nt_create_andx(tid, filename, shareAccessMode = shareAccessMode, accessMask = 0x20089)
-
- res = self.query_file_info(tid, fid)
- datasize = SMBQueryFileStandardInfo(res)['EndOfFile']
-
- self.__nonraw_retr_file(tid, fid, offset, datasize, callback)
- finally:
- if fid >= 0:
- self.close(tid, fid)
- self.disconnect_tree(tid)
-
- def stor_file(self, service, filename, callback, mode = FILE_OVERWRITE_IF, offset = 0, password = None, shareAccessMode = SMB_ACCESS_WRITE):
- filename = string.replace(filename, '/', '\\')
-
- fid = -1
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- fid = self.nt_create_andx(tid, filename, shareAccessMode = shareAccessMode, disposition = mode )
-
- self.__nonraw_stor_file(tid, fid, offset, 0, callback)
- finally:
- if fid >= 0:
- self.close(tid, fid)
- self.disconnect_tree(tid)
-
- def stor_file_nonraw(self, service, filename, callback, mode = FILE_OVERWRITE_IF, offset = 0, password = None, shareAccessMode = SMB_ACCESS_WRITE ):
- filename = string.replace(filename, '/', '\\')
-
- fid = -1
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- fid = self.nt_create_andx(tid, filename, shareAccessMode = shareAccessMode, disposition = mode)
- self.__nonraw_stor_file(tid, fid, offset, 0, callback)
- finally:
- if fid >= 0:
- self.close(tid, fid)
- self.disconnect_tree(tid)
-
- def check_dir(self, service, path, password = None):
- path = string.replace(path,'/', '\\')
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- smb = NewSMBPacket()
- smb['Tid'] = tid
- smb['Mid'] = 0
-
- cmd = SMBCommand(SMB.SMB_COM_CHECK_DIRECTORY)
- cmd['Parameters'] = ''
- cmd['Data'] = SMBCheckDirectory_Data(flags = self.__flags2)
- cmd['Data']['DirectoryName'] = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
- smb.addCommand(cmd)
-
- self.sendSMB(smb)
-
- while 1:
- s = self.recvSMB()
- if s.isValidAnswer(SMB.SMB_COM_CHECK_DIRECTORY):
- return
- finally:
- self.disconnect_tree(tid)
-
- def remove(self, service, path, password = None):
- path = string.replace(path,'/', '\\')
- # Perform a list to ensure the path exists
- self.list_path(service, path, password)
-
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- smb = NewSMBPacket()
- smb['Tid'] = tid
- smb['Mid'] = 0
-
- cmd = SMBCommand(SMB.SMB_COM_DELETE)
- cmd['Parameters'] = SMBDelete_Parameters()
- cmd['Parameters']['SearchAttributes'] = ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE
- cmd['Data'] = SMBDelete_Data(flags = self.__flags2)
- cmd['Data']['FileName'] = (path + '\x00').encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else (path + '\x00')
- smb.addCommand(cmd)
-
- self.sendSMB(smb)
-
- while 1:
- s = self.recvSMB()
- if s.isValidAnswer(SMB.SMB_COM_DELETE):
- return
- finally:
- self.disconnect_tree(tid)
-
- def rmdir(self, service, path, password = None):
- path = string.replace(path,'/', '\\')
- # Check that the directory exists
- self.check_dir(service, path, password)
-
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- path = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
-
- smb = NewSMBPacket()
- smb['Tid'] = tid
- createDir = SMBCommand(SMB.SMB_COM_DELETE_DIRECTORY)
- createDir['Data'] = SMBDeleteDirectory_Data(flags=self.__flags2)
- createDir['Data']['DirectoryName'] = path
- smb.addCommand(createDir)
-
- self.sendSMB(smb)
-
- while 1:
- s = self.recvSMB()
- if s.isValidAnswer(SMB.SMB_COM_DELETE_DIRECTORY):
- return
- finally:
- self.disconnect_tree(tid)
-
- def mkdir(self, service, path, password = None):
- path = string.replace(path,'/', '\\')
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- path = path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else path
-
- smb = NewSMBPacket()
- smb['Tid'] = tid
- smb['Mid'] = 0
-
- createDir = SMBCommand(SMB.SMB_COM_CREATE_DIRECTORY)
- createDir['Data'] = SMBCreateDirectory_Data(flags=self.__flags2)
- createDir['Data']['DirectoryName'] = path
- smb.addCommand(createDir)
-
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_CREATE_DIRECTORY):
- return 1
- return 0
- finally:
- self.disconnect_tree(tid)
-
- def rename(self, service, old_path, new_path, password = None):
- old_path = string.replace(old_path,'/', '\\')
- new_path = string.replace(new_path,'/', '\\')
- tid = self.tree_connect_andx('\\\\' + self.__remote_name + '\\' + service, password)
- try:
- smb = NewSMBPacket()
- smb['Tid'] = tid
- smb['Mid'] = 0
-
- renameCmd = SMBCommand(SMB.SMB_COM_RENAME)
- renameCmd['Parameters'] = SMBRename_Parameters()
- renameCmd['Parameters']['SearchAttributes'] = ATTR_SYSTEM | ATTR_HIDDEN | ATTR_DIRECTORY
- renameCmd['Data'] = SMBRename_Data(flags = self.__flags2)
- renameCmd['Data']['OldFileName'] = old_path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else old_path
- renameCmd['Data']['NewFileName'] = new_path.encode('utf-16le') if self.__flags2 & SMB.FLAGS2_UNICODE else new_path
- smb.addCommand(renameCmd)
-
- self.sendSMB(smb)
-
- smb = self.recvSMB()
- if smb.isValidAnswer(SMB.SMB_COM_RENAME):
- return 1
- return 0
- finally:
- self.disconnect_tree(tid)
-
- def writeFile(self, treeId, fileId, data, offset = 0):
- if (self._dialects_parameters['Capabilities'] & SMB.CAP_LARGE_WRITEX) and self._SignatureEnabled is False:
- max_buf_size = 65000
- else:
- max_buf_size = self._dialects_parameters['MaxBufferSize'] & ~0x3ff # Write in multiple KB blocks
-
- write_offset = offset
- while 1:
- if len(data) == 0:
- break
- writeData = data[:max_buf_size]
- data = data[max_buf_size:]
-
- smb = self.write_andx(treeId,fileId,writeData, write_offset)
- writeResponse = SMBCommand(smb['Data'][0])
- writeResponseParameters = SMBWriteAndXResponse_Parameters(writeResponse['Parameters'])
- write_offset += writeResponseParameters['Count']
-
- def get_socket(self):
- return self._sess.get_socket()
-
-ERRDOS = { 1: 'Invalid function',
- 2: 'File not found',
- 3: 'Invalid directory',
- 4: 'Too many open files',
- 5: 'Access denied',
- 6: 'Invalid file handle. Please file a bug report.',
- 7: 'Memory control blocks destroyed',
- 8: 'Out of memory',
- 9: 'Invalid memory block address',
- 10: 'Invalid environment',
- 11: 'Invalid format',
- 12: 'Invalid open mode',
- 13: 'Invalid data',
- 15: 'Invalid drive',
- 16: 'Attempt to remove server\'s current directory',
- 17: 'Not the same device',
- 18: 'No files found',
- 32: 'Sharing mode conflicts detected',
- 33: 'Lock request conflicts detected',
- 80: 'File already exists'
- }
-
-ERRSRV = { 1: 'Non-specific error',
- 2: 'Bad password',
- 4: 'Access denied',
- 5: 'Invalid tid. Please file a bug report.',
- 6: 'Invalid network name',
- 7: 'Invalid device',
- 49: 'Print queue full',
- 50: 'Print queue full',
- 51: 'EOF on print queue dump',
- 52: 'Invalid print file handle',
- 64: 'Command not recognized. Please file a bug report.',
- 65: 'Internal server error',
- 67: 'Invalid path',
- 69: 'Invalid access permissions',
- 71: 'Invalid attribute mode',
- 81: 'Server is paused',
- 82: 'Not receiving messages',
- 83: 'No room to buffer messages',
- 87: 'Too many remote user names',
- 88: 'Operation timeout',
- 89: 'Out of resources',
- 91: 'Invalid user handle. Please file a bug report.',
- 250: 'Temporarily unable to support raw mode for transfer',
- 251: 'Temporarily unable to support raw mode for transfer',
- 252: 'Continue in MPX mode',
- 65535: 'Unsupported function'
- }
-
-ERRHRD = { 19: 'Media is write-protected',
- 20: 'Unknown unit',
- 21: 'Drive not ready',
- 22: 'Unknown command',
- 23: 'CRC error',
- 24: 'Bad request',
- 25: 'Seek error',
- 26: 'Unknown media type',
- 27: 'Sector not found',
- 28: 'Printer out of paper',
- 29: 'Write fault',
- 30: 'Read fault',
- 31: 'General failure',
- 32: 'Open conflicts with an existing open',
- 33: 'Invalid lock request',
- 34: 'Wrong disk in drive',
- 35: 'FCBs not available',
- 36: 'Sharing buffer exceeded'
- }
-
diff --git a/tests/python_dependencies/impacket/smb3.py b/tests/python_dependencies/impacket/smb3.py
deleted file mode 100644
index d81c7e117..000000000
--- a/tests/python_dependencies/impacket/smb3.py
+++ /dev/null
@@ -1,1630 +0,0 @@
-from __future__ import print_function
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Author: Alberto Solino (@agsolino)
-#
-# Description:
-# [MS-SMB2] Protocol Implementation (SMB2 and SMB3)
-# As you might see in the code, it's implemented strictly following
-# the structures defined in the protocol specification. This may
-# not be the most efficient way (e.g. self._Connection is the
-# same to self._Session in the context of this library ) but
-# it certainly helps following the document way easier.
-#
-# ToDo:
-# [X] Implement SMB2_CHANGE_NOTIFY
-# [X] Implement SMB2_QUERY_INFO
-# [X] Implement SMB2_SET_INFO
-# [ ] Implement SMB2_OPLOCK_BREAK
-# [X] Implement SMB3 signing
-# [ ] Implement SMB3 encryption
-# [ ] Add more backward compatible commands from the smb.py code
-# [ ] Fix up all the 'ToDo' comments inside the code
-#
-
-import socket
-import ntpath
-import random
-import string
-import struct
-from binascii import a2b_hex
-from contextlib import contextmanager
-
-from impacket import nmb, ntlm, uuid, crypto, LOG
-from impacket.smb3structs import *
-from impacket.nt_errors import STATUS_SUCCESS, STATUS_MORE_PROCESSING_REQUIRED, STATUS_INVALID_PARAMETER, \
- STATUS_NO_MORE_FILES, STATUS_PENDING, STATUS_NOT_IMPLEMENTED, ERROR_MESSAGES
-from impacket.spnego import SPNEGO_NegTokenInit, TypesMech, SPNEGO_NegTokenResp
-
-
-# For signing
-import hashlib, hmac, copy
-
-# Structs to be used
-TREE_CONNECT = {
- 'ShareName' : '',
- 'TreeConnectId' : 0,
- 'Session' : 0,
- 'IsDfsShare' : False,
- # If the client implements the SMB 3.0 dialect,
- # the client MUST also implement the following
- 'IsCAShare' : False,
- 'EncryptData' : False,
- 'IsScaleoutShare' : False,
- # Outside the protocol
- 'NumberOfUses' : 0,
-}
-
-FILE = {
- 'OpenTable' : [],
- 'LeaseKey' : '',
- 'LeaseState' : 0,
- 'LeaseEpoch' : 0,
-}
-
-OPEN = {
- 'FileID' : '',
- 'TreeConnect' : 0,
- 'Connection' : 0, # Not Used
- 'Oplocklevel' : 0,
- 'Durable' : False,
- 'FileName' : '',
- 'ResilientHandle' : False,
- 'LastDisconnectTime' : 0,
- 'ResilientTimeout' : 0,
- 'OperationBuckets' : [],
- # If the client implements the SMB 3.0 dialect,
- # the client MUST implement the following
- 'CreateGuid' : '',
- 'IsPersistent' : False,
- 'DesiredAccess' : '',
- 'ShareMode' : 0,
- 'CreateOption' : '',
- 'FileAttributes' : '',
- 'CreateDisposition' : '',
-}
-
-REQUEST = {
- 'CancelID' : '',
- 'Message' : '',
- 'Timestamp' : 0,
-}
-
-CHANNEL = {
- 'SigningKey' : '',
- 'Connection' : 0,
-}
-
-
-class SessionError(Exception):
- def __init__( self, error = 0, packet=0):
- Exception.__init__(self)
- self.error = error
- self.packet = packet
-
- def get_error_code( self ):
- return self.error
-
- def get_error_packet( self ):
- return self.packet
-
- def __str__( self ):
- return 'SMB SessionError: %s(%s)' % (ERROR_MESSAGES[self.error])
-
-
-class SMB3:
- def __init__(self, remote_name, remote_host, my_name = None, host_type = nmb.TYPE_SERVER, sess_port = 445, timeout=60, UDP = 0, preferredDialect = None, session = None):
-
- # [MS-SMB2] Section 3
- self.RequireMessageSigning = False #
- self.ConnectionTable = {}
- self.GlobalFileTable = {}
- self.ClientGuid = ''.join([random.choice(string.letters) for i in range(16)])
- # Only for SMB 3.0
- self.EncryptionAlgorithmList = ['AES-CCM']
- self.MaxDialect = []
- self.RequireSecureNegotiate = False
-
- # Per Transport Connection Data
- self._Connection = {
- # Indexed by SessionID
- #'SessionTable' : {},
- # Indexed by MessageID
- 'OutstandingRequests' : {},
- 'OutstandingResponses' : {}, #
- 'SequenceWindow' : 0, #
- 'GSSNegotiateToken' : '', #
- 'MaxTransactSize' : 0, #
- 'MaxReadSize' : 0, #
- 'MaxWriteSize' : 0, #
- 'ServerGuid' : '', #
- 'RequireSigning' : False, #
- 'ServerName' : '', #
- # If the client implements the SMB 2.1 or SMB 3.0 dialects, it MUST
- # also implement the following
- 'Dialect' : '', #
- 'SupportsFileLeasing' : False, #
- 'SupportsMultiCredit' : False, #
- # If the client implements the SMB 3.0 dialect,
- # it MUST also implement the following
- 'SupportsDirectoryLeasing' : False, #
- 'SupportsMultiChannel' : False, #
- 'SupportsPersistentHandles': False, #
- 'SupportsEncryption' : False, #
- 'ClientCapabilities' : 0,
- 'ServerCapabilities' : 0, #
- 'ClientSecurityMode' : 0, #
- 'ServerSecurityMode' : 0, #
- # Outside the protocol
- 'ServerIP' : '', #
- }
-
- self._Session = {
- 'SessionID' : 0, #
- 'TreeConnectTable' : {}, #
- 'SessionKey' : '', #
- 'SigningRequired' : False, #
- 'Connection' : 0, #
- 'UserCredentials' : '', #
- 'OpenTable' : {}, #
- # If the client implements the SMB 3.0 dialect,
- # it MUST also implement the following
- 'ChannelList' : [],
- 'ChannelSequence' : 0,
- #'EncryptData' : False,
- 'EncryptData' : True,
- 'EncryptionKey' : '',
- 'DecryptionKey' : '',
- 'SigningKey' : '',
- 'ApplicationKey' : '',
- # Outside the protocol
- 'SessionFlags' : 0, #
- 'ServerName' : '', #
- 'ServerDomain' : '', #
- 'ServerDNSDomainName' : '', #
- 'ServerOS' : '', #
- 'SigningActivated' : False, #
- }
-
- self.SMB_PACKET = SMB2Packet
-
- self._timeout = timeout
- self._Connection['ServerIP'] = remote_host
- self._NetBIOSSession = None
-
- self.__userName = ''
- self.__password = ''
- self.__domain = ''
- self.__lmhash = ''
- self.__nthash = ''
- self.__kdc = ''
- self.__aesKey = ''
- self.__TGT = None
- self.__TGS = None
-
- if sess_port == 445 and remote_name == '*SMBSERVER':
- self._Connection['ServerName'] = remote_host
- else:
- self._Connection['ServerName'] = remote_name
-
- if session is None:
- if not my_name:
- my_name = socket.gethostname()
- i = string.find(my_name, '.')
- if i > -1:
- my_name = my_name[:i]
-
- if UDP:
- self._NetBIOSSession = nmb.NetBIOSUDPSession(my_name, self._Connection['ServerName'], remote_host, host_type, sess_port, self._timeout)
- else:
- self._NetBIOSSession = nmb.NetBIOSTCPSession(my_name, self._Connection['ServerName'], remote_host, host_type, sess_port, self._timeout)
-
- self.negotiateSession(preferredDialect)
- else:
- self._NetBIOSSession = session
- # We should increase the SequenceWindow since a packet was already received.
- self._Connection['SequenceWindow'] += 1
- # Let's negotiate again using the same connection
- self.negotiateSession(preferredDialect)
-
- def printStatus(self):
- print("CONNECTION")
- for i in self._Connection.items():
- print("%-40s : %s" % i)
- print()
- print("SESSION")
- for i in self._Session.items():
- print("%-40s : %s" % i)
-
- def getServerName(self):
- return self._Session['ServerName']
-
- def getServerIP(self):
- return self._Connection['ServerIP']
-
- def getServerDomain(self):
- return self._Session['ServerDomain']
-
- def getServerDNSDomainName(self):
- return self._Session['ServerDNSDomainName']
-
- def getServerOS(self):
- return self._Session['ServerOS']
-
- def getServerOSMajor(self):
- return self._Session['ServerOSMajor']
-
- def getServerOSMinor(self):
- return self._Session['ServerOSMinor']
-
- def getServerOSBuild(self):
- return self._Session['ServerOSBuild']
-
- def isGuestSession(self):
- return self._Session['SessionFlags'] & SMB2_SESSION_FLAG_IS_GUEST
-
- def setTimeout(self, timeout):
- self._timeout = timeout
-
- @contextmanager
- def useTimeout(self, timeout):
- prev_timeout = self.getTimeout(timeout)
- try:
- yield
- finally:
- self.setTimeout(prev_timeout)
-
- def getDialect(self):
- return self._Connection['Dialect']
-
-
- def signSMB(self, packet):
- packet['Signature'] = '\x00'*16
- if self._Connection['Dialect'] == SMB2_DIALECT_21 or self._Connection['Dialect'] == SMB2_DIALECT_002:
- if len(self._Session['SessionKey']) > 0:
- signature = hmac.new(self._Session['SessionKey'], str(packet), hashlib.sha256).digest()
- packet['Signature'] = signature[:16]
- else:
- if len(self._Session['SessionKey']) > 0:
- p = str(packet)
- signature = crypto.AES_CMAC(self._Session['SigningKey'], p, len(p))
- packet['Signature'] = signature
-
- def sendSMB(self, packet):
- # The idea here is to receive multiple/single commands and create a compound request, and send it
- # Should return the MessageID for later retrieval. Implement compounded related requests.
-
- # If Connection.Dialect is equal to "3.000" and if Connection.SupportsMultiChannel or
- # Connection.SupportsPersistentHandles is TRUE, the client MUST set ChannelSequence in the
- # SMB2 header to Session.ChannelSequence
-
- # Check this is not a CANCEL request. If so, don't consume sequece numbers
- if packet['Command'] is not SMB2_CANCEL:
- packet['MessageID'] = self._Connection['SequenceWindow']
- self._Connection['SequenceWindow'] += 1
- packet['SessionID'] = self._Session['SessionID']
-
- # Default the credit charge to 1 unless set by the caller
- if ('CreditCharge' in packet.fields) is False:
- packet['CreditCharge'] = 1
-
- # Standard credit request after negotiating protocol
- if self._Connection['SequenceWindow'] > 3:
- packet['CreditRequestResponse'] = 127
-
- messageId = packet['MessageID']
-
- if self._Session['SigningActivated'] is True and self._Connection['SequenceWindow'] > 2:
- if packet['TreeID'] > 0 and (packet['TreeID'] in self._Session['TreeConnectTable']) is True:
- if self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is False:
- packet['Flags'] = SMB2_FLAGS_SIGNED
- self.signSMB(packet)
- elif packet['TreeID'] == 0:
- packet['Flags'] = SMB2_FLAGS_SIGNED
- self.signSMB(packet)
-
- if (self._Session['SessionFlags'] & SMB2_SESSION_FLAG_ENCRYPT_DATA) or ( packet['TreeID'] != 0 and self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is True):
- plainText = str(packet)
- transformHeader = SMB2_TRANSFORM_HEADER()
- transformHeader['Nonce'] = ''.join([random.choice(string.letters) for i in range(11)])
- transformHeader['OriginalMessageSize'] = len(plainText)
- transformHeader['EncryptionAlgorithm'] = SMB2_ENCRYPTION_AES128_CCM
- transformHeader['SessionID'] = self._Session['SessionID']
- from Crypto.Cipher import AES
- try:
- AES.MODE_CCM
- except:
- LOG.critical("Your pycrypto doesn't support AES.MODE_CCM. Currently only pycrypto experimental supports this mode.\nDownload it from https://www.dlitz.net/software/pycrypto ")
- raise
- cipher = AES.new(self._Session['EncryptionKey'], AES.MODE_CCM, transformHeader['Nonce'])
- cipher.update(str(transformHeader)[20:])
- cipherText = cipher.encrypt(plainText)
- transformHeader['Signature'] = cipher.digest()
- packet = str(transformHeader) + cipherText
-
- self._NetBIOSSession.send_packet(str(packet))
- return messageId
-
- def recvSMB(self, packetID = None):
- # First, verify we don't have the packet already
- if packetID in self._Connection['OutstandingResponses']:
- return self._Connection['OutstandingResponses'].pop(packetID)
-
- data = self._NetBIOSSession.recv_packet(self._timeout)
-
- if data.get_trailer().startswith('\xfdSMB'):
- # Packet is encrypted
- transformHeader = SMB2_TRANSFORM_HEADER(data.get_trailer())
- from Crypto.Cipher import AES
- try:
- AES.MODE_CCM
- except:
- LOG.critical("Your pycrypto doesn't support AES.MODE_CCM. Currently only pycrypto experimental supports this mode.\nDownload it from https://www.dlitz.net/software/pycrypto ")
- raise
- cipher = AES.new(self._Session['DecryptionKey'], AES.MODE_CCM, transformHeader['Nonce'][:11])
- cipher.update(str(transformHeader)[20:])
- plainText = cipher.decrypt(data.get_trailer()[len(SMB2_TRANSFORM_HEADER()):])
- #cipher.verify(transformHeader['Signature'])
- packet = SMB2Packet(plainText)
- else:
- # In all SMB dialects for a response this field is interpreted as the Status field.
- # This field can be set to any value. For a list of valid status codes,
- # see [MS-ERREF] section 2.3.
- packet = SMB2Packet(data.get_trailer())
-
- # Loop while we receive pending requests
- if packet['Status'] == STATUS_PENDING:
- status = STATUS_PENDING
- while status == STATUS_PENDING:
- data = self._NetBIOSSession.recv_packet(self._timeout)
- if data.get_trailer().startswith('\xfeSMB'):
- packet = SMB2Packet(data.get_trailer())
- else:
- # Packet is encrypted
- transformHeader = SMB2_TRANSFORM_HEADER(data.get_trailer())
- from Crypto.Cipher import AES
- try:
- AES.MODE_CCM
- except:
- LOG.critical("Your pycrypto doesn't support AES.MODE_CCM. Currently only pycrypto experimental supports this mode.\nDownload it from https://www.dlitz.net/software/pycrypto ")
- raise
- cipher = AES.new(self._Session['DecryptionKey'], AES.MODE_CCM, transformHeader['Nonce'][:11])
- cipher.update(str(transformHeader)[20:])
- plainText = cipher.decrypt(data.get_trailer()[len(SMB2_TRANSFORM_HEADER()):])
- #cipher.verify(transformHeader['Signature'])
- packet = SMB2Packet(plainText)
- status = packet['Status']
-
- if packet['MessageID'] == packetID or packetID is None:
- # if self._Session['SigningRequired'] is True:
- # self.signSMB(packet)
- # Let's update the sequenceWindow based on the CreditsCharged
- self._Connection['SequenceWindow'] += (packet['CreditCharge'] - 1)
- return packet
- else:
- self._Connection['OutstandingResponses'][packet['MessageID']] = packet
- return self.recvSMB(packetID)
-
- def negotiateSession(self, preferredDialect = None):
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_NEGOTIATE
- negSession = SMB2Negotiate()
-
- negSession['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_ENABLED
- if self.RequireMessageSigning is True:
- negSession['SecurityMode'] |= SMB2_NEGOTIATE_SIGNING_REQUIRED
- negSession['Capabilities'] = SMB2_GLOBAL_CAP_ENCRYPTION
- negSession['ClientGuid'] = self.ClientGuid
- if preferredDialect is not None:
- negSession['Dialects'] = [preferredDialect]
- else:
- negSession['Dialects'] = [SMB2_DIALECT_002, SMB2_DIALECT_21, SMB2_DIALECT_30]
- negSession['DialectCount'] = len(negSession['Dialects'])
- packet['Data'] = negSession
-
- # Storing this data for later use
- self._Connection['ClientSecurityMode'] = negSession['SecurityMode']
- self._Connection['Capabilities'] = negSession['Capabilities']
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
- if ans.isValidAnswer(STATUS_SUCCESS):
- # ToDo this:
- # If the DialectRevision in the SMB2 NEGOTIATE Response is 0x02FF, the client MUST issue a new
- # SMB2 NEGOTIATE request as described in section 3.2.4.2.2.2 with the only exception
- # that the client MUST allocate sequence number 1 from Connection.SequenceWindow, and MUST set
- # MessageId field of the SMB2 header to 1. Otherwise, the client MUST proceed as follows.
- negResp = SMB2Negotiate_Response(ans['Data'])
- self._Connection['MaxTransactSize'] = min(0x100000,negResp['MaxTransactSize'])
- self._Connection['MaxReadSize'] = min(0x100000,negResp['MaxReadSize'])
- self._Connection['MaxWriteSize'] = min(0x100000,negResp['MaxWriteSize'])
- self._Connection['ServerGuid'] = negResp['ServerGuid']
- self._Connection['GSSNegotiateToken'] = negResp['Buffer']
- self._Connection['Dialect'] = negResp['DialectRevision']
- if (negResp['SecurityMode'] & SMB2_NEGOTIATE_SIGNING_REQUIRED) == SMB2_NEGOTIATE_SIGNING_REQUIRED:
- self._Connection['RequireSigning'] = True
- if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_LEASING) == SMB2_GLOBAL_CAP_LEASING:
- self._Connection['SupportsFileLeasing'] = True
- if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_LARGE_MTU) == SMB2_GLOBAL_CAP_LARGE_MTU:
- self._Connection['SupportsMultiCredit'] = True
-
- if self._Connection['Dialect'] == SMB2_DIALECT_30:
- # Switching to the right packet format
- self.SMB_PACKET = SMB3Packet
- if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) == SMB2_GLOBAL_CAP_DIRECTORY_LEASING:
- self._Connection['SupportsDirectoryLeasing'] = True
- if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_MULTI_CHANNEL) == SMB2_GLOBAL_CAP_MULTI_CHANNEL:
- self._Connection['SupportsMultiChannel'] = True
- if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == SMB2_GLOBAL_CAP_PERSISTENT_HANDLES:
- self._Connection['SupportsPersistentHandles'] = True
- if (negResp['Capabilities'] & SMB2_GLOBAL_CAP_ENCRYPTION) == SMB2_GLOBAL_CAP_ENCRYPTION:
- self._Connection['SupportsEncryption'] = True
-
- self._Connection['ServerCapabilities'] = negResp['Capabilities']
- self._Connection['ServerSecurityMode'] = negResp['SecurityMode']
-
- def getCredentials(self):
- return (
- self.__userName,
- self.__password,
- self.__domain,
- self.__lmhash,
- self.__nthash,
- self.__aesKey,
- self.__TGT,
- self.__TGS)
-
- def kerberosLogin(self, user, password, domain = '', lmhash = '', nthash = '', aesKey='', kdcHost = '', TGT=None, TGS=None):
- # If TGT or TGS are specified, they are in the form of:
- # TGS['KDC_REP'] = the response from the server
- # TGS['cipher'] = the cipher used
- # TGS['sessionKey'] = the sessionKey
- # If we have hashes, normalize them
- if lmhash != '' or nthash != '':
- if len(lmhash) % 2: lmhash = '0%s' % lmhash
- if len(nthash) % 2: nthash = '0%s' % nthash
- try: # just in case they were converted already
- lmhash = a2b_hex(lmhash)
- nthash = a2b_hex(nthash)
- except:
- pass
-
- self.__userName = user
- self.__password = password
- self.__domain = domain
- self.__lmhash = lmhash
- self.__nthash = nthash
- self.__kdc = kdcHost
- self.__aesKey = aesKey
- self.__TGT = TGT
- self.__TGS = TGS
-
- sessionSetup = SMB2SessionSetup()
- if self.RequireMessageSigning is True:
- sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_REQUIRED
- else:
- sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_ENABLED
-
- sessionSetup['Flags'] = 0
- #sessionSetup['Capabilities'] = SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_DFS
-
- # Importing down here so pyasn1 is not required if kerberos is not used.
- from impacket.krb5.asn1 import AP_REQ, Authenticator, TGS_REP, seq_set
- from impacket.krb5.kerberosv5 import getKerberosTGT, getKerberosTGS
- from impacket.krb5 import constants
- from impacket.krb5.types import Principal, KerberosTime, Ticket
- from pyasn1.codec.der import decoder, encoder
- import datetime
-
- # First of all, we need to get a TGT for the user
- userName = Principal(user, type=constants.PrincipalNameType.NT_PRINCIPAL.value)
- if TGT is None:
- if TGS is None:
- tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(userName, password, domain, lmhash, nthash, aesKey, kdcHost)
- else:
- tgt = TGT['KDC_REP']
- cipher = TGT['cipher']
- sessionKey = TGT['sessionKey']
-
- # Save the ticket
- # If you want, for debugging purposes
-# from impacket.krb5.ccache import CCache
-# ccache = CCache()
-# try:
-# if TGS is None:
-# ccache.fromTGT(tgt, oldSessionKey, sessionKey)
-# else:
-# ccache.fromTGS(TGS['KDC_REP'], TGS['oldSessionKey'], TGS['sessionKey'] )
-# ccache.saveFile('/tmp/ticket.bin')
-# except Exception, e:
-# print e
-# pass
-
- # Now that we have the TGT, we should ask for a TGS for cifs
-
- if TGS is None:
- serverName = Principal('cifs/%s' % (self._Connection['ServerName']), type=constants.PrincipalNameType.NT_SRV_INST.value)
- tgs, cipher, oldSessionKey, sessionKey = getKerberosTGS(serverName, domain, kdcHost, tgt, cipher, sessionKey)
- else:
- tgs = TGS['KDC_REP']
- cipher = TGS['cipher']
- sessionKey = TGS['sessionKey']
-
- # Let's build a NegTokenInit with a Kerberos REQ_AP
-
- blob = SPNEGO_NegTokenInit()
-
- # Kerberos
- blob['MechTypes'] = [TypesMech['MS KRB5 - Microsoft Kerberos 5']]
-
- # Let's extract the ticket from the TGS
- tgs = decoder.decode(tgs, asn1Spec = TGS_REP())[0]
- ticket = Ticket()
- ticket.from_asn1(tgs['ticket'])
-
- # Now let's build the AP_REQ
- apReq = AP_REQ()
- apReq['pvno'] = 5
- apReq['msg-type'] = int(constants.ApplicationTagNumbers.AP_REQ.value)
-
- opts = list()
- apReq['ap-options'] = constants.encodeFlags(opts)
- seq_set(apReq,'ticket', ticket.to_asn1)
-
- authenticator = Authenticator()
- authenticator['authenticator-vno'] = 5
- authenticator['crealm'] = domain
- seq_set(authenticator, 'cname', userName.components_to_asn1)
- now = datetime.datetime.utcnow()
-
- authenticator['cusec'] = now.microsecond
- authenticator['ctime'] = KerberosTime.to_asn1(now)
-
- encodedAuthenticator = encoder.encode(authenticator)
-
- # Key Usage 11
- # AP-REQ Authenticator (includes application authenticator
- # subkey), encrypted with the application session key
- # (Section 5.5.1)
- encryptedEncodedAuthenticator = cipher.encrypt(sessionKey, 11, encodedAuthenticator, None)
-
- apReq['authenticator'] = None
- apReq['authenticator']['etype'] = cipher.enctype
- apReq['authenticator']['cipher'] = encryptedEncodedAuthenticator
-
- blob['MechToken'] = encoder.encode(apReq)
-
- sessionSetup['SecurityBufferLength'] = len(blob)
- sessionSetup['Buffer'] = blob.getData()
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_SESSION_SETUP
- packet['Data'] = sessionSetup
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
- if ans.isValidAnswer(STATUS_SUCCESS):
- self._Session['SessionID'] = ans['SessionID']
- self._Session['SigningRequired'] = self._Connection['RequireSigning']
- self._Session['UserCredentials'] = (user, password, domain, lmhash, nthash)
- self._Session['Connection'] = self._NetBIOSSession.get_socket()
-
- self._Session['SessionKey'] = sessionKey.contents[:16]
- if self._Session['SigningRequired'] is True and self._Connection['Dialect'] == SMB2_DIALECT_30:
- self._Session['SigningKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2AESCMAC\x00", "SmbSign\x00", 128)
-
- # Calculate the key derivations for dialect 3.0
- if self._Session['SigningRequired'] is True:
- self._Session['SigningActivated'] = True
- if self._Connection['Dialect'] == SMB2_DIALECT_30:
- self._Session['ApplicationKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2APP\x00", "SmbRpc\x00", 128)
- self._Session['EncryptionKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2AESCCM\x00", "ServerIn \x00", 128)
- self._Session['DecryptionKey'] = crypto.KDF_CounterMode(self._Session['SessionKey'], "SMB2AESCCM\x00", "ServerOut\x00", 128)
-
- return True
- else:
- # We clean the stuff we used in case we want to authenticate again
- # within the same connection
- self._Session['UserCredentials'] = ''
- self._Session['Connection'] = 0
- self._Session['SessionID'] = 0
- self._Session['SigningRequired'] = False
- self._Session['SigningKey'] = ''
- self._Session['SessionKey'] = ''
- self._Session['SigningActivated'] = False
- raise
-
-
- def login(self, user, password, domain = '', lmhash = '', nthash = ''):
- # If we have hashes, normalize them
- if lmhash != '' or nthash != '':
- if len(lmhash) % 2: lmhash = '0%s' % lmhash
- if len(nthash) % 2: nthash = '0%s' % nthash
- try: # just in case they were converted already
- lmhash = a2b_hex(lmhash)
- nthash = a2b_hex(nthash)
- except:
- pass
-
- self.__userName = user
- self.__password = password
- self.__domain = domain
- self.__lmhash = lmhash
- self.__nthash = nthash
- self.__aesKey = ''
- self.__TGT = None
- self.__TGS = None
-
- sessionSetup = SMB2SessionSetup()
- if self.RequireMessageSigning is True:
- sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_REQUIRED
- else:
- sessionSetup['SecurityMode'] = SMB2_NEGOTIATE_SIGNING_ENABLED
-
- sessionSetup['Flags'] = 0
- #sessionSetup['Capabilities'] = SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_DFS
-
- # Let's build a NegTokenInit with the NTLMSSP
- # TODO: In the future we should be able to choose different providers
-
- blob = SPNEGO_NegTokenInit()
-
- # NTLMSSP
- blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
- auth = ntlm.getNTLMSSPType1('','', self._Connection['RequireSigning'])
- blob['MechToken'] = str(auth)
-
- sessionSetup['SecurityBufferLength'] = len(blob)
- sessionSetup['Buffer'] = blob.getData()
-
- # ToDo:
- # If this authentication is for establishing an alternative channel for an existing Session, as specified
- # in section 3.2.4.1.7, the client MUST also set the following values:
- # The SessionId field in the SMB2 header MUST be set to the Session.SessionId for the new
- # channel being established.
- # The SMB2_SESSION_FLAG_BINDING bit MUST be set in the Flags field.
- # The PreviousSessionId field MUST be set to zero.
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_SESSION_SETUP
- packet['Data'] = sessionSetup
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
- if ans.isValidAnswer(STATUS_MORE_PROCESSING_REQUIRED):
- self._Session['SessionID'] = ans['SessionID']
- self._Session['SigningRequired'] = self._Connection['RequireSigning']
- self._Session['UserCredentials'] = (user, password, domain, lmhash, nthash)
- self._Session['Connection'] = self._NetBIOSSession.get_socket()
- sessionSetupResponse = SMB2SessionSetup_Response(ans['Data'])
- respToken = SPNEGO_NegTokenResp(sessionSetupResponse['Buffer'])
-
- # Let's parse some data and keep it to ourselves in case it is asked
- ntlmChallenge = ntlm.NTLMAuthChallenge(respToken['ResponseToken'])
- if ntlmChallenge['TargetInfoFields_len'] > 0:
- av_pairs = ntlm.AV_PAIRS(ntlmChallenge['TargetInfoFields'][:ntlmChallenge['TargetInfoFields_len']])
- if av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] is not None:
- try:
- self._Session['ServerName'] = av_pairs[ntlm.NTLMSSP_AV_HOSTNAME][1].decode('utf-16le')
- except:
- # For some reason, we couldn't decode Unicode here.. silently discard the operation
- pass
- if av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] is not None:
- try:
- if self._Session['ServerName'] != av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le'):
- self._Session['ServerDomain'] = av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME][1].decode('utf-16le')
- except:
- # For some reason, we couldn't decode Unicode here.. silently discard the operation
- pass
- if av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] is not None:
- try:
- self._Session['ServerDNSDomainName'] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME][1].decode('utf-16le')
- except:
- # For some reason, we couldn't decode Unicode here.. silently discard the operation
- pass
-
- # Parse Version to know the target Operating system name. Not provided elsewhere anymore
- if 'Version' in ntlmChallenge.fields:
- version = ntlmChallenge['Version']
-
- if len(version) >= 4:
- self._Session['ServerOS'] = "Windows %d.%d Build %d" % (ord(version[0]), ord(version[1]), struct.unpack('<H',version[2:4])[0])
- self._Session["ServerOSMajor"] = ord(version[0])
- self._Session["ServerOSMinor"] = ord(version[1])
- self._Session["ServerOSBuild"] = struct.unpack('<H',version[2:4])[0]
-
- type3, exportedSessionKey = ntlm.getNTLMSSPType3(auth, respToken['ResponseToken'], user, password, domain, lmhash, nthash)
-
- if exportedSessionKey is not None:
- self._Session['SessionKey'] = exportedSessionKey
- if self._Session['SigningRequired'] is True and self._Connection['Dialect'] == SMB2_DIALECT_30:
- self._Session['SigningKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2AESCMAC\x00", "SmbSign\x00", 128)
-
- respToken2 = SPNEGO_NegTokenResp()
- respToken2['ResponseToken'] = str(type3)
-
- # Reusing the previous structure
- sessionSetup['SecurityBufferLength'] = len(respToken2)
- sessionSetup['Buffer'] = respToken2.getData()
-
- packetID = self.sendSMB(packet)
- packet = self.recvSMB(packetID)
- try:
- if packet.isValidAnswer(STATUS_SUCCESS):
- sessionSetupResponse = SMB2SessionSetup_Response(packet['Data'])
- self._Session['SessionFlags'] = sessionSetupResponse['SessionFlags']
-
- # Calculate the key derivations for dialect 3.0
- if self._Session['SigningRequired'] is True:
- self._Session['SigningActivated'] = True
- if self._Connection['Dialect'] == SMB2_DIALECT_30:
- self._Session['ApplicationKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2APP\x00", "SmbRpc\x00", 128)
- self._Session['EncryptionKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2AESCCM\x00", "ServerIn \x00", 128)
- self._Session['DecryptionKey'] = crypto.KDF_CounterMode(exportedSessionKey, "SMB2AESCCM\x00", "ServerOut\x00", 128)
-
- return True
- except:
- # We clean the stuff we used in case we want to authenticate again
- # within the same connection
- self._Session['UserCredentials'] = ''
- self._Session['Connection'] = 0
- self._Session['SessionID'] = 0
- self._Session['SigningRequired'] = False
- self._Session['SigningKey'] = ''
- self._Session['SessionKey'] = ''
- self._Session['SigningActivated'] = False
- raise
-
- def connectTree(self, share):
-
- # Just in case this came with the full path (maybe an SMB1 client), let's just leave
- # the sharename, we'll take care of the rest
-
- #print self._Session['TreeConnectTable']
- share = share.split('\\')[-1]
- if share in self._Session['TreeConnectTable']:
- # Already connected, no need to reconnect
- treeEntry = self._Session['TreeConnectTable'][share]
- treeEntry['NumberOfUses'] += 1
- self._Session['TreeConnectTable'][treeEntry['TreeConnectId']]['NumberOfUses'] += 1
- return treeEntry['TreeConnectId']
-
- #path = share
- try:
- _, _, _, _, sockaddr = socket.getaddrinfo(self._Connection['ServerIP'], 80, 0, 0, socket.IPPROTO_TCP)[0]
- remoteHost = sockaddr[0]
- except:
- remoteHost = self._Connection['ServerIP']
- path = '\\\\' + remoteHost + '\\' +share
-
- treeConnect = SMB2TreeConnect()
- treeConnect['Buffer'] = path.encode('utf-16le')
- treeConnect['PathLength'] = len(path)*2
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_TREE_CONNECT
- packet['Data'] = treeConnect
- packetID = self.sendSMB(packet)
- packet = self.recvSMB(packetID)
- if packet.isValidAnswer(STATUS_SUCCESS):
- treeConnectResponse = SMB2TreeConnect_Response(packet['Data'])
- treeEntry = copy.deepcopy(TREE_CONNECT)
- treeEntry['ShareName'] = share
- treeEntry['TreeConnectId'] = packet['TreeID']
- treeEntry['Session'] = packet['SessionID']
- treeEntry['NumberOfUses'] += 1
- if (treeConnectResponse['Capabilities'] & SMB2_SHARE_CAP_DFS) == SMB2_SHARE_CAP_DFS:
- treeEntry['IsDfsShare'] = True
- if (treeConnectResponse['Capabilities'] & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY) == SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY:
- treeEntry['IsCAShare'] = True
-
- if self._Connection['Dialect'] == SMB2_DIALECT_30:
- if (self._Connection['SupportsEncryption'] is True) and ((treeConnectResponse['ShareFlags'] & SMB2_SHAREFLAG_ENCRYPT_DATA) == SMB2_SHAREFLAG_ENCRYPT_DATA):
- treeEntry['EncryptData'] = True
- # ToDo: This and what follows
- # If Session.EncryptData is FALSE, the client MUST then generate an encryption key, a
- # decryption key as specified in section 3.1.4.2, by providing the following inputs and store
- # them in Session.EncryptionKey and Session.DecryptionKey:
- if (treeConnectResponse['Capabilities'] & SMB2_SHARE_CAP_SCALEOUT) == SMB2_SHARE_CAP_SCALEOUT:
- treeEntry['IsScaleoutShare'] = True
-
- self._Session['TreeConnectTable'][packet['TreeID']] = treeEntry
- self._Session['TreeConnectTable'][share] = treeEntry
-
- return packet['TreeID']
-
- def disconnectTree(self, treeId):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- if treeId in self._Session['TreeConnectTable']:
- # More than 1 use? descrease it and return, if not, send the packet
- if self._Session['TreeConnectTable'][treeId]['NumberOfUses'] > 1:
- treeEntry = self._Session['TreeConnectTable'][treeId]
- treeEntry['NumberOfUses'] -= 1
- self._Session['TreeConnectTable'][treeEntry['ShareName']]['NumberOfUses'] -= 1
- return True
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_TREE_DISCONNECT
- packet['TreeID'] = treeId
- treeDisconnect = SMB2TreeDisconnect()
- packet['Data'] = treeDisconnect
- packetID = self.sendSMB(packet)
- packet = self.recvSMB(packetID)
- if packet.isValidAnswer(STATUS_SUCCESS):
- shareName = self._Session['TreeConnectTable'][treeId]['ShareName']
- del(self._Session['TreeConnectTable'][shareName])
- del(self._Session['TreeConnectTable'][treeId])
- return True
-
- def create(self, treeId, fileName, desiredAccess, shareMode, creationOptions, creationDisposition, fileAttributes, impersonationLevel = SMB2_IL_IMPERSONATION, securityFlags = 0, oplockLevel = SMB2_OPLOCK_LEVEL_NONE, createContexts = None):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- fileName = string.replace(fileName, '/', '\\')
- if len(fileName) > 0:
- fileName = ntpath.normpath(fileName)
- if fileName[0] == '\\':
- fileName = fileName[1:]
-
- if self._Session['TreeConnectTable'][treeId]['IsDfsShare'] is True:
- pathName = fileName
- else:
- pathName = '\\\\' + self._Connection['ServerName'] + '\\' + fileName
-
- fileEntry = copy.deepcopy(FILE)
- fileEntry['LeaseKey'] = uuid.generate()
- fileEntry['LeaseState'] = SMB2_LEASE_NONE
- self.GlobalFileTable[pathName] = fileEntry
-
- if self._Connection['Dialect'] == SMB2_DIALECT_30 and self._Connection['SupportsDirectoryLeasing'] is True:
- # Is this file NOT on the root directory?
- if len(fileName.split('\\')) > 2:
- parentDir = ntpath.dirname(pathName)
- if parentDir in self.GlobalFileTable:
- LOG.critical("Don't know what to do now! :-o")
- raise
- else:
- parentEntry = copy.deepcopy(FILE)
- parentEntry['LeaseKey'] = uuid.generate()
- parentEntry['LeaseState'] = SMB2_LEASE_NONE
- self.GlobalFileTable[parentDir] = parentEntry
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_CREATE
- packet['TreeID'] = treeId
- if self._Session['TreeConnectTable'][treeId]['IsDfsShare'] is True:
- packet['Flags'] = SMB2_FLAGS_DFS_OPERATIONS
-
- smb2Create = SMB2Create()
- smb2Create['SecurityFlags'] = 0
- smb2Create['RequestedOplockLevel'] = oplockLevel
- smb2Create['ImpersonationLevel'] = impersonationLevel
- smb2Create['DesiredAccess'] = desiredAccess
- smb2Create['FileAttributes'] = fileAttributes
- smb2Create['ShareAccess'] = shareMode
- smb2Create['CreateDisposition'] = creationDisposition
- smb2Create['CreateOptions'] = creationOptions
-
- smb2Create['NameLength'] = len(fileName)*2
- if fileName != '':
- smb2Create['Buffer'] = fileName.encode('utf-16le')
- else:
- smb2Create['Buffer'] = '\x00'
-
- if createContexts is not None:
- smb2Create['Buffer'] += createContexts
- smb2Create['CreateContextsOffset'] = len(SMB2Packet()) + SMB2Create.SIZE + smb2Create['NameLength']
- smb2Create['CreateContextsLength'] = len(createContexts)
- else:
- smb2Create['CreateContextsOffset'] = 0
- smb2Create['CreateContextsLength'] = 0
-
- packet['Data'] = smb2Create
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
- if ans.isValidAnswer(STATUS_SUCCESS):
- createResponse = SMB2Create_Response(ans['Data'])
-
- openFile = copy.deepcopy(OPEN)
- openFile['FileID'] = createResponse['FileID']
- openFile['TreeConnect'] = treeId
- openFile['Oplocklevel'] = oplockLevel
- openFile['Durable'] = False
- openFile['ResilientHandle'] = False
- openFile['LastDisconnectTime'] = 0
- openFile['FileName'] = pathName
-
- # ToDo: Complete the OperationBuckets
- if self._Connection['Dialect'] == SMB2_DIALECT_30:
- openFile['DesiredAccess'] = oplockLevel
- openFile['ShareMode'] = oplockLevel
- openFile['CreateOptions'] = oplockLevel
- openFile['FileAttributes'] = oplockLevel
- openFile['CreateDisposition'] = oplockLevel
-
- # ToDo: Process the contexts
- self._Session['OpenTable'][str(createResponse['FileID'])] = openFile
-
- # The client MUST generate a handle for the Open, and it MUST
- # return success and the generated handle to the calling application.
- # In our case, str(FileID)
- return str(createResponse['FileID'])
-
- def close(self, treeId, fileId):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_CLOSE
- packet['TreeID'] = treeId
-
- smbClose = SMB2Close()
- smbClose['Flags'] = 0
- smbClose['FileID'] = fileId
-
- packet['Data'] = smbClose
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- del(self.GlobalFileTable[self._Session['OpenTable'][fileId]['FileName']])
- del(self._Session['OpenTable'][fileId])
-
- # ToDo Remove stuff from GlobalFileTable
- return True
-
- def read(self, treeId, fileId, offset = 0, bytesToRead = 0, waitAnswer = True):
- # IMPORTANT NOTE: As you can see, this was coded as a recursive function
- # Hence, you can exhaust the memory pretty easy ( large bytesToRead )
- # This function should NOT be used for reading files directly, but another higher
- # level function should be used that will break the read into smaller pieces
-
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_READ
- packet['TreeID'] = treeId
-
- if self._Connection['MaxReadSize'] < bytesToRead:
- maxBytesToRead = self._Connection['MaxReadSize']
- else:
- maxBytesToRead = bytesToRead
-
- if self._Connection['Dialect'] != SMB2_DIALECT_002 and self._Connection['SupportsMultiCredit'] is True:
- packet['CreditCharge'] = ( 1 + (maxBytesToRead - 1) / 65536)
- else:
- maxBytesToRead = min(65536,bytesToRead)
-
- smbRead = SMB2Read()
- smbRead['Padding'] = 0x50
- smbRead['FileID'] = fileId
- smbRead['Length'] = maxBytesToRead
- smbRead['Offset'] = offset
- packet['Data'] = smbRead
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- readResponse = SMB2Read_Response(ans['Data'])
- retData = readResponse['Buffer']
- if readResponse['DataRemaining'] > 0:
- retData += self.read(treeId, fileId, offset+len(retData), readResponse['DataRemaining'], waitAnswer)
- return retData
-
- def write(self, treeId, fileId, data, offset = 0, bytesToWrite = 0, waitAnswer = True):
- # IMPORTANT NOTE: As you can see, this was coded as a recursive function
- # Hence, you can exhaust the memory pretty easy ( large bytesToWrite )
- # This function should NOT be used for writing directly to files, but another higher
- # level function should be used that will break the writes into smaller pieces
-
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_WRITE
- packet['TreeID'] = treeId
-
- if self._Connection['MaxWriteSize'] < bytesToWrite:
- maxBytesToWrite = self._Connection['MaxWriteSize']
- else:
- maxBytesToWrite = bytesToWrite
-
- if self._Connection['Dialect'] != SMB2_DIALECT_002 and self._Connection['SupportsMultiCredit'] is True:
- packet['CreditCharge'] = ( 1 + (maxBytesToWrite - 1) / 65536)
- else:
- maxBytesToWrite = min(65536,bytesToWrite)
-
- smbWrite = SMB2Write()
- smbWrite['FileID'] = fileId
- smbWrite['Length'] = maxBytesToWrite
- smbWrite['Offset'] = offset
- smbWrite['WriteChannelInfoOffset'] = 0
- smbWrite['Buffer'] = data[:maxBytesToWrite]
- packet['Data'] = smbWrite
-
- packetID = self.sendSMB(packet)
- if waitAnswer is True:
- ans = self.recvSMB(packetID)
- else:
- return maxBytesToWrite
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- writeResponse = SMB2Write_Response(ans['Data'])
- bytesWritten = writeResponse['Count']
- if bytesWritten < bytesToWrite:
- bytesWritten += self.write(treeId, fileId, data[bytesWritten:], offset+bytesWritten, bytesToWrite-bytesWritten, waitAnswer)
- return bytesWritten
-
- def queryDirectory(self, treeId, fileId, searchString = '*', resumeIndex = 0, informationClass = FILENAMES_INFORMATION, maxBufferSize = None, enumRestart = False, singleEntry = False):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_QUERY_DIRECTORY
- packet['TreeID'] = treeId
-
- queryDirectory = SMB2QueryDirectory()
- queryDirectory['FileInformationClass'] = informationClass
- if resumeIndex != 0 :
- queryDirectory['Flags'] = SMB2_INDEX_SPECIFIED
- queryDirectory['FileIndex'] = resumeIndex
- queryDirectory['FileID'] = fileId
- if maxBufferSize is None:
- maxBufferSize = self._Connection['MaxReadSize']
- queryDirectory['OutputBufferLength'] = maxBufferSize
- queryDirectory['FileNameLength'] = len(searchString)*2
- queryDirectory['Buffer'] = searchString.encode('utf-16le')
-
- packet['Data'] = queryDirectory
-
- if self._Connection['Dialect'] != SMB2_DIALECT_002 and self._Connection['SupportsMultiCredit'] is True:
- packet['CreditCharge'] = ( 1 + (maxBufferSize - 1) / 65536)
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
- if ans.isValidAnswer(STATUS_SUCCESS):
- queryDirectoryResponse = SMB2QueryDirectory_Response(ans['Data'])
- return queryDirectoryResponse['Buffer']
-
- def echo(self):
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_ECHO
- smbEcho = SMB2Echo()
- packet['Data'] = smbEcho
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
- if ans.isValidAnswer(STATUS_SUCCESS):
- return True
-
- def cancel(self, packetID):
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_CANCEL
- packet['MessageID'] = packetID
-
- smbCancel = SMB2Cancel()
-
- packet['Data'] = smbCancel
- self.sendSMB(packet)
-
- def ioctl(self, treeId, fileId = None, ctlCode = -1, flags = 0, inputBlob = '', maxInputResponse = None, maxOutputResponse = None, waitAnswer = 1):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if fileId is None:
- fileId = '\xff'*16
- else:
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_IOCTL
- packet['TreeID'] = treeId
-
- smbIoctl = SMB2Ioctl()
- smbIoctl['FileID'] = fileId
- smbIoctl['CtlCode'] = ctlCode
- smbIoctl['MaxInputResponse'] = maxInputResponse
- smbIoctl['MaxOutputResponse'] = maxOutputResponse
- smbIoctl['InputCount'] = len(inputBlob)
- if len(inputBlob) == 0:
- smbIoctl['InputOffset'] = 0
- smbIoctl['Buffer'] = '\x00'
- else:
- smbIoctl['Buffer'] = inputBlob
- smbIoctl['OutputOffset'] = 0
- smbIoctl['MaxOutputResponse'] = maxOutputResponse
- smbIoctl['Flags'] = flags
-
- packet['Data'] = smbIoctl
-
- packetID = self.sendSMB(packet)
-
- if waitAnswer == 0:
- return True
-
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- smbIoctlResponse = SMB2Ioctl_Response(ans['Data'])
- return smbIoctlResponse['Buffer']
-
- def flush(self,treeId, fileId):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_FLUSH
- packet['TreeID'] = treeId
-
- smbFlush = SMB2Flush()
- smbFlush['FileID'] = fileId
-
- packet['Data'] = smbFlush
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- return True
-
- def lock(self, treeId, fileId, locks, lockSequence = 0):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_LOCK
- packet['TreeID'] = treeId
-
- smbLock = SMB2Lock()
- smbLock['FileID'] = fileId
- smbLock['LockCount'] = len(locks)
- smbLock['LockSequence'] = lockSequence
- smbLock['Locks'] = ''.join(str(x) for x in locks)
-
- packet['Data'] = smbLock
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- smbFlushResponse = SMB2Lock_Response(ans['Data'])
- return True
-
- # ToDo:
- # If Open.ResilientHandle is TRUE or Connection.SupportsMultiChannel is TRUE, the client MUST
- # do the following:
- # The client MUST scan through Open.OperationBuckets and find an element with its Free field
- # set to TRUE. If no such element could be found, an implementation-specific error MUST be
- # returned to the application.
- # Let the zero-based array index of the element chosen above be referred to as BucketIndex, and
- # let BucketNumber = BucketIndex +1.
- # Set Open.OperationBuckets[BucketIndex].Free = FALSE
- # Let the SequenceNumber of the element chosen above be referred to as BucketSequence.
- # The LockSequence field of the SMB2 lock request MUST be set to (BucketNumber<< 4) +
- # BucketSequence.
- # Increment the SequenceNumber of the element chosen above using MOD 16 arithmetic.
-
- def logoff(self):
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_LOGOFF
-
- smbLogoff = SMB2Logoff()
-
- packet['Data'] = smbLogoff
-
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- # We clean the stuff we used in case we want to authenticate again
- # within the same connection
- self._Session['UserCredentials'] = ''
- self._Session['Connection'] = 0
- self._Session['SessionID'] = 0
- self._Session['SigningRequired'] = False
- self._Session['SigningKey'] = ''
- self._Session['SessionKey'] = ''
- self._Session['SigningActivated'] = False
- return True
-
- def queryInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0, flags = 0 ):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_QUERY_INFO
- packet['TreeID'] = treeId
-
- queryInfo = SMB2QueryInfo()
- queryInfo['FileID'] = fileId
- queryInfo['InfoType'] = SMB2_0_INFO_FILE
- queryInfo['FileInfoClass'] = fileInfoClass
- queryInfo['OutputBufferLength'] = 65535
- queryInfo['AdditionalInformation'] = additionalInformation
- if len(inputBlob) == 0:
- queryInfo['InputBufferOffset'] = 0
- queryInfo['Buffer'] = '\x00'
- else:
- queryInfo['InputBufferLength'] = len(inputBlob)
- queryInfo['Buffer'] = inputBlob
- queryInfo['Flags'] = flags
-
- packet['Data'] = queryInfo
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- queryResponse = SMB2QueryInfo_Response(ans['Data'])
- return queryResponse['Buffer']
-
- def setInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0 ):
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if (fileId in self._Session['OpenTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- packet = self.SMB_PACKET()
- packet['Command'] = SMB2_SET_INFO
- packet['TreeID'] = treeId
-
- setInfo = SMB2SetInfo()
- setInfo['InfoType'] = SMB2_0_INFO_FILE
- setInfo['FileInfoClass'] = fileInfoClass
- setInfo['BufferLength'] = len(inputBlob)
- setInfo['AdditionalInformation'] = additionalInformation
- setInfo['FileID'] = fileId
- setInfo['Buffer'] = inputBlob
-
- packet['Data'] = setInfo
- packetID = self.sendSMB(packet)
- ans = self.recvSMB(packetID)
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- return True
-
- def getSessionKey(self):
- if self.getDialect() == SMB2_DIALECT_30:
- return self._Session['ApplicationKey']
- else:
- return self._Session['SessionKey']
-
- def setSessionKey(self, key):
- if self.getDialect() == SMB2_DIALECT_30:
- self._Session['ApplicationKey'] = key
- else:
- self._Session['SessionKey'] = key
-
- ######################################################################
- # Higher level functions
-
- def rename(self, shareName, oldPath, newPath):
- oldPath = string.replace(oldPath,'/', '\\')
- oldPath = ntpath.normpath(oldPath)
- if len(oldPath) > 0 and oldPath[0] == '\\':
- oldPath = oldPath[1:]
-
- newPath = string.replace(newPath,'/', '\\')
- newPath = ntpath.normpath(newPath)
- if len(newPath) > 0 and newPath[0] == '\\':
- newPath = newPath[1:]
-
- treeId = self.connectTree(shareName)
- fileId = None
- try:
- fileId = self.create(treeId, oldPath, MAXIMUM_ALLOWED ,FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE, 0x200020, FILE_OPEN, 0)
- renameReq = FILE_RENAME_INFORMATION_TYPE_2()
- renameReq['ReplaceIfExists'] = 1
- renameReq['RootDirectory'] = '\x00'*8
- renameReq['FileNameLength'] = len(newPath)*2
- renameReq['FileName'] = newPath.encode('utf-16le')
- self.setInfo(treeId, fileId, renameReq, infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_RENAME_INFO)
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- return True
-
- def writeFile(self, treeId, fileId, data, offset = 0):
- finished = False
- writeOffset = offset
- while not finished:
- if len(data) == 0:
- break
- writeData = data[:self._Connection['MaxWriteSize']]
- data = data[self._Connection['MaxWriteSize']:]
- written = self.write(treeId, fileId, writeData, writeOffset, len(writeData))
- writeOffset += written
- return writeOffset - offset
-
- def listPath(self, shareName, path, password = None):
- # ToDo: Handle situations where share is password protected
- path = string.replace(path,'/', '\\')
- path = ntpath.normpath(path)
- if len(path) > 0 and path[0] == '\\':
- path = path[1:]
-
- treeId = self.connectTree(shareName)
-
- fileId = None
- try:
- # ToDo, we're assuming it's a directory, we should check what the file type is
- fileId = self.create(treeId, ntpath.dirname(path), FILE_READ_ATTRIBUTES | FILE_READ_DATA ,FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, FILE_OPEN, 0)
- res = ''
- files = []
- from impacket import smb
- while True:
- try:
- res = self.queryDirectory( treeId, fileId, ntpath.basename(path), maxBufferSize = 65535, informationClass = FILE_FULL_DIRECTORY_INFORMATION )
- nextOffset = 1
- while nextOffset != 0:
- fileInfo = smb.SMBFindFileFullDirectoryInfo(smb.SMB.FLAGS2_UNICODE)
- fileInfo.fromString(res)
- files.append(smb.SharedFile(fileInfo['CreationTime'],fileInfo['LastAccessTime'],fileInfo['LastChangeTime'],fileInfo['EndOfFile'],fileInfo['AllocationSize'],fileInfo['ExtFileAttributes'],fileInfo['FileName'].decode('utf-16le'), fileInfo['FileName'].decode('utf-16le')))
- nextOffset = fileInfo['NextEntryOffset']
- res = res[nextOffset:]
- except SessionError as e:
- if (e.get_error_code()) != STATUS_NO_MORE_FILES:
- raise
- break
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- return files
-
- def mkdir(self, shareName, pathName, password = None):
- # ToDo: Handle situations where share is password protected
- pathName = string.replace(pathName,'/', '\\')
- pathName = ntpath.normpath(pathName)
- if len(pathName) > 0 and pathName[0] == '\\':
- pathName = pathName[1:]
-
- treeId = self.connectTree(shareName)
-
- fileId = None
- try:
- fileId = self.create(treeId, pathName,GENERIC_ALL ,FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, FILE_CREATE, 0)
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- return True
-
- def rmdir(self, shareName, pathName, password = None):
- # ToDo: Handle situations where share is password protected
- pathName = string.replace(pathName,'/', '\\')
- pathName = ntpath.normpath(pathName)
- if len(pathName) > 0 and pathName[0] == '\\':
- pathName = pathName[1:]
-
- treeId = self.connectTree(shareName)
-
- fileId = None
- try:
- fileId = self.create(treeId, pathName, DELETE, FILE_SHARE_DELETE, FILE_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE, FILE_OPEN, 0)
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- return True
-
- def remove(self, shareName, pathName, password = None):
- # ToDo: Handle situations where share is password protected
- pathName = string.replace(pathName,'/', '\\')
- pathName = ntpath.normpath(pathName)
- if len(pathName) > 0 and pathName[0] == '\\':
- pathName = pathName[1:]
-
- treeId = self.connectTree(shareName)
-
- fileId = None
- try:
- fileId = self.create(treeId, pathName,DELETE | FILE_READ_ATTRIBUTES, FILE_SHARE_DELETE, FILE_NON_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE, FILE_OPEN, 0)
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- return True
-
- def retrieveFile(self, shareName, path, callback, mode = FILE_OPEN, offset = 0, password = None, shareAccessMode = FILE_SHARE_READ):
- # ToDo: Handle situations where share is password protected
- path = string.replace(path,'/', '\\')
- path = ntpath.normpath(path)
- if len(path) > 0 and path[0] == '\\':
- path = path[1:]
-
- treeId = self.connectTree(shareName)
- fileId = None
- from impacket import smb
- try:
- fileId = self.create(treeId, path, FILE_READ_DATA, shareAccessMode, FILE_NON_DIRECTORY_FILE, mode, 0)
- res = self.queryInfo(treeId, fileId)
- fileInfo = smb.SMBQueryFileStandardInfo(res)
- fileSize = fileInfo['EndOfFile']
- if (fileSize-offset) < self._Connection['MaxReadSize']:
- # Skip reading 0 bytes files.
- if (fileSize-offset) > 0:
- data = self.read(treeId, fileId, offset, fileSize-offset)
- callback(data)
- else:
- written = 0
- toBeRead = fileSize-offset
- while written < toBeRead:
- data = self.read(treeId, fileId, offset, self._Connection['MaxReadSize'])
- written += len(data)
- offset += len(data)
- callback(data)
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- def storeFile(self, shareName, path, callback, mode = FILE_OVERWRITE_IF, offset = 0, password = None, shareAccessMode = FILE_SHARE_WRITE):
- # ToDo: Handle situations where share is password protected
- path = string.replace(path,'/', '\\')
- path = ntpath.normpath(path)
- if len(path) > 0 and path[0] == '\\':
- path = path[1:]
-
- treeId = self.connectTree(shareName)
- fileId = None
- try:
- fileId = self.create(treeId, path, FILE_WRITE_DATA, shareAccessMode, FILE_NON_DIRECTORY_FILE, mode, 0)
- finished = False
- writeOffset = offset
- while not finished:
- data = callback(self._Connection['MaxWriteSize'])
- if len(data) == 0:
- break
- written = self.write(treeId, fileId, data, writeOffset, len(data))
- writeOffset += written
- finally:
- if fileId is not None:
- self.close(treeId, fileId)
- self.disconnectTree(treeId)
-
- def waitNamedPipe(self, treeId, pipename, timeout = 5):
- pipename = ntpath.basename(pipename)
- if (treeId in self._Session['TreeConnectTable']) is False:
- raise SessionError(STATUS_INVALID_PARAMETER)
- if len(pipename) > 0xffff:
- raise SessionError(STATUS_INVALID_PARAMETER)
-
- pipeWait = FSCTL_PIPE_WAIT_STRUCTURE()
- pipeWait['Timeout'] = timeout*100000
- pipeWait['NameLength'] = len(pipename)*2
- pipeWait['TimeoutSpecified'] = 1
- pipeWait['Name'] = pipename.encode('utf-16le')
-
- return self.ioctl(treeId, None, FSCTL_PIPE_WAIT,flags=SMB2_0_IOCTL_IS_FSCTL, inputBlob=pipeWait, maxInputResponse = 0, maxOutputResponse=0)
-
- def getIOCapabilities(self):
- res = dict()
-
- res['MaxReadSize'] = self._Connection['MaxReadSize']
- res['MaxWriteSize'] = self._Connection['MaxWriteSize']
- return res
-
-
- ######################################################################
- # Backward compatibility functions and alias for SMB1 and DCE Transports
- # NOTE: It is strongly recommended not to use these commands
- # when implementing new client calls.
- get_server_name = getServerName
- get_server_domain = getServerDomain
- get_server_dns_domain_name = getServerDNSDomainName
- get_remote_name = getServerName
- get_remote_host = getServerIP
- get_server_os = getServerOS
- get_server_os_major = getServerOSMajor
- get_server_os_minor = getServerOSMinor
- get_server_os_build = getServerOSBuild
- tree_connect_andx = connectTree
- tree_connect = connectTree
- connect_tree = connectTree
- disconnect_tree = disconnectTree
- set_timeout = setTimeout
- use_timeout = useTimeout
- stor_file = storeFile
- retr_file = retrieveFile
- list_path = listPath
-
- def __del__(self):
- if self._NetBIOSSession:
- self._NetBIOSSession.close()
-
-
- def doesSupportNTLMv2(self):
- # Always true :P
- return True
-
- def is_login_required(self):
- # Always true :P
- return True
-
- def is_signing_required(self):
- return self._Session["SigningRequired"]
-
- def nt_create_andx(self, treeId, fileName, smb_packet=None, cmd = None):
- if len(fileName) > 0 and fileName[0] == '\\':
- fileName = fileName[1:]
-
- if cmd is not None:
- from impacket import smb
- ntCreate = smb.SMBCommand(data = str(cmd))
- params = smb.SMBNtCreateAndX_Parameters(ntCreate['Parameters'])
- return self.create(treeId, fileName, params['AccessMask'], params['ShareAccess'],
- params['CreateOptions'], params['Disposition'], params['FileAttributes'],
- params['Impersonation'], params['SecurityFlags'])
-
- else:
- return self.create(treeId, fileName,
- FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA |
- FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | READ_CONTROL,
- FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_NON_DIRECTORY_FILE, FILE_OPEN, 0 )
-
- def get_socket(self):
- return self._NetBIOSSession.get_socket()
-
-
- def write_andx(self,tid,fid,data, offset = 0, wait_answer=1, write_pipe_mode = False, smb_packet=None):
- # ToDo: Handle the custom smb_packet situation
- return self.write(tid, fid, data, offset, len(data))
-
- def TransactNamedPipe(self, tid, fid, data, noAnswer = 0, waitAnswer = 1, offset = 0):
- return self.ioctl(tid, fid, FSCTL_PIPE_TRANSCEIVE, SMB2_0_IOCTL_IS_FSCTL, data, maxOutputResponse = 65535, waitAnswer = noAnswer | waitAnswer)
-
- def TransactNamedPipeRecv(self):
- ans = self.recvSMB()
-
- if ans.isValidAnswer(STATUS_SUCCESS):
- smbIoctlResponse = SMB2Ioctl_Response(ans['Data'])
- return smbIoctlResponse['Buffer']
-
-
- def read_andx(self, tid, fid, offset=0, max_size = None, wait_answer=1, smb_packet=None):
- # ToDo: Handle the custom smb_packet situation
- if max_size is None:
- max_size = self._Connection['MaxReadSize']
- return self.read(tid, fid, offset, max_size, wait_answer)
-
- def list_shared(self):
- # In the context of SMB2/3, forget about the old LANMAN, throw NOT IMPLEMENTED
- raise SessionError(STATUS_NOT_IMPLEMENTED)
-
- def open_andx(self, tid, fileName, open_mode, desired_access):
- # ToDo Return all the attributes of the file
- if len(fileName) > 0 and fileName[0] == '\\':
- fileName = fileName[1:]
-
- fileId = self.create(tid,fileName,desired_access, open_mode, FILE_NON_DIRECTORY_FILE, open_mode, 0)
- return fileId, 0, 0, 0, 0, 0, 0, 0, 0
-
diff --git a/tests/python_dependencies/impacket/smb3structs.py b/tests/python_dependencies/impacket/smb3structs.py
deleted file mode 100644
index ddc8a9084..000000000
--- a/tests/python_dependencies/impacket/smb3structs.py
+++ /dev/null
@@ -1,1363 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Author: Alberto Solino (@agsolino)
-#
-# Description:
-# SMB 2 and 3 Protocol Structures and constants [MS-SMB2]
-#
-
-from impacket.structure import Structure
-
-# Constants
-
-# SMB Packet
-SMB2_PACKET_SIZE = 64
-
-# SMB Commands
-SMB2_NEGOTIATE = 0x0000 #
-SMB2_SESSION_SETUP = 0x0001 #
-SMB2_LOGOFF = 0x0002 #
-SMB2_TREE_CONNECT = 0x0003 #
-SMB2_TREE_DISCONNECT = 0x0004 #
-SMB2_CREATE = 0x0005 #
-SMB2_CLOSE = 0x0006 #
-SMB2_FLUSH = 0x0007 #
-SMB2_READ = 0x0008 #
-SMB2_WRITE = 0x0009 #
-SMB2_LOCK = 0x000A #
-SMB2_IOCTL = 0x000B #
-SMB2_CANCEL = 0x000C #
-SMB2_ECHO = 0x000D #
-SMB2_QUERY_DIRECTORY = 0x000E #
-SMB2_CHANGE_NOTIFY = 0x000F
-SMB2_QUERY_INFO = 0x0010 #
-SMB2_SET_INFO = 0x0011
-SMB2_OPLOCK_BREAK = 0x0012
-
-# SMB Flags
-SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001
-SMB2_FLAGS_ASYNC_COMMAND = 0x00000002
-SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004
-SMB2_FLAGS_SIGNED = 0x00000008
-SMB2_FLAGS_DFS_OPERATIONS = 0x10000000
-SMB2_FLAGS_REPLAY_OPERATION = 0x80000000
-
-# SMB Error SymLink Flags
-SYMLINK_FLAG_ABSOLUTE = 0x0
-SYMLINK_FLAG_RELATIVE = 0x1
-
-# SMB2_NEGOTIATE
-# Security Modes
-SMB2_NEGOTIATE_SIGNING_ENABLED = 0x1
-SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x2
-
-# Capabilities
-SMB2_GLOBAL_CAP_DFS = 0x01
-SMB2_GLOBAL_CAP_LEASING = 0x02
-SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
-SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
-SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
-SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
-SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
-
-# Dialects
-SMB2_DIALECT_002 = 0x0202
-SMB2_DIALECT_21 = 0x0210
-SMB2_DIALECT_30 = 0x0300
-SMB2_DIALECT_WILDCARD = 0x02FF
-
-# SMB2_SESSION_SETUP
-# Flags
-SMB2_SESSION_FLAG_BINDING = 0x01
-SMB2_SESSION_FLAG_IS_GUEST = 0x01
-SMB2_SESSION_FLAG_IS_NULL = 0x02
-SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x04
-
-# SMB2_TREE_CONNECT
-# Types
-SMB2_SHARE_TYPE_DISK = 0x1
-SMB2_SHARE_TYPE_PIPE = 0x2
-SMB2_SHARE_TYPE_PRINT = 0x3
-
-# Share Flags
-SMB2_SHAREFLAG_MANUAL_CACHING = 0x00000000
-SMB2_SHAREFLAG_AUTO_CACHING = 0x00000010
-SMB2_SHAREFLAG_VDO_CACHING = 0x00000020
-SMB2_SHAREFLAG_NO_CACHING = 0x00000030
-SMB2_SHAREFLAG_DFS = 0x00000001
-SMB2_SHAREFLAG_DFS_ROOT = 0x00000002
-SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS = 0x00000100
-SMB2_SHAREFLAG_FORCE_SHARED_DELETE = 0x00000200
-SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING = 0x00000400
-SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800
-SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK = 0x00001000
-SMB2_SHAREFLAG_ENABLE_HASH_V1 = 0x00002000
-SMB2_SHAREFLAG_ENABLE_HASH_V2 = 0x00004000
-SMB2_SHAREFLAG_ENCRYPT_DATA = 0x00008000
-
-# Capabilities
-SMB2_SHARE_CAP_DFS = 0x00000008
-SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY = 0x00000010
-SMB2_SHARE_CAP_SCALEOUT = 0x00000020
-SMB2_SHARE_CAP_CLUSTER = 0x00000040
-
-# SMB_CREATE
-# Oplocks
-SMB2_OPLOCK_LEVEL_NONE = 0x00
-SMB2_OPLOCK_LEVEL_II = 0x01
-SMB2_OPLOCK_LEVEL_EXCLUSIVE = 0x08
-SMB2_OPLOCK_LEVEL_BATCH = 0x09
-SMB2_OPLOCK_LEVEL_LEASE = 0xFF
-
-# Impersonation Level
-SMB2_IL_ANONYMOUS = 0x00000000
-SMB2_IL_IDENTIFICATION = 0x00000001
-SMB2_IL_IMPERSONATION = 0x00000002
-SMB2_IL_DELEGATE = 0x00000003
-
-# File Attributes
-FILE_ATTRIBUTE_ARCHIVE = 0x00000020
-FILE_ATTRIBUTE_COMPRESSED = 0x00000800
-FILE_ATTRIBUTE_DIRECTORY = 0x00000010
-FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
-FILE_ATTRIBUTE_HIDDEN = 0x00000002
-FILE_ATTRIBUTE_NORMAL = 0x00000080
-FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
-FILE_ATTRIBUTE_OFFLINE = 0x00001000
-FILE_ATTRIBUTE_READONLY = 0x00000001
-FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
-FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200
-FILE_ATTRIBUTE_SYSTEM = 0x00000004
-FILE_ATTRIBUTE_TEMPORARY = 0x00000100
-FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00000800
-FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000
-
-# Share Access
-FILE_SHARE_READ = 0x00000001
-FILE_SHARE_WRITE = 0x00000002
-FILE_SHARE_DELETE = 0x00000004
-
-# Create Disposition
-FILE_SUPERSEDE = 0x00000000
-FILE_OPEN = 0x00000001
-FILE_CREATE = 0x00000002
-FILE_OPEN_IF = 0x00000003
-FILE_OVERWRITE = 0x00000004
-FILE_OVERWRITE_IF = 0x00000005
-
-# Create Options
-FILE_DIRECTORY_FILE = 0x00000001
-FILE_WRITE_THROUGH = 0x00000002
-FILE_SEQUENTIAL_ONLY = 0x00000004
-FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
-FILE_SYNCHRONOUS_IO_ALERT = 0x00000010
-FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
-FILE_NON_DIRECTORY_FILE = 0x00000040
-FILE_COMPLETE_IF_OPLOCKED = 0x00000100
-FILE_NO_EA_KNOWLEDGE = 0x00000200
-FILE_RANDOM_ACCESS = 0x00000800
-FILE_DELETE_ON_CLOSE = 0x00001000
-FILE_OPEN_BY_FILE_ID = 0x00002000
-FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000
-FILE_NO_COMPRESSION = 0x00008000
-FILE_RESERVE_OPFILTER = 0x00100000
-FILE_OPEN_REPARSE_POINT = 0x00200000
-FILE_OPEN_NO_RECALL = 0x00400000
-FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
-
-# File Access Mask / Desired Access
-FILE_READ_DATA = 0x00000001
-FILE_WRITE_DATA = 0x00000002
-FILE_APPEND_DATA = 0x00000004
-FILE_READ_EA = 0x00000008
-FILE_WRITE_EA = 0x00000010
-FILE_EXECUTE = 0x00000020
-FILE_READ_ATTRIBUTES = 0x00000080
-FILE_WRITE_ATTRIBUTES = 0x00000100
-DELETE = 0x00010000
-READ_CONTROL = 0x00020000
-WRITE_DAC = 0x00040000
-WRITE_OWNER = 0x00080000
-SYNCHRONIZE = 0x00100000
-ACCESS_SYSTEM_SECURITY = 0x01000000
-MAXIMUM_ALLOWED = 0x02000000
-GENERIC_ALL = 0x10000000
-GENERIC_EXECUTE = 0x20000000
-GENERIC_WRITE = 0x40000000
-GENERIC_READ = 0x80000000
-
-# Directory Access Mask
-FILE_LIST_DIRECTORY = 0x00000001
-FILE_ADD_FILE = 0x00000002
-FILE_ADD_SUBDIRECTORY = 0x00000004
-FILE_TRAVERSE = 0x00000020
-FILE_DELETE_CHILD = 0x00000040
-
-# Create Contexts
-SMB2_CREATE_EA_BUFFER = 0x45787441
-SMB2_CREATE_SD_BUFFER = 0x53656344
-SMB2_CREATE_DURABLE_HANDLE_REQUEST = 0x44486e51
-SMB2_CREATE_DURABLE_HANDLE_RECONNECT = 0x44486e43
-SMB2_CREATE_ALLOCATION_SIZE = 0x416c5369
-SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST = 0x4d784163
-SMB2_CREATE_TIMEWARP_TOKEN = 0x54577270
-SMB2_CREATE_QUERY_ON_DISK_ID = 0x51466964
-SMB2_CREATE_REQUEST = 0x52714c73
-SMB2_CREATE_REQUEST_LEASE_V2 = 0x52714c73
-SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 = 0x44483251
-SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 = 0x44483243
-SMB2_CREATE_APP_INSTANCE_ID = 0x45BCA66AEFA7F74A9008FA462E144D74
-
-# Flags
-SMB2_CREATE_FLAG_REPARSEPOINT = 0x1
-FILE_NEED_EA = 0x80
-
-# CreateAction
-FILE_SUPERSEDED = 0x00000000
-FILE_OPENED = 0x00000001
-FILE_CREATED = 0x00000002
-FILE_OVERWRITTEN = 0x00000003
-
-# SMB2_CREATE_REQUEST_LEASE states
-SMB2_LEASE_NONE = 0x00
-SMB2_LEASE_READ_CACHING = 0x01
-SMB2_LEASE_HANDLE_CACHING = 0x02
-SMB2_LEASE_WRITE_CACHING = 0x04
-
-# SMB2_CREATE_REQUEST_LEASE_V2 Flags
-SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4
-
-# SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags
-SMB2_DHANDLE_FLAG_PERSISTENT = 0x02
-
-# SMB2_CLOSE
-# Flags
-SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB = 0x0001
-
-# SMB2_READ
-# Channel
-SMB2_CHANNEL_NONE = 0x00
-SMB2_CHANNEL_RDMA_V1 = 0x01
-
-# SMB2_WRITE
-# Flags
-SMB2_WRITEFLAG_WRITE_THROUGH = 0x01
-
-# Lease Break Notification
-SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED = 0x01
-
-# SMB_LOCK
-# Flags
-SMB2_LOCKFLAG_SHARED_LOCK = 0x01
-SMB2_LOCKFLAG_EXCLUSIVE_LOCK = 0x02
-SMB2_LOCKFLAG_UNLOCK = 0x04
-SMB2_LOCKFLAG_FAIL_IMMEDIATELY = 0x10
-
-# SMB IOCTL
-# Control Codes
-FSCTL_DFS_GET_REFERRALS = 0x00060194
-FSCTL_PIPE_PEEK = 0x0011400C
-FSCTL_PIPE_WAIT = 0x00110018
-FSCTL_PIPE_TRANSCEIVE = 0x0011C017
-FSCTL_SRV_COPYCHUNK = 0x001440F2
-FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064
-FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078
-FSCTL_SRV_READ_HASH = 0x001441bb
-FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2
-FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4
-FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC
-FSCTL_SET_REPARSE_POINT = 0x000900A4
-FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0
-FSCTL_FILE_LEVEL_TRIM = 0x00098208
-FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204
-
-# Flags
-SMB2_0_IOCTL_IS_FSCTL = 0x1
-
-# SRV_READ_HASH
-# Type
-SRV_HASH_TYPE_PEER_DIST = 0x01
-
-# Version
-SRV_HASH_VER_1 = 0x1
-SRV_HASH_VER_2 = 0x2
-
-# Retrieval Type
-SRV_HASH_RETRIEVE_HASH_BASED = 0x01
-SRV_HASH_RETRIEVE_FILE_BASED = 0x02
-
-# NETWORK_INTERFACE_INFO
-# Capabilities
-RSS_CAPABLE = 0x01
-RDMA_CAPABLE = 0x02
-
-# SMB2_QUERY_DIRECTORIES
-# Information Class
-FILE_DIRECTORY_INFORMATION = 0x01
-FILE_FULL_DIRECTORY_INFORMATION = 0x02
-FILEID_FULL_DIRECTORY_INFORMATION = 0x26
-FILE_BOTH_DIRECTORY_INFORMATION = 0x03
-FILEID_BOTH_DIRECTORY_INFORMATION = 0x25
-FILENAMES_INFORMATION = 0x0C
-
-# Flags
-SMB2_RESTART_SCANS = 0x01
-SMB2_RETURN_SINGLE_ENTRY = 0x02
-SMB2_INDEX_SPECIFIED = 0x04
-SMB2_REOPEN = 0x10
-
-# SMB2_CHANGE_NOTIFY
-# Flags
-SMB2_WATCH_TREE = 0x01
-
-# Filters
-FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001
-FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002
-FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004
-FILE_NOTIFY_CHANGE_SIZE = 0x00000008
-FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010
-FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020
-FILE_NOTIFY_CHANGE_CREATION = 0x00000040
-FILE_NOTIFY_CHANGE_EA = 0x00000080
-FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
-FILE_NOTIFY_CHANGE_STREAM_NAME = 0x00000200
-FILE_NOTIFY_CHANGE_STREAM_SIZE = 0x00000400
-FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800
-
-# FILE_NOTIFY_INFORMATION
-# Actions
-FILE_ACTION_ADDED = 0x00000001
-FILE_ACTION_REMOVED = 0x00000002
-FILE_ACTION_MODIFIED = 0x00000003
-FILE_ACTION_RENAMED_OLD_NAME = 0x00000004
-FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
-
-# SMB2_QUERY_INFO
-# InfoTypes
-SMB2_0_INFO_FILE = 0x01
-SMB2_0_INFO_FILESYSTEM = 0x02
-SMB2_0_INFO_SECURITY = 0x03
-SMB2_0_INFO_QUOTA = 0x04
-
-# File Information Classes
-SMB2_FILE_ACCESS_INFO = 8
-SMB2_FILE_ALIGNMENT_INFO = 17
-SMB2_FILE_ALL_INFO = 18
-SMB2_FILE_ALLOCATION_INFO = 19
-SMB2_FILE_ALTERNATE_NAME_INFO = 21
-SMB2_ATTRIBUTE_TAG_INFO = 35
-SMB2_FILE_BASIC_INFO = 4
-SMB2_FILE_BOTH_DIRECTORY_INFO = 3
-SMB2_FILE_COMPRESSION_INFO = 28
-SMB2_FILE_DIRECTORY_INFO = 1
-SMB2_FILE_DISPOSITION_INFO = 13
-SMB2_FILE_EA_INFO = 7
-SMB2_FILE_END_OF_FILE_INFO = 20
-SMB2_FULL_DIRECTORY_INFO = 2
-SMB2_FULL_EA_INFO = 15
-SMB2_FILE_HARDLINK_INFO = 46
-SMB2_FILE_ID_BOTH_DIRECTORY_INFO = 37
-SMB2_FILE_ID_FULL_DIRECTORY_INFO = 38
-SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50
-SMB2_FILE_INTERNAL_INFO = 6
-SMB2_FILE_LINK_INFO = 11
-SMB2_FILE_MAILSLOT_QUERY_INFO = 26
-SMB2_FILE_MAILSLOT_SET_INFO = 27
-SMB2_FILE_MODE_INFO = 16
-SMB2_FILE_MOVE_CLUSTER_INFO = 31
-SMB2_FILE_NAME_INFO = 9
-SMB2_FILE_NAMES_INFO = 12
-SMB2_FILE_NETWORK_OPEN_INFO = 34
-SMB2_FILE_NORMALIZED_NAME_INFO = 48
-SMB2_FILE_OBJECT_ID_INFO = 29
-SMB2_FILE_PIPE_INFO = 23
-SMB2_FILE_PIPE_LOCAL_INFO = 24
-SMB2_FILE_PIPE_REMOTE_INFO = 25
-SMB2_FILE_POSITION_INFO = 14
-SMB2_FILE_QUOTA_INFO = 32
-SMB2_FILE_RENAME_INFO = 10
-SMB2_FILE_REPARSE_POINT_INFO = 33
-SMB2_FILE_SFIO_RESERVE_INFO = 44
-SMB2_FILE_SHORT_NAME_INFO = 45
-SMB2_FILE_STANDARD_INFO = 5
-SMB2_FILE_STANDARD_LINK_INFO = 54
-SMB2_FILE_STREAM_INFO = 22
-SMB2_FILE_TRACKING_INFO = 36
-SMB2_FILE_VALID_DATA_LENGTH_INFO = 39
-
-# File System Information Classes
-SMB2_FILESYSTEM_VOLUME_INFO = 1
-SMB2_FILESYSTEM_LABEL_INFO = 2
-SMB2_FILESYSTEM_SIZE_INFO = 3
-SMB2_FILESYSTEM_DEVICE_INFO = 4
-SMB2_FILESYSTEM_ATTRIBUTE_INFO = 5
-SMB2_FILESYSTEM_CONTROL_INFO = 6
-SMB2_FILESYSTEM_FULL_SIZE_INFO = 7
-SMB2_FILESYSTEM_OBJECT_ID_INFO = 8
-SMB2_FILESYSTEM_DRIVER_PATH_INFO = 9
-SMB2_FILESYSTEM_SECTOR_SIZE_INFO = 11
-
-# Additional information
-OWNER_SECURITY_INFORMATION = 0x00000001
-GROUP_SECURITY_INFORMATION = 0x00000002
-DACL_SECURITY_INFORMATION = 0x00000004
-SACL_SECURITY_INFORMATION = 0x00000008
-LABEL_SECURITY_INFORMATION = 0x00000010
-
-# Flags
-SL_RESTART_SCAN = 0x00000001
-SL_RETURN_SINGLE_ENTRY = 0x00000002
-SL_INDEX_SPECIFIED = 0x00000004
-
-# TRANSFORM_HEADER
-SMB2_ENCRYPTION_AES128_CCM = 0x0001
-
-
-# STRUCtures
-# Represents a SMB2/3 Packet
-class SMBPacketBase(Structure):
- def addCommand(self,command):
- # Pad to 8 bytes and put the offset of another SMBPacket
- raise 'Implement This!'
-
- def isValidAnswer(self, status):
- if self['Status'] != status:
- import smb3
- raise smb3.SessionError(self['Status'], self)
- return True
-
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['TreeID'] = 0
-
-
-class SMB2PacketAsync(SMBPacketBase):
- structure = (
- ('ProtocolID','"\xfeSMB'),
- ('StructureSize','<H=64'),
- ('CreditCharge','<H=0'),
- ('Status','<L=0'),
- ('Command','<H=0'),
- ('CreditRequestResponse','<H=0'),
- ('Flags','<L=0'),
- ('NextCommand','<L=0'),
- ('MessageID','<Q=0'),
- ('AsyncID','<Q=0'),
- ('SessionID','<Q=0'),
- ('Signature','16s=""'),
- ('Data',':=""'),
- )
-
-class SMB3PacketAsync(SMBPacketBase):
- structure = (
- ('ProtocolID','"\xfeSMB'),
- ('StructureSize','<H=64'),
- ('CreditCharge','<H=0'),
- ('ChannelSequence','<H=0'),
- ('Reserved','<H=0'),
- ('Command','<H=0'),
- ('CreditRequestResponse','<H=0'),
- ('Flags','<L=0'),
- ('NextCommand','<L=0'),
- ('MessageID','<Q=0'),
- ('AsyncID','<Q=0'),
- ('SessionID','<Q=0'),
- ('Signature','16s=""'),
- ('Data',':=""'),
- )
-
-class SMB2Packet(SMBPacketBase):
- structure = (
- ('ProtocolID','"\xfeSMB'),
- ('StructureSize','<H=64'),
- ('CreditCharge','<H=0'),
- ('Status','<L=0'),
- ('Command','<H=0'),
- ('CreditRequestResponse','<H=0'),
- ('Flags','<L=0'),
- ('NextCommand','<L=0'),
- ('MessageID','<Q=0'),
- ('Reserved','<L=0'),
- ('TreeID','<L=0'),
- ('SessionID','<Q=0'),
- ('Signature','16s=""'),
- ('Data',':=""'),
- )
-
-class SMB3Packet(SMBPacketBase):
- structure = (
- ('ProtocolID','"\xfeSMB'),
- ('StructureSize','<H=64'),
- ('CreditCharge','<H=0'),
- ('ChannelSequence','<H=0'),
- ('Reserved','<H=0'),
- ('Command','<H=0'),
- ('CreditRequestResponse','<H=0'),
- ('Flags','<L=0'),
- ('NextCommand','<L=0'),
- ('MessageID','<Q=0'),
- ('Reserved','<L=0'),
- ('TreeID','<L=0'),
- ('SessionID','<Q=0'),
- ('Signature','16s=""'),
- ('Data',':=""'),
- )
-
-class SMB2Error(Structure):
- structure = (
- ('StructureSize','<H=9'),
- ('Reserved','<H=0'),
- ('ByteCount','<L=0'),
- ('_ErrorData','_-ErrorData','self["ByteCount"]'),
- ('ErrorData','"\xff'),
- )
-
-class SMB2ErrorSymbolicLink(Structure):
- structure = (
- ('SymLinkLength','<L=0'),
- ('SymLinkErrorTag','<L=0'),
- ('ReparseTag','<L=0'),
- ('ReparseDataLenght','<H=0'),
- ('UnparsedPathLength','<H=0'),
- ('SubstituteNameOffset','<H=0'),
- ('SubstituteNameLength','<H=0'),
- ('PrintNameOffset','<H=0'),
- ('PrintNameLength','<H=0'),
- ('Flags','<L=0'),
- ('PathBuffer',':'),
- )
-
-# SMB2_NEGOTIATE
-class SMB2Negotiate(Structure):
- structure = (
- ('StructureSize','<H=36'),
- ('DialectCount','<H=0'),
- ('SecurityMode','<H=0'),
- ('Reserved','<H=0'),
- ('Capabilities','<L=0'),
- ('ClientGuid','16s=""'),
- ('ClientStartTime','<Q=0'),
- ('Dialects','*<H'),
- )
-
-class SMB2Negotiate_Response(Structure):
- structure = (
- ('StructureSize','<H=65'),
- ('SecurityMode','<H=0'),
- ('DialectRevision','<H=0'),
- ('Reserved','<H=0'),
- ('ServerGuid','16s=""'),
- ('Capabilities','<L=0'),
- ('MaxTransactSize','<L=0'),
- ('MaxReadSize','<L=0'),
- ('MaxWriteSize','<L=0'),
- ('SystemTime','<Q=0'),
- ('ServerStartTime','<Q=0'),
- ('SecurityBufferOffset','<H=0'),
- ('SecurityBufferLength','<H=0'),
- ('Reserved2','<L=0'),
- ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
- ('Buffer',':'),
- )
-
-# SMB2_SESSION_SETUP
-class SMB2SessionSetup(Structure):
- SIZE = 24
- structure = (
- ('StructureSize','<H=25'),
- ('Flags','<B=0'),
- ('SecurityMode','<B=0'),
- ('Capabilities','<L=0'),
- ('Channel','<L=0'),
- ('SecurityBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('SecurityBufferLength','<H=0'),
- ('PreviousSessionId','<Q=0'),
- ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
- ('Buffer',':'),
- )
-
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
- def getData(self):
- #self['AlignPad'] = '\x00' * ((8 - ((24 + SMB2_PACKET_SIZE) & 7)) & 7)
- #self['SecurityBufferOffset'] = 24 + SMB2_PACKET_SIZE +len(self['AlignPad'])
- #self['SecurityBufferLength'] += len(self['AlignPad'])
- return Structure.getData(self)
-
-
-class SMB2SessionSetup_Response(Structure):
- structure = (
- ('StructureSize','<H=9'),
- ('SessionFlags','<H=0'),
- ('SecurityBufferOffset','<H=0'),
- ('SecurityBufferLength','<H=0'),
- ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
- ('Buffer',':'),
- )
-
-# SMB2_LOGOFF
-class SMB2Logoff(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-
-class SMB2Logoff_Response(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-# SMB2_TREE_CONNECT
-class SMB2TreeConnect(Structure):
- SIZE = 8
- structure = (
- ('StructureSize','<H=9'),
- ('Reserved','<H=0'),
- ('PathOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('PathLength','<H=0'),
- ('_AlignPad','_-AlignPad','self["PathOffset"] - (64 + self.SIZE - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["PathLength"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-class SMB2TreeConnect_Response(Structure):
- structure = (
- ('StructureSize','<H=16'),
- ('ShareType','<B=0'),
- ('Reserved','<B=0'),
- ('ShareFlags','<L=0'),
- ('Capabilities','<L=0'),
- ('MaximalAccess','<L=0'),
- )
-
-# SMB2_TREE_DISCONNECT
-class SMB2TreeDisconnect(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-class SMB2TreeDisconnect_Response(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-# SMB2_CREATE
-class SMB2Create(Structure):
- SIZE = 56
- structure = (
- ('StructureSize','<H=57'),
- ('SecurityFlags','<B=0'),
- ('RequestedOplockLevel','<B=0'),
- ('ImpersonationLevel','<L=0'),
- ('SmbCreateFlags','<Q=0'),
- ('Reserved','<Q=0'),
- ('DesiredAccess','<L=0'),
- ('FileAttributes','<L=0'),
- ('ShareAccess','<L=0'),
- ('CreateDisposition','<L=0'),
- ('CreateOptions','<L=0'),
- ('NameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('NameLength','<H=0'),
- ('CreateContextsOffset','<L=0'),
- ('CreateContextsLength','<L=0'),
- ('_AlignPad','_-AlignPad','self["NameOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["CreateContextsLength"]+self["NameLength"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-class SMB2CreateContext(Structure):
- structure = (
- ('Next','<L=0'),
- ('NameOffset','<H=0'),
- ('NameLength','<H=0'),
- ('Reserved','<H=0'),
- ('DataOffset','<H=0'),
- ('DataLength','<L=0'),
- ('_Buffer','_-Buffer','self["DataLength"]+self["NameLength"]'),
- ('Buffer',':'),
- )
-
-class SMB2_FILEID(Structure):
- structure = (
- ('Persistent','<Q=0'),
- ('Volatile','<Q=0'),
- )
-
-class SMB2Create_Response(Structure):
- structure = (
- ('StructureSize','<H=89'),
- ('OplockLevel','<B=0'),
- ('Flags','<B=0'),
- ('CreateAction','<L=0'),
- ('CreationTime','<Q=0'),
- ('LastAccessTime','<Q=0'),
- ('LastWriteTime','<Q=0'),
- ('ChangeTime','<Q=0'),
- ('AllocationSize','<Q=0'),
- ('EndOfFile','<Q=0'),
- ('FileAttributes','<L=0'),
- ('Reserved2','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('CreateContextsOffset','<L=0'),
- ('CreateContextsLength','<L=0'),
- ('_AlignPad','_-AlignPad','self["CreateContextsOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["CreateContextsLength"]'),
- ('Buffer',':'),
- )
-
-class FILE_FULL_EA_INFORMATION(Structure):
- structure = (
- ('NextEntryOffset','<L=0'),
- ('Flags','<B=0'),
- ('EaNameLength','<B=0'),
- ('EaValueLength','<H=0'),
- ('_EaName','_-EaName','self["EaNameLength"]'),
- ('EaName',':'),
- ('_EaValue','_-EaValue','self["EaValue"]'),
- ('EaValue',':'),
- )
-
-
-class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure):
- structure = (
- ('Data',':',SMB2_FILEID),
- )
-
-class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure):
- structure = (
- ('DurableRequest','16s=""'),
- )
-
-class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure):
- structure = (
- ('Reserved','<Q=0'),
- )
-
-class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure):
- structure = (
- ('Timestamp','<Q=0'),
- )
-
-class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure):
- structure = (
- ('QueryStatus','<L=0'),
- ('MaximalAccess','<L=0'),
- )
-
-class SMB2_CREATE_ALLOCATION_SIZE(Structure):
- structure = (
- ('AllocationSize','<Q=0'),
- )
-
-class SMB2_CREATE_TIMEWARP_TOKEN(Structure):
- structure = (
- ('AllocationSize','<Q=0'),
- )
-
-class SMB2_CREATE_REQUEST_LEASE(Structure):
- structure = (
- ('LeaseKey','16s=""'),
- ('LeaseState','<L=0'),
- ('LeaseFlags','<L=0'),
- ('LeaseDuration','<Q=0'),
- )
-
-SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE
-
-class SMB2_CREATE_REQUEST_LEASE_V2(Structure):
- structure = (
- ('LeaseKey','16s=""'),
- ('LeaseState','<L=0'),
- ('Flags','<L=0'),
- ('LeaseDuration','<Q=0'),
- ('ParentLeaseKey','16s=""'),
- ('Epoch','<H=0'),
- ('Reserved','<H=0'),
- )
-
-SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2
-
-class SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2(Structure):
- structure = (
- ('Timeout','<L=0'),
- ('Flags','<L=0'),
- ('Reserved','8s=""'),
- ('CreateGuid','16s=""'),
- )
-
-class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure):
- structure = (
- ('Timeout','<L=0'),
- ('Flags','<L=0'),
- )
-
-class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure):
- structure = (
- ('FileID',':', SMB2_FILEID),
- ('CreateGuid','16s=""'),
- ('Flags','<L=0'),
- )
-
-class SMB2_CREATE_APP_INSTANCE_ID(Structure):
- structure = (
- ('StructureSize','<H=0'),
- ('Reserved','<H=0'),
- ('AppInstanceId','16s=""'),
- )
-
-class SMB2_CREATE_QUERY_ON_DISK_ID(Structure):
- structure = (
- ('DiskIDBuffer','32s=""'),
- )
-
-# Todo: Add Classes for
-#SMB2_CREATE_SD_BUFFER
-
-# SMB2_CLOSE
-class SMB2Close(Structure):
- structure = (
- ('StructureSize','<H=24'),
- ('Flags','<H=0'),
- ('Reserved','<L=0'),
- ('FileID',':', SMB2_FILEID),
- )
-
-class SMB2Close_Response(Structure):
- structure = (
- ('StructureSize','<H=60'),
- ('Flags','<H=0'),
- ('Reserved','<L=0'),
- ('CreationTime','<Q=0'),
- ('LastAccessTime','<Q=0'),
- ('LastWriteTime','<Q=0'),
- ('ChangeTime','<Q=0'),
- ('AllocationSize','<Q=0'),
- ('EndofFile','<Q=0'),
- ('FileAttributes','<L=0'),
- )
-
-# SMB2_FLUSH
-class SMB2Flush(Structure):
- structure = (
- ('StructureSize','<H=24'),
- ('Reserved1','<H=0'),
- ('Reserved2','<L=0'),
- ('FileID',':',SMB2_FILEID),
- )
-
-class SMB2Flush_Response(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-# SMB2_READ
-class SMB2Read(Structure):
- SIZE = 48
- structure = (
- ('StructureSize','<H=49'),
- ('Padding','<B=0'),
- ('Reserved','<B=0'),
- ('Length','<L=0'),
- ('Offset','<Q=0'),
- ('FileID',':',SMB2_FILEID),
- ('MinimumCount','<L=0'),
- ('Channel','<L=0'),
- ('RemainingBytes','<L=0'),
- ('ReadChannelInfoOffset','<H=0'),
- ('ReadChannelInfoLength','<H=0'),
- ('_AlignPad','_-AlignPad','self["ReadChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["ReadChannelInfoLength"]'),
- ('Buffer',':=0'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-
-class SMB2Read_Response(Structure):
- structure = (
- ('StructureSize','<H=17'),
- ('DataOffset','<B=0'),
- ('Reserved','<B=0'),
- ('DataLength','<L=0'),
- ('DataRemaining','<L=0'),
- ('Reserved2','<L=0'),
- ('_AlignPad','_-AlignPad','self["DataOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["DataLength"]'),
- ('Buffer',':'),
- )
-
-# SMB2_WRITE
-class SMB2Write(Structure):
- SIZE = 48
- structure = (
- ('StructureSize','<H=49'),
- ('DataOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('Length','<L=0'),
- ('Offset','<Q=0'),
- ('FileID',':',SMB2_FILEID),
- ('Channel','<L=0'),
- ('RemainingBytes','<L=0'),
- ('WriteChannelInfoOffset','<H=0'),
- ('WriteChannelInfoLength','<H=0'),
- ('_AlignPad','_-AlignPad','self["DataOffset"] + self["WriteChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('Flags','<L=0'),
- ('_Buffer','_-Buffer','self["Length"]+self["WriteChannelInfoLength"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-
-class SMB2Write_Response(Structure):
- structure = (
- ('StructureSize','<H=17'),
- ('Reserved','<H=0'),
- ('Count','<L=0'),
- ('Remaining','<L=0'),
- ('WriteChannelInfoOffset','<H=0'),
- ('WriteChannelInfoLength','<H=0'),
- )
-
-class SMB2OplockBreakNotification(Structure):
- structure = (
- ('StructureSize','<H=24'),
- ('OplockLevel','<B=0'),
- ('Reserved','<B=0'),
- ('Reserved2','<L=0'),
- ('FileID',':',SMB2_FILEID),
- )
-
-SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification
-SMB2OplockBreakResponse = SMB2OplockBreakNotification
-
-class SMB2LeaseBreakNotification(Structure):
- structure = (
- ('StructureSize','<H=44'),
- ('NewEpoch','<H=0'),
- ('Flags','<L=0'),
- ('LeaseKey','16s=""'),
- ('CurrentLeaseState','<L=0'),
- ('NewLeaseState','<L=0'),
- ('BreakReason','<L=0'),
- ('AccessMaskHint','<L=0'),
- ('ShareMaskHint','<L=0'),
- )
-
-class SMB2LeaseBreakAcknowledgement(Structure):
- structure = (
- ('StructureSize','<H=36'),
- ('Reserved','<H=0'),
- ('Flags','<L=0'),
- ('LeaseKey','16s=""'),
- ('LeaseState','<L=0'),
- ('LeaseDuration','<Q=0'),
- )
-
-SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement
-
-# SMB2_LOCK
-class SMB2_LOCK_ELEMENT(Structure):
- structure = (
- ('Offset','<Q=0'),
- ('Length','<Q=0'),
- ('Flags','<L=0'),
- ('Reserved','<L=0'),
- )
-
-class SMB2Lock(Structure):
- structure = (
- ('StructureSize','<H=48'),
- ('LockCount','<H=0'),
- ('LockSequence','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('_Locks','_-Locks','self["LockCount"]*24'),
- ('Locks',':'),
- )
-
-class SMB2Lock_Response(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-
-# SMB2_ECHO
-class SMB2Echo(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-SMB2Echo_Response = SMB2Echo
-
-# SMB2_CANCEL`
-class SMB2Cancel(Structure):
- structure = (
- ('StructureSize','<H=4'),
- ('Reserved','<H=0'),
- )
-
-# SMB2_IOCTL
-class SMB2Ioctl(Structure):
- SIZE = 56
- structure = (
- ('StructureSize','<H=57'),
- ('Reserved','<H=0'),
- ('CtlCode','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('InputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('InputCount','<L=0'),
- ('MaxInputResponse','<L=0'),
- ('OutputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]) + self["InputCount"])'),
- ('OutputCount','<L=0'),
- ('MaxOutputResponse','<L=0'),
- ('Flags','<L=0'),
- ('Reserved2','<L=0'),
- #('_AlignPad','_-AlignPad','self["InputOffset"] + self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
- #('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-class FSCTL_PIPE_WAIT_STRUCTURE(Structure):
- structure = (
- ('Timeout','<q=0'),
- ('NameLength','<L=0'),
- ('TimeoutSpecified','<B=0'),
- ('Padding','<B=0'),
- ('_Name','_-Name','self["NameLength"]'),
- ('Name',':'),
- )
-
-class SRV_COPYCHUNK_COPY(Structure):
- structure = (
- ('SourceKey','24s=""'),
- ('ChunkCount','<L=0'),
- ('Reserved','<L=0'),
- ('_Chunks','_-Chunks', 'self["ChunkCount"]*len(SRV_COPYCHUNK)'),
- ('Chunks',':'),
- )
-
-class SRV_COPYCHUNK(Structure):
- structure = (
- ('SourceOffset','<Q=0'),
- ('TargetOffset','<Q=0'),
- ('Length','<L=0'),
- ('Reserved','<L=0'),
- )
-
-class SRV_COPYCHUNK_RESPONSE(Structure):
- structure = (
- ('ChunksWritten','<L=0'),
- ('ChunkBytesWritten','<L=0'),
- ('TotalBytesWritten','<L=0'),
- )
-
-class SRV_READ_HASH(Structure):
- structure = (
- ('HashType','<L=0'),
- ('HashVersion','<L=0'),
- ('HashRetrievalType','<L=0'),
- ('Length','<L=0'),
- ('Offset','<Q=0'),
- )
-
-class NETWORK_RESILIENCY_REQUEST(Structure):
- structure = (
- ('Timeout','<L=0'),
- ('Reserved','<L=0'),
- )
-
-class VALIDATE_NEGOTIATE_INFO(Structure):
- structure = (
- ('Capabilities','<L=0'),
- ('Guid','16s=""'),
- ('SecurityMode','<H=0'),
- #('DialectCount','<H=0'),
- ('Dialects','<H*<H'),
- )
-
-class SRV_SNAPSHOT_ARRAY(Structure):
- structure = (
- ('NumberOfSnapShots','<L=0'),
- ('NumberOfSnapShotsReturned','<L=0'),
- ('SnapShotArraySize','<L=0'),
- ('_SnapShots','_-SnapShots','self["SnapShotArraySize"]'),
- ('SnapShots',':'),
- )
-
-class SRV_REQUEST_RESUME_KEY(Structure):
- structure = (
- ('ResumeKey','24s=""'),
- ('ContextLength','<L=0'),
- ('_Context','_-Context','self["ContextLength"]'),
- ('Context',':'),
- )
-
-class HASH_HEADER(Structure):
- structure = (
- ('HashType','<L=0'),
- ('HashVersion','<L=0'),
- ('SourceFileChangeTime','<Q=0'),
- ('SourceFileSize','<Q=0'),
- ('HashBlobLength','<L=0'),
- ('HashBlobOffset','<L=0'),
- ('Dirty','<H=0'),
- ('SourceFileNameLength','<L=0'),
- ('_SourceFileName','_-SourceFileName','self["SourceFileNameLength"]',),
- ('SourceFileName',':'),
- )
-
-class SRV_HASH_RETRIEVE_HASH_BASED(Structure):
- structure = (
- ('Offset','<Q=0'),
- ('BufferLength','<L=0'),
- ('Reserved','<L=0'),
- ('_Buffer','_-Buffer','self["BufferLength"]'),
- ('Buffer',':'),
- )
-
-class SRV_HASH_RETRIEVE_FILE_BASED(Structure):
- structure = (
- ('FileDataOffset','<Q=0'),
- ('FileDataLength','<Q=0'),
- ('BufferLength','<L=0'),
- ('Reserved','<L=0'),
- ('_Buffer','_-Buffer','self["BufferLength"]'),
- ('Buffer',':'),
- )
-
-class NETWORK_INTERFACE_INFO(Structure):
- structure = (
- ('Next','<L=0'),
- ('IfIndex','<L=0'),
- ('Capability','<L=0'),
- ('Reserved','<L=0'),
- ('LinkSpeed','<Q=0'),
- ('SockAddr_Storage','128s=""'),
- )
-
-class SMB2Ioctl_Response(Structure):
- structure = (
- ('StructureSize','<H=49'),
- ('Reserved','<H=0'),
- ('CtlCode','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('InputOffset','<L=0'),
- ('InputCount','<L=0'),
- ('OutputOffset','<L=0'),
- ('OutputCount','<L=0'),
- ('Flags','<L=0'),
- ('Reserved2','<L=0'),
- ('_AlignPad','_-AlignPad','self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
- ('Buffer',':'),
- )
-
-# SMB2_QUERY_DIRECTORY
-class SMB2QueryDirectory(Structure):
- SIZE = 32
- structure = (
- ('StructureSize','<H=33'),
- ('FileInformationClass','<B=0'),
- ('Flags','<B=0'),
- ('FileIndex','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('FileNameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('FileNameLength','<H=0'),
- ('OutputBufferLength','<L=0'),
- ('_AlignPad','_-AlignPad','self["FileNameOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["FileNameLength"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-class SMB2QueryDirectory_Response(Structure):
- structure = (
- ('StructureSize','<H=9'),
- ('OutputBufferOffset','<H=0'),
- ('OutputBufferLength','<L=0'),
- ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
- ('Buffer',':'),
- )
-
-# SMB2_CHANGE_NOTIFY
-class SMB2ChangeNotify(Structure):
- structure = (
- ('StructureSize','<H=32'),
- ('Flags','<H=0'),
- ('OutputBufferLength','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('CompletionFilter','<L=0'),
- ('Reserved','<L=0'),
- )
-
-class SMB2ChangeNotify_Response(Structure):
- structure = (
- ('StructureSize','<H=9'),
- ('OutputBufferOffset','<H=0'),
- ('OutputBufferLength','<L=0'),
- ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
- ('Buffer',':'),
- )
-
-class FILE_NOTIFY_INFORMATION(Structure):
- structure = (
- ('NextEntryOffset','<L=0'),
- ('Action','<L=0'),
- ('FileNameLength','<L=0'),
- ('_FileName','_-FileName','self["FileNameLength"]',),
- ('FileName',':'),
- )
-
-# SMB2_QUERY_INFO
-class SMB2QueryInfo(Structure):
- SIZE = 40
- structure = (
- ('StructureSize','<H=41'),
- ('InfoType','<B=0'),
- ('FileInfoClass','<B=0'),
- ('OutputBufferLength','<L=0'),
- ('InputBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('Reserved','<H=0'),
- ('InputBufferLength','<L=0'),
- ('AdditionalInformation','<L=0'),
- ('Flags','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('_AlignPad','_-AlignPad','self["InputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["InputBufferLength"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-
-class SMB2_QUERY_QUOTA_INFO(Structure):
- structure = (
- ('ReturnSingle','<B=0'),
- ('RestartScan','<B=0'),
- ('Reserved','<H=0'),
- ('SidListLength','<L=0'),
- ('StartSidLength','<L=0'),
- ('StartSidOffset','<L=0'),
- # ToDo: Check 2.2.37.1 here
- ('SidBuffer',':'),
- )
-
-class SMB2QueryInfo_Response(Structure):
- structure = (
- ('StructureSize','<H=9'),
- ('OutputBufferOffset','<H=0'),
- ('OutputBufferLength','<L=0'),
- ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
- ('Buffer',':'),
- )
-
-# SMB2_SET_INFO
-class SMB2SetInfo(Structure):
- SIZE = 32
- structure = (
- ('StructureSize','<H=33'),
- ('InfoType','<B=0'),
- ('FileInfoClass','<B=0'),
- ('BufferLength','<L=0'),
- ('BufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
- ('Reserved','<H=0'),
- ('AdditionalInformation','<L=0'),
- ('FileID',':',SMB2_FILEID),
- ('_AlignPad','_-AlignPad','self["BufferOffset"] - (64 + self["StructureSize"] - 1)'),
- ('AlignPad',':=""'),
- ('_Buffer','_-Buffer','self["BufferLength"]'),
- ('Buffer',':'),
- )
- def __init__(self, data = None):
- Structure.__init__(self,data)
- if data is None:
- self['AlignPad'] = ''
-
-class SMB2SetInfo_Response(Structure):
- structure = (
- ('StructureSize','<H=2'),
- )
-
-class FILE_RENAME_INFORMATION_TYPE_2(Structure):
- structure = (
- ('ReplaceIfExists','<B=0'),
- ('Reserved','7s=""'),
- ('RootDirectory','<Q=0'),
- ('FileNameLength','<L=0'),
- ('_FileName','_-FileName','self["FileNameLength"]'),
- ('FileName',':'),
- )
-
-class SMB2_TRANSFORM_HEADER(Structure):
- structure = (
- ('ProtocolID','"\xfdSMB'),
- ('Signature','16s=""'),
- ('Nonce','16s=""'),
- ('OriginalMessageSize','<L=0'),
- ('Reserved','<H=0'),
- ('EncryptionAlgorithm','<H=0'),
- ('SessionID','<Q=0'),
- )
-
-# SMB2_FILE_INTERNAL_INFO
-class FileInternalInformation(Structure):
- structure = (
- ('IndexNumber','<q=0'),
- )
diff --git a/tests/python_dependencies/impacket/smbserver.py b/tests/python_dependencies/impacket/smbserver.py
deleted file mode 100644
index 3473c9f0c..000000000
--- a/tests/python_dependencies/impacket/smbserver.py
+++ /dev/null
@@ -1,4174 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Author: Alberto Solino (@agsolino)
-#
-# TODO:
-# [-] Functions should return NT error codes
-# [-] Handling errors in all situations, right now it's just raising exceptions.
-# [*] Standard authentication support
-# [ ] Organize the connectionData stuff
-# [*] Add capability to send a bad user ID if the user is not authenticated,
-# right now you can ask for any command without actually being authenticated
-# [ ] PATH TRAVERSALS EVERYWHERE.. BE WARNED!
-# [ ] Check the credentials.. now we're just letting everybody to log in.
-# [ ] Check error situation (now many places assume the right data is coming)
-# [ ] Implement IPC to the main process so the connectionData is on a single place
-# [ ] Hence.. implement locking
-# estamos en la B
-
-from __future__ import with_statement
-import calendar
-import socket
-import time
-import datetime
-import struct
-import ConfigParser
-import SocketServer
-import threading
-import logging
-import logging.config
-import ntpath
-import os
-import fnmatch
-import errno
-import sys
-import random
-import shutil
-from binascii import hexlify
-
-# For signing
-from impacket import smb, nmb, ntlm, uuid, LOG
-from impacket import smb3structs as smb2
-from impacket.spnego import SPNEGO_NegTokenInit, TypesMech, MechTypes, SPNEGO_NegTokenResp, ASN1_AID, ASN1_SUPPORTED_MECH
-from impacket.nt_errors import STATUS_NO_MORE_FILES, STATUS_NETWORK_NAME_DELETED, STATUS_INVALID_PARAMETER, \
- STATUS_FILE_CLOSED, STATUS_MORE_PROCESSING_REQUIRED, STATUS_OBJECT_PATH_NOT_FOUND, STATUS_DIRECTORY_NOT_EMPTY, \
- STATUS_FILE_IS_A_DIRECTORY, STATUS_NOT_IMPLEMENTED, STATUS_INVALID_HANDLE, STATUS_OBJECT_NAME_COLLISION, \
- STATUS_NO_SUCH_FILE, STATUS_CANCELLED, STATUS_OBJECT_NAME_NOT_FOUND, STATUS_SUCCESS, STATUS_ACCESS_DENIED, \
- STATUS_NOT_SUPPORTED, STATUS_INVALID_DEVICE_REQUEST, STATUS_FS_DRIVER_REQUIRED, STATUS_INVALID_INFO_CLASS
-
-# These ones not defined in nt_errors
-STATUS_SMB_BAD_UID = 0x005B0002
-STATUS_SMB_BAD_TID = 0x00050002
-
-try:
- unicode # Python 2
-except NameError:
- unicode = str # Python 3
-
-
-# Utility functions
-# and general functions.
-# There are some common functions that can be accessed from more than one SMB
-# command (or either TRANSACTION). That's why I'm putting them here
-# TODO: Return NT ERROR Codes
-
-def outputToJohnFormat(challenge, username, domain, lmresponse, ntresponse):
-# We don't want to add a possible failure here, since this is an
-# extra bonus. We try, if it fails, returns nothing
- ret_value = ''
- try:
- if len(ntresponse) > 24:
- # Extended Security - NTLMv2
- ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username.decode('utf-16le'), domain.decode('utf-16le'), hexlify(challenge), hexlify(ntresponse)[:32], hexlify(ntresponse)[32:]), 'hash_version':'ntlmv2'}
- else:
- # NTLMv1
- ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username.decode('utf-16le'), domain.decode('utf-16le'), hexlify(lmresponse), hexlify(ntresponse), hexlify(challenge)), 'hash_version':'ntlm'}
- except:
- # Let's try w/o decoding Unicode
- try:
- if len(ntresponse) > 24:
- # Extended Security - NTLMv2
- ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username, domain, hexlify(challenge), hexlify(ntresponse)[:32], hexlify(ntresponse)[32:]), 'hash_version':'ntlmv2'}
- else:
- # NTLMv1
- ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username, domain, hexlify(lmresponse), hexlify(ntresponse), hexlify(challenge)), 'hash_version':'ntlm'}
- except Exception as e:
- LOG.error("outputToJohnFormat: %s" % e)
- pass
-
- return ret_value
-
-def writeJohnOutputToFile(hash_string, hash_version, file_name):
- fn_data = os.path.splitext(file_name)
- if hash_version == "ntlmv2":
- output_filename = fn_data[0] + "_ntlmv2" + fn_data[1]
- else:
- output_filename = fn_data[0] + "_ntlm" + fn_data[1]
-
- with open(output_filename,"a") as f:
- f.write(hash_string)
- f.write('\n')
-
-
-def decodeSMBString( flags, text ):
- if flags & smb.SMB.FLAGS2_UNICODE:
- return text.decode('utf-16le')
- else:
- return text
-
-def encodeSMBString( flags, text ):
- if flags & smb.SMB.FLAGS2_UNICODE:
- return (text).encode('utf-16le')
- else:
- return text
-
-def getFileTime(t):
- t *= 10000000
- t += 116444736000000000
- return t
-
-def getUnixTime(t):
- t -= 116444736000000000
- t /= 10000000
- return t
-
-def getSMBDate(t):
- # TODO: Fix this :P
- d = datetime.date.fromtimestamp(t)
- year = d.year - 1980
- ret = (year << 8) + (d.month << 4) + d.day
- return ret
-
-def getSMBTime(t):
- # TODO: Fix this :P
- d = datetime.datetime.fromtimestamp(t)
- return (d.hour << 8) + (d.minute << 4) + d.second
-
-def getShares(connId, smbServer):
- config = smbServer.getServerConfig()
- sections = config.sections()
- # Remove the global one
- del(sections[sections.index('global')])
- shares = {}
- for i in sections:
- shares[i] = dict(config.items(i))
- return shares
-
-def searchShare(connId, share, smbServer):
- config = smbServer.getServerConfig()
- if config.has_section(share):
- return dict(config.items(share))
- else:
- return None
-
-def openFile(path,fileName, accessMode, fileAttributes, openMode):
- fileName = os.path.normpath(fileName.replace('\\','/'))
- errorCode = 0
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- mode = 0
- # Check the Open Mode
- if openMode & 0x10:
- # If the file does not exist, create it.
- mode = os.O_CREAT
- else:
- # If file does not exist, return an error
- if os.path.exists(pathName) is not True:
- errorCode = STATUS_NO_SUCH_FILE
- return 0,mode, pathName, errorCode
-
- if os.path.isdir(pathName) and (fileAttributes & smb.ATTR_DIRECTORY) == 0:
- # Request to open a normal file and this is actually a directory
- errorCode = STATUS_FILE_IS_A_DIRECTORY
- return 0, mode, pathName, errorCode
- # Check the Access Mode
- if accessMode & 0x7 == 1:
- mode |= os.O_WRONLY
- elif accessMode & 0x7 == 2:
- mode |= os.O_RDWR
- else:
- mode = os.O_RDONLY
-
- try:
- if sys.platform == 'win32':
- mode |= os.O_BINARY
- fid = os.open(pathName, mode)
- except Exception as e:
- LOG.error("openFile: %s,%s" % (pathName, mode) ,e)
- fid = 0
- errorCode = STATUS_ACCESS_DENIED
-
- return fid, mode, pathName, errorCode
-
-def queryFsInformation(path, filename, level=0):
-
- if isinstance(filename,unicode):
- encoding = 'utf-16le'
- flags = smb.SMB.FLAGS2_UNICODE
- else:
- encoding = 'ascii'
- flags = 0
-
- fileName = os.path.normpath(filename.replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- fileSize = os.path.getsize(pathName)
- (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(pathName)
- if level == smb.SMB_QUERY_FS_ATTRIBUTE_INFO or level == smb2.SMB2_FILESYSTEM_ATTRIBUTE_INFO:
- data = smb.SMBQueryFsAttributeInfo()
- data['FileSystemAttributes'] = smb.FILE_CASE_SENSITIVE_SEARCH | smb.FILE_CASE_PRESERVED_NAMES
- data['MaxFilenNameLengthInBytes'] = 255
- data['LengthOfFileSystemName'] = len('XTFS')*2
- data['FileSystemName'] = 'XTFS'.encode('utf-16le')
- return data.getData()
- elif level == smb.SMB_INFO_VOLUME:
- data = smb.SMBQueryFsInfoVolume( flags = flags )
- data['VolumeLabel'] = 'SHARE'.encode(encoding)
- return data.getData()
- elif level == smb.SMB_QUERY_FS_VOLUME_INFO or level == smb2.SMB2_FILESYSTEM_VOLUME_INFO:
- data = smb.SMBQueryFsVolumeInfo()
- data['VolumeLabel'] = ''
- data['VolumeCreationTime'] = getFileTime(ctime)
- return data.getData()
- elif level == smb.SMB_QUERY_FS_SIZE_INFO:
- data = smb.SMBQueryFsSizeInfo()
- return data.getData()
- elif level == smb.FILE_FS_FULL_SIZE_INFORMATION:
- data = smb.SMBFileFsFullSizeInformation()
- return data.getData()
- elif level == smb.FILE_FS_SIZE_INFORMATION:
- data = smb.FileFsSizeInformation()
- return data.getData()
- else:
- lastWriteTime = mtime
- attribs = 0
- if os.path.isdir(pathName):
- attribs |= smb.SMB_FILE_ATTRIBUTE_DIRECTORY
- if os.path.isfile(pathName):
- attribs |= smb.SMB_FILE_ATTRIBUTE_NORMAL
- fileAttributes = attribs
- return fileSize, lastWriteTime, fileAttributes
-
-def findFirst2(path, fileName, level, searchAttributes, isSMB2 = False):
- # TODO: Depending on the level, this could be done much simpler
-
- #print "FindFirs2 path:%s, filename:%s" % (path, fileName)
- fileName = os.path.normpath(fileName.replace('\\','/'))
- # Let's choose the right encoding depending on the request
- if isinstance(fileName,unicode):
- encoding = 'utf-16le'
- flags = smb.SMB.FLAGS2_UNICODE
- else:
- encoding = 'ascii'
- flags = 0
-
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
-
- pathName = os.path.join(path,fileName)
- files = []
-
- if pathName.find('*') == -1 and pathName.find('?') == -1:
- # No search patterns
- pattern = ''
- else:
- pattern = os.path.basename(pathName)
- dirName = os.path.dirname(pathName)
-
- # Always add . and .. Not that important for Windows, but Samba whines if
- # not present (for * search only)
- if pattern == '*':
- files.append(os.path.join(dirName,'.'))
- files.append(os.path.join(dirName,'..'))
-
- if pattern != '':
- for file in os.listdir(dirName):
- if fnmatch.fnmatch(file.lower(),pattern.lower()):
- entry = os.path.join(dirName, file)
- if os.path.isdir(entry):
- if searchAttributes & smb.ATTR_DIRECTORY:
- files.append(entry)
- else:
- files.append(entry)
- else:
- if os.path.exists(pathName):
- files.append(pathName)
-
- searchResult = []
- searchCount = len(files)
- errorCode = STATUS_SUCCESS
-
- for i in files:
- if level == smb.SMB_FIND_FILE_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_BOTH_DIRECTORY_INFO:
- item = smb.SMBFindFileBothDirectoryInfo( flags = flags )
- elif level == smb.SMB_FIND_FILE_DIRECTORY_INFO or level == smb2.SMB2_FILE_DIRECTORY_INFO:
- item = smb.SMBFindFileDirectoryInfo( flags = flags )
- elif level == smb.SMB_FIND_FILE_FULL_DIRECTORY_INFO or level == smb2.SMB2_FULL_DIRECTORY_INFO:
- item = smb.SMBFindFileFullDirectoryInfo( flags = flags )
- elif level == smb.SMB_FIND_INFO_STANDARD:
- item = smb.SMBFindInfoStandard( flags = flags )
- elif level == smb.SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO or level == smb2.SMB2_FILE_ID_FULL_DIRECTORY_INFO:
- item = smb.SMBFindFileIdFullDirectoryInfo( flags = flags )
- elif level == smb.SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_ID_BOTH_DIRECTORY_INFO:
- item = smb.SMBFindFileIdBothDirectoryInfo( flags = flags )
- elif level == smb.SMB_FIND_FILE_NAMES_INFO or level == smb2.SMB2_FILE_NAMES_INFO:
- item = smb.SMBFindFileNamesInfo( flags = flags )
- else:
- LOG.error("Wrong level %d!" % level)
- return searchResult, searchCount, STATUS_NOT_SUPPORTED
-
- (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(i)
- if os.path.isdir(i):
- item['ExtFileAttributes'] = smb.ATTR_DIRECTORY
- else:
- item['ExtFileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
-
- item['FileName'] = os.path.basename(i).encode(encoding)
-
- if level == smb.SMB_FIND_FILE_BOTH_DIRECTORY_INFO or level == smb.SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_ID_BOTH_DIRECTORY_INFO or level == smb2.SMB2_FILE_BOTH_DIRECTORY_INFO:
- item['EaSize'] = 0
- item['EndOfFile'] = size
- item['AllocationSize'] = size
- item['CreationTime'] = getFileTime(ctime)
- item['LastAccessTime'] = getFileTime(atime)
- item['LastWriteTime'] = getFileTime(mtime)
- item['LastChangeTime'] = getFileTime(mtime)
- item['ShortName'] = '\x00'*24
- item['FileName'] = os.path.basename(i).encode(encoding)
- padLen = (8-(len(item) % 8)) % 8
- item['NextEntryOffset'] = len(item) + padLen
- elif level == smb.SMB_FIND_FILE_DIRECTORY_INFO:
- item['EndOfFile'] = size
- item['AllocationSize'] = size
- item['CreationTime'] = getFileTime(ctime)
- item['LastAccessTime'] = getFileTime(atime)
- item['LastWriteTime'] = getFileTime(mtime)
- item['LastChangeTime'] = getFileTime(mtime)
- item['FileName'] = os.path.basename(i).encode(encoding)
- padLen = (8-(len(item) % 8)) % 8
- item['NextEntryOffset'] = len(item) + padLen
- elif level == smb.SMB_FIND_FILE_FULL_DIRECTORY_INFO or level == smb.SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO or level == smb2.SMB2_FULL_DIRECTORY_INFO:
- item['EaSize'] = 0
- item['EndOfFile'] = size
- item['AllocationSize'] = size
- item['CreationTime'] = getFileTime(ctime)
- item['LastAccessTime'] = getFileTime(atime)
- item['LastWriteTime'] = getFileTime(mtime)
- item['LastChangeTime'] = getFileTime(mtime)
- padLen = (8-(len(item) % 8)) % 8
- item['NextEntryOffset'] = len(item) + padLen
- elif level == smb.SMB_FIND_INFO_STANDARD:
- item['EaSize'] = size
- item['CreationDate'] = getSMBDate(ctime)
- item['CreationTime'] = getSMBTime(ctime)
- item['LastAccessDate'] = getSMBDate(atime)
- item['LastAccessTime'] = getSMBTime(atime)
- item['LastWriteDate'] = getSMBDate(mtime)
- item['LastWriteTime'] = getSMBTime(mtime)
- searchResult.append(item)
-
- # No more files
- if (level >= smb.SMB_FIND_FILE_DIRECTORY_INFO or isSMB2 == True) and searchCount > 0:
- searchResult[-1]['NextEntryOffset'] = 0
-
- return searchResult, searchCount, errorCode
-
-def queryFileInformation(path, filename, level):
- #print "queryFileInfo path: %s, filename: %s, level:0x%x" % (path,filename,level)
- return queryPathInformation(path,filename, level)
-
-def queryPathInformation(path, filename, level):
- # TODO: Depending on the level, this could be done much simpler
- #print "queryPathInfo path: %s, filename: %s, level:0x%x" % (path,filename,level)
- try:
- errorCode = 0
- fileName = os.path.normpath(filename.replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\') and path != '':
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- if os.path.exists(pathName):
- (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(pathName)
- if level == smb.SMB_QUERY_FILE_BASIC_INFO:
- infoRecord = smb.SMBQueryFileBasicInfo()
- infoRecord['CreationTime'] = getFileTime(ctime)
- infoRecord['LastAccessTime'] = getFileTime(atime)
- infoRecord['LastWriteTime'] = getFileTime(mtime)
- infoRecord['LastChangeTime'] = getFileTime(mtime)
- if os.path.isdir(pathName):
- infoRecord['ExtFileAttributes'] = smb.ATTR_DIRECTORY
- else:
- infoRecord['ExtFileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
- elif level == smb.SMB_QUERY_FILE_STANDARD_INFO:
- infoRecord = smb.SMBQueryFileStandardInfo()
- infoRecord['AllocationSize'] = size
- infoRecord['EndOfFile'] = size
- if os.path.isdir(pathName):
- infoRecord['Directory'] = 1
- else:
- infoRecord['Directory'] = 0
- elif level == smb.SMB_QUERY_FILE_ALL_INFO or level == smb2.SMB2_FILE_ALL_INFO:
- infoRecord = smb.SMBQueryFileAllInfo()
- infoRecord['CreationTime'] = getFileTime(ctime)
- infoRecord['LastAccessTime'] = getFileTime(atime)
- infoRecord['LastWriteTime'] = getFileTime(mtime)
- infoRecord['LastChangeTime'] = getFileTime(mtime)
- if os.path.isdir(pathName):
- infoRecord['ExtFileAttributes'] = smb.ATTR_DIRECTORY
- else:
- infoRecord['ExtFileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
- infoRecord['AllocationSize'] = size
- infoRecord['EndOfFile'] = size
- if os.path.isdir(pathName):
- infoRecord['Directory'] = 1
- else:
- infoRecord['Directory'] = 0
- infoRecord['FileName'] = filename.encode('utf-16le')
- elif level == smb2.SMB2_FILE_NETWORK_OPEN_INFO:
- infoRecord = smb.SMBFileNetworkOpenInfo()
- infoRecord['CreationTime'] = getFileTime(ctime)
- infoRecord['LastAccessTime'] = getFileTime(atime)
- infoRecord['LastWriteTime'] = getFileTime(mtime)
- infoRecord['ChangeTime'] = getFileTime(mtime)
- infoRecord['AllocationSize'] = size
- infoRecord['EndOfFile'] = size
- if os.path.isdir(pathName):
- infoRecord['FileAttributes'] = smb.ATTR_DIRECTORY
- else:
- infoRecord['FileAttributes'] = smb.ATTR_NORMAL | smb.ATTR_ARCHIVE
- elif level == smb.SMB_QUERY_FILE_EA_INFO or level == smb2.SMB2_FILE_EA_INFO:
- infoRecord = smb.SMBQueryFileEaInfo()
- elif level == smb2.SMB2_FILE_STREAM_INFO:
- infoRecord = smb.SMBFileStreamInformation()
- else:
- LOG.error('Unknown level for query path info! 0x%x' % level)
- # UNSUPPORTED
- return None, STATUS_NOT_SUPPORTED
-
- return infoRecord, errorCode
- else:
- # NOT FOUND
- return None, STATUS_OBJECT_NAME_NOT_FOUND
- except Exception as e:
- LOG.error('queryPathInfo: %s' % e)
- raise
-
-def queryDiskInformation(path):
-# TODO: Do something useful here :)
-# For now we just return fake values
- totalUnits = 65535
- freeUnits = 65535
- return totalUnits, freeUnits
-
-# Here we implement the NT transaction handlers
-class NTTRANSCommands:
- def default(self, connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- pass
-
-# Here we implement the NT transaction handlers
-class TRANSCommands:
- @staticmethod
- def lanMan(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- # Minimal [MS-RAP] implementation, just to return the shares
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- errorCode = STATUS_SUCCESS
- if struct.unpack('<H',parameters[:2])[0] == 0:
- # NetShareEnum Request
- netShareEnum = smb.SMBNetShareEnum(parameters)
- if netShareEnum['InfoLevel'] == 1:
- shares = getShares(connId, smbServer)
- respParameters = smb.SMBNetShareEnumResponse()
- respParameters['EntriesReturned'] = len(shares)
- respParameters['EntriesAvailable'] = len(shares)
- tailData = ''
- for i in shares:
- # NetShareInfo1 len == 20
- entry = smb.NetShareInfo1()
- entry['NetworkName'] = i + '\x00'*(13-len(i))
- entry['Type'] = int(shares[i]['share type'])
- # (beto) If offset == 0 it crashes explorer.exe on windows 7
- entry['RemarkOffsetLow'] = 20 * len(shares) + len(tailData)
- respData += entry.getData()
- if 'comment' in shares[i]:
- tailData += shares[i]['comment'] + '\x00'
- else:
- tailData += '\x00'
- respData += tailData
- else:
- # We don't support other info levels
- errorCode = STATUS_NOT_SUPPORTED
- elif struct.unpack('<H',parameters[:2])[0] == 13:
- # NetrServerGetInfo Request
- respParameters = smb.SMBNetServerGetInfoResponse()
- netServerInfo = smb.SMBNetServerInfo1()
- netServerInfo['ServerName'] = smbServer.getServerName()
- respData = str(netServerInfo)
- respParameters['TotalBytesAvailable'] = len(respData)
- elif struct.unpack('<H',parameters[:2])[0] == 1:
- # NetrShareGetInfo Request
- request = smb.SMBNetShareGetInfo(parameters)
- respParameters = smb.SMBNetShareGetInfoResponse()
- shares = getShares(connId, smbServer)
- share = shares[request['ShareName'].upper()]
- shareInfo = smb.NetShareInfo1()
- shareInfo['NetworkName'] = request['ShareName'].upper() + '\x00'
- shareInfo['Type'] = int(share['share type'])
- respData = shareInfo.getData()
- if 'comment' in share:
- shareInfo['RemarkOffsetLow'] = len(respData)
- respData += share['comment'] + '\x00'
- respParameters['TotalBytesAvailable'] = len(respData)
-
- else:
- # We don't know how to handle anything else
- errorCode = STATUS_NOT_SUPPORTED
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
- @staticmethod
- def transactNamedPipe(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- errorCode = STATUS_SUCCESS
- SMBCommand = smb.SMBCommand(recvPacket['Data'][0])
- transParameters= smb.SMBTransaction_Parameters(SMBCommand['Parameters'])
-
- # Extract the FID
- fid = struct.unpack('<H', transParameters['Setup'][2:])[0]
-
- if fid in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][fid]['FileHandle']
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- os.write(fileHandle,data)
- respData = os.read(fileHandle,data)
- else:
- sock = connData['OpenedFiles'][fid]['Socket']
- sock.send(data)
- respData = sock.recv(maxDataCount)
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
-# Here we implement the transaction2 handlers
-class TRANS2Commands:
- # All these commands return setup, parameters, data, errorCode
- @staticmethod
- def setPathInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- errorCode = STATUS_SUCCESS
- setPathInfoParameters = smb.SMBSetPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
- if recvPacket['Tid'] in connData['ConnectedShares']:
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- fileName = decodeSMBString(recvPacket['Flags2'], setPathInfoParameters['FileName'])
- fileName = os.path.normpath(fileName.replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\') and path != '':
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- if os.path.exists(pathName):
- informationLevel = setPathInfoParameters['InformationLevel']
- if informationLevel == smb.SMB_SET_FILE_BASIC_INFO:
- infoRecord = smb.SMBSetFileBasicInfo(data)
- # Creation time won't be set, the other ones we play with.
- atime = infoRecord['LastAccessTime']
- if atime == 0:
- atime = -1
- else:
- atime = getUnixTime(atime)
- mtime = infoRecord['LastWriteTime']
- if mtime == 0:
- mtime = -1
- else:
- mtime = getUnixTime(mtime)
- if mtime != -1 or atime != -1:
- os.utime(pathName,(atime,mtime))
- else:
- smbServer.log('Unknown level for set path info! 0x%x' % setPathInfoParameters['InformationLevel'], logging.ERROR)
- # UNSUPPORTED
- errorCode = STATUS_NOT_SUPPORTED
- else:
- errorCode = STATUS_OBJECT_NAME_NOT_FOUND
-
- if errorCode == STATUS_SUCCESS:
- respParameters = smb.SMBSetPathInformationResponse_Parameters()
-
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
-
- @staticmethod
- def setFileInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- errorCode = STATUS_SUCCESS
- setFileInfoParameters = smb.SMBSetFileInformation_Parameters(parameters)
-
- if recvPacket['Tid'] in connData['ConnectedShares']:
- if setFileInfoParameters['FID'] in connData['OpenedFiles']:
- fileName = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileName']
- informationLevel = setFileInfoParameters['InformationLevel']
- if informationLevel == smb.SMB_SET_FILE_DISPOSITION_INFO:
- infoRecord = smb.SMBSetFileDispositionInfo(parameters)
- if infoRecord['DeletePending'] > 0:
- # Mark this file for removal after closed
- connData['OpenedFiles'][setFileInfoParameters['FID']]['DeleteOnClose'] = True
- respParameters = smb.SMBSetFileInformationResponse_Parameters()
- elif informationLevel == smb.SMB_SET_FILE_BASIC_INFO:
- infoRecord = smb.SMBSetFileBasicInfo(data)
- # Creation time won't be set, the other ones we play with.
- atime = infoRecord['LastAccessTime']
- if atime == 0:
- atime = -1
- else:
- atime = getUnixTime(atime)
- mtime = infoRecord['LastWriteTime']
- if mtime == 0:
- mtime = -1
- else:
- mtime = getUnixTime(mtime)
- os.utime(fileName,(atime,mtime))
- elif informationLevel == smb.SMB_SET_FILE_END_OF_FILE_INFO:
- fileHandle = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileHandle']
- infoRecord = smb.SMBSetFileEndOfFileInfo(data)
- if infoRecord['EndOfFile'] > 0:
- os.lseek(fileHandle, infoRecord['EndOfFile']-1, 0)
- os.write(fileHandle, '\x00')
- else:
- smbServer.log('Unknown level for set file info! 0x%x' % setFileInfoParameters['InformationLevel'], logging.ERROR)
- # UNSUPPORTED
- errorCode = STATUS_NOT_SUPPORTED
- else:
- errorCode = STATUS_NO_SUCH_FILE
-
- if errorCode == STATUS_SUCCESS:
- respParameters = smb.SMBSetFileInformationResponse_Parameters()
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
- @staticmethod
- def queryFileInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
-
- queryFileInfoParameters = smb.SMBQueryFileInformation_Parameters(parameters)
-
- if recvPacket['Tid'] in connData['ConnectedShares']:
- if queryFileInfoParameters['FID'] in connData['OpenedFiles']:
- fileName = connData['OpenedFiles'][queryFileInfoParameters['FID']]['FileName']
-
- infoRecord, errorCode = queryFileInformation('', fileName, queryFileInfoParameters['InformationLevel'])
-
- if infoRecord is not None:
- respParameters = smb.SMBQueryFileInformationResponse_Parameters()
- respData = infoRecord
- else:
- errorCode = STATUS_INVALID_HANDLE
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
- @staticmethod
- def queryPathInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- errorCode = 0
-
- queryPathInfoParameters = smb.SMBQueryPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
-
- if recvPacket['Tid'] in connData['ConnectedShares']:
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- try:
- infoRecord, errorCode = queryPathInformation(path, decodeSMBString(recvPacket['Flags2'], queryPathInfoParameters['FileName']), queryPathInfoParameters['InformationLevel'])
- except Exception as e:
- smbServer.log("queryPathInformation: %s" % e,logging.ERROR)
-
- if infoRecord is not None:
- respParameters = smb.SMBQueryPathInformationResponse_Parameters()
- respData = infoRecord
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
- @staticmethod
- def queryFsInformation(connId, smbServer, recvPacket, parameters, data, maxDataCount = 0):
- connData = smbServer.getConnectionData(connId)
- errorCode = 0
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- data = queryFsInformation(connData['ConnectedShares'][recvPacket['Tid']]['path'], '', struct.unpack('<H',parameters)[0])
-
- smbServer.setConnectionData(connId, connData)
-
- return '','', data, errorCode
-
- @staticmethod
- def findNext2(connId, smbServer, recvPacket, parameters, data, maxDataCount):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- errorCode = STATUS_SUCCESS
- findNext2Parameters = smb.SMBFindNext2_Parameters(flags = recvPacket['Flags2'], data = parameters)
-
- sid = findNext2Parameters['SID']
- if recvPacket['Tid'] in connData['ConnectedShares']:
- if sid in connData['SIDs']:
- searchResult = connData['SIDs'][sid]
- respParameters = smb.SMBFindNext2Response_Parameters()
- endOfSearch = 1
- searchCount = 1
- totalData = 0
- for i in enumerate(searchResult):
- data = i[1].getData()
- lenData = len(data)
- if (totalData+lenData) >= maxDataCount or (i[0]+1) >= findNext2Parameters['SearchCount']:
- # We gotta stop here and continue on a find_next2
- endOfSearch = 0
- connData['SIDs'][sid] = searchResult[i[0]:]
- respParameters['LastNameOffset'] = totalData
- break
- else:
- searchCount +=1
- respData += data
- totalData += lenData
-
- # Have we reached the end of the search or still stuff to send?
- if endOfSearch > 0:
- # Let's remove the SID from our ConnData
- del(connData['SIDs'][sid])
-
- respParameters['EndOfSearch'] = endOfSearch
- respParameters['SearchCount'] = searchCount
- else:
- errorCode = STATUS_INVALID_HANDLE
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
- @staticmethod
- def findFirst2(connId, smbServer, recvPacket, parameters, data, maxDataCount):
- connData = smbServer.getConnectionData(connId)
-
- respSetup = ''
- respParameters = ''
- respData = ''
- findFirst2Parameters = smb.SMBFindFirst2_Parameters( recvPacket['Flags2'], data = parameters)
-
- if recvPacket['Tid'] in connData['ConnectedShares']:
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
-
- searchResult, searchCount, errorCode = findFirst2(path,
- decodeSMBString( recvPacket['Flags2'], findFirst2Parameters['FileName'] ),
- findFirst2Parameters['InformationLevel'],
- findFirst2Parameters['SearchAttributes'] )
-
- respParameters = smb.SMBFindFirst2Response_Parameters()
- endOfSearch = 1
- sid = 0x80 # default SID
- searchCount = 0
- totalData = 0
- for i in enumerate(searchResult):
- #i[1].dump()
- data = i[1].getData()
- lenData = len(data)
- if (totalData+lenData) >= maxDataCount or (i[0]+1) > findFirst2Parameters['SearchCount']:
- # We gotta stop here and continue on a find_next2
- endOfSearch = 0
- # Simple way to generate a fid
- if len(connData['SIDs']) == 0:
- sid = 1
- else:
- sid = connData['SIDs'].keys()[-1] + 1
- # Store the remaining search results in the ConnData SID
- connData['SIDs'][sid] = searchResult[i[0]:]
- respParameters['LastNameOffset'] = totalData
- break
- else:
- searchCount +=1
- respData += data
-
- padLen = (8-(lenData % 8)) %8
- respData += '\xaa'*padLen
- totalData += lenData + padLen
-
- respParameters['SID'] = sid
- respParameters['EndOfSearch'] = endOfSearch
- respParameters['SearchCount'] = searchCount
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- smbServer.setConnectionData(connId, connData)
-
- return respSetup, respParameters, respData, errorCode
-
-# Here we implement the commands handlers
-class SMBCommands:
-
- @staticmethod
- def smbTransaction(connId, smbServer, SMBCommand, recvPacket, transCommands):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(recvPacket['Command'])
-
- transParameters= smb.SMBTransaction_Parameters(SMBCommand['Parameters'])
-
- # Do the stuff
- if transParameters['ParameterCount'] != transParameters['TotalParameterCount']:
- # TODO: Handle partial parameters
- raise Exception("Unsupported partial parameters in TRANSACT2!")
- else:
- transData = smb.SMBTransaction_SData(flags = recvPacket['Flags2'])
- # Standard says servers shouldn't trust Parameters and Data comes
- # in order, so we have to parse the offsets, ugly
-
- paramCount = transParameters['ParameterCount']
- transData['Trans_ParametersLength'] = paramCount
- dataCount = transParameters['DataCount']
- transData['Trans_DataLength'] = dataCount
- transData.fromString(SMBCommand['Data'])
- if transParameters['ParameterOffset'] > 0:
- paramOffset = transParameters['ParameterOffset'] - 63 - transParameters['SetupLength']
- transData['Trans_Parameters'] = SMBCommand['Data'][paramOffset:paramOffset+paramCount]
- else:
- transData['Trans_Parameters'] = ''
-
- if transParameters['DataOffset'] > 0:
- dataOffset = transParameters['DataOffset'] - 63 - transParameters['SetupLength']
- transData['Trans_Data'] = SMBCommand['Data'][dataOffset:dataOffset + dataCount]
- else:
- transData['Trans_Data'] = ''
-
- # Call the handler for this TRANSACTION
- if transParameters['SetupCount'] == 0:
- # No subcommand, let's play with the Name
- command = decodeSMBString(recvPacket['Flags2'],transData['Name'])
- else:
- command = struct.unpack('<H', transParameters['Setup'][:2])[0]
-
- if command in transCommands:
- # Call the TRANS subcommand
- setup = ''
- parameters = ''
- data = ''
- try:
- setup, parameters, data, errorCode = transCommands[command](connId,
- smbServer,
- recvPacket,
- transData['Trans_Parameters'],
- transData['Trans_Data'],
- transParameters['MaxDataCount'])
- except Exception as e:
- #print 'Transaction: %s' % e,e
- smbServer.log('Transaction: (%r,%s)' % (command, e), logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- #raise
-
- if setup == '' and parameters == '' and data == '':
- # Something wen't wrong
- respParameters = ''
- respData = ''
- else:
- # Build the answer
- data = str(data)
- remainingData = len(data)
- parameters = str(parameters)
- remainingParameters = len(parameters)
- commands = []
- dataDisplacement = 0
- while remainingData > 0 or remainingParameters > 0:
- respSMBCommand = smb.SMBCommand(recvPacket['Command'])
- respParameters = smb.SMBTransactionResponse_Parameters()
- respData = smb.SMBTransaction2Response_Data()
-
- respParameters['TotalParameterCount'] = len(parameters)
- respParameters['ParameterCount'] = len(parameters)
- respData['Trans_ParametersLength'] = len(parameters)
- respParameters['TotalDataCount'] = len(data)
- respParameters['DataDisplacement'] = dataDisplacement
-
- # TODO: Do the same for parameters
- if len(data) > transParameters['MaxDataCount']:
- # Answer doesn't fit in this packet
- LOG.debug("Lowering answer from %d to %d" % (len(data),transParameters['MaxDataCount']) )
- respParameters['DataCount'] = transParameters['MaxDataCount']
- else:
- respParameters['DataCount'] = len(data)
-
- respData['Trans_DataLength'] = respParameters['DataCount']
- respParameters['SetupCount'] = len(setup)
- respParameters['Setup'] = setup
- # TODO: Make sure we're calculating the pad right
- if len(parameters) > 0:
- #padLen = 4 - (55 + len(setup)) % 4
- padLen = (4 - (55 + len(setup)) % 4 ) % 4
- padBytes = '\xFF' * padLen
- respData['Pad1'] = padBytes
- respParameters['ParameterOffset'] = 55 + len(setup) + padLen
- else:
- padLen = 0
- respParameters['ParameterOffset'] = 0
- respData['Pad1'] = ''
-
- if len(data) > 0:
- #pad2Len = 4 - (55 + len(setup) + padLen + len(parameters)) % 4
- pad2Len = (4 - (55 + len(setup) + padLen + len(parameters)) % 4) % 4
- respData['Pad2'] = '\xFF' * pad2Len
- respParameters['DataOffset'] = 55 + len(setup) + padLen + len(parameters) + pad2Len
- else:
- respParameters['DataOffset'] = 0
- respData['Pad2'] = ''
-
- respData['Trans_Parameters'] = parameters[:respParameters['ParameterCount']]
- respData['Trans_Data'] = data[:respParameters['DataCount']]
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- data = data[respParameters['DataCount']:]
- remainingData -= respParameters['DataCount']
- dataDisplacement += respParameters['DataCount'] + 1
-
- parameters = parameters[respParameters['ParameterCount']:]
- remainingParameters -= respParameters['ParameterCount']
- commands.append(respSMBCommand)
-
- smbServer.setConnectionData(connId, connData)
- return commands, None, errorCode
-
- else:
- smbServer.log("Unsupported Transact command %r" % command, logging.ERROR)
- respParameters = ''
- respData = ''
- errorCode = STATUS_NOT_IMPLEMENTED
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smbNTTransact(connId, smbServer, SMBCommand, recvPacket, transCommands):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(recvPacket['Command'])
-
- NTTransParameters= smb.SMBNTTransaction_Parameters(SMBCommand['Parameters'])
- # Do the stuff
- if NTTransParameters['ParameterCount'] != NTTransParameters['TotalParameterCount']:
- # TODO: Handle partial parameters
- raise Exception("Unsupported partial parameters in NTTrans!")
- else:
- NTTransData = smb.SMBNTTransaction_Data()
- # Standard says servers shouldn't trust Parameters and Data comes
- # in order, so we have to parse the offsets, ugly
-
- paramCount = NTTransParameters['ParameterCount']
- NTTransData['NT_Trans_ParametersLength'] = paramCount
- dataCount = NTTransParameters['DataCount']
- NTTransData['NT_Trans_DataLength'] = dataCount
-
- if NTTransParameters['ParameterOffset'] > 0:
- paramOffset = NTTransParameters['ParameterOffset'] - 73 - NTTransParameters['SetupLength']
- NTTransData['NT_Trans_Parameters'] = SMBCommand['Data'][paramOffset:paramOffset+paramCount]
- else:
- NTTransData['NT_Trans_Parameters'] = ''
-
- if NTTransParameters['DataOffset'] > 0:
- dataOffset = NTTransParameters['DataOffset'] - 73 - NTTransParameters['SetupLength']
- NTTransData['NT_Trans_Data'] = SMBCommand['Data'][dataOffset:dataOffset + dataCount]
- else:
- NTTransData['NT_Trans_Data'] = ''
-
- # Call the handler for this TRANSACTION
- command = NTTransParameters['Function']
- if command in transCommands:
- # Call the NT TRANS subcommand
- setup = ''
- parameters = ''
- data = ''
- try:
- setup, parameters, data, errorCode = transCommands[command](connId,
- smbServer,
- recvPacket,
- NTTransData['NT_Trans_Parameters'],
- NTTransData['NT_Trans_Data'],
- NTTransParameters['MaxDataCount'])
- except Exception as e:
- smbServer.log('NTTransaction: (0x%x,%s)' % (command, e), logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- #raise
-
- if setup == '' and parameters == '' and data == '':
- # Something wen't wrong
- respParameters = ''
- respData = ''
- if errorCode == STATUS_SUCCESS:
- errorCode = STATUS_ACCESS_DENIED
- else:
- # Build the answer
- data = str(data)
- remainingData = len(data)
- parameters = str(parameters)
- remainingParameters = len(parameters)
- commands = []
- dataDisplacement = 0
- while remainingData > 0 or remainingParameters > 0:
- respSMBCommand = smb.SMBCommand(recvPacket['Command'])
- respParameters = smb.SMBNTTransactionResponse_Parameters()
- respData = smb.SMBNTTransactionResponse_Data()
-
- respParameters['TotalParameterCount'] = len(parameters)
- respParameters['ParameterCount'] = len(parameters)
- respData['Trans_ParametersLength'] = len(parameters)
- respParameters['TotalDataCount'] = len(data)
- respParameters['DataDisplacement'] = dataDisplacement
- # TODO: Do the same for parameters
- if len(data) > NTTransParameters['MaxDataCount']:
- # Answer doesn't fit in this packet
- LOG.debug("Lowering answer from %d to %d" % (len(data),NTTransParameters['MaxDataCount']) )
- respParameters['DataCount'] = NTTransParameters['MaxDataCount']
- else:
- respParameters['DataCount'] = len(data)
-
- respData['NT_Trans_DataLength'] = respParameters['DataCount']
- respParameters['SetupCount'] = len(setup)
- respParameters['Setup'] = setup
- # TODO: Make sure we're calculating the pad right
- if len(parameters) > 0:
- #padLen = 4 - (71 + len(setup)) % 4
- padLen = (4 - (73 + len(setup)) % 4 ) % 4
- padBytes = '\xFF' * padLen
- respData['Pad1'] = padBytes
- respParameters['ParameterOffset'] = 73 + len(setup) + padLen
- else:
- padLen = 0
- respParameters['ParameterOffset'] = 0
- respData['Pad1'] = ''
-
- if len(data) > 0:
- #pad2Len = 4 - (71 + len(setup) + padLen + len(parameters)) % 4
- pad2Len = (4 - (73 + len(setup) + padLen + len(parameters)) % 4) % 4
- respData['Pad2'] = '\xFF' * pad2Len
- respParameters['DataOffset'] = 73 + len(setup) + padLen + len(parameters) + pad2Len
- else:
- respParameters['DataOffset'] = 0
- respData['Pad2'] = ''
-
- respData['NT_Trans_Parameters'] = parameters[:respParameters['ParameterCount']]
- respData['NT_Trans_Data'] = data[:respParameters['DataCount']]
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- data = data[respParameters['DataCount']:]
- remainingData -= respParameters['DataCount']
- dataDisplacement += respParameters['DataCount'] + 1
-
- parameters = parameters[respParameters['ParameterCount']:]
- remainingParameters -= respParameters['ParameterCount']
- commands.append(respSMBCommand)
-
- smbServer.setConnectionData(connId, connData)
- return commands, None, errorCode
-
- else:
- #smbServer.log("Unsupported NTTransact command 0x%x" % command, logging.ERROR)
- respParameters = ''
- respData = ''
- errorCode = STATUS_NOT_IMPLEMENTED
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smbTransaction2(connId, smbServer, SMBCommand, recvPacket, transCommands):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(recvPacket['Command'])
-
- trans2Parameters= smb.SMBTransaction2_Parameters(SMBCommand['Parameters'])
-
- # Do the stuff
- if trans2Parameters['ParameterCount'] != trans2Parameters['TotalParameterCount']:
- # TODO: Handle partial parameters
- #print "Unsupported partial parameters in TRANSACT2!"
- raise Exception("Unsupported partial parameters in TRANSACT2!")
- else:
- trans2Data = smb.SMBTransaction2_Data()
- # Standard says servers shouldn't trust Parameters and Data comes
- # in order, so we have to parse the offsets, ugly
-
- paramCount = trans2Parameters['ParameterCount']
- trans2Data['Trans_ParametersLength'] = paramCount
- dataCount = trans2Parameters['DataCount']
- trans2Data['Trans_DataLength'] = dataCount
-
- if trans2Parameters['ParameterOffset'] > 0:
- paramOffset = trans2Parameters['ParameterOffset'] - 63 - trans2Parameters['SetupLength']
- trans2Data['Trans_Parameters'] = SMBCommand['Data'][paramOffset:paramOffset+paramCount]
- else:
- trans2Data['Trans_Parameters'] = ''
-
- if trans2Parameters['DataOffset'] > 0:
- dataOffset = trans2Parameters['DataOffset'] - 63 - trans2Parameters['SetupLength']
- trans2Data['Trans_Data'] = SMBCommand['Data'][dataOffset:dataOffset + dataCount]
- else:
- trans2Data['Trans_Data'] = ''
-
- # Call the handler for this TRANSACTION
- command = struct.unpack('<H', trans2Parameters['Setup'])[0]
- if command in transCommands:
- # Call the TRANS2 subcommand
- try:
- setup, parameters, data, errorCode = transCommands[command](connId,
- smbServer,
- recvPacket,
- trans2Data['Trans_Parameters'],
- trans2Data['Trans_Data'],
- trans2Parameters['MaxDataCount'])
- except Exception as e:
- smbServer.log('Transaction2: (0x%x,%s)' % (command, e), logging.ERROR)
- #import traceback
- #traceback.print_exc()
- raise
-
- if setup == '' and parameters == '' and data == '':
- # Something wen't wrong
- respParameters = ''
- respData = ''
- else:
- # Build the answer
- data = str(data)
- remainingData = len(data)
- parameters = str(parameters)
- remainingParameters = len(parameters)
- commands = []
- dataDisplacement = 0
- while remainingData > 0 or remainingParameters > 0:
- respSMBCommand = smb.SMBCommand(recvPacket['Command'])
- respParameters = smb.SMBTransaction2Response_Parameters()
- respData = smb.SMBTransaction2Response_Data()
-
- respParameters['TotalParameterCount'] = len(parameters)
- respParameters['ParameterCount'] = len(parameters)
- respData['Trans_ParametersLength'] = len(parameters)
- respParameters['TotalDataCount'] = len(data)
- respParameters['DataDisplacement'] = dataDisplacement
- # TODO: Do the same for parameters
- if len(data) > trans2Parameters['MaxDataCount']:
- # Answer doesn't fit in this packet
- LOG.debug("Lowering answer from %d to %d" % (len(data),trans2Parameters['MaxDataCount']) )
- respParameters['DataCount'] = trans2Parameters['MaxDataCount']
- else:
- respParameters['DataCount'] = len(data)
-
- respData['Trans_DataLength'] = respParameters['DataCount']
- respParameters['SetupCount'] = len(setup)
- respParameters['Setup'] = setup
- # TODO: Make sure we're calculating the pad right
- if len(parameters) > 0:
- #padLen = 4 - (55 + len(setup)) % 4
- padLen = (4 - (55 + len(setup)) % 4 ) % 4
- padBytes = '\xFF' * padLen
- respData['Pad1'] = padBytes
- respParameters['ParameterOffset'] = 55 + len(setup) + padLen
- else:
- padLen = 0
- respParameters['ParameterOffset'] = 0
- respData['Pad1'] = ''
-
- if len(data) > 0:
- #pad2Len = 4 - (55 + len(setup) + padLen + len(parameters)) % 4
- pad2Len = (4 - (55 + len(setup) + padLen + len(parameters)) % 4) % 4
- respData['Pad2'] = '\xFF' * pad2Len
- respParameters['DataOffset'] = 55 + len(setup) + padLen + len(parameters) + pad2Len
- else:
- respParameters['DataOffset'] = 0
- respData['Pad2'] = ''
-
- respData['Trans_Parameters'] = parameters[:respParameters['ParameterCount']]
- respData['Trans_Data'] = data[:respParameters['DataCount']]
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- data = data[respParameters['DataCount']:]
- remainingData -= respParameters['DataCount']
- dataDisplacement += respParameters['DataCount'] + 1
-
- parameters = parameters[respParameters['ParameterCount']:]
- remainingParameters -= respParameters['ParameterCount']
- commands.append(respSMBCommand)
-
- smbServer.setConnectionData(connId, connData)
- return commands, None, errorCode
-
- else:
- smbServer.log("Unsupported Transact/2 command 0x%x" % command, logging.ERROR)
- respParameters = ''
- respData = ''
- errorCode = STATUS_NOT_IMPLEMENTED
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComLockingAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_LOCKING_ANDX)
- respParameters = ''
- respData = ''
-
- # I'm actually doing nothing.. just make MacOS happy ;)
- errorCode = STATUS_SUCCESS
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smbComClose(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_CLOSE)
- respParameters = ''
- respData = ''
-
- comClose = smb.SMBClose_Parameters(SMBCommand['Parameters'])
-
- if comClose['FID'] in connData['OpenedFiles']:
- errorCode = STATUS_SUCCESS
- fileHandle = connData['OpenedFiles'][comClose['FID']]['FileHandle']
- try:
- if fileHandle == PIPE_FILE_DESCRIPTOR:
- connData['OpenedFiles'][comClose['FID']]['Socket'].close()
- elif fileHandle != VOID_FILE_DESCRIPTOR:
- os.close(fileHandle)
- except Exception as e:
- smbServer.log("comClose %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- # Check if the file was marked for removal
- if connData['OpenedFiles'][comClose['FID']]['DeleteOnClose'] is True:
- try:
- os.remove(connData['OpenedFiles'][comClose['FID']]['FileName'])
- except Exception as e:
- smbServer.log("comClose %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- del(connData['OpenedFiles'][comClose['FID']])
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComWrite(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_WRITE)
- respParameters = smb.SMBWriteResponse_Parameters()
- respData = ''
-
- comWriteParameters = smb.SMBWrite_Parameters(SMBCommand['Parameters'])
- comWriteData = smb.SMBWrite_Data(SMBCommand['Data'])
-
- if comWriteParameters['Fid'] in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][comWriteParameters['Fid']]['FileHandle']
- errorCode = STATUS_SUCCESS
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- # TODO: Handle big size files
- # If we're trying to write past the file end we just skip the write call (Vista does this)
- if os.lseek(fileHandle, 0, 2) >= comWriteParameters['Offset']:
- os.lseek(fileHandle,comWriteParameters['Offset'],0)
- os.write(fileHandle,comWriteData['Data'])
- else:
- sock = connData['OpenedFiles'][comWriteParameters['Fid']]['Socket']
- sock.send(comWriteData['Data'])
- respParameters['Count'] = comWriteParameters['Count']
- except Exception as e:
- smbServer.log('smbComWrite: %s' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComFlush(connId, smbServer, SMBCommand,recvPacket ):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_FLUSH)
- respParameters = ''
- respData = ''
-
- comFlush = smb.SMBFlush_Parameters(SMBCommand['Parameters'])
-
- if comFlush['FID'] in connData['OpenedFiles']:
- errorCode = STATUS_SUCCESS
- fileHandle = connData['OpenedFiles'][comFlush['FID']]['FileHandle']
- try:
- os.fsync(fileHandle)
- except Exception as e:
- smbServer.log("comFlush %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smbComCreateDirectory(connId, smbServer, SMBCommand,recvPacket ):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_CREATE_DIRECTORY)
- respParameters = ''
- respData = ''
-
- comCreateDirectoryData= smb.SMBCreateDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- errorCode = STATUS_SUCCESS
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comCreateDirectoryData['DirectoryName']).replace('\\','/'))
- if len(fileName) > 0:
- if fileName[0] == '/' or fileName[0] == '\\':
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- if os.path.exists(pathName):
- errorCode = STATUS_OBJECT_NAME_COLLISION
-
- # TODO: More checks here in the future.. Specially when we support
- # user access
- else:
- try:
- os.mkdir(pathName)
- except Exception as e:
- smbServer.log("smbComCreateDirectory: %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_SMB_BAD_TID
-
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComRename(connId, smbServer, SMBCommand, recvPacket ):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_RENAME)
- respParameters = ''
- respData = ''
-
- comRenameData = smb.SMBRename_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- errorCode = STATUS_SUCCESS
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- oldFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['OldFileName']).replace('\\','/'))
- newFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['NewFileName']).replace('\\','/'))
- if len(oldFileName) > 0 and (oldFileName[0] == '/' or oldFileName[0] == '\\'):
- # strip leading '/'
- oldFileName = oldFileName[1:]
- oldPathName = os.path.join(path,oldFileName)
- if len(newFileName) > 0 and (newFileName[0] == '/' or newFileName[0] == '\\'):
- # strip leading '/'
- newFileName = newFileName[1:]
- newPathName = os.path.join(path,newFileName)
-
- if os.path.exists(oldPathName) is not True:
- errorCode = STATUS_NO_SUCH_FILE
-
- # TODO: More checks here in the future.. Specially when we support
- # user access
- else:
- try:
- os.rename(oldPathName,newPathName)
- except OSError as e:
- smbServer.log("smbComRename: %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_SMB_BAD_TID
-
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComDelete(connId, smbServer, SMBCommand, recvPacket ):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_DELETE)
- respParameters = ''
- respData = ''
-
- comDeleteData = smb.SMBDelete_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- errorCode = STATUS_SUCCESS
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteData['FileName']).replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- if os.path.exists(pathName) is not True:
- errorCode = STATUS_NO_SUCH_FILE
-
- # TODO: More checks here in the future.. Specially when we support
- # user access
- else:
- try:
- os.remove(pathName)
- except OSError as e:
- smbServer.log("smbComDelete: %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smbComDeleteDirectory(connId, smbServer, SMBCommand, recvPacket ):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_DELETE_DIRECTORY)
- respParameters = ''
- respData = ''
-
- comDeleteDirectoryData= smb.SMBDeleteDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- errorCode = STATUS_SUCCESS
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteDirectoryData['DirectoryName']).replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- if os.path.exists(pathName) is not True:
- errorCode = STATUS_NO_SUCH_FILE
-
- # TODO: More checks here in the future.. Specially when we support
- # user access
- else:
- try:
- os.rmdir(pathName)
- except OSError as e:
- smbServer.log("smbComDeleteDirectory: %s" % e,logging.ERROR)
- if e.errno == errno.ENOTEMPTY:
- errorCode = STATUS_DIRECTORY_NOT_EMPTY
- else:
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smbComWriteAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_WRITE_ANDX)
- respParameters = smb.SMBWriteAndXResponse_Parameters()
- respData = ''
-
- if SMBCommand['WordCount'] == 0x0C:
- writeAndX = smb.SMBWriteAndX_Parameters_Short(SMBCommand['Parameters'])
- writeAndXData = smb.SMBWriteAndX_Data_Short()
- else:
- writeAndX = smb.SMBWriteAndX_Parameters(SMBCommand['Parameters'])
- writeAndXData = smb.SMBWriteAndX_Data()
- writeAndXData['DataLength'] = writeAndX['DataLength']
- writeAndXData['DataOffset'] = writeAndX['DataOffset']
- writeAndXData.fromString(SMBCommand['Data'])
-
-
- if writeAndX['Fid'] in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][writeAndX['Fid']]['FileHandle']
- errorCode = STATUS_SUCCESS
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- offset = writeAndX['Offset']
- if 'HighOffset' in writeAndX.fields:
- offset += (writeAndX['HighOffset'] << 32)
- # If we're trying to write past the file end we just skip the write call (Vista does this)
- if os.lseek(fileHandle, 0, 2) >= offset:
- os.lseek(fileHandle,offset,0)
- os.write(fileHandle,writeAndXData['Data'])
- else:
- sock = connData['OpenedFiles'][writeAndX['Fid']]['Socket']
- sock.send(writeAndXData['Data'])
-
- respParameters['Count'] = writeAndX['DataLength']
- respParameters['Available']= 0xff
- except Exception as e:
- smbServer.log('smbComWriteAndx: %s' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComRead(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_READ)
- respParameters = smb.SMBReadResponse_Parameters()
- respData = smb.SMBReadResponse_Data()
-
- comReadParameters = smb.SMBRead_Parameters(SMBCommand['Parameters'])
-
- if comReadParameters['Fid'] in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][comReadParameters['Fid']]['FileHandle']
- errorCode = STATUS_SUCCESS
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- # TODO: Handle big size files
- os.lseek(fileHandle,comReadParameters['Offset'],0)
- content = os.read(fileHandle,comReadParameters['Count'])
- else:
- sock = connData['OpenedFiles'][comReadParameters['Fid']]['Socket']
- content = sock.recv(comReadParameters['Count'])
- respParameters['Count'] = len(content)
- respData['DataLength'] = len(content)
- respData['Data'] = content
- except Exception as e:
- smbServer.log('smbComRead: %s ' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComReadAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_READ_ANDX)
- respParameters = smb.SMBReadAndXResponse_Parameters()
- respData = ''
-
- if SMBCommand['WordCount'] == 0x0A:
- readAndX = smb.SMBReadAndX_Parameters2(SMBCommand['Parameters'])
- else:
- readAndX = smb.SMBReadAndX_Parameters(SMBCommand['Parameters'])
-
- if readAndX['Fid'] in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][readAndX['Fid']]['FileHandle']
- errorCode = 0
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- offset = readAndX['Offset']
- if 'HighOffset' in readAndX.fields:
- offset += (readAndX['HighOffset'] << 32)
- os.lseek(fileHandle,offset,0)
- content = os.read(fileHandle,readAndX['MaxCount'])
- else:
- sock = connData['OpenedFiles'][readAndX['Fid']]['Socket']
- content = sock.recv(readAndX['MaxCount'])
- respParameters['Remaining'] = 0xffff
- respParameters['DataCount'] = len(content)
- respParameters['DataOffset'] = 59
- respParameters['DataCount_Hi'] = 0
- respData = content
- except Exception as e:
- smbServer.log('smbComReadAndX: %s ' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbQueryInformation(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_QUERY_INFORMATION)
- respParameters = smb.SMBQueryInformationResponse_Parameters()
- respData = ''
-
- queryInformation= smb.SMBQueryInformation_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- fileSize, lastWriteTime, fileAttributes = queryFsInformation(
- connData['ConnectedShares'][recvPacket['Tid']]['path'],
- decodeSMBString(recvPacket['Flags2'],queryInformation['FileName']))
-
- respParameters['FileSize'] = fileSize
- respParameters['LastWriteTime'] = lastWriteTime
- respParameters['FileAttributes'] = fileAttributes
- errorCode = STATUS_SUCCESS
- else:
- # STATUS_SMB_BAD_TID
- errorCode = STATUS_SMB_BAD_TID
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbQueryInformationDisk(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_QUERY_INFORMATION_DISK)
- respParameters = smb.SMBQueryInformationDiskResponse_Parameters()
- respData = ''
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- totalUnits, freeUnits = queryDiskInformation(
- connData['ConnectedShares'][recvPacket['Tid']]['path'])
-
- respParameters['TotalUnits'] = totalUnits
- respParameters['BlocksPerUnit'] = 1
- respParameters['BlockSize'] = 1
- respParameters['FreeUnits'] = freeUnits
- errorCode = STATUS_SUCCESS
- else:
- # STATUS_SMB_BAD_TID
- respData = ''
- respParameters = ''
- errorCode = STATUS_SMB_BAD_TID
-
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComEcho(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_ECHO)
- respParameters = smb.SMBEchoResponse_Parameters()
- respData = smb.SMBEchoResponse_Data()
-
- echoData = smb.SMBEcho_Data(SMBCommand['Data'])
-
- respParameters['SequenceNumber'] = 1
- respData['Data'] = echoData['Data']
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- errorCode = STATUS_SUCCESS
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComTreeDisconnect(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_TREE_DISCONNECT)
-
- # Check if the Tid matches the Tid trying to disconnect
- respParameters = ''
- respData = ''
-
- if recvPacket['Tid'] in connData['ConnectedShares']:
- smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['Tid'],connData['ConnectedShares'][recvPacket['Tid']]['shareName']))
- del(connData['ConnectedShares'][recvPacket['Tid']])
- errorCode = STATUS_SUCCESS
- else:
- # STATUS_SMB_BAD_TID
- errorCode = STATUS_SMB_BAD_TID
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComLogOffAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_LOGOFF_ANDX)
-
- # Check if the Uid matches the user trying to logoff
- respParameters = ''
- respData = ''
- if recvPacket['Uid'] != connData['Uid']:
- # STATUS_SMB_BAD_UID
- errorCode = STATUS_SMB_BAD_UID
- else:
- errorCode = STATUS_SUCCESS
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- connData['Uid'] = 0
-
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComQueryInformation2(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_QUERY_INFORMATION2)
- respParameters = smb.SMBQueryInformation2Response_Parameters()
- respData = ''
-
- queryInformation2 = smb.SMBQueryInformation2_Parameters(SMBCommand['Parameters'])
- errorCode = 0xFF
- if queryInformation2['Fid'] in connData['OpenedFiles']:
- errorCode = STATUS_SUCCESS
- pathName = connData['OpenedFiles'][queryInformation2['Fid']]['FileName']
- try:
- (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(pathName)
- respParameters['CreateDate'] = getSMBDate(ctime)
- respParameters['CreationTime'] = getSMBTime(ctime)
- respParameters['LastAccessDate'] = getSMBDate(atime)
- respParameters['LastAccessTime'] = getSMBTime(atime)
- respParameters['LastWriteDate'] = getSMBDate(mtime)
- respParameters['LastWriteTime'] = getSMBTime(mtime)
- respParameters['FileDataSize'] = size
- respParameters['FileAllocationSize'] = size
- attribs = 0
- if os.path.isdir(pathName):
- attribs = smb.SMB_FILE_ATTRIBUTE_DIRECTORY
- if os.path.isfile(pathName):
- attribs = smb.SMB_FILE_ATTRIBUTE_NORMAL
- respParameters['FileAttributes'] = attribs
- except Exception as e:
- smbServer.log('smbComQueryInformation2 %s' % e,logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
-
- if errorCode > 0:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComNtCreateAndX(connId, smbServer, SMBCommand, recvPacket):
- # TODO: Fully implement this
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_NT_CREATE_ANDX)
- respParameters = smb.SMBNtCreateAndXResponse_Parameters()
- respData = ''
-
- ntCreateAndXParameters = smb.SMBNtCreateAndX_Parameters(SMBCommand['Parameters'])
- ntCreateAndXData = smb.SMBNtCreateAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
-
- #if ntCreateAndXParameters['CreateFlags'] & 0x10: # NT_CREATE_REQUEST_EXTENDED_RESPONSE
- # respParameters = smb.SMBNtCreateAndXExtendedResponse_Parameters()
- # respParameters['VolumeGUID'] = '\x00'
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- # If we have a rootFid, the path is relative to that fid
- errorCode = STATUS_SUCCESS
- if ntCreateAndXParameters['RootFid'] > 0:
- path = connData['OpenedFiles'][ntCreateAndXParameters['RootFid']]['FileName']
- LOG.debug("RootFid present %s!" % path)
- else:
- if 'path' in connData['ConnectedShares'][recvPacket['Tid']]:
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- else:
- path = 'NONE'
- errorCode = STATUS_ACCESS_DENIED
-
- deleteOnClose = False
-
- fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],ntCreateAndXData['FileName']).replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- createDisposition = ntCreateAndXParameters['Disposition']
- mode = 0
-
- if createDisposition == smb.FILE_SUPERSEDE:
- mode |= os.O_TRUNC | os.O_CREAT
- elif createDisposition & smb.FILE_OVERWRITE_IF == smb.FILE_OVERWRITE_IF:
- mode |= os.O_TRUNC | os.O_CREAT
- elif createDisposition & smb.FILE_OVERWRITE == smb.FILE_OVERWRITE:
- if os.path.exists(pathName) is True:
- mode |= os.O_TRUNC
- else:
- errorCode = STATUS_NO_SUCH_FILE
- elif createDisposition & smb.FILE_OPEN_IF == smb.FILE_OPEN_IF:
- if os.path.exists(pathName) is True:
- mode |= os.O_TRUNC
- else:
- mode |= os.O_TRUNC | os.O_CREAT
- elif createDisposition & smb.FILE_CREATE == smb.FILE_CREATE:
- if os.path.exists(pathName) is True:
- errorCode = STATUS_OBJECT_NAME_COLLISION
- else:
- mode |= os.O_CREAT
- elif createDisposition & smb.FILE_OPEN == smb.FILE_OPEN:
- if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
- errorCode = STATUS_NO_SUCH_FILE
-
- if errorCode == STATUS_SUCCESS:
- desiredAccess = ntCreateAndXParameters['AccessMask']
- if (desiredAccess & smb.FILE_READ_DATA) or (desiredAccess & smb.GENERIC_READ):
- mode |= os.O_RDONLY
- if (desiredAccess & smb.FILE_WRITE_DATA) or (desiredAccess & smb.GENERIC_WRITE):
- if (desiredAccess & smb.FILE_READ_DATA) or (desiredAccess & smb.GENERIC_READ):
- mode |= os.O_RDWR #| os.O_APPEND
- else:
- mode |= os.O_WRONLY #| os.O_APPEND
- if desiredAccess & smb.GENERIC_ALL:
- mode |= os.O_RDWR #| os.O_APPEND
-
- createOptions = ntCreateAndXParameters['CreateOptions']
- if mode & os.O_CREAT == os.O_CREAT:
- if createOptions & smb.FILE_DIRECTORY_FILE == smb.FILE_DIRECTORY_FILE:
- try:
- # Let's create the directory
- os.mkdir(pathName)
- mode = os.O_RDONLY
- except Exception as e:
- smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- if createOptions & smb.FILE_NON_DIRECTORY_FILE == smb.FILE_NON_DIRECTORY_FILE:
- # If the file being opened is a directory, the server MUST fail the request with
- # STATUS_FILE_IS_A_DIRECTORY in the Status field of the SMB Header in the server
- # response.
- if os.path.isdir(pathName) is True:
- errorCode = STATUS_FILE_IS_A_DIRECTORY
-
- if createOptions & smb.FILE_DELETE_ON_CLOSE == smb.FILE_DELETE_ON_CLOSE:
- deleteOnClose = True
-
- if errorCode == STATUS_SUCCESS:
- try:
- if os.path.isdir(pathName) and sys.platform == 'win32':
- fid = VOID_FILE_DESCRIPTOR
- else:
- if sys.platform == 'win32':
- mode |= os.O_BINARY
- if unicode(pathName) in smbServer.getRegisteredNamedPipes():
- fid = PIPE_FILE_DESCRIPTOR
- sock = socket.socket()
- sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
- else:
- fid = os.open(pathName, mode)
- except Exception as e:
- smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
- #print e
- fid = 0
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- if errorCode == STATUS_SUCCESS:
- # Simple way to generate a fid
- if len(connData['OpenedFiles']) == 0:
- fakefid = 1
- else:
- fakefid = connData['OpenedFiles'].keys()[-1] + 1
- respParameters['Fid'] = fakefid
- respParameters['CreateAction'] = createDisposition
- if fid == PIPE_FILE_DESCRIPTOR:
- respParameters['FileAttributes'] = 0x80
- respParameters['IsDirectory'] = 0
- respParameters['CreateTime'] = 0
- respParameters['LastAccessTime'] = 0
- respParameters['LastWriteTime'] = 0
- respParameters['LastChangeTime'] = 0
- respParameters['AllocationSize'] = 4096
- respParameters['EndOfFile'] = 0
- respParameters['FileType'] = 2
- respParameters['IPCState'] = 0x5ff
- else:
- if os.path.isdir(pathName):
- respParameters['FileAttributes'] = smb.SMB_FILE_ATTRIBUTE_DIRECTORY
- respParameters['IsDirectory'] = 1
- else:
- respParameters['IsDirectory'] = 0
- respParameters['FileAttributes'] = ntCreateAndXParameters['FileAttributes']
- # Let's get this file's information
- respInfo, errorCode = queryPathInformation('',pathName,level= smb.SMB_QUERY_FILE_ALL_INFO)
- if errorCode == STATUS_SUCCESS:
- respParameters['CreateTime'] = respInfo['CreationTime']
- respParameters['LastAccessTime'] = respInfo['LastAccessTime']
- respParameters['LastWriteTime'] = respInfo['LastWriteTime']
- respParameters['LastChangeTime'] = respInfo['LastChangeTime']
- respParameters['FileAttributes'] = respInfo['ExtFileAttributes']
- respParameters['AllocationSize'] = respInfo['AllocationSize']
- respParameters['EndOfFile'] = respInfo['EndOfFile']
- else:
- respParameters = ''
- respData = ''
-
- if errorCode == STATUS_SUCCESS:
- # Let's store the fid for the connection
- # smbServer.log('Create file %s, mode:0x%x' % (pathName, mode))
- connData['OpenedFiles'][fakefid] = {}
- connData['OpenedFiles'][fakefid]['FileHandle'] = fid
- connData['OpenedFiles'][fakefid]['FileName'] = pathName
- connData['OpenedFiles'][fakefid]['DeleteOnClose'] = deleteOnClose
- if fid == PIPE_FILE_DESCRIPTOR:
- connData['OpenedFiles'][fakefid]['Socket'] = sock
- else:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComOpenAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_OPEN_ANDX)
- respParameters = smb.SMBOpenAndXResponse_Parameters()
- respData = ''
-
- openAndXParameters = smb.SMBOpenAndX_Parameters(SMBCommand['Parameters'])
- openAndXData = smb.SMBOpenAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
-
- # Get the Tid associated
- if recvPacket['Tid'] in connData['ConnectedShares']:
- path = connData['ConnectedShares'][recvPacket['Tid']]['path']
- openedFile, mode, pathName, errorCode = openFile(path,
- decodeSMBString(recvPacket['Flags2'],openAndXData['FileName']),
- openAndXParameters['DesiredAccess'],
- openAndXParameters['FileAttributes'],
- openAndXParameters['OpenMode'])
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- if errorCode == STATUS_SUCCESS:
- # Simple way to generate a fid
- fid = len(connData['OpenedFiles']) + 1
- if len(connData['OpenedFiles']) == 0:
- fid = 1
- else:
- fid = connData['OpenedFiles'].keys()[-1] + 1
- respParameters['Fid'] = fid
- if mode & os.O_CREAT:
- # File did not exist and was created
- respParameters['Action'] = 0x2
- elif mode & os.O_RDONLY:
- # File existed and was opened
- respParameters['Action'] = 0x1
- elif mode & os.O_APPEND:
- # File existed and was opened
- respParameters['Action'] = 0x1
- else:
- # File existed and was truncated
- respParameters['Action'] = 0x3
-
- # Let's store the fid for the connection
- #smbServer.log('Opening file %s' % pathName)
- connData['OpenedFiles'][fid] = {}
- connData['OpenedFiles'][fid]['FileHandle'] = openedFile
- connData['OpenedFiles'][fid]['FileName'] = pathName
- connData['OpenedFiles'][fid]['DeleteOnClose'] = False
- else:
- respParameters = ''
- respData = ''
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComTreeConnectAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- resp = smb.NewSMBPacket()
- resp['Flags1'] = smb.SMB.FLAGS1_REPLY
- resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES | recvPacket['Flags2'] & smb.SMB.FLAGS2_UNICODE
-
- resp['Tid'] = recvPacket['Tid']
- resp['Mid'] = recvPacket['Mid']
- resp['Pid'] = connData['Pid']
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_TREE_CONNECT_ANDX)
- respParameters = smb.SMBTreeConnectAndXResponse_Parameters()
- respData = smb.SMBTreeConnectAndXResponse_Data()
-
- treeConnectAndXParameters = smb.SMBTreeConnectAndX_Parameters(SMBCommand['Parameters'])
-
- if treeConnectAndXParameters['Flags'] & 0x8:
- respParameters = smb.SMBTreeConnectAndXExtendedResponse_Parameters()
-
- treeConnectAndXData = smb.SMBTreeConnectAndX_Data( flags = recvPacket['Flags2'] )
- treeConnectAndXData['_PasswordLength'] = treeConnectAndXParameters['PasswordLength']
- treeConnectAndXData.fromString(SMBCommand['Data'])
-
- errorCode = STATUS_SUCCESS
-
- ## Process here the request, does the share exist?
- UNCOrShare = decodeSMBString(recvPacket['Flags2'], treeConnectAndXData['Path'])
-
- # Is this a UNC?
- if ntpath.ismount(UNCOrShare):
- path = UNCOrShare.split('\\')[3]
- else:
- path = ntpath.basename(UNCOrShare)
-
- share = searchShare(connId, path, smbServer)
- if share is not None:
- # Simple way to generate a Tid
- if len(connData['ConnectedShares']) == 0:
- tid = 1
- else:
- tid = connData['ConnectedShares'].keys()[-1] + 1
- connData['ConnectedShares'][tid] = share
- connData['ConnectedShares'][tid]['shareName'] = path
- resp['Tid'] = tid
- #smbServer.log("Connecting Share(%d:%s)" % (tid,path))
- else:
- smbServer.log("TreeConnectAndX not found %s" % path, logging.ERROR)
- errorCode = STATUS_OBJECT_PATH_NOT_FOUND
- resp['ErrorCode'] = errorCode >> 16
- resp['ErrorClass'] = errorCode & 0xff
- ##
- respParameters['OptionalSupport'] = smb.SMB.SMB_SUPPORT_SEARCH_BITS
-
- if path == 'IPC$':
- respData['Service'] = 'IPC'
- else:
- respData['Service'] = path
- respData['PadLen'] = 0
- respData['NativeFileSystem'] = encodeSMBString(recvPacket['Flags2'], 'NTFS' )
-
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- resp['Uid'] = connData['Uid']
- resp.addCommand(respSMBCommand)
- smbServer.setConnectionData(connId, connData)
-
- return None, [resp], errorCode
-
- @staticmethod
- def smbComSessionSetupAndX(connId, smbServer, SMBCommand, recvPacket):
- connData = smbServer.getConnectionData(connId, checkStatus = False)
-
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_SESSION_SETUP_ANDX)
-
- # From [MS-SMB]
- # When extended security is being used (see section 3.2.4.2.4), the
- # request MUST take the following form
- # [..]
- # WordCount (1 byte): The value of this field MUST be 0x0C.
- if SMBCommand['WordCount'] == 12:
- # Extended security. Here we deal with all SPNEGO stuff
- respParameters = smb.SMBSessionSetupAndX_Extended_Response_Parameters()
- respData = smb.SMBSessionSetupAndX_Extended_Response_Data(flags = recvPacket['Flags2'])
- sessionSetupParameters = smb.SMBSessionSetupAndX_Extended_Parameters(SMBCommand['Parameters'])
- sessionSetupData = smb.SMBSessionSetupAndX_Extended_Data()
- sessionSetupData['SecurityBlobLength'] = sessionSetupParameters['SecurityBlobLength']
- sessionSetupData.fromString(SMBCommand['Data'])
- connData['Capabilities'] = sessionSetupParameters['Capabilities']
-
- rawNTLM = False
- if struct.unpack('B',sessionSetupData['SecurityBlob'][0])[0] == ASN1_AID:
- # NEGOTIATE packet
- blob = SPNEGO_NegTokenInit(sessionSetupData['SecurityBlob'])
- token = blob['MechToken']
- if len(blob['MechTypes'][0]) > 0:
- # Is this GSSAPI NTLM or something else we don't support?
- mechType = blob['MechTypes'][0]
- if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
- # Nope, do we know it?
- if mechType in MechTypes:
- mechStr = MechTypes[mechType]
- else:
- mechStr = hexlify(mechType)
- smbServer.log("Unsupported MechType '%s'" % mechStr, logging.CRITICAL)
- # We don't know the token, we answer back again saying
- # we just support NTLM.
- # ToDo: Build this into a SPNEGO_NegTokenResp()
- respToken = '\xa1\x15\x30\x13\xa0\x03\x0a\x01\x03\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a'
- respParameters['SecurityBlobLength'] = len(respToken)
- respData['SecurityBlobLength'] = respParameters['SecurityBlobLength']
- respData['SecurityBlob'] = respToken
- respData['NativeOS'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
- respData['NativeLanMan'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
- return [respSMBCommand], None, STATUS_MORE_PROCESSING_REQUIRED
-
- elif struct.unpack('B',sessionSetupData['SecurityBlob'][0])[0] == ASN1_SUPPORTED_MECH:
- # AUTH packet
- blob = SPNEGO_NegTokenResp(sessionSetupData['SecurityBlob'])
- token = blob['ResponseToken']
- else:
- # No GSSAPI stuff, raw NTLMSSP
- rawNTLM = True
- token = sessionSetupData['SecurityBlob']
-
- # Here we only handle NTLMSSP, depending on what stage of the
- # authentication we are, we act on it
- messageType = struct.unpack('<L',token[len('NTLMSSP\x00'):len('NTLMSSP\x00')+4])[0]
-
- if messageType == 0x01:
- # NEGOTIATE_MESSAGE
- negotiateMessage = ntlm.NTLMAuthNegotiate()
- negotiateMessage.fromString(token)
- # Let's store it in the connection data
- connData['NEGOTIATE_MESSAGE'] = negotiateMessage
- # Let's build the answer flags
- # TODO: Parse all the flags. With this we're leaving some clients out
-
- ansFlags = 0
-
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_56:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_56
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_128:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_128
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_UNICODE:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_UNICODE
- if negotiateMessage['flags'] & ntlm.NTLM_NEGOTIATE_OEM:
- ansFlags |= ntlm.NTLM_NEGOTIATE_OEM
-
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_TARGET_INFO | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_REQUEST_TARGET
-
- # Generate the AV_PAIRS
- av_pairs = ntlm.AV_PAIRS()
- # TODO: Put the proper data from SMBSERVER config
- av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_HOSTNAME] = smbServer.getServerName().encode('utf-16le')
- av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] = smbServer.getServerDomain().encode('utf-16le')
- av_pairs[ntlm.NTLMSSP_AV_TIME] = struct.pack('<q', (116444736000000000 + calendar.timegm(time.gmtime()) * 10000000) )
-
- challengeMessage = ntlm.NTLMAuthChallenge()
- challengeMessage['flags'] = ansFlags
- challengeMessage['domain_len'] = len(smbServer.getServerDomain().encode('utf-16le'))
- challengeMessage['domain_max_len'] = challengeMessage['domain_len']
- challengeMessage['domain_offset'] = 40 + 16
- challengeMessage['challenge'] = smbServer.getSMBChallenge()
- challengeMessage['domain_name'] = smbServer.getServerDomain().encode('utf-16le')
- challengeMessage['TargetInfoFields_len'] = len(av_pairs)
- challengeMessage['TargetInfoFields_max_len'] = len(av_pairs)
- challengeMessage['TargetInfoFields'] = av_pairs
- challengeMessage['TargetInfoFields_offset'] = 40 + 16 + len(challengeMessage['domain_name'])
- challengeMessage['Version'] = '\xff'*8
- challengeMessage['VersionLen'] = 8
-
- if rawNTLM is False:
- respToken = SPNEGO_NegTokenResp()
- # accept-incomplete. We want more data
- respToken['NegResult'] = '\x01'
- respToken['SupportedMech'] = TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']
-
- respToken['ResponseToken'] = challengeMessage.getData()
- else:
- respToken = challengeMessage
-
- # Setting the packet to STATUS_MORE_PROCESSING
- errorCode = STATUS_MORE_PROCESSING_REQUIRED
- # Let's set up an UID for this connection and store it
- # in the connection's data
- # Picking a fixed value
- # TODO: Manage more UIDs for the same session
- connData['Uid'] = 10
- # Let's store it in the connection data
- connData['CHALLENGE_MESSAGE'] = challengeMessage
-
- elif messageType == 0x02:
- # CHALLENGE_MESSAGE
- raise Exception('Challenge Message raise, not implemented!')
- elif messageType == 0x03:
- # AUTHENTICATE_MESSAGE, here we deal with authentication
- authenticateMessage = ntlm.NTLMAuthChallengeResponse()
- authenticateMessage.fromString(token)
- smbServer.log("AUTHENTICATE_MESSAGE (%s\\%s,%s)" % (authenticateMessage['domain_name'], authenticateMessage['user_name'], authenticateMessage['host_name']))
- # TODO: Check the credentials! Now granting permissions
-
- respToken = SPNEGO_NegTokenResp()
- # accept-completed
- respToken['NegResult'] = '\x00'
-
- # Status SUCCESS
- errorCode = STATUS_SUCCESS
- smbServer.log('User %s\\%s authenticated successfully' % (authenticateMessage['user_name'], authenticateMessage['host_name']))
- # Let's store it in the connection data
- connData['AUTHENTICATE_MESSAGE'] = authenticateMessage
- try:
- jtr_dump_path = smbServer.getJTRdumpPath()
- ntlm_hash_data = outputToJohnFormat( connData['CHALLENGE_MESSAGE']['challenge'], authenticateMessage['user_name'], authenticateMessage['domain_name'], authenticateMessage['lanman'], authenticateMessage['ntlm'] )
- smbServer.log(ntlm_hash_data['hash_string'])
- if jtr_dump_path is not '':
- writeJohnOutputToFile(ntlm_hash_data['hash_string'], ntlm_hash_data['hash_version'], jtr_dump_path)
- except:
- smbServer.log("Could not write NTLM Hashes to the specified JTR_Dump_Path %s" % jtr_dump_path)
- else:
- raise Exception("Unknown NTLMSSP MessageType %d" % messageType)
-
- respParameters['SecurityBlobLength'] = len(respToken)
- respData['SecurityBlobLength'] = respParameters['SecurityBlobLength']
- respData['SecurityBlob'] = respToken.getData()
-
- else:
- # Process Standard Security
- respParameters = smb.SMBSessionSetupAndXResponse_Parameters()
- respData = smb.SMBSessionSetupAndXResponse_Data()
- sessionSetupParameters = smb.SMBSessionSetupAndX_Parameters(SMBCommand['Parameters'])
- sessionSetupData = smb.SMBSessionSetupAndX_Data()
- sessionSetupData['AnsiPwdLength'] = sessionSetupParameters['AnsiPwdLength']
- sessionSetupData['UnicodePwdLength'] = sessionSetupParameters['UnicodePwdLength']
- sessionSetupData.fromString(SMBCommand['Data'])
- connData['Capabilities'] = sessionSetupParameters['Capabilities']
- # Do the verification here, for just now we grant access
- # TODO: Manage more UIDs for the same session
- errorCode = STATUS_SUCCESS
- connData['Uid'] = 10
- respParameters['Action'] = 0
- smbServer.log('User %s\\%s authenticated successfully (basic)' % (sessionSetupData['PrimaryDomain'], sessionSetupData['Account']))
- try:
- jtr_dump_path = smbServer.getJTRdumpPath()
- ntlm_hash_data = outputToJohnFormat( '', sessionSetupData['Account'], sessionSetupData['PrimaryDomain'], sessionSetupData['AnsiPwd'], sessionSetupData['UnicodePwd'] )
- smbServer.log(ntlm_hash_data['hash_string'])
- if jtr_dump_path is not '':
- writeJohnOutputToFile(ntlm_hash_data['hash_string'], ntlm_hash_data['hash_version'], jtr_dump_path)
- except:
- smbServer.log("Could not write NTLM Hashes to the specified JTR_Dump_Path %s" % jtr_dump_path)
-
- respData['NativeOS'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
- respData['NativeLanMan'] = encodeSMBString(recvPacket['Flags2'], smbServer.getServerOS())
- respSMBCommand['Parameters'] = respParameters
- respSMBCommand['Data'] = respData
-
- # From now on, the client can ask for other commands
- connData['Authenticated'] = True
- # For now, just switching to nobody
- #os.setregid(65534,65534)
- #os.setreuid(65534,65534)
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smbComNegotiate(connId, smbServer, SMBCommand, recvPacket ):
- connData = smbServer.getConnectionData(connId, checkStatus = False)
- connData['Pid'] = recvPacket['Pid']
-
- SMBCommand = smb.SMBCommand(recvPacket['Data'][0])
- respSMBCommand = smb.SMBCommand(smb.SMB.SMB_COM_NEGOTIATE)
-
- resp = smb.NewSMBPacket()
- resp['Flags1'] = smb.SMB.FLAGS1_REPLY
- resp['Pid'] = connData['Pid']
- resp['Tid'] = recvPacket['Tid']
- resp['Mid'] = recvPacket['Mid']
-
- # TODO: We support more dialects, and parse them accordingly
- dialects = SMBCommand['Data'].split('\x02')
- try:
- index = dialects.index('NT LM 0.12\x00') - 1
- # Let's fill the data for NTLM
- if recvPacket['Flags2'] & smb.SMB.FLAGS2_EXTENDED_SECURITY:
- resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_UNICODE
- #resp['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS
- _dialects_data = smb.SMBExtended_Security_Data()
- _dialects_data['ServerGUID'] = 'A'*16
- blob = SPNEGO_NegTokenInit()
- blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
- _dialects_data['SecurityBlob'] = blob.getData()
-
- _dialects_parameters = smb.SMBExtended_Security_Parameters()
- _dialects_parameters['Capabilities'] = smb.SMB.CAP_EXTENDED_SECURITY | smb.SMB.CAP_USE_NT_ERRORS | smb.SMB.CAP_NT_SMBS | smb.SMB.CAP_UNICODE
- _dialects_parameters['ChallengeLength'] = 0
-
- else:
- resp['Flags2'] = smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_UNICODE
- _dialects_parameters = smb.SMBNTLMDialect_Parameters()
- _dialects_data= smb.SMBNTLMDialect_Data()
- _dialects_data['Payload'] = ''
- if 'EncryptionKey' in connData:
- _dialects_data['Challenge'] = connData['EncryptionKey']
- _dialects_parameters['ChallengeLength'] = len(str(_dialects_data))
- else:
- # TODO: Handle random challenges, now one that can be used with rainbow tables
- _dialects_data['Challenge'] = '\x11\x22\x33\x44\x55\x66\x77\x88'
- _dialects_parameters['ChallengeLength'] = 8
- _dialects_parameters['Capabilities'] = smb.SMB.CAP_USE_NT_ERRORS | smb.SMB.CAP_NT_SMBS
-
- # Let's see if we need to support RPC_REMOTE_APIS
- config = smbServer.getServerConfig()
- if config.has_option('global','rpc_apis'):
- if config.getboolean('global', 'rpc_apis') is True:
- _dialects_parameters['Capabilities'] |= smb.SMB.CAP_RPC_REMOTE_APIS
-
- _dialects_parameters['DialectIndex'] = index
- _dialects_parameters['SecurityMode'] = smb.SMB.SECURITY_AUTH_ENCRYPTED | smb.SMB.SECURITY_SHARE_USER
- _dialects_parameters['MaxMpxCount'] = 1
- _dialects_parameters['MaxNumberVcs'] = 1
- _dialects_parameters['MaxBufferSize'] = 64000
- _dialects_parameters['MaxRawSize'] = 65536
- _dialects_parameters['SessionKey'] = 0
- _dialects_parameters['LowDateTime'] = 0
- _dialects_parameters['HighDateTime'] = 0
- _dialects_parameters['ServerTimeZone'] = 0
-
-
- respSMBCommand['Data'] = _dialects_data
- respSMBCommand['Parameters'] = _dialects_parameters
- connData['_dialects_data'] = _dialects_data
- connData['_dialects_parameters'] = _dialects_parameters
-
- except Exception as e:
- # No NTLM throw an error
- smbServer.log('smbComNegotiate: %s' % e, logging.ERROR)
- respSMBCommand['Data'] = struct.pack('<H',0xffff)
-
-
- smbServer.setConnectionData(connId, connData)
-
- resp.addCommand(respSMBCommand)
-
- return None, [resp], STATUS_SUCCESS
-
- @staticmethod
- def default(connId, smbServer, SMBCommand, recvPacket):
- # By default we return an SMB Packet with error not implemented
- smbServer.log("Not implemented command: 0x%x" % recvPacket['Command'],logging.DEBUG)
- packet = smb.NewSMBPacket()
- packet['Flags1'] = smb.SMB.FLAGS1_REPLY
- packet['Flags2'] = smb.SMB.FLAGS2_NT_STATUS
- packet['Command'] = recvPacket['Command']
- packet['Pid'] = recvPacket['Pid']
- packet['Tid'] = recvPacket['Tid']
- packet['Mid'] = recvPacket['Mid']
- packet['Uid'] = recvPacket['Uid']
- packet['Data'] = '\x00\x00\x00'
- errorCode = STATUS_NOT_IMPLEMENTED
- packet['ErrorCode'] = errorCode >> 16
- packet['ErrorClass'] = errorCode & 0xff
-
- return None, [packet], errorCode
-
-class SMB2Commands:
- @staticmethod
- def smb2Negotiate(connId, smbServer, recvPacket, isSMB1 = False):
- connData = smbServer.getConnectionData(connId, checkStatus = False)
-
- respPacket = smb2.SMB2Packet()
- respPacket['Flags'] = smb2.SMB2_FLAGS_SERVER_TO_REDIR
- respPacket['Status'] = STATUS_SUCCESS
- respPacket['CreditRequestResponse'] = 1
- respPacket['Command'] = smb2.SMB2_NEGOTIATE
- respPacket['SessionID'] = 0
- if isSMB1 is False:
- respPacket['MessageID'] = recvPacket['MessageID']
- else:
- respPacket['MessageID'] = 0
- respPacket['TreeID'] = 0
-
-
- respSMBCommand = smb2.SMB2Negotiate_Response()
-
- respSMBCommand['SecurityMode'] = 1
- if isSMB1 is True:
- # Let's first parse the packet to see if the client supports SMB2
- SMBCommand = smb.SMBCommand(recvPacket['Data'][0])
-
- dialects = SMBCommand['Data'].split('\x02')
- if 'SMB 2.002\x00' in dialects or 'SMB 2.???\x00' in dialects:
- respSMBCommand['DialectRevision'] = smb2.SMB2_DIALECT_002
- else:
- # Client does not support SMB2 fallbacking
- raise Exception('SMB2 not supported, fallbacking')
- else:
- respSMBCommand['DialectRevision'] = smb2.SMB2_DIALECT_002
- respSMBCommand['ServerGuid'] = 'A'*16
- respSMBCommand['Capabilities'] = 0
- respSMBCommand['MaxTransactSize'] = 65536
- respSMBCommand['MaxReadSize'] = 65536
- respSMBCommand['MaxWriteSize'] = 65536
- respSMBCommand['SystemTime'] = getFileTime(calendar.timegm(time.gmtime()))
- respSMBCommand['ServerStartTime'] = getFileTime(calendar.timegm(time.gmtime()))
- respSMBCommand['SecurityBufferOffset'] = 0x80
-
- blob = SPNEGO_NegTokenInit()
- blob['MechTypes'] = [TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']]
-
- respSMBCommand['Buffer'] = blob.getData()
- respSMBCommand['SecurityBufferLength'] = len(respSMBCommand['Buffer'])
-
- respPacket['Data'] = respSMBCommand
-
- smbServer.setConnectionData(connId, connData)
-
- return None, [respPacket], STATUS_SUCCESS
-
- @staticmethod
- def smb2SessionSetup(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId, checkStatus = False)
-
- respSMBCommand = smb2.SMB2SessionSetup_Response()
-
- sessionSetupData = smb2.SMB2SessionSetup(recvPacket['Data'])
-
- connData['Capabilities'] = sessionSetupData['Capabilities']
-
- securityBlob = sessionSetupData['Buffer']
-
- rawNTLM = False
- if struct.unpack('B',securityBlob[0])[0] == ASN1_AID:
- # NEGOTIATE packet
- blob = SPNEGO_NegTokenInit(securityBlob)
- token = blob['MechToken']
- if len(blob['MechTypes'][0]) > 0:
- # Is this GSSAPI NTLM or something else we don't support?
- mechType = blob['MechTypes'][0]
- if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
- # Nope, do we know it?
- if mechType in MechTypes:
- mechStr = MechTypes[mechType]
- else:
- mechStr = hexlify(mechType)
- smbServer.log("Unsupported MechType '%s'" % mechStr, logging.CRITICAL)
- # We don't know the token, we answer back again saying
- # we just support NTLM.
- # ToDo: Build this into a SPNEGO_NegTokenResp()
- respToken = '\xa1\x15\x30\x13\xa0\x03\x0a\x01\x03\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a'
- respSMBCommand['SecurityBufferOffset'] = 0x48
- respSMBCommand['SecurityBufferLength'] = len(respToken)
- respSMBCommand['Buffer'] = respToken
-
- return [respSMBCommand], None, STATUS_MORE_PROCESSING_REQUIRED
- elif struct.unpack('B',securityBlob[0])[0] == ASN1_SUPPORTED_MECH:
- # AUTH packet
- blob = SPNEGO_NegTokenResp(securityBlob)
- token = blob['ResponseToken']
- else:
- # No GSSAPI stuff, raw NTLMSSP
- rawNTLM = True
- token = securityBlob
-
- # Here we only handle NTLMSSP, depending on what stage of the
- # authentication we are, we act on it
- messageType = struct.unpack('<L',token[len('NTLMSSP\x00'):len('NTLMSSP\x00')+4])[0]
-
- if messageType == 0x01:
- # NEGOTIATE_MESSAGE
- negotiateMessage = ntlm.NTLMAuthNegotiate()
- negotiateMessage.fromString(token)
- # Let's store it in the connection data
- connData['NEGOTIATE_MESSAGE'] = negotiateMessage
- # Let's build the answer flags
- # TODO: Parse all the flags. With this we're leaving some clients out
-
- ansFlags = 0
-
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_56:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_56
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_128:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_128
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
- if negotiateMessage['flags'] & ntlm.NTLMSSP_NEGOTIATE_UNICODE:
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_UNICODE
- if negotiateMessage['flags'] & ntlm.NTLM_NEGOTIATE_OEM:
- ansFlags |= ntlm.NTLM_NEGOTIATE_OEM
-
- ansFlags |= ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_TARGET_INFO | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_REQUEST_TARGET
-
- # Generate the AV_PAIRS
- av_pairs = ntlm.AV_PAIRS()
- # TODO: Put the proper data from SMBSERVER config
- av_pairs[ntlm.NTLMSSP_AV_HOSTNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_HOSTNAME] = smbServer.getServerName().encode('utf-16le')
- av_pairs[ntlm.NTLMSSP_AV_DOMAINNAME] = av_pairs[ntlm.NTLMSSP_AV_DNS_DOMAINNAME] = smbServer.getServerDomain().encode('utf-16le')
- av_pairs[ntlm.NTLMSSP_AV_TIME] = struct.pack('<q', (116444736000000000 + calendar.timegm(time.gmtime()) * 10000000) )
-
- challengeMessage = ntlm.NTLMAuthChallenge()
- challengeMessage['flags'] = ansFlags
- challengeMessage['domain_len'] = len(smbServer.getServerDomain().encode('utf-16le'))
- challengeMessage['domain_max_len'] = challengeMessage['domain_len']
- challengeMessage['domain_offset'] = 40 + 16
- challengeMessage['challenge'] = smbServer.getSMBChallenge()
- challengeMessage['domain_name'] = smbServer.getServerDomain().encode('utf-16le')
- challengeMessage['TargetInfoFields_len'] = len(av_pairs)
- challengeMessage['TargetInfoFields_max_len'] = len(av_pairs)
- challengeMessage['TargetInfoFields'] = av_pairs
- challengeMessage['TargetInfoFields_offset'] = 40 + 16 + len(challengeMessage['domain_name'])
- challengeMessage['Version'] = '\xff'*8
- challengeMessage['VersionLen'] = 8
-
- if rawNTLM is False:
- respToken = SPNEGO_NegTokenResp()
- # accept-incomplete. We want more data
- respToken['NegResult'] = '\x01'
- respToken['SupportedMech'] = TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']
-
- respToken['ResponseToken'] = challengeMessage.getData()
- else:
- respToken = challengeMessage
-
- # Setting the packet to STATUS_MORE_PROCESSING
- errorCode = STATUS_MORE_PROCESSING_REQUIRED
- # Let's set up an UID for this connection and store it
- # in the connection's data
- # Picking a fixed value
- # TODO: Manage more UIDs for the same session
- connData['Uid'] = random.randint(1,0xffffffff)
- # Let's store it in the connection data
- connData['CHALLENGE_MESSAGE'] = challengeMessage
-
- elif messageType == 0x02:
- # CHALLENGE_MESSAGE
- raise Exception('Challenge Message raise, not implemented!')
- elif messageType == 0x03:
- # AUTHENTICATE_MESSAGE, here we deal with authentication
- authenticateMessage = ntlm.NTLMAuthChallengeResponse()
- authenticateMessage.fromString(token)
- smbServer.log("AUTHENTICATE_MESSAGE (%s\\%s,%s)" % (authenticateMessage['domain_name'], authenticateMessage['user_name'], authenticateMessage['host_name']))
- # TODO: Check the credentials! Now granting permissions
-
- respToken = SPNEGO_NegTokenResp()
- # accept-completed
- respToken['NegResult'] = '\x00'
-
- # Status SUCCESS
- errorCode = STATUS_SUCCESS
- smbServer.log('User %s\\%s authenticated successfully' % (authenticateMessage['user_name'], authenticateMessage['host_name']))
- # Let's store it in the connection data
- connData['AUTHENTICATE_MESSAGE'] = authenticateMessage
- try:
- jtr_dump_path = smbServer.getJTRdumpPath()
- ntlm_hash_data = outputToJohnFormat( connData['CHALLENGE_MESSAGE']['challenge'], authenticateMessage['user_name'], authenticateMessage['domain_name'], authenticateMessage['lanman'], authenticateMessage['ntlm'] )
- smbServer.log(ntlm_hash_data['hash_string'])
- if jtr_dump_path is not '':
- writeJohnOutputToFile(ntlm_hash_data['hash_string'], ntlm_hash_data['hash_version'], jtr_dump_path)
- except:
- smbServer.log("Could not write NTLM Hashes to the specified JTR_Dump_Path %s" % jtr_dump_path)
- respSMBCommand['SessionFlags'] = 1
- else:
- raise Exception("Unknown NTLMSSP MessageType %d" % messageType)
-
- respSMBCommand['SecurityBufferOffset'] = 0x48
- respSMBCommand['SecurityBufferLength'] = len(respToken)
- respSMBCommand['Buffer'] = respToken.getData()
-
- # From now on, the client can ask for other commands
- connData['Authenticated'] = True
- # For now, just switching to nobody
- #os.setregid(65534,65534)
- #os.setreuid(65534,65534)
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2TreeConnect(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respPacket = smb2.SMB2Packet()
- respPacket['Flags'] = smb2.SMB2_FLAGS_SERVER_TO_REDIR
- respPacket['Status'] = STATUS_SUCCESS
- respPacket['CreditRequestResponse'] = 1
- respPacket['Command'] = recvPacket['Command']
- respPacket['SessionID'] = connData['Uid']
- respPacket['Reserved'] = recvPacket['Reserved']
- respPacket['MessageID'] = recvPacket['MessageID']
- respPacket['TreeID'] = recvPacket['TreeID']
-
- respSMBCommand = smb2.SMB2TreeConnect_Response()
-
- treeConnectRequest = smb2.SMB2TreeConnect(recvPacket['Data'])
-
- errorCode = STATUS_SUCCESS
-
- ## Process here the request, does the share exist?
- path = str(recvPacket)[treeConnectRequest['PathOffset']:][:treeConnectRequest['PathLength']]
- UNCOrShare = path.decode('utf-16le')
-
- # Is this a UNC?
- if ntpath.ismount(UNCOrShare):
- path = UNCOrShare.split('\\')[3]
- else:
- path = ntpath.basename(UNCOrShare)
-
- share = searchShare(connId, path.upper(), smbServer)
- if share is not None:
- # Simple way to generate a Tid
- if len(connData['ConnectedShares']) == 0:
- tid = 1
- else:
- tid = connData['ConnectedShares'].keys()[-1] + 1
- connData['ConnectedShares'][tid] = share
- connData['ConnectedShares'][tid]['shareName'] = path
- respPacket['TreeID'] = tid
- smbServer.log("Connecting Share(%d:%s)" % (tid,path))
- else:
- smbServer.log("SMB2_TREE_CONNECT not found %s" % path, logging.ERROR)
- errorCode = STATUS_OBJECT_PATH_NOT_FOUND
- respPacket['Status'] = errorCode
- ##
-
- if path == 'IPC$':
- respSMBCommand['ShareType'] = smb2.SMB2_SHARE_TYPE_PIPE
- respSMBCommand['ShareFlags'] = 0x30
- else:
- respSMBCommand['ShareType'] = smb2.SMB2_SHARE_TYPE_DISK
- respSMBCommand['ShareFlags'] = 0x0
-
- respSMBCommand['Capabilities'] = 0
- respSMBCommand['MaximalAccess'] = 0x000f01ff
-
- respPacket['Data'] = respSMBCommand
-
- smbServer.setConnectionData(connId, connData)
-
- return None, [respPacket], errorCode
-
- @staticmethod
- def smb2Create(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Create_Response()
-
- ntCreateRequest = smb2.SMB2Create(recvPacket['Data'])
-
- respSMBCommand['Buffer'] = '\x00'
- # Get the Tid associated
- if recvPacket['TreeID'] in connData['ConnectedShares']:
- # If we have a rootFid, the path is relative to that fid
- errorCode = STATUS_SUCCESS
- if 'path' in connData['ConnectedShares'][recvPacket['TreeID']]:
- path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
- else:
- path = 'NONE'
- errorCode = STATUS_ACCESS_DENIED
-
- deleteOnClose = False
-
- fileName = os.path.normpath(ntCreateRequest['Buffer'][:ntCreateRequest['NameLength']].decode('utf-16le').replace('\\','/'))
- if len(fileName) > 0 and (fileName[0] == '/' or fileName[0] == '\\'):
- # strip leading '/'
- fileName = fileName[1:]
- pathName = os.path.join(path,fileName)
- createDisposition = ntCreateRequest['CreateDisposition']
- mode = 0
-
- if createDisposition == smb2.FILE_SUPERSEDE:
- mode |= os.O_TRUNC | os.O_CREAT
- elif createDisposition & smb2.FILE_OVERWRITE_IF == smb2.FILE_OVERWRITE_IF:
- mode |= os.O_TRUNC | os.O_CREAT
- elif createDisposition & smb2.FILE_OVERWRITE == smb2.FILE_OVERWRITE:
- if os.path.exists(pathName) is True:
- mode |= os.O_TRUNC
- else:
- errorCode = STATUS_NO_SUCH_FILE
- elif createDisposition & smb2.FILE_OPEN_IF == smb2.FILE_OPEN_IF:
- if os.path.exists(pathName) is True:
- mode |= os.O_TRUNC
- else:
- mode |= os.O_TRUNC | os.O_CREAT
- elif createDisposition & smb2.FILE_CREATE == smb2.FILE_CREATE:
- if os.path.exists(pathName) is True:
- errorCode = STATUS_OBJECT_NAME_COLLISION
- else:
- mode |= os.O_CREAT
- elif createDisposition & smb2.FILE_OPEN == smb2.FILE_OPEN:
- if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
- errorCode = STATUS_NO_SUCH_FILE
-
- if errorCode == STATUS_SUCCESS:
- desiredAccess = ntCreateRequest['DesiredAccess']
- if (desiredAccess & smb2.FILE_READ_DATA) or (desiredAccess & smb2.GENERIC_READ):
- mode |= os.O_RDONLY
- if (desiredAccess & smb2.FILE_WRITE_DATA) or (desiredAccess & smb2.GENERIC_WRITE):
- if (desiredAccess & smb2.FILE_READ_DATA) or (desiredAccess & smb2.GENERIC_READ):
- mode |= os.O_RDWR #| os.O_APPEND
- else:
- mode |= os.O_WRONLY #| os.O_APPEND
- if desiredAccess & smb2.GENERIC_ALL:
- mode |= os.O_RDWR #| os.O_APPEND
-
- createOptions = ntCreateRequest['CreateOptions']
- if mode & os.O_CREAT == os.O_CREAT:
- if createOptions & smb2.FILE_DIRECTORY_FILE == smb2.FILE_DIRECTORY_FILE:
- try:
- # Let's create the directory
- os.mkdir(pathName)
- mode = os.O_RDONLY
- except Exception as e:
- smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- if createOptions & smb2.FILE_NON_DIRECTORY_FILE == smb2.FILE_NON_DIRECTORY_FILE:
- # If the file being opened is a directory, the server MUST fail the request with
- # STATUS_FILE_IS_A_DIRECTORY in the Status field of the SMB Header in the server
- # response.
- if os.path.isdir(pathName) is True:
- errorCode = STATUS_FILE_IS_A_DIRECTORY
-
- if createOptions & smb2.FILE_DELETE_ON_CLOSE == smb2.FILE_DELETE_ON_CLOSE:
- deleteOnClose = True
-
- if errorCode == STATUS_SUCCESS:
- try:
- if os.path.isdir(pathName) and sys.platform == 'win32':
- fid = VOID_FILE_DESCRIPTOR
- else:
- if sys.platform == 'win32':
- mode |= os.O_BINARY
- if unicode(pathName) in smbServer.getRegisteredNamedPipes():
- fid = PIPE_FILE_DESCRIPTOR
- sock = socket.socket()
- sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
- else:
- fid = os.open(pathName, mode)
- except Exception as e:
- smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
- #print e
- fid = 0
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_SMB_BAD_TID
-
- if errorCode == STATUS_SUCCESS:
- # Simple way to generate a fid
- fakefid = uuid.generate()
-
- respSMBCommand['FileID'] = fakefid
- respSMBCommand['CreateAction'] = createDisposition
-
- if fid == PIPE_FILE_DESCRIPTOR:
- respSMBCommand['CreationTime'] = 0
- respSMBCommand['LastAccessTime'] = 0
- respSMBCommand['LastWriteTime'] = 0
- respSMBCommand['ChangeTime'] = 0
- respSMBCommand['AllocationSize'] = 4096
- respSMBCommand['EndOfFile'] = 0
- respSMBCommand['FileAttributes'] = 0x80
-
- else:
- if os.path.isdir(pathName):
- respSMBCommand['FileAttributes'] = smb.SMB_FILE_ATTRIBUTE_DIRECTORY
- else:
- respSMBCommand['FileAttributes'] = ntCreateRequest['FileAttributes']
- # Let's get this file's information
- respInfo, errorCode = queryPathInformation('',pathName,level= smb.SMB_QUERY_FILE_ALL_INFO)
- if errorCode == STATUS_SUCCESS:
- respSMBCommand['CreationTime'] = respInfo['CreationTime']
- respSMBCommand['LastAccessTime'] = respInfo['LastAccessTime']
- respSMBCommand['LastWriteTime'] = respInfo['LastWriteTime']
- respSMBCommand['LastChangeTime'] = respInfo['LastChangeTime']
- respSMBCommand['FileAttributes'] = respInfo['ExtFileAttributes']
- respSMBCommand['AllocationSize'] = respInfo['AllocationSize']
- respSMBCommand['EndOfFile'] = respInfo['EndOfFile']
-
- if errorCode == STATUS_SUCCESS:
- # Let's store the fid for the connection
- # smbServer.log('Create file %s, mode:0x%x' % (pathName, mode))
- connData['OpenedFiles'][fakefid] = {}
- connData['OpenedFiles'][fakefid]['FileHandle'] = fid
- connData['OpenedFiles'][fakefid]['FileName'] = pathName
- connData['OpenedFiles'][fakefid]['DeleteOnClose'] = deleteOnClose
- connData['OpenedFiles'][fakefid]['Open'] = {}
- connData['OpenedFiles'][fakefid]['Open']['EnumerationLocation'] = 0
- connData['OpenedFiles'][fakefid]['Open']['EnumerationSearchPattern'] = ''
- if fid == PIPE_FILE_DESCRIPTOR:
- connData['OpenedFiles'][fakefid]['Socket'] = sock
- else:
- respSMBCommand = smb2.SMB2Error()
-
- if errorCode == STATUS_SUCCESS:
- connData['LastRequest']['SMB2_CREATE'] = respSMBCommand
- smbServer.setConnectionData(connId, connData)
-
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Close(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Close_Response()
-
- closeRequest = smb2.SMB2Close(recvPacket['Data'])
-
- if str(closeRequest['FileID']) == '\xff'*16:
- # Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
- fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
- else:
- fileID = str(closeRequest['FileID'])
- else:
- fileID = str(closeRequest['FileID'])
-
- if fileID in connData['OpenedFiles']:
- errorCode = STATUS_SUCCESS
- fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
- pathName = connData['OpenedFiles'][fileID]['FileName']
- infoRecord = None
- try:
- if fileHandle == PIPE_FILE_DESCRIPTOR:
- connData['OpenedFiles'][fileID]['Socket'].close()
- elif fileHandle != VOID_FILE_DESCRIPTOR:
- os.close(fileHandle)
- infoRecord, errorCode = queryFileInformation(os.path.dirname(pathName), os.path.basename(pathName), smb2.SMB2_FILE_NETWORK_OPEN_INFO)
- except Exception as e:
- smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
- errorCode = STATUS_INVALID_HANDLE
- else:
- # Check if the file was marked for removal
- if connData['OpenedFiles'][fileID]['DeleteOnClose'] is True:
- try:
- if os.path.isdir(pathName):
- shutil.rmtree(connData['OpenedFiles'][fileID]['FileName'])
- else:
- os.remove(connData['OpenedFiles'][fileID]['FileName'])
- except Exception as e:
- smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
-
- # Now fill out the response
- if infoRecord is not None:
- respSMBCommand['CreationTime'] = infoRecord['CreationTime']
- respSMBCommand['LastAccessTime'] = infoRecord['LastAccessTime']
- respSMBCommand['LastWriteTime'] = infoRecord['LastWriteTime']
- respSMBCommand['ChangeTime'] = infoRecord['ChangeTime']
- respSMBCommand['AllocationSize'] = infoRecord['AllocationSize']
- respSMBCommand['EndofFile'] = infoRecord['EndOfFile']
- respSMBCommand['FileAttributes'] = infoRecord['FileAttributes']
- if errorCode == STATUS_SUCCESS:
- del(connData['OpenedFiles'][fileID])
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2QueryInfo(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2QueryInfo_Response()
-
- queryInfo = smb2.SMB2QueryInfo(recvPacket['Data'])
-
- errorCode = STATUS_SUCCESS
-
- respSMBCommand['OutputBufferOffset'] = 0x48
- respSMBCommand['Buffer'] = '\x00'
-
- if str(queryInfo['FileID']) == '\xff'*16:
- # Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
- fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
- else:
- fileID = str(queryInfo['FileID'])
- else:
- fileID = str(queryInfo['FileID'])
-
- if recvPacket['TreeID'] in connData['ConnectedShares']:
- if fileID in connData['OpenedFiles']:
- fileName = connData['OpenedFiles'][fileID]['FileName']
-
- if queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
- if queryInfo['FileInfoClass'] == smb2.SMB2_FILE_INTERNAL_INFO:
- # No need to call queryFileInformation, we have the data here
- infoRecord = smb2.FileInternalInformation()
- infoRecord['IndexNumber'] = fileID
- else:
- infoRecord, errorCode = queryFileInformation(os.path.dirname(fileName), os.path.basename(fileName), queryInfo['FileInfoClass'])
- elif queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILESYSTEM:
- infoRecord = queryFsInformation(os.path.dirname(fileName), os.path.basename(fileName), queryInfo['FileInfoClass'])
- elif queryInfo['InfoType'] == smb2.SMB2_0_INFO_SECURITY:
- # Failing for now, until we support it
- infoRecord = None
- errorCode = STATUS_ACCESS_DENIED
- else:
- smbServer.log("queryInfo not supported (%x)" % queryInfo['InfoType'], logging.ERROR)
-
- if infoRecord is not None:
- respSMBCommand['OutputBufferLength'] = len(infoRecord)
- respSMBCommand['Buffer'] = infoRecord
- else:
- errorCode = STATUS_INVALID_HANDLE
- else:
- errorCode = STATUS_SMB_BAD_TID
-
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2SetInfo(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2SetInfo_Response()
-
- setInfo = smb2.SMB2SetInfo(recvPacket['Data'])
-
- errorCode = STATUS_SUCCESS
-
- if str(setInfo['FileID']) == '\xff'*16:
- # Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
- fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
- else:
- fileID = str(setInfo['FileID'])
- else:
- fileID = str(setInfo['FileID'])
-
- if recvPacket['TreeID'] in connData['ConnectedShares']:
- path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
- if fileID in connData['OpenedFiles']:
- pathName = connData['OpenedFiles'][fileID]['FileName']
-
- if setInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
- # The file information is being set
- informationLevel = setInfo['FileInfoClass']
- if informationLevel == smb2.SMB2_FILE_DISPOSITION_INFO:
- infoRecord = smb.SMBSetFileDispositionInfo(setInfo['Buffer'])
- if infoRecord['DeletePending'] > 0:
- # Mark this file for removal after closed
- connData['OpenedFiles'][fileID]['DeleteOnClose'] = True
- elif informationLevel == smb2.SMB2_FILE_BASIC_INFO:
- infoRecord = smb.SMBSetFileBasicInfo(setInfo['Buffer'])
- # Creation time won't be set, the other ones we play with.
- atime = infoRecord['LastWriteTime']
- if atime == 0:
- atime = -1
- else:
- atime = getUnixTime(atime)
- mtime = infoRecord['ChangeTime']
- if mtime == 0:
- mtime = -1
- else:
- mtime = getUnixTime(mtime)
- if atime > 0 and mtime > 0:
- os.utime(pathName,(atime,mtime))
- elif informationLevel == smb2.SMB2_FILE_END_OF_FILE_INFO:
- fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
- infoRecord = smb.SMBSetFileEndOfFileInfo(setInfo['Buffer'])
- if infoRecord['EndOfFile'] > 0:
- os.lseek(fileHandle, infoRecord['EndOfFile']-1, 0)
- os.write(fileHandle, '\x00')
- elif informationLevel == smb2.SMB2_FILE_RENAME_INFO:
- renameInfo = smb2.FILE_RENAME_INFORMATION_TYPE_2(setInfo['Buffer'])
- newPathName = os.path.join(path,renameInfo['FileName'].decode('utf-16le').replace('\\', '/'))
- if renameInfo['ReplaceIfExists'] == 0 and os.path.exists(newPathName):
- return [smb2.SMB2Error()], None, STATUS_OBJECT_NAME_COLLISION
- try:
- os.rename(pathName,newPathName)
- connData['OpenedFiles'][fileID]['FileName'] = newPathName
- except Exception as e:
- smbServer.log("smb2SetInfo: %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- smbServer.log('Unknown level for set file info! 0x%x' % informationLevel, logging.ERROR)
- # UNSUPPORTED
- errorCode = STATUS_NOT_SUPPORTED
- #elif setInfo['InfoType'] == smb2.SMB2_0_INFO_FILESYSTEM:
- # # The underlying object store information is being set.
- # setInfo = queryFsInformation('/', fileName, queryInfo['FileInfoClass'])
- #elif setInfo['InfoType'] == smb2.SMB2_0_INFO_SECURITY:
- # # The security information is being set.
- # # Failing for now, until we support it
- # infoRecord = None
- # errorCode = STATUS_ACCESS_DENIED
- #elif setInfo['InfoType'] == smb2.SMB2_0_INFO_QUOTA:
- # # The underlying object store quota information is being set.
- # setInfo = queryFsInformation('/', fileName, queryInfo['FileInfoClass'])
- else:
- smbServer.log("setInfo not supported (%x)" % setInfo['InfoType'], logging.ERROR)
-
- else:
- errorCode = STATUS_INVALID_HANDLE
- else:
- errorCode = STATUS_SMB_BAD_TID
-
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Write(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Write_Response()
- writeRequest = smb2.SMB2Write(recvPacket['Data'])
-
- respSMBCommand['Buffer'] = '\x00'
-
- if str(writeRequest['FileID']) == '\xff'*16:
- # Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
- fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
- else:
- fileID = str(writeRequest['FileID'])
- else:
- fileID = str(writeRequest['FileID'])
-
- if fileID in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
- errorCode = STATUS_SUCCESS
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- offset = writeRequest['Offset']
- # If we're trying to write past the file end we just skip the write call (Vista does this)
- if os.lseek(fileHandle, 0, 2) >= offset:
- os.lseek(fileHandle,offset,0)
- os.write(fileHandle,writeRequest['Buffer'])
- else:
- sock = connData['OpenedFiles'][fileID]['Socket']
- sock.send(writeRequest['Buffer'])
-
- respSMBCommand['Count'] = writeRequest['Length']
- respSMBCommand['Remaining']= 0xff
- except Exception as e:
- smbServer.log('SMB2_WRITE: %s' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Read(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Read_Response()
- readRequest = smb2.SMB2Read(recvPacket['Data'])
-
- respSMBCommand['Buffer'] = '\x00'
-
- if str(readRequest['FileID']) == '\xff'*16:
- # Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
- fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
- else:
- fileID = str(readRequest['FileID'])
- else:
- fileID = str(readRequest['FileID'])
-
- if fileID in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
- errorCode = 0
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- offset = readRequest['Offset']
- os.lseek(fileHandle,offset,0)
- content = os.read(fileHandle,readRequest['Length'])
- else:
- sock = connData['OpenedFiles'][fileID]['Socket']
- content = sock.recv(readRequest['Length'])
-
- respSMBCommand['DataOffset'] = 0x50
- respSMBCommand['DataLength'] = len(content)
- respSMBCommand['DataRemaining']= 0
- respSMBCommand['Buffer'] = content
- except Exception as e:
- smbServer.log('SMB2_READ: %s ' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Flush(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Flush_Response()
- flushRequest = smb2.SMB2Flush(recvPacket['Data'])
-
- if str(flushRequest['FileID']) in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][str(flushRequest['FileID'])]['FileHandle']
- errorCode = STATUS_SUCCESS
- try:
- os.fsync(fileHandle)
- except Exception as e:
- smbServer.log("SMB2_FLUSH %s" % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_HANDLE
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
-
- @staticmethod
- def smb2QueryDirectory(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
- respSMBCommand = smb2.SMB2QueryDirectory_Response()
- queryDirectoryRequest = smb2.SMB2QueryDirectory(recvPacket['Data'])
-
- respSMBCommand['Buffer'] = '\x00'
-
- # The server MUST locate the tree connection, as specified in section 3.3.5.2.11.
- if (recvPacket['TreeID'] in connData['ConnectedShares']) is False:
- return [smb2.SMB2Error()], None, STATUS_NETWORK_NAME_DELETED
-
- # Next, the server MUST locate the open for the directory to be queried
- # If no open is found, the server MUST fail the request with STATUS_FILE_CLOSED
- if str(queryDirectoryRequest['FileID']) == '\xff'*16:
- # Let's take the data from the lastRequest
- if 'SMB2_CREATE' in connData['LastRequest']:
- fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
- else:
- fileID = str(queryDirectoryRequest['FileID'])
- else:
- fileID = str(queryDirectoryRequest['FileID'])
-
- if (fileID in connData['OpenedFiles']) is False:
- return [smb2.SMB2Error()], None, STATUS_FILE_CLOSED
-
- # If the open is not an open to a directory, the request MUST be failed
- # with STATUS_INVALID_PARAMETER.
- if os.path.isdir(connData['OpenedFiles'][fileID]['FileName']) is False:
- return [smb2.SMB2Error()], None, STATUS_INVALID_PARAMETER
-
- # If any other information class is specified in the FileInformationClass
- # field of the SMB2 QUERY_DIRECTORY Request, the server MUST fail the
- # operation with STATUS_INVALID_INFO_CLASS.
- if queryDirectoryRequest['FileInformationClass'] not in (
- smb2.FILE_DIRECTORY_INFORMATION, smb2.FILE_FULL_DIRECTORY_INFORMATION, smb2.FILEID_FULL_DIRECTORY_INFORMATION,
- smb2.FILE_BOTH_DIRECTORY_INFORMATION, smb2.FILEID_BOTH_DIRECTORY_INFORMATION, smb2.FILENAMES_INFORMATION):
- return [smb2.SMB2Error()], None, STATUS_INVALID_INFO_CLASS
-
- # If SMB2_REOPEN is set in the Flags field of the SMB2 QUERY_DIRECTORY
- # Request, the server SHOULD<326> set Open.EnumerationLocation to 0
- # and Open.EnumerationSearchPattern to an empty string.
- if queryDirectoryRequest['Flags'] & smb2.SMB2_REOPEN:
- connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] = 0
- connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] = ''
-
- # If SMB2_RESTART_SCANS is set in the Flags field of the SMB2
- # QUERY_DIRECTORY Request, the server MUST set
- # Open.EnumerationLocation to 0.
- if queryDirectoryRequest['Flags'] & smb2.SMB2_RESTART_SCANS:
- connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] = 0
-
- # If Open.EnumerationLocation is 0 and Open.EnumerationSearchPattern
- # is an empty string, then Open.EnumerationSearchPattern MUST be set
- # to the search pattern specified in the SMB2 QUERY_DIRECTORY by
- # FileNameOffset and FileNameLength. If FileNameLength is 0, the server
- # SHOULD<327> set Open.EnumerationSearchPattern as "*" to search all entries.
-
- pattern = queryDirectoryRequest['Buffer'].decode('utf-16le')
- if connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] == 0 and \
- connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] == '':
- if pattern == '':
- pattern = '*'
- connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] = pattern
-
- # If SMB2_INDEX_SPECIFIED is set and FileNameLength is not zero,
- # the server MUST set Open.EnumerationSearchPattern to the search pattern
- # specified in the request by FileNameOffset and FileNameLength.
- if queryDirectoryRequest['Flags'] & smb2.SMB2_INDEX_SPECIFIED and \
- queryDirectoryRequest['FileNameLength'] > 0:
- connData['OpenedFiles'][fileID]['Open']['EnumerationSearchPattern'] = pattern
-
- pathName = os.path.join(os.path.normpath(connData['OpenedFiles'][fileID]['FileName']),pattern)
- searchResult, searchCount, errorCode = findFirst2(os.path.dirname(pathName),
- os.path.basename(pathName),
- queryDirectoryRequest['FileInformationClass'],
- smb.ATTR_DIRECTORY, isSMB2 = True )
-
- if errorCode != STATUS_SUCCESS:
- return [smb2.SMB2Error()], None, errorCode
-
- if searchCount > 2 and pattern == '*':
- # strip . and ..
- searchCount -= 2
- searchResult = searchResult[2:]
-
- if searchCount == 0 and connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] == 0:
- return [smb2.SMB2Error()], None, STATUS_NO_SUCH_FILE
-
- if connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] < 0:
- return [smb2.SMB2Error()], None, STATUS_NO_MORE_FILES
-
- totalData = 0
- respData = ''
- for nItem in range(connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'], searchCount):
- connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] += 1
- if queryDirectoryRequest['Flags'] & smb2.SL_RETURN_SINGLE_ENTRY:
- # If single entry is requested we must clear the NextEntryOffset
- searchResult[nItem]['NextEntryOffset'] = 0
- data = searchResult[nItem].getData()
- lenData = len(data)
- padLen = (8-(lenData % 8)) %8
-
- if (totalData+lenData) >= queryDirectoryRequest['OutputBufferLength']:
- connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] -= 1
- break
- else:
- respData += data + '\x00'*padLen
- totalData += lenData + padLen
-
- if queryDirectoryRequest['Flags'] & smb2.SL_RETURN_SINGLE_ENTRY:
- break
-
- if connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] >= searchCount:
- connData['OpenedFiles'][fileID]['Open']['EnumerationLocation'] = -1
-
- respSMBCommand['OutputBufferOffset'] = 0x48
- respSMBCommand['OutputBufferLength'] = totalData
- respSMBCommand['Buffer'] = respData
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2ChangeNotify(connId, smbServer, recvPacket):
-
- return [smb2.SMB2Error()], None, STATUS_NOT_SUPPORTED
-
- @staticmethod
- def smb2Echo(connId, smbServer, recvPacket):
-
- respSMBCommand = smb2.SMB2Echo_Response()
-
- return [respSMBCommand], None, STATUS_SUCCESS
-
- @staticmethod
- def smb2TreeDisconnect(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2TreeDisconnect_Response()
-
- if recvPacket['TreeID'] in connData['ConnectedShares']:
- smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['TreeID'],connData['ConnectedShares'][recvPacket['TreeID']]['shareName']))
- del(connData['ConnectedShares'][recvPacket['TreeID']])
- errorCode = STATUS_SUCCESS
- else:
- # STATUS_SMB_BAD_TID
- errorCode = STATUS_SMB_BAD_TID
-
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Logoff(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Logoff_Response()
-
- if recvPacket['SessionID'] != connData['Uid']:
- # STATUS_SMB_BAD_UID
- errorCode = STATUS_SMB_BAD_UID
- else:
- errorCode = STATUS_SUCCESS
-
- connData['Uid'] = 0
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Ioctl(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Ioctl_Response()
- ioctlRequest = smb2.SMB2Ioctl(recvPacket['Data'])
-
- ioctls = smbServer.getIoctls()
- if ioctlRequest['CtlCode'] in ioctls:
- outputData, errorCode = ioctls[ioctlRequest['CtlCode']](connId, smbServer, ioctlRequest)
- if errorCode == STATUS_SUCCESS:
- respSMBCommand['CtlCode'] = ioctlRequest['CtlCode']
- respSMBCommand['FileID'] = ioctlRequest['FileID']
- respSMBCommand['InputOffset'] = 0
- respSMBCommand['InputCount'] = 0
- respSMBCommand['OutputOffset'] = 0x70
- respSMBCommand['OutputCount'] = len(outputData)
- respSMBCommand['Flags'] = 0
- respSMBCommand['Buffer'] = outputData
- else:
- respSMBCommand = outputData
- else:
- smbServer.log("Ioctl not implemented command: 0x%x" % ioctlRequest['CtlCode'],logging.DEBUG)
- errorCode = STATUS_INVALID_DEVICE_REQUEST
- respSMBCommand = smb2.SMB2Error()
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Lock(connId, smbServer, recvPacket):
- connData = smbServer.getConnectionData(connId)
-
- respSMBCommand = smb2.SMB2Lock_Response()
-
- # I'm actually doing nothing.. just make MacOS happy ;)
- errorCode = STATUS_SUCCESS
-
- smbServer.setConnectionData(connId, connData)
- return [respSMBCommand], None, errorCode
-
- @staticmethod
- def smb2Cancel(connId, smbServer, recvPacket):
- # I'm actually doing nothing
- return [smb2.SMB2Error()], None, STATUS_CANCELLED
-
- @staticmethod
- def default(connId, smbServer, recvPacket):
- # By default we return an SMB Packet with error not implemented
- smbServer.log("Not implemented command: 0x%x" % recvPacket['Command'],logging.DEBUG)
- return [smb2.SMB2Error()], None, STATUS_NOT_SUPPORTED
-
-class Ioctls:
- @staticmethod
- def fsctlDfsGetReferrals(connId, smbServer, ioctlRequest):
- return smb2.SMB2Error(), STATUS_FS_DRIVER_REQUIRED
-
- @staticmethod
- def fsctlPipeTransceive(connId, smbServer, ioctlRequest):
- connData = smbServer.getConnectionData(connId)
-
- ioctlResponse = ''
-
- if str(ioctlRequest['FileID']) in connData['OpenedFiles']:
- fileHandle = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['FileHandle']
- errorCode = STATUS_SUCCESS
- try:
- if fileHandle != PIPE_FILE_DESCRIPTOR:
- errorCode = STATUS_INVALID_DEVICE_REQUEST
- else:
- sock = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['Socket']
- sock.sendall(ioctlRequest['Buffer'])
- ioctlResponse = sock.recv(ioctlRequest['MaxOutputResponse'])
- except Exception as e:
- smbServer.log('fsctlPipeTransceive: %s ' % e, logging.ERROR)
- errorCode = STATUS_ACCESS_DENIED
- else:
- errorCode = STATUS_INVALID_DEVICE_REQUEST
-
- smbServer.setConnectionData(connId, connData)
- return ioctlResponse, errorCode
-
- @staticmethod
- def fsctlValidateNegotiateInfo(connId, smbServer, ioctlRequest):
- connData = smbServer.getConnectionData(connId)
-
- errorCode = STATUS_SUCCESS
-
- validateNegotiateInfo = smb2.VALIDATE_NEGOTIATE_INFO(ioctlRequest['Buffer'])
- validateNegotiateInfo['Capabilities'] = 0
- validateNegotiateInfo['Guid'] = 'A'*16
- validateNegotiateInfo['SecurityMode'] = 1
- validateNegotiateInfo['Dialects'] = (smb2.SMB2_DIALECT_002,)
-
- smbServer.setConnectionData(connId, connData)
- return validateNegotiateInfo.getData(), errorCode
-
-
-class SMBSERVERHandler(SocketServer.BaseRequestHandler):
- def __init__(self, request, client_address, server, select_poll = False):
- self.__SMB = server
- self.__ip, self.__port = client_address
- self.__request = request
- self.__connId = threading.currentThread().getName()
- self.__timeOut = 60*5
- self.__select_poll = select_poll
- #self.__connId = os.getpid()
- SocketServer.BaseRequestHandler.__init__(self, request, client_address, server)
-
- def handle(self):
- self.__SMB.log("Incoming connection (%s,%d)" % (self.__ip, self.__port))
- self.__SMB.addConnection(self.__connId, self.__ip, self.__port)
- while True:
- try:
- # Firt of all let's get the NETBIOS packet
- session = nmb.NetBIOSTCPSession(self.__SMB.getServerName(),'HOST', self.__ip, sess_port = self.__port, sock = self.__request, select_poll = self.__select_poll)
- try:
- p = session.recv_packet(self.__timeOut)
- except nmb.NetBIOSTimeout:
- raise
- except nmb.NetBIOSError:
- break
-
- if p.get_type() == nmb.NETBIOS_SESSION_REQUEST:
- # Someone is requesting a session, we're gonna accept them all :)
- _, rn, my = p.get_trailer().split(' ')
- remote_name = nmb.decode_name('\x20'+rn)
- myname = nmb.decode_name('\x20'+my)
- self.__SMB.log("NetBIOS Session request (%s,%s,%s)" % (self.__ip, remote_name[1].strip(), myname[1]))
- r = nmb.NetBIOSSessionPacket()
- r.set_type(nmb.NETBIOS_SESSION_POSITIVE_RESPONSE)
- r.set_trailer(p.get_trailer())
- self.__request.send(r.rawData())
- else:
- resp = self.__SMB.processRequest(self.__connId, p.get_trailer())
- # Send all the packets recevied. Except for big transactions this should be
- # a single packet
- for i in resp:
- session.send_packet(str(i))
- except Exception as e:
- self.__SMB.log("Handle: %s" % e)
- #import traceback
- #traceback.print_exc()
- break
-
- def finish(self):
- # Thread/process is dying, we should tell the main SMB thread to remove all this thread data
- self.__SMB.log("Closing down connection (%s,%d)" % (self.__ip, self.__port))
- self.__SMB.removeConnection(self.__connId)
- return SocketServer.BaseRequestHandler.finish(self)
-
-class SMBSERVER(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
-#class SMBSERVER(SocketServer.ForkingMixIn, SocketServer.TCPServer):
- def __init__(self, server_address, handler_class=SMBSERVERHandler, config_parser = None):
- SocketServer.TCPServer.allow_reuse_address = True
- SocketServer.TCPServer.__init__(self, server_address, handler_class)
-
- # Server name and OS to be presented whenever is necessary
- self.__serverName = ''
- self.__serverOS = ''
- self.__serverDomain = ''
- self.__challenge = ''
- self.__log = None
-
- # Our ConfigParser data
- self.__serverConfig = config_parser
-
- # Our credentials to be used during the server's lifetime
- self.__credentials = {}
-
- # Our log file
- self.__logFile = ''
-
- # Registered Named Pipes, format is PipeName,Socket
- self.__registeredNamedPipes = {}
-
- # JTR dump path
- self.__jtr_dump_path = ''
-
- # SMB2 Support flag = default not active
- self.__SMB2Support = False
-
- # Our list of commands we will answer, by default the NOT IMPLEMENTED one
- self.__smbCommandsHandler = SMBCommands()
- self.__smbTrans2Handler = TRANS2Commands()
- self.__smbTransHandler = TRANSCommands()
- self.__smbNTTransHandler = NTTRANSCommands()
- self.__smb2CommandsHandler = SMB2Commands()
- self.__IoctlHandler = Ioctls()
-
- self.__smbNTTransCommands = {
- # NT IOCTL, can't find doc for this
- 0xff :self.__smbNTTransHandler.default
- }
-
- self.__smbTransCommands = {
-'\\PIPE\\LANMAN' :self.__smbTransHandler.lanMan,
-smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe,
- }
- self.__smbTrans2Commands = {
- smb.SMB.TRANS2_FIND_FIRST2 :self.__smbTrans2Handler.findFirst2,
- smb.SMB.TRANS2_FIND_NEXT2 :self.__smbTrans2Handler.findNext2,
- smb.SMB.TRANS2_QUERY_FS_INFORMATION :self.__smbTrans2Handler.queryFsInformation,
- smb.SMB.TRANS2_QUERY_PATH_INFORMATION :self.__smbTrans2Handler.queryPathInformation,
- smb.SMB.TRANS2_QUERY_FILE_INFORMATION :self.__smbTrans2Handler.queryFileInformation,
- smb.SMB.TRANS2_SET_FILE_INFORMATION :self.__smbTrans2Handler.setFileInformation,
- smb.SMB.TRANS2_SET_PATH_INFORMATION :self.__smbTrans2Handler.setPathInformation
- }
-
- self.__smbCommands = {
- #smb.SMB.SMB_COM_FLUSH: self.__smbCommandsHandler.smbComFlush,
- smb.SMB.SMB_COM_CREATE_DIRECTORY: self.__smbCommandsHandler.smbComCreateDirectory,
- smb.SMB.SMB_COM_DELETE_DIRECTORY: self.__smbCommandsHandler.smbComDeleteDirectory,
- smb.SMB.SMB_COM_RENAME: self.__smbCommandsHandler.smbComRename,
- smb.SMB.SMB_COM_DELETE: self.__smbCommandsHandler.smbComDelete,
- smb.SMB.SMB_COM_NEGOTIATE: self.__smbCommandsHandler.smbComNegotiate,
- smb.SMB.SMB_COM_SESSION_SETUP_ANDX: self.__smbCommandsHandler.smbComSessionSetupAndX,
- smb.SMB.SMB_COM_LOGOFF_ANDX: self.__smbCommandsHandler.smbComLogOffAndX,
- smb.SMB.SMB_COM_TREE_CONNECT_ANDX: self.__smbCommandsHandler.smbComTreeConnectAndX,
- smb.SMB.SMB_COM_TREE_DISCONNECT: self.__smbCommandsHandler.smbComTreeDisconnect,
- smb.SMB.SMB_COM_ECHO: self.__smbCommandsHandler.smbComEcho,
- smb.SMB.SMB_COM_QUERY_INFORMATION: self.__smbCommandsHandler.smbQueryInformation,
- smb.SMB.SMB_COM_TRANSACTION2: self.__smbCommandsHandler.smbTransaction2,
- smb.SMB.SMB_COM_TRANSACTION: self.__smbCommandsHandler.smbTransaction,
- # Not needed for now
- smb.SMB.SMB_COM_NT_TRANSACT: self.__smbCommandsHandler.smbNTTransact,
- smb.SMB.SMB_COM_QUERY_INFORMATION_DISK: self.__smbCommandsHandler.smbQueryInformationDisk,
- smb.SMB.SMB_COM_OPEN_ANDX: self.__smbCommandsHandler.smbComOpenAndX,
- smb.SMB.SMB_COM_QUERY_INFORMATION2: self.__smbCommandsHandler.smbComQueryInformation2,
- smb.SMB.SMB_COM_READ_ANDX: self.__smbCommandsHandler.smbComReadAndX,
- smb.SMB.SMB_COM_READ: self.__smbCommandsHandler.smbComRead,
- smb.SMB.SMB_COM_WRITE_ANDX: self.__smbCommandsHandler.smbComWriteAndX,
- smb.SMB.SMB_COM_WRITE: self.__smbCommandsHandler.smbComWrite,
- smb.SMB.SMB_COM_CLOSE: self.__smbCommandsHandler.smbComClose,
- smb.SMB.SMB_COM_LOCKING_ANDX: self.__smbCommandsHandler.smbComLockingAndX,
- smb.SMB.SMB_COM_NT_CREATE_ANDX: self.__smbCommandsHandler.smbComNtCreateAndX,
- 0xFF: self.__smbCommandsHandler.default
-}
-
- self.__smb2Ioctls = {
- smb2.FSCTL_DFS_GET_REFERRALS: self.__IoctlHandler.fsctlDfsGetReferrals,
-# smb2.FSCTL_PIPE_PEEK: self.__IoctlHandler.fsctlPipePeek,
-# smb2.FSCTL_PIPE_WAIT: self.__IoctlHandler.fsctlPipeWait,
- smb2.FSCTL_PIPE_TRANSCEIVE: self.__IoctlHandler.fsctlPipeTransceive,
-# smb2.FSCTL_SRV_COPYCHUNK: self.__IoctlHandler.fsctlSrvCopyChunk,
-# smb2.FSCTL_SRV_ENUMERATE_SNAPSHOTS: self.__IoctlHandler.fsctlSrvEnumerateSnapshots,
-# smb2.FSCTL_SRV_REQUEST_RESUME_KEY: self.__IoctlHandler.fsctlSrvRequestResumeKey,
-# smb2.FSCTL_SRV_READ_HASH: self.__IoctlHandler.fsctlSrvReadHash,
-# smb2.FSCTL_SRV_COPYCHUNK_WRITE: self.__IoctlHandler.fsctlSrvCopyChunkWrite,
-# smb2.FSCTL_LMR_REQUEST_RESILIENCY: self.__IoctlHandler.fsctlLmrRequestResiliency,
-# smb2.FSCTL_QUERY_NETWORK_INTERFACE_INFO: self.__IoctlHandler.fsctlQueryNetworkInterfaceInfo,
-# smb2.FSCTL_SET_REPARSE_POINT: self.__IoctlHandler.fsctlSetReparsePoint,
-# smb2.FSCTL_DFS_GET_REFERRALS_EX: self.__IoctlHandler.fsctlDfsGetReferralsEx,
-# smb2.FSCTL_FILE_LEVEL_TRIM: self.__IoctlHandler.fsctlFileLevelTrim,
- smb2.FSCTL_VALIDATE_NEGOTIATE_INFO: self.__IoctlHandler.fsctlValidateNegotiateInfo,
-}
-
- self.__smb2Commands = {
- smb2.SMB2_NEGOTIATE: self.__smb2CommandsHandler.smb2Negotiate,
- smb2.SMB2_SESSION_SETUP: self.__smb2CommandsHandler.smb2SessionSetup,
- smb2.SMB2_LOGOFF: self.__smb2CommandsHandler.smb2Logoff,
- smb2.SMB2_TREE_CONNECT: self.__smb2CommandsHandler.smb2TreeConnect,
- smb2.SMB2_TREE_DISCONNECT: self.__smb2CommandsHandler.smb2TreeDisconnect,
- smb2.SMB2_CREATE: self.__smb2CommandsHandler.smb2Create,
- smb2.SMB2_CLOSE: self.__smb2CommandsHandler.smb2Close,
- smb2.SMB2_FLUSH: self.__smb2CommandsHandler.smb2Flush,
- smb2.SMB2_READ: self.__smb2CommandsHandler.smb2Read,
- smb2.SMB2_WRITE: self.__smb2CommandsHandler.smb2Write,
- smb2.SMB2_LOCK: self.__smb2CommandsHandler.smb2Lock,
- smb2.SMB2_IOCTL: self.__smb2CommandsHandler.smb2Ioctl,
- smb2.SMB2_CANCEL: self.__smb2CommandsHandler.smb2Cancel,
- smb2.SMB2_ECHO: self.__smb2CommandsHandler.smb2Echo,
- smb2.SMB2_QUERY_DIRECTORY: self.__smb2CommandsHandler.smb2QueryDirectory,
- smb2.SMB2_CHANGE_NOTIFY: self.__smb2CommandsHandler.smb2ChangeNotify,
- smb2.SMB2_QUERY_INFO: self.__smb2CommandsHandler.smb2QueryInfo,
- smb2.SMB2_SET_INFO: self.__smb2CommandsHandler.smb2SetInfo,
-# smb2.SMB2_OPLOCK_BREAK: self.__smb2CommandsHandler.smb2SessionSetup,
- 0xFF: self.__smb2CommandsHandler.default
-}
-
- # List of active connections
- self.__activeConnections = {}
-
- def getIoctls(self):
- return self.__smb2Ioctls
-
- def getCredentials(self):
- return self.__credentials
-
- def removeConnection(self, name):
- try:
- del(self.__activeConnections[name])
- except:
- pass
- self.log("Remaining connections %s" % self.__activeConnections.keys())
-
- def addConnection(self, name, ip, port):
- self.__activeConnections[name] = {}
- # Let's init with some know stuff we will need to have
- # TODO: Document what's in there
- #print "Current Connections", self.__activeConnections.keys()
- self.__activeConnections[name]['PacketNum'] = 0
- self.__activeConnections[name]['ClientIP'] = ip
- self.__activeConnections[name]['ClientPort'] = port
- self.__activeConnections[name]['Uid'] = 0
- self.__activeConnections[name]['ConnectedShares'] = {}
- self.__activeConnections[name]['OpenedFiles'] = {}
- # SID results for findfirst2
- self.__activeConnections[name]['SIDs'] = {}
- self.__activeConnections[name]['LastRequest'] = {}
-
- def getActiveConnections(self):
- return self.__activeConnections
-
- def setConnectionData(self, connId, data):
- self.__activeConnections[connId] = data
- #print "setConnectionData"
- #print self.__activeConnections
-
- def getConnectionData(self, connId, checkStatus = True):
- conn = self.__activeConnections[connId]
- if checkStatus is True:
- if ('Authenticated' in conn) is not True:
- # Can't keep going further
- raise Exception("User not Authenticated!")
- return conn
-
- def getRegisteredNamedPipes(self):
- return self.__registeredNamedPipes
-
- def registerNamedPipe(self, pipeName, address):
- self.__registeredNamedPipes[unicode(pipeName)] = address
- return True
-
- def unregisterNamedPipe(self, pipeName):
- if pipeName in self.__registeredNamedPipes:
- del(self.__registeredNamedPipes[unicode(pipeName)])
- return True
- return False
-
- def unregisterTransaction(self, transCommand):
- if transCommand in self.__smbTransCommands:
- del(self.__smbTransCommands[transCommand])
-
- def hookTransaction(self, transCommand, callback):
- # If you call this function, callback will replace
- # the current Transaction sub command.
- # (don't get confused with the Transaction smbCommand)
- # If the transaction sub command doesn't not exist, it is added
- # If the transaction sub command exists, it returns the original function # replaced
- #
- # callback MUST be declared as:
- # callback(connId, smbServer, recvPacket, parameters, data, maxDataCount=0)
- #
- # WHERE:
- #
- # connId : the connection Id, used to grab/update information about
- # the current connection
- # smbServer : the SMBServer instance available for you to ask
- # configuration data
- # recvPacket : the full SMBPacket that triggered this command
- # parameters : the transaction parameters
- # data : the transaction data
- # maxDataCount: the max amount of data that can be transfered agreed
- # with the client
- #
- # and MUST return:
- # respSetup, respParameters, respData, errorCode
- #
- # WHERE:
- #
- # respSetup: the setup response of the transaction
- # respParameters: the parameters response of the transaction
- # respData: the data reponse of the transaction
- # errorCode: the NT error code
-
- if transCommand in self.__smbTransCommands:
- originalCommand = self.__smbTransCommands[transCommand]
- else:
- originalCommand = None
-
- self.__smbTransCommands[transCommand] = callback
- return originalCommand
-
- def unregisterTransaction2(self, transCommand):
- if transCommand in self.__smbTrans2Commands:
- del(self.__smbTrans2Commands[transCommand])
-
- def hookTransaction2(self, transCommand, callback):
- # Here we should add to __smbTrans2Commands
- # Same description as Transaction
- if transCommand in self.__smbTrans2Commands:
- originalCommand = self.__smbTrans2Commands[transCommand]
- else:
- originalCommand = None
-
- self.__smbTrans2Commands[transCommand] = callback
- return originalCommand
-
- def unregisterNTTransaction(self, transCommand):
- if transCommand in self.__smbNTTransCommands:
- del(self.__smbNTTransCommands[transCommand])
-
- def hookNTTransaction(self, transCommand, callback):
- # Here we should add to __smbNTTransCommands
- # Same description as Transaction
- if transCommand in self.__smbNTTransCommands:
- originalCommand = self.__smbNTTransCommands[transCommand]
- else:
- originalCommand = None
-
- self.__smbNTTransCommands[transCommand] = callback
- return originalCommand
-
- def unregisterSmbCommand(self, smbCommand):
- if smbCommand in self.__smbCommands:
- del(self.__smbCommands[smbCommand])
-
- def hookSmbCommand(self, smbCommand, callback):
- # Here we should add to self.__smbCommands
- # If you call this function, callback will replace
- # the current smbCommand.
- # If smbCommand doesn't not exist, it is added
- # If SMB command exists, it returns the original function replaced
- #
- # callback MUST be declared as:
- # callback(connId, smbServer, SMBCommand, recvPacket)
- #
- # WHERE:
- #
- # connId : the connection Id, used to grab/update information about
- # the current connection
- # smbServer : the SMBServer instance available for you to ask
- # configuration data
- # SMBCommand: the SMBCommand itself, with its data and parameters.
- # Check smb.py:SMBCommand() for a reference
- # recvPacket: the full SMBPacket that triggered this command
- #
- # and MUST return:
- # <list of respSMBCommands>, <list of packets>, errorCode
- # <list of packets> has higher preference over commands, in case you
- # want to change the whole packet
- # errorCode: the NT error code
- #
- # For SMB_COM_TRANSACTION2, SMB_COM_TRANSACTION and SMB_COM_NT_TRANSACT
- # the callback function is slightly different:
- #
- # callback(connId, smbServer, SMBCommand, recvPacket, transCommands)
- #
- # WHERE:
- #
- # transCommands: a list of transaction subcommands already registered
- #
-
- if smbCommand in self.__smbCommands:
- originalCommand = self.__smbCommands[smbCommand]
- else:
- originalCommand = None
-
- self.__smbCommands[smbCommand] = callback
- return originalCommand
-
- def unregisterSmb2Command(self, smb2Command):
- if smb2Command in self.__smb2Commands:
- del(self.__smb2Commands[smb2Command])
-
- def hookSmb2Command(self, smb2Command, callback):
- if smb2Command in self.__smb2Commands:
- originalCommand = self.__smb2Commands[smb2Command]
- else:
- originalCommand = None
-
- self.__smb2Commands[smb2Command] = callback
- return originalCommand
-
- def log(self, msg, level=logging.INFO):
- self.__log.log(level,msg)
-
- def getServerName(self):
- return self.__serverName
-
- def getServerOS(self):
- return self.__serverOS
-
- def getServerDomain(self):
- return self.__serverDomain
-
- def getSMBChallenge(self):
- return self.__challenge
-
- def getServerConfig(self):
- return self.__serverConfig
-
- def setServerConfig(self, config):
- self.__serverConfig = config
-
- def getJTRdumpPath(self):
- return self.__jtr_dump_path
-
- def verify_request(self, request, client_address):
- # TODO: Control here the max amount of processes we want to launch
- # returning False, closes the connection
- return True
-
- def processRequest(self, connId, data):
-
- # TODO: Process batched commands.
- isSMB2 = False
- SMBCommand = None
- try:
- packet = smb.NewSMBPacket(data = data)
- SMBCommand = smb.SMBCommand(packet['Data'][0])
- except:
- # Maybe a SMB2 packet?
- packet = smb2.SMB2Packet(data = data)
- isSMB2 = True
-
- # We might have compound requests
- compoundedPacketsResponse = []
- compoundedPackets = []
- try:
- # Search out list of implemented commands
- # We provide them with:
- # connId : representing the data for this specific connection
- # self : the SMBSERVER if they want to ask data to it
- # SMBCommand : the SMBCommand they are expecting to process
- # packet : the received packet itself, in case they need more data than the actual command
- # Only for Transactions
- # transCommand: a list of transaction subcommands
- # We expect to get:
- # respCommands: a list of answers for the commands processed
- # respPacket : if the commands chose to directly craft packet/s, we use this and not the previous
- # this MUST be a list
- # errorCode : self explanatory
- if isSMB2 is False:
- if packet['Command'] == smb.SMB.SMB_COM_TRANSACTION2:
- respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
- connId,
- self,
- SMBCommand,
- packet,
- self.__smbTrans2Commands)
- elif packet['Command'] == smb.SMB.SMB_COM_NT_TRANSACT:
- respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
- connId,
- self,
- SMBCommand,
- packet,
- self.__smbNTTransCommands)
- elif packet['Command'] == smb.SMB.SMB_COM_TRANSACTION:
- respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
- connId,
- self,
- SMBCommand,
- packet,
- self.__smbTransCommands)
- else:
- if packet['Command'] in self.__smbCommands:
- if self.__SMB2Support is True:
- if packet['Command'] == smb.SMB.SMB_COM_NEGOTIATE:
- try:
- respCommands, respPackets, errorCode = self.__smb2Commands[smb2.SMB2_NEGOTIATE](connId, self, packet, True)
- isSMB2 = True
- except Exception as e:
- self.log('SMB2_NEGOTIATE: %s' % e, logging.ERROR)
- # If something went wrong, let's fallback to SMB1
- respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
- connId,
- self,
- SMBCommand,
- packet)
- #self.__SMB2Support = False
- pass
- else:
- respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
- connId,
- self,
- SMBCommand,
- packet)
- else:
- respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
- connId,
- self,
- SMBCommand,
- packet)
- else:
- respCommands, respPackets, errorCode = self.__smbCommands[255](connId, self, SMBCommand, packet)
-
- compoundedPacketsResponse.append((respCommands, respPackets, errorCode))
- compoundedPackets.append(packet)
-
- else:
- done = False
- while not done:
- if packet['Command'] in self.__smb2Commands:
- if self.__SMB2Support is True:
- respCommands, respPackets, errorCode = self.__smb2Commands[packet['Command']](
- connId,
- self,
- packet)
- else:
- respCommands, respPackets, errorCode = self.__smb2Commands[255](connId, self, packet)
- else:
- respCommands, respPackets, errorCode = self.__smb2Commands[255](connId, self, packet)
- # Let's store the result for this compounded packet
- compoundedPacketsResponse.append((respCommands, respPackets, errorCode))
- compoundedPackets.append(packet)
- if packet['NextCommand'] != 0:
- data = data[packet['NextCommand']:]
- packet = smb2.SMB2Packet(data = data)
- else:
- done = True
-
- except Exception as e:
- #import traceback
- #traceback.print_exc()
- # Something wen't wrong, defaulting to Bad user ID
- self.log('processRequest (0x%x,%s)' % (packet['Command'],e), logging.ERROR)
- raise
-
- # We prepare the response packet to commands don't need to bother about that.
- connData = self.getConnectionData(connId, False)
-
- # Force reconnection loop.. This is just a test.. client will send me back credentials :)
- #connData['PacketNum'] += 1
- #if connData['PacketNum'] == 15:
- # connData['PacketNum'] = 0
- # # Something wen't wrong, defaulting to Bad user ID
- # self.log('Sending BAD USER ID!', logging.ERROR)
- # #raise
- # packet['Flags1'] |= smb.SMB.FLAGS1_REPLY
- # packet['Flags2'] = 0
- # errorCode = STATUS_SMB_BAD_UID
- # packet['ErrorCode'] = errorCode >> 16
- # packet['ErrorClass'] = errorCode & 0xff
- # return [packet]
-
- self.setConnectionData(connId, connData)
-
- packetsToSend = []
- for packetNum in range(len(compoundedPacketsResponse)):
- respCommands, respPackets, errorCode = compoundedPacketsResponse[packetNum]
- packet = compoundedPackets[packetNum]
- if respPackets is None:
- for respCommand in respCommands:
- if isSMB2 is False:
- respPacket = smb.NewSMBPacket()
- respPacket['Flags1'] = smb.SMB.FLAGS1_REPLY
-
- # TODO this should come from a per session configuration
- respPacket['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES | packet['Flags2'] & smb.SMB.FLAGS2_UNICODE
- #respPacket['Flags2'] = smb.SMB.FLAGS2_EXTENDED_SECURITY | smb.SMB.FLAGS2_NT_STATUS | smb.SMB.FLAGS2_LONG_NAMES
- #respPacket['Flags1'] = 0x98
- #respPacket['Flags2'] = 0xc807
-
-
- respPacket['Tid'] = packet['Tid']
- respPacket['Mid'] = packet['Mid']
- respPacket['Pid'] = packet['Pid']
- respPacket['Uid'] = connData['Uid']
-
- respPacket['ErrorCode'] = errorCode >> 16
- respPacket['_reserved'] = errorCode >> 8 & 0xff
- respPacket['ErrorClass'] = errorCode & 0xff
- respPacket.addCommand(respCommand)
-
- packetsToSend.append(respPacket)
- else:
- respPacket = smb2.SMB2Packet()
- respPacket['Flags'] = smb2.SMB2_FLAGS_SERVER_TO_REDIR
- if packetNum > 0:
- respPacket['Flags'] |= smb2.SMB2_FLAGS_RELATED_OPERATIONS
- respPacket['Status'] = errorCode
- respPacket['CreditRequestResponse'] = packet['CreditRequestResponse']
- respPacket['Command'] = packet['Command']
- respPacket['CreditCharge'] = packet['CreditCharge']
- #respPacket['CreditCharge'] = 0
- respPacket['Reserved'] = packet['Reserved']
- respPacket['SessionID'] = connData['Uid']
- respPacket['MessageID'] = packet['MessageID']
- respPacket['TreeID'] = packet['TreeID']
- respPacket['Data'] = str(respCommand)
- packetsToSend.append(respPacket)
- else:
- # The SMBCommand took care of building the packet
- packetsToSend = respPackets
-
- if isSMB2 is True:
- # Let's build a compound answer
- finalData = ''
- i = 0
- for i in range(len(packetsToSend)-1):
- packet = packetsToSend[i]
- # Align to 8-bytes
- padLen = (8 - (len(packet) % 8) ) % 8
- packet['NextCommand'] = len(packet) + padLen
- finalData += str(packet) + padLen*'\x00'
-
- # Last one
- finalData += str(packetsToSend[len(packetsToSend)-1])
- packetsToSend = [finalData]
-
- # We clear the compound requests
- connData['LastRequest'] = {}
-
- return packetsToSend
-
- def processConfigFile(self, configFile = None):
- # TODO: Do a real config parser
- if self.__serverConfig is None:
- if configFile is None:
- configFile = 'smb.conf'
- self.__serverConfig = ConfigParser.ConfigParser()
- self.__serverConfig.read(configFile)
-
- self.__serverName = self.__serverConfig.get('global','server_name')
- self.__serverOS = self.__serverConfig.get('global','server_os')
- self.__serverDomain = self.__serverConfig.get('global','server_domain')
- self.__logFile = self.__serverConfig.get('global','log_file')
- if self.__serverConfig.has_option('global', 'challenge'):
- self.__challenge = self.__serverConfig.get('global', 'challenge')
- else:
- self.__challenge = 'A'*8
-
- if self.__serverConfig.has_option("global", "jtr_dump_path"):
- self.__jtr_dump_path = self.__serverConfig.get("global", "jtr_dump_path")
-
- if self.__serverConfig.has_option("global", "SMB2Support"):
- self.__SMB2Support = self.__serverConfig.getboolean("global","SMB2Support")
- else:
- self.__SMB2Support = False
-
- if self.__logFile != 'None':
- logging.basicConfig(filename = self.__logFile,
- level = logging.DEBUG,
- format="%(asctime)s: %(levelname)s: %(message)s",
- datefmt = '%m/%d/%Y %I:%M:%S %p')
- self.__log = LOG
-
- # Process the credentials
- credentials_fname = self.__serverConfig.get('global','credentials_file')
- if credentials_fname is not "":
- cred = open(credentials_fname)
- line = cred.readline()
- while line:
- name, domain, lmhash, nthash = line.split(':')
- self.__credentials[name] = (domain, lmhash, nthash.strip('\r\n'))
- line = cred.readline()
- cred.close()
- self.log('Config file parsed')
-
-# For windows platforms, opening a directory is not an option, so we set a void FD
-VOID_FILE_DESCRIPTOR = -1
-PIPE_FILE_DESCRIPTOR = -2
diff --git a/tests/python_dependencies/impacket/spnego.py b/tests/python_dependencies/impacket/spnego.py
deleted file mode 100644
index 98069f579..000000000
--- a/tests/python_dependencies/impacket/spnego.py
+++ /dev/null
@@ -1,372 +0,0 @@
-from __future__ import print_function
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Author: Alberto Solino (beto@coresecurity.com)
-#
-# Description:
-# SPNEGO functions used by SMB, SMB2/3 and DCERPC
-#
-
-from struct import pack, unpack, calcsize
-
-############### GSS Stuff ################
-GSS_API_SPNEGO_UUID = '\x2b\x06\x01\x05\x05\x02'
-ASN1_SEQUENCE = 0x30
-ASN1_AID = 0x60
-ASN1_OID = 0x06
-ASN1_OCTET_STRING = 0x04
-ASN1_MECH_TYPE = 0xa0
-ASN1_MECH_TOKEN = 0xa2
-ASN1_SUPPORTED_MECH = 0xa1
-ASN1_RESPONSE_TOKEN = 0xa2
-ASN1_ENUMERATED = 0x0a
-MechTypes = {
-'+\x06\x01\x04\x01\x827\x02\x02\x1e': 'SNMPv2-SMI::enterprises.311.2.2.30',
-'+\x06\x01\x04\x01\x827\x02\x02\n': 'NTLMSSP - Microsoft NTLM Security Support Provider',
-'*\x86H\x82\xf7\x12\x01\x02\x02': 'MS KRB5 - Microsoft Kerberos 5',
-'*\x86H\x86\xf7\x12\x01\x02\x02': 'KRB5 - Kerberos 5',
-'*\x86H\x86\xf7\x12\x01\x02\x02\x03': 'KRB5 - Kerberos 5 - User to User'
-}
-TypesMech = dict((v,k) for k, v in MechTypes.iteritems())
-
-def asn1encode(data = ''):
- #res = asn1.SEQUENCE(str).encode()
- #import binascii
- #print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
- if 0 <= len(data) <= 0x7F:
- res = pack('B', len(data)) + data
- elif 0x80 <= len(data) <= 0xFF:
- res = pack('BB', 0x81, len(data)) + data
- elif 0x100 <= len(data) <= 0xFFFF:
- res = pack('!BH', 0x82, len(data)) + data
- elif 0x10000 <= len(data) <= 0xffffff:
- res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
- elif 0x1000000 <= len(data) <= 0xffffffff:
- res = pack('!BL', 0x84, len(data)) + data
- else:
- raise Exception('Error in asn1encode')
- return str(res)
-
-def asn1decode(data = ''):
- len1 = unpack('B', data[:1])[0]
- data = data[1:]
- if len1 == 0x81:
- pad = calcsize('B')
- len2 = unpack('B',data[:pad])[0]
- data = data[pad:]
- ans = data[:len2]
- elif len1 == 0x82:
- pad = calcsize('H')
- len2 = unpack('!H', data[:pad])[0]
- data = data[pad:]
- ans = data[:len2]
- elif len1 == 0x83:
- pad = calcsize('B') + calcsize('!H')
- len2, len3 = unpack('!BH', data[:pad])
- data = data[pad:]
- ans = data[:len2 << 16 + len3]
- elif len1 == 0x84:
- pad = calcsize('!L')
- len2 = unpack('!L', data[:pad])[0]
- data = data[pad:]
- ans = data[:len2]
- # 1 byte length, string <= 0x7F
- else:
- pad = 0
- ans = data[:len1]
- return ans, len(ans)+pad+1
-
-class GSSAPI:
-# Generic GSSAPI Header Format
- def __init__(self, data = None):
- self.fields = {}
- self['UUID'] = GSS_API_SPNEGO_UUID
- if data:
- self.fromString(data)
- pass
-
- def __setitem__(self,key,value):
- self.fields[key] = value
-
- def __getitem__(self, key):
- return self.fields[key]
-
- def __delitem__(self, key):
- del self.fields[key]
-
- def __len__(self):
- return len(self.getData())
-
- def __str__(self):
- return len(self.getData())
-
- def fromString(self, data = None):
- # Manual parse of the GSSAPI Header Format
- # It should be something like
- # AID = 0x60 TAG, BER Length
- # OID = 0x06 TAG
- # GSSAPI OID
- # UUID data (BER Encoded)
- # Payload
- next_byte = unpack('B',data[:1])[0]
- if next_byte != ASN1_AID:
- raise Exception('Unknown AID=%x' % next_byte)
- data = data[1:]
- decode_data, total_bytes = asn1decode(data)
- # Now we should have a OID tag
- next_byte = unpack('B',decode_data[:1])[0]
- if next_byte != ASN1_OID:
- raise Exception('OID tag not found %x' % next_byte)
- decode_data = decode_data[1:]
- # Now the OID contents, should be SPNEGO UUID
- uuid, total_bytes = asn1decode(decode_data)
- self['OID'] = uuid
- # the rest should be the data
- self['Payload'] = decode_data[total_bytes:]
- #pass
-
- def dump(self):
- for i in self.fields.keys():
- print("%s: {%r}" % (i,self[i]))
-
- def getData(self):
- ans = pack('B',ASN1_AID)
- ans += asn1encode(
- pack('B',ASN1_OID) +
- asn1encode(self['UUID']) +
- self['Payload'] )
- return ans
-
-class SPNEGO_NegTokenResp:
- # http://tools.ietf.org/html/rfc4178#page-9
- # NegTokenResp ::= SEQUENCE {
- # negState [0] ENUMERATED {
- # accept-completed (0),
- # accept-incomplete (1),
- # reject (2),
- # request-mic (3)
- # } OPTIONAL,
- # -- REQUIRED in the first reply from the target
- # supportedMech [1] MechType OPTIONAL,
- # -- present only in the first reply from the target
- # responseToken [2] OCTET STRING OPTIONAL,
- # mechListMIC [3] OCTET STRING OPTIONAL,
- # ...
- # }
- # This structure is not prepended by a GSS generic header!
- SPNEGO_NEG_TOKEN_RESP = 0xa1
- SPNEGO_NEG_TOKEN_TARG = 0xa0
-
- def __init__(self, data = None):
- self.fields = {}
- if data:
- self.fromString(data)
- pass
-
- def __setitem__(self,key,value):
- self.fields[key] = value
-
- def __getitem__(self, key):
- return self.fields[key]
-
- def __delitem__(self, key):
- del self.fields[key]
-
- def __len__(self):
- return len(self.getData())
-
- def __str__(self):
- return len(self.getData())
-
- def fromString(self, data = 0):
- payload = data
- next_byte = unpack('B', payload[:1])[0]
- if next_byte != SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_RESP:
- raise Exception('NegTokenResp not found %x' % next_byte)
- payload = payload[1:]
- decode_data, total_bytes = asn1decode(payload)
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_SEQUENCE:
- raise Exception('SEQUENCE tag not found %x' % next_byte)
- decode_data = decode_data[1:]
- decode_data, total_bytes = asn1decode(decode_data)
- next_byte = unpack('B',decode_data[:1])[0]
-
- if next_byte != ASN1_MECH_TYPE:
- # MechType not found, could be an AUTH answer
- if next_byte != ASN1_RESPONSE_TOKEN:
- raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
- else:
- decode_data2 = decode_data[1:]
- decode_data2, total_bytes = asn1decode(decode_data2)
- next_byte = unpack('B', decode_data2[:1])[0]
- if next_byte != ASN1_ENUMERATED:
- raise Exception('Enumerated tag not found %x' % next_byte)
- item, total_bytes2 = asn1decode(decode_data)
- self['NegResult'] = item
- decode_data = decode_data[1:]
- decode_data = decode_data[total_bytes:]
-
- # Do we have more data?
- if len(decode_data) == 0:
- return
-
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_SUPPORTED_MECH:
- if next_byte != ASN1_RESPONSE_TOKEN:
- raise Exception('Supported Mech/ResponseToken tag not found %x' % next_byte)
- else:
- decode_data2 = decode_data[1:]
- decode_data2, total_bytes = asn1decode(decode_data2)
- next_byte = unpack('B', decode_data2[:1])[0]
- if next_byte != ASN1_OID:
- raise Exception('OID tag not found %x' % next_byte)
- decode_data2 = decode_data2[1:]
- item, total_bytes2 = asn1decode(decode_data2)
- self['SupportedMech'] = item
-
- decode_data = decode_data[1:]
- decode_data = decode_data[total_bytes:]
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_RESPONSE_TOKEN:
- raise Exception('Response token tag not found %x' % next_byte)
-
- decode_data = decode_data[1:]
- decode_data, total_bytes = asn1decode(decode_data)
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_OCTET_STRING:
- raise Exception('Octet string token tag not found %x' % next_byte)
- decode_data = decode_data[1:]
- decode_data, total_bytes = asn1decode(decode_data)
- self['ResponseToken'] = decode_data
-
- def dump(self):
- for i in self.fields.keys():
- print("%s: {%r}" % (i,self[i]))
-
- def getData(self):
- ans = pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_RESP)
- if 'NegResult' in self.fields and 'SupportedMech' in self.fields:
- # Server resp
- ans += asn1encode(
- pack('B', ASN1_SEQUENCE) +
- asn1encode(
- pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
- asn1encode(
- pack('B',ASN1_ENUMERATED) +
- asn1encode( self['NegResult'] )) +
- pack('B',ASN1_SUPPORTED_MECH) +
- asn1encode(
- pack('B',ASN1_OID) +
- asn1encode(self['SupportedMech'])) +
- pack('B',ASN1_RESPONSE_TOKEN ) +
- asn1encode(
- pack('B', ASN1_OCTET_STRING) + asn1encode(self['ResponseToken']))))
- elif 'NegResult' in self.fields:
- # Server resp
- ans += asn1encode(
- pack('B', ASN1_SEQUENCE) +
- asn1encode(
- pack('B', SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
- asn1encode(
- pack('B',ASN1_ENUMERATED) +
- asn1encode( self['NegResult'] ))))
- else:
- # Client resp
- ans += asn1encode(
- pack('B', ASN1_SEQUENCE) +
- asn1encode(
- pack('B', ASN1_RESPONSE_TOKEN) +
- asn1encode(
- pack('B', ASN1_OCTET_STRING) + asn1encode(self['ResponseToken']))))
- return ans
-
-class SPNEGO_NegTokenInit(GSSAPI):
- # http://tools.ietf.org/html/rfc4178#page-8
- # NegTokeInit :: = SEQUENCE {
- # mechTypes [0] MechTypeList,
- # reqFlags [1] ContextFlags OPTIONAL,
- # mechToken [2] OCTET STRING OPTIONAL,
- # mechListMIC [3] OCTET STRING OPTIONAL,
- # }
- SPNEGO_NEG_TOKEN_INIT = 0xa0
- def fromString(self, data = 0):
- GSSAPI.fromString(self, data)
- payload = self['Payload']
- next_byte = unpack('B', payload[:1])[0]
- if next_byte != SPNEGO_NegTokenInit.SPNEGO_NEG_TOKEN_INIT:
- raise Exception('NegTokenInit not found %x' % next_byte)
- payload = payload[1:]
- decode_data, total_bytes = asn1decode(payload)
- # Now we should have a SEQUENCE Tag
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_SEQUENCE:
- raise Exception('SEQUENCE tag not found %x' % next_byte)
- decode_data = decode_data[1:]
- decode_data, total_bytes2 = asn1decode(decode_data)
- next_byte = unpack('B',decode_data[:1])[0]
- if next_byte != ASN1_MECH_TYPE:
- raise Exception('MechType tag not found %x' % next_byte)
- decode_data = decode_data[1:]
- remaining_data = decode_data
- decode_data, total_bytes3 = asn1decode(decode_data)
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_SEQUENCE:
- raise Exception('SEQUENCE tag not found %x' % next_byte)
- decode_data = decode_data[1:]
- decode_data, total_bytes4 = asn1decode(decode_data)
- # And finally we should have the MechTypes
- self['MechTypes'] = []
- while decode_data:
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte != ASN1_OID:
- # Not a valid OID, there must be something else we won't unpack
- break
- decode_data = decode_data[1:]
- item, total_bytes = asn1decode(decode_data)
- self['MechTypes'].append(item)
- decode_data = decode_data[total_bytes:]
-
- # Do we have MechTokens as well?
- decode_data = remaining_data[total_bytes3:]
- if len(decode_data) > 0:
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte == ASN1_MECH_TOKEN:
- # We have tokens in here!
- decode_data = decode_data[1:]
- decode_data, total_bytes = asn1decode(decode_data)
- next_byte = unpack('B', decode_data[:1])[0]
- if next_byte == ASN1_OCTET_STRING:
- decode_data = decode_data[1:]
- decode_data, total_bytes = asn1decode(decode_data)
- self['MechToken'] = decode_data
-
- def getData(self):
- mechTypes = ''
- for i in self['MechTypes']:
- mechTypes += pack('B', ASN1_OID)
- mechTypes += asn1encode(i)
-
- mechToken = ''
- # Do we have tokens to send?
- if 'MechToken' in self.fields:
- mechToken = pack('B', ASN1_MECH_TOKEN) + asn1encode(
- pack('B', ASN1_OCTET_STRING) + asn1encode(
- self['MechToken']))
-
- ans = pack('B',SPNEGO_NegTokenInit.SPNEGO_NEG_TOKEN_INIT)
- ans += asn1encode(
- pack('B', ASN1_SEQUENCE) +
- asn1encode(
- pack('B', ASN1_MECH_TYPE) +
- asn1encode(
- pack('B', ASN1_SEQUENCE) +
- asn1encode(mechTypes)) + mechToken ))
-
-
- self['Payload'] = ans
- return GSSAPI.getData(self)
diff --git a/tests/python_dependencies/impacket/structure.py b/tests/python_dependencies/impacket/structure.py
deleted file mode 100644
index 68066a61f..000000000
--- a/tests/python_dependencies/impacket/structure.py
+++ /dev/null
@@ -1,744 +0,0 @@
-from __future__ import print_function
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-
-from struct import pack, unpack, calcsize
-
-class Structure:
- """ sublcasses can define commonHdr and/or structure.
- each of them is an tuple of either two: (fieldName, format) or three: (fieldName, ':', class) fields.
- [it can't be a dictionary, because order is important]
-
- where format specifies how the data in the field will be converted to/from bytes (string)
- class is the class to use when unpacking ':' fields.
-
- each field can only contain one value (or an array of values for *)
- i.e. struct.pack('Hl',1,2) is valid, but format specifier 'Hl' is not (you must use 2 dfferent fields)
-
- format specifiers:
- specifiers from module pack can be used with the same format
- see struct.__doc__ (pack/unpack is finally called)
- x [padding byte]
- c [character]
- b [signed byte]
- B [unsigned byte]
- h [signed short]
- H [unsigned short]
- l [signed long]
- L [unsigned long]
- i [signed integer]
- I [unsigned integer]
- q [signed long long (quad)]
- Q [unsigned long long (quad)]
- s [string (array of chars), must be preceded with length in format specifier, padded with zeros]
- p [pascal string (includes byte count), must be preceded with length in format specifier, padded with zeros]
- f [float]
- d [double]
- = [native byte ordering, size and alignment]
- @ [native byte ordering, standard size and alignment]
- ! [network byte ordering]
- < [little endian]
- > [big endian]
-
- usual printf like specifiers can be used (if started with %)
- [not recommeneded, there is no why to unpack this]
-
- %08x will output an 8 bytes hex
- %s will output a string
- %s\\x00 will output a NUL terminated string
- %d%d will output 2 decimal digits (against the very same specification of Structure)
- ...
-
- some additional format specifiers:
- : just copy the bytes from the field into the output string (input may be string, other structure, or anything responding to __str__()) (for unpacking, all what's left is returned)
- z same as :, but adds a NUL byte at the end (asciiz) (for unpacking the first NUL byte is used as terminator) [asciiz string]
- u same as z, but adds two NUL bytes at the end (after padding to an even size with NULs). (same for unpacking) [unicode string]
- w DCE-RPC/NDR string (it's a macro for [ '<L=(len(field)+1)/2','"\\x00\\x00\\x00\\x00','<L=(len(field)+1)/2',':' ]
- ?-field length of field named 'field', formated as specified with ? ('?' may be '!H' for example). The input value overrides the real length
- ?1*?2 array of elements. Each formated as '?2', the number of elements in the array is stored as specified by '?1' (?1 is optional, or can also be a constant (number), for unpacking)
- 'xxxx literal xxxx (field's value doesn't change the output. quotes must not be closed or escaped)
- "xxxx literal xxxx (field's value doesn't change the output. quotes must not be closed or escaped)
- _ will not pack the field. Accepts a third argument, which is an unpack code. See _Test_UnpackCode for an example
- ?=packcode will evaluate packcode in the context of the structure, and pack the result as specified by ?. Unpacking is made plain
- ?&fieldname "Address of field fieldname".
- For packing it will simply pack the id() of fieldname. Or use 0 if fieldname doesn't exists.
- For unpacking, it's used to know weather fieldname has to be unpacked or not, i.e. by adding a & field you turn another field (fieldname) in an optional field.
-
- """
- commonHdr = ()
- structure = ()
- debug = 0
-
- def __init__(self, data = None, alignment = 0):
- if not hasattr(self, 'alignment'):
- self.alignment = alignment
-
- self.fields = {}
- self.rawData = data
- if data is not None:
- self.fromString(data)
- else:
- self.data = None
-
- @classmethod
- def fromFile(self, file):
- answer = self()
- answer.fromString(file.read(len(answer)))
- return answer
-
- def setAlignment(self, alignment):
- self.alignment = alignment
-
- def setData(self, data):
- self.data = data
-
- def packField(self, fieldName, format = None):
- if self.debug:
- print("packField( %s | %s )" % (fieldName, format))
-
- if format is None:
- format = self.formatForField(fieldName)
-
- if fieldName in self.fields:
- ans = self.pack(format, self.fields[fieldName], field = fieldName)
- else:
- ans = self.pack(format, None, field = fieldName)
-
- if self.debug:
- print("\tanswer %r" % ans)
-
- return ans
-
- def getData(self):
- if self.data is not None:
- return self.data
- data = ''
- for field in self.commonHdr+self.structure:
- try:
- data += self.packField(field[0], field[1])
- except Exception as e:
- if field[0] in self.fields:
- e.args += ("When packing field '%s | %s | %r' in %s" % (field[0], field[1], self[field[0]], self.__class__),)
- else:
- e.args += ("When packing field '%s | %s' in %s" % (field[0], field[1], self.__class__),)
- raise
- if self.alignment:
- if len(data) % self.alignment:
- data += ('\x00'*self.alignment)[:-(len(data) % self.alignment)]
-
- #if len(data) % self.alignment: data += ('\x00'*self.alignment)[:-(len(data) % self.alignment)]
- return data
-
- def fromString(self, data):
- self.rawData = data
- for field in self.commonHdr+self.structure:
- if self.debug:
- print("fromString( %s | %s | %r )" % (field[0], field[1], data))
- size = self.calcUnpackSize(field[1], data, field[0])
- if self.debug:
- print(" size = %d" % size)
- dataClassOrCode = str
- if len(field) > 2:
- dataClassOrCode = field[2]
- try:
- self[field[0]] = self.unpack(field[1], data[:size], dataClassOrCode = dataClassOrCode, field = field[0])
- except Exception as e:
- e.args += ("When unpacking field '%s | %s | %r[:%d]'" % (field[0], field[1], data, size),)
- raise
-
- size = self.calcPackSize(field[1], self[field[0]], field[0])
- if self.alignment and size % self.alignment:
- size += self.alignment - (size % self.alignment)
- data = data[size:]
-
- return self
-
- def __setitem__(self, key, value):
- self.fields[key] = value
- self.data = None # force recompute
-
- def __getitem__(self, key):
- return self.fields[key]
-
- def __delitem__(self, key):
- del self.fields[key]
-
- def __str__(self):
- return self.getData()
-
- def __len__(self):
- # XXX: improve
- return len(self.getData())
-
- def pack(self, format, data, field = None):
- if self.debug:
- print(" pack( %s | %r | %s)" % (format, data, field))
-
- if field:
- addressField = self.findAddressFieldFor(field)
- if (addressField is not None) and (data is None):
- return ''
-
- # void specifier
- if format[:1] == '_':
- return ''
-
- # quote specifier
- if format[:1] == "'" or format[:1] == '"':
- return format[1:]
-
- # code specifier
- two = format.split('=')
- if len(two) >= 2:
- try:
- return self.pack(two[0], data)
- except:
- fields = {'self':self}
- fields.update(self.fields)
- return self.pack(two[0], eval(two[1], {}, fields))
-
- # address specifier
- two = format.split('&')
- if len(two) == 2:
- try:
- return self.pack(two[0], data)
- except:
- if (two[1] in self.fields) and (self[two[1]] is not None):
- return self.pack(two[0], id(self[two[1]]) & ((1<<(calcsize(two[0])*8))-1) )
- else:
- return self.pack(two[0], 0)
-
- # length specifier
- two = format.split('-')
- if len(two) == 2:
- try:
- return self.pack(two[0],data)
- except:
- return self.pack(two[0], self.calcPackFieldSize(two[1]))
-
- # array specifier
- two = format.split('*')
- if len(two) == 2:
- answer = ''
- for each in data:
- answer += self.pack(two[1], each)
- if two[0]:
- if two[0].isdigit():
- if int(two[0]) != len(data):
- raise Exception("Array field has a constant size, and it doesn't match the actual value")
- else:
- return self.pack(two[0], len(data))+answer
- return answer
-
- # "printf" string specifier
- if format[:1] == '%':
- # format string like specifier
- return format % data
-
- # asciiz specifier
- if format[:1] == 'z':
- return str(data)+'\0'
-
- # unicode specifier
- if format[:1] == 'u':
- return str(data)+'\0\0' + (len(data) & 1 and '\0' or '')
-
- # DCE-RPC/NDR string specifier
- if format[:1] == 'w':
- if len(data) == 0:
- data = '\0\0'
- elif len(data) % 2:
- data += '\0'
- l = pack('<L', len(data)/2)
- return '%s\0\0\0\0%s%s' % (l,l,data)
-
- if data is None:
- raise Exception("Trying to pack None")
-
- # literal specifier
- if format[:1] == ':':
- return str(data)
-
- # struct like specifier
- return pack(format, data)
-
- def unpack(self, format, data, dataClassOrCode = str, field = None):
- if self.debug:
- print(" unpack( %s | %r )" % (format, data))
-
- if field:
- addressField = self.findAddressFieldFor(field)
- if addressField is not None:
- if not self[addressField]:
- return
-
- # void specifier
- if format[:1] == '_':
- if dataClassOrCode != str:
- fields = {'self':self, 'inputDataLeft':data}
- fields.update(self.fields)
- return eval(dataClassOrCode, {}, fields)
- else:
- return None
-
- # quote specifier
- if format[:1] == "'" or format[:1] == '"':
- answer = format[1:]
- if answer != data:
- raise Exception("Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer))
- return answer
-
- # address specifier
- two = format.split('&')
- if len(two) == 2:
- return self.unpack(two[0],data)
-
- # code specifier
- two = format.split('=')
- if len(two) >= 2:
- return self.unpack(two[0],data)
-
- # length specifier
- two = format.split('-')
- if len(two) == 2:
- return self.unpack(two[0],data)
-
- # array specifier
- two = format.split('*')
- if len(two) == 2:
- answer = []
- sofar = 0
- if two[0].isdigit():
- number = int(two[0])
- elif two[0]:
- sofar += self.calcUnpackSize(two[0], data)
- number = self.unpack(two[0], data[:sofar])
- else:
- number = -1
-
- while number and sofar < len(data):
- nsofar = sofar + self.calcUnpackSize(two[1],data[sofar:])
- answer.append(self.unpack(two[1], data[sofar:nsofar], dataClassOrCode))
- number -= 1
- sofar = nsofar
- return answer
-
- # "printf" string specifier
- if format[:1] == '%':
- # format string like specifier
- return format % data
-
- # asciiz specifier
- if format == 'z':
- if data[-1] != '\x00':
- raise Exception("%s 'z' field is not NUL terminated: %r" % (field, data))
- return data[:-1] # remove trailing NUL
-
- # unicode specifier
- if format == 'u':
- if data[-2:] != '\x00\x00':
- raise Exception("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
- return data[:-2] # remove trailing NUL
-
- # DCE-RPC/NDR string specifier
- if format == 'w':
- l = unpack('<L', data[:4])[0]
- return data[12:12+l*2]
-
- # literal specifier
- if format == ':':
- return dataClassOrCode(data)
-
- # struct like specifier
- return unpack(format, data)[0]
-
- def calcPackSize(self, format, data, field = None):
-# # print " calcPackSize %s:%r" % (format, data)
- if field:
- addressField = self.findAddressFieldFor(field)
- if addressField is not None:
- if not self[addressField]:
- return 0
-
- # void specifier
- if format[:1] == '_':
- return 0
-
- # quote specifier
- if format[:1] == "'" or format[:1] == '"':
- return len(format)-1
-
- # address specifier
- two = format.split('&')
- if len(two) == 2:
- return self.calcPackSize(two[0], data)
-
- # code specifier
- two = format.split('=')
- if len(two) >= 2:
- return self.calcPackSize(two[0], data)
-
- # length specifier
- two = format.split('-')
- if len(two) == 2:
- return self.calcPackSize(two[0], data)
-
- # array specifier
- two = format.split('*')
- if len(two) == 2:
- answer = 0
- if two[0].isdigit():
- if int(two[0]) != len(data):
- raise Exception("Array field has a constant size, and it doesn't match the actual value")
- elif two[0]:
- answer += self.calcPackSize(two[0], len(data))
-
- for each in data:
- answer += self.calcPackSize(two[1], each)
- return answer
-
- # "printf" string specifier
- if format[:1] == '%':
- # format string like specifier
- return len(format % data)
-
- # asciiz specifier
- if format[:1] == 'z':
- return len(data)+1
-
- # asciiz specifier
- if format[:1] == 'u':
- l = len(data)
- return l + (l & 1 and 3 or 2)
-
- # DCE-RPC/NDR string specifier
- if format[:1] == 'w':
- l = len(data)
- return 12+l+l % 2
-
- # literal specifier
- if format[:1] == ':':
- return len(data)
-
- # struct like specifier
- return calcsize(format)
-
- def calcUnpackSize(self, format, data, field = None):
- if self.debug:
- print(" calcUnpackSize( %s | %s | %r)" % (field, format, data))
-
- # void specifier
- if format[:1] == '_':
- return 0
-
- addressField = self.findAddressFieldFor(field)
- if addressField is not None:
- if not self[addressField]:
- return 0
-
- try:
- lengthField = self.findLengthFieldFor(field)
- return self[lengthField]
- except:
- pass
-
- # XXX: Try to match to actual values, raise if no match
-
- # quote specifier
- if format[:1] == "'" or format[:1] == '"':
- return len(format)-1
-
- # address specifier
- two = format.split('&')
- if len(two) == 2:
- return self.calcUnpackSize(two[0], data)
-
- # code specifier
- two = format.split('=')
- if len(two) >= 2:
- return self.calcUnpackSize(two[0], data)
-
- # length specifier
- two = format.split('-')
- if len(two) == 2:
- return self.calcUnpackSize(two[0], data)
-
- # array specifier
- two = format.split('*')
- if len(two) == 2:
- answer = 0
- if two[0]:
- if two[0].isdigit():
- number = int(two[0])
- else:
- answer += self.calcUnpackSize(two[0], data)
- number = self.unpack(two[0], data[:answer])
-
- while number:
- number -= 1
- answer += self.calcUnpackSize(two[1], data[answer:])
- else:
- while answer < len(data):
- answer += self.calcUnpackSize(two[1], data[answer:])
- return answer
-
- # "printf" string specifier
- if format[:1] == '%':
- raise Exception("Can't guess the size of a printf like specifier for unpacking")
-
- # asciiz specifier
- if format[:1] == 'z':
- return data.index('\x00')+1
-
- # asciiz specifier
- if format[:1] == 'u':
- l = data.index('\x00\x00')
- return l + (l & 1 and 3 or 2)
-
- # DCE-RPC/NDR string specifier
- if format[:1] == 'w':
- l = unpack('<L', data[:4])[0]
- return 12+l*2
-
- # literal specifier
- if format[:1] == ':':
- return len(data)
-
- # struct like specifier
- return calcsize(format)
-
- def calcPackFieldSize(self, fieldName, format = None):
- if format is None:
- format = self.formatForField(fieldName)
-
- return self.calcPackSize(format, self[fieldName])
-
- def formatForField(self, fieldName):
- for field in self.commonHdr+self.structure:
- if field[0] == fieldName:
- return field[1]
- raise Exception("Field %s not found" % fieldName)
-
- def findAddressFieldFor(self, fieldName):
- descriptor = '&%s' % fieldName
- l = len(descriptor)
- for field in self.commonHdr+self.structure:
- if field[1][-l:] == descriptor:
- return field[0]
- return None
-
- def findLengthFieldFor(self, fieldName):
- descriptor = '-%s' % fieldName
- l = len(descriptor)
- for field in self.commonHdr+self.structure:
- if field[1][-l:] == descriptor:
- return field[0]
- return None
-
- def zeroValue(self, format):
- two = format.split('*')
- if len(two) == 2:
- if two[0].isdigit():
- return (self.zeroValue(two[1]),)*int(two[0])
-
- if not format.find('*') == -1: return ()
- if 's' in format: return ''
- if format in ['z',':','u']: return ''
- if format == 'w': return '\x00\x00'
-
- return 0
-
- def clear(self):
- for field in self.commonHdr + self.structure:
- self[field[0]] = self.zeroValue(field[1])
-
- def dump(self, msg = None, indent = 0):
- if msg is None: msg = self.__class__.__name__
- ind = ' '*indent
- print("\n%s" % msg)
- fixedFields = []
- for field in self.commonHdr+self.structure:
- i = field[0]
- if i in self.fields:
- fixedFields.append(i)
- if isinstance(self[i], Structure):
- self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
- print("%s}" % ind)
- else:
- print("%s%s: {%r}" % (ind,i,self[i]))
- # Do we have remaining fields not defined in the structures? let's
- # print them
- remainingFields = list(set(self.fields) - set(fixedFields))
- for i in remainingFields:
- if isinstance(self[i], Structure):
- self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
- print("%s}" % ind)
- else:
- print("%s%s: {%r}" % (ind,i,self[i]))
-
-
-class _StructureTest:
- alignment = 0
- def create(self,data = None):
- if data is not None:
- return self.theClass(data, alignment = self.alignment)
- else:
- return self.theClass(alignment = self.alignment)
-
- def run(self):
- print()
- print("-"*70)
- testName = self.__class__.__name__
- print("starting test: %s....." % testName)
- a = self.create()
- self.populate(a)
- a.dump("packing.....")
- a_str = str(a)
- print("packed: %r" % a_str)
- print("unpacking.....")
- b = self.create(a_str)
- b.dump("unpacked.....")
- print("repacking.....")
- b_str = str(b)
- if b_str != a_str:
- print("ERROR: original packed and repacked don't match")
- print("packed: %r" % b_str)
-
-class _Test_simple(_StructureTest):
- class theClass(Structure):
- commonHdr = ()
- structure = (
- ('int1', '!L'),
- ('len1','!L-z1'),
- ('arr1','B*<L'),
- ('z1', 'z'),
- ('u1','u'),
- ('', '"COCA'),
- ('len2','!H-:1'),
- ('', '"COCA'),
- (':1', ':'),
- ('int3','>L'),
- ('code1','>L=len(arr1)*2+0x1000'),
- )
-
- def populate(self, a):
- a['default'] = 'hola'
- a['int1'] = 0x3131
- a['int3'] = 0x45444342
- a['z1'] = 'hola'
- a['u1'] = 'hola'.encode('utf_16_le')
- a[':1'] = ':1234:'
- a['arr1'] = (0x12341234,0x88990077,0x41414141)
- # a['len1'] = 0x42424242
-
-class _Test_fixedLength(_Test_simple):
- def populate(self, a):
- _Test_simple.populate(self, a)
- a['len1'] = 0x42424242
-
-class _Test_simple_aligned4(_Test_simple):
- alignment = 4
-
-class _Test_nested(_StructureTest):
- class theClass(Structure):
- class _Inner(Structure):
- structure = (('data', 'z'),)
-
- structure = (
- ('nest1', ':', _Inner),
- ('nest2', ':', _Inner),
- ('int', '<L'),
- )
-
- def populate(self, a):
- a['nest1'] = _Test_nested.theClass._Inner()
- a['nest2'] = _Test_nested.theClass._Inner()
- a['nest1']['data'] = 'hola manola'
- a['nest2']['data'] = 'chau loco'
- a['int'] = 0x12345678
-
-class _Test_Optional(_StructureTest):
- class theClass(Structure):
- structure = (
- ('pName','<L&Name'),
- ('pList','<L&List'),
- ('Name','w'),
- ('List','<H*<L'),
- )
-
- def populate(self, a):
- a['Name'] = 'Optional test'
- a['List'] = (1,2,3,4)
-
-class _Test_Optional_sparse(_Test_Optional):
- def populate(self, a):
- _Test_Optional.populate(self, a)
- del a['Name']
-
-class _Test_AsciiZArray(_StructureTest):
- class theClass(Structure):
- structure = (
- ('head','<L'),
- ('array','B*z'),
- ('tail','<L'),
- )
-
- def populate(self, a):
- a['head'] = 0x1234
- a['tail'] = 0xabcd
- a['array'] = ('hola','manola','te traje')
-
-class _Test_UnpackCode(_StructureTest):
- class theClass(Structure):
- structure = (
- ('leni','<L=len(uno)*2'),
- ('cuchi','_-uno','leni/2'),
- ('uno',':'),
- ('dos',':'),
- )
-
- def populate(self, a):
- a['uno'] = 'soy un loco!'
- a['dos'] = 'que haces fiera'
-
-class _Test_AAA(_StructureTest):
- class theClass(Structure):
- commonHdr = ()
- structure = (
- ('iv', '!L=((init_vector & 0xFFFFFF) << 8) | ((pad & 0x3f) << 2) | (keyid & 3)'),
- ('init_vector', '_','(iv >> 8)'),
- ('pad', '_','((iv >>2) & 0x3F)'),
- ('keyid', '_','( iv & 0x03 )'),
- ('dataLen', '_-data', 'len(inputDataLeft)-4'),
- ('data',':'),
- ('icv','>L'),
- )
-
- def populate(self, a):
- a['init_vector']=0x01020304
- #a['pad']=int('01010101',2)
- a['pad']=int('010101',2)
- a['keyid']=0x07
- a['data']="\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9"
- a['icv'] = 0x05060708
- #a['iv'] = 0x01020304
-
-if __name__ == '__main__':
- _Test_simple().run()
-
- try:
- _Test_fixedLength().run()
- except:
- print("cannot repack because length is bogus")
-
- _Test_simple_aligned4().run()
- _Test_nested().run()
- _Test_Optional().run()
- _Test_Optional_sparse().run()
- _Test_AsciiZArray().run()
- _Test_UnpackCode().run()
- _Test_AAA().run()
diff --git a/tests/python_dependencies/impacket/uuid.py b/tests/python_dependencies/impacket/uuid.py
deleted file mode 100644
index 750eba459..000000000
--- a/tests/python_dependencies/impacket/uuid.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-# Description:
-# Generate UUID compliant with http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt.
-# A different, much simpler (not necessarily better) algorithm is used.
-#
-# Author:
-# Javier Kohen (jkohen)
-#
-
-import re
-
-from random import randrange
-from struct import pack, unpack
-
-try:
- long # Python 2
-except NameError:
- long = int # Python 3
-
-def generate():
- # UHm... crappy Python has an maximum integer of 2**31-1.
- top = (1<<31)-1
- return pack("IIII", randrange(top), randrange(top), randrange(top), randrange(top))
-
-def bin_to_string(uuid):
- uuid1, uuid2, uuid3 = unpack('<LHH', uuid[:8])
- uuid4, uuid5, uuid6 = unpack('>HHL', uuid[8:16])
- return '%08X-%04X-%04X-%04X-%04X%08X' % (uuid1, uuid2, uuid3, uuid4, uuid5, uuid6)
-
-def string_to_bin(uuid):
- matches = re.match('([\dA-Fa-f]{8})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})([\dA-Fa-f]{8})', uuid)
- (uuid1, uuid2, uuid3, uuid4, uuid5, uuid6) = map(lambda x: long(x, 16), matches.groups())
- uuid = pack('<LHH', uuid1, uuid2, uuid3)
- uuid += pack('>HHL', uuid4, uuid5, uuid6)
- return uuid
-
-def stringver_to_bin(s):
- (maj,min) = s.split('.')
- return pack('<H',int(maj)) + pack('<H',int(min))
-
-def uuidtup_to_bin(tup):
- if len(tup) != 2: return
- return string_to_bin(tup[0]) + stringver_to_bin(tup[1])
-
-def bin_to_uuidtup(bin):
- assert len(bin) == 20
- uuidstr = bin_to_string(bin[:16])
- maj, min = unpack("<HH", bin[16:])
- return uuidstr, "%d.%d" % (maj, min)
-
-#input: string
-#output: tuple (uuid,version)
-#if version is not found in the input string "1.0" is returned
-#example:
-# "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
-# "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
-# "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
-# "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0')
-def string_to_uuidtup(s):
- g = re.search("([A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}).*?([0-9]{1,5}\.[0-9]{1,5})",s+" 1.0")
- if g:
- (u,v) = g.groups()
- return (u,v)
- return
-
-def uuidtup_to_string(tup):
- uuid, (maj, min) = tup
- return "%s v%d.%d" % (uuid, maj, min)
diff --git a/tests/python_dependencies/impacket/version.py b/tests/python_dependencies/impacket/version.py
deleted file mode 100644
index badd4a8a4..000000000
--- a/tests/python_dependencies/impacket/version.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (c) 2003-2016 CORE Security Technologies
-#
-# This software is provided under under a slightly modified version
-# of the Apache Software License. See the accompanying LICENSE file
-# for more information.
-#
-
-VER_MAJOR = "0"
-VER_MINOR = "9.15"
-
-BANNER = "Impacket v%s.%s - Copyright 2002-2016 Core Security Technologies\n" % (VER_MAJOR,VER_MINOR)
-
diff --git a/tests/rtspserver.pl b/tests/rtspserver.pl
index 02d2f9f90..315526a93 100755
--- a/tests/rtspserver.pl
+++ b/tests/rtspserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -34,12 +34,17 @@ use serverhelp qw(
server_logfilename
);
+use sshhelp qw(
+ exe_ext
+ );
+
my $verbose = 0; # set to 1 for debugging
my $port = 8990; # just a default
my $ipvnum = 4; # default IP version of rtsp server
my $idnum = 1; # default rtsp server instance number
my $proto = 'rtsp'; # protocol the rtsp server speaks
my $pidfile; # rtsp server pid file
+my $portfile;
my $logfile; # rtsp server log file
my $srcdir;
@@ -54,6 +59,12 @@ while(@ARGV) {
shift @ARGV;
}
}
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
elsif($ARGV[0] eq '--logfile') {
if($ARGV[1]) {
$logfile = $ARGV[1];
@@ -103,7 +114,9 @@ if(!$logfile) {
$logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
}
-$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+$flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
-exec("server/rtspd $flags");
+exec("server/rtspd".exe_ext('SRV')." $flags");
diff --git a/tests/runtests.1 b/tests/runtests.1
index 8491de37f..cc06d2833 100644
--- a/tests/runtests.1
+++ b/tests/runtests.1
@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
-.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@@ -20,35 +20,42 @@
.\" *
.\" **************************************************************************
.\"
-.TH runtests.pl 1 "May 05, 2017" "Curl 7.67.0" "runtests"
+.TH runtests.pl 1 "August 05, 2020" "Curl 7.73.0" "runtests"
.SH NAME
runtests.pl \- run one or more test cases
.SH SYNOPSIS
-.B runtests.pl [options] [test number] [!test number] [key word] [!key word]
+.B runtests.pl [options] [tests]
.SH DESCRIPTION
\fIruntests.pl\fP runs one, several or all the existing test cases in curl's
test suite. It is often called from the root Makefile of the curl package with
\&'make test'.
-.SH "TEST NUMBER"
-If no test case number is given, all existing tests that the script can find
-will be considered for running. You can specify single test cases to run,
-space-separated, like "1 3 5 7 11", and you can specify a range like "45 to
-67". You can also specify only the tests you don't want to run by listing
-the numbers with a leading exclamation point, like "!66".
-.P
-It is also possible to specify tests to skip based on a key word describing
-the test. These are specified with a leading exclamation point and the
-key word or phrase, like "!HTTP NTLM auth". Likewise, tests to run can
-be specified simply by specifying the unadorned key words, like "FTPS".
-Remember that the exclamation marks and spaces will need to be quoted somehow
-when entered at many command shells.
+.SH "TESTS"
+Specify which test(s) to run by specifying test numbers or keywords.
+
+If no test number or keyword is given, all existing tests that the script can
+find will be considered for running. You can specify single test cases to run
+by specifying test numbers space-separated, like "1 3 5 7 11", and you can
+specify a range of tests like "45 to 67".
+
+Specify tests to not run with a leading exclamation point, like "!66", which
+runs all available tests except number 66.
+
+Prefix a test number with a tilde (~) to still run it, but ignore the results.
+
+It is also possible to specify tests based on a keyword describing the test(s)
+to run, like "FTPS". The keywords are strings used in the individual tests.
+
+You can also specify keywords with a leading exclamation point and the keyword
+or phrase, like "!HTTP NTLM auth" to run all tests \fBexcept\fP those using
+this keyword. Remember that the exclamation marks and spaces will need to be
+quoted somehow when entered at many command shells.
+
+Prefix a keyword with a tilde (~) to still run it, but ignore the results.
.SH OPTIONS
.IP "-a"
Continue running the rest of the test cases even if one test fails. By
default, the test script stops as soon as an error is detected.
-.IP "-bN"
-Use N as the base TCP/UDP port number on which to start the test servers.
.IP "-c <curl>"
Provide a path to a custom curl binary to run the tests with. Default is the
curl executable in the build tree.
@@ -79,12 +86,34 @@ people checking the failures and the reasons for them might not have physical
access to the machine and logs.
.IP "-R"
Run the tests in a scrambled, or randomized, order instead of sequentially.
+
+The random seed initially set for this is fixed per month and can be set with
+\fI--seed\fP.
.IP "-r"
Display run time statistics. (Requires Perl Time::HiRes module)
.IP "-rf"
Display full run time statistics. (Requires Perl Time::HiRes module)
+.IP "--repeat=[num]"
+This will repeat the given set of test numbers this many times. If no test
+numbers are given, it will repeat ALL tests this many times. It iteratively
+adds the new sequence at the end of the initially given one.
+
+If \fB-R\fP is also used, the scrambling is done after the repeats have
+extended the test sequence.
.IP "-s"
Shorter output. Speaks less than default.
+.IP "--seed=[num]"
+When using \fI--shallow\fP or \fI-R\rP that random certain aspects of the
+behavior, this option can set the initial seed. If not set, the random seed
+will be set based on the currently set local year and month and the first line
+of the "curl -V" output.
+.IP "--shallow=[num]"
+Used together with \fB-t\fP. This limits the number of tests to fail in
+torture mode to no more than 'num' per test case. If this reduces the amount,
+the script will randomly discard entries to fail until the amount is 'num'.
+
+The random seed initially set for this is fixed per month and can be set with
+\fI--seed\fP.
.IP "-t[num]"
Selects a \fBtorture\fP test for the given tests. This makes runtests.pl first
run the tests once and count the number of memory allocations made. It then
diff --git a/tests/runtests.pl b/tests/runtests.pl
index 63bd2da68..84feb73e0 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -56,8 +56,14 @@
# These should be the only variables that might be needed to get edited:
BEGIN {
- push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
- push(@INC, ".");
+ # Define srcdir to the location of the tests source directory. This is
+ # usually set by the Makefile, but for out-of-tree builds with direct
+ # invocation of runtests.pl, it may not be set.
+ if(!defined $ENV{'srcdir'}) {
+ use File::Basename;
+ $ENV{'srcdir'} = dirname(__FILE__);
+ }
+ push(@INC, $ENV{'srcdir'});
# run time statistics needs Time::HiRes
eval {
no warnings "all";
@@ -69,6 +75,8 @@ BEGIN {
use strict;
use warnings;
use Cwd;
+use Digest::MD5 qw(md5);
+use MIME::Base64;
# Subs imported from serverhelp module
use serverhelp qw(
@@ -77,6 +85,7 @@ use serverhelp qw(
servername_str
servername_canon
server_pidfilename
+ server_portfilename
server_logfilename
);
@@ -110,48 +119,55 @@ use pathhelp;
require "getpart.pm"; # array functions
require "valgrind.pm"; # valgrind report parser
require "ftp.pm";
+require "azure.pm";
+require "appveyor.pm";
my $HOSTIP="127.0.0.1"; # address on which the test server listens
my $HOST6IP="[::1]"; # address on which the test server listens
my $CLIENTIP="127.0.0.1"; # address which curl uses for incoming connections
my $CLIENT6IP="[::1]"; # address which curl uses for incoming connections
-my $base = 8990; # base port number
-
-my $HTTPPORT; # HTTP server port
-my $HTTP6PORT; # HTTP IPv6 server port
-my $HTTPSPORT; # HTTPS (stunnel) server port
-my $FTPPORT; # FTP server port
-my $FTP2PORT; # FTP server 2 port
-my $FTPSPORT; # FTPS (stunnel) server port
-my $FTP6PORT; # FTP IPv6 server port
-my $TFTPPORT; # TFTP
-my $TFTP6PORT; # TFTP
-my $SSHPORT; # SCP/SFTP
-my $SOCKSPORT; # SOCKS4/5 port
-my $POP3PORT; # POP3
-my $POP36PORT; # POP3 IPv6 server port
-my $IMAPPORT; # IMAP
-my $IMAP6PORT; # IMAP IPv6 server port
-my $SMTPPORT; # SMTP
-my $SMTP6PORT; # SMTP IPv6 server port
-my $RTSPPORT; # RTSP
-my $RTSP6PORT; # RTSP IPv6 server port
-my $GOPHERPORT; # Gopher
-my $GOPHER6PORT; # Gopher IPv6 server port
-my $HTTPTLSPORT; # HTTP TLS (non-stunnel) server port
-my $HTTPTLS6PORT; # HTTP TLS (non-stunnel) IPv6 server port
-my $HTTPPROXYPORT; # HTTP proxy port, when using CONNECT
+my $noport="[not running]";
+
+my $NOLISTENPORT=47; # port number we use for a local non-listening service
+my $MQTTPORT=$noport; # MQTT server port
+my $HTTPPORT=$noport; # HTTP server port
+my $HTTP6PORT=$noport; # HTTP IPv6 server port
+my $HTTPSPORT=$noport; # HTTPS (stunnel) server port
+my $HTTPSPROXYPORT = $noport; # HTTPS-proxy (stunnel) port
+my $FTPPORT=$noport; # FTP server port
+my $FTPSPORT=$noport; # FTPS (stunnel) server port
+my $FTP6PORT=$noport; # FTP IPv6 server port
+my $TFTPPORT=$noport; # TFTP
+my $TFTP6PORT=$noport; # TFTP
+my $SSHPORT=$noport; # SCP/SFTP
+my $SOCKSPORT=$noport; # SOCKS4/5 port
+my $POP3PORT=$noport; # POP3
+my $POP36PORT=$noport; # POP3 IPv6 server port
+my $IMAPPORT=$noport; # IMAP
+my $IMAP6PORT=$noport; # IMAP IPv6 server port
+my $SMTPPORT=$noport; # SMTP
+my $SMTP6PORT=$noport; # SMTP IPv6 server port
+my $RTSPPORT=$noport; # RTSP
+my $RTSP6PORT=$noport; # RTSP IPv6 server port
+my $GOPHERPORT=$noport; # Gopher
+my $GOPHER6PORT=$noport; # Gopher IPv6 server port
+my $HTTPTLSPORT=$noport; # HTTP TLS (non-stunnel) server port
+my $HTTPTLS6PORT=$noport; # HTTP TLS (non-stunnel) IPv6 server port
+my $HTTPPROXYPORT=$noport; # HTTP proxy port, when using CONNECT
+my $HTTP2PORT=$noport; # HTTP/2 server port
+my $DICTPORT=$noport; # DICT server port
+my $SMBPORT=$noport; # SMB server port
+my $SMBSPORT=$noport; # SMBS server port
+my $TELNETPORT=$noport; # TELNET server port with negotiation
my $HTTPUNIXPATH; # HTTP server Unix domain socket path
-my $HTTP2PORT; # HTTP/2 server port
-my $DICTPORT; # DICT server port
-my $SMBPORT; # SMB server port
-my $SMBSPORT; # SMBS server port
-my $NEGTELNETPORT; # TELNET server port with negotiation
+
+my $SSHSRVMD5 = "[uninitialized]"; # MD5 of ssh server public key
+my $VERSION; # curl's reported version number
my $srcdir = $ENV{'srcdir'} || '.';
-my $CURL="../src/curl".exe_ext(); # what curl executable to run on the tests
-my $VCURL=$CURL; # what curl binary to use to verify the servers with
+my $CURL="../src/curl".exe_ext('TOOL'); # what curl executable to run on the tests
+my $VCURL="curl"; # what curl binary to use to verify the servers with
# VCURL is handy to set to the system one when the one you
# just built hangs or crashes and thus prevent verification
my $DBGCURL=$CURL; #"../src/.libs/curl"; # alternative for debugging
@@ -163,8 +179,8 @@ my $UNITDIR="./unit";
my $SERVERIN="$LOGDIR/server.input"; # what curl sent the server
my $SERVER2IN="$LOGDIR/server2.input"; # what curl sent the second server
my $PROXYIN="$LOGDIR/proxy.input"; # what curl sent the proxy
-my $CURLLOG="$LOGDIR/curl.log"; # all command lines run
-my $FTPDCMD="$LOGDIR/ftpserver.cmd"; # copy ftp server instructions here
+my $CURLLOG="commands.log"; # all command lines run
+my $FTPDCMD="$LOGDIR/ftpserver.cmd"; # copy server instructions here
my $SERVERLOGS_LOCK="$LOGDIR/serverlogs.lock"; # server logs advisor read lock
my $CURLCONFIG="../curl-config"; # curl-config from current build
@@ -186,6 +202,7 @@ my $server_response_maxtime=13;
my $debug_build=0; # built debug enabled (--enable-debug)
my $has_memory_tracking=0; # built with memory tracking (--enable-curldebug)
my $libtool;
+my $repeat = 0;
# name of the file that the memory debugging creates:
my $memdump="$LOGDIR/memdump";
@@ -206,6 +223,9 @@ my $valgrind_tool;
my $gdb = checktestcmd("gdb");
my $httptlssrv = find_httptlssrv();
+my $uname_release = `uname -r`;
+my $is_wsl = $uname_release =~ /Microsoft$/;
+
my $has_ssl; # set if libcurl is built with SSL support
my $has_largefile; # set if libcurl is built with large file support
my $has_idn; # set if libcurl is built with IDN support
@@ -218,6 +238,7 @@ my $has_ipv6; # set if libcurl is built with IPv6 support
my $has_unix; # set if libcurl is built with Unix sockets support
my $has_libz; # set if libcurl is built with libz support
my $has_brotli; # set if libcurl is built with brotli support
+my $has_zstd; # set if libcurl is built with zstd support
my $has_getrlimit; # set if system has getrlimit()
my $has_ntlm; # set if libcurl is built with NTLM support
my $has_ntlm_wb; # set if libcurl is built with NTLM delegation to winbind
@@ -229,6 +250,7 @@ my $has_charconv; # set if libcurl is built with CharConv support
my $has_tls_srp; # set if libcurl is built with TLS-SRP support
my $has_metalink; # set if curl is built with Metalink support
my $has_http2; # set if libcurl is built with HTTP2 support
+my $has_httpsproxy; # set if libcurl is built with HTTPS-proxy support
my $has_crypto; # set if libcurl is built with cryptographic support
my $has_cares; # set if built with c-ares
my $has_threadedres;# set if built with threaded resolver
@@ -237,6 +259,8 @@ my $has_altsvc; # set if libcurl is built with alt-svc support
my $has_ldpreload; # set if curl is built for systems supporting LD_PRELOAD
my $has_multissl; # set if curl is build with MultiSSL support
my $has_manual; # set if curl is built with built-in manual
+my $has_win32; # set if curl is built for Windows
+my $has_mingw; # set if curl is built with MinGW (as opposed to MinGW-w64)
# this version is decided by the particular nghttp2 library that is being used
my $h2cver = "h2c";
@@ -245,9 +269,8 @@ my $has_openssl; # built with a lib using an OpenSSL-like API
my $has_gnutls; # built with GnuTLS
my $has_nss; # built with NSS
my $has_wolfssl; # built with wolfSSL
-my $has_polarssl; # built with polarssl
-my $has_winssl; # built with WinSSL (Secure Channel aka Schannel)
-my $has_darwinssl; # built with DarwinSSL (Secure Transport)
+my $has_schannel; # built with Schannel
+my $has_sectransp; # built with Secure Transport
my $has_boringssl; # built with BoringSSL
my $has_libressl; # built with libressl
my $has_mbedtls; # built with mbedTLS
@@ -261,15 +284,16 @@ my $resolver; # name of the resolver backend (for human presentation)
my $has_textaware; # set if running on a system that has a text mode concept
# on files. Windows for example
-
my @protocols; # array of lowercase supported protocol servers
my $skipped=0; # number of tests skipped; reported in main loop
my %skipped; # skipped{reason}=counter, reasons for skip
my @teststat; # teststat[testnum]=reason, reasons for skip
my %disabled_keywords; # key words of tests to skip
+my %ignored_keywords; # key words of tests to ignore results
my %enabled_keywords; # key words of tests to run
my %disabled; # disabled test cases
+my %ignored; # ignored results of test cases
my $sshdid; # for socks server, ssh daemon version id
my $sshdvernum; # for socks server, ssh daemon version number
@@ -291,7 +315,8 @@ my %timevrfyend; # timestamp for each test result verification end
my $testnumcheck; # test number, set in singletest sub.
my %oldenv;
-my %feature; # array of enabled features
+my %feature; # array of enabled features
+my %keywords; # array of keywords from the test spec
#######################################################################
# variables that command line options may set
@@ -312,19 +337,31 @@ my $run_event_based; # run curl with --test-event to test the event API
my %run; # running server
my %doesntrun; # servers that don't work, identified by pidfile
my %serverpidfile;# all server pid file names, identified by server id
+my %serverportfile;# all server port file names, identified by server id
my %runcert; # cert file currently in use by an ssl running server
# torture test variables
my $torture;
my $tortnum;
my $tortalloc;
+my $shallow;
+my $randseed = 0;
+
+# Azure Pipelines specific variables
+my $AZURE_RUN_ID = 0;
+my $AZURE_RESULT_ID = 0;
#######################################################################
# logmsg is our general message logging subroutine.
#
sub logmsg {
for(@_) {
- print "$_";
+ my $line = $_;
+ if ($is_wsl) {
+ # use \r\n for WSL shell
+ $line =~ s/\r?\n$/\r\n/g;
+ }
+ print "$line";
}
}
@@ -374,7 +411,8 @@ delete $ENV{'SSL_CERT_PATH'} if($ENV{'SSL_CERT_PATH'});
delete $ENV{'CURL_CA_BUNDLE'} if($ENV{'CURL_CA_BUNDLE'});
#######################################################################
-# Load serverpidfile hash with pidfile names for all possible servers.
+# Load serverpidfile and serverportfile hashes with file names for all
+# possible servers.
#
sub init_serverpidfile_hash {
for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp', 'http/2')) {
@@ -384,17 +422,21 @@ sub init_serverpidfile_hash {
my $serv = servername_id("$proto$ssl", $ipvnum, $idnum);
my $pidf = server_pidfilename("$proto$ssl", $ipvnum, $idnum);
$serverpidfile{$serv} = $pidf;
+ my $portf = server_portfilename("$proto$ssl", $ipvnum, $idnum);
+ $serverportfile{$serv} = $portf;
}
}
}
}
for my $proto (('tftp', 'sftp', 'socks', 'ssh', 'rtsp', 'gopher', 'httptls',
- 'dict', 'smb', 'smbs', 'telnet')) {
+ 'dict', 'smb', 'smbs', 'telnet', 'mqtt')) {
for my $ipvnum ((4, 6)) {
for my $idnum ((1, 2)) {
my $serv = servername_id($proto, $ipvnum, $idnum);
my $pidf = server_pidfilename($proto, $ipvnum, $idnum);
$serverpidfile{$serv} = $pidf;
+ my $portf = server_portfilename($proto, $ipvnum, $idnum);
+ $serverportfile{$serv} = $portf;
}
}
}
@@ -403,6 +445,8 @@ sub init_serverpidfile_hash {
my $serv = servername_id("$proto$ssl", "unix", 1);
my $pidf = server_pidfilename("$proto$ssl", "unix", 1);
$serverpidfile{$serv} = $pidf;
+ my $portf = server_portfilename("$proto$ssl", "unix", 1);
+ $serverportfile{$serv} = $portf;
}
}
}
@@ -416,7 +460,7 @@ sub checkdied {
if((not defined $pid) || $pid <= 0) {
return 0;
}
- my $rc = waitpid($pid, &WNOHANG);
+ my $rc = pidwait($pid, &WNOHANG);
return ($rc == $pid)?1:0;
}
@@ -460,7 +504,7 @@ sub startnew {
logmsg "startnew: failed to write fake $pidfile with pid=$child\n";
}
# could/should do a while connect fails sleep a bit and loop
- sleep $timeout;
+ portable_sleep($timeout);
if (checkdied($child)) {
logmsg "startnew: child process has failed to start\n" if($verbose);
return (-1,-1);
@@ -508,7 +552,7 @@ sub checkcmd {
my ($cmd)=@_;
my @paths=(split(":", $ENV{'PATH'}), "/usr/sbin", "/usr/local/sbin",
"/sbin", "/usr/bin", "/usr/local/bin",
- "./libtest/.libs", "./libtest");
+ "$LIBDIR/.libs", "$LIBDIR");
for(@paths) {
if( -x "$_/$cmd" && ! -d "$_/$cmd") {
# executable bit but not a directory!
@@ -522,7 +566,11 @@ sub checkcmd {
#
my $disttests;
sub get_disttests {
- my @dist = `cd data && make show`;
+ my $makeCmd = 'make';
+ if(-f "../CMakeCache.txt") {
+ $makeCmd = 'cmake --build ../.. --target';
+ }
+ my @dist = `cd data && $makeCmd show`;
$disttests = join("", @dist);
}
@@ -590,13 +638,34 @@ sub torture {
return 0;
}
- logmsg " $count functions to make fail\n";
+ my @ttests = (1 .. $count);
+ if($shallow && ($shallow < $count)) {
+ my $discard = scalar(@ttests) - $shallow;
+ my $percent = sprintf("%.2f%%", $shallow * 100 / scalar(@ttests));;
+ logmsg " $count functions found, but only fail $shallow ($percent)\n";
+ while($discard) {
+ my $rm;
+ do {
+ # find a test to discard
+ $rm = rand(scalar(@ttests));
+ } while(!$ttests[$rm]);
+ $ttests[$rm] = undef;
+ $discard--;
+ }
+ }
+ else {
+ logmsg " $count functions to make fail\n";
+ }
- for ( 1 .. $count ) {
+ for (@ttests) {
my $limit = $_;
my $fail;
my $dumped_core;
+ if(!defined($limit)) {
+ # --shallow can undefine them
+ next;
+ }
if($tortalloc && ($tortalloc != $limit)) {
next;
}
@@ -704,6 +773,7 @@ sub torture {
#
sub stopserver {
my ($server, $pidlist) = @_;
+
#
# kill sockfilter processes for pingpong relative server
#
@@ -733,6 +803,12 @@ sub stopserver {
# given a ssh server, also kill socks piggybacking one
push @killservers, "socks${2}";
}
+ if($server eq "http") {
+ # since the http2 server is a proxy that needs to know about the
+ # dynamic http port it too needs to get restarted when the http server
+ # is killed
+ push @killservers, "http/2";
+ }
push @killservers, $server;
#
# kill given pids and server relative ones clearing them in %run hash
@@ -1355,7 +1431,7 @@ sub responsiveserver {
# start the http2 server
#
sub runhttp2server {
- my ($verbose, $port) = @_;
+ my ($verbose) = @_;
my $server;
my $srvrname;
my $pidfile;
@@ -1373,7 +1449,7 @@ sub runhttp2server {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1387,26 +1463,36 @@ sub runhttp2server {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
- $flags .= "--port $HTTP2PORT ";
$flags .= "--connect $HOSTIP:$HTTPPORT ";
$flags .= $verbose_flag if($debugprotocol);
- my $cmd = "$exe $flags";
- my ($http2pid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+ my ($http2pid, $pid2);
+ my $port = 23113;
+ for(1 .. 10) {
+ $port += int(rand(900));
+ my $aflags = "--port $port $flags";
- if($http2pid <= 0 || !pidexists($http2pid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
+ my $cmd = "$exe $aflags";
+ ($http2pid, $pid2) = startnew($cmd, $pidfile, 15, 0);
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $http2pid\n";
+ if($http2pid <= 0 || !pidexists($http2pid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
+ $http2pid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $http2pid port $port\n";
+ }
+ last;
}
- return ($http2pid, $pid2);
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$http2pid);
+
+ return ($http2pid, $pid2, $port);
}
#######################################################################
@@ -1442,10 +1528,11 @@ sub runhttpserver {
$server = servername_id($proto, $ipvnum, $idnum);
$pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1462,11 +1549,12 @@ sub runhttpserver {
$flags .= "--connect $HOSTIP " if($alt eq "proxy");
$flags .= $verbose_flag if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--portfile $portfile ";
$flags .= "--id $idnum " if($idnum > 1);
if($ipvnum eq "unix") {
$flags .= "--unix-socket '$port_or_path' ";
} else {
- $flags .= "--ipv$ipvnum --port $port_or_path ";
+ $flags .= "--ipv$ipvnum --port 0 ";
}
$flags .= "--srcdir \"$srcdir\"";
@@ -1479,7 +1567,13 @@ sub runhttpserver {
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
+ }
+
+ # where is it?
+ my $port;
+ if(!$port_or_path) {
+ $port = $port_or_path = pidfromfile($portfile);
}
# Server is up. Verify that we can speak to it.
@@ -1490,24 +1584,22 @@ sub runhttpserver {
stopserver($server, "$httppid $pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
$pid2 = $pid3;
if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $httppid\n";
+ logmsg "RUN: $srvrname server is on PID $httppid port $port\n";
}
- sleep(1);
-
- return ($httppid, $pid2);
+ return ($httppid, $pid2, $port);
}
#######################################################################
# start the https stunnel based server
#
sub runhttpsserver {
- my ($verbose, $ipv6, $certfile) = @_;
+ my ($verbose, $ipv6, $proxy, $certfile) = @_;
my $proto = 'https';
my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
@@ -1518,8 +1610,13 @@ sub runhttpsserver {
my $logfile;
my $flags = "";
+ if($proxy eq "proxy") {
+ # the https-proxy runs as https2
+ $idnum = 2;
+ }
+
if(!$stunnel) {
- return (0,0);
+ return (0, 0, 0);
}
$server = servername_id($proto, $ipvnum, $idnum);
@@ -1528,7 +1625,7 @@ sub runhttpsserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1549,41 +1646,43 @@ sub runhttpsserver {
$flags .= "--ipv$ipvnum --proto $proto ";
$flags .= "--certfile \"$certfile\" " if($certfile ne 'stunnel.pem');
$flags .= "--stunnel \"$stunnel\" --srcdir \"$srcdir\" ";
- $flags .= "--connect $HTTPPORT --accept $HTTPSPORT";
-
- my $cmd = "$perl $srcdir/secureserver.pl $flags";
- my ($httpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
-
- if($httpspid <= 0 || !pidexists($httpspid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return(0,0);
+ if(!$proxy) {
+ $flags .= "--connect $HTTPPORT";
}
-
- # Server is up. Verify that we can speak to it.
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $HTTPSPORT);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$httpspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
+ else {
+ # for HTTPS-proxy we connect to the HTTP proxy
+ $flags .= "--connect $HTTPPROXYPORT";
+ }
+
+ my $pid2;
+ my $pid3;
+ my $httpspid;
+ my $port = 24512; # start attempt
+ for (1 .. 10) {
+ $port += int(rand(600));
+ my $options = "$flags --accept $port";
+
+ my $cmd = "$perl $srcdir/secureserver.pl $options";
+ ($httpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($httpspid <= 0 || !pidexists($httpspid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $httpspid = $pid2 = 0;
+ next;
+ }
+ # we have a server!
+ if($verbose) {
+ logmsg "RUN: $srvrname server is PID $httpspid port $port\n";
+ }
+ last;
}
- # Here pid3 is actually the pid returned by the unsecure-http server.
-
$runcert{$server} = $certfile;
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$httpspid);
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $httpspid\n";
- }
-
- sleep(1);
-
- return ($httpspid, $pid2);
+ return ($httpspid, $pid2, $port);
}
#######################################################################
@@ -1592,7 +1691,6 @@ sub runhttpsserver {
sub runhttptlsserver {
my ($verbose, $ipv6) = @_;
my $proto = "httptls";
- my $port = ($ipv6 && ($ipv6 =~ /6$/)) ? $HTTPTLS6PORT : $HTTPTLSPORT;
my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
my $idnum = 1;
@@ -1612,7 +1710,7 @@ sub runhttptlsserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1627,42 +1725,36 @@ sub runhttptlsserver {
$flags .= "--http ";
$flags .= "--debug 1 " if($debugprotocol);
- $flags .= "--port $port ";
$flags .= "--priority NORMAL:+SRP ";
$flags .= "--srppasswd $srcdir/certs/srp-verifier-db ";
$flags .= "--srppasswdconf $srcdir/certs/srp-verifier-conf";
- my $cmd = "$httptlssrv $flags > $logfile 2>&1";
- my ($httptlspid, $pid2) = startnew($cmd, $pidfile, 10, 1); # fake pidfile
-
- if($httptlspid <= 0 || !pidexists($httptlspid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
-
- # Server is up. Verify that we can speak to it. PID is from fake pidfile
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$httptlspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
- $pid2 = $pid3;
+ my $port = 24367;
+ my ($httptlspid, $pid2);
+ for (1 .. 10) {
+ $port += int(rand(800));
+ my $allflags = "--port $port $flags";
+
+ my $cmd = "$httptlssrv $allflags > $logfile 2>&1";
+ ($httptlspid, $pid2) = startnew($cmd, $pidfile, 10, 1);
+
+ if($httptlspid <= 0 || !pidexists($httptlspid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $httptlspid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $httptlspid\n";
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $httptlspid port $port\n";
+ }
+ last;
}
-
- sleep(1);
-
- return ($httptlspid, $pid2);
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$httptlspid);
+ return ($httptlspid, $pid2, $port);
}
#######################################################################
@@ -1680,31 +1772,10 @@ sub runpingpongserver {
my $logfile;
my $flags = "";
- if($proto eq "ftp") {
- $port = ($idnum>1)?$FTP2PORT:$FTPPORT;
-
- if($ipvnum==6) {
- # if IPv6, use a different setup
- $port = $FTP6PORT;
- }
- }
- elsif($proto eq "pop3") {
- $port = ($ipvnum==6) ? $POP36PORT : $POP3PORT;
- }
- elsif($proto eq "imap") {
- $port = ($ipvnum==6) ? $IMAP6PORT : $IMAPPORT;
- }
- elsif($proto eq "smtp") {
- $port = ($ipvnum==6) ? $SMTP6PORT : $SMTPPORT;
- }
- else {
- print STDERR "Unsupported protocol $proto!!\n";
- return 0;
- }
-
$server = servername_id($proto, $ipvnum, $idnum);
$pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
@@ -1723,9 +1794,10 @@ sub runpingpongserver {
$flags .= "--verbose " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--portfile \"$portfile\" ";
$flags .= "--srcdir \"$srcdir\" --proto $proto ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--ipv$ipvnum --port $port --addr \"$ip\"";
+ $flags .= "--ipv$ipvnum --port 0 --addr \"$ip\"";
my $cmd = "$perl $srcdir/ftpserver.pl $flags";
my ($ftppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -1739,6 +1811,11 @@ sub runpingpongserver {
return (0,0);
}
+ # where is it?
+ $port = pidfromfile($portfile);
+
+ logmsg "PINGPONG runs on port $port ($portfile)\n" if($verbose);
+
# Server is up. Verify that we can speak to it.
my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
if(!$pid3) {
@@ -1752,11 +1829,46 @@ sub runpingpongserver {
$pid2 = $pid3;
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $ftppid\n";
- }
+ logmsg "RUN: $srvrname server is PID $ftppid port $port\n" if($verbose);
- sleep(1);
+ # Assign the correct port variable!
+ if($proto eq "ftp") {
+ if($ipvnum == 6) {
+ # if IPv6, use a different setup
+ $FTP6PORT = $port;
+ }
+ else {
+ $FTPPORT = $port;
+ }
+ }
+ elsif($proto eq "pop3") {
+ if($ipvnum == 6) {
+ $POP36PORT = $port;
+ }
+ else {
+ $POP3PORT = $port;
+ }
+ }
+ elsif($proto eq "imap") {
+ if($ipvnum == 6) {
+ $IMAP6PORT = $port;
+ }
+ else {
+ $IMAPPORT = $port;
+ }
+ }
+ elsif($proto eq "smtp") {
+ if($ipvnum == 6) {
+ $SMTP6PORT = $port;
+ }
+ else {
+ $SMTPPORT = $port;
+ }
+ }
+ else {
+ print STDERR "Unsupported protocol $proto!!\n";
+ return (0,0);
+ }
return ($pid2, $ftppid);
}
@@ -1786,7 +1898,7 @@ sub runftpsserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1807,41 +1919,39 @@ sub runftpsserver {
$flags .= "--ipv$ipvnum --proto $proto ";
$flags .= "--certfile \"$certfile\" " if($certfile ne 'stunnel.pem');
$flags .= "--stunnel \"$stunnel\" --srcdir \"$srcdir\" ";
- $flags .= "--connect $FTPPORT --accept $FTPSPORT";
-
- my $cmd = "$perl $srcdir/secureserver.pl $flags";
- my ($ftpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
-
- if($ftpspid <= 0 || !pidexists($ftpspid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return(0,0);
- }
-
- # Server is up. Verify that we can speak to it.
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $FTPSPORT);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$ftpspid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
- # Here pid3 is actually the pid returned by the unsecure-ftp server.
+ $flags .= "--connect $FTPPORT";
+
+ my $port = 26713;
+ my $pid2;
+ my $pid3;
+ my $ftpspid;
+ for (1 .. 10) {
+ $port += int(rand(700));
+ my $options = "$flags --accept $port";
+ my $cmd = "$perl $srcdir/secureserver.pl $options";
+ ($ftpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($ftpspid <= 0 || !pidexists($ftpspid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $ftpspid = $pid2 = 0;
+ next;
+ }
- $runcert{$server} = $certfile;
+ $doesntrun{$pidfile} = 0;
+ $runcert{$server} = $certfile;
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $ftpspid\n";
+ if($verbose) {
+ logmsg "RUN: $srvrname server is PID $ftpspid port $port\n";
+ }
+ last;
}
- sleep(1);
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$ftpspid);
- return ($ftpspid, $pid2);
+ return ($ftpspid, $pid2, $port);
}
#######################################################################
@@ -1849,7 +1959,6 @@ sub runftpsserver {
#
sub runtftpserver {
my ($id, $verbose, $ipv6) = @_;
- my $port = $TFTPPORT;
my $ip = $HOSTIP;
my $proto = 'tftp';
my $ipvnum = 4;
@@ -1863,17 +1972,17 @@ sub runtftpserver {
if($ipv6) {
# if IPv6, use a different setup
$ipvnum = 6;
- $port = $TFTP6PORT;
$ip = $HOST6IP;
}
$server = servername_id($proto, $ipvnum, $idnum);
$pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1887,9 +1996,11 @@ sub runtftpserver {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
$flags .= "--verbose " if($debugprotocol);
- $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
+ $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
my $cmd = "$perl $srcdir/tftpserver.pl $flags";
my ($tftppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -1900,9 +2011,11 @@ sub runtftpserver {
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
+ my $port = pidfromfile($portfile);
+
# Server is up. Verify that we can speak to it.
my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
if(!$pid3) {
@@ -1911,17 +2024,15 @@ sub runtftpserver {
stopserver($server, "$tftppid $pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
$pid2 = $pid3;
if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $tftppid\n";
+ logmsg "RUN: $srvrname server on PID $tftppid port $port\n";
}
- sleep(1);
-
- return ($pid2, $tftppid);
+ return ($pid2, $tftppid, $port);
}
@@ -1930,7 +2041,6 @@ sub runtftpserver {
#
sub runrtspserver {
my ($verbose, $ipv6) = @_;
- my $port = $RTSPPORT;
my $ip = $HOSTIP;
my $proto = 'rtsp';
my $ipvnum = 4;
@@ -1944,17 +2054,17 @@ sub runrtspserver {
if($ipv6) {
# if IPv6, use a different setup
$ipvnum = 6;
- $port = $RTSP6PORT;
$ip = $HOST6IP;
}
$server = servername_id($proto, $ipvnum, $idnum);
$pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -1968,9 +2078,11 @@ sub runrtspserver {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
$flags .= "--verbose " if($debugprotocol);
- $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
+ $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
my $cmd = "$perl $srcdir/rtspserver.pl $flags";
my ($rtsppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@@ -1981,9 +2093,11 @@ sub runrtspserver {
stopserver($server, "$pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
+ my $port = pidfromfile($portfile);
+
# Server is up. Verify that we can speak to it.
my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
if(!$pid3) {
@@ -1992,17 +2106,15 @@ sub runrtspserver {
stopserver($server, "$rtsppid $pid2");
displaylogs($testnumcheck);
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
$pid2 = $pid3;
if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $rtsppid\n";
+ logmsg "RUN: $srvrname server PID $rtsppid port $port\n";
}
- sleep(1);
-
- return ($rtsppid, $pid2);
+ return ($rtsppid, $pid2, $port);
}
@@ -2012,7 +2124,6 @@ sub runrtspserver {
sub runsshserver {
my ($id, $verbose, $ipv6) = @_;
my $ip=$HOSTIP;
- my $port = $SSHPORT;
my $proto = 'ssh';
my $ipvnum = 4;
my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
@@ -2020,7 +2131,7 @@ sub runsshserver {
my $srvrname;
my $pidfile;
my $logfile;
- my $flags = "";
+ my $port = 20000; # no lower port
$server = servername_id($proto, $ipvnum, $idnum);
@@ -2028,7 +2139,12 @@ sub runsshserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
+ }
+
+ my $sshd = find_sshd();
+ if($sshd) {
+ ($sshdid,$sshdvernum,$sshdverstr,$sshderror) = sshversioninfo($sshd);
}
my $pid = processexists($pidfile);
@@ -2041,67 +2157,153 @@ sub runsshserver {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+ my $flags = "";
$flags .= "--verbose " if($verbose);
$flags .= "--debugprotocol " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
$flags .= "--ipv$ipvnum --addr \"$ip\" ";
- $flags .= "--sshport $port ";
$flags .= "--user \"$USER\"";
- my $cmd = "$perl $srcdir/sshserver.pl $flags";
- my ($sshpid, $pid2) = startnew($cmd, $pidfile, 60, 0);
+ my $sshpid;
+ my $pid2;
+
+ my $wport = 0,
+ my @tports;
+ for(1 .. 10) {
+
+ # sshd doesn't have a way to pick an unused random port number, so
+ # instead we iterate over possible port numbers to use until we find
+ # one that works
+ $port += int(rand(500));
+ push @tports, $port;
+
+ my $options = "$flags --sshport $port";
+
+ my $cmd = "$perl $srcdir/sshserver.pl $options";
+ ($sshpid, $pid2) = startnew($cmd, $pidfile, 60, 0);
+
+ # on loaded systems sshserver start up can take longer than the
+ # timeout passed to startnew, when this happens startnew completes
+ # without being able to read the pidfile and consequently returns a
+ # zero pid2 above.
+ if($sshpid <= 0 || !pidexists($sshpid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
+ $sshpid = $pid2 = 0;
+ next;
+ }
- # on loaded systems sshserver start up can take longer than the timeout
- # passed to startnew, when this happens startnew completes without being
- # able to read the pidfile and consequently returns a zero pid2 above.
+ # once it is known that the ssh server is alive, sftp server
+ # verification is performed actually connecting to it, authenticating
+ # and performing a very simple remote command. This verification is
+ # tried only one time.
+
+ $sshdlog = server_logfilename($LOGDIR, 'ssh', $ipvnum, $idnum);
+ $sftplog = server_logfilename($LOGDIR, 'sftp', $ipvnum, $idnum);
+
+ if(verifysftp('sftp', $ipvnum, $idnum, $ip, $port) < 1) {
+ logmsg "RUN: SFTP server failed verification\n";
+ # failed to talk to it properly. Kill the server and return failure
+ display_sftplog();
+ display_sftpconfig();
+ display_sshdlog();
+ display_sshdconfig();
+ stopserver($server, "$sshpid $pid2");
+ $doesntrun{$pidfile} = 1;
+ $sshpid = $pid2 = 0;
+ next;
+ }
+ # we're happy, no need to loop anymore!
+ $doesntrun{$pidfile} = 0;
+ $wport = $port;
+ last;
+ }
+ logmsg "RUN: failed to start the $srvrname server on $port\n" if(!$sshpid);
- if($sshpid <= 0 || !pidexists($sshpid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- $doesntrun{$pidfile} = 1;
- return (0,0);
+ if(!$wport) {
+ logmsg "RUN: couldn't start $srvrname. Tried these ports:";
+ logmsg "RUN: ".join(", ", @tports);
+ return (0,0,0);
+ }
+
+ my $hstpubmd5f = "curl_host_rsa_key.pub_md5";
+ if(!open(PUBMD5FILE, "<", $hstpubmd5f) ||
+ (read(PUBMD5FILE, $SSHSRVMD5, 32) != 32) ||
+ !close(PUBMD5FILE) ||
+ ($SSHSRVMD5 !~ /^[a-f0-9]{32}$/i))
+ {
+ my $msg = "Fatal: $srvrname pubkey md5 missing : \"$hstpubmd5f\" : $!";
+ logmsg "$msg\n";
+ stopservers($verbose);
+ die $msg;
}
- # ssh server verification allows some extra time for the server to start up
- # and gives us the opportunity of recovering the pid from the pidfile, when
- # this verification succeeds the recovered pid is assigned to pid2.
+ logmsg "RUN: $srvrname on PID $pid2 port $wport\n" if($verbose);
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to fetch server pid. Kill the server and return failure
- stopserver($server, "$sshpid $pid2");
- $doesntrun{$pidfile} = 1;
+ return ($pid2, $sshpid, $wport);
+}
+
+#######################################################################
+# Start the socks server
+#
+sub runmqttserver {
+ my ($id, $verbose, $ipv6) = @_;
+ my $ip=$HOSTIP;
+ my $port = $MQTTPORT;
+ my $proto = 'mqtt';
+ my $ipvnum = 4;
+ my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $portfile;
+ my $logfile;
+ my $flags = "";
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+ $pidfile = $serverpidfile{$server};
+ $portfile = $serverportfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
return (0,0);
}
- $pid2 = $pid3;
- # once it is known that the ssh server is alive, sftp server verification
- # is performed actually connecting to it, authenticating and performing a
- # very simple remote command. This verification is tried only one time.
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
- $sshdlog = server_logfilename($LOGDIR, 'ssh', $ipvnum, $idnum);
- $sftplog = server_logfilename($LOGDIR, 'sftp', $ipvnum, $idnum);
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
- if(verifysftp('sftp', $ipvnum, $idnum, $ip, $port) < 1) {
- logmsg "RUN: SFTP server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- display_sftplog();
- display_sftpconfig();
- display_sshdlog();
- display_sshdconfig();
- stopserver($server, "$sshpid $pid2");
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ # start our MQTT server - on a random port!
+ my $cmd="server/mqttd".exe_ext('SRV').
+ " --port 0 ".
+ " --pidfile $pidfile".
+ " --portfile $portfile".
+ " --config $FTPDCMD";
+ my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
+
+ if($sockspid <= 0 || !pidexists($sockspid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
$doesntrun{$pidfile} = 1;
return (0,0);
}
+ $MQTTPORT = pidfromfile($portfile);
+
if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $pid2\n";
+ logmsg "RUN: $srvrname server is now running PID $pid2 on PORT $MQTTPORT\n";
}
- return ($pid2, $sshpid);
+ return ($pid2, $sockspid);
}
#######################################################################
@@ -2110,7 +2312,6 @@ sub runsshserver {
sub runsocksserver {
my ($id, $verbose, $ipv6) = @_;
my $ip=$HOSTIP;
- my $port = $SOCKSPORT;
my $proto = 'socks';
my $ipvnum = 4;
my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
@@ -2123,10 +2324,11 @@ sub runsocksserver {
$server = servername_id($proto, $ipvnum, $idnum);
$pidfile = $serverpidfile{$server};
+ my $portfile = $serverportfile{$server};
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2140,9 +2342,10 @@ sub runsocksserver {
$logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
# start our socks server, get commands from the FTP cmd file
- my $cmd="server/socksd".
- " --port $port ".
+ my $cmd="server/socksd".exe_ext('SRV').
+ " --port 0 ".
" --pidfile $pidfile".
+ " --portfile $portfile".
" --backend $HOSTIP".
" --config $FTPDCMD";
my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
@@ -2152,21 +2355,23 @@ sub runsocksserver {
logmsg "RUN: failed to start the $srvrname server\n";
stopserver($server, "$pid2");
$doesntrun{$pidfile} = 1;
- return (0,0);
+ return (0, 0, 0);
}
+ my $port = pidfromfile($portfile);
+
if($verbose) {
logmsg "RUN: $srvrname server is now running PID $pid2\n";
}
- return ($pid2, $sockspid);
+ return ($pid2, $sockspid, $port);
}
#######################################################################
# start the dict server
#
sub rundictserver {
- my ($verbose, $alt, $port) = @_;
+ my ($verbose, $alt) = @_;
my $proto = "dict";
my $ip = $HOSTIP;
my $ipvnum = 4;
@@ -2187,7 +2392,7 @@ sub rundictserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2203,47 +2408,42 @@ sub rundictserver {
$flags .= "--verbose 1 " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--port $port --srcdir \"$srcdir\" ";
+ $flags .= "--srcdir \"$srcdir\" ";
$flags .= "--host $HOSTIP";
- my $cmd = "$srcdir/dictserver.py $flags";
- my ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
-
- if($dictpid <= 0 || !pidexists($dictpid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
-
- # Server is up. Verify that we can speak to it.
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$dictpid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
- $pid2 = $pid3;
+ my $port = 29000;
+ my ($dictpid, $pid2);
+ for(1 .. 10) {
+ $port += int(rand(900));
+ my $aflags = "--port $port $flags";
+ my $cmd = "$srcdir/dictserver.py $aflags";
+ ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($dictpid <= 0 || !pidexists($dictpid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $dictpid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $dictpid\n";
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $dictpid port $port\n";
+ }
+ last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$dictpid);
- sleep(1);
-
- return ($dictpid, $pid2);
+ return ($dictpid, $pid2, $port);
}
#######################################################################
# start the SMB server
#
sub runsmbserver {
- my ($verbose, $alt, $port) = @_;
+ my ($verbose, $alt) = @_;
my $proto = "smb";
my $ip = $HOSTIP;
my $ipvnum = 4;
@@ -2264,7 +2464,7 @@ sub runsmbserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2280,47 +2480,42 @@ sub runsmbserver {
$flags .= "--verbose 1 " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--port $port --srcdir \"$srcdir\" ";
+ $flags .= "--srcdir \"$srcdir\" ";
$flags .= "--host $HOSTIP";
- my $cmd = "$srcdir/smbserver.py $flags";
- my ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
-
- if($smbpid <= 0 || !pidexists($smbpid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
-
- # Server is up. Verify that we can speak to it.
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$smbpid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
- $pid2 = $pid3;
+ my ($smbpid, $pid2);
+ my $port = 31923;
+ for(1 .. 10) {
+ $port += int(rand(760));
+ my $aflags = "--port $port $flags";
+ my $cmd = "$srcdir/smbserver.py $aflags";
+ ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($smbpid <= 0 || !pidexists($smbpid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $smbpid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $smbpid\n";
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $smbpid port $port\n";
+ }
+ last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$smbpid);
- sleep(1);
-
- return ($smbpid, $pid2);
+ return ($smbpid, $pid2, $port);
}
#######################################################################
# start the telnet server
#
sub runnegtelnetserver {
- my ($verbose, $alt, $port) = @_;
+ my ($verbose, $alt) = @_;
my $proto = "telnet";
my $ip = $HOSTIP;
my $ipvnum = 4;
@@ -2341,7 +2536,7 @@ sub runnegtelnetserver {
# don't retry if the server doesn't work
if ($doesntrun{$pidfile}) {
- return (0,0);
+ return (0, 0, 0);
}
my $pid = processexists($pidfile);
@@ -2357,39 +2552,34 @@ sub runnegtelnetserver {
$flags .= "--verbose 1 " if($debugprotocol);
$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
$flags .= "--id $idnum " if($idnum > 1);
- $flags .= "--port $port --srcdir \"$srcdir\"";
-
- my $cmd = "$srcdir/negtelnetserver.py $flags";
- my ($ntelpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
-
- if($ntelpid <= 0 || !pidexists($ntelpid)) {
- # it is NOT alive
- logmsg "RUN: failed to start the $srvrname server\n";
- stopserver($server, "$pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
+ $flags .= "--srcdir \"$srcdir\"";
- # Server is up. Verify that we can speak to it.
- my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
- if(!$pid3) {
- logmsg "RUN: $srvrname server failed verification\n";
- # failed to talk to it properly. Kill the server and return failure
- stopserver($server, "$ntelpid $pid2");
- displaylogs($testnumcheck);
- $doesntrun{$pidfile} = 1;
- return (0,0);
- }
- $pid2 = $pid3;
+ my ($ntelpid, $pid2);
+ my $port = 32000;
+ for(1 .. 10) {
+ $port += int(rand(800));
+ my $aflags = "--port $port $flags";
+ my $cmd = "$srcdir/negtelnetserver.py $aflags";
+ ($ntelpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($ntelpid <= 0 || !pidexists($ntelpid)) {
+ # it is NOT alive
+ stopserver($server, "$pid2");
+ displaylogs($testnumcheck);
+ $doesntrun{$pidfile} = 1;
+ $ntelpid = $pid2 = 0;
+ next;
+ }
+ $doesntrun{$pidfile} = 0;
- if($verbose) {
- logmsg "RUN: $srvrname server is now running PID $ntelpid\n";
+ if($verbose) {
+ logmsg "RUN: $srvrname server PID $ntelpid port $port\n";
+ }
+ last;
}
+ logmsg "RUN: failed to start the $srvrname server\n" if(!$ntelpid);
- sleep(1);
-
- return ($ntelpid, $pid2);
+ return ($ntelpid, $pid2, $port);
}
@@ -2431,7 +2621,7 @@ sub responsive_pingpong_server {
my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
if($proto eq "ftp") {
- $port = ($idnum>1)?$FTP2PORT:$FTPPORT;
+ $port = $FTPPORT;
if($ipvnum==6) {
# if IPv6, use a different setup
@@ -2524,15 +2714,21 @@ sub cleardir {
my $file;
# Get all files
- opendir(DIR, $dir) ||
+ opendir(my $dh, $dir) ||
return 0; # can't open dir
- while($file = readdir(DIR)) {
- if($file !~ /^\./) {
- unlink("$dir/$file");
+ while($file = readdir($dh)) {
+ if(($file !~ /^(\.|\.\.)\z/)) {
+ if(-d "$dir/$file") {
+ cleardir("$dir/$file");
+ rmdir("$dir/$file");
+ }
+ else {
+ unlink("$dir/$file");
+ }
$count++;
}
}
- closedir DIR;
+ closedir $dh;
return $count;
}
@@ -2565,41 +2761,43 @@ sub compare {
}
sub setupfeatures {
- $feature{"SSL"} = $has_ssl;
- $feature{"MultiSSL"} = $has_multissl;
- $feature{"SSLpinning"} = $has_sslpinning;
- $feature{"OpenSSL"} = $has_openssl;
- $feature{"GnuTLS"} = $has_gnutls;
- $feature{"NSS"} = $has_nss;
- $feature{"WinSSL"} = $has_winssl;
- $feature{"Schannel"} = $has_winssl; # alias
- $feature{"sectransp"} = $has_darwinssl;
- $feature{"DarwinSSL"} = $has_darwinssl; # alias
- $feature{"ld_preload"} = ($has_ldpreload && !$debug_build);
- $feature{"unittest"} = $debug_build;
+ $feature{"alt-svc"} = $has_altsvc;
+ $feature{"brotli"} = $has_brotli;
+ $feature{"crypto"} = $has_crypto;
$feature{"debug"} = $debug_build;
- $feature{"TrackMemory"} = $has_memory_tracking;
- $feature{"large_file"} = $has_largefile;
+ $feature{"getrlimit"} = $has_getrlimit;
+ $feature{"GnuTLS"} = $has_gnutls;
+ $feature{"GSS-API"} = $has_gssapi;
+ $feature{"http/2"} = $has_http2;
+ $feature{"https-proxy"} = $has_httpsproxy;
$feature{"idn"} = $has_idn;
$feature{"ipv6"} = $has_ipv6;
+ $feature{"Kerberos"} = $has_kerberos;
+ $feature{"large_file"} = $has_largefile;
+ $feature{"ld_preload"} = ($has_ldpreload && !$debug_build);
$feature{"libz"} = $has_libz;
- $feature{"brotli"} = $has_brotli;
+ $feature{"manual"} = $has_manual;
+ $feature{"Metalink"} = $has_metalink;
+ $feature{"MinGW"} = $has_mingw;
+ $feature{"MultiSSL"} = $has_multissl;
+ $feature{"NSS"} = $has_nss;
$feature{"NTLM"} = $has_ntlm;
$feature{"NTLM_WB"} = $has_ntlm_wb;
- $feature{"SSPI"} = $has_sspi;
- $feature{"GSS-API"} = $has_gssapi;
- $feature{"Kerberos"} = $has_kerberos;
+ $feature{"OpenSSL"} = $has_openssl || $has_libressl || $has_boringssl;
+ $feature{"PSL"} = $has_psl;
+ $feature{"Schannel"} = $has_schannel;
+ $feature{"sectransp"} = $has_sectransp;
$feature{"SPNEGO"} = $has_spnego;
- $feature{"getrlimit"} = $has_getrlimit;
- $feature{"crypto"} = $has_crypto;
- $feature{"TLS-SRP"} = $has_tls_srp;
- $feature{"Metalink"} = $has_metalink;
- $feature{"http/2"} = $has_http2;
+ $feature{"SSL"} = $has_ssl;
+ $feature{"SSLpinning"} = $has_sslpinning;
+ $feature{"SSPI"} = $has_sspi;
$feature{"threaded-resolver"} = $has_threadedres;
- $feature{"PSL"} = $has_psl;
- $feature{"alt-svc"} = $has_altsvc;
- $feature{"manual"} = $has_manual;
+ $feature{"TLS-SRP"} = $has_tls_srp;
+ $feature{"TrackMemory"} = $has_memory_tracking;
+ $feature{"unittest"} = $debug_build;
$feature{"unix-sockets"} = $has_unix;
+ $feature{"win32"} = $has_win32;
+ $feature{"zstd"} = $has_zstd;
# make each protocol an enabled "feature"
for my $p (@protocols) {
@@ -2653,7 +2851,7 @@ sub checksystem {
@version = <VERSOUT>;
close(VERSOUT);
- open(DISABLED, "server/disabled|");
+ open(DISABLED, "server/disabled".exe_ext('TOOL')."|");
@disabled = <DISABLED>;
close(DISABLED);
@@ -2666,8 +2864,9 @@ sub checksystem {
for(@version) {
chomp;
- if($_ =~ /^curl/) {
+ if($_ =~ /^curl ([^ ]*)/) {
$curl = $_;
+ $VERSION = $1;
$curl =~ s/^(.*)(libcurl.*)/$1/g;
$libcurl = $2;
@@ -2679,9 +2878,11 @@ sub checksystem {
# Win32-style path.
$pwd = pathhelp::sys_native_current_path();
$has_textaware = 1;
+ $has_win32 = 1;
+ $has_mingw = 1 if ($curl =~ /-pc-mingw32/);
}
if ($libcurl =~ /(winssl|schannel)/i) {
- $has_winssl=1;
+ $has_schannel=1;
$has_sslpinning=1;
}
elsif ($libcurl =~ /openssl/i) {
@@ -2700,12 +2901,8 @@ sub checksystem {
$has_wolfssl=1;
$has_sslpinning=1;
}
- elsif ($libcurl =~ /polarssl/i) {
- $has_polarssl=1;
- $has_sslpinning=1;
- }
elsif ($libcurl =~ /securetransport/i) {
- $has_darwinssl=1;
+ $has_sectransp=1;
$has_sslpinning=1;
}
elsif ($libcurl =~ /BoringSSL/i) {
@@ -2782,6 +2979,9 @@ sub checksystem {
if($feat =~ /brotli/i) {
$has_brotli = 1;
}
+ if($feat =~ /zstd/i) {
+ $has_zstd = 1;
+ }
if($feat =~ /NTLM/i) {
# NTLM enabled
$has_ntlm=1;
@@ -2848,6 +3048,12 @@ sub checksystem {
push @protocols, 'http/2';
}
+ if($feat =~ /HTTPS-proxy/) {
+ $has_httpsproxy=1;
+
+ # 'https-proxy' is used as "server" so consider it a protocol
+ push @protocols, 'https-proxy';
+ }
}
#
# Test harness currently uses a non-stunnel server in order to
@@ -2907,7 +3113,8 @@ sub checksystem {
# client has IPv6 support
# check if the HTTP server has it!
- my @sws = `server/sws --version`;
+ my $cmd = "server/sws".exe_ext('SRV')." --version";
+ my @sws = `$cmd`;
if($sws[0] =~ /IPv6/) {
# HTTP server has IPv6 support!
$http_ipv6 = 1;
@@ -2915,7 +3122,8 @@ sub checksystem {
}
# check if the FTP server has it!
- @sws = `server/sockfilt --version`;
+ $cmd = "server/sockfilt".exe_ext('SRV')." --version";
+ @sws = `$cmd`;
if($sws[0] =~ /IPv6/) {
# FTP server has IPv6 support!
$ftp_ipv6 = 1;
@@ -2924,7 +3132,8 @@ sub checksystem {
if($has_unix) {
# client has Unix sockets support, check whether the HTTP server has it
- my @sws = `server/sws --version`;
+ my $cmd = "server/sws".exe_ext('SRV')." --version";
+ my @sws = `$cmd`;
$http_unix = 1 if($sws[0] =~ /unix/);
}
@@ -2949,6 +3158,7 @@ sub checksystem {
my $hostname=join(' ', runclientoutput("hostname"));
my $hosttype=join(' ', runclientoutput("uname -a"));
+ my $hostos=$^O;
logmsg ("********* System characteristics ******** \n",
"* $curl\n",
@@ -2956,7 +3166,8 @@ sub checksystem {
"* Features: $feat\n",
"* Disabled: $dis\n",
"* Host: $hostname",
- "* System: $hosttype");
+ "* System: $hosttype",
+ "* OS: $hostos\n");
if($has_memory_tracking && $has_threadedres) {
$has_memory_tracking = 0;
@@ -2973,51 +3184,9 @@ sub checksystem {
logmsg sprintf("* Env: %s%s", $valgrind?"Valgrind ":"",
$run_event_based?"event-based ":"");
logmsg sprintf("%s\n", $libtool?"Libtool ":"");
+ logmsg ("* Seed: $randseed\n");
if($verbose) {
- logmsg "* Ports:\n";
-
- logmsg sprintf("* HTTP/%d ", $HTTPPORT);
- logmsg sprintf("FTP/%d ", $FTPPORT);
- logmsg sprintf("FTP2/%d ", $FTP2PORT);
- logmsg sprintf("RTSP/%d ", $RTSPPORT);
- if($stunnel) {
- logmsg sprintf("FTPS/%d ", $FTPSPORT);
- logmsg sprintf("HTTPS/%d ", $HTTPSPORT);
- }
- logmsg sprintf("\n* TFTP/%d ", $TFTPPORT);
- if($http_ipv6) {
- logmsg sprintf("HTTP-IPv6/%d ", $HTTP6PORT);
- logmsg sprintf("RTSP-IPv6/%d ", $RTSP6PORT);
- }
- if($ftp_ipv6) {
- logmsg sprintf("FTP-IPv6/%d ", $FTP6PORT);
- }
- if($tftp_ipv6) {
- logmsg sprintf("TFTP-IPv6/%d ", $TFTP6PORT);
- }
- logmsg sprintf("\n* GOPHER/%d ", $GOPHERPORT);
- if($gopher_ipv6) {
- logmsg sprintf("GOPHER-IPv6/%d", $GOPHER6PORT);
- }
- logmsg sprintf("\n* SSH/%d ", $SSHPORT);
- logmsg sprintf("SOCKS/%d ", $SOCKSPORT);
- logmsg sprintf("POP3/%d ", $POP3PORT);
- logmsg sprintf("IMAP/%d ", $IMAPPORT);
- logmsg sprintf("SMTP/%d\n", $SMTPPORT);
- if($ftp_ipv6) {
- logmsg sprintf("* POP3-IPv6/%d ", $POP36PORT);
- logmsg sprintf("IMAP-IPv6/%d ", $IMAP6PORT);
- logmsg sprintf("SMTP-IPv6/%d\n", $SMTP6PORT);
- }
- if($httptlssrv) {
- logmsg sprintf("* HTTPTLS/%d ", $HTTPTLSPORT);
- if($has_ipv6) {
- logmsg sprintf("HTTPTLS-IPv6/%d ", $HTTPTLS6PORT);
- }
- logmsg "\n";
- }
-
if($has_unix) {
logmsg "* Unix socket paths:\n";
if($http_unix) {
@@ -3040,94 +3209,118 @@ sub checksystem {
# a command, in either case passed by reference
#
sub subVariables {
- my ($thing) = @_;
-
- # ports
-
- $$thing =~ s/%FTP6PORT/$FTP6PORT/g;
- $$thing =~ s/%FTP2PORT/$FTP2PORT/g;
- $$thing =~ s/%FTPSPORT/$FTPSPORT/g;
- $$thing =~ s/%FTPPORT/$FTPPORT/g;
-
- $$thing =~ s/%GOPHER6PORT/$GOPHER6PORT/g;
- $$thing =~ s/%GOPHERPORT/$GOPHERPORT/g;
-
- $$thing =~ s/%HTTPTLS6PORT/$HTTPTLS6PORT/g;
- $$thing =~ s/%HTTPTLSPORT/$HTTPTLSPORT/g;
- $$thing =~ s/%HTTP6PORT/$HTTP6PORT/g;
- $$thing =~ s/%HTTPSPORT/$HTTPSPORT/g;
- $$thing =~ s/%HTTP2PORT/$HTTP2PORT/g;
- $$thing =~ s/%HTTPPORT/$HTTPPORT/g;
- $$thing =~ s/%PROXYPORT/$HTTPPROXYPORT/g;
-
- $$thing =~ s/%IMAP6PORT/$IMAP6PORT/g;
- $$thing =~ s/%IMAPPORT/$IMAPPORT/g;
-
- $$thing =~ s/%POP36PORT/$POP36PORT/g;
- $$thing =~ s/%POP3PORT/$POP3PORT/g;
-
- $$thing =~ s/%RTSP6PORT/$RTSP6PORT/g;
- $$thing =~ s/%RTSPPORT/$RTSPPORT/g;
-
- $$thing =~ s/%SMTP6PORT/$SMTP6PORT/g;
- $$thing =~ s/%SMTPPORT/$SMTPPORT/g;
-
- $$thing =~ s/%SOCKSPORT/$SOCKSPORT/g;
- $$thing =~ s/%SSHPORT/$SSHPORT/g;
-
- $$thing =~ s/%TFTP6PORT/$TFTP6PORT/g;
- $$thing =~ s/%TFTPPORT/$TFTPPORT/g;
-
- $$thing =~ s/%DICTPORT/$DICTPORT/g;
-
- $$thing =~ s/%SMBPORT/$SMBPORT/g;
- $$thing =~ s/%SMBSPORT/$SMBSPORT/g;
-
- $$thing =~ s/%NEGTELNETPORT/$NEGTELNETPORT/g;
-
- # server Unix domain socket paths
-
- $$thing =~ s/%HTTPUNIXPATH/$HTTPUNIXPATH/g;
-
- # client IP addresses
-
- $$thing =~ s/%CLIENT6IP/$CLIENT6IP/g;
- $$thing =~ s/%CLIENTIP/$CLIENTIP/g;
-
- # server IP addresses
-
- $$thing =~ s/%HOST6IP/$HOST6IP/g;
- $$thing =~ s/%HOSTIP/$HOSTIP/g;
-
- # misc
-
- $$thing =~ s/%CURL/$CURL/g;
- $$thing =~ s/%PWD/$pwd/g;
- $$thing =~ s/%POSIX_PWD/$posix_pwd/g;
-
- my $file_pwd = $pwd;
- if($file_pwd !~ /^\//) {
- $file_pwd = "/$file_pwd";
- }
-
- $$thing =~ s/%FILE_PWD/$file_pwd/g;
- $$thing =~ s/%SRCDIR/$srcdir/g;
- $$thing =~ s/%USER/$USER/g;
-
- # The purpose of FTPTIME2 and FTPTIME3 is to provide times that can be
- # used for time-out tests and that whould work on most hosts as these
- # adjust for the startup/check time for this particular host. We needed
- # to do this to make the test suite run better on very slow hosts.
-
- my $ftp2 = $ftpchecktime * 2;
- my $ftp3 = $ftpchecktime * 3;
-
- $$thing =~ s/%FTPTIME2/$ftp2/g;
- $$thing =~ s/%FTPTIME3/$ftp3/g;
-
- # HTTP2
+ my ($thing, $prefix) = @_;
+
+ if(!$prefix) {
+ $prefix = "%";
+ }
+
+ # test server ports
+ $$thing =~ s/${prefix}FTP6PORT/$FTP6PORT/g;
+ $$thing =~ s/${prefix}FTPSPORT/$FTPSPORT/g;
+ $$thing =~ s/${prefix}FTPPORT/$FTPPORT/g;
+ $$thing =~ s/${prefix}GOPHER6PORT/$GOPHER6PORT/g;
+ $$thing =~ s/${prefix}GOPHERPORT/$GOPHERPORT/g;
+ $$thing =~ s/${prefix}HTTPTLS6PORT/$HTTPTLS6PORT/g;
+ $$thing =~ s/${prefix}HTTPTLSPORT/$HTTPTLSPORT/g;
+ $$thing =~ s/${prefix}HTTP6PORT/$HTTP6PORT/g;
+ $$thing =~ s/${prefix}HTTPSPORT/$HTTPSPORT/g;
+ $$thing =~ s/${prefix}HTTPSPROXYPORT/$HTTPSPROXYPORT/g;
+ $$thing =~ s/${prefix}HTTP2PORT/$HTTP2PORT/g;
+ $$thing =~ s/${prefix}HTTPPORT/$HTTPPORT/g;
+ $$thing =~ s/${prefix}PROXYPORT/$HTTPPROXYPORT/g;
+ $$thing =~ s/${prefix}MQTTPORT/$MQTTPORT/g;
+ $$thing =~ s/${prefix}IMAP6PORT/$IMAP6PORT/g;
+ $$thing =~ s/${prefix}IMAPPORT/$IMAPPORT/g;
+ $$thing =~ s/${prefix}POP36PORT/$POP36PORT/g;
+ $$thing =~ s/${prefix}POP3PORT/$POP3PORT/g;
+ $$thing =~ s/${prefix}RTSP6PORT/$RTSP6PORT/g;
+ $$thing =~ s/${prefix}RTSPPORT/$RTSPPORT/g;
+ $$thing =~ s/${prefix}SMTP6PORT/$SMTP6PORT/g;
+ $$thing =~ s/${prefix}SMTPPORT/$SMTPPORT/g;
+ $$thing =~ s/${prefix}SOCKSPORT/$SOCKSPORT/g;
+ $$thing =~ s/${prefix}SSHPORT/$SSHPORT/g;
+ $$thing =~ s/${prefix}TFTP6PORT/$TFTP6PORT/g;
+ $$thing =~ s/${prefix}TFTPPORT/$TFTPPORT/g;
+ $$thing =~ s/${prefix}DICTPORT/$DICTPORT/g;
+ $$thing =~ s/${prefix}SMBPORT/$SMBPORT/g;
+ $$thing =~ s/${prefix}SMBSPORT/$SMBSPORT/g;
+ $$thing =~ s/${prefix}TELNETPORT/$TELNETPORT/g;
+ $$thing =~ s/${prefix}NOLISTENPORT/$NOLISTENPORT/g;
+
+ # server Unix domain socket paths
+ $$thing =~ s/${prefix}HTTPUNIXPATH/$HTTPUNIXPATH/g;
+
+ # client IP addresses
+ $$thing =~ s/${prefix}CLIENT6IP/$CLIENT6IP/g;
+ $$thing =~ s/${prefix}CLIENTIP/$CLIENTIP/g;
+
+ # server IP addresses
+ $$thing =~ s/${prefix}HOST6IP/$HOST6IP/g;
+ $$thing =~ s/${prefix}HOSTIP/$HOSTIP/g;
+
+ # misc
+ $$thing =~ s/${prefix}CURL/$CURL/g;
+ $$thing =~ s/${prefix}PWD/$pwd/g;
+ $$thing =~ s/${prefix}POSIX_PWD/$posix_pwd/g;
+ $$thing =~ s/${prefix}VERSION/$VERSION/g;
+
+ my $file_pwd = $pwd;
+ if($file_pwd !~ /^\//) {
+ $file_pwd = "/$file_pwd";
+ }
+ my $ssh_pwd = $posix_pwd;
+ if ($sshdid && $sshdid =~ /OpenSSH-Windows/) {
+ $ssh_pwd = $file_pwd;
+ }
+
+ $$thing =~ s/${prefix}FILE_PWD/$file_pwd/g;
+ $$thing =~ s/${prefix}SSH_PWD/$ssh_pwd/g;
+ $$thing =~ s/${prefix}SRCDIR/$srcdir/g;
+ $$thing =~ s/${prefix}USER/$USER/g;
+
+ $$thing =~ s/${prefix}SSHSRVMD5/$SSHSRVMD5/g;
+
+ # The purpose of FTPTIME2 and FTPTIME3 is to provide times that can be
+ # used for time-out tests and that would work on most hosts as these
+ # adjust for the startup/check time for this particular host. We needed to
+ # do this to make the test suite run better on very slow hosts.
+ my $ftp2 = $ftpchecktime * 2;
+ my $ftp3 = $ftpchecktime * 3;
+
+ $$thing =~ s/${prefix}FTPTIME2/$ftp2/g;
+ $$thing =~ s/${prefix}FTPTIME3/$ftp3/g;
+
+ # HTTP2
+ $$thing =~ s/${prefix}H2CVER/$h2cver/g;
+}
- $$thing =~ s/%H2CVER/$h2cver/g;
+sub subBase64 {
+ my ($thing) = @_;
+
+ # cut out the base64 piece
+ if($$thing =~ s/%b64\[(.*)\]b64%/%%B64%%/i) {
+ my $d = $1;
+ # encode %NN characters
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ my $enc = encode_base64($d, "");
+ # put the result into there
+ $$thing =~ s/%%B64%%/$enc/;
+ }
+ # hex decode
+ if($$thing =~ s/%hex\[(.*)\]hex%/%%HEX%%/i) {
+ # decode %NN characters
+ my $d = $1;
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ $$thing =~ s/%%HEX%%/$d/;
+ }
+ if($$thing =~ s/%repeat\[(\d+) x (.*)\]%/%%REPEAT%%/i) {
+ # decode %NN characters
+ my ($d, $n) = ($2, $1);
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ my $all = $d x $n;
+ $$thing =~ s/%%REPEAT%%/$all/;
+ }
}
sub fixarray {
@@ -3203,6 +3396,7 @@ sub singletest {
my $why;
my $cmd;
my $disablevalgrind;
+ my $errorreturncode = 1; # 1 means normal error, 2 means ignored error
# fist, remove all lingering log files
cleardir($LOGDIR);
@@ -3220,6 +3414,10 @@ sub singletest {
if($disabled{$testnum}) {
logmsg "Warning: test$testnum is explicitly disabled\n";
}
+ if($ignored{$testnum}) {
+ logmsg "Warning: test$testnum result is ignored\n";
+ $errorreturncode = 2;
+ }
# load the test case file definition
if(loadtest("${TESTDIR}/test${testnum}")) {
@@ -3269,21 +3467,30 @@ sub singletest {
}
if(!$why) {
- my @keywords = getpart("info", "keywords");
+ my @info_keywords = getpart("info", "keywords");
my $match;
my $k;
- if(!$keywords[0]) {
+ # Clear the list of keywords from the last test
+ %keywords = ();
+
+ if(!$info_keywords[0]) {
$why = "missing the <keywords> section!";
}
- for $k (@keywords) {
+ for $k (@info_keywords) {
chomp $k;
if ($disabled_keywords{lc($k)}) {
$why = "disabled by keyword";
} elsif ($enabled_keywords{lc($k)}) {
$match = 1;
}
+ if ($ignored_keywords{lc($k)}) {
+ logmsg "Warning: test$testnum result is ignored due to $k\n";
+ $errorreturncode = 2;
+ }
+
+ $keywords{$k} = 1;
}
if(!$why && !$match && %enabled_keywords) {
@@ -3306,6 +3513,19 @@ sub singletest {
delete $oldenv{$var};
}
+ # get the name of the test early
+ my @testname= getpart("client", "name");
+ my $testname = $testname[0];
+ $testname =~ s/\n//g;
+
+ # create test result in CI services
+ if(azure_check_environment() && $AZURE_RUN_ID) {
+ $AZURE_RESULT_ID = azure_create_test_result($VCURL, $AZURE_RUN_ID, $testnum, $testname);
+ }
+ elsif(appveyor_check_environment()) {
+ appveyor_create_test_result($VCURL, $testnum, $testname);
+ }
+
# remove test server commands file before servers are started/verified
unlink($FTPDCMD) if(-f $FTPDCMD);
@@ -3316,6 +3536,30 @@ sub singletest {
$why = serverfortest($testnum);
}
+ # Save a preprocessed version of the entire test file. This allows more
+ # "basic" test case readers to enjoy variable replacements.
+ my @entiretest = fulltest();
+ my $otest = "log/test$testnum";
+ open(D, ">$otest");
+ my $diff;
+ for my $s (@entiretest) {
+ my $f = $s;
+ subVariables(\$s, "%");
+ subBase64(\$s);
+ if($f ne $s) {
+ $diff++;
+ }
+ print D $s;
+ }
+ close(D);
+
+ # remove the separate test file again if nothing was updated to keep
+ # things simpler
+ unlink($otest) if(!$diff);
+
+ # in case the process changed the file, reload it
+ loadtest("log/test${testnum}") if($diff);
+
# timestamp required servers verification end
$timesrvrend{$testnum} = Time::HiRes::time();
@@ -3334,7 +3578,7 @@ sub singletest {
}
else {
if($var =~ /^LD_PRELOAD/) {
- if(exe_ext() && (exe_ext() eq '.exe')) {
+ if(exe_ext('TOOL') && (exe_ext('TOOL') eq '.exe')) {
# print "Skipping LD_PRELOAD due to lack of OS support\n";
next;
}
@@ -3355,7 +3599,7 @@ sub singletest {
if(@precheck) {
$cmd = $precheck[0];
chomp $cmd;
- subVariables \$cmd;
+ subVariables(\$cmd);
if($cmd) {
my @p = split(/ /, $cmd);
if($p[0] !~ /\//) {
@@ -3434,6 +3678,9 @@ sub singletest {
map s/\n/\r\n/g, @reply;
}
}
+ for my $r (@reply) {
+ subVariables(\$r);
+ }
# this is the valid protocol blurb curl should generate
my @protocol= fixarray ( getpart("verify", "protocol") );
@@ -3465,9 +3712,6 @@ sub singletest {
my $CURLOUT="$LOGDIR/curl$testnum.out"; # curl output if not stdout
# name of the test
- my @testname= getpart("client", "name");
- my $testname = $testname[0];
- $testname =~ s/\n//g;
logmsg "[$testname]\n" if(!$short);
if($listonly) {
@@ -3481,6 +3725,7 @@ sub singletest {
if(@codepieces) {
$tool = $codepieces[0];
chomp $tool;
+ $tool .= exe_ext('TOOL');
}
# remove server output logfile
@@ -3488,10 +3733,9 @@ sub singletest {
unlink($SERVER2IN);
unlink($PROXYIN);
- if(@ftpservercmd) {
- # write the instructions to file
- writearray($FTPDCMD, \@ftpservercmd);
- }
+ push @ftpservercmd, "Testnum $testnum\n";
+ # write the instructions to file
+ writearray($FTPDCMD, \@ftpservercmd);
# get the command line options to use
my @blaha;
@@ -3501,7 +3745,7 @@ sub singletest {
# make some nice replace operations
$cmd =~ s/\n//g; # no newlines please
# substitute variables in the command line
- subVariables \$cmd;
+ subVariables(\$cmd);
}
else {
# there was no command given, use something silly
@@ -3523,10 +3767,13 @@ sub singletest {
return -1;
}
my $fileContent = join('', @inputfile);
- subVariables \$fileContent;
-# logmsg "DEBUG: writing file " . $filename . "\n";
+ subVariables(\$fileContent);
open(OUTFILE, ">$filename");
binmode OUTFILE; # for crapage systems, use binary
+ if($fileattr{'nonewline'}) {
+ # cut off the final newline
+ chomp($fileContent);
+ }
print OUTFILE $fileContent;
close(OUTFILE);
}
@@ -3578,15 +3825,20 @@ sub singletest {
$tool=$CMDLINE;
$disablevalgrind=1;
}
- elsif(!$tool) {
+ elsif(!$tool && !$keywords{"unittest"}) {
# run curl, add suitable command line options
my $inc="";
if((!$cmdhash{'option'}) || ($cmdhash{'option'} !~ /no-include/)) {
$inc = " --include";
}
-
$cmdargs = "$out$inc ";
- $cmdargs .= "--trace-ascii log/trace$testnum ";
+
+ if($cmdhash{'option'} && ($cmdhash{'option'} =~ /binary-trace/)) {
+ $cmdargs .= "--trace log/trace$testnum ";
+ }
+ else {
+ $cmdargs .= "--trace-ascii log/trace$testnum ";
+ }
$cmdargs .= "--trace-time ";
if($evbased) {
$cmdargs .= "--test-event ";
@@ -3598,6 +3850,11 @@ sub singletest {
$cmdargs = " $cmd"; # $cmd is the command line for the test file
$CURLOUT = $STDOUT; # sends received data to stdout
+ # Default the tool to a unit test with the same name as the test spec
+ if($keywords{"unittest"} && !$tool) {
+ $tool="unit$testnum";
+ }
+
if($tool =~ /^lib/) {
$CMDLINE="$LIBDIR/$tool";
}
@@ -3667,7 +3924,9 @@ sub singletest {
logmsg "$CMDLINE\n";
}
+ open(CMDLOG, ">", "$LOGDIR/$CURLLOG");
print CMDLOG "$CMDLINE\n";
+ close(CMDLOG);
unlink("core");
@@ -3690,11 +3949,11 @@ sub singletest {
if ($torture) {
$cmdres = torture($CMDLINE,
$testnum,
- "$gdb --directory libtest $DBGCURL -x $LOGDIR/gdbcmd");
+ "$gdb --directory $LIBDIR $DBGCURL -x $LOGDIR/gdbcmd");
}
elsif($gdbthis) {
my $GDBW = ($gdbxwin) ? "-w" : "";
- runclient("$gdb --directory libtest $DBGCURL $GDBW -x $LOGDIR/gdbcmd");
+ runclient("$gdb --directory $LIBDIR $DBGCURL $GDBW -x $LOGDIR/gdbcmd");
$cmdres=0; # makes it always continue after a debugged run
}
else {
@@ -3742,7 +4001,7 @@ sub singletest {
if($serverlogslocktimeout) {
my $lockretry = $serverlogslocktimeout * 20;
while((-f $SERVERLOGS_LOCK) && $lockretry--) {
- select(undef, undef, undef, 0.05);
+ portable_sleep(0.05);
}
if(($lockretry < 0) &&
($serverlogslocktimeout >= $defserverlogslocktimeout)) {
@@ -3759,7 +4018,7 @@ sub singletest {
# based tests might need a small delay once that the client command has
# run to avoid false test failures.
- sleep($postcommanddelay) if($postcommanddelay);
+ portable_sleep($postcommanddelay) if($postcommanddelay);
# timestamp removal of server logs advisor read lock
$timesrvrlog{$testnum} = Time::HiRes::time();
@@ -3769,76 +4028,18 @@ sub singletest {
my @killtestservers = getpart("client", "killserver");
if(@killtestservers) {
- #
- # All servers relative to the given one must be stopped also
- #
- my @killservers;
foreach my $server (@killtestservers) {
chomp $server;
- if($server =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) {
- # given a stunnel ssl server, also kill non-ssl underlying one
- push @killservers, "${1}${2}";
- }
- elsif($server =~ /^(ftp|http|imap|pop3|smtp)((\d*)(-ipv6|-unix|))$/) {
- # given a non-ssl server, also kill stunnel piggybacking one
- push @killservers, "${1}s${2}";
- }
- elsif($server =~ /^(socks)((\d*)(-ipv6|))$/) {
- # given a socks server, also kill ssh underlying one
- push @killservers, "ssh${2}";
- }
- elsif($server =~ /^(ssh)((\d*)(-ipv6|))$/) {
- # given a ssh server, also kill socks piggybacking one
- push @killservers, "socks${2}";
- }
- push @killservers, $server;
- }
- #
- # kill sockfilter processes for pingpong relative servers
- #
- foreach my $server (@killservers) {
- if($server =~ /^(ftp|imap|pop3|smtp)s?(\d*)(-ipv6|)$/) {
- my $proto = $1;
- my $idnum = ($2 && ($2 > 1)) ? $2 : 1;
- my $ipvnum = ($3 && ($3 =~ /6$/)) ? 6 : 4;
- killsockfilters($proto, $ipvnum, $idnum, $verbose);
- }
- }
- #
- # kill server relative pids clearing them in %run hash
- #
- my $pidlist;
- foreach my $server (@killservers) {
- if($run{$server}) {
- $pidlist .= "$run{$server} ";
- $run{$server} = 0;
- }
- $runcert{$server} = 0 if($runcert{$server});
- }
- killpid($verbose, $pidlist);
- #
- # cleanup server pid files
- #
- foreach my $server (@killservers) {
- my $pidfile = $serverpidfile{$server};
- my $pid = processexists($pidfile);
- if($pid > 0) {
- logmsg "Warning: $server server unexpectedly alive\n";
- killpid($verbose, $pid);
- }
- unlink($pidfile) if(-f $pidfile);
+ stopserver($server);
}
}
- # remove the test server commands file after each test
- unlink($FTPDCMD) if(-f $FTPDCMD);
-
# run the postcheck command
my @postcheck= getpart("client", "postcheck");
if(@postcheck) {
$cmd = join("", @postcheck);
chomp $cmd;
- subVariables \$cmd;
+ subVariables(\$cmd);
if($cmd) {
logmsg "postcheck $cmd\n" if($verbose);
my $rc = runclient("$cmd");
@@ -3848,7 +4049,7 @@ sub singletest {
logmsg " postcheck FAILED\n";
# timestamp test result verification end
$timevrfyend{$testnum} = Time::HiRes::time();
- return 1;
+ return $errorreturncode;
}
}
}
@@ -3920,7 +4121,7 @@ sub singletest {
$res = compare($testnum, $testname, "stdout", \@actual, \@validstdout);
if($res) {
- return 1;
+ return $errorreturncode;
}
$ok .= "s";
}
@@ -3971,7 +4172,7 @@ sub singletest {
$res = compare($testnum, $testname, "stderr", \@actual, \@validstderr);
if($res) {
- return 1;
+ return $errorreturncode;
}
$ok .= "r";
}
@@ -4015,9 +4216,16 @@ sub singletest {
}
}
+ if((!$out[0] || ($out[0] eq "")) && $protstrip[0]) {
+ logmsg "\n $testnum: protocol FAILED!\n".
+ " There was no content at all in the file $SERVERIN.\n".
+ " Server glitch? Total curl failure? Returned: $cmdres\n";
+ return $errorreturncode;
+ }
+
$res = compare($testnum, $testname, "protocol", \@out, \@protstrip);
if($res) {
- return 1;
+ return $errorreturncode;
}
$ok .= "p";
@@ -4032,7 +4240,7 @@ sub singletest {
my @out = loadarray($CURLOUT);
$res = compare($testnum, $testname, "data", \@out, \@reply);
if ($res) {
- return 1;
+ return $errorreturncode;
}
$ok .= "d";
}
@@ -4056,7 +4264,7 @@ sub singletest {
$res = compare($testnum, $testname, "upload", \@out, \@upload);
if ($res) {
- return 1;
+ return $errorreturncode;
}
$ok .= "u";
}
@@ -4102,7 +4310,7 @@ sub singletest {
$res = compare($testnum, $testname, "proxy", \@out, \@protstrip);
if($res) {
- return 1;
+ return $errorreturncode;
}
$ok .= "P";
@@ -4160,7 +4368,7 @@ sub singletest {
$res = compare($testnum, $testname, "output ($filename)",
\@generated, \@outfile);
if($res) {
- return 1;
+ return $errorreturncode;
}
$outputok = 1; # output checked
@@ -4190,7 +4398,7 @@ sub singletest {
logmsg " exit FAILED\n";
# timestamp test result verification end
$timevrfyend{$testnum} = Time::HiRes::time();
- return 1;
+ return $errorreturncode;
}
if($has_memory_tracking) {
@@ -4213,7 +4421,7 @@ sub singletest {
logmsg @memdata;
# timestamp test result verification end
$timevrfyend{$testnum} = Time::HiRes::time();
- return 1;
+ return $errorreturncode;
}
else {
$ok .= "m";
@@ -4230,7 +4438,7 @@ sub singletest {
logmsg "ERROR: unable to read $LOGDIR\n";
# timestamp test result verification end
$timevrfyend{$testnum} = Time::HiRes::time();
- return 1;
+ return $errorreturncode;
}
my @files = readdir(DIR);
closedir(DIR);
@@ -4245,7 +4453,7 @@ sub singletest {
logmsg "ERROR: valgrind log file missing for test $testnum\n";
# timestamp test result verification end
$timevrfyend{$testnum} = Time::HiRes::time();
- return 1;
+ return $errorreturncode;
}
my @e = valgrindparse("$LOGDIR/$vgfile");
if(@e && $e[0]) {
@@ -4258,12 +4466,12 @@ sub singletest {
}
# timestamp test result verification end
$timevrfyend{$testnum} = Time::HiRes::time();
- return 1;
+ return $errorreturncode;
}
$ok .= "v";
}
else {
- if(!$short && !$disablevalgrind) {
+ if($verbose && !$disablevalgrind) {
logmsg " valgrind SKIPPED\n";
}
$ok .= "-"; # skipped
@@ -4290,13 +4498,16 @@ sub singletest {
my $duration = sprintf("duration: %02d:%02d",
$sofar/60, $sofar%60);
if(!$automakestyle) {
- logmsg sprintf("OK (%-3d out of %-3d, %s, took %.1fs, %s)\n",
+ logmsg sprintf("OK (%-3d out of %-3d, %s, took %.3fs, %s)\n",
$count, $total, $left, $took, $duration);
}
else {
logmsg "PASS: $testnum - $testname\n";
}
+ if($errorreturncode==2) {
+ logmsg "Warning: test$testnum result is ignored, but passed!\n";
+ }
return 0;
}
@@ -4382,20 +4593,6 @@ sub startservers {
$run{$what}="$pid $pid2";
}
}
- elsif($what eq "ftp2") {
- if($torture && $run{'ftp2'} &&
- !responsive_pingpong_server("ftp", "2", $verbose)) {
- stopserver('ftp2');
- }
- if(!$run{'ftp2'}) {
- ($pid, $pid2) = runpingpongserver("ftp", "2", $verbose);
- if($pid <= 0) {
- return "failed starting FTP2 server";
- }
- printf ("* pid ftp2 => %d %d\n", $pid, $pid2) if($verbose);
- $run{'ftp2'}="$pid $pid2";
- }
- }
elsif($what eq "ftp-ipv6") {
if($torture && $run{'ftp-ipv6'} &&
!responsive_pingpong_server("ftp", "", $verbose, "ipv6")) {
@@ -4417,8 +4614,8 @@ sub startservers {
stopserver('gopher');
}
if(!$run{'gopher'}) {
- ($pid, $pid2) = runhttpserver("gopher", $verbose, 0,
- $GOPHERPORT);
+ ($pid, $pid2, $GOPHERPORT) =
+ runhttpserver("gopher", $verbose, 0);
if($pid <= 0) {
return "failed starting GOPHER server";
}
@@ -4434,8 +4631,8 @@ sub startservers {
stopserver('gopher-ipv6');
}
if(!$run{'gopher-ipv6'}) {
- ($pid, $pid2) = runhttpserver("gopher", $verbose, "ipv6",
- $GOPHER6PORT);
+ ($pid, $pid2, $GOPHER6PORT) =
+ runhttpserver("gopher", $verbose, "ipv6");
if($pid <= 0) {
return "failed starting GOPHER-IPv6 server";
}
@@ -4446,7 +4643,7 @@ sub startservers {
}
elsif($what eq "http/2") {
if(!$run{'http/2'}) {
- ($pid, $pid2) = runhttp2server($verbose, $HTTP2PORT);
+ ($pid, $pid2, $HTTP2PORT) = runhttp2server($verbose);
if($pid <= 0) {
return "failed starting HTTP/2 server";
}
@@ -4461,8 +4658,8 @@ sub startservers {
stopserver('http');
}
if(!$run{'http'}) {
- ($pid, $pid2) = runhttpserver("http", $verbose, 0,
- $HTTPPORT);
+ ($pid, $pid2, $HTTPPORT) =
+ runhttpserver("http", $verbose, 0);
if($pid <= 0) {
return "failed starting HTTP server";
}
@@ -4478,8 +4675,8 @@ sub startservers {
stopserver('http-proxy');
}
if(!$run{'http-proxy'}) {
- ($pid, $pid2) = runhttpserver("http", $verbose, "proxy",
- $HTTPPROXYPORT);
+ ($pid, $pid2, $HTTPPROXYPORT) =
+ runhttpserver("http", $verbose, "proxy");
if($pid <= 0) {
return "failed starting HTTP-proxy server";
}
@@ -4494,8 +4691,8 @@ sub startservers {
stopserver('http-ipv6');
}
if(!$run{'http-ipv6'}) {
- ($pid, $pid2) = runhttpserver("http", $verbose, "ipv6",
- $HTTP6PORT);
+ ($pid, $pid2, $HTTP6PORT) =
+ runhttpserver("http", $verbose, "ipv6");
if($pid <= 0) {
return "failed starting HTTP-IPv6 server";
}
@@ -4510,7 +4707,7 @@ sub startservers {
stopserver('rtsp');
}
if(!$run{'rtsp'}) {
- ($pid, $pid2) = runrtspserver($verbose);
+ ($pid, $pid2, $RTSPPORT) = runrtspserver($verbose);
if($pid <= 0) {
return "failed starting RTSP server";
}
@@ -4524,7 +4721,7 @@ sub startservers {
stopserver('rtsp-ipv6');
}
if(!$run{'rtsp-ipv6'}) {
- ($pid, $pid2) = runrtspserver($verbose, "ipv6");
+ ($pid, $pid2, $RTSP6PORT) = runrtspserver($verbose, "ipv6");
if($pid <= 0) {
return "failed starting RTSP-IPv6 server";
}
@@ -4555,7 +4752,8 @@ sub startservers {
$run{'ftp'}="$pid $pid2";
}
if(!$run{'ftps'}) {
- ($pid, $pid2) = runftpsserver($verbose, "", $certfile);
+ ($pid, $pid2, $FTPSPORT) =
+ runftpsserver($verbose, "", $certfile);
if($pid <= 0) {
return "failed starting FTPS server (stunnel)";
}
@@ -4581,8 +4779,8 @@ sub startservers {
stopserver('http');
}
if(!$run{'http'}) {
- ($pid, $pid2) = runhttpserver("http", $verbose, 0,
- $HTTPPORT);
+ ($pid, $pid2, $HTTPPORT) =
+ runhttpserver("http", $verbose, 0);
if($pid <= 0) {
return "failed starting HTTP server";
}
@@ -4590,7 +4788,8 @@ sub startservers {
$run{'http'}="$pid $pid2";
}
if(!$run{'https'}) {
- ($pid, $pid2) = runhttpsserver($verbose, "", $certfile);
+ ($pid, $pid2, $HTTPSPORT) =
+ runhttpsserver($verbose, "", "", $certfile);
if($pid <= 0) {
return "failed starting HTTPS server (stunnel)";
}
@@ -4599,6 +4798,35 @@ sub startservers {
$run{'https'}="$pid $pid2";
}
}
+ elsif($what eq "https-proxy") {
+ if(!$stunnel) {
+ # we can't run https-proxy tests without stunnel
+ return "no stunnel";
+ }
+ if($runcert{'https-proxy'} &&
+ ($runcert{'https-proxy'} ne $certfile)) {
+ # stop server when running and using a different cert
+ stopserver('https-proxy');
+ }
+
+ # we front the http-proxy with stunnel so we need to make sure the
+ # proxy runs as well
+ my $f = startservers("http-proxy");
+ if($f) {
+ return $f;1
+ }
+
+ if(!$run{'https-proxy'}) {
+ ($pid, $pid2, $HTTPSPROXYPORT) =
+ runhttpsserver($verbose, "", "proxy", $certfile);
+ if($pid <= 0) {
+ return "failed starting HTTPS-proxy (stunnel)";
+ }
+ logmsg sprintf("* pid https-proxy => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'https-proxy'}="$pid $pid2";
+ }
+ }
elsif($what eq "httptls") {
if(!$httptlssrv) {
# for now, we can't run http TLS-EXT tests without gnutls-serv
@@ -4609,7 +4837,8 @@ sub startservers {
stopserver('httptls');
}
if(!$run{'httptls'}) {
- ($pid, $pid2) = runhttptlsserver($verbose, "IPv4");
+ ($pid, $pid2, $HTTPTLSPORT) =
+ runhttptlsserver($verbose, "IPv4");
if($pid <= 0) {
return "failed starting HTTPTLS server (gnutls-serv)";
}
@@ -4628,7 +4857,8 @@ sub startservers {
stopserver('httptls-ipv6');
}
if(!$run{'httptls-ipv6'}) {
- ($pid, $pid2) = runhttptlsserver($verbose, "ipv6");
+ ($pid, $pid2, $HTTPTLS6PORT) =
+ runhttptlsserver($verbose, "ipv6");
if($pid <= 0) {
return "failed starting HTTPTLS-IPv6 server (gnutls-serv)";
}
@@ -4643,7 +4873,8 @@ sub startservers {
stopserver('tftp');
}
if(!$run{'tftp'}) {
- ($pid, $pid2) = runtftpserver("", $verbose);
+ ($pid, $pid2, $TFTPPORT) =
+ runtftpserver("", $verbose);
if($pid <= 0) {
return "failed starting TFTP server";
}
@@ -4657,7 +4888,8 @@ sub startservers {
stopserver('tftp-ipv6');
}
if(!$run{'tftp-ipv6'}) {
- ($pid, $pid2) = runtftpserver("", $verbose, "ipv6");
+ ($pid, $pid2, $TFTP6PORT) =
+ runtftpserver("", $verbose, "ipv6");
if($pid <= 0) {
return "failed starting TFTP-IPv6 server";
}
@@ -4667,7 +4899,7 @@ sub startservers {
}
elsif($what eq "sftp" || $what eq "scp") {
if(!$run{'ssh'}) {
- ($pid, $pid2) = runsshserver("", $verbose);
+ ($pid, $pid2, $SSHPORT) = runsshserver("", $verbose);
if($pid <= 0) {
return "failed starting SSH server";
}
@@ -4677,7 +4909,7 @@ sub startservers {
}
elsif($what eq "socks4" || $what eq "socks5" ) {
if(!$run{'socks'}) {
- ($pid, $pid2) = runsocksserver("", $verbose);
+ ($pid, $pid2, $SOCKSPORT) = runsocksserver("", $verbose);
if($pid <= 0) {
return "failed starting socks server";
}
@@ -4685,14 +4917,25 @@ sub startservers {
$run{'socks'}="$pid $pid2";
}
}
+ elsif($what eq "mqtt" ) {
+ if(!$run{'mqtt'}) {
+ ($pid, $pid2) = runmqttserver("", $verbose);
+ if($pid <= 0) {
+ return "failed starting mqtt server";
+ }
+ printf ("* pid mqtt => %d %d\n", $pid, $pid2) if($verbose);
+ $run{'mqtt'}="$pid $pid2";
+ }
+ }
elsif($what eq "http-unix") {
if($torture && $run{'http-unix'} &&
!responsive_http_server("http", $verbose, "unix", $HTTPUNIXPATH)) {
stopserver('http-unix');
}
if(!$run{'http-unix'}) {
- ($pid, $pid2) = runhttpserver("http", $verbose, "unix",
- $HTTPUNIXPATH);
+ my $unused;
+ ($pid, $pid2, $unused) =
+ runhttpserver("http", $verbose, "unix", $HTTPUNIXPATH);
if($pid <= 0) {
return "failed starting HTTP-unix server";
}
@@ -4703,7 +4946,7 @@ sub startservers {
}
elsif($what eq "dict") {
if(!$run{'dict'}) {
- ($pid, $pid2) = rundictserver($verbose, "", $DICTPORT);
+ ($pid, $pid2, $DICTPORT) = rundictserver($verbose, "");
if($pid <= 0) {
return "failed starting DICT server";
}
@@ -4714,7 +4957,7 @@ sub startservers {
}
elsif($what eq "smb") {
if(!$run{'smb'}) {
- ($pid, $pid2) = runsmbserver($verbose, "", $SMBPORT);
+ ($pid, $pid2, $SMBPORT) = runsmbserver($verbose, "");
if($pid <= 0) {
return "failed starting SMB server";
}
@@ -4725,9 +4968,8 @@ sub startservers {
}
elsif($what eq "telnet") {
if(!$run{'telnet'}) {
- ($pid, $pid2) = runnegtelnetserver($verbose,
- "",
- $NEGTELNETPORT);
+ ($pid, $pid2, $TELNETPORT) =
+ runnegtelnetserver($verbose, "");
if($pid <= 0) {
return "failed starting neg TELNET server";
}
@@ -4938,6 +5180,13 @@ disabledtests("$TESTDIR/DISABLED.local");
# Check options to this test program
#
+# Special case for CMake: replace '$TFLAGS' by the contents of the
+# environment variable (if any).
+if(@ARGV && $ARGV[-1] eq '$TFLAGS') {
+ pop @ARGV;
+ push(@ARGV, split(' ', $ENV{'TFLAGS'})) if defined($ENV{'TFLAGS'});
+}
+
my $number=0;
my $fromnum=-1;
my @testthis;
@@ -4946,12 +5195,6 @@ while(@ARGV) {
# verbose output
$verbose=1;
}
- elsif($ARGV[0] =~ /^-b(.*)/) {
- my $portno=$1;
- if($portno =~ s/(\d+)$//) {
- $base = int $1;
- }
- }
elsif ($ARGV[0] eq "-c") {
# use this path to curl instead of default
$DBGCURL=$CURL="\"$ARGV[1]\"";
@@ -5010,6 +5253,20 @@ while(@ARGV) {
$tortalloc = $1;
}
}
+ elsif($ARGV[0] =~ /--shallow=(\d+)/) {
+ # Fail no more than this amount per tests when running
+ # torture.
+ my ($num)=($1);
+ $shallow=$num;
+ }
+ elsif($ARGV[0] =~ /--repeat=(\d+)/) {
+ # Repeat-run the given tests this many times
+ $repeat = $1;
+ }
+ elsif($ARGV[0] =~ /--seed=(\d+)/) {
+ # Set a fixed random seed (used for -R and --shallow)
+ $randseed = $1;
+ }
elsif($ARGV[0] eq "-a") {
# continue anyway, even if a test fail
$anyway=1;
@@ -5058,7 +5315,7 @@ while(@ARGV) {
print <<EOHELP
Usage: runtests.pl [options] [test selection(s)]
-a continue even if a test fails
- -bN use base port number N for test servers (default $base)
+ -am automake style output PASS/FAIL: [number] [name]
-c path use this curl executable
-d display server debug info
-e event-based execution
@@ -5069,18 +5326,21 @@ Usage: runtests.pl [options] [test selection(s)]
-l list all test case names/descriptions
-n no valgrind
-p print log file contents when a test fails
- -R scrambled order
+ -R scrambled order (uses the random seed, see --seed)
-r run time statistics
-rf full run time statistics
-s short output
- -am automake style output PASS/FAIL: [number] [name]
+ --seed=[num] set the random seed to a fixed number
+ --shallow=[num] randomly makes the torture tests "thinner"
-t[N] torture (simulate function failures); N means fail Nth function
-v verbose output
-vc path use this curl only to verify the existing servers
[num] like "5 6 9" or " 5 to 22 " to run those tests only
[!num] like "!5 !6 !9" to disable those tests
+ [~num] like "~5 ~6 ~9" to ignore the result of those tests
[keyword] like "IPv6" to select only tests containing the key word
[!keyword] like "!cookies" to disable any tests containing the key word
+ [~keyword] like "~cookies" to ignore results of tests containing key word
EOHELP
;
exit;
@@ -5113,9 +5373,16 @@ EOHELP
$fromnum = -1;
$disabled{$1}=$1;
}
+ elsif($ARGV[0] =~ /^~(\d+)/) {
+ $fromnum = -1;
+ $ignored{$1}=$1;
+ }
elsif($ARGV[0] =~ /^!(.+)/) {
$disabled_keywords{lc($1)}=$1;
}
+ elsif($ARGV[0] =~ /^~(.+)/) {
+ $ignored_keywords{lc($1)}=$1;
+ }
elsif($ARGV[0] =~ /^([-[{a-zA-Z].*)/) {
$enabled_keywords{lc($1)}=$1;
}
@@ -5126,6 +5393,20 @@ EOHELP
shift @ARGV;
}
+if(!$randseed) {
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ localtime(time);
+ # seed of the month. December 2019 becomes 201912
+ $randseed = ($year+1900)*100 + $mon+1;
+ open(C, "$CURL --version 2>/dev/null|");
+ my @c = <C>;
+ close(C);
+ # use the first line of output and get the md5 out of it
+ my $str = md5($c[0]);
+ $randseed += unpack('S', $str); # unsigned 16 bit value
+}
+srand $randseed;
+
if(@testthis && ($testthis[0] ne "")) {
$TESTCASES=join(" ", @testthis);
}
@@ -5182,36 +5463,7 @@ if ($gdbthis) {
}
}
-$HTTPPORT = $base++; # HTTP server port
-$HTTPSPORT = $base++; # HTTPS (stunnel) server port
-$FTPPORT = $base++; # FTP server port
-$FTPSPORT = $base++; # FTPS (stunnel) server port
-$HTTP6PORT = $base++; # HTTP IPv6 server port
-$FTP2PORT = $base++; # FTP server 2 port
-$FTP6PORT = $base++; # FTP IPv6 port
-$TFTPPORT = $base++; # TFTP (UDP) port
-$TFTP6PORT = $base++; # TFTP IPv6 (UDP) port
-$SSHPORT = $base++; # SSH (SCP/SFTP) port
-$SOCKSPORT = $base++; # SOCKS port
-$POP3PORT = $base++; # POP3 server port
-$POP36PORT = $base++; # POP3 IPv6 server port
-$IMAPPORT = $base++; # IMAP server port
-$IMAP6PORT = $base++; # IMAP IPv6 server port
-$SMTPPORT = $base++; # SMTP server port
-$SMTP6PORT = $base++; # SMTP IPv6 server port
-$RTSPPORT = $base++; # RTSP server port
-$RTSP6PORT = $base++; # RTSP IPv6 server port
-$GOPHERPORT = $base++; # Gopher IPv4 server port
-$GOPHER6PORT = $base++; # Gopher IPv6 server port
-$HTTPTLSPORT = $base++; # HTTP TLS (non-stunnel) server port
-$HTTPTLS6PORT = $base++; # HTTP TLS (non-stunnel) IPv6 server port
-$HTTPPROXYPORT = $base++; # HTTP proxy port, when using CONNECT
-$HTTP2PORT = $base++; # HTTP/2 port
-$DICTPORT = $base++; # DICT port
-$SMBPORT = $base++; # SMB port
-$SMBSPORT = $base++; # SMBS port
-$NEGTELNETPORT = $base++; # TELNET port with negotiation
-$HTTPUNIXPATH = 'http.sock'; # HTTP server Unix domain socket path
+$HTTPUNIXPATH = "http$$.sock"; # HTTP server Unix domain socket path
#######################################################################
# clear and create logging directory:
@@ -5249,7 +5501,13 @@ sub disabledtests {
next;
}
if($_ =~ /(\d+)/) {
- $disabled{$1}=$1; # disable this test number
+ my ($n) = $1;
+ $disabled{$n}=$n; # disable this test number
+ if(! -f "$srcdir/data/test$n") {
+ print STDERR "WARNING! Non-existing test $n in DISABLED!\n";
+ # fail hard to make user notice
+ exit 1;
+ }
}
}
close(D);
@@ -5298,6 +5556,13 @@ else {
}
$TESTCASES = $verified;
}
+if($repeat) {
+ my $s;
+ for(1 .. $repeat) {
+ $s .= $TESTCASES;
+ }
+ $TESTCASES = $s;
+}
if($scrambleorder) {
# scramble the order of the test cases
@@ -5316,14 +5581,6 @@ if($scrambleorder) {
$TESTCASES = join(" ", @rand);
}
-#######################################################################
-# Start the command line log
-#
-open(CMDLOG, ">$CURLLOG") ||
- logmsg "can't log command lines to $CURLLOG\n";
-
-#######################################################################
-
# Display the contents of the given file. Line endings are canonicalized
# and excessively long files are elided
sub displaylogcontent {
@@ -5412,6 +5669,9 @@ sub displaylogs {
if(($log =~ /^valgrind\d+/) && ($log !~ /^valgrind$testnum(\..*|)$/)) {
next; # skip valgrindNnn of other tests
}
+ if(($log =~ /^test$testnum$/)) {
+ next; # skip test$testnum since it can be very big
+ }
logmsg "=== Start of file $log\n";
displaylogcontent("$LOGDIR/$log");
logmsg "=== End of file $log\n";
@@ -5419,12 +5679,22 @@ sub displaylogs {
}
#######################################################################
+# Setup Azure Pipelines Test Run (if running in Azure DevOps)
+#
+
+if(azure_check_environment()) {
+ $AZURE_RUN_ID = azure_create_test_run($VCURL);
+ logmsg "Azure Run ID: $AZURE_RUN_ID\n" if ($verbose);
+}
+
+#######################################################################
# The main test-loop
#
my $failed;
my $testnum;
my $ok=0;
+my $ign=0;
my $total=0;
my $lasttest=0;
my @at = split(" ", $TESTCASES);
@@ -5438,6 +5708,16 @@ foreach $testnum (@at) {
$count++;
my $error = singletest($run_event_based, $testnum, $count, scalar(@at));
+
+ # update test result in CI services
+ if(azure_check_environment() && $AZURE_RUN_ID && $AZURE_RESULT_ID) {
+ $AZURE_RESULT_ID = azure_update_test_result($VCURL, $AZURE_RUN_ID, $AZURE_RESULT_ID, $testnum, $error,
+ $timeprepini{$testnum}, $timevrfyend{$testnum});
+ }
+ elsif(appveyor_check_environment()) {
+ appveyor_update_test_result($VCURL, $testnum, $error, $timeprepini{$testnum}, $timevrfyend{$testnum});
+ }
+
if($error < 0) {
# not a test we can run
next;
@@ -5446,12 +5726,21 @@ foreach $testnum (@at) {
$total++; # number of tests we've run
if($error>0) {
- $failed.= "$testnum ";
+ if($error==2) {
+ # ignored test failures are wrapped in ()
+ $failed.= "($testnum) ";
+ }
+ else {
+ $failed.= "$testnum ";
+ }
if($postmortem) {
# display all files in log/ in a nice way
displaylogs($testnum);
}
- if(!$anyway) {
+ if($error==2) {
+ $ign++; # ignored test result counter
+ }
+ elsif(!$anyway) {
# a test failed, abort
logmsg "\n - abort tests\n";
last;
@@ -5467,9 +5756,12 @@ foreach $testnum (@at) {
my $sofar = time() - $start;
#######################################################################
-# Close command log
+# Finish Azure Pipelines Test Run (if running in Azure DevOps)
#
-close(CMDLOG);
+
+if(azure_check_environment() && $AZURE_RUN_ID) {
+ $AZURE_RUN_ID = azure_update_test_run($VCURL, $AZURE_RUN_ID);
+}
# Tests done, stop the servers
stopservers($verbose);
@@ -5524,6 +5816,6 @@ if($skipped && !$short) {
}
}
-if($total && ($ok != $total)) {
+if($total && (($ok+$ign) != $total)) {
exit 1;
}
diff --git a/tests/secureserver.pl b/tests/secureserver.pl
index 969fb17b5..ac279cbba 100755
--- a/tests/secureserver.pl
+++ b/tests/secureserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -329,6 +329,7 @@ if($stunnel_version >= 400) {
# Set file permissions on certificate pem file.
#
chmod(0600, $certfile) if(-f $certfile);
+print STDERR "RUN: $cmd\n" if($verbose);
#***************************************************************************
# Run tstunnel on Windows.
@@ -341,8 +342,10 @@ if($tstunnel_windows) {
}
# Put an "exec" in front of the command so that the child process
- # keeps this child's process ID.
+ # keeps this child's process ID by being tied to the spawned shell.
exec("exec $cmd") || die "Can't exec() $cmd: $!";
+ # exec() will create a new process, but ties the existence of the
+ # new process to the parent waiting perl.exe and sh.exe processes.
# exec() should never return back here to this process. We protect
# ourselves by calling die() just in case something goes really bad.
diff --git a/tests/server/CMakeLists.txt b/tests/server/CMakeLists.txt
index 78b9b7029..3bfa64921 100644
--- a/tests/server/CMakeLists.txt
+++ b/tests/server/CMakeLists.txt
@@ -1,11 +1,33 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
set(TARGET_LABEL_PREFIX "Test server ")
if(MSVC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127 /wd4306")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4306")
endif()
function(SETUP_EXECUTABLE TEST_NAME) # ARGN are the files in the test
- add_executable(${TEST_NAME} ${ARGN})
+ add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${ARGN})
+ add_dependencies(testdeps ${TEST_NAME})
string(TOUPPER ${TEST_NAME} UPPER_TEST_NAME)
include_directories(
diff --git a/tests/server/Makefile.am b/tests/server/Makefile.am
index ef3303ec1..ca306e29a 100644
--- a/tests/server/Makefile.am
+++ b/tests/server/Makefile.am
@@ -62,7 +62,7 @@ CS_1 =
CS_ = $(CS_0)
checksrc:
- $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+ $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
if CURLDEBUG
# for debug builds, we scan the sources on all regular make invokes
diff --git a/tests/server/Makefile.inc b/tests/server/Makefile.inc
index 6296af7cc..55bc3a737 100644
--- a/tests/server/Makefile.inc
+++ b/tests/server/Makefile.inc
@@ -1,18 +1,47 @@
-noinst_PROGRAMS = getpart resolve rtspd sockfilt sws tftpd fake_ntlm socksd disabled
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2009 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+noinst_PROGRAMS = getpart resolve rtspd sockfilt sws tftpd fake_ntlm \
+ socksd disabled mqttd
CURLX_SRCS = \
../../lib/mprintf.c \
../../lib/nonblock.c \
../../lib/strtoofft.c \
../../lib/warnless.c \
- ../../lib/curl_ctype.c
+ ../../lib/curl_ctype.c \
+ ../../lib/dynbuf.c \
+ ../../lib/strdup.c \
+ ../../lib/curl_multibyte.c
CURLX_HDRS = \
../../lib/curlx.h \
../../lib/nonblock.h \
../../lib/strtoofft.h \
../../lib/warnless.h \
- ../../lib/curl_ctype.h
+ ../../lib/curl_ctype.h \
+ ../../lib/dynbuf.h \
+ ../../lib/strdup.h \
+ ../../lib/curl_multibyte.h
USEFUL = \
getpart.c \
@@ -56,6 +85,12 @@ socksd_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
socksd_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
socksd_CFLAGS = $(AM_CFLAGS)
+mqttd_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
+ server_sockaddr.h mqttd.c \
+ ../../lib/inet_pton.c
+mqttd_LDADD = @CURL_NETWORK_AND_TIME_LIBS@
+mqttd_CFLAGS = $(AM_CFLAGS)
+
sws_SOURCES = $(CURLX_SRCS) $(CURLX_HDRS) $(USEFUL) $(UTIL) \
server_sockaddr.h \
sws.c \
diff --git a/tests/server/base64.pl b/tests/server/base64.pl
index 449c3103a..d00673ec9 100755
--- a/tests/server/base64.pl
+++ b/tests/server/base64.pl
@@ -1,4 +1,25 @@
#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2004 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
use MIME::Base64 qw(encode_base64);
diff --git a/tests/server/fake_ntlm.c b/tests/server/fake_ntlm.c
index c6e36b6f6..c9211f7ea 100644
--- a/tests/server/fake_ntlm.c
+++ b/tests/server/fake_ntlm.c
@@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010, Mandy Wu, <mandy.wu@intel.com>
- * Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2011 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -112,7 +112,6 @@ int main(int argc, char *argv[])
char buf[1024];
char logfilename[256];
FILE *stream;
- char *filename;
int error;
char *type1_input = NULL, *type3_input = NULL;
char *type1_output = NULL, *type3_output = NULL;
@@ -186,12 +185,10 @@ int main(int argc, char *argv[])
path = env;
}
- filename = test2file(testnum);
- stream = fopen(filename, "rb");
+ stream = test2fopen(testnum);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file %ld", testnum);
exit(1);
}
@@ -205,13 +202,11 @@ int main(int argc, char *argv[])
}
}
- stream = fopen(filename, "rb");
+ stream = test2fopen(testnum);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file %ld", testnum);
- exit(1);
}
else {
size = 0;
@@ -225,11 +220,10 @@ int main(int argc, char *argv[])
while(fgets(buf, sizeof(buf), stdin)) {
if(strcmp(buf, type1_input) == 0) {
- stream = fopen(filename, "rb");
+ stream = test2fopen(testnum);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file %ld", testnum);
exit(1);
}
@@ -247,11 +241,10 @@ int main(int argc, char *argv[])
fflush(stdout);
}
else if(strncmp(buf, type3_input, strlen(type3_input)) == 0) {
- stream = fopen(filename, "rb");
+ stream = test2fopen(testnum);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file %ld", testnum);
exit(1);
}
diff --git a/tests/server/getpart.c b/tests/server/getpart.c
index 044705d06..664d81569 100644
--- a/tests/server/getpart.c
+++ b/tests/server/getpart.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/server/getpart.h b/tests/server/getpart.h
index 277368519..e8ddd22aa 100644
--- a/tests/server/getpart.h
+++ b/tests/server/getpart.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/server/mqttd.c b/tests/server/mqttd.c
new file mode 100644
index 000000000..6785b0014
--- /dev/null
+++ b/tests/server/mqttd.c
@@ -0,0 +1,1018 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "server_setup.h"
+#include <stdlib.h>
+#include <string.h>
+#include "util.h"
+
+/* Function
+ *
+ * Accepts a TCP connection on a custom port (IPv4 or IPv6). Speaks MQTT.
+ *
+ * Read commands from FILE (set with --config). The commands control how to
+ * act and is reset to defaults each client TCP connect.
+ *
+ * Config file keywords:
+ *
+ * TODO
+ */
+
+/* based on sockfilt.c */
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET_IN6_H
+#include <netinet/in6.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#define ENABLE_CURLX_PRINTF
+/* make the curlx header define all printf() functions to use the curlx_*
+ versions instead */
+#include "curlx.h" /* from the private lib dir */
+#include "getpart.h"
+#include "inet_pton.h"
+#include "util.h"
+#include "server_sockaddr.h"
+#include "warnless.h"
+
+/* include memdebug.h last */
+#include "memdebug.h"
+
+#ifdef USE_WINSOCK
+#undef EINTR
+#define EINTR 4 /* errno.h value */
+#undef EAGAIN
+#define EAGAIN 11 /* errno.h value */
+#undef ENOMEM
+#define ENOMEM 12 /* errno.h value */
+#undef EINVAL
+#define EINVAL 22 /* errno.h value */
+#endif
+
+#define DEFAULT_PORT 1883 /* MQTT default port */
+
+#ifndef DEFAULT_LOGFILE
+#define DEFAULT_LOGFILE "log/mqttd.log"
+#endif
+
+#ifndef DEFAULT_CONFIG
+#define DEFAULT_CONFIG "mqttd.config"
+#endif
+
+#define MQTT_MSG_CONNECT 0x10
+#define MQTT_MSG_CONNACK 0x20
+#define MQTT_MSG_PUBLISH 0x30
+#define MQTT_MSG_PUBACK 0x40
+#define MQTT_MSG_SUBSCRIBE 0x82
+#define MQTT_MSG_SUBACK 0x90
+#define MQTT_MSG_DISCONNECT 0xe0
+
+#define MQTT_CONNACK_LEN 4
+#define MQTT_SUBACK_LEN 5
+#define MQTT_CLIENTID_LEN 12 /* "curl0123abcd" */
+#define MQTT_HEADER_LEN 5 /* max 5 bytes */
+
+struct configurable {
+ unsigned char version; /* initial version byte in the request must match
+ this */
+ bool publish_before_suback;
+ bool short_publish;
+ unsigned char error_connack;
+ int testnum;
+};
+
+#define REQUEST_DUMP "log/server.input"
+#define CONFIG_VERSION 5
+
+static struct configurable config;
+
+const char *serverlogfile = DEFAULT_LOGFILE;
+static const char *configfile = DEFAULT_CONFIG;
+
+#ifdef ENABLE_IPV6
+static bool use_ipv6 = FALSE;
+#endif
+static const char *ipv_inuse = "IPv4";
+static unsigned short port = DEFAULT_PORT;
+
+static void resetdefaults(void)
+{
+ logmsg("Reset to defaults");
+ config.version = CONFIG_VERSION;
+ config.publish_before_suback = FALSE;
+ config.short_publish = FALSE;
+ config.error_connack = 0;
+ config.testnum = 0;
+}
+
+static unsigned char byteval(char *value)
+{
+ unsigned long num = strtoul(value, NULL, 10);
+ return num & 0xff;
+}
+
+static void getconfig(void)
+{
+ FILE *fp = fopen(configfile, FOPEN_READTEXT);
+ resetdefaults();
+ if(fp) {
+ char buffer[512];
+ logmsg("parse config file");
+ while(fgets(buffer, sizeof(buffer), fp)) {
+ char key[32];
+ char value[32];
+ if(2 == sscanf(buffer, "%31s %31s", key, value)) {
+ if(!strcmp(key, "version")) {
+ config.version = byteval(value);
+ logmsg("version [%d] set", config.version);
+ }
+ else if(!strcmp(key, "PUBLISH-before-SUBACK")) {
+ logmsg("PUBLISH-before-SUBACK set");
+ config.publish_before_suback = TRUE;
+ }
+ else if(!strcmp(key, "short-PUBLISH")) {
+ logmsg("short-PUBLISH set");
+ config.short_publish = TRUE;
+ }
+ else if(!strcmp(key, "error-CONNACK")) {
+ config.error_connack = byteval(value);
+ logmsg("error-CONNACK = %d", config.error_connack);
+ }
+ else if(!strcmp(key, "Testnum")) {
+ config.testnum = atoi(value);
+ logmsg("testnum = %d", config.testnum);
+ }
+ }
+ }
+ fclose(fp);
+ }
+ else {
+ logmsg("No config file '%s' to read", configfile);
+ }
+}
+
+static void loghex(unsigned char *buffer, ssize_t len)
+{
+ char data[12000];
+ ssize_t i;
+ unsigned char *ptr = buffer;
+ char *optr = data;
+ ssize_t width = 0;
+ int left = sizeof(data);
+
+ for(i = 0; i<len && (left >= 0); i++) {
+ msnprintf(optr, left, "%02x", ptr[i]);
+ width += 2;
+ optr += 2;
+ left -= 2;
+ }
+ if(width)
+ logmsg("'%s'", data);
+}
+
+typedef enum {
+ FROM_CLIENT,
+ FROM_SERVER
+} mqttdir;
+
+static void logprotocol(mqttdir dir,
+ const char *prefix, size_t remlen,
+ FILE *output,
+ unsigned char *buffer, ssize_t len)
+{
+ char data[12000] = "";
+ ssize_t i;
+ unsigned char *ptr = buffer;
+ char *optr = data;
+ ssize_t width = 0;
+ int left = sizeof(data);
+
+ for(i = 0; i<len && (left >= 0); i++) {
+ msnprintf(optr, left, "%02x", ptr[i]);
+ width += 2;
+ optr += 2;
+ left -= 2;
+ }
+ fprintf(output, "%s %s %zx %s\n",
+ dir == FROM_CLIENT? "client": "server",
+ prefix, remlen,
+ data);
+}
+
+
+/* return 0 on success */
+static int connack(FILE *dump, curl_socket_t fd)
+{
+ unsigned char packet[]={
+ MQTT_MSG_CONNACK, 0x02,
+ 0x00, 0x00
+ };
+ ssize_t rc;
+
+ packet[3] = config.error_connack;
+
+ rc = swrite(fd, (char *)packet, sizeof(packet));
+ if(rc > 0) {
+ logmsg("WROTE %d bytes [CONNACK]", rc);
+ loghex(packet, rc);
+ logprotocol(FROM_SERVER, "CONNACK", 2, dump, packet, sizeof(packet));
+ }
+ if(rc == sizeof(packet)) {
+ return 0;
+ }
+ return 1;
+}
+
+/* return 0 on success */
+static int suback(FILE *dump, curl_socket_t fd, unsigned short packetid)
+{
+ unsigned char packet[]={
+ MQTT_MSG_SUBACK, 0x03,
+ 0, 0, /* filled in below */
+ 0x00
+ };
+ ssize_t rc;
+ packet[2] = (unsigned char)(packetid >> 8);
+ packet[3] = (unsigned char)(packetid & 0xff);
+
+ rc = swrite(fd, (char *)packet, sizeof(packet));
+ if(rc == sizeof(packet)) {
+ logmsg("WROTE %d bytes [SUBACK]", rc);
+ loghex(packet, rc);
+ logprotocol(FROM_SERVER, "SUBACK", 3, dump, packet, rc);
+ return 0;
+ }
+ return 1;
+}
+
+#ifdef QOS
+/* return 0 on success */
+static int puback(FILE *dump, curl_socket_t fd, unsigned short packetid)
+{
+ unsigned char packet[]={
+ MQTT_MSG_PUBACK, 0x00,
+ 0, 0 /* filled in below */
+ };
+ ssize_t rc;
+ packet[2] = (unsigned char)(packetid >> 8);
+ packet[3] = (unsigned char)(packetid & 0xff);
+
+ rc = swrite(fd, (char *)packet, sizeof(packet));
+ if(rc == sizeof(packet)) {
+ logmsg("WROTE %d bytes [PUBACK]", rc);
+ loghex(packet, rc);
+ logprotocol(FROM_SERVER, dump, packet, rc);
+ return 0;
+ }
+ logmsg("Failed sending [PUBACK]");
+ return 1;
+}
+#endif
+
+/* return 0 on success */
+static int disconnect(FILE *dump, curl_socket_t fd)
+{
+ unsigned char packet[]={
+ MQTT_MSG_DISCONNECT, 0x00,
+ };
+ ssize_t rc = swrite(fd, (char *)packet, sizeof(packet));
+ if(rc == sizeof(packet)) {
+ logmsg("WROTE %d bytes [DISCONNECT]", rc);
+ loghex(packet, rc);
+ logprotocol(FROM_SERVER, "DISCONNECT", 0, dump, packet, rc);
+ return 0;
+ }
+ logmsg("Failed sending [DISCONNECT]");
+ return 1;
+}
+
+
+
+/*
+ do
+
+ encodedByte = X MOD 128
+
+ X = X DIV 128
+
+ // if there are more data to encode, set the top bit of this byte
+
+ if ( X > 0 )
+
+ encodedByte = encodedByte OR 128
+
+ endif
+
+ 'output' encodedByte
+
+ while ( X > 0 )
+
+*/
+
+/* return number of bytes used */
+static int encode_length(size_t packetlen, char *remlength) /* 4 bytes */
+{
+ int bytes = 0;
+ unsigned char encode;
+
+ do {
+ encode = packetlen % 0x80;
+ packetlen /= 0x80;
+ if(packetlen)
+ encode |= 0x80;
+
+ remlength[bytes++] = encode;
+
+ if(bytes > 3) {
+ logmsg("too large packet!");
+ return 0;
+ }
+ } while(packetlen);
+
+ return bytes;
+}
+
+
+static size_t decode_length(unsigned char *buf,
+ size_t buflen, size_t *lenbytes)
+{
+ size_t len = 0;
+ size_t mult = 1;
+ size_t i;
+ unsigned char encoded = 0x80;
+
+ for(i = 0; (i < buflen) && (encoded & 0x80); i++) {
+ encoded = buf[i];
+ len += (encoded & 0x7f) * mult;
+ mult *= 0x80;
+ }
+
+ if(lenbytes)
+ *lenbytes = i;
+
+ return len;
+}
+
+
+/* return 0 on success */
+static int publish(FILE *dump,
+ curl_socket_t fd, unsigned short packetid,
+ char *topic, char *payload, size_t payloadlen)
+{
+ size_t topiclen = strlen(topic);
+ unsigned char *packet;
+ size_t payloadindex;
+ ssize_t remaininglength = topiclen + 2 + payloadlen;
+ ssize_t packetlen;
+ ssize_t sendamount;
+ ssize_t rc;
+ char rembuffer[4];
+ int encodedlen;
+
+ encodedlen = encode_length(remaininglength, rembuffer);
+
+ /* one packet type byte (possibly two more for packetid) */
+ packetlen = remaininglength + encodedlen + 1;
+ packet = malloc(packetlen);
+ if(!packet)
+ return 1;
+
+ packet[0] = MQTT_MSG_PUBLISH; /* TODO: set QoS? */
+ memcpy(&packet[1], rembuffer, encodedlen);
+
+ (void)packetid;
+ /* packet_id if QoS is set */
+
+ packet[1 + encodedlen] = (unsigned char)(topiclen >> 8);
+ packet[2 + encodedlen] = (unsigned char)(topiclen & 0xff);
+ memcpy(&packet[3 + encodedlen], topic, topiclen);
+
+ payloadindex = 3 + topiclen + encodedlen;
+ memcpy(&packet[payloadindex], payload, payloadlen);
+
+ sendamount = packetlen;
+ if(config.short_publish)
+ sendamount -= 2;
+
+ rc = swrite(fd, (char *)packet, sendamount);
+ if(rc > 0) {
+ logmsg("WROTE %d bytes [PUBLISH]", rc);
+ loghex(packet, rc);
+ logprotocol(FROM_SERVER, "PUBLISH", remaininglength, dump, packet, rc);
+ }
+ if(rc == packetlen)
+ return 0;
+ return 1;
+}
+
+#define MAX_TOPIC_LENGTH 65535
+#define MAX_CLIENT_ID_LENGTH 32
+
+static char topic[MAX_TOPIC_LENGTH + 1];
+
+static int fixedheader(curl_socket_t fd,
+ unsigned char *bytep,
+ size_t *remaining_lengthp,
+ size_t *remaining_length_bytesp)
+{
+ /* get the fixed header */
+ unsigned char buffer[10];
+
+ /* get the first two bytes */
+ ssize_t rc = sread(fd, (char *)buffer, 2);
+ int i;
+ if(rc < 2) {
+ logmsg("READ %d bytes [SHORT!]", rc);
+ return 1; /* fail */
+ }
+ logmsg("READ %d bytes", rc);
+ loghex(buffer, rc);
+ *bytep = buffer[0];
+
+ /* if the length byte has the top bit set, get the next one too */
+ i = 1;
+ while(buffer[i] & 0x80) {
+ i++;
+ rc = sread(fd, (char *)&buffer[i], 1);
+ if(rc != 1) {
+ logmsg("Remaining Length broken");
+ return 1;
+ }
+ }
+ *remaining_lengthp = decode_length(&buffer[1], i, remaining_length_bytesp);
+ logmsg("Remaining Length: %ld [%d bytes]", (long) *remaining_lengthp,
+ *remaining_length_bytesp);
+ return 0;
+}
+
+static curl_socket_t mqttit(curl_socket_t fd)
+{
+ unsigned char buffer[10*1024];
+ ssize_t rc;
+ unsigned char byte;
+ unsigned short packet_id;
+ size_t payload_len;
+ unsigned int topic_len;
+ size_t remaining_length = 0;
+ size_t bytes = 0; /* remaining length field size in bytes */
+ char client_id[MAX_CLIENT_ID_LENGTH];
+ long testno;
+
+ static const char protocol[7] = {
+ 0x00, 0x04, /* protocol length */
+ 'M','Q','T','T', /* protocol name */
+ 0x04 /* protocol level */
+ };
+ FILE *dump = fopen(REQUEST_DUMP, "ab");
+ if(!dump)
+ goto end;
+
+ getconfig();
+
+ testno = config.testnum;
+
+ if(testno)
+ logmsg("Found test number %ld", testno);
+
+ do {
+ /* get the fixed header */
+ rc = fixedheader(fd, &byte, &remaining_length, &bytes);
+ if(rc)
+ break;
+ if(remaining_length) {
+ rc = sread(fd, (char *)buffer, remaining_length);
+ if(rc > 0) {
+ logmsg("READ %d bytes", rc);
+ loghex(buffer, rc);
+ }
+ }
+
+ if(byte == MQTT_MSG_CONNECT) {
+ logprotocol(FROM_CLIENT, "CONNECT", remaining_length,
+ dump, buffer, rc);
+
+ if(memcmp(protocol, buffer, sizeof(protocol))) {
+ logmsg("Protocol preamble mismatch");
+ goto end;
+ }
+ /* ignore the connect flag byte and two keepalive bytes */
+
+ payload_len = (buffer[10] << 8) | buffer[11];
+ if((ssize_t)payload_len != (rc - 12)) {
+ logmsg("Payload length mismatch, expected %x got %x",
+ rc - 12, payload_len);
+ goto end;
+ }
+ else if((payload_len + 1) > MAX_CLIENT_ID_LENGTH) {
+ logmsg("Too large client id");
+ goto end;
+ }
+ memcpy(client_id, &buffer[14], payload_len);
+ client_id[payload_len] = 0;
+
+ logmsg("MQTT client connect accepted: %s", client_id);
+
+ /* The first packet sent from the Server to the Client MUST be a
+ CONNACK Packet */
+
+ if(connack(dump, fd)) {
+ logmsg("failed sending CONNACK");
+ goto end;
+ }
+ }
+ else if(byte == MQTT_MSG_SUBSCRIBE) {
+ FILE *stream;
+ int error;
+ char *data;
+ size_t datalen;
+ logprotocol(FROM_CLIENT, "SUBSCRIBE", remaining_length,
+ dump, buffer, rc);
+ logmsg("Incoming SUBSCRIBE");
+
+ if(rc < 6) {
+ logmsg("Too small SUBSCRIBE");
+ goto end;
+ }
+
+ /* two bytes packet id */
+ packet_id = (unsigned short)((buffer[0] << 8) | buffer[1]);
+
+ /* two bytes topic length */
+ topic_len = (buffer[2] << 8) | buffer[3];
+ if(topic_len != (remaining_length - 5)) {
+ logmsg("Wrong topic length, got %d expected %d",
+ topic_len, remaining_length - 5);
+ goto end;
+ }
+ memcpy(topic, &buffer[4], topic_len);
+ topic[topic_len] = 0;
+
+ /* there's a QoS byte (two bits) after the topic */
+
+ logmsg("SUBSCRIBE to '%s' [%d]", topic, packet_id);
+ stream = test2fopen(testno);
+ error = getpart(&data, &datalen, "reply", "data", stream);
+ if(!error) {
+ if(!config.publish_before_suback) {
+ if(suback(dump, fd, packet_id)) {
+ logmsg("failed sending SUBACK");
+ goto end;
+ }
+ }
+ if(publish(dump, fd, packet_id, topic, data, datalen)) {
+ logmsg("PUBLISH failed");
+ goto end;
+ }
+ if(config.publish_before_suback) {
+ if(suback(dump, fd, packet_id)) {
+ logmsg("failed sending SUBACK");
+ goto end;
+ }
+ }
+ }
+ else {
+ char *def = (char *)"this is random payload yes yes it is";
+ publish(dump, fd, packet_id, topic, def, strlen(def));
+ }
+ disconnect(dump, fd);
+ }
+ else if((byte & 0xf0) == (MQTT_MSG_PUBLISH & 0xf0)) {
+ size_t topiclen;
+
+ logmsg("Incoming PUBLISH");
+ logprotocol(FROM_CLIENT, "PUBLISH", remaining_length,
+ dump, buffer, rc);
+
+ topiclen = (buffer[1 + bytes] << 8) | buffer[2 + bytes];
+ logmsg("Got %d bytes topic", topiclen);
+ /* TODO: verify topiclen */
+
+#ifdef QOS
+ /* TODO: handle packetid if there is one. Send puback if QoS > 0 */
+ puback(dump, fd, 0);
+#endif
+ /* expect a disconnect here */
+ /* get the request */
+ rc = sread(fd, (char *)&buffer[0], 2);
+
+ logmsg("READ %d bytes [DISCONNECT]", rc);
+ loghex(buffer, rc);
+ logprotocol(FROM_CLIENT, "DISCONNECT", 0, dump, buffer, rc);
+ goto end;
+ }
+ else {
+ /* not supported (yet) */
+ goto end;
+ }
+ } while(1);
+
+ end:
+ fclose(dump);
+ return CURL_SOCKET_BAD;
+}
+
+/*
+ sockfdp is a pointer to an established stream or CURL_SOCKET_BAD
+
+ if sockfd is CURL_SOCKET_BAD, listendfd is a listening socket we must
+ accept()
+*/
+static bool incoming(curl_socket_t listenfd)
+{
+ fd_set fds_read;
+ fd_set fds_write;
+ fd_set fds_err;
+ int clients = 0; /* connected clients */
+
+ if(got_exit_signal) {
+ logmsg("signalled to die, exiting...");
+ return FALSE;
+ }
+
+#ifdef HAVE_GETPPID
+ /* As a last resort, quit if socks5 process becomes orphan. */
+ if(getppid() <= 1) {
+ logmsg("process becomes orphan, exiting");
+ return FALSE;
+ }
+#endif
+
+ do {
+ ssize_t rc;
+ int error = 0;
+ curl_socket_t sockfd = listenfd;
+ int maxfd = (int)sockfd;
+
+ FD_ZERO(&fds_read);
+ FD_ZERO(&fds_write);
+ FD_ZERO(&fds_err);
+
+ /* there's always a socket to wait for */
+ FD_SET(sockfd, &fds_read);
+
+ do {
+ /* select() blocking behavior call on blocking descriptors please */
+ rc = select(maxfd + 1, &fds_read, &fds_write, &fds_err, NULL);
+ if(got_exit_signal) {
+ logmsg("signalled to die, exiting...");
+ return FALSE;
+ }
+ } while((rc == -1) && ((error = SOCKERRNO) == EINTR));
+
+ if(rc < 0) {
+ logmsg("select() failed with error: (%d) %s",
+ error, strerror(error));
+ return FALSE;
+ }
+
+ if(FD_ISSET(sockfd, &fds_read)) {
+ curl_socket_t newfd = accept(sockfd, NULL, NULL);
+ if(CURL_SOCKET_BAD == newfd) {
+ error = SOCKERRNO;
+ logmsg("accept(%d, NULL, NULL) failed with error: (%d) %s",
+ sockfd, error, strerror(error));
+ }
+ else {
+ logmsg("====> Client connect, fd %d. Read config from %s",
+ newfd, configfile);
+ set_advisor_read_lock(SERVERLOGS_LOCK);
+ (void)mqttit(newfd); /* until done */
+ clear_advisor_read_lock(SERVERLOGS_LOCK);
+
+ logmsg("====> Client disconnect");
+ sclose(newfd);
+ }
+ }
+ } while(clients);
+
+ return TRUE;
+}
+
+static curl_socket_t sockdaemon(curl_socket_t sock,
+ unsigned short *listenport)
+{
+ /* passive daemon style */
+ srvr_sockaddr_union_t listener;
+ int flag;
+ int rc;
+ int totdelay = 0;
+ int maxretr = 10;
+ int delay = 20;
+ int attempt = 0;
+ int error = 0;
+
+ do {
+ attempt++;
+ flag = 1;
+ rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
+ (void *)&flag, sizeof(flag));
+ if(rc) {
+ error = SOCKERRNO;
+ logmsg("setsockopt(SO_REUSEADDR) failed with error: (%d) %s",
+ error, strerror(error));
+ if(maxretr) {
+ rc = wait_ms(delay);
+ if(rc) {
+ /* should not happen */
+ logmsg("wait_ms() failed with error: %d", rc);
+ sclose(sock);
+ return CURL_SOCKET_BAD;
+ }
+ if(got_exit_signal) {
+ logmsg("signalled to die, exiting...");
+ sclose(sock);
+ return CURL_SOCKET_BAD;
+ }
+ totdelay += delay;
+ delay *= 2; /* double the sleep for next attempt */
+ }
+ }
+ } while(rc && maxretr--);
+
+ if(rc) {
+ logmsg("setsockopt(SO_REUSEADDR) failed %d times in %d ms. Error: (%d) %s",
+ attempt, totdelay, error, strerror(error));
+ logmsg("Continuing anyway...");
+ }
+
+ /* When the specified listener port is zero, it is actually a
+ request to let the system choose a non-zero available port. */
+
+#ifdef ENABLE_IPV6
+ if(!use_ipv6) {
+#endif
+ memset(&listener.sa4, 0, sizeof(listener.sa4));
+ listener.sa4.sin_family = AF_INET;
+ listener.sa4.sin_addr.s_addr = INADDR_ANY;
+ listener.sa4.sin_port = htons(*listenport);
+ rc = bind(sock, &listener.sa, sizeof(listener.sa4));
+#ifdef ENABLE_IPV6
+ }
+ else {
+ memset(&listener.sa6, 0, sizeof(listener.sa6));
+ listener.sa6.sin6_family = AF_INET6;
+ listener.sa6.sin6_addr = in6addr_any;
+ listener.sa6.sin6_port = htons(*listenport);
+ rc = bind(sock, &listener.sa, sizeof(listener.sa6));
+ }
+#endif /* ENABLE_IPV6 */
+ if(rc) {
+ error = SOCKERRNO;
+ logmsg("Error binding socket on port %hu: (%d) %s",
+ *listenport, error, strerror(error));
+ sclose(sock);
+ return CURL_SOCKET_BAD;
+ }
+
+ if(!*listenport) {
+ /* The system was supposed to choose a port number, figure out which
+ port we actually got and update the listener port value with it. */
+ curl_socklen_t la_size;
+ srvr_sockaddr_union_t localaddr;
+#ifdef ENABLE_IPV6
+ if(!use_ipv6)
+#endif
+ la_size = sizeof(localaddr.sa4);
+#ifdef ENABLE_IPV6
+ else
+ la_size = sizeof(localaddr.sa6);
+#endif
+ memset(&localaddr.sa, 0, (size_t)la_size);
+ if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
+ error = SOCKERRNO;
+ logmsg("getsockname() failed with error: (%d) %s",
+ error, strerror(error));
+ sclose(sock);
+ return CURL_SOCKET_BAD;
+ }
+ switch(localaddr.sa.sa_family) {
+ case AF_INET:
+ *listenport = ntohs(localaddr.sa4.sin_port);
+ break;
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ *listenport = ntohs(localaddr.sa6.sin6_port);
+ break;
+#endif
+ default:
+ break;
+ }
+ if(!*listenport) {
+ /* Real failure, listener port shall not be zero beyond this point. */
+ logmsg("Apparently getsockname() succeeded, with listener port zero.");
+ logmsg("A valid reason for this failure is a binary built without");
+ logmsg("proper network library linkage. This might not be the only");
+ logmsg("reason, but double check it before anything else.");
+ sclose(sock);
+ return CURL_SOCKET_BAD;
+ }
+ }
+
+ /* start accepting connections */
+ rc = listen(sock, 5);
+ if(0 != rc) {
+ error = SOCKERRNO;
+ logmsg("listen(%d, 5) failed with error: (%d) %s",
+ sock, error, strerror(error));
+ sclose(sock);
+ return CURL_SOCKET_BAD;
+ }
+
+ return sock;
+}
+
+
+int main(int argc, char *argv[])
+{
+ curl_socket_t sock = CURL_SOCKET_BAD;
+ curl_socket_t msgsock = CURL_SOCKET_BAD;
+ int wrotepidfile = 0;
+ int wroteportfile = 0;
+ const char *pidname = ".mqttd.pid";
+ const char *portname = ".mqttd.port";
+ bool juggle_again;
+ int error;
+ int arg = 1;
+
+ while(argc>arg) {
+ if(!strcmp("--version", argv[arg])) {
+ printf("mqttd IPv4%s\n",
+#ifdef ENABLE_IPV6
+ "/IPv6"
+#else
+ ""
+#endif
+ );
+ return 0;
+ }
+ else if(!strcmp("--pidfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ pidname = argv[arg++];
+ }
+ else if(!strcmp("--portfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ portname = argv[arg++];
+ }
+ else if(!strcmp("--config", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ configfile = argv[arg++];
+ }
+ else if(!strcmp("--logfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ serverlogfile = argv[arg++];
+ }
+ else if(!strcmp("--ipv6", argv[arg])) {
+#ifdef ENABLE_IPV6
+ ipv_inuse = "IPv6";
+ use_ipv6 = TRUE;
+#endif
+ arg++;
+ }
+ else if(!strcmp("--ipv4", argv[arg])) {
+ /* for completeness, we support this option as well */
+#ifdef ENABLE_IPV6
+ ipv_inuse = "IPv4";
+ use_ipv6 = FALSE;
+#endif
+ arg++;
+ }
+ else if(!strcmp("--port", argv[arg])) {
+ arg++;
+ if(argc>arg) {
+ char *endptr;
+ unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
+ if((endptr != argv[arg] + strlen(argv[arg])) ||
+ ((ulnum != 0UL) && ((ulnum < 1025UL) || (ulnum > 65535UL)))) {
+ fprintf(stderr, "mqttd: invalid --port argument (%s)\n",
+ argv[arg]);
+ return 0;
+ }
+ port = curlx_ultous(ulnum);
+ arg++;
+ }
+ }
+ else {
+ puts("Usage: mqttd [option]\n"
+ " --config [file]\n"
+ " --version\n"
+ " --logfile [file]\n"
+ " --pidfile [file]\n"
+ " --ipv4\n"
+ " --ipv6\n"
+ " --port [port]\n");
+ return 0;
+ }
+ }
+
+#ifdef WIN32
+ win32_init();
+ atexit(win32_cleanup);
+
+ setmode(fileno(stdin), O_BINARY);
+ setmode(fileno(stdout), O_BINARY);
+ setmode(fileno(stderr), O_BINARY);
+#endif
+
+ install_signal_handlers(FALSE);
+
+#ifdef ENABLE_IPV6
+ if(!use_ipv6)
+#endif
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+#ifdef ENABLE_IPV6
+ else
+ sock = socket(AF_INET6, SOCK_STREAM, 0);
+#endif
+
+ if(CURL_SOCKET_BAD == sock) {
+ error = SOCKERRNO;
+ logmsg("Error creating socket: (%d) %s",
+ error, strerror(error));
+ goto mqttd_cleanup;
+ }
+
+ {
+ /* passive daemon style */
+ sock = sockdaemon(sock, &port);
+ if(CURL_SOCKET_BAD == sock) {
+ goto mqttd_cleanup;
+ }
+ msgsock = CURL_SOCKET_BAD; /* no stream socket yet */
+ }
+
+ logmsg("Running %s version", ipv_inuse);
+ logmsg("Listening on port %hu", port);
+
+ wrotepidfile = write_pidfile(pidname);
+ if(!wrotepidfile) {
+ goto mqttd_cleanup;
+ }
+
+ wroteportfile = write_portfile(portname, (int)port);
+ if(!wroteportfile) {
+ goto mqttd_cleanup;
+ }
+
+ do {
+ juggle_again = incoming(sock);
+ } while(juggle_again);
+
+mqttd_cleanup:
+
+ if((msgsock != sock) && (msgsock != CURL_SOCKET_BAD))
+ sclose(msgsock);
+
+ if(sock != CURL_SOCKET_BAD)
+ sclose(sock);
+
+ if(wrotepidfile)
+ unlink(pidname);
+
+ restore_signal_handlers(FALSE);
+
+ if(got_exit_signal) {
+ logmsg("============> mqttd exits with signal (%d)", exit_signal);
+ /*
+ * To properly set the return status of the process we
+ * must raise the same signal SIGINT or SIGTERM that we
+ * caught and let the old handler take care of it.
+ */
+ raise(exit_signal);
+ }
+
+ logmsg("============> mqttd quits");
+ return 0;
+}
diff --git a/tests/server/resolve.c b/tests/server/resolve.c
index 4cbdba6ec..f72561879 100644
--- a/tests/server/resolve.c
+++ b/tests/server/resolve.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -68,7 +68,7 @@ int main(int argc, char *argv[])
while(argc>arg) {
if(!strcmp("--version", argv[arg])) {
printf("resolve IPv4%s\n",
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
"/IPv6"
#else
""
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
puts("Usage: resolve [option] <host>\n"
" --version\n"
" --ipv4"
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
"\n --ipv6"
#endif
);
@@ -107,7 +107,7 @@ int main(int argc, char *argv[])
atexit(win32_cleanup);
#endif
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
if(use_ipv6) {
/* Check that the system has IPv6 enabled before checking the resolver */
curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
@@ -127,7 +127,7 @@ int main(int argc, char *argv[])
memset(&hints, 0, sizeof(hints));
hints.ai_family = use_ipv6 ? PF_INET6 : PF_INET;
hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_CANONNAME;
+ hints.ai_flags = 0;
/* Use parenthesis around functions to stop them from being replaced by
the macro in memdebug.h */
rc = (getaddrinfo)(host, "80", &hints, &ai);
diff --git a/tests/server/rtspd.c b/tests/server/rtspd.c
index 7563fd22a..6ee7787b1 100644
--- a/tests/server/rtspd.c
+++ b/tests/server/rtspd.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -201,138 +201,6 @@ static const char *doc404_RTSP = "RTSP/1.0 404 Not Found\r\n"
#define RTP_DATA_SIZE 12
static const char *RTP_DATA = "$_1234\n\0asdf";
-/* do-nothing macro replacement for systems which lack siginterrupt() */
-
-#ifndef HAVE_SIGINTERRUPT
-#define siginterrupt(x,y) do {} while(0)
-#endif
-
-/* vars used to keep around previous signal handlers */
-
-typedef RETSIGTYPE (*SIGHANDLER_T)(int);
-
-#ifdef SIGHUP
-static SIGHANDLER_T old_sighup_handler = SIG_ERR;
-#endif
-
-#ifdef SIGPIPE
-static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
-#endif
-
-#ifdef SIGALRM
-static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
-#endif
-
-#ifdef SIGINT
-static SIGHANDLER_T old_sigint_handler = SIG_ERR;
-#endif
-
-#ifdef SIGTERM
-static SIGHANDLER_T old_sigterm_handler = SIG_ERR;
-#endif
-
-#if defined(SIGBREAK) && defined(WIN32)
-static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
-#endif
-
-/* var which if set indicates that the program should finish execution */
-
-SIG_ATOMIC_T got_exit_signal = 0;
-
-/* if next is set indicates the first signal handled in exit_signal_handler */
-
-static volatile int exit_signal = 0;
-
-/* signal handler that will be triggered to indicate that the program
- should finish its execution in a controlled manner as soon as possible.
- The first time this is called it will set got_exit_signal to one and
- store in exit_signal the signal that triggered its execution. */
-
-static RETSIGTYPE exit_signal_handler(int signum)
-{
- int old_errno = errno;
- if(got_exit_signal == 0) {
- got_exit_signal = 1;
- exit_signal = signum;
- }
- (void)signal(signum, exit_signal_handler);
- errno = old_errno;
-}
-
-static void install_signal_handlers(void)
-{
-#ifdef SIGHUP
- /* ignore SIGHUP signal */
- old_sighup_handler = signal(SIGHUP, SIG_IGN);
- if(old_sighup_handler == SIG_ERR)
- logmsg("cannot install SIGHUP handler: %s", strerror(errno));
-#endif
-#ifdef SIGPIPE
- /* ignore SIGPIPE signal */
- old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
- if(old_sigpipe_handler == SIG_ERR)
- logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
-#endif
-#ifdef SIGALRM
- /* ignore SIGALRM signal */
- old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
- if(old_sigalrm_handler == SIG_ERR)
- logmsg("cannot install SIGALRM handler: %s", strerror(errno));
-#endif
-#ifdef SIGINT
- /* handle SIGINT signal with our exit_signal_handler */
- old_sigint_handler = signal(SIGINT, exit_signal_handler);
- if(old_sigint_handler == SIG_ERR)
- logmsg("cannot install SIGINT handler: %s", strerror(errno));
- else
- siginterrupt(SIGINT, 1);
-#endif
-#ifdef SIGTERM
- /* handle SIGTERM signal with our exit_signal_handler */
- old_sigterm_handler = signal(SIGTERM, exit_signal_handler);
- if(old_sigterm_handler == SIG_ERR)
- logmsg("cannot install SIGTERM handler: %s", strerror(errno));
- else
- siginterrupt(SIGTERM, 1);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- /* handle SIGBREAK signal with our exit_signal_handler */
- old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
- if(old_sigbreak_handler == SIG_ERR)
- logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
- else
- siginterrupt(SIGBREAK, 1);
-#endif
-}
-
-static void restore_signal_handlers(void)
-{
-#ifdef SIGHUP
- if(SIG_ERR != old_sighup_handler)
- (void)signal(SIGHUP, old_sighup_handler);
-#endif
-#ifdef SIGPIPE
- if(SIG_ERR != old_sigpipe_handler)
- (void)signal(SIGPIPE, old_sigpipe_handler);
-#endif
-#ifdef SIGALRM
- if(SIG_ERR != old_sigalrm_handler)
- (void)signal(SIGALRM, old_sigalrm_handler);
-#endif
-#ifdef SIGINT
- if(SIG_ERR != old_sigint_handler)
- (void)signal(SIGINT, old_sigint_handler);
-#endif
-#ifdef SIGTERM
- if(SIG_ERR != old_sigterm_handler)
- (void)signal(SIGTERM, old_sigterm_handler);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- if(SIG_ERR != old_sigbreak_handler)
- (void)signal(SIGBREAK, old_sigbreak_handler);
-#endif
-}
-
static int ProcessRequest(struct httprequest *req)
{
char *line = &req->reqbuf[req->checkindex];
@@ -379,8 +247,6 @@ static int ProcessRequest(struct httprequest *req)
/* get the number after it */
if(ptr) {
FILE *stream;
- char *filename;
-
if((strlen(doc) + strlen(request)) < 200)
msnprintf(logbuf, sizeof(logbuf), "Got request: %s %s %s/%d.%d",
request, doc, prot_str, prot_major, prot_minor);
@@ -420,13 +286,11 @@ static int ProcessRequest(struct httprequest *req)
req->testno, req->partno);
logmsg("%s", logbuf);
- filename = test2file(req->testno);
+ stream = test2fopen(req->testno);
- stream = fopen(filename, "rb");
if(!stream) {
int error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file %ld", req->testno);
req->open = FALSE; /* closes connection */
return 1; /* done */
@@ -981,17 +845,13 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
count = strlen(buffer);
}
else {
- char *filename = test2file(req->testno);
+ FILE *stream = test2fopen(req->testno);
char partbuf[80]="data";
- FILE *stream;
if(0 != req->partno)
msnprintf(partbuf, sizeof(partbuf), "data%ld", req->partno);
-
- stream = fopen(filename, "rb");
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file");
return 0;
}
@@ -1011,11 +871,10 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
}
/* re-open the same file again */
- stream = fopen(filename, "rb");
+ stream = test2fopen(req->testno);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", filename);
logmsg("Couldn't open test file");
free(ptr);
return 0;
@@ -1190,6 +1049,7 @@ int main(int argc, char *argv[])
int flag;
unsigned short port = DEFAULT_PORT;
const char *pidname = ".rtsp.pid";
+ const char *portfile = NULL;
struct httprequest req;
int rc;
int error;
@@ -1216,6 +1076,11 @@ int main(int argc, char *argv[])
if(argc>arg)
pidname = argv[arg++];
}
+ else if(!strcmp("--portfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ portfile = argv[arg++];
+ }
else if(!strcmp("--logfile", argv[arg])) {
arg++;
if(argc>arg)
@@ -1240,12 +1105,6 @@ int main(int argc, char *argv[])
if(argc>arg) {
char *endptr;
unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
- if((endptr != argv[arg] + strlen(argv[arg])) ||
- (ulnum < 1025UL) || (ulnum > 65535UL)) {
- fprintf(stderr, "rtspd: invalid --port argument (%s)\n",
- argv[arg]);
- return 0;
- }
port = curlx_ultous(ulnum);
arg++;
}
@@ -1262,6 +1121,7 @@ int main(int argc, char *argv[])
" --version\n"
" --logfile [file]\n"
" --pidfile [file]\n"
+ " --portfile [file]\n"
" --ipv4\n"
" --ipv6\n"
" --port [port]\n"
@@ -1275,7 +1135,7 @@ int main(int argc, char *argv[])
atexit(win32_cleanup);
#endif
- install_signal_handlers();
+ install_signal_handlers(false);
pid = (long)getpid();
@@ -1329,6 +1189,49 @@ int main(int argc, char *argv[])
goto server_cleanup;
}
+ if(!port) {
+ /* The system was supposed to choose a port number, figure out which
+ port we actually got and update the listener port value with it. */
+ curl_socklen_t la_size;
+ srvr_sockaddr_union_t localaddr;
+#ifdef ENABLE_IPV6
+ if(!use_ipv6)
+#endif
+ la_size = sizeof(localaddr.sa4);
+#ifdef ENABLE_IPV6
+ else
+ la_size = sizeof(localaddr.sa6);
+#endif
+ memset(&localaddr.sa, 0, (size_t)la_size);
+ if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
+ error = SOCKERRNO;
+ logmsg("getsockname() failed with error: (%d) %s",
+ error, strerror(error));
+ sclose(sock);
+ goto server_cleanup;
+ }
+ switch(localaddr.sa.sa_family) {
+ case AF_INET:
+ port = ntohs(localaddr.sa4.sin_port);
+ break;
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ port = ntohs(localaddr.sa6.sin6_port);
+ break;
+#endif
+ default:
+ break;
+ }
+ if(!port) {
+ /* Real failure, listener port shall not be zero beyond this point. */
+ logmsg("Apparently getsockname() succeeded, with listener port zero.");
+ logmsg("A valid reason for this failure is a binary built without");
+ logmsg("proper network library linkage. This might not be the only");
+ logmsg("reason, but double check it before anything else.");
+ sclose(sock);
+ goto server_cleanup;
+ }
+ }
logmsg("Running %s version on port %d", ipv_inuse, (int)port);
/* start accepting connections */
@@ -1349,6 +1252,12 @@ int main(int argc, char *argv[])
if(!wrotepidfile)
goto server_cleanup;
+ if(portfile) {
+ wrotepidfile = write_portfile(portfile, port);
+ if(!wrotepidfile)
+ goto server_cleanup;
+ }
+
for(;;) {
msgsock = accept(sock, NULL, NULL);
@@ -1465,7 +1374,7 @@ server_cleanup:
clear_advisor_read_lock(SERVERLOGS_LOCK);
}
- restore_signal_handlers();
+ restore_signal_handlers(false);
if(got_exit_signal) {
logmsg("========> %s rtspd (port: %d pid: %ld) exits with signal (%d)",
diff --git a/tests/server/server_setup.h b/tests/server/server_setup.h
index 76c462369..1f2cef10c 100644
--- a/tests/server/server_setup.h
+++ b/tests/server/server_setup.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/server/server_sockaddr.h b/tests/server/server_sockaddr.h
index bbcab8346..c3602e1cf 100644
--- a/tests/server/server_sockaddr.h
+++ b/tests/server/server_sockaddr.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c
index 569be6f6c..f5281817d 100644
--- a/tests/server/sockfilt.c
+++ b/tests/server/sockfilt.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -75,7 +75,7 @@
* structured and well behaved manner to achieve proper program cleanup and
* termination.
*
- * Even with the above mechanism implemented it is worthwile to note that
+ * Even with the above mechanism implemented it is worthwhile to note that
* other signals might still be received, or that there might be systems on
* which it is not possible to trap and ignore some of the above signals.
* This implies that for increased portability and reliability the program
@@ -147,138 +147,6 @@ enum sockmode {
ACTIVE_DISCONNECT /* as a client, disconnected from server */
};
-/* do-nothing macro replacement for systems which lack siginterrupt() */
-
-#ifndef HAVE_SIGINTERRUPT
-#define siginterrupt(x,y) do {} while(0)
-#endif
-
-/* vars used to keep around previous signal handlers */
-
-typedef RETSIGTYPE (*SIGHANDLER_T)(int);
-
-#ifdef SIGHUP
-static SIGHANDLER_T old_sighup_handler = SIG_ERR;
-#endif
-
-#ifdef SIGPIPE
-static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
-#endif
-
-#ifdef SIGALRM
-static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
-#endif
-
-#ifdef SIGINT
-static SIGHANDLER_T old_sigint_handler = SIG_ERR;
-#endif
-
-#ifdef SIGTERM
-static SIGHANDLER_T old_sigterm_handler = SIG_ERR;
-#endif
-
-#if defined(SIGBREAK) && defined(WIN32)
-static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
-#endif
-
-/* var which if set indicates that the program should finish execution */
-
-SIG_ATOMIC_T got_exit_signal = 0;
-
-/* if next is set indicates the first signal handled in exit_signal_handler */
-
-static volatile int exit_signal = 0;
-
-/* signal handler that will be triggered to indicate that the program
- should finish its execution in a controlled manner as soon as possible.
- The first time this is called it will set got_exit_signal to one and
- store in exit_signal the signal that triggered its execution. */
-
-static RETSIGTYPE exit_signal_handler(int signum)
-{
- int old_errno = errno;
- if(got_exit_signal == 0) {
- got_exit_signal = 1;
- exit_signal = signum;
- }
- (void)signal(signum, exit_signal_handler);
- errno = old_errno;
-}
-
-static void install_signal_handlers(void)
-{
-#ifdef SIGHUP
- /* ignore SIGHUP signal */
- old_sighup_handler = signal(SIGHUP, SIG_IGN);
- if(old_sighup_handler == SIG_ERR)
- logmsg("cannot install SIGHUP handler: %s", strerror(errno));
-#endif
-#ifdef SIGPIPE
- /* ignore SIGPIPE signal */
- old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
- if(old_sigpipe_handler == SIG_ERR)
- logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
-#endif
-#ifdef SIGALRM
- /* ignore SIGALRM signal */
- old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
- if(old_sigalrm_handler == SIG_ERR)
- logmsg("cannot install SIGALRM handler: %s", strerror(errno));
-#endif
-#ifdef SIGINT
- /* handle SIGINT signal with our exit_signal_handler */
- old_sigint_handler = signal(SIGINT, exit_signal_handler);
- if(old_sigint_handler == SIG_ERR)
- logmsg("cannot install SIGINT handler: %s", strerror(errno));
- else
- siginterrupt(SIGINT, 1);
-#endif
-#ifdef SIGTERM
- /* handle SIGTERM signal with our exit_signal_handler */
- old_sigterm_handler = signal(SIGTERM, exit_signal_handler);
- if(old_sigterm_handler == SIG_ERR)
- logmsg("cannot install SIGTERM handler: %s", strerror(errno));
- else
- siginterrupt(SIGTERM, 1);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- /* handle SIGBREAK signal with our exit_signal_handler */
- old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
- if(old_sigbreak_handler == SIG_ERR)
- logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
- else
- siginterrupt(SIGBREAK, 1);
-#endif
-}
-
-static void restore_signal_handlers(void)
-{
-#ifdef SIGHUP
- if(SIG_ERR != old_sighup_handler)
- (void)signal(SIGHUP, old_sighup_handler);
-#endif
-#ifdef SIGPIPE
- if(SIG_ERR != old_sigpipe_handler)
- (void)signal(SIGPIPE, old_sigpipe_handler);
-#endif
-#ifdef SIGALRM
- if(SIG_ERR != old_sigalrm_handler)
- (void)signal(SIGALRM, old_sigalrm_handler);
-#endif
-#ifdef SIGINT
- if(SIG_ERR != old_sigint_handler)
- (void)signal(SIGINT, old_sigint_handler);
-#endif
-#ifdef SIGTERM
- if(SIG_ERR != old_sigterm_handler)
- (void)signal(SIGTERM, old_sigterm_handler);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- if(SIG_ERR != old_sigbreak_handler)
- (void)signal(SIGBREAK, old_sigbreak_handler);
-#endif
-}
-
#ifdef WIN32
/*
* read-wrapper to support reading from stdin on Windows.
@@ -532,22 +400,26 @@ static void lograw(unsigned char *buffer, ssize_t len)
*/
struct select_ws_wait_data {
HANDLE handle; /* actual handle to wait for during select */
- HANDLE event; /* internal event to abort waiting thread */
+ HANDLE signal; /* internal event to signal handle trigger */
+ HANDLE abort; /* internal event to abort waiting thread */
+ HANDLE mutex; /* mutex to prevent event race-condition */
};
static DWORD WINAPI select_ws_wait_thread(LPVOID lpParameter)
{
struct select_ws_wait_data *data;
- HANDLE handle, handles[2];
+ HANDLE mutex, signal, handle, handles[2];
INPUT_RECORD inputrecord;
LARGE_INTEGER size, pos;
- DWORD type, length;
+ DWORD type, length, ret;
/* retrieve handles from internal structure */
data = (struct select_ws_wait_data *) lpParameter;
if(data) {
handle = data->handle;
- handles[0] = data->event;
+ handles[0] = data->abort;
handles[1] = handle;
+ signal = data->signal;
+ mutex = data->mutex;
free(data);
}
else
@@ -567,29 +439,41 @@ static DWORD WINAPI select_ws_wait_thread(LPVOID lpParameter)
*/
while(WaitForMultipleObjectsEx(1, handles, FALSE, 0, FALSE)
== WAIT_TIMEOUT) {
- /* get total size of file */
- length = 0;
- size.QuadPart = 0;
- size.LowPart = GetFileSize(handle, &length);
- if((size.LowPart != INVALID_FILE_SIZE) ||
- (GetLastError() == NO_ERROR)) {
- size.HighPart = length;
- /* get the current position within the file */
- pos.QuadPart = 0;
- pos.LowPart = SetFilePointer(handle, 0, &pos.HighPart,
- FILE_CURRENT);
- if((pos.LowPart != INVALID_SET_FILE_POINTER) ||
+ ret = WaitForSingleObjectEx(mutex, 0, FALSE);
+ if(ret == WAIT_OBJECT_0) {
+ /* get total size of file */
+ length = 0;
+ size.QuadPart = 0;
+ size.LowPart = GetFileSize(handle, &length);
+ if((size.LowPart != INVALID_FILE_SIZE) ||
(GetLastError() == NO_ERROR)) {
- /* compare position with size, abort if not equal */
- if(size.QuadPart == pos.QuadPart) {
- /* sleep and continue waiting */
- SleepEx(0, FALSE);
- continue;
+ size.HighPart = length;
+ /* get the current position within the file */
+ pos.QuadPart = 0;
+ pos.LowPart = SetFilePointer(handle, 0, &pos.HighPart,
+ FILE_CURRENT);
+ if((pos.LowPart != INVALID_SET_FILE_POINTER) ||
+ (GetLastError() == NO_ERROR)) {
+ /* compare position with size, abort if not equal */
+ if(size.QuadPart == pos.QuadPart) {
+ /* sleep and continue waiting */
+ SleepEx(0, FALSE);
+ ReleaseMutex(mutex);
+ continue;
+ }
}
}
+ /* there is some data available, stop waiting */
+ logmsg("[select_ws_wait_thread] data available, DISK: %p", handle);
+ SetEvent(signal);
+ ReleaseMutex(mutex);
+ break;
+ }
+ else if(ret == WAIT_ABANDONED) {
+ /* we are not allowed to process this event, because select_ws
+ is post-processing the signalled events and we must exit. */
+ break;
}
- /* there is some data available, stop waiting */
- break;
}
break;
@@ -603,22 +487,33 @@ static DWORD WINAPI select_ws_wait_thread(LPVOID lpParameter)
*/
while(WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE)
== WAIT_OBJECT_0 + 1) {
- /* check if this is an actual console handle */
- length = 0;
- if(GetConsoleMode(handle, &length)) {
- /* retrieve an event from the console buffer */
- length = 0;
- if(PeekConsoleInput(handle, &inputrecord, 1, &length)) {
- /* check if the event is not an actual key-event */
- if(length == 1 && inputrecord.EventType != KEY_EVENT) {
- /* purge the non-key-event and continue waiting */
- ReadConsoleInput(handle, &inputrecord, 1, &length);
- continue;
+ ret = WaitForSingleObjectEx(mutex, 0, FALSE);
+ if(ret == WAIT_OBJECT_0) {
+ /* check if this is an actual console handle */
+ if(GetConsoleMode(handle, &ret)) {
+ /* retrieve an event from the console buffer */
+ length = 0;
+ if(PeekConsoleInput(handle, &inputrecord, 1, &length)) {
+ /* check if the event is not an actual key-event */
+ if(length == 1 && inputrecord.EventType != KEY_EVENT) {
+ /* purge the non-key-event and continue waiting */
+ ReadConsoleInput(handle, &inputrecord, 1, &length);
+ ReleaseMutex(mutex);
+ continue;
+ }
}
}
+ /* there is some data available, stop waiting */
+ logmsg("[select_ws_wait_thread] data available, CHAR: %p", handle);
+ SetEvent(signal);
+ ReleaseMutex(mutex);
+ break;
+ }
+ else if(ret == WAIT_ABANDONED) {
+ /* we are not allowed to process this event, because select_ws
+ is post-processing the signalled events and we must exit. */
+ break;
}
- /* there is some data available, stop waiting */
- break;
}
break;
@@ -632,36 +527,65 @@ static DWORD WINAPI select_ws_wait_thread(LPVOID lpParameter)
*/
while(WaitForMultipleObjectsEx(1, handles, FALSE, 0, FALSE)
== WAIT_TIMEOUT) {
- /* peek into the pipe and retrieve the amount of data available */
- length = 0;
- if(PeekNamedPipe(handle, NULL, 0, NULL, &length, NULL)) {
- /* if there is no data available, sleep and continue waiting */
- if(length == 0) {
- SleepEx(0, FALSE);
- continue;
+ ret = WaitForSingleObjectEx(mutex, 0, FALSE);
+ if(ret == WAIT_OBJECT_0) {
+ /* peek into the pipe and retrieve the amount of data available */
+ length = 0;
+ if(PeekNamedPipe(handle, NULL, 0, NULL, &length, NULL)) {
+ /* if there is no data available, sleep and continue waiting */
+ if(length == 0) {
+ SleepEx(0, FALSE);
+ ReleaseMutex(mutex);
+ continue;
+ }
+ else {
+ logmsg("[select_ws_wait_thread] PeekNamedPipe len: %d", length);
+ }
}
- }
- else {
- /* if the pipe has been closed, sleep and continue waiting */
- if(GetLastError() == ERROR_BROKEN_PIPE) {
- SleepEx(0, FALSE);
- continue;
+ else {
+ /* if the pipe has NOT been closed, sleep and continue waiting */
+ ret = GetLastError();
+ if(ret != ERROR_BROKEN_PIPE) {
+ logmsg("[select_ws_wait_thread] PeekNamedPipe error: %d", ret);
+ SleepEx(0, FALSE);
+ ReleaseMutex(mutex);
+ continue;
+ }
+ else {
+ logmsg("[select_ws_wait_thread] pipe closed, PIPE: %p", handle);
+ }
}
+ /* there is some data available, stop waiting */
+ logmsg("[select_ws_wait_thread] data available, PIPE: %p", handle);
+ SetEvent(signal);
+ ReleaseMutex(mutex);
+ break;
+ }
+ else if(ret == WAIT_ABANDONED) {
+ /* we are not allowed to process this event, because select_ws
+ is post-processing the signalled events and we must exit. */
+ break;
}
- /* there is some data available, stop waiting */
- break;
}
break;
default:
/* The handle has an unknown type, try to wait on it */
- WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE);
+ if(WaitForMultipleObjectsEx(2, handles, FALSE, INFINITE, FALSE)
+ == WAIT_OBJECT_0 + 1) {
+ if(WaitForSingleObjectEx(mutex, 0, FALSE) == WAIT_OBJECT_0) {
+ logmsg("[select_ws_wait_thread] data available, HANDLE: %p", handle);
+ SetEvent(signal);
+ ReleaseMutex(mutex);
+ }
+ }
break;
}
return 0;
}
-static HANDLE select_ws_wait(HANDLE handle, HANDLE event)
+static HANDLE select_ws_wait(HANDLE handle, HANDLE signal,
+ HANDLE abort, HANDLE mutex)
{
struct select_ws_wait_data *data;
HANDLE thread = NULL;
@@ -670,7 +594,9 @@ static HANDLE select_ws_wait(HANDLE handle, HANDLE event)
data = malloc(sizeof(struct select_ws_wait_data));
if(data) {
data->handle = handle;
- data->event = event;
+ data->signal = signal;
+ data->abort = abort;
+ data->mutex = mutex;
/* launch waiting thread */
thread = CreateThread(NULL, 0,
@@ -686,23 +612,24 @@ static HANDLE select_ws_wait(HANDLE handle, HANDLE event)
return thread;
}
struct select_ws_data {
- curl_socket_t fd; /* the original input handle (indexed by fds) */
- curl_socket_t wsasock; /* the internal socket handle (indexed by wsa) */
- WSAEVENT wsaevent; /* the internal WINSOCK2 event (indexed by wsa) */
- HANDLE thread; /* the internal threads handle (indexed by thd) */
+ int fd; /* provided file descriptor (indexed by nfd) */
+ long wsastate; /* internal pre-select state (indexed by nfd) */
+ curl_socket_t wsasock; /* internal socket handle (indexed by nws) */
+ WSAEVENT wsaevent; /* internal select event (indexed by nws) */
+ HANDLE signal; /* internal thread signal (indexed by nth) */
+ HANDLE thread; /* internal thread handle (indexed by nth) */
};
static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timeval *timeout)
+ fd_set *exceptfds, struct timeval *tv)
{
- DWORD milliseconds, wait, idx;
- WSANETWORKEVENTS wsanetevents;
+ HANDLE abort, mutex, signal, handle, *handles;
+ DWORD timeout_ms, wait, nfd, nth, nws, i;
+ fd_set readsock, writesock, exceptsock;
struct select_ws_data *data;
- HANDLE handle, *handles;
+ WSANETWORKEVENTS wsaevents;
+ curl_socket_t wsasock;
+ int error, ret, fd;
WSAEVENT wsaevent;
- int error, fds;
- HANDLE waitevent = NULL;
- DWORD nfd = 0, thd = 0, wsa = 0;
- int ret = 0;
/* check if the input value is valid */
if(nfds < 0) {
@@ -710,15 +637,31 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
return -1;
}
+ /* convert struct timeval to milliseconds */
+ if(tv) {
+ timeout_ms = (tv->tv_sec*1000) + (DWORD)(((double)tv->tv_usec)/1000.0);
+ }
+ else {
+ timeout_ms = INFINITE;
+ }
+
/* check if we got descriptors, sleep in case we got none */
if(!nfds) {
- Sleep((timeout->tv_sec*1000)+(DWORD)(((double)timeout->tv_usec)/1000.0));
+ SleepEx(timeout_ms, FALSE);
return 0;
}
- /* create internal event to signal waiting threads */
- waitevent = CreateEvent(NULL, TRUE, FALSE, NULL);
- if(!waitevent) {
+ /* create internal event to abort waiting threads */
+ abort = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if(!abort) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* create internal mutex to lock event handling in threads */
+ mutex = CreateMutex(NULL, FALSE, NULL);
+ if(!mutex) {
+ CloseHandle(abort);
errno = ENOMEM;
return -1;
}
@@ -726,69 +669,115 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
/* allocate internal array for the internal data */
data = calloc(nfds, sizeof(struct select_ws_data));
if(data == NULL) {
- CloseHandle(waitevent);
+ CloseHandle(abort);
+ CloseHandle(mutex);
errno = ENOMEM;
return -1;
}
/* allocate internal array for the internal event handles */
- handles = calloc(nfds, sizeof(HANDLE));
+ handles = calloc(nfds + 1, sizeof(HANDLE));
if(handles == NULL) {
- CloseHandle(waitevent);
+ CloseHandle(abort);
+ CloseHandle(mutex);
free(data);
errno = ENOMEM;
return -1;
}
/* loop over the handles in the input descriptor sets */
- for(fds = 0; fds < nfds; fds++) {
- long networkevents = 0;
+ nfd = 0; /* number of handled file descriptors */
+ nth = 0; /* number of internal waiting threads */
+ nws = 0; /* number of handled WINSOCK sockets */
+ for(fd = 0; fd < nfds; fd++) {
+ wsasock = curlx_sitosk(fd);
+ wsaevents.lNetworkEvents = 0;
handles[nfd] = 0;
- if(FD_ISSET(fds, readfds))
- networkevents |= FD_READ|FD_ACCEPT|FD_CLOSE;
+ FD_ZERO(&readsock);
+ FD_ZERO(&writesock);
+ FD_ZERO(&exceptsock);
- if(FD_ISSET(fds, writefds))
- networkevents |= FD_WRITE|FD_CONNECT;
+ if(FD_ISSET(wsasock, readfds)) {
+ FD_SET(wsasock, &readsock);
+ wsaevents.lNetworkEvents |= FD_READ|FD_ACCEPT|FD_CLOSE;
+ }
- if(FD_ISSET(fds, exceptfds))
- networkevents |= FD_OOB|FD_CLOSE;
+ if(FD_ISSET(wsasock, writefds)) {
+ FD_SET(wsasock, &writesock);
+ wsaevents.lNetworkEvents |= FD_WRITE|FD_CONNECT|FD_CLOSE;
+ }
+
+ if(FD_ISSET(wsasock, exceptfds)) {
+ FD_SET(wsasock, &exceptsock);
+ wsaevents.lNetworkEvents |= FD_OOB;
+ }
/* only wait for events for which we actually care */
- if(networkevents) {
- data[nfd].fd = curlx_sitosk(fds);
- if(fds == fileno(stdin)) {
- handle = GetStdHandle(STD_INPUT_HANDLE);
- handle = select_ws_wait(handle, waitevent);
- handles[nfd] = handle;
- data[thd].thread = handle;
- thd++;
+ if(wsaevents.lNetworkEvents) {
+ data[nfd].fd = fd;
+ if(fd == fileno(stdin)) {
+ signal = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if(signal) {
+ handle = GetStdHandle(STD_INPUT_HANDLE);
+ handle = select_ws_wait(handle, signal, abort, mutex);
+ if(handle) {
+ handles[nfd] = signal;
+ data[nth].signal = signal;
+ data[nth].thread = handle;
+ nth++;
+ }
+ else {
+ CloseHandle(signal);
+ }
+ }
}
- else if(fds == fileno(stdout)) {
+ else if(fd == fileno(stdout)) {
handles[nfd] = GetStdHandle(STD_OUTPUT_HANDLE);
}
- else if(fds == fileno(stderr)) {
+ else if(fd == fileno(stderr)) {
handles[nfd] = GetStdHandle(STD_ERROR_HANDLE);
}
else {
wsaevent = WSACreateEvent();
if(wsaevent != WSA_INVALID_EVENT) {
- error = WSAEventSelect(fds, wsaevent, networkevents);
+ error = WSAEventSelect(wsasock, wsaevent, wsaevents.lNetworkEvents);
if(error != SOCKET_ERROR) {
- handle = (HANDLE) wsaevent;
- handles[nfd] = handle;
- data[wsa].wsasock = curlx_sitosk(fds);
- data[wsa].wsaevent = wsaevent;
- wsa++;
+ handles[nfd] = (HANDLE)wsaevent;
+ data[nws].wsasock = wsasock;
+ data[nws].wsaevent = wsaevent;
+ data[nfd].wsastate = 0;
+ tv->tv_sec = 0;
+ tv->tv_usec = 0;
+ /* check if the socket is already ready */
+ if(select(fd + 1, &readsock, &writesock, &exceptsock, tv) == 1) {
+ logmsg("[select_ws] socket %d is ready", fd);
+ WSASetEvent(wsaevent);
+ if(FD_ISSET(wsasock, &readsock))
+ data[nfd].wsastate |= FD_READ;
+ if(FD_ISSET(wsasock, &writesock))
+ data[nfd].wsastate |= FD_WRITE;
+ if(FD_ISSET(wsasock, &exceptsock))
+ data[nfd].wsastate |= FD_OOB;
+ }
+ nws++;
}
else {
- curl_socket_t socket = curlx_sitosk(fds);
WSACloseEvent(wsaevent);
- handle = (HANDLE) socket;
- handle = select_ws_wait(handle, waitevent);
- handles[nfd] = handle;
- data[thd].thread = handle;
- thd++;
+ signal = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if(signal) {
+ handle = (HANDLE)wsasock;
+ handle = select_ws_wait(handle, signal, abort, mutex);
+ if(handle) {
+ handles[nfd] = signal;
+ data[nth].signal = signal;
+ data[nth].thread = handle;
+ nth++;
+ }
+ else {
+ CloseHandle(signal);
+ }
+ }
}
}
}
@@ -796,104 +785,104 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
}
}
- /* convert struct timeval to milliseconds */
- if(timeout) {
- milliseconds = ((timeout->tv_sec * 1000) + (timeout->tv_usec / 1000));
- }
- else {
- milliseconds = INFINITE;
+ /* wait on the number of handles */
+ wait = nfd;
+
+ /* make sure we stop waiting on exit signal event */
+ if(exit_event) {
+ /* we allocated handles nfds + 1 for this */
+ handles[nfd] = exit_event;
+ wait += 1;
}
/* wait for one of the internal handles to trigger */
- wait = WaitForMultipleObjectsEx(nfd, handles, FALSE, milliseconds, FALSE);
+ wait = WaitForMultipleObjectsEx(wait, handles, FALSE, timeout_ms, FALSE);
- /* signal the event handle for the waiting threads */
- SetEvent(waitevent);
+ /* wait for internal mutex to lock event handling in threads */
+ WaitForSingleObjectEx(mutex, INFINITE, FALSE);
/* loop over the internal handles returned in the descriptors */
- for(idx = 0; idx < nfd; idx++) {
- curl_socket_t sock = data[idx].fd;
- handle = handles[idx];
- fds = curlx_sktosi(sock);
+ ret = 0; /* number of ready file descriptors */
+ for(i = 0; i < nfd; i++) {
+ fd = data[i].fd;
+ handle = handles[i];
+ wsasock = curlx_sitosk(fd);
/* check if the current internal handle was triggered */
- if(wait != WAIT_FAILED && (wait - WAIT_OBJECT_0) <= idx &&
+ if(wait != WAIT_FAILED && (wait - WAIT_OBJECT_0) <= i &&
WaitForSingleObjectEx(handle, 0, FALSE) == WAIT_OBJECT_0) {
/* first handle stdin, stdout and stderr */
- if(fds == fileno(stdin)) {
+ if(fd == fileno(stdin)) {
/* stdin is never ready for write or exceptional */
- FD_CLR(sock, writefds);
- FD_CLR(sock, exceptfds);
+ FD_CLR(wsasock, writefds);
+ FD_CLR(wsasock, exceptfds);
}
- else if(fds == fileno(stdout) || fds == fileno(stderr)) {
+ else if(fd == fileno(stdout) || fd == fileno(stderr)) {
/* stdout and stderr are never ready for read or exceptional */
- FD_CLR(sock, readfds);
- FD_CLR(sock, exceptfds);
+ FD_CLR(wsasock, readfds);
+ FD_CLR(wsasock, exceptfds);
}
else {
/* try to handle the event with the WINSOCK2 functions */
- wsanetevents.lNetworkEvents = 0;
- error = WSAEnumNetworkEvents(fds, handle, &wsanetevents);
+ wsaevents.lNetworkEvents = 0;
+ error = WSAEnumNetworkEvents(wsasock, handle, &wsaevents);
if(error != SOCKET_ERROR) {
+ /* merge result from pre-check using select */
+ wsaevents.lNetworkEvents |= data[i].wsastate;
+
/* remove from descriptor set if not ready for read/accept/close */
- if(!(wsanetevents.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE)))
- FD_CLR(sock, readfds);
+ if(!(wsaevents.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE)))
+ FD_CLR(wsasock, readfds);
/* remove from descriptor set if not ready for write/connect */
- if(!(wsanetevents.lNetworkEvents & (FD_WRITE|FD_CONNECT)))
- FD_CLR(sock, writefds);
-
- /* HACK:
- * use exceptfds together with readfds to signal
- * that the connection was closed by the client.
- *
- * Reason: FD_CLOSE is only signaled once, sometimes
- * at the same time as FD_READ with data being available.
- * This means that recv/sread is not reliable to detect
- * that the connection is closed.
- */
+ if(!(wsaevents.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE)))
+ FD_CLR(wsasock, writefds);
+
/* remove from descriptor set if not exceptional */
- if(!(wsanetevents.lNetworkEvents & (FD_OOB|FD_CLOSE)))
- FD_CLR(sock, exceptfds);
+ if(!(wsaevents.lNetworkEvents & FD_OOB))
+ FD_CLR(wsasock, exceptfds);
}
}
/* check if the event has not been filtered using specific tests */
- if(FD_ISSET(sock, readfds) || FD_ISSET(sock, writefds) ||
- FD_ISSET(sock, exceptfds)) {
+ if(FD_ISSET(wsasock, readfds) || FD_ISSET(wsasock, writefds) ||
+ FD_ISSET(wsasock, exceptfds)) {
ret++;
}
}
else {
/* remove from all descriptor sets since this handle did not trigger */
- FD_CLR(sock, readfds);
- FD_CLR(sock, writefds);
- FD_CLR(sock, exceptfds);
+ FD_CLR(wsasock, readfds);
+ FD_CLR(wsasock, writefds);
+ FD_CLR(wsasock, exceptfds);
}
}
- for(fds = 0; fds < nfds; fds++) {
- if(FD_ISSET(fds, readfds))
- logmsg("select_ws: %d is readable", fds);
-
- if(FD_ISSET(fds, writefds))
- logmsg("select_ws: %d is writable", fds);
+ /* signal the event handle for the other waiting threads */
+ SetEvent(abort);
- if(FD_ISSET(fds, exceptfds))
- logmsg("select_ws: %d is excepted", fds);
+ for(fd = 0; fd < nfds; fd++) {
+ if(FD_ISSET(fd, readfds))
+ logmsg("[select_ws] %d is readable", fd);
+ if(FD_ISSET(fd, writefds))
+ logmsg("[select_ws] %d is writable", fd);
+ if(FD_ISSET(fd, exceptfds))
+ logmsg("[select_ws] %d is exceptional", fd);
}
- for(idx = 0; idx < wsa; idx++) {
- WSAEventSelect(data[idx].wsasock, NULL, 0);
- WSACloseEvent(data[idx].wsaevent);
+ for(i = 0; i < nws; i++) {
+ WSAEventSelect(data[i].wsasock, NULL, 0);
+ WSACloseEvent(data[i].wsaevent);
}
- for(idx = 0; idx < thd; idx++) {
- WaitForSingleObject(data[idx].thread, INFINITE);
- CloseHandle(data[idx].thread);
+ for(i = 0; i < nth; i++) {
+ WaitForSingleObjectEx(data[i].thread, INFINITE, FALSE);
+ CloseHandle(data[i].thread);
+ CloseHandle(data[i].signal);
}
- CloseHandle(waitevent);
+ CloseHandle(abort);
+ CloseHandle(mutex);
free(handles);
free(data);
@@ -972,9 +961,6 @@ static bool juggle(curl_socket_t *sockfdp,
else {
/* there's always a socket to wait for */
FD_SET(sockfd, &fds_read);
-#ifdef USE_WINSOCK
- FD_SET(sockfd, &fds_err);
-#endif
maxfd = (int)sockfd;
}
break;
@@ -985,9 +971,6 @@ static bool juggle(curl_socket_t *sockfdp,
/* sockfd turns CURL_SOCKET_BAD when our connection has been closed */
if(CURL_SOCKET_BAD != sockfd) {
FD_SET(sockfd, &fds_read);
-#ifdef USE_WINSOCK
- FD_SET(sockfd, &fds_err);
-#endif
maxfd = (int)sockfd;
}
else {
@@ -1165,11 +1148,7 @@ static bool juggle(curl_socket_t *sockfdp,
lograw(buffer, nread_socket);
}
- if(nread_socket <= 0
-#ifdef USE_WINSOCK
- || FD_ISSET(sockfd, &fds_err)
-#endif
- ) {
+ if(nread_socket <= 0) {
logmsg("====> Client disconnect");
if(!write_stdout("DISC\n", 5))
return FALSE;
@@ -1335,6 +1314,7 @@ int main(int argc, char *argv[])
curl_socket_t msgsock = CURL_SOCKET_BAD;
int wrotepidfile = 0;
const char *pidname = ".sockfilt.pid";
+ const char *portfile = NULL; /* none by default */
bool juggle_again;
int rc;
int error;
@@ -1362,6 +1342,11 @@ int main(int argc, char *argv[])
if(argc>arg)
pidname = argv[arg++];
}
+ else if(!strcmp("--portfile", argv[arg])) {
+ arg++;
+ if(argc > arg)
+ portfile = argv[arg++];
+ }
else if(!strcmp("--logfile", argv[arg])) {
arg++;
if(argc>arg)
@@ -1391,12 +1376,6 @@ int main(int argc, char *argv[])
if(argc>arg) {
char *endptr;
unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
- if((endptr != argv[arg] + strlen(argv[arg])) ||
- ((ulnum != 0UL) && ((ulnum < 1025UL) || (ulnum > 65535UL)))) {
- fprintf(stderr, "sockfilt: invalid --port argument (%s)\n",
- argv[arg]);
- return 0;
- }
port = curlx_ultous(ulnum);
arg++;
}
@@ -1451,7 +1430,7 @@ int main(int argc, char *argv[])
setmode(fileno(stderr), O_BINARY);
#endif
- install_signal_handlers();
+ install_signal_handlers(false);
#ifdef ENABLE_IPV6
if(!use_ipv6)
@@ -1532,6 +1511,13 @@ int main(int argc, char *argv[])
write_stdout("FAIL\n", 5);
goto sockfilt_cleanup;
}
+ if(portfile) {
+ wrotepidfile = write_portfile(portfile, port);
+ if(!wrotepidfile) {
+ write_stdout("FAIL\n", 5);
+ goto sockfilt_cleanup;
+ }
+ }
do {
juggle_again = juggle(&msgsock, sock, &mode);
@@ -1548,7 +1534,7 @@ sockfilt_cleanup:
if(wrotepidfile)
unlink(pidname);
- restore_signal_handlers();
+ restore_signal_handlers(false);
if(got_exit_signal) {
logmsg("============> sockfilt exits with signal (%d)", exit_signal);
diff --git a/tests/server/socksd.c b/tests/server/socksd.c
index 5e32bc904..e6e9c12b0 100644
--- a/tests/server/socksd.c
+++ b/tests/server/socksd.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -230,123 +230,6 @@ static void getconfig(void)
}
}
-
-/* do-nothing macro replacement for systems which lack siginterrupt() */
-
-#ifndef HAVE_SIGINTERRUPT
-#define siginterrupt(x,y) do {} while(0)
-#endif
-
-/* vars used to keep around previous signal handlers */
-
-typedef RETSIGTYPE (*SIGHANDLER_T)(int);
-
-#ifdef SIGHUP
-static SIGHANDLER_T old_sighup_handler = SIG_ERR;
-#endif
-
-#ifdef SIGPIPE
-static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
-#endif
-
-#ifdef SIGALRM
-static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
-#endif
-
-#ifdef SIGINT
-static SIGHANDLER_T old_sigint_handler = SIG_ERR;
-#endif
-
-#if defined(SIGBREAK) && defined(WIN32)
-static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
-#endif
-
-/* var which if set indicates that the program should finish execution */
-
-SIG_ATOMIC_T got_exit_signal = 0;
-
-/* if next is set indicates the first signal handled in exit_signal_handler */
-
-static volatile int exit_signal = 0;
-
-/* signal handler that will be triggered to indicate that the program
- should finish its execution in a controlled manner as soon as possible.
- The first time this is called it will set got_exit_signal to one and
- store in exit_signal the signal that triggered its execution. */
-
-static RETSIGTYPE exit_signal_handler(int signum)
-{
- int old_errno = errno;
- if(got_exit_signal == 0) {
- got_exit_signal = 1;
- exit_signal = signum;
- }
- (void)signal(signum, exit_signal_handler);
- errno = old_errno;
-}
-
-static void install_signal_handlers(void)
-{
-#ifdef SIGHUP
- /* ignore SIGHUP signal */
- old_sighup_handler = signal(SIGHUP, SIG_IGN);
- if(old_sighup_handler == SIG_ERR)
- logmsg("cannot install SIGHUP handler: %s", strerror(errno));
-#endif
-#ifdef SIGPIPE
- /* ignore SIGPIPE signal */
- old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
- if(old_sigpipe_handler == SIG_ERR)
- logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
-#endif
-#ifdef SIGALRM
- /* ignore SIGALRM signal */
- old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
- if(old_sigalrm_handler == SIG_ERR)
- logmsg("cannot install SIGALRM handler: %s", strerror(errno));
-#endif
-#ifdef SIGINT
- /* handle SIGINT signal with our exit_signal_handler */
- old_sigint_handler = signal(SIGINT, exit_signal_handler);
- if(old_sigint_handler == SIG_ERR)
- logmsg("cannot install SIGINT handler: %s", strerror(errno));
- else
- siginterrupt(SIGINT, 1);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- /* handle SIGBREAK signal with our exit_signal_handler */
- old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
- if(old_sigbreak_handler == SIG_ERR)
- logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
- else
- siginterrupt(SIGBREAK, 1);
-#endif
-}
-
-static void restore_signal_handlers(void)
-{
-#ifdef SIGHUP
- if(SIG_ERR != old_sighup_handler)
- (void)signal(SIGHUP, old_sighup_handler);
-#endif
-#ifdef SIGPIPE
- if(SIG_ERR != old_sigpipe_handler)
- (void)signal(SIGPIPE, old_sigpipe_handler);
-#endif
-#ifdef SIGALRM
- if(SIG_ERR != old_sigalrm_handler)
- (void)signal(SIGALRM, old_sigalrm_handler);
-#endif
-#ifdef SIGINT
- if(SIG_ERR != old_sigint_handler)
- (void)signal(SIGINT, old_sigint_handler);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- if(SIG_ERR != old_sigbreak_handler)
- (void)signal(SIGBREAK, old_sigbreak_handler);
-#endif
-}
-
static void loghex(unsigned char *buffer, ssize_t len)
{
char data[1200];
@@ -1000,6 +883,7 @@ int main(int argc, char *argv[])
curl_socket_t msgsock = CURL_SOCKET_BAD;
int wrotepidfile = 0;
const char *pidname = ".socksd.pid";
+ const char *portfile = NULL;
bool juggle_again;
int error;
int arg = 1;
@@ -1020,6 +904,11 @@ int main(int argc, char *argv[])
if(argc>arg)
pidname = argv[arg++];
}
+ else if(!strcmp("--portfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ portfile = argv[arg++];
+ }
else if(!strcmp("--config", argv[arg])) {
arg++;
if(argc>arg)
@@ -1060,12 +949,6 @@ int main(int argc, char *argv[])
if(argc>arg) {
char *endptr;
unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
- if((endptr != argv[arg] + strlen(argv[arg])) ||
- ((ulnum != 0UL) && ((ulnum < 1025UL) || (ulnum > 65535UL)))) {
- fprintf(stderr, "socksd: invalid --port argument (%s)\n",
- argv[arg]);
- return 0;
- }
port = curlx_ultous(ulnum);
arg++;
}
@@ -1078,6 +961,7 @@ int main(int argc, char *argv[])
" --version\n"
" --logfile [file]\n"
" --pidfile [file]\n"
+ " --portfile [file]\n"
" --ipv4\n"
" --ipv6\n"
" --bindonly\n"
@@ -1095,7 +979,7 @@ int main(int argc, char *argv[])
setmode(fileno(stderr), O_BINARY);
#endif
- install_signal_handlers();
+ install_signal_handlers(false);
#ifdef ENABLE_IPV6
if(!use_ipv6)
@@ -1130,6 +1014,13 @@ int main(int argc, char *argv[])
goto socks5_cleanup;
}
+ if(portfile) {
+ wrotepidfile = write_portfile(portfile, port);
+ if(!wrotepidfile) {
+ goto socks5_cleanup;
+ }
+ }
+
do {
juggle_again = incoming(sock);
} while(juggle_again);
@@ -1145,7 +1036,7 @@ socks5_cleanup:
if(wrotepidfile)
unlink(pidname);
- restore_signal_handlers();
+ restore_signal_handlers(false);
if(got_exit_signal) {
logmsg("============> socksd exits with signal (%d)", exit_signal);
diff --git a/tests/server/sws.c b/tests/server/sws.c
index 963357799..b0f2a83d6 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -118,6 +118,8 @@ struct httprequest {
int rcmd; /* doing a special command, see defines above */
int prot_version; /* HTTP version * 10 */
int callcount; /* times ProcessRequest() gets called */
+ bool skipall; /* skip all incoming data */
+ bool noexpect; /* refuse Expect: (don't read the body) */
bool connmon; /* monitor the state of the connection, log disconnects */
bool upgrade; /* test case allows upgrade to http2 */
bool upgrade_request; /* upgrade request found and allowed */
@@ -152,6 +154,10 @@ const char *serverlogfile = DEFAULT_LOGFILE;
#define REQUEST_PROXY_DUMP "log/proxy.input"
#define RESPONSE_PROXY_DUMP "log/proxy.response"
+/* file in which additional instructions may be found */
+#define DEFAULT_CMDFILE "log/ftpserver.cmd"
+const char *cmdfile = DEFAULT_CMDFILE;
+
/* very-big-path support */
#define MAXDOCNAMELEN 140000
#define MAXDOCNAMELEN_TXT "139999"
@@ -179,6 +185,9 @@ const char *serverlogfile = DEFAULT_LOGFILE;
/* close connection */
#define CMD_SWSCLOSE "swsclose"
+/* deny Expect: requests */
+#define CMD_NOEXPECT "no-expect"
+
#define END_OF_HEADERS "\r\n\r\n"
enum {
@@ -208,141 +217,9 @@ static const char *doc404 = "HTTP/1.1 404 Not Found\r\n"
"The requested URL was not found on this server.\n"
"<P><HR><ADDRESS>" SWSVERSION "</ADDRESS>\n" "</BODY></HTML>\n";
-/* do-nothing macro replacement for systems which lack siginterrupt() */
-
-#ifndef HAVE_SIGINTERRUPT
-#define siginterrupt(x,y) do {} while(0)
-#endif
-
-/* vars used to keep around previous signal handlers */
-
-typedef RETSIGTYPE (*SIGHANDLER_T)(int);
-
-#ifdef SIGHUP
-static SIGHANDLER_T old_sighup_handler = SIG_ERR;
-#endif
-
-#ifdef SIGPIPE
-static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
-#endif
-
-#ifdef SIGALRM
-static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
-#endif
-
-#ifdef SIGINT
-static SIGHANDLER_T old_sigint_handler = SIG_ERR;
-#endif
-
-#ifdef SIGTERM
-static SIGHANDLER_T old_sigterm_handler = SIG_ERR;
-#endif
-
-#if defined(SIGBREAK) && defined(WIN32)
-static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
-#endif
-
-/* var which if set indicates that the program should finish execution */
-
-SIG_ATOMIC_T got_exit_signal = 0;
-
-/* if next is set indicates the first signal handled in exit_signal_handler */
-
-static volatile int exit_signal = 0;
-
/* work around for handling trailing headers */
static int already_recv_zeroed_chunk = FALSE;
-/* signal handler that will be triggered to indicate that the program
- should finish its execution in a controlled manner as soon as possible.
- The first time this is called it will set got_exit_signal to one and
- store in exit_signal the signal that triggered its execution. */
-
-static RETSIGTYPE exit_signal_handler(int signum)
-{
- int old_errno = errno;
- if(got_exit_signal == 0) {
- got_exit_signal = 1;
- exit_signal = signum;
- }
- (void)signal(signum, exit_signal_handler);
- errno = old_errno;
-}
-
-static void install_signal_handlers(void)
-{
-#ifdef SIGHUP
- /* ignore SIGHUP signal */
- old_sighup_handler = signal(SIGHUP, SIG_IGN);
- if(old_sighup_handler == SIG_ERR)
- logmsg("cannot install SIGHUP handler: %s", strerror(errno));
-#endif
-#ifdef SIGPIPE
- /* ignore SIGPIPE signal */
- old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
- if(old_sigpipe_handler == SIG_ERR)
- logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
-#endif
-#ifdef SIGALRM
- /* ignore SIGALRM signal */
- old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
- if(old_sigalrm_handler == SIG_ERR)
- logmsg("cannot install SIGALRM handler: %s", strerror(errno));
-#endif
-#ifdef SIGINT
- /* handle SIGINT signal with our exit_signal_handler */
- old_sigint_handler = signal(SIGINT, exit_signal_handler);
- if(old_sigint_handler == SIG_ERR)
- logmsg("cannot install SIGINT handler: %s", strerror(errno));
- else
- siginterrupt(SIGINT, 1);
-#endif
-#ifdef SIGTERM
- /* handle SIGTERM signal with our exit_signal_handler */
- old_sigterm_handler = signal(SIGTERM, exit_signal_handler);
- if(old_sigterm_handler == SIG_ERR)
- logmsg("cannot install SIGTERM handler: %s", strerror(errno));
- else
- siginterrupt(SIGTERM, 1);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- /* handle SIGBREAK signal with our exit_signal_handler */
- old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
- if(old_sigbreak_handler == SIG_ERR)
- logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
- else
- siginterrupt(SIGBREAK, 1);
-#endif
-}
-
-static void restore_signal_handlers(void)
-{
-#ifdef SIGHUP
- if(SIG_ERR != old_sighup_handler)
- (void)signal(SIGHUP, old_sighup_handler);
-#endif
-#ifdef SIGPIPE
- if(SIG_ERR != old_sigpipe_handler)
- (void)signal(SIGPIPE, old_sigpipe_handler);
-#endif
-#ifdef SIGALRM
- if(SIG_ERR != old_sigalrm_handler)
- (void)signal(SIGALRM, old_sigalrm_handler);
-#endif
-#ifdef SIGINT
- if(SIG_ERR != old_sigint_handler)
- (void)signal(SIGINT, old_sigint_handler);
-#endif
-#ifdef SIGTERM
- if(SIG_ERR != old_sigterm_handler)
- (void)signal(SIGTERM, old_sigterm_handler);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- if(SIG_ERR != old_sigbreak_handler)
- (void)signal(SIGBREAK, old_sigbreak_handler);
-#endif
-}
-
/* returns true if the current socket is an IP one */
static bool socket_domain_is_ip(void)
{
@@ -358,20 +235,37 @@ static bool socket_domain_is_ip(void)
}
}
+/* parse the file on disk that might have a test number for us */
+static int parse_cmdfile(struct httprequest *req)
+{
+ int testnum = DOCNUMBER_NOTHING;
+ char buf[256];
+ FILE *f = fopen(cmdfile, FOPEN_READTEXT);
+ if(f) {
+ while(fgets(buf, sizeof(buf), f)) {
+ if(1 == sscanf(buf, "Testnum %d", &testnum)) {
+ logmsg("[%s] cmdfile says testnum %d", cmdfile, testnum);
+ req->testno = testnum;
+ }
+ }
+ fclose(f);
+ }
+ return 0;
+}
+
/* based on the testno, parse the correct server commands */
static int parse_servercmd(struct httprequest *req)
{
FILE *stream;
- char *filename;
int error;
- filename = test2file(req->testno);
+ stream = test2fopen(req->testno);
req->close = FALSE;
- stream = fopen(filename, "rb");
+ req->connmon = FALSE;
+
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg(" [1] Error opening file: %s", filename);
logmsg(" Couldn't open test file %ld", req->testno);
req->open = FALSE; /* closes connection */
return 1; /* done */
@@ -391,8 +285,6 @@ static int parse_servercmd(struct httprequest *req)
return 1; /* done */
}
- req->connmon = FALSE;
-
cmd = orgcmd;
while(cmd && cmdsize) {
char *check;
@@ -427,6 +319,10 @@ static int parse_servercmd(struct httprequest *req)
logmsg("instructed to skip this number of bytes %d", num);
req->skip = num;
}
+ else if(!strncmp(CMD_NOEXPECT, cmd, strlen(CMD_NOEXPECT))) {
+ logmsg("instructed to reject Expect: 100-continue");
+ req->noexpect = TRUE;
+ }
else if(1 == sscanf(cmd, "writedelay: %d", &num)) {
logmsg("instructed to delay %d secs between packets", num);
req->writedelay = num;
@@ -540,12 +436,11 @@ static int ProcessRequest(struct httprequest *req)
msnprintf(logbuf, sizeof(logbuf), "Requested test number %ld part %ld",
req->testno, req->partno);
logmsg("%s", logbuf);
-
- /* find and parse <servercmd> for this test */
- parse_servercmd(req);
}
- else
+ else {
+ logmsg("No test number");
req->testno = DOCNUMBER_NOTHING;
+ }
}
@@ -606,15 +501,7 @@ static int ProcessRequest(struct httprequest *req)
}
if(req->testno == DOCNUMBER_NOTHING) {
- /* check for a Testno: header with the test case number */
- char *testno = strstr(line, "\nTestno: ");
- if(testno) {
- req->testno = strtol(&testno[9], NULL, 10);
- logmsg("Found test number %d in Testno: header!", req->testno);
- }
- }
- if(req->testno == DOCNUMBER_NOTHING) {
- /* Still no test case number. Try to get the the number off the last dot
+ /* Still no test case number. Try to get the number off the last dot
instead, IE we consider the TLD to be the test number. Test 123 can
then be written as "example.com.123". */
@@ -623,38 +510,45 @@ static int ProcessRequest(struct httprequest *req)
/* get the number after it */
if(ptr) {
+ long num;
ptr++; /* skip the dot */
- req->testno = strtol(ptr, &ptr, 10);
+ num = strtol(ptr, &ptr, 10);
- if(req->testno > 10000) {
- req->partno = req->testno % 10000;
- req->testno /= 10000;
+ if(num) {
+ req->testno = num;
+ if(req->testno > 10000) {
+ req->partno = req->testno % 10000;
+ req->testno /= 10000;
- logmsg("found test %d in requested host name", req->testno);
+ logmsg("found test %d in requested host name", req->testno);
+ }
+ else
+ req->partno = 0;
}
- else
- req->partno = 0;
-
- msnprintf(logbuf, sizeof(logbuf),
- "Requested test number %ld part %ld (from host name)",
- req->testno, req->partno);
- logmsg("%s", logbuf);
+ if(req->testno != DOCNUMBER_NOTHING) {
+ logmsg("Requested test number %ld part %ld (from host name)",
+ req->testno, req->partno);
+ }
}
+ }
- if(!req->testno) {
- logmsg("Did not find test number in PATH");
- req->testno = DOCNUMBER_404;
- }
- else
- parse_servercmd(req);
+ if(req->testno == DOCNUMBER_NOTHING)
+ /* might get the test number */
+ parse_cmdfile(req);
+
+ if(req->testno == DOCNUMBER_NOTHING) {
+ logmsg("Did not find test number in PATH");
+ req->testno = DOCNUMBER_404;
}
+ else
+ parse_servercmd(req);
}
else if((req->offset >= 3) && (req->testno == DOCNUMBER_NOTHING)) {
- logmsg("** Unusual request. Starts with %02x %02x %02x",
- line[0], line[1], line[2]);
+ logmsg("** Unusual request. Starts with %02x %02x %02x (%c%c%c)",
+ line[0], line[1], line[2], line[0], line[1], line[2]);
}
if(!end) {
@@ -662,7 +556,22 @@ static int ProcessRequest(struct httprequest *req)
logmsg("request not complete yet");
return 0; /* not complete yet */
}
- logmsg("- request found to be complete");
+ logmsg("- request found to be complete (%d)", req->testno);
+
+ if(req->testno == DOCNUMBER_NOTHING) {
+ /* check for a Testno: header with the test case number */
+ char *testno = strstr(line, "\nTestno: ");
+ if(testno) {
+ req->testno = strtol(&testno[9], NULL, 10);
+ logmsg("Found test number %d in Testno: header!", req->testno);
+ }
+ else {
+ logmsg("No Testno: header");
+ }
+ }
+
+ /* find and parse <servercmd> for this test */
+ parse_servercmd(req);
if(use_gopher) {
/* when using gopher we cannot check the request until the entire
@@ -729,19 +638,28 @@ static int ProcessRequest(struct httprequest *req)
req->open = FALSE; /* closes connection */
return 1; /* done */
}
- req->cl = clen - req->skip;
+ if(req->skipall)
+ req->cl = 0;
+ else
+ req->cl = clen - req->skip;
logmsg("Found Content-Length: %lu in the request", clen);
if(req->skip)
logmsg("... but will abort after %zu bytes", req->cl);
- break;
}
else if(strncasecompare("Transfer-Encoding: chunked", line,
strlen("Transfer-Encoding: chunked"))) {
/* chunked data coming in */
chunked = TRUE;
}
-
+ else if(req->noexpect &&
+ strncasecompare("Expect: 100-continue", line,
+ strlen("Expect: 100-continue"))) {
+ if(req->cl)
+ req->cl = 0;
+ req->skipall = TRUE;
+ logmsg("Found Expect: 100-continue, ignore body");
+ }
if(chunked) {
if(strstr(req->reqbuf, "\r\n0\r\n\r\n")) {
@@ -933,6 +851,8 @@ static void init_httprequest(struct httprequest *req)
req->digest = FALSE;
req->ntlm = FALSE;
req->skip = 0;
+ req->skipall = FALSE;
+ req->noexpect = FALSE;
req->writedelay = 0;
req->rcmd = RCMD_NORMALREQ;
req->prot_version = 0;
@@ -1097,7 +1017,6 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
}
else {
char partbuf[80];
- char *filename = test2file(req->testno);
/* select the <data> tag for "normal" requests and the <connect> one
for CONNECT requests (within the <reply> section) */
@@ -1110,11 +1029,10 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
logmsg("Send response test%ld section <%s>", req->testno, partbuf);
- stream = fopen(filename, "rb");
+ stream = test2fopen(req->testno);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg(" [3] Error opening file: %s", filename);
return 0;
}
else {
@@ -1133,11 +1051,10 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
}
/* re-open the same file again */
- stream = fopen(filename, "rb");
+ stream = test2fopen(req->testno);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg(" [4] Error opening file: %s", filename);
free(ptr);
return 0;
}
@@ -1236,6 +1153,8 @@ static int send_doc(curl_socket_t sock, struct httprequest *req)
logmsg("Sending response failed. Only (%zu bytes) of (%zu bytes) "
"were sent",
responsesize-count, responsesize);
+ prevtestno = req->testno;
+ prevpartno = req->partno;
free(ptr);
free(cmd);
return -1;
@@ -1953,6 +1872,7 @@ int main(int argc, char *argv[])
bool unlink_socket = false;
#endif
const char *pidname = ".http.pid";
+ const char *portname = ".http.port";
struct httprequest req;
int rc = 0;
int error;
@@ -1985,11 +1905,21 @@ int main(int argc, char *argv[])
if(argc>arg)
pidname = argv[arg++];
}
+ else if(!strcmp("--portfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ portname = argv[arg++];
+ }
else if(!strcmp("--logfile", argv[arg])) {
arg++;
if(argc>arg)
serverlogfile = argv[arg++];
}
+ else if(!strcmp("--cmdfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ cmdfile = argv[arg++];
+ }
else if(!strcmp("--gopher", argv[arg])) {
arg++;
use_gopher = TRUE;
@@ -2032,7 +1962,7 @@ int main(int argc, char *argv[])
char *endptr;
unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
if((endptr != argv[arg] + strlen(argv[arg])) ||
- (ulnum < 1025UL) || (ulnum > 65535UL)) {
+ (ulnum && ((ulnum < 1025UL) || (ulnum > 65535UL)))) {
fprintf(stderr, "sws: invalid --port argument (%s)\n",
argv[arg]);
return 0;
@@ -2065,6 +1995,7 @@ int main(int argc, char *argv[])
" --version\n"
" --logfile [file]\n"
" --pidfile [file]\n"
+ " --portfile [file]\n"
" --ipv4\n"
" --ipv6\n"
" --unix-socket [file]\n"
@@ -2076,14 +2007,12 @@ int main(int argc, char *argv[])
}
}
- msnprintf(port_str, sizeof(port_str), "port %hu", port);
-
#ifdef WIN32
win32_init();
atexit(win32_cleanup);
#endif
- install_signal_handlers();
+ install_signal_handlers(false);
pid = (long)getpid();
@@ -2135,7 +2064,7 @@ int main(int argc, char *argv[])
case AF_UNIX:
memset(&me.sau, 0, sizeof(me.sau));
me.sau.sun_family = AF_UNIX;
- strncpy(me.sau.sun_path, unix_socket, sizeof(me.sau.sun_path));
+ strncpy(me.sau.sun_path, unix_socket, sizeof(me.sau.sun_path) - 1);
rc = bind(sock, &me.sa, sizeof(me.sau));
if(0 != rc && errno == EADDRINUSE) {
struct stat statbuf;
@@ -2184,11 +2113,58 @@ int main(int argc, char *argv[])
}
if(0 != rc) {
error = SOCKERRNO;
- logmsg("Error binding socket on %s: (%d) %s",
- location_str, error, strerror(error));
+ logmsg("Error binding socket: (%d) %s", error, strerror(error));
goto sws_cleanup;
}
+ if(!port) {
+ /* The system was supposed to choose a port number, figure out which
+ port we actually got and update the listener port value with it. */
+ curl_socklen_t la_size;
+ srvr_sockaddr_union_t localaddr;
+#ifdef ENABLE_IPV6
+ if(socket_domain != AF_INET6)
+#endif
+ la_size = sizeof(localaddr.sa4);
+#ifdef ENABLE_IPV6
+ else
+ la_size = sizeof(localaddr.sa6);
+#endif
+ memset(&localaddr.sa, 0, (size_t)la_size);
+ if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
+ error = SOCKERRNO;
+ logmsg("getsockname() failed with error: (%d) %s",
+ error, strerror(error));
+ sclose(sock);
+ goto sws_cleanup;
+ }
+ switch(localaddr.sa.sa_family) {
+ case AF_INET:
+ port = ntohs(localaddr.sa4.sin_port);
+ break;
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ port = ntohs(localaddr.sa6.sin6_port);
+ break;
+#endif
+ default:
+ break;
+ }
+ if(!port) {
+ /* Real failure, listener port shall not be zero beyond this point. */
+ logmsg("Apparently getsockname() succeeded, with listener port zero.");
+ logmsg("A valid reason for this failure is a binary built without");
+ logmsg("proper network library linkage. This might not be the only");
+ logmsg("reason, but double check it before anything else.");
+ sclose(sock);
+ goto sws_cleanup;
+ }
+ }
+#ifdef USE_UNIX_SOCKETS
+ if(socket_domain != AF_UNIX)
+#endif
+ msnprintf(port_str, sizeof(port_str), "port %hu", port);
+
logmsg("Running %s %s version on %s",
use_gopher?"GOPHER":"HTTP", socket_type, location_str);
@@ -2215,6 +2191,10 @@ int main(int argc, char *argv[])
if(!wrotepidfile)
goto sws_cleanup;
+ wrotepidfile = write_portfile(portname, port);
+ if(!wrotepidfile)
+ goto sws_cleanup;
+
/* initialization of httprequest struct is done before get_request(), but
the pipelining struct field must be initialized previously to FALSE
every time a new connection arrives. */
@@ -2226,6 +2206,7 @@ int main(int argc, char *argv[])
fd_set output;
struct timeval timeout = {0, 250000L}; /* 250 ms */
curl_socket_t maxfd = (curl_socket_t)-1;
+ int active;
/* Clear out closed sockets */
for(socket_idx = num_sockets - 1; socket_idx >= 1; --socket_idx) {
@@ -2273,6 +2254,7 @@ int main(int argc, char *argv[])
/* Timed out - try again */
continue;
}
+ active = rc; /* a positive number */
/* Check if the listening socket is ready to accept */
if(FD_ISSET(all_sockets[0], &input)) {
@@ -2284,11 +2266,13 @@ int main(int argc, char *argv[])
if(CURL_SOCKET_BAD == msgsock)
goto sws_cleanup;
} while(msgsock > 0);
+ active--;
}
/* Service all connections that are ready */
- for(socket_idx = 1; socket_idx < num_sockets; ++socket_idx) {
+ for(socket_idx = 1; (socket_idx < num_sockets) && active; ++socket_idx) {
if(FD_ISSET(all_sockets[socket_idx], &input)) {
+ active--;
if(got_exit_signal)
goto sws_cleanup;
@@ -2366,7 +2350,7 @@ sws_cleanup:
clear_advisor_read_lock(SERVERLOGS_LOCK);
}
- restore_signal_handlers();
+ restore_signal_handlers(false);
if(got_exit_signal) {
logmsg("========> %s sws (%s pid: %ld) exits with signal (%d)",
diff --git a/tests/server/testpart.c b/tests/server/testpart.c
index 7d31e5183..9c295e0f5 100644
--- a/tests/server/testpart.c
+++ b/tests/server/testpart.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/server/tftp.h b/tests/server/tftp.h
index 3cdd6e6d0..62a0cc35e 100644
--- a/tests/server/tftp.h
+++ b/tests/server/tftp.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c
index 35419b0b9..4215bfe4a 100644
--- a/tests/server/tftpd.c
+++ b/tests/server/tftpd.c
@@ -15,7 +15,8 @@
*/
/*
- * Copyright (c) 1983 Regents of the University of California.
+ * Copyright (C) 2005 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (c) 1983, Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -77,7 +78,9 @@
#include <sys/filio.h>
#endif
+#ifdef HAVE_SETJMP_H
#include <setjmp.h>
+#endif
#ifdef HAVE_PWD_H
#include <pwd.h>
@@ -209,6 +212,7 @@ static const char *ipv_inuse = "IPv4";
const char *serverlogfile = DEFAULT_LOGFILE;
static const char *pidname = ".tftpd.pid";
+static const char *portfile = NULL;
static int serverlogslocked = 0;
static int wrotepidfile = 0;
@@ -220,44 +224,6 @@ static sigjmp_buf timeoutbuf;
static const unsigned int rexmtval = TIMEOUT;
#endif
-/* do-nothing macro replacement for systems which lack siginterrupt() */
-
-#ifndef HAVE_SIGINTERRUPT
-#define siginterrupt(x,y) do {} while(0)
-#endif
-
-/* vars used to keep around previous signal handlers */
-
-typedef RETSIGTYPE (*SIGHANDLER_T)(int);
-
-#ifdef SIGHUP
-static SIGHANDLER_T old_sighup_handler = SIG_ERR;
-#endif
-
-#ifdef SIGPIPE
-static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
-#endif
-
-#ifdef SIGINT
-static SIGHANDLER_T old_sigint_handler = SIG_ERR;
-#endif
-
-#ifdef SIGTERM
-static SIGHANDLER_T old_sigterm_handler = SIG_ERR;
-#endif
-
-#if defined(SIGBREAK) && defined(WIN32)
-static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
-#endif
-
-/* var which if set indicates that the program should finish execution */
-
-SIG_ATOMIC_T got_exit_signal = 0;
-
-/* if next is set indicates the first signal handled in exit_signal_handler */
-
-static volatile int exit_signal = 0;
-
/*****************************************************************************
* FUNCTION PROTOTYPES *
*****************************************************************************/
@@ -294,12 +260,6 @@ static void justtimeout(int signum);
#endif /* HAVE_ALARM && SIGALRM */
-static RETSIGTYPE exit_signal_handler(int signum);
-
-static void install_signal_handlers(void);
-
-static void restore_signal_handlers(void);
-
/*****************************************************************************
* FUNCTION IMPLEMENTATIONS *
*****************************************************************************/
@@ -347,86 +307,6 @@ static void justtimeout(int signum)
#endif /* HAVE_ALARM && SIGALRM */
-/* signal handler that will be triggered to indicate that the program
- should finish its execution in a controlled manner as soon as possible.
- The first time this is called it will set got_exit_signal to one and
- store in exit_signal the signal that triggered its execution. */
-
-static RETSIGTYPE exit_signal_handler(int signum)
-{
- int old_errno = errno;
- if(got_exit_signal == 0) {
- got_exit_signal = 1;
- exit_signal = signum;
- }
- (void)signal(signum, exit_signal_handler);
- errno = old_errno;
-}
-
-static void install_signal_handlers(void)
-{
-#ifdef SIGHUP
- /* ignore SIGHUP signal */
- old_sighup_handler = signal(SIGHUP, SIG_IGN);
- if(old_sighup_handler == SIG_ERR)
- logmsg("cannot install SIGHUP handler: %s", strerror(errno));
-#endif
-#ifdef SIGPIPE
- /* ignore SIGPIPE signal */
- old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
- if(old_sigpipe_handler == SIG_ERR)
- logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
-#endif
-#ifdef SIGINT
- /* handle SIGINT signal with our exit_signal_handler */
- old_sigint_handler = signal(SIGINT, exit_signal_handler);
- if(old_sigint_handler == SIG_ERR)
- logmsg("cannot install SIGINT handler: %s", strerror(errno));
- else
- siginterrupt(SIGINT, 1);
-#endif
-#ifdef SIGTERM
- /* handle SIGTERM signal with our exit_signal_handler */
- old_sigterm_handler = signal(SIGTERM, exit_signal_handler);
- if(old_sigterm_handler == SIG_ERR)
- logmsg("cannot install SIGTERM handler: %s", strerror(errno));
- else
- siginterrupt(SIGTERM, 1);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- /* handle SIGBREAK signal with our exit_signal_handler */
- old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
- if(old_sigbreak_handler == SIG_ERR)
- logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
- else
- siginterrupt(SIGBREAK, 1);
-#endif
-}
-
-static void restore_signal_handlers(void)
-{
-#ifdef SIGHUP
- if(SIG_ERR != old_sighup_handler)
- (void)signal(SIGHUP, old_sighup_handler);
-#endif
-#ifdef SIGPIPE
- if(SIG_ERR != old_sigpipe_handler)
- (void)signal(SIGPIPE, old_sigpipe_handler);
-#endif
-#ifdef SIGINT
- if(SIG_ERR != old_sigint_handler)
- (void)signal(SIGINT, old_sigint_handler);
-#endif
-#ifdef SIGTERM
- if(SIG_ERR != old_sigterm_handler)
- (void)signal(SIGTERM, old_sigterm_handler);
-#endif
-#if defined(SIGBREAK) && defined(WIN32)
- if(SIG_ERR != old_sigbreak_handler)
- (void)signal(SIGBREAK, old_sigbreak_handler);
-#endif
-}
-
/*
* init for either read-ahead or write-behind.
* zero for write-behind, one for read-head.
@@ -697,6 +577,11 @@ int main(int argc, char **argv)
if(argc>arg)
pidname = argv[arg++];
}
+ else if(!strcmp("--portfile", argv[arg])) {
+ arg++;
+ if(argc>arg)
+ portfile = argv[arg++];
+ }
else if(!strcmp("--logfile", argv[arg])) {
arg++;
if(argc>arg)
@@ -721,12 +606,6 @@ int main(int argc, char **argv)
if(argc>arg) {
char *endptr;
unsigned long ulnum = strtoul(argv[arg], &endptr, 10);
- if((endptr != argv[arg] + strlen(argv[arg])) ||
- (ulnum < 1025UL) || (ulnum > 65535UL)) {
- fprintf(stderr, "tftpd: invalid --port argument (%s)\n",
- argv[arg]);
- return 0;
- }
port = curlx_ultous(ulnum);
arg++;
}
@@ -756,7 +635,7 @@ int main(int argc, char **argv)
atexit(win32_cleanup);
#endif
- install_signal_handlers();
+ install_signal_handlers(true);
pid = (long)getpid();
@@ -813,12 +692,64 @@ int main(int argc, char **argv)
goto tftpd_cleanup;
}
+ if(!port) {
+ /* The system was supposed to choose a port number, figure out which
+ port we actually got and update the listener port value with it. */
+ curl_socklen_t la_size;
+ srvr_sockaddr_union_t localaddr;
+#ifdef ENABLE_IPV6
+ if(!use_ipv6)
+#endif
+ la_size = sizeof(localaddr.sa4);
+#ifdef ENABLE_IPV6
+ else
+ la_size = sizeof(localaddr.sa6);
+#endif
+ memset(&localaddr.sa, 0, (size_t)la_size);
+ if(getsockname(sock, &localaddr.sa, &la_size) < 0) {
+ error = SOCKERRNO;
+ logmsg("getsockname() failed with error: (%d) %s",
+ error, strerror(error));
+ sclose(sock);
+ goto tftpd_cleanup;
+ }
+ switch(localaddr.sa.sa_family) {
+ case AF_INET:
+ port = ntohs(localaddr.sa4.sin_port);
+ break;
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ port = ntohs(localaddr.sa6.sin6_port);
+ break;
+#endif
+ default:
+ break;
+ }
+ if(!port) {
+ /* Real failure, listener port shall not be zero beyond this point. */
+ logmsg("Apparently getsockname() succeeded, with listener port zero.");
+ logmsg("A valid reason for this failure is a binary built without");
+ logmsg("proper network library linkage. This might not be the only");
+ logmsg("reason, but double check it before anything else.");
+ result = 2;
+ goto tftpd_cleanup;
+ }
+ }
+
wrotepidfile = write_pidfile(pidname);
if(!wrotepidfile) {
result = 1;
goto tftpd_cleanup;
}
+ if(portfile) {
+ wrotepidfile = write_portfile(portfile, port);
+ if(!wrotepidfile) {
+ result = 1;
+ goto tftpd_cleanup;
+ }
+ }
+
logmsg("Running %s version on port UDP/%d", ipv_inuse, (int)port);
for(;;) {
@@ -923,13 +854,15 @@ tftpd_cleanup:
if(wrotepidfile)
unlink(pidname);
+ if(portfile)
+ unlink(portfile);
if(serverlogslocked) {
serverlogslocked = 0;
clear_advisor_read_lock(SERVERLOGS_LOCK);
}
- restore_signal_handlers();
+ restore_signal_handlers(true);
if(got_exit_signal) {
logmsg("========> %s tftpd (port: %d pid: %ld) exits with signal (%d)",
@@ -1067,16 +1000,12 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size)
static int parse_servercmd(struct testcase *req)
{
FILE *stream;
- char *filename;
int error;
- filename = test2file(req->testno);
-
- stream = fopen(filename, "rb");
+ stream = test2fopen(req->testno);
if(!stream) {
error = errno;
logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg(" [1] Error opening file: %s", filename);
logmsg(" Couldn't open test file %ld", req->testno);
return 1; /* done */
}
@@ -1159,7 +1088,7 @@ static int validate_access(struct testcase *test,
char partbuf[80]="data";
long partno;
long testno;
- char *file;
+ FILE *stream;
ptr++; /* skip the slash */
@@ -1184,40 +1113,33 @@ static int validate_access(struct testcase *test,
(void)parse_servercmd(test);
- file = test2file(testno);
+ stream = test2fopen(testno);
if(0 != partno)
msnprintf(partbuf, sizeof(partbuf), "data%ld", partno);
- if(file) {
- FILE *stream = fopen(file, "rb");
- if(!stream) {
- int error = errno;
- logmsg("fopen() failed with error: %d %s", error, strerror(error));
- logmsg("Error opening file: %s", file);
- logmsg("Couldn't open test file: %s", file);
+ if(!stream) {
+ int error = errno;
+ logmsg("fopen() failed with error: %d %s", error, strerror(error));
+ logmsg("Couldn't open test file for test : %d", testno);
+ return EACCESS;
+ }
+ else {
+ size_t count;
+ int error = getpart(&test->buffer, &count, "reply", partbuf, stream);
+ fclose(stream);
+ if(error) {
+ logmsg("getpart() failed with error: %d", error);
return EACCESS;
}
- else {
- size_t count;
- int error = getpart(&test->buffer, &count, "reply", partbuf, stream);
- fclose(stream);
- if(error) {
- logmsg("getpart() failed with error: %d", error);
- return EACCESS;
- }
- if(test->buffer) {
- test->rptr = test->buffer; /* set read pointer */
- test->bufsize = count; /* set total count */
- test->rcount = count; /* set data left to read */
- }
- else
- return EACCESS;
+ if(test->buffer) {
+ test->rptr = test->buffer; /* set read pointer */
+ test->bufsize = count; /* set total count */
+ test->rcount = count; /* set data left to read */
}
-
+ else
+ return EACCESS;
}
- else
- return EACCESS;
}
else {
logmsg("no slash found in path");
@@ -1263,8 +1185,9 @@ static void sendtftp(struct testcase *test, struct formats *pf)
}
send_data:
+ logmsg("write");
if(swrite(peer, sdp, size + 4) != size + 4) {
- logmsg("write");
+ logmsg("write: fail");
return;
}
read_ahead(test, pf->f_convert);
@@ -1272,7 +1195,9 @@ static void sendtftp(struct testcase *test, struct formats *pf)
#ifdef HAVE_ALARM
alarm(rexmtval); /* read the ack */
#endif
+ logmsg("read");
n = sread(peer, &ackbuf.storage[0], sizeof(ackbuf.storage));
+ logmsg("read: %zd", n);
#ifdef HAVE_ALARM
alarm(0);
#endif
@@ -1332,8 +1257,9 @@ static void recvtftp(struct testcase *test, struct formats *pf)
(void) sigsetjmp(timeoutbuf, 1);
#endif
send_ack:
+ logmsg("write");
if(swrite(peer, &ackbuf.storage[0], 4) != 4) {
- logmsg("write: fail\n");
+ logmsg("write: fail");
goto abort;
}
write_behind(test, pf->f_convert);
@@ -1341,14 +1267,16 @@ send_ack:
#ifdef HAVE_ALARM
alarm(rexmtval);
#endif
+ logmsg("read");
n = sread(peer, rdp, PKTSIZE);
+ logmsg("read: %zd", n);
#ifdef HAVE_ALARM
alarm(0);
#endif
if(got_exit_signal)
goto abort;
if(n < 0) { /* really? */
- logmsg("read: fail\n");
+ logmsg("read: fail");
goto abort;
}
rdp->th_opcode = ntohs((unsigned short)rdp->th_opcode);
diff --git a/tests/server/util.c b/tests/server/util.c
index cc53d3bf4..7dac532d7 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -119,6 +119,7 @@ void logmsg(const char *msg, ...)
known_offset = 1;
}
sec = epoch_offset + tv.tv_sec;
+ /* !checksrc! disable BANNEDFUNC 1 */
now = localtime(&sec); /* not thread safe but we don't care */
msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
@@ -150,7 +151,8 @@ void win32_perror(const char *msg)
char buf[512];
DWORD err = SOCKERRNO;
- if(!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
LANG_NEUTRAL, buf, sizeof(buf), NULL))
msnprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err);
if(msg)
@@ -165,8 +167,8 @@ void win32_init(void)
WORD wVersionRequested;
WSADATA wsaData;
int err;
- wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK);
+ wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) {
@@ -175,8 +177,8 @@ void win32_init(void)
exit(1);
}
- if(LOBYTE(wsaData.wVersion) != USE_WINSOCK ||
- HIBYTE(wsaData.wVersion) != USE_WINSOCK) {
+ if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
+ HIBYTE(wsaData.wVersion) != HIBYTE(wVersionRequested) ) {
WSACleanup();
perror("Winsock init failed");
logmsg("No suitable winsock.dll found -- aborting");
@@ -193,11 +195,21 @@ void win32_cleanup(void)
/* set by the main code to point to where the test dir is */
const char *path = ".";
-char *test2file(long testno)
+FILE *test2fopen(long testno)
{
- static char filename[256];
+ FILE *stream;
+ char filename[256];
+ /* first try the alternative, preprocessed, file */
+ msnprintf(filename, sizeof(filename), ALTTEST_DATA_PATH, ".", testno);
+ stream = fopen(filename, "rb");
+ if(stream)
+ return stream;
+
+ /* then try the source version */
msnprintf(filename, sizeof(filename), TEST_DATA_PATH, path, testno);
- return filename;
+ stream = fopen(filename, "rb");
+
+ return stream;
}
/*
@@ -260,17 +272,40 @@ int wait_ms(int timeout_ms)
int write_pidfile(const char *filename)
{
FILE *pidfile;
- long pid;
+ curl_off_t pid;
- pid = (long)getpid();
+ pid = (curl_off_t)getpid();
pidfile = fopen(filename, "wb");
if(!pidfile) {
logmsg("Couldn't write pid file: %s %s", filename, strerror(errno));
return 0; /* fail */
}
- fprintf(pidfile, "%ld\n", pid);
+#if defined(WIN32) || defined(_WIN32)
+ /* store pid + 65536 to avoid conflict with Cygwin/msys PIDs, see also:
+ * - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
+ * h=b5e1003722cb14235c4f166be72c09acdffc62ea
+ * - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
+ * h=448cf5aa4b429d5a9cebf92a0da4ab4b5b6d23fe
+ */
+ pid += 65536;
+#endif
+ fprintf(pidfile, "%" CURL_FORMAT_CURL_OFF_T "\n", pid);
fclose(pidfile);
- logmsg("Wrote pid %ld to %s", pid, filename);
+ logmsg("Wrote pid %" CURL_FORMAT_CURL_OFF_T " to %s", pid, filename);
+ return 1; /* success */
+}
+
+/* store the used port number in a file */
+int write_portfile(const char *filename, int port)
+{
+ FILE *portfile = fopen(filename, "wb");
+ if(!portfile) {
+ logmsg("Couldn't write port file: %s %s", filename, strerror(errno));
+ return 0; /* fail */
+ }
+ fprintf(portfile, "%d\n", port);
+ fclose(portfile);
+ logmsg("Wrote port %d to %s", port, filename);
return 1; /* success */
}
@@ -441,7 +476,7 @@ static struct timeval tvnow(void)
struct timespec tsnow;
if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
now.tv_sec = tsnow.tv_sec;
- now.tv_usec = tsnow.tv_nsec / 1000;
+ now.tv_usec = (int)(tsnow.tv_nsec / 1000);
}
/*
** Even when the configure process has truly detected monotonic clock
@@ -499,3 +534,305 @@ long timediff(struct timeval newer, struct timeval older)
return (long)(newer.tv_sec-older.tv_sec)*1000+
(long)(newer.tv_usec-older.tv_usec)/1000;
}
+
+/* do-nothing macro replacement for systems which lack siginterrupt() */
+
+#ifndef HAVE_SIGINTERRUPT
+#define siginterrupt(x,y) do {} while(0)
+#endif
+
+/* vars used to keep around previous signal handlers */
+
+typedef RETSIGTYPE (*SIGHANDLER_T)(int);
+
+#ifdef SIGHUP
+static SIGHANDLER_T old_sighup_handler = SIG_ERR;
+#endif
+
+#ifdef SIGPIPE
+static SIGHANDLER_T old_sigpipe_handler = SIG_ERR;
+#endif
+
+#ifdef SIGALRM
+static SIGHANDLER_T old_sigalrm_handler = SIG_ERR;
+#endif
+
+#ifdef SIGINT
+static SIGHANDLER_T old_sigint_handler = SIG_ERR;
+#endif
+
+#ifdef SIGTERM
+static SIGHANDLER_T old_sigterm_handler = SIG_ERR;
+#endif
+
+#if defined(SIGBREAK) && defined(WIN32)
+static SIGHANDLER_T old_sigbreak_handler = SIG_ERR;
+#endif
+
+#ifdef WIN32
+static DWORD thread_main_id = 0;
+static HANDLE thread_main_window = NULL;
+static HWND hidden_main_window = NULL;
+#endif
+
+/* var which if set indicates that the program should finish execution */
+volatile int got_exit_signal = 0;
+
+/* if next is set indicates the first signal handled in exit_signal_handler */
+volatile int exit_signal = 0;
+
+#ifdef WIN32
+/* event which if set indicates that the program should finish */
+HANDLE exit_event = NULL;
+#endif
+
+/* signal handler that will be triggered to indicate that the program
+ * should finish its execution in a controlled manner as soon as possible.
+ * The first time this is called it will set got_exit_signal to one and
+ * store in exit_signal the signal that triggered its execution.
+ */
+static RETSIGTYPE exit_signal_handler(int signum)
+{
+ int old_errno = errno;
+ logmsg("exit_signal_handler: %d", signum);
+ if(got_exit_signal == 0) {
+ got_exit_signal = 1;
+ exit_signal = signum;
+#ifdef WIN32
+ if(exit_event)
+ (void)SetEvent(exit_event);
+#endif
+ }
+ (void)signal(signum, exit_signal_handler);
+ errno = old_errno;
+}
+
+#ifdef WIN32
+/* CTRL event handler for Windows Console applications to simulate
+ * SIGINT, SIGTERM and SIGBREAK on CTRL events and trigger signal handler.
+ *
+ * Background information from MSDN:
+ * SIGINT is not supported for any Win32 application. When a CTRL+C
+ * interrupt occurs, Win32 operating systems generate a new thread
+ * to specifically handle that interrupt. This can cause a single-thread
+ * application, such as one in UNIX, to become multithreaded and cause
+ * unexpected behavior.
+ * [...]
+ * The SIGILL and SIGTERM signals are not generated under Windows.
+ * They are included for ANSI compatibility. Therefore, you can set
+ * signal handlers for these signals by using signal, and you can also
+ * explicitly generate these signals by calling raise. Source:
+ * https://docs.microsoft.com/de-de/cpp/c-runtime-library/reference/signal
+ */
+static BOOL WINAPI ctrl_event_handler(DWORD dwCtrlType)
+{
+ int signum = 0;
+ logmsg("ctrl_event_handler: %d", dwCtrlType);
+ switch(dwCtrlType) {
+#ifdef SIGINT
+ case CTRL_C_EVENT: signum = SIGINT; break;
+#endif
+#ifdef SIGTERM
+ case CTRL_CLOSE_EVENT: signum = SIGTERM; break;
+#endif
+#ifdef SIGBREAK
+ case CTRL_BREAK_EVENT: signum = SIGBREAK; break;
+#endif
+ default: return FALSE;
+ }
+ if(signum) {
+ logmsg("ctrl_event_handler: %d -> %d", dwCtrlType, signum);
+ raise(signum);
+ }
+ return TRUE;
+}
+/* Window message handler for Windows applications to add support
+ * for graceful process termination via taskkill (without /f) which
+ * sends WM_CLOSE to all Windows of a process (even hidden ones).
+ *
+ * Therefore we create and run a hidden Window in a separate thread
+ * to receive and handle the WM_CLOSE message as SIGTERM signal.
+ */
+static LRESULT CALLBACK main_window_proc(HWND hwnd, UINT uMsg,
+ WPARAM wParam, LPARAM lParam)
+{
+ int signum = 0;
+ if(hwnd == hidden_main_window) {
+ switch(uMsg) {
+#ifdef SIGTERM
+ case WM_CLOSE: signum = SIGTERM; break;
+#endif
+ case WM_DESTROY: PostQuitMessage(0); break;
+ }
+ if(signum) {
+ logmsg("main_window_proc: %d -> %d", uMsg, signum);
+ raise(signum);
+ }
+ }
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+/* Window message queue loop for hidden main window, details see above.
+ */
+static DWORD WINAPI main_window_loop(LPVOID lpParameter)
+{
+ WNDCLASS wc;
+ BOOL ret;
+ MSG msg;
+
+ ZeroMemory(&wc, sizeof(wc));
+ wc.lpfnWndProc = (WNDPROC)main_window_proc;
+ wc.hInstance = (HINSTANCE)lpParameter;
+ wc.lpszClassName = TEXT("MainWClass");
+ if(!RegisterClass(&wc)) {
+ perror("RegisterClass failed");
+ return (DWORD)-1;
+ }
+
+ hidden_main_window = CreateWindowEx(0, TEXT("MainWClass"),
+ TEXT("Recv WM_CLOSE msg"),
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ (HWND)NULL, (HMENU)NULL,
+ wc.hInstance, (LPVOID)NULL);
+ if(!hidden_main_window) {
+ perror("CreateWindowEx failed");
+ return (DWORD)-1;
+ }
+
+ do {
+ ret = GetMessage(&msg, NULL, 0, 0);
+ if(ret == -1) {
+ perror("GetMessage failed");
+ return (DWORD)-1;
+ }
+ else if(ret) {
+ if(msg.message == WM_APP) {
+ DestroyWindow(hidden_main_window);
+ }
+ else if(msg.hwnd && !TranslateMessage(&msg)) {
+ DispatchMessage(&msg);
+ }
+ }
+ } while(ret);
+
+ hidden_main_window = NULL;
+ return (DWORD)msg.wParam;
+}
+#endif
+
+void install_signal_handlers(bool keep_sigalrm)
+{
+#ifdef WIN32
+ /* setup windows exit event before any signal can trigger */
+ exit_event = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if(!exit_event)
+ logmsg("cannot create exit event");
+#endif
+#ifdef SIGHUP
+ /* ignore SIGHUP signal */
+ old_sighup_handler = signal(SIGHUP, SIG_IGN);
+ if(old_sighup_handler == SIG_ERR)
+ logmsg("cannot install SIGHUP handler: %s", strerror(errno));
+#endif
+#ifdef SIGPIPE
+ /* ignore SIGPIPE signal */
+ old_sigpipe_handler = signal(SIGPIPE, SIG_IGN);
+ if(old_sigpipe_handler == SIG_ERR)
+ logmsg("cannot install SIGPIPE handler: %s", strerror(errno));
+#endif
+#ifdef SIGALRM
+ if(!keep_sigalrm) {
+ /* ignore SIGALRM signal */
+ old_sigalrm_handler = signal(SIGALRM, SIG_IGN);
+ if(old_sigalrm_handler == SIG_ERR)
+ logmsg("cannot install SIGALRM handler: %s", strerror(errno));
+ }
+#else
+ (void)keep_sigalrm;
+#endif
+#ifdef SIGINT
+ /* handle SIGINT signal with our exit_signal_handler */
+ old_sigint_handler = signal(SIGINT, exit_signal_handler);
+ if(old_sigint_handler == SIG_ERR)
+ logmsg("cannot install SIGINT handler: %s", strerror(errno));
+ else
+ siginterrupt(SIGINT, 1);
+#endif
+#ifdef SIGTERM
+ /* handle SIGTERM signal with our exit_signal_handler */
+ old_sigterm_handler = signal(SIGTERM, exit_signal_handler);
+ if(old_sigterm_handler == SIG_ERR)
+ logmsg("cannot install SIGTERM handler: %s", strerror(errno));
+ else
+ siginterrupt(SIGTERM, 1);
+#endif
+#if defined(SIGBREAK) && defined(WIN32)
+ /* handle SIGBREAK signal with our exit_signal_handler */
+ old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler);
+ if(old_sigbreak_handler == SIG_ERR)
+ logmsg("cannot install SIGBREAK handler: %s", strerror(errno));
+ else
+ siginterrupt(SIGBREAK, 1);
+#endif
+#ifdef WIN32
+ if(!SetConsoleCtrlHandler(ctrl_event_handler, TRUE))
+ logmsg("cannot install CTRL event handler");
+ thread_main_window = CreateThread(NULL, 0,
+ &main_window_loop,
+ (LPVOID)GetModuleHandle(NULL),
+ 0, &thread_main_id);
+ if(!thread_main_window || !thread_main_id)
+ logmsg("cannot start main window loop");
+#endif
+}
+
+void restore_signal_handlers(bool keep_sigalrm)
+{
+#ifdef SIGHUP
+ if(SIG_ERR != old_sighup_handler)
+ (void)signal(SIGHUP, old_sighup_handler);
+#endif
+#ifdef SIGPIPE
+ if(SIG_ERR != old_sigpipe_handler)
+ (void)signal(SIGPIPE, old_sigpipe_handler);
+#endif
+#ifdef SIGALRM
+ if(!keep_sigalrm) {
+ if(SIG_ERR != old_sigalrm_handler)
+ (void)signal(SIGALRM, old_sigalrm_handler);
+ }
+#else
+ (void)keep_sigalrm;
+#endif
+#ifdef SIGINT
+ if(SIG_ERR != old_sigint_handler)
+ (void)signal(SIGINT, old_sigint_handler);
+#endif
+#ifdef SIGTERM
+ if(SIG_ERR != old_sigterm_handler)
+ (void)signal(SIGTERM, old_sigterm_handler);
+#endif
+#if defined(SIGBREAK) && defined(WIN32)
+ if(SIG_ERR != old_sigbreak_handler)
+ (void)signal(SIGBREAK, old_sigbreak_handler);
+#endif
+#ifdef WIN32
+ (void)SetConsoleCtrlHandler(ctrl_event_handler, FALSE);
+ if(thread_main_window && thread_main_id) {
+ if(PostThreadMessage(thread_main_id, WM_APP, 0, 0)) {
+ if(WaitForSingleObjectEx(thread_main_window, INFINITE, TRUE)) {
+ if(CloseHandle(thread_main_window)) {
+ thread_main_window = NULL;
+ thread_main_id = 0;
+ }
+ }
+ }
+ }
+ if(exit_event) {
+ if(CloseHandle(exit_event)) {
+ exit_event = NULL;
+ }
+ }
+#endif
+}
diff --git a/tests/server/util.h b/tests/server/util.h
index 7b4ec1626..629539205 100644
--- a/tests/server/util.h
+++ b/tests/server/util.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,6 +28,7 @@ void logmsg(const char *msg, ...);
long timediff(struct timeval newer, struct timeval older);
#define TEST_DATA_PATH "%s/data/test%ld"
+#define ALTTEST_DATA_PATH "%s/log/test%ld"
#define SERVERLOGS_LOCK "log/serverlogs.lock"
@@ -37,33 +38,46 @@ extern const char *path;
/* global variable, log file name */
extern const char *serverlogfile;
-#ifdef WIN32
+extern const char *cmdfile;
+
+#if defined(WIN32) || defined(_WIN32)
#include <process.h>
#include <fcntl.h>
-#define sleep(sec) Sleep ((sec)*1000)
+#define sleep(sec) Sleep ((sec)*1000)
#undef perror
#define perror(m) win32_perror(m)
void win32_perror(const char *msg);
-#endif /* WIN32 */
+#endif /* WIN32 or _WIN32 */
#ifdef USE_WINSOCK
void win32_init(void);
void win32_cleanup(void);
#endif /* USE_WINSOCK */
-/* returns the path name to the test case file */
-char *test2file(long testno);
+/* fopens the test case file */
+FILE *test2fopen(long testno);
int wait_ms(int timeout_ms);
-
int write_pidfile(const char *filename);
-
+int write_portfile(const char *filename, int port);
void set_advisor_read_lock(const char *filename);
-
void clear_advisor_read_lock(const char *filename);
-
int strncasecompare(const char *first, const char *second, size_t max);
+/* global variable which if set indicates that the program should finish */
+extern volatile int got_exit_signal;
+
+/* global variable which if set indicates the first signal handled */
+extern volatile int exit_signal;
+
+#ifdef WIN32
+/* global event which if set indicates that the program should finish */
+extern HANDLE exit_event;
+#endif
+
+void install_signal_handlers(bool keep_sigalrm);
+void restore_signal_handlers(bool keep_sigalrm);
+
#endif /* HEADER_CURL_SERVER_UTIL_H */
diff --git a/tests/serverhelp.pm b/tests/serverhelp.pm
index 7c9808c82..466091fcc 100644
--- a/tests/serverhelp.pm
+++ b/tests/serverhelp.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -51,6 +51,7 @@ use vars qw(
servername_str
servername_canon
server_pidfilename
+ server_portfilename
server_logfilename
server_cmdfilename
server_inputfilename
@@ -105,7 +106,7 @@ sub servername_str {
$proto = uc($proto) if($proto);
die "unsupported protocol: '$proto'" unless($proto &&
- ($proto =~ /^(((FTP|HTTP|HTTP\/2|IMAP|POP3|SMTP|HTTP-PIPE)S?)|(TFTP|SFTP|SOCKS|SSH|RTSP|GOPHER|HTTPTLS|DICT|SMB|SMBS|TELNET))$/));
+ ($proto =~ /^(((FTP|HTTP|HTTP\/2|IMAP|POP3|SMTP|HTTP-PIPE)S?)|(TFTP|SFTP|SOCKS|SSH|RTSP|GOPHER|HTTPTLS|DICT|SMB|SMBS|TELNET|MQTT))$/));
$ipver = (not $ipver) ? 'ipv4' : lc($ipver);
die "unsupported IP version: '$ipver'" unless($ipver &&
@@ -151,6 +152,15 @@ sub server_pidfilename {
return '.'. servername_canon($proto, $ipver, $idnum) ."$trailer";
}
+#***************************************************************************
+# Return file name for server port file.
+#
+sub server_portfilename {
+ my ($proto, $ipver, $idnum) = @_;
+ my $trailer = '_server.port';
+ return '.'. servername_canon($proto, $ipver, $idnum) ."$trailer";
+}
+
#***************************************************************************
# Return file name for server log file.
diff --git a/tests/smbserver.py b/tests/smbserver.py
index 4fcd34f2b..30caa04b7 100755
--- a/tests/smbserver.py
+++ b/tests/smbserver.py
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -22,23 +22,27 @@
"""Server for testing SMB"""
from __future__ import (absolute_import, division, print_function)
-# unicode_literals)
+# NOTE: the impacket configuration is not unicode_literals compatible!
import argparse
import os
import sys
import logging
import tempfile
-try: # Python 3
+if sys.version_info.major >= 3:
import configparser
-except ImportError: # Python 2
+else:
import ConfigParser as configparser
# Import our curl test data helper
import curl_test_data
-# This saves us having to set up the PYTHONPATH explicitly
-deps_dir = os.path.join(os.path.dirname(__file__), "python_dependencies")
-sys.path.append(deps_dir)
+# impacket needs to be installed in the Python environment
+try:
+ import impacket
+except ImportError:
+ sys.stderr.write('Python package impacket needs to be installed!\n')
+ sys.stderr.write('Use pip or your package manager to install it.\n')
+ sys.exit(1)
from impacket import smbserver as imp_smbserver
from impacket import smb as imp_smb
from impacket.nt_errors import (STATUS_ACCESS_DENIED, STATUS_SUCCESS,
@@ -48,7 +52,7 @@ log = logging.getLogger(__name__)
SERVER_MAGIC = "SERVER_MAGIC"
TESTS_MAGIC = "TESTS_MAGIC"
VERIFIED_REQ = "verifiedserver"
-VERIFIED_RSP = b"WE ROOLZ: {pid}\n"
+VERIFIED_RSP = "WE ROOLZ: {pid}\n"
def smbserver(options):
@@ -57,8 +61,11 @@ def smbserver(options):
"""
if options.pidfile:
pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
with open(options.pidfile, "w") as f:
- f.write("{0}".format(pid))
+ f.write(str(pid))
# Here we write a mini config for the server
smb_config = configparser.ConfigParser()
@@ -263,7 +270,11 @@ class TestSmbServer(imp_smbserver.SMBSERVER):
if requested_filename == VERIFIED_REQ:
log.debug("[SMB] Verifying server is alive")
- contents = VERIFIED_RSP.format(pid=os.getpid())
+ pid = os.getpid()
+ # see tests/server/util.c function write_pidfile
+ if os.name == "nt":
+ pid += 65536
+ contents = VERIFIED_RSP.format(pid=pid).encode('utf-8')
self.write_to_fid(fid, contents)
return fid, filename
@@ -284,7 +295,7 @@ class TestSmbServer(imp_smbserver.SMBSERVER):
filename, fid, requested_filename)
try:
- contents = self.ctd.get_test_data(requested_filename)
+ contents = self.ctd.get_test_data(requested_filename).encode('utf-8')
self.write_to_fid(fid, contents)
return fid, filename
diff --git a/tests/sshhelp.pm b/tests/sshhelp.pm
index 47ea2324c..cd7f58fc1 100644
--- a/tests/sshhelp.pm
+++ b/tests/sshhelp.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -50,6 +50,7 @@ use vars qw(
$sftpcmds
$hstprvkeyf
$hstpubkeyf
+ $hstpubmd5f
$cliprvkeyf
$clipubkeyf
@sftppath
@@ -82,6 +83,7 @@ use vars qw(
$sftpcmds
$hstprvkeyf
$hstpubkeyf
+ $hstpubmd5f
$cliprvkeyf
$clipubkeyf
display_sshdconfig
@@ -106,12 +108,12 @@ use vars qw(
#***************************************************************************
# Global variables initialization
#
-$sshdexe = 'sshd' .exe_ext(); # base name and ext of ssh daemon
-$sshexe = 'ssh' .exe_ext(); # base name and ext of ssh client
-$sftpsrvexe = 'sftp-server' .exe_ext(); # base name and ext of sftp-server
-$sftpexe = 'sftp' .exe_ext(); # base name and ext of sftp client
-$sshkeygenexe = 'ssh-keygen' .exe_ext(); # base name and ext of ssh-keygen
-$httptlssrvexe = 'gnutls-serv' .exe_ext(); # base name and ext of gnutls-serv
+$sshdexe = 'sshd' .exe_ext('SSH'); # base name and ext of ssh daemon
+$sshexe = 'ssh' .exe_ext('SSH'); # base name and ext of ssh client
+$sftpsrvexe = 'sftp-server' .exe_ext('SSH'); # base name and ext of sftp-server
+$sftpexe = 'sftp' .exe_ext('SSH'); # base name and ext of sftp client
+$sshkeygenexe = 'ssh-keygen' .exe_ext('SSH'); # base name and ext of ssh-keygen
+$httptlssrvexe = 'gnutls-serv' .exe_ext('SSH'); # base name and ext of gnutls-serv
$sshdconfig = 'curl_sshd_config'; # ssh daemon config file
$sshconfig = 'curl_ssh_config'; # ssh client config file
$sftpconfig = 'curl_sftp_config'; # sftp client config file
@@ -122,6 +124,7 @@ $sftpcmds = 'curl_sftp_cmds'; # sftp client commands batch file
$knownhosts = 'curl_client_knownhosts'; # ssh knownhosts file
$hstprvkeyf = 'curl_host_rsa_key'; # host private key file
$hstpubkeyf = 'curl_host_rsa_key.pub'; # host public key file
+$hstpubmd5f = 'curl_host_rsa_key.pub_md5'; # md5 hash of host public key
$cliprvkeyf = 'curl_client_key'; # client private key file
$clipubkeyf = 'curl_client_key.pub'; # client public key file
@@ -180,6 +183,13 @@ $clipubkeyf = 'curl_client_key.pub'; # client public key file
# Return file extension for executable files on this operating system
#
sub exe_ext {
+ my ($component, @arr) = @_;
+ if ($ENV{'CURL_TEST_EXE_EXT'}) {
+ return $ENV{'CURL_TEST_EXE_EXT'};
+ }
+ if ($ENV{'CURL_TEST_EXE_EXT_'.$component}) {
+ return $ENV{'CURL_TEST_EXE_EXT_'.$component};
+ }
if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' ||
$^O eq 'dos' || $^O eq 'os2') {
return '.exe';
@@ -314,7 +324,7 @@ sub find_exe_file {
my $fn = $_[0];
shift;
my @path = @_;
- my $xext = exe_ext();
+ my $xext = exe_ext('SSH');
foreach (@path) {
my $file = File::Spec->catfile($_, $fn);
if(-e $file && ! -d $file) {
diff --git a/tests/sshserver.pl b/tests/sshserver.pl
index bcb2f1b3a..5cff897a3 100644
--- a/tests/sshserver.pl
+++ b/tests/sshserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -28,6 +28,9 @@ use strict;
use warnings;
use Cwd;
use Cwd 'abs_path';
+use Digest::MD5;
+use Digest::MD5 'md5_hex';
+use MIME::Base64;
#***************************************************************************
# Variables and subs imported from sshhelp module
@@ -48,6 +51,7 @@ use sshhelp qw(
$sftpcmds
$hstprvkeyf
$hstpubkeyf
+ $hstpubmd5f
$cliprvkeyf
$clipubkeyf
display_sshdconfig
@@ -357,10 +361,11 @@ if((($sshid =~ /OpenSSH/) && ($sshvernum < 299)) ||
#
if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) ||
(! -e $hstpubkeyf) || (! -s $hstpubkeyf) ||
+ (! -e $hstpubmd5f) || (! -s $hstpubmd5f) ||
(! -e $cliprvkeyf) || (! -s $cliprvkeyf) ||
(! -e $clipubkeyf) || (! -s $clipubkeyf)) {
# Make sure all files are gone so ssh-keygen doesn't complain
- unlink($hstprvkeyf, $hstpubkeyf, $cliprvkeyf, $clipubkeyf);
+ unlink($hstprvkeyf, $hstpubkeyf, $hstpubmd5f, $cliprvkeyf, $clipubkeyf);
logmsg 'generating host keys...' if($verbose);
if(system "\"$sshkeygen\" -q -t rsa -f $hstprvkeyf -C 'curl test server' -N ''") {
logmsg 'Could not generate host key';
@@ -371,6 +376,24 @@ if((! -e $hstprvkeyf) || (! -s $hstprvkeyf) ||
logmsg 'Could not generate client key';
exit 1;
}
+ # Make sure that permissions are restricted so openssh doesn't complain
+ system "chmod 600 $hstprvkeyf";
+ system "chmod 600 $cliprvkeyf";
+ # Save md5 hash of public host key
+ open(RSAKEYFILE, "<$hstpubkeyf");
+ my @rsahostkey = do { local $/ = ' '; <RSAKEYFILE> };
+ close(RSAKEYFILE);
+ if(!$rsahostkey[1]) {
+ logmsg 'Failed parsing base64 encoded RSA host key';
+ exit 1;
+ }
+ open(PUBMD5FILE, ">$hstpubmd5f");
+ print PUBMD5FILE md5_hex(decode_base64($rsahostkey[1]));
+ close(PUBMD5FILE);
+ if((! -e $hstpubmd5f) || (! -s $hstpubmd5f)) {
+ logmsg 'Failed writing md5 hash of RSA host key';
+ exit 1;
+ }
}
@@ -382,7 +405,7 @@ my $hstprvkeyf_config = abs_path("$path/$hstprvkeyf");
my $pidfile_config = $pidfile;
my $sftpsrv_config = $sftpsrv;
-if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
+if (pathhelp::os_is_win()) {
# Ensure to use MinGW/Cygwin paths
$clipubkeyf_config = pathhelp::build_sys_abs_path($clipubkeyf_config);
$hstprvkeyf_config = pathhelp::build_sys_abs_path($hstprvkeyf_config);
@@ -499,6 +522,11 @@ push @cfgarr, '#';
# and do not support quotes around values for some unknown reason.
if ($sshdid =~ /OpenSSH-Windows/) {
my $username_lc = lc $username;
+ if (exists $ENV{USERDOMAIN}) {
+ my $userdomain_lc = lc $ENV{USERDOMAIN};
+ $username_lc = "$userdomain_lc\\$username_lc";
+ }
+ $username_lc =~ s/ /\?/g; # replace space with ?
push @cfgarr, "DenyUsers !$username_lc";
push @cfgarr, "AllowUsers $username_lc";
} else {
@@ -512,7 +540,9 @@ push @cfgarr, '#';
push @cfgarr, "AuthorizedKeysFile $clipubkeyf_config";
push @cfgarr, "AuthorizedKeysFile2 $clipubkeyf_config";
push @cfgarr, "HostKey $hstprvkeyf_config";
-push @cfgarr, "PidFile $pidfile_config";
+if ($sshdid !~ /OpenSSH-Windows/) {
+ push @cfgarr, "PidFile $pidfile_config";
+}
push @cfgarr, '#';
push @cfgarr, "Port $port";
push @cfgarr, "ListenAddress $listenaddr";
@@ -774,7 +804,7 @@ if((! -e $knownhosts) || (! -s $knownhosts)) {
my $identity_config = abs_path("$path/$identity");
my $knownhosts_config = abs_path("$path/$knownhosts");
-if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
+if (pathhelp::os_is_win()) {
# Ensure to use MinGW/Cygwin paths
$identity_config = pathhelp::build_sys_abs_path($identity_config);
$knownhosts_config = pathhelp::build_sys_abs_path($knownhosts_config);
@@ -1075,12 +1105,38 @@ if($error) {
}
@cfgarr = ();
+#***************************************************************************
+# Prepare command line of ssh server daemon
+#
+my $cmd = "\"$sshd\" -e -D -f $sshdconfig > $sshdlog 2>&1";
+logmsg "SCP/SFTP server listening on port $port" if($verbose);
+logmsg "RUN: $cmd" if($verbose);
+
+#***************************************************************************
+# Start the ssh server daemon on Windows without forking it
+#
+if ($sshdid =~ /OpenSSH-Windows/) {
+ # Fake pidfile for ssh server on Windows.
+ if(open(OUT, ">$pidfile")) {
+ print OUT $$ . "\n";
+ close(OUT);
+ }
+
+ # Put an "exec" in front of the command so that the child process
+ # keeps this child's process ID by being tied to the spawned shell.
+ exec("exec $cmd") || die "Can't exec() $cmd: $!";
+ # exec() will create a new process, but ties the existence of the
+ # new process to the parent waiting perl.exe and sh.exe processes.
+
+ # exec() should never return back here to this process. We protect
+ # ourselves by calling die() just in case something goes really bad.
+ die "error: exec() has returned";
+}
#***************************************************************************
# Start the ssh server daemon without forking it
#
-logmsg "SCP/SFTP server listening on port $port" if($verbose);
-my $rc = system "\"$sshd\" -e -D -f $sshdconfig > $sshdlog 2>&1";
+my $rc = system($cmd);
if($rc == -1) {
logmsg "\"$sshd\" failed with: $!";
}
@@ -1096,8 +1152,8 @@ elsif($verbose && ($rc >> 8)) {
#***************************************************************************
# Clean up once the server has stopped
#
-unlink($hstprvkeyf, $hstpubkeyf, $cliprvkeyf, $clipubkeyf, $knownhosts);
-unlink($sshdconfig, $sshconfig, $sftpconfig);
-
+unlink($hstprvkeyf, $hstpubkeyf, $hstpubmd5f,
+ $cliprvkeyf, $clipubkeyf, $knownhosts,
+ $sshdconfig, $sshconfig, $sftpconfig);
exit 0;
diff --git a/tests/symbol-scan.pl b/tests/symbol-scan.pl
index 1379299d3..2b2d6278b 100755
--- a/tests/symbol-scan.pl
+++ b/tests/symbol-scan.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 2010-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -176,5 +176,8 @@ if($summary) {
}
if($misses) {
- exit 2; # there are stuff to attend to!
+ exit 0; # there are stuff to attend to!
+}
+else {
+ print "OK\n";
}
diff --git a/tests/testcurl.1 b/tests/testcurl.1
index 0cb415003..a15bc04b4 100644
--- a/tests/testcurl.1
+++ b/tests/testcurl.1
@@ -20,7 +20,7 @@
.\" *
.\" **************************************************************************
.\"
-.TH testcurl.pl 1 "October 22, 2016" "Curl 7.67.0" "testcurl"
+.TH testcurl.pl 1 "October 22, 2016" "Curl 7.73.0" "testcurl"
.SH NAME
testcurl.pl \- (automatically) test curl
diff --git a/tests/testcurl.pl b/tests/testcurl.pl
index 69722fb36..160683199 100755
--- a/tests/testcurl.pl
+++ b/tests/testcurl.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -173,7 +173,7 @@ if ($^O eq 'MSWin32' || $targetos) {
}
}
-if (($^O eq 'MSWin32' || $^O eq 'msys') &&
+if (($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') &&
($targetos =~ /vc/ || $targetos =~ /mingw32/ ||
$targetos =~ /borland/ || $targetos =~ /watcom/)) {
@@ -481,21 +481,13 @@ if ($git) {
open(LOG, ">$buildlog") or die;
while (<F>) {
my $ll = $_;
- # ignore messages pertaining to third party m4 files we don't care
- next if ($ll =~ /aclocal\/gtk\.m4/);
- next if ($ll =~ /aclocal\/gtkextra\.m4/);
print $ll;
print LOG $ll;
}
close(F);
close(LOG);
- if (grepfile("^buildconf: OK", $buildlog)) {
- logit "buildconf was successful";
- }
- else {
- mydie "buildconf was NOT successful";
- }
+ logit "buildconf was successful";
}
else {
logit "buildconf was successful (dummy message)";
diff --git a/tests/tftpserver.pl b/tests/tftpserver.pl
index 8c84111bf..a7b9b39df 100755
--- a/tests/tftpserver.pl
+++ b/tests/tftpserver.pl
@@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -34,13 +34,18 @@ use serverhelp qw(
server_logfilename
);
+use sshhelp qw(
+ exe_ext
+ );
+
my $verbose = 0; # set to 1 for debugging
my $port = 8997; # just a default
my $ipvnum = 4; # default IP version of tftp server
my $idnum = 1; # default tftp server instance number
my $proto = 'tftp'; # protocol the tftp server speaks
-my $pidfile; # tftp server pid file
-my $logfile; # tftp server log file
+my $pidfile;
+my $portfile;
+my $logfile;
my $srcdir;
my $fork;
@@ -55,6 +60,12 @@ while(@ARGV) {
shift @ARGV;
}
}
+ elsif($ARGV[0] eq '--portfile') {
+ if($ARGV[1]) {
+ $portfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
elsif($ARGV[0] eq '--logfile') {
if($ARGV[1]) {
$logfile = $ARGV[1];
@@ -104,7 +115,9 @@ if(!$logfile) {
$logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
}
-$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+$flags .= "--pidfile \"$pidfile\" ".
+ "--portfile \"$portfile\" ".
+ "--logfile \"$logfile\" ";
$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
-exec("server/tftpd $flags");
+exec("server/tftpd".exe_ext('SRV')." $flags");
diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt
index bc0699231..e5c4127a0 100644
--- a/tests/unit/CMakeLists.txt
+++ b/tests/unit/CMakeLists.txt
@@ -1,3 +1,27 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# TODO build a special libcurlu library for unittests.
+return()
set(UT_SRC
unit1300.c
@@ -37,20 +61,9 @@ include_directories(
foreach(_testfile ${UT_SRC})
get_filename_component(_testname ${_testfile} NAME_WE)
- add_executable(${_testname} ${_testfile} ${UT_COMMON_FILES})
+ add_executable(${_testname} EXCLUDE_FROM_ALL ${_testfile} ${UT_COMMON_FILES})
+ #add_dependencies(testdeps ${_testname})
target_link_libraries(${_testname} libcurl ${CURL_LIBS})
set_target_properties(${_testname}
PROPERTIES COMPILE_DEFINITIONS "UNITTESTS")
-
- if(HIDES_CURL_PRIVATE_SYMBOLS)
- set_target_properties(${_testname}
- PROPERTIES
- EXCLUDE_FROM_ALL TRUE
- EXCLUDE_FROM_DEFAULT_BUILD TRUE
- )
- else()
- add_test(NAME ${_testname}
- COMMAND ${_testname} "http://www.google.com"
- )
- endif()
endforeach()
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
index 6996cad6a..63e11b14f 100644
--- a/tests/unit/Makefile.am
+++ b/tests/unit/Makefile.am
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -48,7 +48,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/tests/libtest
endif
-EXTRA_DIST = Makefile.inc CMakeLists.txt
+EXTRA_DIST = Makefile.inc CMakeLists.txt README.md
CFLAGS += @CURL_CFLAG_EXTRAS@
@@ -70,7 +70,7 @@ CS_1 =
CS_ = $(CS_0)
checksrc:
- $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.c
+ $(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl $(srcdir)/*.[ch]
if BUILD_UNITTESTS
noinst_PROGRAMS = $(UNITPROGS)
diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc
index 45278ba81..f63724f91 100644
--- a/tests/unit/Makefile.inc
+++ b/tests/unit/Makefile.inc
@@ -1,3 +1,25 @@
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
# these files are used in every single unit test program
UNITFILES = curlcheck.h \
@@ -10,7 +32,8 @@ UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \
unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \
unit1399 \
unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606 unit1607 \
- unit1608 unit1609 unit1620 unit1621 \
+ unit1608 unit1609 unit1610 unit1611 unit1612 \
+ unit1620 unit1621 \
unit1650 unit1651 unit1652 unit1653 unit1654 unit1655
unit1300_SOURCES = unit1300.c $(UNITFILES)
@@ -97,6 +120,15 @@ unit1608_CPPFLAGS = $(AM_CPPFLAGS)
unit1609_SOURCES = unit1609.c $(UNITFILES)
unit1609_CPPFLAGS = $(AM_CPPFLAGS)
+unit1610_SOURCES = unit1610.c $(UNITFILES)
+unit1610_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1611_SOURCES = unit1611.c $(UNITFILES)
+unit1611_CPPFLAGS = $(AM_CPPFLAGS)
+
+unit1612_SOURCES = unit1612.c $(UNITFILES)
+unit1612_CPPFLAGS = $(AM_CPPFLAGS)
+
unit1620_SOURCES = unit1620.c $(UNITFILES)
unit1620_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/tests/unit/README b/tests/unit/README.md
index 060b670c6..2880d1979 100644
--- a/tests/unit/README
+++ b/tests/unit/README.md
@@ -1,50 +1,44 @@
-Unit tests
-==========
+# Unit tests
-The goal is to add tests for *ALL* functions in libcurl. If functions are too
+The goal is to add tests for *all* functions in libcurl. If functions are too
big and complicated, we should split them into smaller and testable ones.
-Build Unit Tests
-================
+## Build Unit Tests
-'./configure --enable-debug' is required for the unit tests to build. To
+`./configure --enable-debug` is required for the unit tests to build. To
enable unit tests, there will be a separate static libcurl built that will be
used exclusively for linking unit test programs. Just build everything as
normal, and then you can run the unit test cases as well.
-Run Unit Tests
-==============
+## Run Unit Tests
Unit tests are run as part of the regular test suite. If you have built
everything to run unit tests, to can do 'make test' at the root level. Or you
-can 'cd tests' and 'make' and then invoke individual unit tests with
-./runtests.pl NNNN where NNNN is the specific test number.
+can `cd tests` and `make` and then invoke individual unit tests with
+`./runtests.pl NNNN` where `NNNN` is the specific test number.
-Debug Unit Tests
-================
+## Debug Unit Tests
If a specific test fails you will get told. The test case then has output left
in the log/ subdirectory, but most importantly you can re-run the test again
-using gdb by doing ./runtests.pl -g NNNN. That is, add a -g to make it start
-up gdb and run the same case using that.
+using gdb by doing `./runtests.pl -g NNNN`. That is, add a `-g` to make it
+start up gdb and run the same case using that.
-Write Unit Tests
-================
+## Write Unit Tests
We put tests that focus on an area or a specific function into a single C
source file. The source file should be named 'unitNNNN.c' where NNNN is a
-number that starts with 1300 and you can pick the next free number.
+previously unused number.
-Add your test to tests/unit/Makefile.inc (if it is a unit test).
-Add your test data to tests/data/Makefile.inc
+Add your test to `tests/unit/Makefile.inc` (if it is a unit test). Add your
+test data file name to `tests/data/Makefile.inc`
-You also need a separate file called tests/data/testNNNN (using the same
+You also need a separate file called `tests/data/testNNNN` (using the same
number) that describes your test case. See the test1300 file for inspiration
-and the tests/FILEFORMAT documentation.
+and the `tests/FILEFORMAT.md` documentation.
For the actual C file, here's a very simple example:
-
------------------------ start -------------------------------
+~~~c
#include "curlcheck.h"
#include "a libcurl header.h" /* from the lib dir */
@@ -70,5 +64,3 @@ UNITTEST_START
/* you end the test code like this: */
UNITTEST_STOP
-
------------------------ end -------------------------------
diff --git a/tests/unit/curlcheck.h b/tests/unit/curlcheck.h
index c358afa6e..016119a39 100644
--- a/tests/unit/curlcheck.h
+++ b/tests/unit/curlcheck.h
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -52,7 +52,7 @@
fprintf(stderr, "%s:%d test failed: '%s'\n", \
__FILE__, __LINE__, msg); \
unitfail++; \
- } WHILE_FALSE
+ } while(0)
/* The abort macros mark the current test step as failed, and exit the test */
@@ -77,7 +77,7 @@
__FILE__, __LINE__, msg); \
unitfail++; \
goto unit_test_abort; \
- } WHILE_FALSE
+ } while(0)
diff --git a/tests/unit/unit1300.c b/tests/unit/unit1300.c
index 5cfa6daf3..3c23ab8fd 100644
--- a/tests/unit/unit1300.c
+++ b/tests/unit/unit1300.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,11 +23,11 @@
#include "llist.h"
-static struct curl_llist llist;
+static struct Curl_llist llist;
-static struct curl_llist llist_destination;
+static struct Curl_llist llist_destination;
-static void test_curl_llist_dtor(void *key, void *value)
+static void test_Curl_llist_dtor(void *key, void *value)
{
/* used by the llist API, does nothing here */
(void)key;
@@ -36,8 +36,8 @@ static void test_curl_llist_dtor(void *key, void *value)
static CURLcode unit_setup(void)
{
- Curl_llist_init(&llist, test_curl_llist_dtor);
- Curl_llist_init(&llist_destination, test_curl_llist_dtor);
+ Curl_llist_init(&llist, test_Curl_llist_dtor);
+ Curl_llist_init(&llist_destination, test_Curl_llist_dtor);
return CURLE_OK;
}
@@ -50,15 +50,14 @@ UNITTEST_START
int unusedData_case1 = 1;
int unusedData_case2 = 2;
int unusedData_case3 = 3;
- struct curl_llist_element case1_list;
- struct curl_llist_element case2_list;
- struct curl_llist_element case3_list;
- struct curl_llist_element case4_list;
- struct curl_llist_element case5_list;
- struct curl_llist_element *head;
- struct curl_llist_element *element_next;
- struct curl_llist_element *element_prev;
- struct curl_llist_element *to_remove;
+ struct Curl_llist_element case1_list;
+ struct Curl_llist_element case2_list;
+ struct Curl_llist_element case3_list;
+ struct Curl_llist_element case4_list;
+ struct Curl_llist_element *head;
+ struct Curl_llist_element *element_next;
+ struct Curl_llist_element *element_prev;
+ struct Curl_llist_element *to_remove;
size_t llist_size = Curl_llist_count(&llist);
/**
@@ -75,8 +74,8 @@ UNITTEST_START
fail_unless(llist.size == 0, "list initial size should be zero");
fail_unless(llist.head == NULL, "list head should initiate to NULL");
fail_unless(llist.tail == NULL, "list tail should intiate to NULL");
- fail_unless(llist.dtor == test_curl_llist_dtor,
- "list dtor shold initiate to test_curl_llist_dtor");
+ fail_unless(llist.dtor == test_Curl_llist_dtor,
+ "list dtor should initiate to test_Curl_llist_dtor");
/**
* testing Curl_llist_insert_next
@@ -216,55 +215,6 @@ UNITTEST_START
fail_unless(llist.tail == NULL,
"llist tail is not NULL while the llist is empty");
- /* @testing Curl_llist_move(struct curl_llist *,
- * struct curl_llist_element *, struct curl_llist *,
- * struct curl_llist_element *);
- */
-
- /**
- * @case 1:
- * moving head from an llist containing one element to an empty llist
- * @assumptions:
- * 1: llist size will be 0
- * 2: llist_destination size will be 1
- * 3: llist head will be NULL
- * 4: llist_destination head == llist_destination tail != NULL
- */
-
- /*
- * @setup
- * add one element to the list
- */
-
- Curl_llist_insert_next(&llist, llist.head, &unusedData_case1,
- &case5_list);
- /* necessary assertions */
-
- abort_unless(Curl_llist_count(&llist) == 1,
- "Number of list elements is not as expected, Aborting");
- abort_unless(Curl_llist_count(&llist_destination) == 0,
- "Number of list elements is not as expected, Aborting");
-
- /*actual testing code*/
- Curl_llist_move(&llist, llist.head, &llist_destination, NULL);
- fail_unless(Curl_llist_count(&llist) == 0,
- "moving element from llist didn't decrement the size");
-
- fail_unless(Curl_llist_count(&llist_destination) == 1,
- "moving element to llist_destination didn't increment the size");
-
- fail_unless(llist.head == NULL,
- "llist head not set to null after moving the head");
-
- fail_unless(llist_destination.head != NULL,
- "llist_destination head set to null after moving an element");
-
- fail_unless(llist_destination.tail != NULL,
- "llist_destination tail set to null after moving an element");
-
- fail_unless(llist_destination.tail == llist_destination.head,
- "llist_destination tail doesn't equal llist_destination head");
-
Curl_llist_destroy(&llist, NULL);
Curl_llist_destroy(&llist_destination, NULL);
}
diff --git a/tests/unit/unit1302.c b/tests/unit/unit1302.c
index e6f94b24e..bd240d52c 100644
--- a/tests/unit/unit1302.c
+++ b/tests/unit/unit1302.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/unit/unit1305.c b/tests/unit/unit1305.c
index 6e4bbb861..e53b8fdfa 100644
--- a/tests/unit/unit1305.c
+++ b/tests/unit/unit1305.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -40,7 +40,7 @@
#include "memdebug.h" /* LAST include file */
static struct Curl_easy *data;
-static struct curl_hash hp;
+static struct Curl_hash hp;
static char *data_key;
static struct Curl_dns_entry *data_node;
@@ -73,26 +73,21 @@ static void unit_stop(void)
curl_global_cleanup();
}
-static Curl_addrinfo *fake_ai(void)
+static struct Curl_addrinfo *fake_ai(void)
{
- static Curl_addrinfo *ai;
+ static struct Curl_addrinfo *ai;
+ static const char dummy[]="dummy";
+ size_t namelen = sizeof(dummy); /* including the zero terminator */
- ai = calloc(1, sizeof(Curl_addrinfo));
+ ai = calloc(1, sizeof(struct Curl_addrinfo) + sizeof(struct sockaddr_in) +
+ namelen);
if(!ai)
return NULL;
- ai->ai_canonname = strdup("dummy");
- if(!ai->ai_canonname) {
- free(ai);
- return NULL;
- }
-
- ai->ai_addr = calloc(1, sizeof(struct sockaddr_in));
- if(!ai->ai_addr) {
- free(ai->ai_canonname);
- free(ai);
- return NULL;
- }
+ ai->ai_addr = (void *)((char *)ai + sizeof(struct Curl_addrinfo));
+ ai->ai_canonname = (void *)((char *)ai->ai_addr +
+ sizeof(struct sockaddr_in));
+ memcpy(ai->ai_canonname, dummy, namelen);
ai->ai_family = AF_INET;
ai->ai_addrlen = sizeof(struct sockaddr_in);
diff --git a/tests/unit/unit1309.c b/tests/unit/unit1309.c
index 9d885389d..880530313 100644
--- a/tests/unit/unit1309.c
+++ b/tests/unit/unit1309.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -35,7 +35,7 @@ static void unit_stop(void)
}
-static void splayprint(struct Curl_tree * t, int d, char output)
+static void splayprint(struct Curl_tree *t, int d, char output)
{
struct Curl_tree *node;
int i;
diff --git a/tests/unit/unit1330.c b/tests/unit/unit1330.c
index e6431bbba..c9f19ccc5 100644
--- a/tests/unit/unit1330.c
+++ b/tests/unit/unit1330.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/unit/unit1394.c b/tests/unit/unit1394.c
index 010f052ec..d6644f8eb 100644
--- a/tests/unit/unit1394.c
+++ b/tests/unit/unit1394.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -122,8 +122,10 @@ UNITTEST_START
fail("assertion failure");
}
}
- if(certname) free(certname);
- if(passphrase) free(passphrase);
+ if(certname)
+ free(certname);
+ if(passphrase)
+ free(passphrase);
}
UNITTEST_STOP
diff --git a/tests/unit/unit1395.c b/tests/unit/unit1395.c
index 78fdfa021..b8440b477 100644
--- a/tests/unit/unit1395.c
+++ b/tests/unit/unit1395.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/unit/unit1600.c b/tests/unit/unit1600.c
index 190cf0f0a..4e774aabb 100644
--- a/tests/unit/unit1600.c
+++ b/tests/unit/unit1600.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/unit/unit1601.c b/tests/unit/unit1601.c
index a6120e1c2..bf00bc7e9 100644
--- a/tests/unit/unit1601.c
+++ b/tests/unit/unit1601.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -36,18 +36,20 @@ static void unit_stop(void)
UNITTEST_START
#ifndef CURL_DISABLE_CRYPTO_AUTH
- unsigned char output[16];
+ const char string1[] = "1";
+ const char string2[] = "hello-you-fool";
+ unsigned char output[MD5_DIGEST_LEN];
unsigned char *testp = output;
- Curl_md5it(output, (const unsigned char *)"1");
-/* !checksrc! disable LONGLINE 2 */
- verify_memory(testp,
- "\xc4\xca\x42\x38\xa0\xb9\x23\x82\x0d\xcc\x50\x9a\x6f\x75\x84\x9b", 16);
+ Curl_md5it(output, (const unsigned char *) string1, strlen(string1));
- Curl_md5it(output, (const unsigned char *)"hello-you-fool");
+ verify_memory(testp, "\xc4\xca\x42\x38\xa0\xb9\x23\x82\x0d\xcc\x50\x9a\x6f"
+ "\x75\x84\x9b", MD5_DIGEST_LEN);
- verify_memory(testp,
- "\x88\x67\x0b\x6d\x5d\x74\x2f\xad\xa5\xcd\xf9\xb6\x82\x87\x5f\x22", 16);
+ Curl_md5it(output, (const unsigned char *) string2, strlen(string2));
+
+ verify_memory(testp, "\x88\x67\x0b\x6d\x5d\x74\x2f\xad\xa5\xcd\xf9\xb6\x82"
+ "\x87\x5f\x22", MD5_DIGEST_LEN);
#endif
diff --git a/tests/unit/unit1602.c b/tests/unit/unit1602.c
index 5f1ee9f47..1898b724d 100644
--- a/tests/unit/unit1602.c
+++ b/tests/unit/unit1602.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,7 @@
#include "memdebug.h" /* LAST include file */
-static struct curl_hash hash_static;
+static struct Curl_hash hash_static;
static void mydtor(void *p)
{
diff --git a/tests/unit/unit1603.c b/tests/unit/unit1603.c
index c20b20b0e..771ffc0f9 100644
--- a/tests/unit/unit1603.c
+++ b/tests/unit/unit1603.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2015 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2015 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -28,7 +28,7 @@
#include "memdebug.h" /* LAST include file */
-static struct curl_hash hash_static;
+static struct Curl_hash hash_static;
static const int slots = 3;
static void mydtor(void *p)
diff --git a/tests/unit/unit1604.c b/tests/unit/unit1604.c
index c285ced43..9c4f77670 100644
--- a/tests/unit/unit1604.c
+++ b/tests/unit/unit1604.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -78,7 +78,7 @@ struct data {
const char *input;
int flags;
const char *expected_output;
- CURLcode expected_result;
+ SANITIZEcode expected_result;
};
UNITTEST_START
@@ -304,8 +304,9 @@ UNITTEST_START
char *flagstr = NULL;
char *received_ccstr = NULL;
char *expected_ccstr = NULL;
+ SANITIZEcode res;
- CURLcode res = sanitize_file_name(&output, data[i].input, data[i].flags);
+ res = sanitize_file_name(&output, data[i].input, data[i].flags);
if(res == data[i].expected_result &&
((!output && !data[i].expected_output) ||
diff --git a/tests/unit/unit1605.c b/tests/unit/unit1605.c
index 57a9199c5..0ec726a72 100644
--- a/tests/unit/unit1605.c
+++ b/tests/unit/unit1605.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
diff --git a/tests/unit/unit1607.c b/tests/unit/unit1607.c
index a8b0331ce..e8d412080 100644
--- a/tests/unit/unit1607.c
+++ b/tests/unit/unit1607.c
@@ -99,23 +99,23 @@ static const struct testcase tests[] = {
};
UNITTEST_START
+{
int i;
int testnum = sizeof(tests) / sizeof(struct testcase);
+ struct Curl_multi *multi = NULL;
+ struct Curl_easy *easy = NULL;
+ struct curl_slist *list = NULL;
for(i = 0; i < testnum; ++i) {
int j;
int addressnum = sizeof(tests[i].address) / sizeof(*tests[i].address);
struct Curl_addrinfo *addr;
struct Curl_dns_entry *dns;
- struct curl_slist *list;
void *entry_id;
bool problem = false;
- struct Curl_multi *multi;
- struct Curl_easy *easy = curl_easy_init();
- if(!easy) {
- curl_global_cleanup();
- return CURLE_OUT_OF_MEMORY;
- }
+ easy = curl_easy_init();
+ if(!easy)
+ goto error;
/* create a multi handle and add the easy handle to it so that the
hostcache is setup */
@@ -124,16 +124,14 @@ UNITTEST_START
list = curl_slist_append(NULL, tests[i].optval);
if(!list)
- goto unit_test_abort;
+ goto error;
curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
Curl_loadhostpairs(easy);
entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port);
- if(!entry_id) {
- curl_slist_free_all(list);
- goto unit_test_abort;
- }
+ if(!entry_id)
+ goto error;
dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1);
free(entry_id);
entry_id = NULL;
@@ -202,12 +200,20 @@ UNITTEST_START
}
curl_easy_cleanup(easy);
+ easy = NULL;
curl_multi_cleanup(multi);
+ multi = NULL;
curl_slist_free_all(list);
+ list = NULL;
if(problem) {
unitfail++;
continue;
}
}
+ error:
+ curl_easy_cleanup(easy);
+ curl_multi_cleanup(multi);
+ curl_slist_free_all(list);
+}
UNITTEST_STOP
diff --git a/tests/unit/unit1608.c b/tests/unit/unit1608.c
index 38d5cb278..fc767d1d5 100644
--- a/tests/unit/unit1608.c
+++ b/tests/unit/unit1608.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
#include "hostip.h"
CURLcode Curl_shuffle_addr(struct Curl_easy *data,
- Curl_addrinfo **addr);
+ struct Curl_addrinfo **addr);
#define NUM_ADDRS 8
static struct Curl_addrinfo addrs[NUM_ADDRS];
@@ -48,7 +48,7 @@ UNITTEST_START
{
int i;
CURLcode code;
- struct Curl_addrinfo* addrhead = addrs;
+ struct Curl_addrinfo *addrhead = addrs;
struct Curl_easy *easy = curl_easy_init();
abort_unless(easy, "out of memory");
diff --git a/tests/unit/unit1609.c b/tests/unit/unit1609.c
index 8223a147c..ce3ddf9d8 100644
--- a/tests/unit/unit1609.c
+++ b/tests/unit/unit1609.c
@@ -100,6 +100,9 @@ UNITTEST_START
{
int i;
int testnum = sizeof(tests) / sizeof(struct testcase);
+ struct Curl_multi *multi = NULL;
+ struct Curl_easy *easy = NULL;
+ struct curl_slist *list = NULL;
/* important: we setup cache outside of the loop
and also clean cache after the loop. In contrast,for example,
@@ -110,11 +113,9 @@ UNITTEST_START
int addressnum = sizeof (tests[i].address) / sizeof (*tests[i].address);
struct Curl_addrinfo *addr;
struct Curl_dns_entry *dns;
- struct curl_slist *list;
void *entry_id;
bool problem = false;
- struct Curl_multi *multi;
- struct Curl_easy *easy = curl_easy_init();
+ easy = curl_easy_init();
if(!easy) {
curl_global_cleanup();
return CURLE_OUT_OF_MEMORY;
@@ -122,21 +123,23 @@ UNITTEST_START
/* create a multi handle and add the easy handle to it so that the
hostcache is setup */
multi = curl_multi_init();
+ if(!multi)
+ goto error;
curl_multi_add_handle(multi, easy);
list = curl_slist_append(NULL, tests[i].optval);
if(!list)
- goto unit_test_abort;
+ goto error;
curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
- Curl_loadhostpairs(easy);
+ if(Curl_loadhostpairs(easy))
+ goto error;
entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port);
- if(!entry_id) {
- curl_slist_free_all(list);
- goto unit_test_abort;
- }
+ if(!entry_id)
+ goto error;
+
dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1);
free(entry_id);
entry_id = NULL;
@@ -194,14 +197,22 @@ UNITTEST_START
}
curl_easy_cleanup(easy);
+ easy = NULL;
Curl_hash_destroy(&multi->hostcache);
curl_multi_cleanup(multi);
+ multi = NULL;
curl_slist_free_all(list);
+ list = NULL;
if(problem) {
unitfail++;
continue;
}
}
+ goto unit_test_abort;
+ error:
+ curl_easy_cleanup(easy);
+ curl_multi_cleanup(multi);
+ curl_slist_free_all(list);
}
UNITTEST_STOP
diff --git a/tests/unit/unit1610.c b/tests/unit/unit1610.c
new file mode 100644
index 000000000..bb9c937c9
--- /dev/null
+++ b/tests/unit/unit1610.c
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "curl_sha256.h"
+
+static CURLcode unit_setup(void)
+{
+ return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+
+}
+
+UNITTEST_START
+
+#ifndef CURL_DISABLE_CRYPTO_AUTH
+ const char string1[] = "1";
+ const char string2[] = "hello-you-fool";
+ unsigned char output[SHA256_DIGEST_LENGTH];
+ unsigned char *testp = output;
+
+ Curl_sha256it(output, (const unsigned char *) string1, strlen(string1));
+
+ verify_memory(testp,
+ "\x6b\x86\xb2\x73\xff\x34\xfc\xe1\x9d\x6b\x80\x4e\xff\x5a\x3f"
+ "\x57\x47\xad\xa4\xea\xa2\x2f\x1d\x49\xc0\x1e\x52\xdd\xb7\x87"
+ "\x5b\x4b", SHA256_DIGEST_LENGTH);
+
+ Curl_sha256it(output, (const unsigned char *) string2, strlen(string2));
+
+ verify_memory(testp,
+ "\xcb\xb1\x6a\x8a\xb9\xcb\xb9\x35\xa8\xcb\xa0\x2e\x28\xc0\x26"
+ "\x30\xd1\x19\x9c\x1f\x02\x17\xf4\x7c\x96\x20\xf3\xef\xe8\x27"
+ "\x15\xae", SHA256_DIGEST_LENGTH);
+#endif
+
+
+UNITTEST_STOP
diff --git a/tests/unit/unit1611.c b/tests/unit/unit1611.c
new file mode 100644
index 000000000..bc19f8a5c
--- /dev/null
+++ b/tests/unit/unit1611.c
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "curl_md4.h"
+
+static CURLcode unit_setup(void)
+{
+ return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+
+}
+
+UNITTEST_START
+
+#ifndef CURL_DISABLE_CRYPTO_AUTH
+ const char string1[] = "1";
+ const char string2[] = "hello-you-fool";
+ unsigned char output[MD4_DIGEST_LENGTH];
+ unsigned char *testp = output;
+
+ Curl_md4it(output, (const unsigned char *) string1, strlen(string1));
+
+ verify_memory(testp,
+ "\x8b\xe1\xec\x69\x7b\x14\xad\x3a\x53\xb3\x71\x43\x61\x20\x64"
+ "\x1d", MD4_DIGEST_LENGTH);
+
+ Curl_md4it(output, (const unsigned char *) string2, strlen(string2));
+
+ verify_memory(testp,
+ "\xa7\x16\x1c\xad\x7e\xbe\xdb\xbc\xf8\xc7\x23\x10\x2d\x2c\xe2"
+ "\x0b", MD4_DIGEST_LENGTH);
+#endif
+
+
+UNITTEST_STOP
diff --git a/tests/unit/unit1612.c b/tests/unit/unit1612.c
new file mode 100644
index 000000000..3fb2de033
--- /dev/null
+++ b/tests/unit/unit1612.c
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "curlcheck.h"
+
+#include "curl_hmac.h"
+#include "curl_md5.h"
+
+static CURLcode unit_setup(void)
+{
+ return CURLE_OK;
+}
+
+static void unit_stop(void)
+{
+
+}
+
+UNITTEST_START
+
+#ifndef CURL_DISABLE_CRYPTO_AUTH
+ const char password[] = "Pa55worD";
+ const char string1[] = "1";
+ const char string2[] = "hello-you-fool";
+ unsigned char output[HMAC_MD5_LENGTH];
+ unsigned char *testp = output;
+
+ Curl_hmacit(Curl_HMAC_MD5,
+ (const unsigned char *) password, strlen(password),
+ (const unsigned char *) string1, strlen(string1),
+ output);
+
+ verify_memory(testp,
+ "\xd1\x29\x75\x43\x58\xdc\xab\x78\xdf\xcd\x7f\x2b\x29\x31\x13"
+ "\x37", HMAC_MD5_LENGTH);
+
+ Curl_hmacit(Curl_HMAC_MD5,
+ (const unsigned char *) password, strlen(password),
+ (const unsigned char *) string2, strlen(string2),
+ output);
+
+ verify_memory(testp,
+ "\x75\xf1\xa7\xb9\xf5\x40\xe5\xa4\x98\x83\x9f\x64\x5a\x27\x6d"
+ "\xd0", HMAC_MD5_LENGTH);
+#endif
+
+
+UNITTEST_STOP
diff --git a/tests/unit/unit1620.c b/tests/unit/unit1620.c
index c6aa721cf..b23e5b912 100644
--- a/tests/unit/unit1620.c
+++ b/tests/unit/unit1620.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -46,6 +46,8 @@ UNITTEST_START
bool protocol_connect = FALSE;
rc = Curl_open(&empty);
+ if(rc)
+ goto unit_test_abort;
fail_unless(rc == CURLE_OK, "Curl_open() failed");
rc = Curl_connect(empty, &async, &protocol_connect);
@@ -71,10 +73,6 @@ UNITTEST_START
fail_unless(rc == CURLE_OK,
"Curl_parse_login_details() failed");
- rc = Curl_disconnect(empty, empty->conn, FALSE);
- fail_unless(rc == CURLE_OK,
- "Curl_disconnect() with dead_connection set FALSE failed");
-
Curl_freeset(empty);
for(i = (enum dupstring)0; i < STRING_LAST; i++) {
fail_unless(empty->set.str[i] == NULL,
diff --git a/tests/unit/unit1650.c b/tests/unit/unit1650.c
index cd6f519f7..b2fc89efa 100644
--- a/tests/unit/unit1650.c
+++ b/tests/unit/unit1650.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -22,6 +22,7 @@
#include "curlcheck.h"
#include "doh.h"
+#include "dynbuf.h"
static CURLcode unit_setup(void)
{
@@ -33,7 +34,7 @@ static void unit_stop(void)
}
-#ifdef USE_NGHTTP2
+#ifndef CURL_DISABLE_DOH
#define DNS_PREAMBLE "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00"
#define LABEL_TEST "\x04\x74\x65\x73\x74"
#define LABEL_HOST "\x04\x68\x6f\x73\x74"
@@ -184,8 +185,8 @@ UNITTEST_START
char *ptr;
size_t len;
int u;
- memset(&d, 0, sizeof(d));
- rc = doh_decode((unsigned char *)resp[i].packet, resp[i].size,
+ de_init(&d);
+ rc = doh_decode((const unsigned char *)resp[i].packet, resp[i].size,
resp[i].type, &d);
if(rc != resp[i].rc) {
fprintf(stderr, "resp %zu: Expected return code %d got %d\n", i,
@@ -222,7 +223,7 @@ UNITTEST_START
}
for(u = 0; u < d.numcname; u++) {
size_t o;
- msnprintf(ptr, len, "%s ", d.cname[u].alloc);
+ msnprintf(ptr, len, "%s ", Curl_dyn_ptr(&d.cname[u]));
o = strlen(ptr);
len -= o;
ptr += o;
@@ -241,7 +242,7 @@ UNITTEST_START
struct dohentry d;
int rc;
memset(&d, 0, sizeof(d));
- rc = doh_decode((unsigned char *)full49, i, DNS_TYPE_A, &d);
+ rc = doh_decode((const unsigned char *)full49, i, DNS_TYPE_A, &d);
if(!rc) {
/* none of them should work */
fprintf(stderr, "%zu: %d\n", i, rc);
@@ -253,7 +254,7 @@ UNITTEST_START
struct dohentry d;
int rc;
memset(&d, 0, sizeof(d));
- rc = doh_decode((unsigned char *)&full49[i], sizeof(full49)-i-1,
+ rc = doh_decode((const unsigned char *)&full49[i], sizeof(full49)-i-1,
DNS_TYPE_A, &d);
if(!rc) {
/* none of them should work */
@@ -266,7 +267,7 @@ UNITTEST_START
struct dohentry d;
struct dohaddr *a;
memset(&d, 0, sizeof(d));
- rc = doh_decode((unsigned char *)full49, sizeof(full49)-1,
+ rc = doh_decode((const unsigned char *)full49, sizeof(full49)-1,
DNS_TYPE_A, &d);
fail_if(d.numaddr != 1, "missing address");
a = &d.addr[0];
@@ -283,7 +284,7 @@ UNITTEST_START
}
UNITTEST_STOP
-#else /* USE_NGHTTP2 */
+#else /* CURL_DISABLE_DOH */
UNITTEST_START
{
return 1; /* nothing to do, just fail */
diff --git a/tests/unit/unit1651.c b/tests/unit/unit1651.c
index 3652601f9..44dbf4b51 100644
--- a/tests/unit/unit1651.c
+++ b/tests/unit/unit1651.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -368,7 +368,7 @@ UNITTEST_START
for(byte = 1 ; byte < 255; byte += 17) {
for(i = 0; i < 45; i++) {
char backup = cert[i];
- cert[i] = (unsigned char)byte&0xff;
+ cert[i] = (unsigned char) (byte & 0xff);
(void) Curl_extract_certinfo(&conn, 0, beg, end);
cert[i] = backup;
}
diff --git a/tests/unit/unit1654.c b/tests/unit/unit1654.c
index a800d9c3a..6274d0af8 100644
--- a/tests/unit/unit1654.c
+++ b/tests/unit/unit1654.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -54,81 +54,84 @@ UNITTEST_START
return 1;
result = Curl_altsvc_load(asi, arg);
if(result) {
- Curl_altsvc_cleanup(asi);
+ Curl_altsvc_cleanup(&asi);
return result;
}
curl = curl_easy_init();
if(!curl)
goto fail;
- fail_unless(asi->num == 4, "wrong number of entries");
+ fail_unless(asi->list.size == 4, "wrong number of entries");
msnprintf(outname, sizeof(outname), "%s-out", arg);
- result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"",
+ result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"\r\n",
ALPN_h1, "example.org", 8080);
if(result) {
fprintf(stderr, "Curl_altsvc_parse() failed!\n");
unitfail++;
}
- fail_unless(asi->num == 5, "wrong number of entries");
+ fail_unless(asi->list.size == 5, "wrong number of entries");
- result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"",
+ result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"\r\n",
ALPN_h1, "2.example.org", 8080);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(2) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 6, "wrong number of entries");
+ fail_unless(asi->list.size == 6, "wrong number of entries");
result = Curl_altsvc_parse(curl, asi,
- "h2=\"example.com:8080\", h3=\"yesyes.com\"",
+ "h2=\"example.com:8080\", h3=\"yesyes.com\"\r\n",
ALPN_h1, "3.example.org", 8080);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
unitfail++;
}
/* that one should make two entries */
- fail_unless(asi->num == 8, "wrong number of entries");
+ fail_unless(asi->list.size == 8, "wrong number of entries");
- result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
+ result = Curl_altsvc_parse(curl, asi,
+ "h2=\"example.com:443\"; ma = 120;\r\n",
ALPN_h2, "example.org", 80);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 9, "wrong number of entries");
+ fail_unless(asi->list.size == 9, "wrong number of entries");
/* quoted 'ma' value */
- result = Curl_altsvc_parse(curl, asi, "h2=\"example.net:443\"; ma=\"180\";",
+ result = Curl_altsvc_parse(curl, asi,
+ "h2=\"example.net:443\"; ma=\"180\";\r\n",
ALPN_h2, "example.net", 80);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 10, "wrong number of entries");
+ fail_unless(asi->list.size == 10, "wrong number of entries");
- result = Curl_altsvc_parse(curl, asi,
- "h2=\":443\", h3=\":443\"; ma = 120; persist = 1",
- ALPN_h1, "curl.haxx.se", 80);
+ result =
+ Curl_altsvc_parse(curl, asi,
+ "h2=\":443\", h3=\":443\"; ma = 120; persist = 1\r\n",
+ ALPN_h1, "curl.haxx.se", 80);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(5) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 12, "wrong number of entries");
+ fail_unless(asi->list.size == 12, "wrong number of entries");
/* clear that one again and decrease the counter */
- result = Curl_altsvc_parse(curl, asi, "clear;",
+ result = Curl_altsvc_parse(curl, asi, "clear;\r\n",
ALPN_h1, "curl.haxx.se", 80);
if(result) {
fprintf(stderr, "Curl_altsvc_parse(6) failed!\n");
unitfail++;
}
- fail_unless(asi->num == 10, "wrong number of entries");
+ fail_unless(asi->list.size == 10, "wrong number of entries");
- Curl_altsvc_save(asi, outname);
+ Curl_altsvc_save(curl, asi, outname);
curl_easy_cleanup(curl);
fail:
- Curl_altsvc_cleanup(asi);
+ Curl_altsvc_cleanup(&asi);
return unitfail;
}
UNITTEST_STOP
diff --git a/tests/unit/unit1655.c b/tests/unit/unit1655.c
index 7fea134d5..1b910ed9f 100644
--- a/tests/unit/unit1655.c
+++ b/tests/unit/unit1655.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2019 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -34,45 +34,104 @@ static void unit_stop(void)
/* done before shutting down and exiting */
}
+#ifndef CURL_DISABLE_DOH
+
UNITTEST_START
-/* introduce a scope and prove the corner case with write overflow,
- * so we can prove this test would detect it and that it is properly fixed
+/*
+ * Prove detection of write overflow using a short buffer and a name
+ * of maximal valid length.
+ *
+ * Prove detection of other invalid input.
*/
do {
- const char *bad = "this.is.a.hostname.where.each.individual.part.is.within."
- "the.sixtythree.character.limit.but.still.long.enough.to."
- "trigger.the.the.buffer.overflow......it.is.chosen.to.be."
- "of.a.length.such.that.it.causes.a.two.byte.buffer......."
- "overwrite.....making.it.longer.causes.doh.encode.to....."
- ".return.early.so.dont.change.its.length.xxxx.xxxxxxxxxxx"
- "..xxxxxx.....xx..........xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- "xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx..x......xxxx"
- "xxxx..xxxxxxxxxxxxxxxxxxx.x...xxxx.x.x.x...xxxxx";
+ const char *max =
+ /* ..|....1.........2.........3.........4.........5.........6... */
+ /* 3456789012345678901234567890123456789012345678901234567890123 */
+ "this.is.a.maximum-length.hostname." /* 34: 34 */
+ "with-no-label-of-greater-length-than-the-sixty-three-characters."
+ /* 64: 98 */
+ "specified.in.the.RFCs." /* 22: 120 */
+ "and.with.a.QNAME.encoding.whose.length.is.exactly." /* 50: 170 */
+ "the.maximum.length.allowed." /* 27: 197 */
+ "that.is.two-hundred.and.fifty-six." /* 34: 231 */
+ "including.the.last.null." /* 24: 255 */
+ "";
+ const char *toolong =
+ /* ..|....1.........2.........3.........4.........5.........6... */
+ /* 3456789012345678901234567890123456789012345678901234567890123 */
+ "here.is.a.hostname.which.is.just.barely.too.long." /* 49: 49 */
+ "to.be.encoded.as.a.QNAME.of.the.maximum.allowed.length."
+ /* 55: 104 */
+ "which.is.256.including.a.final.zero-length.label." /* 49: 153 */
+ "representing.the.root.node.so.that.a.name.with." /* 47: 200 */
+ "a.trailing.dot.may.have.up.to." /* 30: 230 */
+ "255.characters.never.more." /* 26: 256 */
+ "";
+ const char *emptylabel =
+ "this.is.an.otherwise-valid.hostname."
+ ".with.an.empty.label.";
+ const char *outsizelabel =
+ "this.is.an.otherwise-valid.hostname."
+ "with-a-label-of-greater-length-than-the-sixty-three-characters-"
+ "specified.in.the.RFCs.";
+ int i;
+
+ struct test {
+ const char *name;
+ const DOHcode expected_result;
+ };
/* plays the role of struct dnsprobe in urldata.h */
struct demo {
- unsigned char dohbuffer[512];
+ unsigned char dohbuffer[255 + 16]; /* deliberately short buffer */
unsigned char canary1;
unsigned char canary2;
unsigned char canary3;
};
- size_t olen = 100000;
- struct demo victim;
- DOHcode d;
- victim.canary1 = 87; /* magic numbers, arbritrarily picked */
- victim.canary2 = 35;
- victim.canary3 = 41;
- d = doh_encode(bad, DNS_TYPE_A, victim.dohbuffer,
- sizeof(victim.dohbuffer), &olen);
- fail_unless(victim.canary1 == 87, "one byte buffer overwrite has happened");
- fail_unless(victim.canary2 == 35, "two byte buffer overwrite has happened");
- fail_unless(victim.canary3 == 41,
- "three byte buffer overwrite has happened");
- if(d == DOH_OK) {
- fail_unless(olen <= sizeof(victim.dohbuffer), "wrote outside bounds");
- fail_unless(olen > strlen(bad), "unrealistic low size");
+ const struct test playlist[4] = {
+ { toolong, DOH_DNS_NAME_TOO_LONG }, /* expect early failure */
+ { emptylabel, DOH_DNS_BAD_LABEL }, /* also */
+ { outsizelabel, DOH_DNS_BAD_LABEL }, /* also */
+ { max, DOH_OK } /* expect buffer overwrite */
+ };
+
+ for(i = 0; i < (int)(sizeof(playlist)/sizeof(*playlist)); i++) {
+ const char *name = playlist[i].name;
+ size_t olen = 100000;
+ struct demo victim;
+ DOHcode d;
+
+ victim.canary1 = 87; /* magic numbers, arbritrarily picked */
+ victim.canary2 = 35;
+ victim.canary3 = 41;
+ d = doh_encode(name, DNS_TYPE_A, victim.dohbuffer,
+ sizeof(struct demo), /* allow room for overflow */
+ &olen);
+
+ fail_unless(d == playlist[i].expected_result,
+ "result returned was not as expected");
+ if(d == playlist[i].expected_result) {
+ if(name == max) {
+ fail_if(victim.canary1 == 87,
+ "demo one-byte buffer overwrite did not happen");
+ }
+ else {
+ fail_unless(victim.canary1 == 87,
+ "one-byte buffer overwrite has happened");
+ }
+ fail_unless(victim.canary2 == 35,
+ "two-byte buffer overwrite has happened");
+ fail_unless(victim.canary3 == 41,
+ "three-byte buffer overwrite has happened");
+ }
+ else {
+ if(d == DOH_OK) {
+ fail_unless(olen <= sizeof(victim.dohbuffer), "wrote outside bounds");
+ fail_unless(olen > strlen(name), "unrealistic low size");
+ }
+ }
}
} while(0);
@@ -84,6 +143,7 @@ do {
const size_t magic1 = 9765;
size_t olen1 = magic1;
const char *sunshine1 = "a.com";
+ const char *dotshine1 = "a.com.";
const char *sunshine2 = "aa.com";
size_t olen2;
DOHcode ret2;
@@ -94,6 +154,13 @@ do {
fail_if(olen1 == magic1, "olen has not been assigned properly");
fail_unless(olen1 > strlen(sunshine1), "bad out length");
+ /* with a trailing dot, the response should have the same length */
+ olen2 = magic1;
+ ret2 = doh_encode(dotshine1, dnstype, buffer, buflen, &olen2);
+ fail_unless(ret2 == DOH_OK, "dotshine case should pass fine");
+ fail_if(olen2 == magic1, "olen has not been assigned properly");
+ fail_unless(olen1 == olen2, "olen should not grow for a trailing dot");
+
/* add one letter, the response should be one longer */
olen2 = magic1;
ret2 = doh_encode(sunshine2, dnstype, buffer, buflen, &olen2);
@@ -111,3 +178,13 @@ do {
fail_unless(olen == olen1, "bad buffer length");
} while(0);
UNITTEST_STOP
+
+#else /* CURL_DISABLE_DOH */
+
+UNITTEST_START
+{
+ return 1; /* nothing to do, just fail */
+}
+UNITTEST_STOP
+
+#endif
diff --git a/tests/valgrind.pm b/tests/valgrind.pm
index 8b3d717d4..43163bf01 100644
--- a/tests/valgrind.pm
+++ b/tests/valgrind.pm
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
diff --git a/tests/version-scan.pl b/tests/version-scan.pl
new file mode 100755
index 000000000..788ba0fa3
--- /dev/null
+++ b/tests/version-scan.pl
@@ -0,0 +1,66 @@
+#!/usr/bin/env perl
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+#
+# Verify that curl_version_info.3 documents all the CURL_VERSION_ bits
+# from the header.
+#
+
+use strict;
+use warnings;
+
+my $manpage=$ARGV[0];
+my $header=$ARGV[1];
+my %manversion;
+my %headerversion;
+my $error;
+
+open(M, "<$manpage");
+while(<M>) {
+ if($_ =~ /^.ip (CURL_VERSION_[A-Z0-9_]+)/i) {
+ $manversion{$1}++;
+ }
+}
+close(M);
+
+open(H, "<$header");
+while(<H>) {
+ if($_ =~ /^\#define (CURL_VERSION_[A-Z0-9_]+)/i) {
+ $headerversion{$1}++;
+ }
+}
+close(H);
+
+for my $h (keys %headerversion) {
+ if(!$manversion{$h}) {
+ print STDERR "$manpage: missing $h\n";
+ $error++;
+ }
+}
+for my $h (keys %manversion) {
+ if(!$headerversion{$h}) {
+ print STDERR "$manpage: $h is not in the header!\n";
+ $error++;
+ }
+}
+
+exit $error;
diff --git a/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt
deleted file mode 100644
index 1ede14f01..000000000
--- a/winbuild/BUILD.WINDOWS.txt
+++ /dev/null
@@ -1,124 +0,0 @@
-Building with Visual C++, prerequisites
-=======================================
-
- This document describes how to compile, build and install curl and libcurl
- from sources using the Visual C++ build tool. To build with VC++, you will
- of course have to first install VC++. The minimum required version of
- VC is 6 (part of Visual Studio 6). However using a more recent version is
- strongly recommended.
-
- VC++ is also part of the Windows Platform SDK. You do not have to install
- the full Visual Studio or Visual C++ if all you want is to build curl.
-
- The latest Platform SDK can be downloaded freely from:
-
- https://developer.microsoft.com/en-us/windows/downloads/sdk-archive
-
- If you are building with VC6 then you will also need the February 2003
- Edition of the Platform SDK which can be downloaded from:
-
- https://www.microsoft.com/en-us/download/details.aspx?id=12261
-
- If you wish to support zlib, openssl, c-ares, ssh2, you will have to download
- them separately and copy them to the deps directory as shown below:
-
- somedirectory\
- |_curl-src
- | |_winbuild
- |
- |_deps
- |_ lib
- |_ include
- |_ bin
-
- It is also possible to create the deps directory in some other random
- places and tell the Makefile its location using the WITH_DEVEL option.
-
-Building straight from git
-==========================
-
- When you check out code git and build it, as opposed from a released source
- code archive, you need to first run the "buildconf.bat" batch file (present
- in the source code root directory) to set things up.
-
-Building with Visual C++
-========================
-
-Open a Visual Studio Command prompt:
-
- Using the 'Developer Command Prompt for VS <version>' menu entry:
- where version is the Visual Studio version. The developer prompt at default
- uses the x86 mode. It is required to call Vcvarsall.bat to setup the prompt
- for the machine type you want, using Vcvarsall.bat.
- This type of command prompt may not exist in all Visual Studio versions.
-
- For more information, check:
- https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs
- https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line
-
- Using the 'VS <version> <platform> <type> Command Prompt' menu entry:
- where version is the Visual Studio version, platform is e.g. x64
- and type Native of Cross platform build. This type of command prompt
- may not exist in all Visual Studio versions.
-
- See also:
- https://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx
-
-Once you are in the console, go to the winbuild directory in the Curl
-sources:
- cd curl-src\winbuild
-
-Then you can call nmake /f Makefile.vc with the desired options (see below).
-The builds will be in the top src directory, builds\ directory, in
-a directory named using the options given to the nmake call.
-
-nmake /f Makefile.vc mode=<static or dll> <options>
-
-where <options> is one or many of:
- VC=<6,7,8,9,10,11,12,14,15> - VC versions
- WITH_DEVEL=<path> - Paths for the development files (SSL, zlib, etc.)
- Defaults to sibbling directory deps: ../deps
- Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
- Uncompress them into the deps folder.
- WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
- WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
- WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
- WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
- WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
- WITH_SSH2=<dll or static> - Enable libSSH2 support, DLL or static
- WITH_PREFIX=<dir> - Where to install the build
- ENABLE_SSPI=<yes or no> - Enable SSPI support, defaults to yes
- ENABLE_IPV6=<yes or no> - Enable IPv6, defaults to yes
- ENABLE_IDN=<yes or no> - Enable use of Windows IDN APIs, defaults to yes
- Requires Windows Vista or later
- ENABLE_WINSSL=<yes or no> - Enable native Windows SSL support, defaults to yes
- GEN_PDB=<yes or no> - Generate Program Database (debug symbols for release build)
- DEBUG=<yes or no> - Debug builds
- MACHINE=<x86 or x64> - Target architecture (default is x86)
- CARES_PATH=<path to cares> - Custom path for c-ares
- MBEDTLS_PATH=<path to mbedTLS> - Custom path for mbedTLS
- NGHTTP2_PATH=<path to HTTP/2> - Custom path for nghttp2
- SSH2_PATH=<path to libSSH2> - Custom path for libSSH2
- SSL_PATH=<path to OpenSSL> - Custom path for OpenSSL
- ZLIB_PATH=<path to zlib> - Custom path for zlib
-
-
-Static linking of Microsoft's C RunTime (CRT):
-==============================================
-If you are using mode=static nmake will create and link to the static build of
-libcurl but *not* the static CRT. If you must you can force nmake to link in
-the static CRT by passing RTLIBCFG=static. Typically you shouldn't use that
-option, and nmake will default to the DLL CRT. RTLIBCFG is rarely used and
-therefore rarely tested. When passing RTLIBCFG for a configuration that was
-already built but not with that option, or if the option was specified
-differently, you must destroy the build directory containing the configuration
-so that nmake can build it from scratch.
-
-Legacy Windows and SSL
-======================
-When you build curl using the build files in this directory the default SSL
-backend will be WinSSL (Windows SSPI, more specifically Schannel), the native
-SSL library that comes with the Windows OS. WinSSL in Windows <= XP is not able
-to connect to servers that no longer support the legacy handshakes and
-algorithms used by those versions. If you will be using curl in one of those
-earlier versions of Windows you should choose another SSL backend like OpenSSL.
diff --git a/winbuild/Makefile.vc b/winbuild/Makefile.vc
index 7ad49f09f..54cbf0c2a 100644
--- a/winbuild/Makefile.vc
+++ b/winbuild/Makefile.vc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -56,7 +56,7 @@ CFGSET=true
!MESSAGE Requires Windows Vista or later
!MESSAGE ENABLE_IPV6=<yes or no> - Enable IPv6, defaults to yes
!MESSAGE ENABLE_SSPI=<yes or no> - Enable SSPI support, defaults to yes
-!MESSAGE ENABLE_WINSSL=<yes or no> - Enable native Windows SSL support, defaults to yes
+!MESSAGE ENABLE_SCHANNEL=<yes or no> - Enable native Windows SSL support, defaults to yes
!MESSAGE ENABLE_OPENSSL_AUTO_LOAD_CONFIG=<yes or no>
!MESSAGE - Whether the OpenSSL configuration will be loaded automatically, defaults to yes
!MESSAGE ENABLE_UNICODE=<yes or no> - Enable UNICODE support, defaults to no
@@ -125,16 +125,16 @@ USE_SSPI = true
USE_SSPI = false
!ENDIF
-!IFNDEF ENABLE_WINSSL
+!IFNDEF ENABLE_SCHANNEL
!IF DEFINED(WITH_SSL) || DEFINED(WITH_MBEDTLS)
-USE_WINSSL = false
+USE_SCHANNEL = false
!ELSE
-USE_WINSSL = $(USE_SSPI)
+USE_SCHANNEL = $(USE_SSPI)
!ENDIF
-!ELSEIF "$(ENABLE_WINSSL)"=="yes"
-USE_WINSSL = true
-!ELSEIF "$(ENABLE_WINSSL)"=="no"
-USE_WINSSL = false
+!ELSEIF "$(ENABLE_SCHANNEL)"=="yes"
+USE_SCHANNEL = true
+!ELSEIF "$(ENABLE_SCHANNEL)"=="no"
+USE_SCHANNEL = false
!ENDIF
!IFNDEF ENABLE_OPENSSL_AUTO_LOAD_CONFIG
@@ -253,8 +253,8 @@ CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-ipv6
CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-sspi
!ENDIF
-!IF "$(USE_WINSSL)"=="true"
-CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-winssl
+!IF "$(USE_SCHANNEL)"=="true"
+CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-schannel
!ENDIF
!IF "$(USE_NGHTTP2)"=="true"
@@ -285,7 +285,7 @@ $(MODE):
@SET USE_IDN=$(USE_IDN)
@SET USE_IPV6=$(USE_IPV6)
@SET USE_SSPI=$(USE_SSPI)
- @SET USE_WINSSL=$(USE_WINSSL)
+ @SET USE_SCHANNEL=$(USE_SCHANNEL)
@SET USE_UNICODE=$(USE_UNICODE)
# compatibility bit
@SET WITH_NGHTTP2=$(WITH_NGHTTP2)
diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc
index 8267250c2..6460e18f2 100644
--- a/winbuild/MakefileBuild.vc
+++ b/winbuild/MakefileBuild.vc
@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1999 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1999 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@@ -61,11 +61,11 @@ CC = cl.exe
!IF "$(VC)"=="6"
CC_NODEBUG = $(CC) /O2 /DNDEBUG
CC_DEBUG = $(CC) /Od /Gm /Zi /D_DEBUG /GZ
-CFLAGS = /I. /I../lib /I../include /nologo /W4 /wd4127 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
+CFLAGS = /I. /I../lib /I../include /nologo /W4 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
!ELSE
CC_NODEBUG = $(CC) /O2 /DNDEBUG
CC_DEBUG = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd
-CFLAGS = /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
+CFLAGS = /I. /I ../lib /I../include /nologo /W4 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
!ENDIF
LFLAGS = /nologo /machine:$(MACHINE)
@@ -222,6 +222,9 @@ CARES = static
!IFDEF USE_CARES
CARES_CFLAGS = /DUSE_ARES /I"$(CARES_INC_DIR)"
+!IF "$(CARES)"=="static"
+CARES_CFLAGS = $(CARES_CFLAGS) /DCARES_STATICLIB
+!ENDIF
!ENDIF
@@ -330,20 +333,20 @@ SSPI_CFLAGS = $(SSPI_CFLAGS) /DUSE_WINDOWS_SSPI
!ENDIF
-!IFNDEF USE_WINSSL
+!IFNDEF USE_SCHANNEL
!IF "$(USE_SSL)"=="true"
-USE_WINSSL = false
+USE_SCHANNEL = false
!ELSE
-USE_WINSSL = $(USE_SSPI)
+USE_SCHANNEL = $(USE_SSPI)
!ENDIF
-!ELSEIF "$(USE_WINSSL)"=="yes"
-USE_WINSSL = true
+!ELSEIF "$(USE_SCHANNEL)"=="yes"
+USE_SCHANNEL = true
!ENDIF
-!IF "$(USE_WINSSL)"=="true"
+!IF "$(USE_SCHANNEL)"=="true"
!IF "$(USE_SSPI)"!="true"
-!ERROR cannot build with WinSSL without SSPI
+!ERROR cannot build with Schannel without SSPI
!ENDIF
SSPI_CFLAGS = $(SSPI_CFLAGS) /DUSE_SCHANNEL
WIN_LIBS = $(WIN_LIBS) Crypt32.lib
@@ -479,9 +482,9 @@ CFLAGS = $(CFLAGS) $(CFLAGS_PDB) /Fd"$(LIB_DIROBJ)\$(PDB)"
LFLAGS = $(LFLAGS) $(LFLAGS_PDB)
!ENDIF
-!IF ( "$(USE_SSL)"=="true" && "$(USE_WINSSL)"=="true" ) \
+!IF ( "$(USE_SSL)"=="true" && "$(USE_SCHANNEL)"=="true" ) \
|| ( "$(USE_SSL)"=="true" && "$(USE_MBEDTLS)"=="true" ) \
- || ( "$(USE_MBEDTLS)"=="true" && "$(USE_WINSSL)"=="true" )
+ || ( "$(USE_MBEDTLS)"=="true" && "$(USE_SCHANNEL)"=="true" )
CFLAGS = $(CFLAGS) /DCURL_WITH_MULTI_SSL
!ENDIF
@@ -533,7 +536,7 @@ $(TARGET): $(LIB_OBJS) $(LIB_DIROBJ) $(DIRDIST)
@echo Using IDN: $(USE_IDN)
@echo Using IPv6: $(USE_IPV6)
@echo Using SSPI: $(USE_SSPI)
- @echo Using WinSSL: $(USE_WINSSL)
+ @echo Using Schannel: $(USE_SCHANNEL)
@echo CFLAGS: $(CFLAGS)
@echo LFLAGS: $(LFLAGS)
@echo GenPDB: $(GEN_PDB)
@@ -615,7 +618,10 @@ CURL_FROM_LIBCURL=$(CURL_DIROBJ)\tool_hugehelp.obj \
$(CURL_DIROBJ)\nonblock.obj \
$(CURL_DIROBJ)\strtoofft.obj \
$(CURL_DIROBJ)\warnless.obj \
- $(CURL_DIROBJ)\curl_ctype.obj
+ $(CURL_DIROBJ)\curl_ctype.obj \
+ $(CURL_DIROBJ)\curl_multibyte.obj \
+ $(CURL_DIROBJ)\version_win32.obj \
+ $(CURL_DIROBJ)\dynbuf.obj
$(PROGRAM_NAME): $(CURL_DIROBJ) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
$(CURL_LINK) $(CURL_LFLAGS) $(CURL_LIBCURL_LIBNAME) $(WIN_LIBS) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
@@ -634,6 +640,12 @@ $(CURL_DIROBJ)\warnless.obj: ../lib/warnless.c
$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/warnless.c
$(CURL_DIROBJ)\curl_ctype.obj: ../lib/curl_ctype.c
$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/curl_ctype.c
+$(CURL_DIROBJ)\curl_multibyte.obj: ../lib/curl_multibyte.c
+ $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/curl_multibyte.c
+$(CURL_DIROBJ)\version_win32.obj: ../lib/version_win32.c
+ $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/version_win32.c
+$(CURL_DIROBJ)\dynbuf.obj: ../lib/dynbuf.c
+ $(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/dynbuf.c
$(CURL_DIROBJ)\curl.res: $(CURL_SRC_DIR)\curl.rc
rc $(CURL_RC_FLAGS)
diff --git a/winbuild/README.md b/winbuild/README.md
new file mode 100644
index 000000000..49b0b6ccf
--- /dev/null
+++ b/winbuild/README.md
@@ -0,0 +1,127 @@
+# Building curl with Visual C++
+
+ This document describes how to compile, build and install curl and libcurl
+ from sources using the Visual C++ build tool. To build with VC++, you will of
+ course have to first install VC++. The minimum required version of VC is 6
+ (part of Visual Studio 6). However using a more recent version is strongly
+ recommended.
+
+ VC++ is also part of the Windows Platform SDK. You do not have to install the
+ full Visual Studio or Visual C++ if all you want is to build curl.
+
+ The latest Platform SDK can be downloaded freely from [Windows SDK and
+ emulator
+ archive](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive)
+
+## Prerequisites
+
+ If you wish to support zlib, openssl, c-ares, ssh2, you will have to download
+ them separately and copy them to the deps directory as shown below:
+
+ somedirectory\
+ |_curl-src
+ | |_winbuild
+ |
+ |_deps
+ |_ lib
+ |_ include
+ |_ bin
+
+ It is also possible to create the deps directory in some other random places
+ and tell the Makefile its location using the WITH_DEVEL option.
+
+## Building straight from git
+
+ When you check out code git and build it, as opposed from a released source
+ code archive, you need to first run the `buildconf.bat` batch file (present
+ in the source code root directory) to set things up.
+
+## Open a command prompt
+
+Open a Visual Studio Command prompt:
+
+ Using the **'Developer Command Prompt for VS [version]'** menu entry: where
+ [version} is the Visual Studio version. The developer prompt at default uses
+ the x86 mode. It is required to call `Vcvarsall.bat` to setup the prompt for
+ the machine type you want. This type of command prompt may not exist in all
+ Visual Studio versions.
+
+ See also: [Developer Command Prompt for Visual
+ Studio](https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs)
+ and [How to: Enable a 64-Bit, x64 hosted MSVC toolset on the command
+ line](https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line)
+
+ Using the **'VS [version] [platform] [type] Command Prompt'** menu entry:
+ where [version] is the Visual Studio version, [platform] is e.g. x64 and
+ [type] Native of Cross platform build. This type of command prompt may not
+ exist in all Visual Studio versions.
+
+ See also: [Set the Path and Environment Variables for Command-Line Builds](https://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx)
+
+## Build in the console
+
+ Once you are in the console, go to the winbuild directory in the Curl
+ sources:
+
+ cd curl-src\winbuild
+
+ Then you can call `nmake /f Makefile.vc` with the desired options (see
+ below). The builds will be in the top src directory, `builds\` directory, in
+ a directory named using the options given to the nmake call.
+
+ nmake /f Makefile.vc mode=<static or dll> <options>
+
+where `<options>` is one or many of:
+
+ - `VC=<6,7,8,9,10,11,12,14,15>` - VC version
+ - `WITH_DEVEL=<path>` - Paths for the development files (SSL, zlib, etc.)
+ Defaults to sibbling directory deps: ../deps
+ Libraries can be fetched at https://windows.php.net/downloads/php-sdk/deps/
+ Uncompress them into the deps folder.
+ - `WITH_SSL=<dll/static>` - Enable OpenSSL support, DLL or static
+ - `WITH_NGHTTP2=<dll/static>` - Enable HTTP/2 support, DLL or static
+ - `WITH_MBEDTLS=<dll/static>` - Enable mbedTLS support, DLL or static
+ - `WITH_CARES=<dll/static>` - Enable c-ares support, DLL or static
+ - `WITH_ZLIB=<dll/static>` - Enable zlib support, DLL or static
+ - `WITH_SSH2=<dll/static>` - Enable libSSH2 support, DLL or static
+ - `WITH_PREFIX=<dir>` - Where to install the build
+ - `ENABLE_SSPI=<yes/no>` - Enable SSPI support, defaults to yes
+ - `ENABLE_IPV6=<yes/no>` - Enable IPv6, defaults to yes
+ - `ENABLE_IDN=<yes or no>` - Enable use of Windows IDN APIs, defaults to yes
+ Requires Windows Vista or later
+ - `ENABLE_SCHANNEL=<yes/no>` - Enable native Windows SSL support, defaults to yes
+ - `GEN_PDB=<yes/no>` - Generate Program Database (debug symbols for release build)
+ - `DEBUG=<yes/no>` - Debug builds
+ - `MACHINE=<x86/x64>` - Target architecture (default is x86)
+ - `CARES_PATH=<path>` - Custom path for c-ares
+ - `MBEDTLS_PATH=<path>` - Custom path for mbedTLS
+ - `NGHTTP2_PATH=<path>` - Custom path for nghttp2
+ - `SSH2_PATH=<path>` - Custom path for libSSH2
+ - `SSL_PATH=<path>` - Custom path for OpenSSL
+ - `ZLIB_PATH=<path>` - Custom path for zlib
+
+## Static linking of Microsoft's C RunTime (CRT):
+
+ If you are using mode=static nmake will create and link to the static build
+ of libcurl but *not* the static CRT. If you must you can force nmake to link
+ in the static CRT by passing RTLIBCFG=static. Typically you shouldn't use
+ that option, and nmake will default to the DLL CRT. RTLIBCFG is rarely used
+ and therefore rarely tested. When passing RTLIBCFG for a configuration that
+ was already built but not with that option, or if the option was specified
+ differently, you must destroy the build directory containing the
+ configuration so that nmake can build it from scratch.
+
+## Building your own application with a static libcurl
+
+ When building an application that uses the static libcurl library on Windows,
+ you must define CURL_STATICLIB. Otherwise the linker will look for dynamic
+ import symbols.
+
+## Legacy Windows and SSL
+
+ When you build curl using the build files in this directory the default SSL
+ backend will be Schannel (Windows SSPI), the native SSL library that comes
+ with the Windows OS. Schannel in Windows <= XP is not able to connect to
+ servers that no longer support the legacy handshakes and algorithms used by
+ those versions. If you will be using curl in one of those earlier versions of
+ Windows you should choose another SSL backend like OpenSSL.